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/ build/
dist/ dist/
MANIFEST MANIFEST
@ -8,3 +8,6 @@ docs/_build/
.coverage .coverage
sleekxmpp.egg-info/ sleekxmpp.egg-info/
.ropeproject/ .ropeproject/
4913
*~
.baboon/

View File

@ -1,6 +1,7 @@
import sys import sys
import logging import logging
import struct import struct
import pickle
from threading import Thread, Event from threading import Thread, Event
from hashlib import sha1 from hashlib import sha1
@ -217,7 +218,7 @@ class XEP_0065(base_plugin):
proxy = self.proxy_threads.get(sid) proxy = self.proxy_threads.get(sid)
if proxy: if proxy:
proxy.s.sendall(data) proxy.send(data)
def on_recv(self, sid, data): def on_recv(self, sid, data):
""" Calls when data is recv from the Proxy socket associated """ Calls when data is recv from the Proxy socket associated
@ -306,6 +307,34 @@ class Proxy(Thread):
self.s.close() self.s.close()
log.info('Socket closed.') 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): def listen(self):
""" Listen for data on the socket. When receiving data, call """ Listen for data on the socket. When receiving data, call
the callback on_recv callable. the callback on_recv callable.
@ -328,8 +357,10 @@ class Proxy(Thread):
data = self.recv_size(self.s) data = self.recv_size(self.s)
if not data: if not data:
socket_open = False socket_open = False
else:
self.on_recv(self.sid, data) unpacked_data = self._unpack(data)
if unpacked_data:
self.on_recv(self.sid, unpacked_data)
def recv_size(self, the_socket): def recv_size(self, the_socket):
total_len = 0 total_len = 0