Browse Source

wantOtpServer

Dave Schuyler 21 years ago
parent
commit
cc5c890de9
1 changed files with 135 additions and 9 deletions
  1. 135 9
      direct/src/distributed/ClientRepository.py

+ 135 - 9
direct/src/distributed/ClientRepository.py

@@ -48,6 +48,13 @@ class ClientRepository(ConnectionRepository.ConnectionRepository):
         self.heartbeatInterval = base.config.GetDouble('heartbeat-interval', 10)
         self.heartbeatInterval = base.config.GetDouble('heartbeat-interval', 10)
         self.heartbeatStarted = 0
         self.heartbeatStarted = 0
         self.lastHeartbeat = 0
         self.lastHeartbeat = 0
+        if wantOtpServer:
+            ##
+            ## Top level Interest Manager
+            ##
+            self.__interest_id_assign = 1
+            self.__interesthash = {}
+        
     
     
     def abruptCleanup(self):
     def abruptCleanup(self):
         """
         """
@@ -167,8 +174,11 @@ class ClientRepository(ConnectionRepository.ConnectionRepository):
         dclass.startGenerate()
         dclass.startGenerate()
         # If the class is a neverDisable class (which implies uberzone) we
         # If the class is a neverDisable class (which implies uberzone) we
         # should go ahead and generate it even though we are in the quiet zone
         # should go ahead and generate it even though we are in the quiet zone
-        if dclass.getClassDef().neverDisable:
-            # Create a new distributed object, and put it in the dictionary
+        if not wantOtpServer:
+            if dclass.getClassDef().neverDisable:
+                # Create a new distributed object, and put it in the dictionary
+                distObj = self.generateWithRequiredFields(dclass, doId, di)
+        else:
             distObj = self.generateWithRequiredFields(dclass, doId, di)
             distObj = self.generateWithRequiredFields(dclass, doId, di)
         dclass.stopGenerate()
         dclass.stopGenerate()
 
 
@@ -183,8 +193,11 @@ class ClientRepository(ConnectionRepository.ConnectionRepository):
         # If the class is a neverDisable class (which implies uberzone) we
         # If the class is a neverDisable class (which implies uberzone) we
         # should go ahead and generate it even though we are in the quiet zone
         # should go ahead and generate it even though we are in the quiet zone
         dclass.startGenerate()
         dclass.startGenerate()
-        if dclass.getClassDef().neverDisable:
-            # Create a new distributed object, and put it in the dictionary
+        if not wantOtpServer:
+            if dclass.getClassDef().neverDisable:
+                # Create a new distributed object, and put it in the dictionary
+                distObj = self.generateWithRequiredOtherFields(dclass, doId, di)
+        else:
             distObj = self.generateWithRequiredOtherFields(dclass, doId, di)
             distObj = self.generateWithRequiredOtherFields(dclass, doId, di)
         dclass.stopGenerate()
         dclass.stopGenerate()
 
 
@@ -225,6 +238,8 @@ class ClientRepository(ConnectionRepository.ConnectionRepository):
             distObj.generate()
             distObj.generate()
             distObj.updateRequiredFields(dclass, di)
             distObj.updateRequiredFields(dclass, di)
             # updateRequiredFields calls announceGenerate
             # updateRequiredFields calls announceGenerate
+            if wantOtpServer:
+                print "New DO:%s, dclass:%s"%(doId, dclass.getName())
         return distObj
         return distObj
 
 
     def generateGlobalObject(self , doId, dcname):
     def generateGlobalObject(self , doId, dcname):
@@ -247,7 +262,7 @@ class ClientRepository(ConnectionRepository.ConnectionRepository):
         distObj.generateInit()  # Only called when constructed
         distObj.generateInit()  # Only called when constructed
         distObj.generate()
         distObj.generate()
         # updateRequiredFields calls announceGenerate
         # updateRequiredFields calls announceGenerate
-        return  distObj       
+        return  distObj
 
 
     def generateWithRequiredOtherFields(self, dclass, doId, di):
     def generateWithRequiredOtherFields(self, dclass, doId, di):
         if self.doId2do.has_key(doId):
         if self.doId2do.has_key(doId):
@@ -336,19 +351,19 @@ class ClientRepository(ConnectionRepository.ConnectionRepository):
         This is not a distributed message and does not delete the
         This is not a distributed message and does not delete the
         object on the server or on any other client.
         object on the server or on any other client.
         """
         """
-        # If it is in the dictionary, remove it.
         if self.doId2do.has_key(doId):
         if self.doId2do.has_key(doId):
+            # If it is in the dictionary, remove it.
             obj = self.doId2do[doId]
             obj = self.doId2do[doId]
             # Remove it from the dictionary
             # Remove it from the dictionary
             del(self.doId2do[doId])
             del(self.doId2do[doId])
             # Disable, announce, and delete the object itself...
             # Disable, announce, and delete the object itself...
             # unless delayDelete is on...
             # unless delayDelete is on...
             obj.deleteOrDelay()
             obj.deleteOrDelay()
-        # If it is in the cache, remove it.
         elif self.cache.contains(doId):
         elif self.cache.contains(doId):
+            # If it is in the cache, remove it.
             self.cache.delete(doId)
             self.cache.delete(doId)
-        # Otherwise, ignore it
         else:
         else:
+            # Otherwise, ignore it
             ClientRepository.notify.warning(
             ClientRepository.notify.warning(
                 "Asked to delete non-existent DistObj " + str(doId))
                 "Asked to delete non-existent DistObj " + str(doId))
 
 
