[svn] commit: r85 - in /experiments/graff-ccapi/python: ISC/CC/__init__.py ISC/CC/message.py ISC/CC/session.py test.py
BIND 10 source code commits
bind10-changes at lists.isc.org
Mon Oct 12 15:39:24 UTC 2009
Author: mgraff
Date: Mon Oct 12 15:39:24 2009
New Revision: 85
Log:
classless
Modified:
experiments/graff-ccapi/python/ISC/CC/__init__.py
experiments/graff-ccapi/python/ISC/CC/message.py
experiments/graff-ccapi/python/ISC/CC/session.py
experiments/graff-ccapi/python/test.py
Modified: experiments/graff-ccapi/python/ISC/CC/__init__.py
==============================================================================
--- experiments/graff-ccapi/python/ISC/CC/__init__.py (original)
+++ experiments/graff-ccapi/python/ISC/CC/__init__.py Mon Oct 12 15:39:24 2009
@@ -1,2 +1,2 @@
-from message import *
+import message
from session import *
Modified: experiments/graff-ccapi/python/ISC/CC/message.py
==============================================================================
--- experiments/graff-ccapi/python/ISC/CC/message.py (original)
+++ experiments/graff-ccapi/python/ISC/CC/message.py Mon Oct 12 15:39:24 2009
@@ -18,178 +18,177 @@
class DecodeError(Exception): pass
-class Message:
- PROTOCOL_VERSION = 0x536b616e
+PROTOCOL_VERSION = 0x536b616e
- _ITEM_DATA = 0x01
- _ITEM_HASH = 0x02
- _ITEM_LIST = 0x03
- _ITEM_NULL = 0x04
- _ITEM_MASK = 0x0f
+_ITEM_DATA = 0x01
+_ITEM_HASH = 0x02
+_ITEM_LIST = 0x03
+_ITEM_NULL = 0x04
+_ITEM_MASK = 0x0f
- _ITEM_LENGTH_32 = 0x00
- _ITEM_LENGTH_16 = 0x10
- _ITEM_LENGTH_8 = 0x20
- _ITEM_LENGTH_MASK = 0x30
+_ITEM_LENGTH_32 = 0x00
+_ITEM_LENGTH_16 = 0x10
+_ITEM_LENGTH_8 = 0x20
+_ITEM_LENGTH_MASK = 0x30
- def to_wire(self, items):
- """Encode a dict into wire format.
- >>> cc = Message()
- ... wire = to_wire({"a": "b"})
- """
- ret = []
- ret.append(struct.pack(">I", self.PROTOCOL_VERSION))
- ret.append(self._encode_hash(items))
- return (''.join(ret))
+def to_wire(items):
+ """Encode a dict into wire format.
+ >>> cc = Message()
+ ... wire = to_wire({"a": "b"})
+ """
+ ret = []
+ ret.append(struct.pack(">I", PROTOCOL_VERSION))
+ ret.append(_encode_hash(items))
+ return (''.join(ret))
- def _encode_tag(self, tag):
- """Encode a single UTF-8 tag.
- >>> cc = Message()
- ... wire_partial = cc._encode_tag('this')
- """
- return(struct.pack(">B", len(str(tag))) + str(tag))
+def _encode_tag(tag):
+ """Encode a single UTF-8 tag.
+ >>> cc = Message()
+ ... wire_partial = cc._encode_tag('this')
+ """
+ return(struct.pack(">B", len(str(tag))) + str(tag))
- def _encode_length_and_type(self, data, datatype):
- """Helper method to handle the length encoding in one place."""
- if data == None:
- return(struct.pack(">B", self._ITEM_NULL))
- length = len(data)
- if length < 0x0000100:
- return(struct.pack(">B B", datatype | self._ITEM_LENGTH_8, length)
- + data)
- elif length < 0x00010000:
- return(struct.pack(">B H", datatype | self._ITEM_LENGTH_16, length)
- + data)
- else:
- return(struct.pack(">B I", datatype, length) + data)
+def _encode_length_and_type(data, datatype):
+ """Helper method to handle the length encoding in one place."""
+ if data == None:
+ return(struct.pack(">B", _ITEM_NULL))
+ length = len(data)
+ if length < 0x0000100:
+ return(struct.pack(">B B", datatype | _ITEM_LENGTH_8, length)
+ + data)
+ elif length < 0x00010000:
+ return(struct.pack(">B H", datatype | _ITEM_LENGTH_16, length)
+ + data)
+ else:
+ return(struct.pack(">B I", datatype, length) + data)
- def _pack_string(self, item):
- """Pack a string (data) and its type/length prefix."""
- return (self._encode_length_and_type(item, self._ITEM_DATA))
+def _pack_string(item):
+ """Pack a string (data) and its type/length prefix."""
+ return (_encode_length_and_type(item, _ITEM_DATA))
- def _pack_array(self, item):
- """Pack a list (array) and its type/length prefix."""
- return (self._encode_length_and_type(self._encode_array(item),
- self._ITEM_LIST))
+def _pack_array(item):
+ """Pack a list (array) and its type/length prefix."""
+ return (_encode_length_and_type(_encode_array(item),
+ _ITEM_LIST))
- def _pack_hash(self, item):
- """Pack a dict (hash) and its type/length prefix."""
- data = self._encode_hash(item)
- return (self._encode_length_and_type(data, self._ITEM_HASH))
+def _pack_hash(item):
+ """Pack a dict (hash) and its type/length prefix."""
+ data = _encode_hash(item)
+ return (_encode_length_and_type(data, _ITEM_HASH))
- def _encode_string(self, item):
- """Encode a string. More or less identity."""
- return (item)
+def _encode_string(item):
+ """Encode a string. More or less identity."""
+ return (item)
- def _pack_nil(self):
- """Encode a nil (NULL, None) item."""
- return self._encode_length_and_type(None, None)
+def _pack_nil():
+ """Encode a nil (NULL, None) item."""
+ return _encode_length_and_type(None, None)
- def _encode_item(self, item):
- """Encode each item depending on its type"""
- if item == None:
- return (self._pack_nil())
- elif type(item) == dict:
- return (self._pack_hash(item))
- elif type(item) == list:
- return (self._pack_array(item))
- else:
- return (self._pack_string(str(item)))
+def _encode_item(item):
+ """Encode each item depending on its type"""
+ if item == None:
+ return (_pack_nil())
+ elif type(item) == dict:
+ return (_pack_hash(item))
+ elif type(item) == list:
+ return (_pack_array(item))
+ else:
+ return (_pack_string(str(item)))
- def _encode_array(self, item):
- """Encode an array, where each value is encoded recursively"""
- ret = []
- for i in item:
- ret.append(self._encode_item(i))
- return (''.join(ret))
+def _encode_array(item):
+ """Encode an array, where each value is encoded recursively"""
+ ret = []
+ for i in item:
+ ret.append(_encode_item(i))
+ return (''.join(ret))
- def _encode_hash(self, item):
- """Encode a hash, where each value is encoded recursively"""
+def _encode_hash(item):
+ """Encode a hash, where each value is encoded recursively"""
- ret = []
- for key, value in item.items():
- ret.append(self._encode_tag(key))
- ret.append(self._encode_item(value))
- return (''.join(ret))
+ ret = []
+ for key, value in item.items():
+ ret.append(_encode_tag(key))
+ ret.append(_encode_item(value))
+ return (''.join(ret))
- #
- # decode methods
- #
+#
+# decode methods
+#
- def from_wire(self, data):
- if len(data) < 5:
- raise DecodeError("Data is too short to decode")
- wire_version, data = data[0:4], data[4:]
- wire_version = struct.unpack(">I", wire_version)[0]
- if wire_version != self.PROTOCOL_VERSION:
- raise DecodeError("Incorrect protocol version")
- return self._decode_hash(data)
+def from_wire(data):
+ if len(data) < 5:
+ raise DecodeError("Data is too short to decode")
+ wire_version, data = data[0:4], data[4:]
+ wire_version = struct.unpack(">I", wire_version)[0]
+ if wire_version != PROTOCOL_VERSION:
+ raise DecodeError("Incorrect protocol version")
+ return _decode_hash(data)
- def _decode_tag(self, data):
- if len(data) < 1:
+def _decode_tag(data):
+ if len(data) < 1:
+ raise DecodeError("Data underrun while decoding")
+ length = struct.unpack(">B", data[0])[0]
+ if len(data) - 1 < length:
+ raise DecodeError("Data underrun while decoding")
+ return [data[1:length + 1], data[length + 1:]]
+
+def _decode_item(data):
+ if len(data) < 1:
+ raise DecodeError("Data underrun while decoding")
+ type_and_length_format = struct.unpack(">B", data[0])[0]
+ item_type = type_and_length_format & _ITEM_MASK
+ length_format = type_and_length_format & _ITEM_LENGTH_MASK
+
+ if item_type == _ITEM_NULL:
+ data = data[1:]
+ else:
+ if length_format == _ITEM_LENGTH_8:
+ if len(data) - 1 < 1:
+ raise DecodeError("Data underrun while decoding")
+ length = struct.unpack(">B", data[1])[0]
+ data = data[2:]
+ elif length_format == _ITEM_LENGTH_16:
+ if len(data) - 1 < 2:
+ raise DecodeError("Data underrun while decoding")
+ length = struct.unpack(">H", data[1:3])[0]
+ data = data[3:]
+ elif length_format == _ITEM_LENGTH_32:
+ if len(data) - 1 < 4:
+ raise DecodeError("Data underrun while decoding")
+ length = struct.unpack(">I", data[1:5])[0]
+ data = data[5:]
+ if len(data) < length:
raise DecodeError("Data underrun while decoding")
- length = struct.unpack(">B", data[0])[0]
- if len(data) - 1 < length:
- raise DecodeError("Data underrun while decoding")
- return [data[1:length + 1], data[length + 1:]]
+ item = data[0:length]
+ data = data[length:]
- def _decode_item(self, data):
- if len(data) < 1:
- raise DecodeError("Data underrun while decoding")
- type_and_length_format = struct.unpack(">B", data[0])[0]
- item_type = type_and_length_format & self._ITEM_MASK
- length_format = type_and_length_format & self._ITEM_LENGTH_MASK
+ if item_type == _ITEM_DATA:
+ value = item
+ elif item_type == _ITEM_HASH:
+ value = _decode_hash(item)
+ elif item_type == _ITEM_LIST:
+ value = _decode_array(item)
+ elif item_type == _ITEM_NULL:
+ value = None
+ else:
+ raise DecodeError("Unknown item type in decode: %02x" % item_type)
- if item_type == self._ITEM_NULL:
- data = data[1:]
- else:
- if length_format == self._ITEM_LENGTH_8:
- if len(data) - 1 < 1:
- raise DecodeError("Data underrun while decoding")
- length = struct.unpack(">B", data[1])[0]
- data = data[2:]
- elif length_format == self._ITEM_LENGTH_16:
- if len(data) - 1 < 2:
- raise DecodeError("Data underrun while decoding")
- length = struct.unpack(">H", data[1:3])[0]
- data = data[3:]
- elif length_format == self._ITEM_LENGTH_32:
- if len(data) - 1 < 4:
- raise DecodeError("Data underrun while decoding")
- length = struct.unpack(">I", data[1:5])[0]
- data = data[5:]
- if len(data) < length:
- raise DecodeError("Data underrun while decoding")
- item = data[0:length]
- data = data[length:]
+ return (value, data)
- if item_type == self._ITEM_DATA:
- value = item
- elif item_type == self._ITEM_HASH:
- value = self._decode_hash(item)
- elif item_type == self._ITEM_LIST:
- value = self._decode_array(item)
- elif item_type == self._ITEM_NULL:
- value = None
- else:
- raise DecodeError("Unknown item type in decode: %02x" % item_type)
+def _decode_hash(data):
+ ret = {}
+ while len(data) > 0:
+ tag, data = _decode_tag(data)
+ value, data = _decode_item(data)
+ ret[tag] = value
+ return ret
- return (value, data)
-
- def _decode_hash(self, data):
- ret = {}
- while len(data) > 0:
- tag, data = self._decode_tag(data)
- value, data = self._decode_item(data)
- ret[tag] = value
- return ret
-
- def _decode_array(self, data):
- ret = []
- while len(data) > 0:
- value, data = self._decode_item(data)
- ret.append(value)
- return ret
+def _decode_array(data):
+ ret = []
+ while len(data) > 0:
+ value, data = _decode_item(data)
+ ret.append(value)
+ return ret
if __name__ == "__main__":
import doctest
Modified: experiments/graff-ccapi/python/ISC/CC/session.py
==============================================================================
--- experiments/graff-ccapi/python/ISC/CC/session.py (original)
+++ experiments/graff-ccapi/python/ISC/CC/session.py Mon Oct 12 15:39:24 2009
@@ -17,7 +17,7 @@
import socket
import struct
-from message import Message
+import message
class ProtocolError(Exception): pass
@@ -45,8 +45,7 @@
def sendmsg(self, msg):
if type(msg) == dict:
- m = Message()
- msg = m.to_wire(msg)
+ msg = message.to_wire(msg)
self._socket.setblocking(1)
self._socket.send(struct.pack("!I", len(msg)))
self._socket.send(msg)
@@ -54,8 +53,7 @@
def recvmsg(self, nonblock = True):
data = self._receive_full_buffer(nonblock)
if data:
- m = Message()
- return m.from_wire(data)
+ return message.from_wire(data)
return None
def _receive_full_buffer(self, nonblock):
@@ -110,7 +108,6 @@
})
def group_sendmsg(self, msg, group, instance = "*", to = "*"):
- m = Message()
self.sendmsg({
"type": "send",
"from": self._lname,
@@ -118,15 +115,14 @@
"group": group,
"instance": instance,
"seq": self._next_sequence(),
- "msg": m.to_wire(msg),
+ "msg": message.to_wire(msg),
})
def group_recvmsg(self, nonblock = True):
msg = self.recvmsg(nonblock)
if msg == None:
return None
- m = Message()
- data = m.from_wire(msg["msg"])
+ data = message.from_wire(msg["msg"])
return (data, msg)
if __name__ == "__main__":
Modified: experiments/graff-ccapi/python/test.py
==============================================================================
--- experiments/graff-ccapi/python/test.py (original)
+++ experiments/graff-ccapi/python/test.py Mon Oct 12 15:39:24 2009
@@ -1,16 +1,14 @@
import ISC
-
-m = ISC.CC.Message()
ss = { "list": [ 1, 2, 3 ],
"hash": { "hash1": 1, "hash2": 2 },
"none": None,
"string": "samplestring" }
-s = m.to_wire(ss)
+s = ISC.CC.message.to_wire(ss)
ISC.Util.hexdump(s)
-print m.from_wire(s)
+print ISC.CC.message.from_wire(s)
tcp = ISC.CC.Session()
print tcp.lname
More information about the bind10-changes
mailing list