source: trunk/libtransmission/clients.c @ 1894

Last change on this file since 1894 was 1894, checked in by livings124, 15 years ago

add Blizzard Downloader to clients (still need to figure out the exact way version is shown)

  • Property svn:keywords set to Date Rev Author Id
File size: 12.4 KB
Line 
1/******************************************************************************
2 * $Id: clients.c 1894 2007-05-21 15:02:11Z livings124 $
3 *
4 * Copyright (c) 2005 Transmission authors and contributors
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 *****************************************************************************/
24
25#include "transmission.h"
26
27static int charToInt( char character );
28
29static int charToInt( char character )
30{
31    int value;
32    if( character >= 'A' && character <= 'Z' )
33        value = 10 + character - 'A';
34    else
35        value = character - '0';
36   
37    return value;
38}
39
40char * tr_clientForId( uint8_t * id )
41{
42    char * ret = NULL;
43   
44    /* Azureus-style */
45    if( id[0] == '-' && id[7] == '-' )
46    {
47        if( !memcmp( &id[1], "TR", 2 ) )
48        {
49            /* support old-style Transmission id without maintenance number */
50            if ( !memcmp( &id[3], "00", 2 ) )
51            {
52                asprintf( &ret, "Transmission 0.%d",
53                        charToInt( id[5] ) * 10 + charToInt( id[6] ) );
54            }
55            else
56            {
57                asprintf( &ret, "Transmission %d.%c%c",
58                        charToInt( id[3] ) * 10 + charToInt( id[4] ),
59                        id[5], id[6] );
60            }
61        }
62        else if( !memcmp( &id[1], "AZ", 2 ) )
63        {
64            asprintf( &ret, "Azureus %c.%c.%c.%c",
65                      id[3], id[4], id[5], id[6] );
66        }
67        else if( !memcmp( &id[1], "UT", 2 ) )
68        {
69            asprintf( &ret, "\xc2\xb5Torrent %c.%d", id[3],
70                      charToInt( id[4] ) * 10 + charToInt( id[5] ) );
71        }
72        else if( !memcmp( &id[1], "BC", 2 ) )
73        {
74            asprintf( &ret, "BitComet %d.%c%c",
75                      charToInt( id[3] ) * 10 + charToInt( id[4] ),
76                      id[5], id[6] );
77        }
78        else if( !memcmp( &id[1], "SZ", 2 ) || !memcmp( &id[1], "S~", 2 ) )
79        {
80            asprintf( &ret, "Shareaza %c.%c.%c.%c",
81                      id[3], id[4], id[5], id[6] );
82        }
83        else if( !memcmp( &id[1], "BOW", 3 ) )
84        {
85            if( !memcmp( &id[4], "A0C", 3 ) )
86            {
87                asprintf( &ret, "Bits on Wheels 1.0.6" );
88            }
89            else if( !memcmp( &id[4], "A0B", 3 ) )
90            {
91                asprintf( &ret, "Bits on Wheels 1.0.5" );
92            }
93            else
94            {
95                asprintf( &ret, "Bits on Wheels (%c%c%c)",
96                        id[4], id[5], id[6] );
97            }
98        }
99        else if( !memcmp( &id[1], "BR", 2 ) )
100        {
101            asprintf( &ret, "BitRocket %c.%c (%d)",
102                      id[3], id[4], charToInt( id[5] ) * 10 + charToInt( id[6] ) );
103        }
104        else if( !memcmp( &id[1], "XX", 2 ) )
105        {
106            asprintf( &ret, "Xtorrent (%d)",
107                      charToInt( id[3] ) * 1000 + charToInt( id[4] ) * 100
108                      + charToInt( id[5] ) * 10 + charToInt( id[6] ) );
109        }
110        else if( !memcmp( &id[1], "TS", 2 ) )
111        {
112            asprintf( &ret, "TorrentStorm %c.%c.%c.%c",
113                      id[3], id[4], id[5], id[6] );
114        }
115        else if( !memcmp( &id[1], "KT", 2 ) )
116        {
117            if( id[5] == 'R' )
118            {
119                asprintf( &ret, "KTorrent %c.%c RC %c",
120                        id[3], id[4], id[6] );
121            }
122            else if( id[5] == 'D' )
123            {
124                asprintf( &ret, "KTorrent %c.%c Dev",
125                        id[3], id[4] );
126            }
127            else
128            {
129                asprintf( &ret, "KTorrent %c.%c.%c",
130                        id[3], id[4], id[5] );
131            }
132        }
133        else if( !memcmp( &id[1], "lt", 2 ) )
134        {
135            asprintf( &ret, "libTorrent %d.%d.%d.%d",
136                      charToInt( id[3] ), charToInt( id[4] ),
137                      charToInt( id[5] ), charToInt( id[6] ) );
138        }
139        else if( !memcmp( &id[1], "LT", 2 ) )
140        {
141            asprintf( &ret, "libtorrent %d.%d.%d.%d",
142                      charToInt( id[3] ), charToInt( id[4] ),
143                      charToInt( id[5] ), charToInt( id[6] ) );
144        }
145        else if( !memcmp( &id[1], "TT", 2 ) )
146        {
147            asprintf( &ret, "TuoTu %c.%c.%c",
148                      id[3], id[4], id[5] );
149        }
150                else if( !memcmp( &id[1], "ES", 2 ) )
151        {
152            asprintf( &ret, "Electric Sheep %c.%c.%c",
153                      id[3], id[4], id[5] );
154        }
155        else if( !memcmp( &id[1], "CD", 2 ) )
156        {
157            asprintf( &ret, "Enhanced CTorrent %d.%d",
158                      charToInt( id[3] ) * 10 + charToInt( id[4] ),
159                      charToInt( id[5] ) * 10 + charToInt( id[6] ) );
160        }
161                else if( !memcmp( &id[1], "CT", 2 ) )
162        {
163            asprintf( &ret, "CTorrent %c.%c.%d",
164                      id[3], id[4],
165                      charToInt( id[5] ) * 10 + charToInt( id[6] ) );
166        }
167        else if( !memcmp( &id[1], "LP", 2 ) )
168        {
169            asprintf( &ret, "Lphant %d.%c%c",
170                      charToInt( id[3] ) * 10 + charToInt( id[4] ),
171                      id[5], id[6] );
172        }
173        else if( !memcmp( &id[1], "AX", 2 ) )
174        {
175            asprintf( &ret, "BitPump %d.%c%c",
176                      charToInt( id[3] ) * 10 + charToInt( id[4] ),
177                      id[5], id[6] );
178        }
179        else if( !memcmp( &id[1], "DE", 2 ) )
180        {
181            asprintf( &ret, "Deluge %d.%d.%d",
182                      charToInt( id[3] ), charToInt( id[4] ),
183                      charToInt( id[5] ) );
184        }
185        else if( !memcmp( &id[1], "AG", 2 ) )
186        {
187            asprintf( &ret, "Ares Galaxy %d.%d.%d",
188                      charToInt( id[3] ), charToInt( id[4] ),
189                      charToInt( id[5] ) );
190        }
191        else if( !memcmp( &id[1], "AR", 2 ) )
192        {
193            asprintf( &ret, "Arctic Torrent" );
194        }
195        else if( !memcmp( &id[1], "BG", 2 ) )
196        {
197            asprintf( &ret, "BTG %c.%c.%c.%c",
198                      id[3], id[4], id[5], id[6] );
199        }
200                else if( !memcmp( &id[1], "BB", 2 ) )
201        {
202            asprintf( &ret, "BitBuddy %c.%c%c%c",
203                      id[3], id[4], id[5], id[6] );
204        }
205                else if( !memcmp( &id[1], "qB", 2 ) )
206        {
207            asprintf( &ret, "qBittorrent %d.%d.%d",
208                      charToInt( id[3] ), charToInt( id[4] ),
209                      charToInt( id[5] ) );
210        }
211        else if( !memcmp( &id[1], "BF", 2 ) )
212        {
213            asprintf( &ret, "Bitflu (%d/%d/%02d)",
214                      charToInt( id[6] ),
215                      charToInt( id[4] ) * 10 + charToInt( id[5] ),
216                      charToInt( id[3] ) );
217        }
218        else if( !memcmp( &id[1], "FT", 2 ) )
219        {
220            asprintf( &ret, "FoxTorrent (%c%c%c%c)",
221                      id[3], id[4], id[5], id[6] );
222        }
223       
224        if( ret )
225        {
226            return ret;
227        }
228    }
229   
230    /* Tornado-style */
231    if( !memcmp( &id[4], "----", 4 ) || !memcmp( &id[4], "--0", 3 ) )
232    {
233        if( id[0] == 'T' )
234        {
235            asprintf( &ret, "BitTornado %d.%d.%d", charToInt( id[1] ),
236                        charToInt( id[2] ), charToInt( id[3] ) );
237        }
238        else if( id[0] == 'A' )
239        {
240            asprintf( &ret, "ABC %d.%d.%d", charToInt( id[1] ),
241                        charToInt( id[2] ), charToInt( id[3] ) );
242        }
243        else if( id[0] == 'R' )
244        {
245            asprintf( &ret, "Tribler %c.%c", id[1], id[2] );
246        }
247        else if( id[0] == 'S' )
248        {
249            asprintf( &ret, "Shad0w's Client %d.%d.%d", charToInt( id[1] ),
250                        charToInt( id[2] ), charToInt( id[3] ) );
251        }
252       
253        if( ret )
254        {
255            return ret;
256        }
257    }
258   
259    /* Different formatting per client */
260    if( id[0] == 'M' && id[2] == '-' && id[7] == '-' )
261    {
262        if( id[4] == '-' && id[6] == '-' )
263        {
264            asprintf( &ret, "BitTorrent %c.%c.%c", id[1], id[3], id[5] );
265        }
266        else if( id[5] == '-' )
267        {
268            asprintf( &ret, "BitTorrent %c.%c%c.%c", id[1], id[3], id[4], id[6] );
269        }
270       
271        if( ret )
272        {
273            return ret;
274        }
275    }
276    if( id[0] == 'Q' && id[2] == '-' && id[7] == '-' )
277    {
278        if( id[4] == '-' && id[6] == '-' )
279        {
280            asprintf( &ret, "Queen Bee %c.%c.%c", id[1], id[3], id[5] );
281        }
282        else if( id[5] == '-' )
283        {
284            asprintf( &ret, "Queen Bee %c.%c%c.%c", id[1], id[3], id[4], id[6] );
285        }
286       
287        if( ret )
288        {
289            return ret;
290        }
291    }
292   
293    /* All versions of each client are formatted the same */
294    if( !memcmp( id, "exbc", 4 ) )
295    {
296        asprintf( &ret, "%s %d.%02d",
297                    !memcmp( &id[6], "LORD", 4 ) ? "BitLord" : "BitComet",
298                    id[4], id[5] );
299    }
300    else if( !memcmp( id, "OP", 2 ) )
301    {
302        asprintf( &ret, "Opera (%c%c%c%c)", id[2], id[3], id[4], id[5] );
303    }
304    else if( !memcmp( id, "-ML", 3 ) )
305    {
306        asprintf( &ret, "MLDonkey %c%c%c%c%c",
307                  id[3], id[4], id[5], id[6], id[7] );
308    }
309    else if( !memcmp( id, "AZ", 2 ) && !memcmp( &id[6], "BT", 2 ) )
310    {
311        asprintf( &ret, "BitTyrant %c.%c.%c.%c",
312                    id[2], id[3], id[4], id[5] );
313    }
314    else if( !memcmp( id, "-FG", 3 ) )
315    {
316        asprintf( &ret, "FlashGet %d.%c%c",
317                  charToInt( id[3] ) * 10 + charToInt( id[4] ),
318                      id[5], id[6] );
319    }
320    else if( !memcmp( id, "Plus", 4 ) )
321    {
322        asprintf( &ret, "Plus! v2 %c.%c%c", id[4], id[5], id[6] );
323    }
324    else if( !memcmp( id, "XBT", 3 ) )
325    {
326        asprintf( &ret, "XBT Client %c%c%c%s", id[3], id[4], id[5],
327                    id[6] == 'd' ? " (debug)" : "" );
328    }
329    else if( !memcmp( id, "Mbrst", 5 ) )
330    {
331        asprintf( &ret, "burst! %c.%c.%c", id[5], id[7], id[9] );
332    }
333    else if( !memcmp( id, "btpd", 4 ) )
334    {
335        asprintf( &ret, "BT Protocol Daemon %c%c%c", id[5], id[6], id[7] );
336    }
337    else if( id[0] == 'Q' && !memcmp( &id[4], "--", 2 ) )
338    {
339        asprintf( &ret, "BTQueue %d.%d.%d", charToInt( id[1] ),
340                    charToInt( id[2] ), charToInt( id[3] ) );
341    }
342    else if( !memcmp( id, "BLZ", 3 ) ) /* 07 is 1.7, check later to find out how version is encoded */
343    {
344        asprintf( &ret, "Blizzard Downloader (%d%d)", id[3], id[4] );
345    }
346    else if( !memcmp( id, "LIME", 4 ) )
347    {
348        asprintf( &ret, "Limewire" );
349    }
350    else if( !memcmp( id, "-G3", 3 ) )
351    {
352        asprintf( &ret, "G3 Torrent" );
353    }
354    else if( !memcmp( id, "10-------", 9 ) )
355    {
356        asprintf( &ret, "JVtorrent" );
357    }
358    else if( !memcmp( id, "346-", 4 ) )
359    {
360        asprintf( &ret, "TorrentTopia" );
361    }
362    else if( !memcmp( id, "eX", 2 ) )
363    {
364        asprintf( &ret, "eXeem" );
365    }
366
367    /* No match */
368    if( !ret )
369    {
370        if( isprint( id[0] ) && isprint( id[1] ) && isprint( id[2] ) &&
371            isprint( id[3] ) && isprint( id[4] ) && isprint( id[5] ) &&
372            isprint( id[6] ) && isprint( id[7] ) )
373        {
374            asprintf( &ret, "unknown client (%c%c%c%c%c%c%c%c)",
375                  id[0], id[1], id[2], id[3], id[4], id[5], id[6], id[7] );
376        }
377        else
378        {
379            asprintf( &ret, "unknown client (0x%02x%02x%02x%02x%02x%02x%02x%02x)",
380                  id[0], id[1], id[2], id[3], id[4], id[5], id[6], id[7] );
381        }
382    }
383
384    return ret;
385}
Note: See TracBrowser for help on using the repository browser.