source: trunk/libtransmission/clients.c @ 5505

Last change on this file since 5505 was 5505, checked in by livings124, 14 years ago

small rearrangement in clients list; update NEWS

  • Property svn:keywords set to Date Rev Author Id
File size: 14.6 KB
Line 
1/******************************************************************************
2 * $Id: clients.c 5505 2008-04-04 01:45:32Z livings124 $
3 *
4 * Copyright (c) 2005-2008 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 <ctype.h> /* isprint */
26#include <stdio.h>
27#include <string.h>
28
29#include "transmission.h"
30#include "utils.h"
31
32static int charToInt( char character )
33{
34    int value;
35    if( character >= 'A' && character <= 'Z' )
36        value = 10 + character - 'A';
37    else if( character >= 'a' && character <= 'z')
38        value = 36 + character - 'a';
39    else
40        value = character - '0';
41   
42    return value;
43}
44
45char * tr_clientForId( const uint8_t * id )
46{
47    char * ret = NULL;
48   
49    /* Azureus-style */
50    if( id[0] == '-' && id[7] == '-' )
51    {
52        if( !memcmp( &id[1], "TR", 2 ) )
53        {
54            /* support old-style Transmission id without maintenance number */
55            if ( !memcmp( &id[3], "00", 2 ) )
56            {
57                tr_asprintf( &ret, "Transmission 0.%d",
58                        charToInt( id[5] ) * 10 + charToInt( id[6] ) );
59            }
60            else
61            {
62                tr_asprintf( &ret, "Transmission %d.%c%c%s",
63                        charToInt( id[3] ), id[4], id[5],
64                        id[6] == 'Z' || id[6] == 'X' ? "+" : "" );
65            }
66        }
67        else if( !memcmp( &id[1], "UT", 2 ) )
68        {
69            tr_asprintf( &ret, "\xc2\xb5Torrent %c.%d", id[3],
70                      charToInt( id[4] ) * 10 + charToInt( id[5] ) );
71        }
72        else if( !memcmp( &id[1], "AZ", 2 ) )
73        {
74            tr_asprintf( &ret, "Azureus %c.%c.%c.%c",
75                      id[3], id[4], id[5], id[6] );
76        }
77       
78        else if( !memcmp( &id[1], "BC", 2 ) )
79        {
80            tr_asprintf( &ret, "BitComet %d.%c%c",
81                      charToInt( id[3] ) * 10 + charToInt( id[4] ),
82                      id[5], id[6] );
83        }
84        else if( !memcmp( &id[1], "SZ", 2 ) || !memcmp( &id[1], "S~", 2 ) )
85        {
86            tr_asprintf( &ret, "Shareaza %c.%c.%c.%c",
87                      id[3], id[4], id[5], id[6] );
88        }
89        else if( !memcmp( &id[1], "XL", 2 ) )
90        {
91            tr_asprintf( &ret, "Xunlei %c.%c.%c.%c",
92                         id[3], id[4], id[5], id[6] );
93        }
94        else if( !memcmp( &id[1], "BOW", 3 ) )
95        {
96            if( !memcmp( &id[4], "A0C", 3 ) )
97            {
98                tr_asprintf( &ret, "Bits on Wheels 1.0.6" );
99            }
100            else if( !memcmp( &id[4], "A0B", 3 ) )
101            {
102                tr_asprintf( &ret, "Bits on Wheels 1.0.5" );
103            }
104            else
105            {
106                tr_asprintf( &ret, "Bits on Wheels (%c%c%c)",
107                        id[4], id[5], id[6] );
108            }
109        }
110        else if( !memcmp( &id[1], "BR", 2 ) )
111        {
112            tr_asprintf( &ret, "BitRocket %c.%c (%d)",
113                      id[3], id[4], charToInt( id[5] ) * 10 + charToInt( id[6] ) );
114        }
115        else if( !memcmp( &id[1], "XX", 2 ) )
116        {
117            tr_asprintf( &ret, "Xtorrent %c.%c (%d)",
118                      id[3], id[4], charToInt( id[5] ) * 10 + charToInt( id[6] ) );
119        }
120        else if( !memcmp( &id[1], "TS", 2 ) )
121        {
122            tr_asprintf( &ret, "TorrentStorm %c.%c.%c.%c",
123                      id[3], id[4], id[5], id[6] );
124        }
125        else if( !memcmp( &id[1], "KT", 2 ) )
126        {
127            if( id[5] == 'R' )
128            {
129                tr_asprintf( &ret, "KTorrent %c.%c RC %c",
130                        id[3], id[4], id[6] );
131            }
132            else if( id[5] == 'D' )
133            {
134                tr_asprintf( &ret, "KTorrent %c.%c Dev",
135                        id[3], id[4] );
136            }
137            else
138            {
139                tr_asprintf( &ret, "KTorrent %c.%c.%c",
140                        id[3], id[4], id[5] );
141            }
142        }
143        else if( !memcmp( &id[1], "lt", 2 ) )
144        {
145            tr_asprintf( &ret, "libTorrent %d.%d.%d.%d",
146                      charToInt( id[3] ), charToInt( id[4] ),
147                      charToInt( id[5] ), charToInt( id[6] ) );
148        }
149        else if( !memcmp( &id[1], "LT", 2 ) )
150        {
151            tr_asprintf( &ret, "libtorrent %d.%d.%d.%d",
152                      charToInt( id[3] ), charToInt( id[4] ),
153                      charToInt( id[5] ), charToInt( id[6] ) );
154        }
155        else if( !memcmp( &id[1], "LH", 2 ) )
156        {
157            tr_asprintf( &ret, "LH-ABC %c.%c.%c",
158                      id[3], id[4], id[5] );
159        }
160        else if( !memcmp( &id[1], "TT", 2 ) )
161        {
162            tr_asprintf( &ret, "TuoTu %c.%c.%c",
163                      id[3], id[4], id[5] );
164        }
165                else if( !memcmp( &id[1], "ES", 2 ) )
166        {
167            tr_asprintf( &ret, "Electric Sheep %c.%c.%c",
168                      id[3], id[4], id[5] );
169        }
170        else if( !memcmp( &id[1], "CD", 2 ) )
171        {
172            tr_asprintf( &ret, "Enhanced CTorrent %d.%d",
173                      charToInt( id[3] ) * 10 + charToInt( id[4] ),
174                      charToInt( id[5] ) * 10 + charToInt( id[6] ) );
175        }
176                else if( !memcmp( &id[1], "CT", 2 ) )
177        {
178            tr_asprintf( &ret, "CTorrent %c.%c.%d",
179                      id[3], id[4],
180                      charToInt( id[5] ) * 10 + charToInt( id[6] ) );
181        }
182        else if( !memcmp( &id[1], "LP", 2 ) )
183        {
184            tr_asprintf( &ret, "Lphant %d.%c%c",
185                      charToInt( id[3] ) * 10 + charToInt( id[4] ),
186                      id[5], id[6] );
187        }
188        else if( !memcmp( &id[1], "AX", 2 ) )
189        {
190            tr_asprintf( &ret, "BitPump %d.%c%c",
191                      charToInt( id[3] ) * 10 + charToInt( id[4] ),
192                      id[5], id[6] );
193        }
194        else if( !memcmp( &id[1], "DE", 2 ) )
195        {
196            tr_asprintf( &ret, "Deluge %d.%d.%d",
197                      charToInt( id[3] ), charToInt( id[4] ),
198                      charToInt( id[5] ) );
199        }
200        else if( !memcmp( &id[1], "AG", 2 ) )
201        {
202            tr_asprintf( &ret, "Ares Galaxy %d.%d.%d",
203                      charToInt( id[3] ), charToInt( id[4] ),
204                      charToInt( id[5] ) );
205        }
206        else if( !memcmp( &id[1], "HL", 2 ) )
207        {
208            tr_asprintf( &ret, "Halite %d.%d.%d",
209                      charToInt( id[3] ), charToInt( id[4] ),
210                      charToInt( id[5] ) );
211        }
212        else if( !memcmp( &id[1], "AR", 2 ) )
213        {
214            tr_asprintf( &ret, "Arctic Torrent" );
215        }
216        else if( !memcmp( &id[1], "BG", 2 ) )
217        {
218            tr_asprintf( &ret, "BTG %c.%c.%c.%c",
219                      id[3], id[4], id[5], id[6] );
220        }
221                else if( !memcmp( &id[1], "BB", 2 ) )
222        {
223            tr_asprintf( &ret, "BitBuddy %c.%c%c%c",
224                      id[3], id[4], id[5], id[6] );
225        }
226                else if( !memcmp( &id[1], "qB", 2 ) )
227        {
228            tr_asprintf( &ret, "qBittorrent %d.%d.%d",
229                      charToInt( id[3] ), charToInt( id[4] ),
230                      charToInt( id[5] ) );
231        }
232        else if( !memcmp( &id[1], "BF", 2 ) )
233        {
234            tr_asprintf( &ret, "Bitflu (%d/%d/%02d)",
235                      charToInt( id[6] ),
236                      charToInt( id[4] ) * 10 + charToInt( id[5] ),
237                      charToInt( id[3] ) );
238        }
239        else if( !memcmp( &id[1], "FT", 2 ) )
240        {
241            tr_asprintf( &ret, "FoxTorrent (%c%c%c%c)",
242                      id[3], id[4], id[5], id[6] );
243        }
244        else if( !memcmp( &id[1], "GR", 2 ) )
245        {
246            tr_asprintf( &ret, "GetRight %c.%c.%c.%c",
247                      id[3], id[4], id[5], id[6] );
248        }
249        else if( !memcmp( &id[1], "PD", 2 ) )
250        {
251            tr_asprintf( &ret, "Pando %c.%c.%c.%c",
252                      id[3], id[4], id[5], id[6] );
253        }
254        else if( !memcmp( &id[1], "WY", 2 ) )
255        {
256            tr_asprintf( &ret, "Wyzo %c.%c.%c.%c",
257                      id[3], id[4], id[5], id[6] );
258        }
259        else if( !memcmp( &id[1], "NX", 2 ) )
260        { 
261            tr_asprintf( &ret, "Net Transport %d.%c.%c", 
262                      charToInt( id[3] ) * 10 + charToInt( id[4] ), 
263                      id[5], id[6] ); 
264        } 
265        else if( !memcmp( &id[1], "LW", 2 ) )
266        {
267            tr_asprintf( &ret, "LimeWire" );
268        }
269       
270        if( ret )
271        {
272            return ret;
273        }
274    }
275   
276    /* Tornado-style */
277    if( !memcmp( &id[4], "----", 4 ) || !memcmp( &id[4], "--0", 3 ) )
278    {
279        if( id[0] == 'T' )
280        {
281            tr_asprintf( &ret, "BitTornado %d.%d.%d", charToInt( id[1] ),
282                        charToInt( id[2] ), charToInt( id[3] ) );
283        }
284        else if( id[0] == 'A' )
285        {
286            tr_asprintf( &ret, "ABC %d.%d.%d", charToInt( id[1] ),
287                        charToInt( id[2] ), charToInt( id[3] ) );
288        }
289        else if( id[0] == 'R' )
290        {
291            tr_asprintf( &ret, "Tribler %c.%c", id[1], id[2] );
292        }
293        else if( id[0] == 'S' )
294        {
295            tr_asprintf( &ret, "Shad0w's Client %d.%d.%d", charToInt( id[1] ),
296                        charToInt( id[2] ), charToInt( id[3] ) );
297        }
298       
299        if( ret )
300        {
301            return ret;
302        }
303    }
304   
305    /* Different formatting per client */
306    if( id[0] == 'M' && id[2] == '-' && id[7] == '-' )
307    {
308        if( id[4] == '-' && id[6] == '-' )
309        {
310            tr_asprintf( &ret, "BitTorrent %c.%c.%c", id[1], id[3], id[5] );
311        }
312        else if( id[5] == '-' )
313        {
314            tr_asprintf( &ret, "BitTorrent %c.%c%c.%c", id[1], id[3], id[4], id[6] );
315        }
316       
317        if( ret )
318        {
319            return ret;
320        }
321    }
322    if( id[0] == 'Q' && id[2] == '-' && id[7] == '-' )
323    {
324        if( id[4] == '-' && id[6] == '-' )
325        {
326            tr_asprintf( &ret, "Queen Bee %c.%c.%c", id[1], id[3], id[5] );
327        }
328        else if( id[5] == '-' )
329        {
330            tr_asprintf( &ret, "Queen Bee %c.%c%c.%c", id[1], id[3], id[4], id[6] );
331        }
332       
333        if( ret )
334        {
335            return ret;
336        }
337    }
338   
339    /* All versions of each client are formatted the same */
340    if( !memcmp( id, "S3", 2 ) && id[2] == '-' && id[4] == '-' && id[6] == '-' )
341    {
342        tr_asprintf( &ret, "Amazon S3 %c.%c.%c", id[3], id[5], id[7] );
343    }
344    else if( !memcmp( id, "exbc", 4 ) )
345    {
346        tr_asprintf( &ret, "%s %d.%02d",
347                    !memcmp( &id[6], "LORD", 4 ) ? "BitLord" : "BitComet",
348                    id[4], id[5] );
349    }
350    else if( !memcmp( id, "OP", 2 ) )
351    {
352        tr_asprintf( &ret, "Opera (%c%c%c%c)", id[2], id[3], id[4], id[5] );
353    }
354    else if( !memcmp( id, "-ML", 3 ) )
355    {
356        tr_asprintf( &ret, "MLDonkey %c%c%c%c%c",
357                  id[3], id[4], id[5], id[6], id[7] );
358    }
359    else if( !memcmp( id, "AZ", 2 ) && !memcmp( &id[6], "BT", 2 ) )
360    {
361        tr_asprintf( &ret, "BitTyrant %c.%c.%c.%c",
362                    id[2], id[3], id[4], id[5] );
363    }
364    else if( !memcmp( id, "-FG", 3 ) )
365    {
366        tr_asprintf( &ret, "FlashGet %d.%c%c",
367                  charToInt( id[3] ) * 10 + charToInt( id[4] ),
368                      id[5], id[6] );
369    }
370    else if( !memcmp( id, "DNA", 3 ) )
371    {
372        tr_asprintf( &ret, "BitTorrent DNA %d.%d.%d", charToInt( id[3] ) * 10 + charToInt( id[4] ),
373                    charToInt( id[5] ) * 10 + charToInt( id[6] ), charToInt( id[7] ) * 10 + charToInt( id[8] ) );
374    }
375    else if( !memcmp( id, "Plus", 4 ) )
376    {
377        tr_asprintf( &ret, "Plus! v2 %c.%c%c", id[4], id[5], id[6] );
378    }
379    else if( !memcmp( id, "XBT", 3 ) )
380    {
381        tr_asprintf( &ret, "XBT Client %c%c%c%s", id[3], id[4], id[5],
382                    id[6] == 'd' ? " (debug)" : "" );
383    }
384    else if( !memcmp( id, "Mbrst", 5 ) )
385    {
386        tr_asprintf( &ret, "burst! %c.%c.%c", id[5], id[7], id[9] );
387    }
388    else if( !memcmp( id, "btpd", 4 ) )
389    {
390        tr_asprintf( &ret, "BT Protocol Daemon %c%c%c", id[5], id[6], id[7] );
391    }
392    else if( id[0] == 'Q' && !memcmp( &id[4], "--", 2 ) )
393    {
394        tr_asprintf( &ret, "BTQueue %d.%d.%d", charToInt( id[1] ),
395                    charToInt( id[2] ), charToInt( id[3] ) );
396    }
397    else if( !memcmp( id, "BLZ", 3 ) )
398    {
399        tr_asprintf( &ret, "Blizzard Downloader %d.%d", id[3] + 1, id[4] );
400    }
401    else if( !memcmp( id, "-WT-", 4 ) )
402    {
403        tr_asprintf( &ret, "BitLet" );
404    }
405    else if( !memcmp( id, "LIME", 4 ) )
406    {
407        tr_asprintf( &ret, "LimeWire" );
408    }
409    else if( !memcmp( id, "-G3", 3 ) )
410    {
411        tr_asprintf( &ret, "G3 Torrent" );
412    }
413    else if( !memcmp( id, "10-------", 9 ) )
414    {
415        tr_asprintf( &ret, "JVtorrent" );
416    }
417    else if( !memcmp( id, "346-", 4 ) )
418    {
419        tr_asprintf( &ret, "TorrentTopia" );
420    }
421    else if( !memcmp( id, "eX", 2 ) )
422    {
423        tr_asprintf( &ret, "eXeem" );
424    }
425    else if( '\0' == id[0] && !memcmp( &id[1], "BS", 2 ) )
426    {
427        tr_asprintf( &ret, "BitSpirit %u", ( id[1] == 0 ? 1 : id[1] ) );
428    }
429
430    /* No match */
431    if( !ret )
432    {
433        if( isprint( id[0] ) && isprint( id[1] ) && isprint( id[2] ) &&
434            isprint( id[3] ) && isprint( id[4] ) && isprint( id[5] ) &&
435            isprint( id[6] ) && isprint( id[7] ) )
436        {
437            tr_asprintf( &ret, "%c%c%c%c%c%c%c%c",
438                  id[0], id[1], id[2], id[3], id[4], id[5], id[6], id[7] );
439        }
440        else
441        {
442            tr_asprintf( &ret, "0x%02x%02x%02x%02x%02x%02x%02x%02x",
443                  id[0], id[1], id[2], id[3], id[4], id[5], id[6], id[7] );
444        }
445    }
446
447    return ret;
448}
Note: See TracBrowser for help on using the repository browser.