[svn] commit: r68 - in /experiments/graff-ccapi/python: ISC/CC/message.py ISC/CC/session.py test.py
BIND 10 source code commits
bind10-changes at lists.isc.org
Wed Oct 7 15:59:44 UTC 2009
Author: mgraff
Date: Wed Oct 7 15:59:44 2009
New Revision: 68
Log:
send/recv messages works. Need to implement non-blocking I/O still
Modified:
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/message.py
==============================================================================
--- experiments/graff-ccapi/python/ISC/CC/message.py (original)
+++ experiments/graff-ccapi/python/ISC/CC/message.py Wed Oct 7 15:59:44 2009
@@ -174,7 +174,7 @@
else:
raise DecodeError("Unknown item type in decode: %02x" % item_type)
- return [value, data]
+ return (value, data)
def _decode_hash(self, data):
ret = {}
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 Wed Oct 7 15:59:44 2009
@@ -15,18 +15,20 @@
import sys
import socket
+import struct
+
+from message import Message
class ProtocolError(Exception): pass
class Session:
-
def __init__(self):
self._socket = None
self._lname = None
self._recvbuffer = ""
self._recvlength = None
self._sendbuffer = ""
- self._sequence = "a"
+ self._sequence = 1
self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self._socket.connect(tuple(['127.0.0.1', 9912]))
@@ -41,10 +43,81 @@
def lname(self):
return self._lname
- def sendmsg(self, msg): pass
+ def sendmsg(self, msg):
+ if type(msg) == dict:
+ m = Message()
+ msg = m.to_wire(msg)
+ self._socket.send(struct.pack("!I", len(msg)))
+ self._socket.send(msg)
def recvmsg(self, nonblock = True):
- return { "lname": "lname_goes_here" }
+ data = self._receive_full_buffer(nonblock)
+ if data:
+ m = Message()
+ return m.from_wire(data)
+ return None
+
+ def _receive_full_buffer(self, nonblock):
+ if self._recvlength == None:
+ length = 4
+ length -= len(self._recvbuffer)
+ print "Reading length bytes: Expecting %d bytes" % length
+ data = self._socket.recv(length)
+ print len(data)
+ # error checking XXXMLG
+ self._recvbuffer += data
+ if len(self._recvbuffer) < 4:
+ return None
+ self._recvlength = struct.unpack('>I', self._recvbuffer)[0]
+ self._recvbuffer = ""
+ length = self._recvlength - len(self._recvbuffer)
+ while (length > 0):
+ data = self._socket.recv(length)
+ self._recvbuffer += data
+ length -= len(data)
+ data = self._recvbuffer
+ self._recvbuffer = ""
+ self._recvlength = None
+ return (data)
+
+ def _next_sequence(self):
+ self._sequence += 1
+ return self._sequence
+
+ def group_subscribe(group, instance = "*", subtype = "normal"):
+ self.sendmsg({
+ "type": "subscribe",
+ "group": group,
+ "instance": instance,
+ "subtype": subtype,
+ })
+
+ def group_unsubscribe(group, instance = "*"):
+ self.sendmsg({
+ "type": "unsubscribe",
+ "group": group,
+ "instance": instance,
+ })
+
+ def group_sendmsg(msg, group, instance = "*", to = "*"):
+ m = Message()
+ self.sendmsg({
+ "type": "send",
+ "from": self._lname,
+ "to": to,
+ "group": group,
+ "instance": instance,
+ "seq": self._next_sequence(),
+ "msg": m.to_wire(msg),
+ })
+
+ def group_recvmsg(nonblock = True):
+ msg = recvmsg(nonblock)
+ if msg == None:
+ return None
+ m = Message()
+ data = m.from_wire(msg["msg"])
+ return (data, msg)
if __name__ == "__main__":
import doctest
Modified: experiments/graff-ccapi/python/test.py
==============================================================================
--- experiments/graff-ccapi/python/test.py (original)
+++ experiments/graff-ccapi/python/test.py Wed Oct 7 15:59:44 2009
@@ -1,16 +1,16 @@
import ISC
-cc = ISC.CC.Message()
+m = ISC.CC.Message()
ss = { "list": [ 1, 2, 3 ],
"hash": { "hash1": 1, "hash2": 2 },
"none": None,
"string": "samplestring" }
-s = cc.to_wire(ss)
+
+s = m.to_wire(ss)
ISC.Util.hexdump(s)
-print(ss)
-print cc.from_wire(s)
+print m.from_wire(s)
tcp = ISC.CC.Session()
print tcp.lname
More information about the bind10-changes
mailing list