Improved the gitignore files (vim temp file, .pyo file and .baboon directory).

Automatically pack & unpack data through the socket.

Added some comments to the pack method.

Handled possible error during the unpacking of data.
This commit is contained in:
Sandro Munda 2012-11-01 10:58:54 +01:00
parent 6045a6bfb3
commit d444930494
2 changed files with 38 additions and 4 deletions

5
.gitignore vendored
View File

@ -1,4 +1,4 @@
*.pyc
*.py[co]
build/
dist/
MANIFEST
@ -8,3 +8,6 @@ docs/_build/
.coverage
sleekxmpp.egg-info/
.ropeproject/
4913
*~
.baboon/

View File

@ -1,6 +1,7 @@
import sys
import logging
import struct
import pickle
from threading import Thread, Event
from hashlib import sha1
@ -217,7 +218,7 @@ class XEP_0065(base_plugin):
proxy = self.proxy_threads.get(sid)
if proxy:
proxy.s.sendall(data)
proxy.send(data)
def on_recv(self, sid, data):
""" Calls when data is recv from the Proxy socket associated
@ -306,6 +307,34 @@ class Proxy(Thread):
self.s.close()
log.info('Socket closed.')
def send(self, data):
""" Send data through the socket.
"""
try:
packed_data = self._pack(data)
self.s.sendall(packed_data)
except pickle.PickleError as err:
log.error(err)
def _pack(self, data):
""" Packs the data.
"""
# The data format is: `len_data`+`data`. Useful to receive all the data
# at once (avoid splitted data) thanks to the recv_size method.
data = pickle.dumps(data)
return struct.pack('>i', len(data)) + data
def _unpack(self, data):
""" Unpacks the data. On error, log an error message and returns None.
"""
try:
return pickle.loads(data)
except Exception as err:
log.error(err)
def listen(self):
""" Listen for data on the socket. When receiving data, call
the callback on_recv callable.
@ -328,8 +357,10 @@ class Proxy(Thread):
data = self.recv_size(self.s)
if not data:
socket_open = False
self.on_recv(self.sid, data)
else:
unpacked_data = self._unpack(data)
if unpacked_data:
self.on_recv(self.sid, unpacked_data)
def recv_size(self, the_socket):
total_len = 0