Extended encoding updates
- more flexible and developer friendly. Still not active code
This commit is contained in:
parent
020a78b776
commit
8ce72d8d2d
|
@ -5,14 +5,16 @@ import msgpack
|
||||||
import zlib
|
import zlib
|
||||||
|
|
||||||
from debug import logger
|
from debug import logger
|
||||||
|
import messagetypes
|
||||||
|
|
||||||
BITMESSAGE_ENCODING_IGNORE = 0
|
BITMESSAGE_ENCODING_IGNORE = 0
|
||||||
BITMESSAGE_ENCODING_TRIVIAL = 1
|
BITMESSAGE_ENCODING_TRIVIAL = 1
|
||||||
BITMESSAGE_ENCODING_SIMPLE = 2
|
BITMESSAGE_ENCODING_SIMPLE = 2
|
||||||
BITMESSAGE_ENCODING_EXTENDED = 3
|
BITMESSAGE_ENCODING_EXTENDED = 3
|
||||||
|
|
||||||
|
|
||||||
class MsgEncode(object):
|
class MsgEncode(object):
|
||||||
def __init__(self, message, encoding = BITMESSAGE_ENCODING_SIMPLE):
|
def __init__(self, message, encoding=BITMESSAGE_ENCODING_SIMPLE):
|
||||||
self.data = None
|
self.data = None
|
||||||
self.encoding = encoding
|
self.encoding = encoding
|
||||||
self.length = 0
|
self.length = 0
|
||||||
|
@ -27,10 +29,10 @@ class MsgEncode(object):
|
||||||
try:
|
try:
|
||||||
self.data = zlib.compress(msgpack.dumps({"": "message", "subject": message['subject'], "message": ['body']}), 9)
|
self.data = zlib.compress(msgpack.dumps({"": "message", "subject": message['subject'], "message": ['body']}), 9)
|
||||||
except zlib.error:
|
except zlib.error:
|
||||||
logger.error ("Error compressing message")
|
logger.error("Error compressing message")
|
||||||
raise
|
raise
|
||||||
except msgpack.exceptions.PackException:
|
except msgpack.exceptions.PackException:
|
||||||
logger.error ("Error msgpacking message")
|
logger.error("Error msgpacking message")
|
||||||
raise
|
raise
|
||||||
self.length = len(self.data)
|
self.length = len(self.data)
|
||||||
|
|
||||||
|
@ -55,20 +57,30 @@ class MsgDecode(object):
|
||||||
try:
|
try:
|
||||||
tmp = msgpack.loads(zlib.decompress(data))
|
tmp = msgpack.loads(zlib.decompress(data))
|
||||||
except zlib.error:
|
except zlib.error:
|
||||||
logger.error ("Error decompressing message")
|
logger.error("Error decompressing message")
|
||||||
raise
|
raise
|
||||||
except (msgpack.exceptions.UnpackException,
|
except (msgpack.exceptions.UnpackException,
|
||||||
msgpack.exceptions.ExtraData):
|
msgpack.exceptions.ExtraData):
|
||||||
logger.error ("Error msgunpacking message")
|
logger.error("Error msgunpacking message")
|
||||||
raise
|
raise
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if tmp[""] == "message":
|
msgType = tmp[""]
|
||||||
self.body = tmp["body"]
|
except KeyError:
|
||||||
self.subject = tmp["subject"]
|
logger.error("Message type missing")
|
||||||
except:
|
|
||||||
logger.error ("Malformed message")
|
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
msgObj = messagetypes.constructObject(data)
|
||||||
|
if msgObj is None:
|
||||||
|
raise ValueError("Malformed message")
|
||||||
|
try:
|
||||||
|
msgObj.process()
|
||||||
|
except:
|
||||||
|
raise ValueError("Malformed message")
|
||||||
|
if msgType[""] == "message":
|
||||||
|
self.subject = msgObj.subject
|
||||||
|
self.body = msgObj.body
|
||||||
|
|
||||||
def decodeSimple(self, data):
|
def decodeSimple(self, data):
|
||||||
bodyPositionIndex = string.find(data, '\nBody:')
|
bodyPositionIndex = string.find(data, '\nBody:')
|
||||||
if bodyPositionIndex > 1:
|
if bodyPositionIndex > 1:
|
||||||
|
|
37
src/messagetypes/__init__.py
Normal file
37
src/messagetypes/__init__.py
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
from importlib import import_module
|
||||||
|
from pprint import pprint
|
||||||
|
from os import path, listdir
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
def constructObject(data):
|
||||||
|
try:
|
||||||
|
classBase = eval(data[""] + "." + data[""].title())
|
||||||
|
except NameError:
|
||||||
|
print "Don't know how to handle message type: \"%s\"" % (data[""])
|
||||||
|
return None
|
||||||
|
try:
|
||||||
|
returnObj = classBase(data)
|
||||||
|
except KeyError as e:
|
||||||
|
print "Missing mandatory key %s" % (e)
|
||||||
|
return None
|
||||||
|
except:
|
||||||
|
print "classBase fail:"
|
||||||
|
pprint(sys.exc_info())
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
return returnObj
|
||||||
|
|
||||||
|
for mod in listdir(path.dirname(__file__)):
|
||||||
|
if mod == "__init__.py":
|
||||||
|
continue
|
||||||
|
splitted = path.splitext(mod)
|
||||||
|
if splitted[1] != ".py":
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
import_module("." + splitted[0], "messagetypes")
|
||||||
|
except ImportError:
|
||||||
|
print "Error importing %s" % (mod)
|
||||||
|
pprint(sys.exc_info())
|
||||||
|
else:
|
||||||
|
print "Imported %s" % (mod)
|
8
src/messagetypes/message.py
Normal file
8
src/messagetypes/message.py
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
class Message:
|
||||||
|
def __init__(self, data):
|
||||||
|
self.subject = data["subject"]
|
||||||
|
self.body = data["body"]
|
||||||
|
|
||||||
|
def process(self):
|
||||||
|
print "Subject: %s" % (self.subject)
|
||||||
|
print "Body: %s" % (self.body)
|
8
src/messagetypes/vote.py
Normal file
8
src/messagetypes/vote.py
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
class Vote:
|
||||||
|
def __init__(self, data):
|
||||||
|
self.msgid = data["msgid"]
|
||||||
|
self.vote = data["vote"]
|
||||||
|
|
||||||
|
def process(self):
|
||||||
|
print "msgid: %s" % (self.msgid)
|
||||||
|
print "vote: %s" % (self.vote)
|
Loading…
Reference in New Issue
Block a user