diff options
author | Jérémy Zurcher <jeremy@asynk.ch> | 2012-04-13 21:16:12 +0200 |
---|---|---|
committer | Jérémy Zurcher <jeremy@asynk.ch> | 2012-04-13 21:16:12 +0200 |
commit | eeb9927c89d6d2425a74c33ff8773bceba39af1c (patch) | |
tree | e5e770fc041fa27b6e13a78dc9c3dc3f75c7c213 /frouter.py | |
parent | 99561b834dbd9d52b83aa7b0fb980431fa1aa056 (diff) | |
download | pyevenja-eeb9927c89d6d2425a74c33ff8773bceba39af1c.zip pyevenja-eeb9927c89d6d2425a74c33ff8773bceba39af1c.tar.gz |
Diffstat (limited to 'frouter.py')
-rw-r--r-- | frouter.py | 374 |
1 files changed, 187 insertions, 187 deletions
@@ -32,7 +32,7 @@ __all__ = ["Frouter"] from fdoor_file import Fdoor_file from fdoor_cout import Fdoor_cout from fprg_concat import Fdoor_concat - + from fport import Fport from fconfig import Fconfig from fevenboard import FevenBoard @@ -50,193 +50,193 @@ from returncodes import RET_NOTEXIST class Frouter(FportListHash): - def __init__(self): - FportListHash.__init__(self) - - def __str__(self): - return "\t"+FportListHash.__str__(self)+\ - "Frouter - (null)\n" - - def start(self,port,param): - """/** Starts import the config file ( or other stream), and sets the parentrouter. - If the port (evenDoor and evenBoard) need to send an evenData. */""" - ret = Fport.start(self,port,param) - if ret == RET_OK: - return self.createRoom() - return ret - - def getClassInfos(self,classInfo): - """/** Get the informations concerning the creation of a port (room, evenprg, etc...) */""" - ret = RET_OK - self.pushCurrent() - if self.gotoChildren() != RET_OK: - return RET_NOTEXIST - - def search(string): - if self.Find(string) == RET_OK: - return self.getContent() - return None - - classInfo['type'] = search(ES.XML_CLASS) - classInfo['conf'] = search(ES.XML_CONF) - classInfo['lib'] = search(ES.XML_LIB) - classInfo['debug'] = search(ES.XML_DEBUG) - - self.popCurrent() - return ret - - def getLinkInfos(self,linkInfo): - """/** Get the informations concerning the cration of a port (room, evenprg, etc...) */""" - ret = RET_OK - self.pushCurrent() - if self.gotoChildren() != RET_OK: - return RET_NOTEXIST - - def search(string): - if self.Find(string) == RET_OK: - return self.getContent() - return None - - linkInfo['source'] = search(ES.XML_LNKSOURCE) - linkInfo['type'] = search(ES.XML_LNKTYPE) - linkInfo['value'] = search(ES.XML_LNKVALUE) - linkInfo['fields'] = search(ES.XML_LNKFIELDS) - linkInfo['dest'] = search(ES.XML_LNKDEST) - - self.popCurrent() - return ret - - def createRoom(self): - """/** Create a room with a structure defined by the config or node in start method */""" - classInfos = { 'type':None,\ - 'conf':None,\ - 'lib':None,\ - 'debug':None} - - linkInfos = { 'source':None,\ - 'type':None,\ - 'value':None,\ - 'fields':None,\ - 'dest':None} - strH = FstringHash() - port = Fport - - # search for rooms, boards, doors and programms - def IMPORT_PORTS(A,B,CLASS): - if self.Find(A,False) == RET_OK: - while True: - self.pushCurrent() - # read informations - self.getClassInfos(classInfos) - # let's build and start this - # if both are None or strcasecmp - # TODO ugliest code in this library - if ((classInfos['type']==None and B==None) or \ - (B <> None and classInfos['type'] <> None\ - and (classInfos['type'].upper() == B.upper()))): - childRoom = CLASS() - if classInfos['conf'] <> None: - childRoom.start(self,classInfos['conf']) - else: - childRoom.start(self,self.current) - ptr = self.listHash.addOrGet(childRoom) - if ptr <> None: - ptr = None - return RET_PORTEXIST - self.popCurrent() - # search for a next one - if self.FindNext(A,False) != RET_OK: - break - - self.resetCurrent() - if self.gotoChildren() != RET_OK: - return RET_NOINFOS - # search and build - IMPORT_PORTS( ES.XML_ROOM,None,Frouter) - IMPORT_PORTS( ES.XML_ROOM,"ROOM",Frouter) - IMPORT_PORTS( ES.XML_BOARD,None,FevenBoard) - IMPORT_PORTS( ES.XML_BOARD,"BOARD",FevenBoard) - - IMPORT_PORTS( ES.XML_DOOR, "file", Fdoor_file) - IMPORT_PORTS( ES.XML_DOOR, "cout", Fdoor_cout) - IMPORT_PORTS( ES.XML_PRG, "concat", Fdoor_concat) - - # seach for <envenja_link>, if dosen't exists, create an evendata and send it - if self.Find(ES.XML_LNK, False) != RET_OK: - return RET_OK - while True: - self.pushCurrent() - self.getLinkInfos(linkInfos) - if linkInfos['source'] <> None: - strH.setString(linkInfos['source']) - port = self.listHash.Search(strH) - # if this source has been built, send a ACT_SYS_ADDDEST msg - if port <> None: - data = self.getFreeEvenData() - data.setData( ES.XML_LNKTYPE, linkInfos['type']) - data.setData( ES.XML_LNKVALUE, linkInfos['value']) - data.setData( ES.XML_LNKFIELDS, linkInfos['fields']) - data.setData( ES.XML_LNKDEST, linkInfos['dest']) - - data.definePortAction( ES.ACT_SYS_ADDDEST, linkInfos['source']) - self.sendEvenDataSys(data,port) - self.popCurrent() - if self.FindNext( ES.XML_LNK,False) != RET_OK: - break - return RET_OK - - def receive_evenData(self,evenData): - """/** Receive the evenData to be routed to the right router or port. */""" - port = self.listHash.Search(evenData.getCurrentDestination().getPort()) - if port <> None: - #// ... then send to it the evenData - #// Now it send the evenData by sndMsg, but normally this will change after the realeas of V3.0 - #// sendEvenData( evenData, port); - #// return RET_OK; - #// ...this will work well too, but it is another principle - return port.justDoIt(evenData) - evenData.definePortAction(ES.ACT_ERROR) - return RET_OK - - def justDoIt(self,evenData): - """/** Methods called by Fstarter */""" - tmp = evenData.getCurrentDestination().getAction() - if tmp.equals(gvActionEnd) or tmp.equals(gvActionError): - self.setFreeEvenData(evenData) - return RET_OK - return Fport.justDoIt(self,evenData) - - def end(self): - """/** Deploy the end() until the port. */""" - for I in range(self.listHash.getCount()): - self.listHash.get(I).end() - return Fconfig.endXml(self) + def __init__(self): + FportListHash.__init__(self) + + def __str__(self): + return "\t"+FportListHash.__str__(self)+\ + "Frouter - (null)\n" + + def start(self,port,param): + """/** Starts import the config file ( or other stream), and sets the parentrouter. + If the port (evenDoor and evenBoard) need to send an evenData. */""" + ret = Fport.start(self,port,param) + if ret == RET_OK: + return self.createRoom() + return ret + + def getClassInfos(self,classInfo): + """/** Get the informations concerning the creation of a port (room, evenprg, etc...) */""" + ret = RET_OK + self.pushCurrent() + if self.gotoChildren() != RET_OK: + return RET_NOTEXIST + + def search(string): + if self.Find(string) == RET_OK: + return self.getContent() + return None + + classInfo['type'] = search(ES.XML_CLASS) + classInfo['conf'] = search(ES.XML_CONF) + classInfo['lib'] = search(ES.XML_LIB) + classInfo['debug'] = search(ES.XML_DEBUG) + + self.popCurrent() + return ret + + def getLinkInfos(self,linkInfo): + """/** Get the informations concerning the cration of a port (room, evenprg, etc...) */""" + ret = RET_OK + self.pushCurrent() + if self.gotoChildren() != RET_OK: + return RET_NOTEXIST + + def search(string): + if self.Find(string) == RET_OK: + return self.getContent() + return None + + linkInfo['source'] = search(ES.XML_LNKSOURCE) + linkInfo['type'] = search(ES.XML_LNKTYPE) + linkInfo['value'] = search(ES.XML_LNKVALUE) + linkInfo['fields'] = search(ES.XML_LNKFIELDS) + linkInfo['dest'] = search(ES.XML_LNKDEST) + + self.popCurrent() + return ret + + def createRoom(self): + """/** Create a room with a structure defined by the config or node in start method */""" + classInfos = { 'type':None,\ + 'conf':None,\ + 'lib':None,\ + 'debug':None} + + linkInfos = { 'source':None,\ + 'type':None,\ + 'value':None,\ + 'fields':None,\ + 'dest':None} + strH = FstringHash() + port = Fport + + # search for rooms, boards, doors and programms + def IMPORT_PORTS(A,B,CLASS): + if self.Find(A,False) == RET_OK: + while True: + self.pushCurrent() + # read informations + self.getClassInfos(classInfos) + # let's build and start this + # if both are None or strcasecmp + # TODO ugliest code in this library + if ((classInfos['type']==None and B==None) or \ + (B <> None and classInfos['type'] <> None\ + and (classInfos['type'].upper() == B.upper()))): + childRoom = CLASS() + if classInfos['conf'] <> None: + childRoom.start(self,classInfos['conf']) + else: + childRoom.start(self,self.current) + ptr = self.listHash.addOrGet(childRoom) + if ptr <> None: + ptr = None + return RET_PORTEXIST + self.popCurrent() + # search for a next one + if self.FindNext(A,False) != RET_OK: + break + + self.resetCurrent() + if self.gotoChildren() != RET_OK: + return RET_NOINFOS + # search and build + IMPORT_PORTS( ES.XML_ROOM,None,Frouter) + IMPORT_PORTS( ES.XML_ROOM,"ROOM",Frouter) + IMPORT_PORTS( ES.XML_BOARD,None,FevenBoard) + IMPORT_PORTS( ES.XML_BOARD,"BOARD",FevenBoard) + + IMPORT_PORTS( ES.XML_DOOR, "file", Fdoor_file) + IMPORT_PORTS( ES.XML_DOOR, "cout", Fdoor_cout) + IMPORT_PORTS( ES.XML_PRG, "concat", Fdoor_concat) + + # seach for <envenja_link>, if dosen't exists, create an evendata and send it + if self.Find(ES.XML_LNK, False) != RET_OK: + return RET_OK + while True: + self.pushCurrent() + self.getLinkInfos(linkInfos) + if linkInfos['source'] <> None: + strH.setString(linkInfos['source']) + port = self.listHash.Search(strH) + # if this source has been built, send a ACT_SYS_ADDDEST msg + if port <> None: + data = self.getFreeEvenData() + data.setData( ES.XML_LNKTYPE, linkInfos['type']) + data.setData( ES.XML_LNKVALUE, linkInfos['value']) + data.setData( ES.XML_LNKFIELDS, linkInfos['fields']) + data.setData( ES.XML_LNKDEST, linkInfos['dest']) + + data.definePortAction( ES.ACT_SYS_ADDDEST, linkInfos['source']) + self.sendEvenDataSys(data,port) + self.popCurrent() + if self.FindNext( ES.XML_LNK,False) != RET_OK: + break + return RET_OK + + def receive_evenData(self,evenData): + """/** Receive the evenData to be routed to the right router or port. */""" + port = self.listHash.Search(evenData.getCurrentDestination().getPort()) + if port <> None: + #// ... then send to it the evenData + #// Now it send the evenData by sndMsg, but normally this will change after the realeas of V3.0 + #// sendEvenData( evenData, port); + #// return RET_OK; + #// ...this will work well too, but it is another principle + return port.justDoIt(evenData) + evenData.definePortAction(ES.ACT_ERROR) + return RET_OK + + def justDoIt(self,evenData): + """/** Methods called by Fstarter */""" + tmp = evenData.getCurrentDestination().getAction() + if tmp.equals(gvActionEnd) or tmp.equals(gvActionError): + self.setFreeEvenData(evenData) + return RET_OK + return Fport.justDoIt(self,evenData) + + def end(self): + """/** Deploy the end() until the port. */""" + for I in range(self.listHash.getCount()): + self.listHash.get(I).end() + return Fconfig.endXml(self) if __name__ == '__main__': - import unittest - - router1 = Frouter() - router2 = Frouter() - - class FrouterTestCase(unittest.TestCase): - - def test1Name(self): - self.assertEquals(router1.start( None, "testezlog.xml"),RET_OK) - strH = FstringHash() - strH.setString( "TEST00") - - #// TEST Name from file - self.assertEquals(router1.equals( strH),True) - - #// TEST from node config - conf = Fconfig() - conf.startXml( "testezlog.xml") - router2.start( None, conf.getCurrent()) - self.assertEquals(router2.equals( strH),True) - router1.end() - router2.end() - - - unittest.main() + import unittest + + router1 = Frouter() + router2 = Frouter() + + class FrouterTestCase(unittest.TestCase): + + def test1Name(self): + self.assertEquals(router1.start( None, "testezlog.xml"),RET_OK) + strH = FstringHash() + strH.setString( "TEST00") + + #// TEST Name from file + self.assertEquals(router1.equals( strH),True) + + #// TEST from node config + conf = Fconfig() + conf.startXml( "testezlog.xml") + router2.start( None, conf.getCurrent()) + self.assertEquals(router2.equals( strH),True) + router1.end() + router2.end() + + + unittest.main() |