]> git.ipfire.org Git - ipfire.org.git/blame - src/backend/tracker.py
python3: More code cleanup
[ipfire.org.git] / src / backend / tracker.py
CommitLineData
43d991f6
MT
1#!/usr/bin/python
2
170e8c36 3def ncode_hex(s):
f1349ebc 4 return s.encode("hex")
43d991f6 5
f1349ebc
MT
6def decode_hex(s):
7 return s.decode("hex")
43d991f6 8
43d991f6
MT
9##### This is borrowed from the bittorrent client libary #####
10
11def decode_int(x, f):
12 f += 1
13 newf = x.index('e', f)
14 n = int(x[f:newf])
15 if x[f] == '-':
16 if x[f + 1] == '0':
17 raise ValueError
18 elif x[f] == '0' and newf != f+1:
19 raise ValueError
20 return (n, newf+1)
21
22def decode_string(x, f):
23 colon = x.index(':', f)
24 n = int(x[f:colon])
25 if x[f] == '0' and colon != f+1:
26 raise ValueError
27 colon += 1
28 return (x[colon:colon+n], colon+n)
29
30def decode_list(x, f):
31 r, f = [], f+1
32 while x[f] != 'e':
33 v, f = decode_func[x[f]](x, f)
34 r.append(v)
35 return (r, f + 1)
36
37def decode_dict(x, f):
38 r, f = {}, f+1
39 while x[f] != 'e':
40 k, f = decode_string(x, f)
41 r[k], f = decode_func[x[f]](x, f)
42 return (r, f + 1)
43
44decode_func = {}
45decode_func['l'] = decode_list
46decode_func['d'] = decode_dict
47decode_func['i'] = decode_int
48decode_func['0'] = decode_string
49decode_func['1'] = decode_string
50decode_func['2'] = decode_string
51decode_func['3'] = decode_string
52decode_func['4'] = decode_string
53decode_func['5'] = decode_string
54decode_func['6'] = decode_string
55decode_func['7'] = decode_string
56decode_func['8'] = decode_string
57decode_func['9'] = decode_string
58
59def bdecode(x):
60 try:
61 r, l = decode_func[x[0]](x, 0)
62 except (IndexError, KeyError, ValueError):
63 raise Exception("not a valid bencoded string")
64 if l != len(x):
65 raise Exception("invalid bencoded value (data after valid prefix)")
66 return r
67
43d991f6
MT
68def encode_bencached(x,r):
69 r.append(x.bencoded)
70
71def encode_int(x, r):
72 r.extend(('i', str(x), 'e'))
73
74def encode_bool(x, r):
75 if x:
76 encode_int(1, r)
77 else:
78 encode_int(0, r)
79
80def encode_string(x, r):
81 r.extend((str(len(x)), ':', x))
82
83def encode_list(x, r):
84 r.append('l')
85 for i in x:
86 encode_func[type(i)](i, r)
87 r.append('e')
88
89def encode_dict(x,r):
90 r.append('d')
11347e46 91 ilist = list(x.items())
43d991f6
MT
92 ilist.sort()
93 for k, v in ilist:
94 r.extend((str(len(k)), ':', k))
95 encode_func[type(v)](v, r)
96 r.append('e')
97
98encode_func = {}
a69e87a1
MT
99encode_func[int] = encode_int
100encode_func[str] = encode_string
101encode_func[list] = encode_list
102encode_func[tuple] = encode_list
103encode_func[dict] = encode_dict
104encode_func[bool] = encode_bool
43d991f6
MT
105
106def bencode(x):
107 r = []
108 encode_func[type(x)](x, r)
109 return ''.join(r)