[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