102 lines
3.2 KiB
Python
102 lines
3.2 KiB
Python
"""ServerRepository module: contains the ServerRepository class"""
|
|
|
|
from PandaModules import *
|
|
from TaskManagerGlobal import *
|
|
from MsgTypes import *
|
|
import Task
|
|
import DirectNotifyGlobal
|
|
|
|
class ServerRepository:
|
|
|
|
def __init__(self, tcpPort, udpPort):
|
|
self.qcm = QueuedConnectionManager()
|
|
self.qcl = QueuedConnectionListener(self.qcm, 0)
|
|
self.qcr = QueuedConnectionReader(self.qcm, 0)
|
|
self.cw = ConnectionWriter(self.qcm,0)
|
|
self.tcpRendezvous = self.qcm.openTCPServerRendezvous(tcpPort, 10)
|
|
print self.tcpRendezvous
|
|
self.qcl.addConnection(self.tcpRendezvous)
|
|
self.startListenerPollTask()
|
|
self.startReaderPollTask()
|
|
self.startResetPollTask()
|
|
return None
|
|
|
|
def startListenerPollTask(self):
|
|
taskMgr.add(self.listenerPoll, "serverListenerPollTask")
|
|
return None
|
|
|
|
def listenerPoll(self, task):
|
|
if self.qcl.newConnectionAvailable():
|
|
print "New connection is available"
|
|
rendezvous = PointerToConnection()
|
|
netAddress = NetAddress()
|
|
newConnection = PointerToConnection()
|
|
retVal = self.qcl.getNewConnection(rendezvous, netAddress,
|
|
newConnection)
|
|
if retVal:
|
|
# Crazy dereferencing
|
|
newConnection=newConnection.p()
|
|
self.qcr.addConnection(newConnection)
|
|
print "Got a connection!"
|
|
self.lastConnection = newConnection
|
|
else:
|
|
ServerRepository.notify.warning(
|
|
"getNewConnection returned false")
|
|
return Task.cont
|
|
|
|
def startReaderPollTask(self):
|
|
taskMgr.add(self.readerPollUntilEmpty, "serverReaderPollTask")
|
|
return None
|
|
|
|
def readerPollUntilEmpty(self, task):
|
|
while self.readerPollOnce():
|
|
pass
|
|
return Task.cont
|
|
|
|
def readerPollOnce(self):
|
|
availGetVal = self.qcr.dataAvailable()
|
|
if availGetVal:
|
|
datagram = NetDatagram()
|
|
readRetVal = self.qcr.getData(datagram)
|
|
if readRetVal:
|
|
self.handleDatagram(datagram)
|
|
else:
|
|
ClientRepository.notify.warning("getData returned false")
|
|
return availGetVal
|
|
|
|
def handleDatagram(self, datagram):
|
|
print "Server got a datagram!"
|
|
dgi = DatagramIterator(datagram)
|
|
print dgi.getUint16()
|
|
print dgi.getString()
|
|
print dgi.getUint32()
|
|
print dgi.getUint16()
|
|
|
|
newDatagram = Datagram()
|
|
newDatagram.addUint16(LOGIN_RESPONSE)
|
|
newDatagram.addUint8(ord('s'))
|
|
self.cw.send(newDatagram, self.lastConnection)
|
|
return None
|
|
|
|
def sendAvatarGenerate(self):
|
|
datagram = Datagram()
|
|
# Message type is 1
|
|
datagram.addUint16(ALL_OBJECT_GENERATE_WITH_REQUIRED)
|
|
# Avatar class type is 2
|
|
datagram.addUint8(2)
|
|
# A sample id
|
|
datagram.addUint32(10)
|
|
# The only required field is the zone field
|
|
datagram.addUint32(999)
|
|
self.cw.send(datagram, self.lastConnection)
|
|
|
|
def startResetPollTask(self):
|
|
return None
|
|
|
|
def resetPollUntilEmpty(self):
|
|
return None
|
|
|
|
def resetPollOnce(self):
|
|
return None
|
|
|