@@ -407,7 +422,6 @@ class ClientRepository(ConnectionRepository.ConnectionRepository):
         # Got a system message from the server.
         # Got a system message from the server.
         message = di.getString()
         message = di.getString()
         self.notify.info('Message from server: %s' % (message))
         self.notify.info('Message from server: %s' % (message))
-
         return message
         return message
 
 
     def handleUnexpectedMsgType(self, msgType, di):
     def handleUnexpectedMsgType(self, msgType, di):
@@ -427,6 +441,12 @@ class ClientRepository(ConnectionRepository.ConnectionRepository):
             self.handleServerHeartbeat(di)
             self.handleServerHeartbeat(di)
         elif msgType == CLIENT_SYSTEM_MESSAGE:
         elif msgType == CLIENT_SYSTEM_MESSAGE:
             self.handleSystemMessage(di)
             self.handleSystemMessage(di)
+        elif wantOtpServer and msgType == CLIENT_CREATE_OBJECT_REQUIRED:
+            self.handleGenerateWithRequired(di)
+        elif wantOtpServer and dmsgType == CLIENT_CREATE_OBJECT_REQUIRED_OTHER:
+            self.handleGenerateWithRequiredOther(di)
+        elif wantOtpServer and msgType == CLIENT_DONE_SET_ZONE_RESP:
+            self.handleSetZoneDone()
         else:
         else:
             currentLoginState = self.loginFSM.getCurrentState()
             currentLoginState = self.loginFSM.getCurrentState()
             if currentLoginState:
             if currentLoginState:
@@ -492,6 +512,112 @@ class ClientRepository(ConnectionRepository.ConnectionRepository):
         # If we're processing a lot of datagrams within one frame, we
         # If we're processing a lot of datagrams within one frame, we
         # may forget to send heartbeats.  Keep them coming!
         # may forget to send heartbeats.  Keep them coming!
         self.considerHeartbeat()
         self.considerHeartbeat()
+      
+    if wantOtpServer:
+        ##
+        ##
+        ## interest managment 
+        ##
+        ##
+        def InterestAdd(self,  parentId, zoneId, Description):        
+            """
+            Part of the new otp-server code.
+            """
+            self.__interest_id_assign += 1
+            self.__interesthash[self.__interest_id_assign] = Description
+            contextId = self.__interest_id_assign;
+            self.__sendAddInterest(contextId, parentId, zoneId)
+            self.DumpInterests()
+            return contextId;
+            
+        def InterestRemove(self,  contextId):        
+            """
+            Part of the new otp-server code.
+            """
+            answer = 0;
+            if  self.__interesthash.has_key(contextId):
+                self.__sendRemoveInterest(contextId)
+                del self.__interesthash[contextId]
+                answer = 1        
+                        
+            self.DumpInterests()            
+            return answer
+
+
+        def InterestAlter(self, contextId, parentId, zoneId, Description):        
+            """
+            Part of the new otp-server code.        
+                Removes old and adds new.. 
+            """
+            answer = 0
+            if  self.__interesthash.has_key(contextId):
+                self.__interesthash[contextId] = Description
+                self.__sendAlterInterest(contextId, parentId, zoneId)
+                answer = 1
+                
+            self.DumpInterests()            
+            return answer
+            
+        def DumpInterests(self):
+            """
+            Part of the new otp-server code.        
+            """
+            print "*********************** Interest Sets **************"
+            for i in self.__interesthash.keys():
+                 print "Interest ID:%s, Description=%s"%(i,self.__interesthash[i])
+            print "****************************************************"
+
+        
+        def __sendAddInterest(self, contextId, parentId, zoneId):
+            """
+            Part of the new otp-server code.
+
+            contextId is a client-side created number that refers to
+                    a set of interests.  The same contextId number doesn't
+                    necessarily have any relationship to the same contextId
+                    on another client.
+            """
+            datagram = PyDatagram()
+            # Add message type
+            datagram.addUint16(CLIENT_ADD_INTEREST)
+            datagram.addUint16(contextId)
+            datagram.addUint32(parentId)
+            datagram.addUint32(zoneId)
+            self.send(datagram)
+
+        def __sendAlterInterest(self, contextId, parentId, zoneId):
+            """
+            Part of the new otp-server code.
+
+            contextId is a client-side created number that refers to
+                    a set of interests.  The same contextId number doesn't
+                    necessarily have any relationship to the same contextId
+                    on another client.
+            """
+            datagram = PyDatagram()
+            # Add message type
+            datagram.addUint16(CLIENT_ALTER_INTEREST)
+            datagram.addUint16(contextId)
+            datagram.addUint32(parentId)
+            datagram.addUint32(zoneId)
+            self.send(datagram)
+
+        def __sendRemoveInterest(self, contextId):
+            """
+            Part of the new otp-server code.
+
+            contextId is a client-side created number that refers to
+                    a set of interests.  The same contextId number doesn't
+                    necessarily have any relationship to the same contextId
+                    on another client.
+            """
+            datagram = PyDatagram()
+            # Add message type
+            datagram.addUint16(CLIENT_REMOVE_INTEREST)
+            datagram.addUint16(contextId)
+            self.send(datagram)
+
+
 
 
     def sendHeartbeat(self):
     def sendHeartbeat(self):
         datagram = PyDatagram()
         datagram = PyDatagram()