Редакция 2 | К новейшей редакции | Содержимое файла | Сравнить с предыдущей | Последнее изменение | Открыть журнал | RSS
Редакция | Автор | № строки | Строка |
---|---|---|---|
2 | scream | 1 | # -*- coding: utf-8 -*- |
2 | import sys |
||
3 | |||
4 | class PacketProcessor: |
||
5 | """ Class for processing tcp packets, |
||
6 | and make DC++ packets. (Merge packets from |
||
7 | one command). """ |
||
8 | def __init__(self): |
||
9 | """ Clear buffer and initialize class. """ |
||
10 | buffer = "" |
||
11 | |||
12 | def _isFull(self, command): |
||
13 | """ Check buffer for full command. """ |
||
14 | if len(command) == 0: |
||
15 | return False |
||
16 | if command[len(command) - 1] == '|': |
||
17 | return True |
||
18 | else: |
||
19 | return False |
||
20 | |||
21 | def Process(self, socket, packet, commandProcessor): |
||
22 | """ Process new tcp packet. """ |
||
23 | # Save previous packets |
||
24 | prev = self.buffer |
||
25 | # Clear buffer |
||
26 | self.buffer = "" |
||
27 | # Merge previous and packet |
||
28 | buf = prev + packet |
||
29 | # Split |
||
30 | commands = buf.split('|') |
||
31 | # If Merge result not is full command. |
||
32 | if not self._isFull(buf): |
||
33 | # If count of commands in Merge result is 1 |
||
34 | if len(commands) == 1: |
||
35 | # Save Merge result to buffer |
||
36 | self.buffer = commands[0] |
||
37 | commands = [] |
||
38 | else: |
||
39 | # Save first from all commands to buffer |
||
40 | self.buffer = commands[len(commands) - 1] |
||
41 | commands = commands[0:len(commands)-1] |
||
42 | # Process every command |
||
43 | for i in commands: |
||
44 | commandProcessor(i, socket) |
||
45 | |||
46 | def ClearBuffer(self): |
||
47 | self.buffer = "" |
||
48 | |||
49 | |||
50 | def createKey(lock): |
||
51 | """ Function create key from lock for DC connections. """ |
||
52 | key = {} |
||
53 | for i in xrange(1, len(lock)): |
||
54 | key[i] = ord(lock[i]) ^ ord(lock[i-1]) |
||
55 | key[0] = ord(lock[0]) ^ ord(lock[len(lock)-1]) ^ ord(lock[len(lock)-2]) ^ 5 |
||
56 | for i in xrange(0, len(lock)): |
||
57 | key[i] = ((key[i]<<4) & 240) | ((key[i]>>4) & 15) |
||
58 | out = '' |
||
59 | for i in xrange(0, len(lock)): |
||
60 | out += unichr(key[i]) |
||
61 | out = out.replace(u'\0', u'/%DCN000%/').replace(u'\5', u'/%DCN005%/').replace(u'\44', u'/%DCN036%/') |
||
62 | out = out.replace(u'\140', u'/%DCN096%/').replace(u'\174', u'/%DCN124%/').replace(u'\176', u'/%DCN126%/') |
||
63 | return out |
||
64 |