[commit] r97 - in sofaswitch/trunk/callflow: src tests
Author: derek Date: Mon Sep 18 01:09:55 2006 New Revision: 97 Added: sofaswitch/trunk/callflow/tests/ sofaswitch/trunk/callflow/tests/timetest.src Modified: sofaswitch/trunk/callflow/src/eventer.cpp sofaswitch/trunk/callflow/src/shapelist.cpp Log: Add standard test directory, to illustrate how it works. Add code to handle (in a generic fashion) different network messages. Modified: sofaswitch/trunk/callflow/src/eventer.cpp ============================================================================== --- sofaswitch/trunk/callflow/src/eventer.cpp (original) +++ sofaswitch/trunk/callflow/src/eventer.cpp Mon Sep 18 01:09:55 2006 @@ -30,6 +30,9 @@ displayData[displayData.size()] = InformationSection(wxT("Event sought"), wxT("incoming")); + + displayData[displayData.size()] = + InformationSection(wxT("Competing timer label"), wxT("")); } void DndShapeEventer::Draw(wxDC& dc) @@ -118,6 +121,9 @@ file.AddLine(wxString::Format(" \"Event\" : ")); file.AddLine(wxString::Format(" \"%s\", ", displayData[1].data.c_str())); + + file.AddLine(wxString::Format(" \"Competing timer label\" : ")); + file.AddLine(wxString::Format(" \"%s\", ", displayData[2].data.c_str())); file.AddLine(wxString::Format(" },")); Modified: sofaswitch/trunk/callflow/src/shapelist.cpp ============================================================================== --- sofaswitch/trunk/callflow/src/shapelist.cpp (original) +++ sofaswitch/trunk/callflow/src/shapelist.cpp Mon Sep 18 01:09:55 2006 @@ -287,7 +287,6 @@ file.AddLine(" \"\"\" The class which holds all the information on how to manage each entity"); file.AddLine(" on the flow chart, how to connect, and does the requisite calls to twisted "); file.AddLine(" "); - file.AddLine(" There are two types of events. A) name,data or B)name,handler "); file.AddLine(" \"\"\" "); file.AddLine(" def __init__(self): "); file.AddLine(" self.graphSet = False "); @@ -296,6 +295,10 @@ file.AddLine(" self.generatedEvents = {} "); file.AddLine(" self.pendingEvents = {} "); file.AddLine(" self.currentHandlers= {} "); + file.AddLine(" self.knownNetworkMessages= [] "); + file.AddLine(" self.knownNetworkMessages.append(\"REQUESTNEWID\") "); + file.AddLine(" self.knownNetworkMessages.append(\"DTMF\") "); +// file.AddLine(" self.knownNetworkMessages.append(\"\") "); char c= 34; wxString tString = wxString::Format(" self.quote = \"\\%c\"", c); file.AddLine(tString.c_str()); @@ -343,9 +346,14 @@ file.AddLine(" self.generatedEvents.pop(killEvent) "); file.AddLine(" "); file.AddLine(" def processQueue(self, data): "); - file.AddLine(" \"\"\"This method is called after an event has been detected"); + file.AddLine(" \"\"\"This method is called after an event has been detected "); file.AddLine(" as happening. It compares the generated events queue with the registered"); file.AddLine(" handlers, and dispatches execution to the relevant handler "); + file.AddLine(" "); + file.AddLine(" Then, this method empties the generated events queue. These are events "); + file.AddLine(" for which there was no corresponding handler. We cannot have these "); + file.AddLine(" hanging around. It would give weird output if they were processed at "); + file.AddLine(" some later time when the program adds a handler for this case "); file.AddLine(" \"\"\" "); file.AddLine(" #print \"processQueue\" "); file.AddLine(" #print \"current handlers \", self.currentHandlers "); @@ -354,35 +362,44 @@ file.AddLine(" keys = self.generatedEvents.keys() "); file.AddLine(" for k in range(len(keys)): "); file.AddLine(" if self.currentHandlers.has_key(keys[k]): "); - file.AddLine(" eventerNode = self.currentHandlers[keys[k]] "); - file.AddLine(" #print \"eventer node is \", eventerNode "); - file.AddLine(" self.DoWork(self.data[eventerNode][\"Event Handler\"])"); - file.AddLine(" self.generatedEvents.pop(keys[k]) "); - file.AddLine(" "); - file.AddLine(" def transferEventToGenerated(self, data): "); - file.AddLine(" \"\"\"An event has happened, and now we need to act on it. Consequently, "); - file.AddLine(" we take it out of the pending list and put it in the process now list"); - file.AddLine(" \"\"\" "); - file.AddLine(" if self.pendingEvents.has_key(data): "); - file.AddLine(" self.generatedEvents[data] = self.pendingEvents.pop(data)"); - file.AddLine(" "); - file.AddLine(" def newRemoteNodeToUse(self, eventName, newNode):"); - file.AddLine(" \"\"\"This node has received a message advising us that a remote"); - file.AddLine(" sofa switch entity has created a node for us to use. This method"); - file.AddLine(" has to transfer the pending event to the generated event queue "); - file.AddLine(" and get it activated for processing "); + file.AddLine(" eventNode = self.currentHandlers[keys[k]] "); + file.AddLine(" eventData = self.generatedEvents.pop(keys[k]) "); + file.AddLine(" cTimer = self.data[eventNode][\"Competing timer label\"]"); + file.AddLine(" self.DeleteThisEvent(cTimer) "); + file.AddLine(" handler = self.data[eventNode][\"Event Handler\"]"); + file.AddLine(" a,b,c = handler "); + file.AddLine(" self.data[a][\"Event Data\"] = eventData "); + file.AddLine(" self.DoWork(handler) "); + file.AddLine(" self.generatedEvents.clear() "); + file.AddLine(" "); + file.AddLine(" def networkEventData(self, eName, data): "); + file.AddLine(" \"\"\"This node has received a message from some remote node. The "); + file.AddLine(" eventName is a concatanation of the sender name and the event. "); + file.AddLine(" Thus, an example eventName would be voipREQUESTNEWID. "); + file.AddLine(" The data is additional information on this event. In this case, "); + file.AddLine(" the date field could be voip34 (the ID of the node node on voip)"); + file.AddLine(" A second possible set of parameters would be voip23DTMF and 9 "); + file.AddLine(" "); + file.AddLine(" This method places the event on the generated events list, and "); + file.AddLine(" places the data there also. "); + file.AddLine(" Then, this methods asks for processing to resume "); file.AddLine(" \"\"\" "); - file.AddLine(" self.transferEventToGenerated(eventName) "); - file.AddLine(" reactor.callLater(0, self.processQueue, newNode) "); + file.AddLine(" self.generatedEvents[eName] = data "); + file.AddLine(" reactor.callLater(0, self.processQueue, 0) "); file.AddLine(" "); file.AddLine(" def timerObjectExpired(self, data): "); - file.AddLine(" \"\"\"Some timer has expired. Move it from the pending list and place "); + file.AddLine(" \"\"\"Some timer has expired. Move it from the pending list and place "); file.AddLine(" it in the active list. Then activate processing so that things move "); - file.AddLine(" along"); + file.AddLine(" along "); + file.AddLine(" "); + file.AddLine(" Note that when the timer object was initiated, an entry was put in "); + file.AddLine(" self.pendingEvent list statiing this event name. If the timer sas "); + file.AddLine(" deleted (after starting it) the corresponding event in the pending "); + file.AddLine(" list will be absent "); file.AddLine(" \"\"\" "); - file.AddLine(" #print \"timer object has expired \", data "); - file.AddLine(" self.transferEventToGenerated(data) "); - file.AddLine(" reactor.callLater(0, self.processQueue, 0) "); + file.AddLine(" if self.pendingEvents.has_key(data): "); + file.AddLine(" self.generatedEvents[data] = self.pendingEvents.pop(data)"); + file.AddLine(" reactor.callLater(0, self.processQueue, 0) "); file.AddLine(" "); file.AddLine(" def startWorkNow(self, notUsed): "); file.AddLine(" \"\"\" Initiate processing on the flow chart"); @@ -400,6 +417,7 @@ file.AddLine(" self.keepGoing = True "); file.AddLine(" "); file.AddLine(" while self.keepGoing: "); + file.AddLine(" self.currentNode=a "); file.AddLine(" command = \"self.\" + str(c) + \"(\" + str(sTuple) + \")\""); file.AddLine(" sTuple = eval(command) "); file.AddLine(" if sTuple == None: "); @@ -459,12 +477,16 @@ file.AddLine(" \"\"\"Handle an ordinary message from the remote sofa server. Break the message up"); file.AddLine(" turn it into a MyEvent message, and added to the right "); file.AddLine(" queue. On doing this, spark an event to drive queue processing. "); + file.AddLine(" Note that this method can only deal with certain predefined "); + file.AddLine(" types of messages "); file.AddLine(" \"\"\" "); - file.AddLine(" print \"Received \", thisMessage "); - file.AddLine(" if (thisMessage.find(\"REQUESTNEWID\") >=0):"); - file.AddLine(" pMsg = str(thisMessage).split(\" \") "); - file.AddLine(" eName = pMsg(":","") "); - file.AddLine(" + file.AddLine(" if len(thisMessage) > 2: "); + file.AddLine(" print \"Received \", thisMessage "); + file.AddLine(" for msg in self.knownNetworkMessages: "); + file.AddLine(" if thisMessage.find(msg) >= 0: "); + file.AddLine(" pMsg = str(thisMessage).split(\" \") "); + file.AddLine(" eName = pMsg[0].replace(\":\",\"\") "); + file.AddLine(" self.networkEventData(eName, pMsg[1]) "); file.AddLine(" "); file.AddLine(" "); for (int i = 0; i < DndShape::KnownShapes; i++) { Added: sofaswitch/trunk/callflow/tests/timetest.src ============================================================================== --- (empty file) +++ sofaswitch/trunk/callflow/tests/timetest.src Mon Sep 18 01:09:55 2006 @@ -0,0 +1 @@ +12<B>123<B>122<B> extra <special>Tool Tip<ms>Timer<ms><special>Timer period (seconds)<ms>1<ms><special>Timer label<ms>timer1<ms><special> <B><Shape>9<B>150<B>272<B>151,272,150,344,232,354<special>Tool Tip<ms>Join blocks shape<ms><special> <B><Shape>10<B>126<B>221<B> extra <special>Tool Tip<ms>Python<ms><special>Python Code<ms>print \"t1 \", time.asctime(), \" data is \", self.data[self.currentNode][\"Event Data\"]<ms><special> <B><Shape>12<B>206<B>198<B> extra <special>Tool Tip<ms>Timer<ms><special>Timer period (seconds)<ms>2<ms><special>Timer label<ms>timer2<ms><special> <B><Shape>9<B>187<B>196<B>187,196,230,197<special>Tool Tip<ms>Join blocks shape<ms><special> <B><Shape>14<B>137<B>173<B> extra <special>Tool Tip<ms>Eventer<ms><special>Event sought<ms>timer1<ms><special>Competing timer label<ms><ms><special> <B><Shape>10<B>123<B>74<B> extra <special>Tool Tip<ms>Python<ms><special>Python Code<ms>print \"Start \", time.asctime()<ms><special> <B><Shape>1<B>123<B>26<B> extra <special>Tool Tip<ms>Start Processing<ms><special> <B><Shape>2<B>207<B>352<B> extra <special>Tool Tip<ms>End Processing<ms><special> <B><Shape>10<B>207<B>305<B> extra <special>Tool Tip<ms>Python<ms><special>Python Code<ms>print \"t2 \", time.asctime(), \" data is \", self.data[self.currentNode][\"Event Data\"]<ms><special> <B><Shape>14<B>218<B>251<B> extra <special>Tool Tip<ms>Eventer<ms><special>Event sought<ms>timer2<ms><special>Competing timer label<ms><ms><special> <B><Shape>
participants (1)
-
SofaSWITCH SVN