diff options
author | Krzysztof Klinikowski <kkszysiu@gmail.com> | 2011-05-08 02:37:40 +0200 |
---|---|---|
committer | Krzysztof Klinikowski <kkszysiu@gmail.com> | 2011-05-08 02:37:40 +0200 |
commit | bf480893886b31f0431d95404bacbeb21484f96f (patch) | |
tree | d23f113b2c1d6bfe579af51d79dcd4f999f2a3b4 /sunshine | |
parent | d650a753b0a04409a5ffd977dd7e8672ecabc389 (diff) |
Added USERLIST100 packets support.
Diffstat (limited to 'sunshine')
-rwxr-xr-x | sunshine/lqsoft/pygadu/models.py | 2 | ||||
-rwxr-xr-x | sunshine/lqsoft/pygadu/network_v8.py | 65 | ||||
-rwxr-xr-x | sunshine/lqsoft/pygadu/twisted_protocol.py | 23 |
3 files changed, 67 insertions, 23 deletions
diff --git a/sunshine/lqsoft/pygadu/models.py b/sunshine/lqsoft/pygadu/models.py index 14c8cdb..73ee18d 100755 --- a/sunshine/lqsoft/pygadu/models.py +++ b/sunshine/lqsoft/pygadu/models.py @@ -136,7 +136,7 @@ class GaduProfile(object): raise RuntimeError("You need to be connected, to import contact list from the server.") def parse_xml(data): - #print zlib.decompress(data) + print zlib.decompress(data) book = ET.fromstring(zlib.decompress(data)) self._flushContacts() diff --git a/sunshine/lqsoft/pygadu/network_v8.py b/sunshine/lqsoft/pygadu/network_v8.py index eac767e..fb023a9 100755 --- a/sunshine/lqsoft/pygadu/network_v8.py +++ b/sunshine/lqsoft/pygadu/network_v8.py @@ -183,7 +183,7 @@ StatusNoticiesPacket = inpacket(0x37)(StatusNoticiesPacket) # # Contact database altering packets # -class ULRequestPacket(GaduPacket): # UserListReq80 +class ULRequestPacket(GaduPacket): # UserListReq100 """Import contact list from the server""" TYPE = Enum({ 'PUT': 0x00, @@ -191,29 +191,66 @@ class ULRequestPacket(GaduPacket): # UserListReq80 'GET': 0x02, }) + FORMAT_TYPE = Enum({ + 'NONE': 0x00, + 'GG70': 0x01, + 'GG100': 0x02, + }) + type = ByteField(0) - data = StringField(1, length=-1) -ULRequestPacket = outpacket(0x2f)(ULRequestPacket) + version = IntField(1, default=0) + format_type = ByteField(2, default=FORMAT_TYPE.GG100) # GG10 + unknown1 = ByteField(3, default=0x01) + data = StringField(4, length=-1) +ULRequestPacket = outpacket(0x40)(ULRequestPacket) + +class ULReplyPacket(GaduPacket): # UserListReply100 + #TYPE = Enum({ + #'PUT_REPLY': 0x00, + #'PUT_REPLY_MORE': 0x02, + #'GET_REPLY_MORE': 0x04, + #'GET_REPLY': 0x06, + #}) + + #type = ByteField(0) + #data = StringField(1, length=-1) + + #char type; /* rodzaj odpowiedzi */ + #int version; /* numer wersji listy kontaktów aktualnie przechowywanej przez serwer */ + #char format_type; /* rodzaj przesyłanego typu formatu listy kontaktów */ + #char unknown1; /* zawsze 0x01 */ + #char reply[]; /* treść (nie musi wystąpić) */ -class ULReplyPacket(GaduPacket): # UserListReply80 TYPE = Enum({ - 'PUT_REPLY': 0x00, - 'PUT_REPLY_MORE': 0x02, - 'GET_REPLY_MORE': 0x04, - 'GET_REPLY': 0x06, + 'LIST': 0x00, + 'ACK': 0x10, + 'REJECT': 0x12, + }) + + FORMAT_TYPE = Enum({ + 'NONE': 0x00, + 'GG70': 0x01, + 'GG100': 0x02, }) type = ByteField(0) - data = StringField(1, length=-1) + version = IntField(1) + format_type = ByteField(2, default=FORMAT_TYPE.GG100) # GG10 + unknown1 = ByteField(3, default=0x01) + data = StringField(4, length=-1) - @property - def is_get(self): - return (self.type & self.TYPE.GET_REPLY_MORE) + #@property + #def is_get(self): + #return (self.type & self.TYPE.GET_REPLY_MORE) @property def is_final(self): - return (self.type & 0x02) -ULReplyPacket = inpacket(0x30)(ULReplyPacket) + return (self.type & 0x00) +ULReplyPacket = inpacket(0x41)(ULReplyPacket) + +class ULVersion(GaduPacket): # UserListVersion100 + version = IntField(0) +ULVersion = inpacket(0x5c)(ULVersion) # # GG_XML_EVENT and GG_XML_ACTION packets diff --git a/sunshine/lqsoft/pygadu/twisted_protocol.py b/sunshine/lqsoft/pygadu/twisted_protocol.py index b9f0f85..889a303 100755 --- a/sunshine/lqsoft/pygadu/twisted_protocol.py +++ b/sunshine/lqsoft/pygadu/twisted_protocol.py @@ -32,6 +32,7 @@ class GaduClient(Protocol): self.__pingThread = None self.msg_id = 0 + self.clistversion = 0 def connectionMade(self): self.__buffer = '' @@ -198,7 +199,9 @@ class GaduClient(Protocol): # type = ULRequestPacket.TYPE.PUT_MORE # self._sendPacket(klass(type = type, data = batch)) - self._sendPacket(klass(type = ULRequestPacket.TYPE.PUT, data = xml)) + self.clistversion = self.clistversion+1 + + self._sendPacket(klass(type = ULRequestPacket.TYPE.PUT, version = self.clistversion, data = xml)) self._log("All contacts exported.") def sendPing(self): @@ -319,17 +322,21 @@ class GaduClient(Protocol): return True def _handleULReplyPacket(self, msg): - if msg.is_get: + if msg.type == 0x00: if not self.importrq_cb: self._warn("Unexpected UL_GET reply") return - - self.import_buf += msg.data - if msg.is_final: - cb = self.importrq_cb - self.importrq_cb = None - cb.callback(self.import_buf) + self.import_buf = msg.data + + cb = self.importrq_cb + self.importrq_cb = None + self.clistversion = msg.version + cb.callback(self.import_buf) + elif msg.type == 0x10: + self.clistversion = msg.version + elif msg.type == 0x12: + self._log("UL_PUT ivalid contactlist version") else: self._log("UL_PUT reply") |