summaryrefslogtreecommitdiff
path: root/sunshine
diff options
context:
space:
mode:
authorKrzysztof Klinikowski <kkszysiu@gmail.com>2011-05-08 02:37:40 +0200
committerKrzysztof Klinikowski <kkszysiu@gmail.com>2011-05-08 02:37:40 +0200
commitbf480893886b31f0431d95404bacbeb21484f96f (patch)
treed23f113b2c1d6bfe579af51d79dcd4f999f2a3b4 /sunshine
parentd650a753b0a04409a5ffd977dd7e8672ecabc389 (diff)
Added USERLIST100 packets support.
Diffstat (limited to 'sunshine')
-rwxr-xr-xsunshine/lqsoft/pygadu/models.py2
-rwxr-xr-xsunshine/lqsoft/pygadu/network_v8.py65
-rwxr-xr-xsunshine/lqsoft/pygadu/twisted_protocol.py23
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")