SF.net SVN: fclient: [208] trunk/sandbox/fcp/fcp2_0_client.py
Status: Pre-Alpha
Brought to you by:
jurner
From: <ju...@us...> - 2008-02-12 09:50:19
|
Revision: 208 http://fclient.svn.sourceforge.net/fclient/?rev=208&view=rev Author: jurner Date: 2008-02-12 01:50:22 -0800 (Tue, 12 Feb 2008) Log Message: ----------- listeners get now informed on regular client closes Modified Paths: -------------- trunk/sandbox/fcp/fcp2_0_client.py Modified: trunk/sandbox/fcp/fcp2_0_client.py =================================================================== --- trunk/sandbox/fcp/fcp2_0_client.py 2008-02-12 09:47:25 UTC (rev 207) +++ trunk/sandbox/fcp/fcp2_0_client.py 2008-02-12 09:50:22 UTC (rev 208) @@ -8,8 +8,7 @@ @note: The client implementation never uses or watches the global queue. No implementation should ever do so. Global is evil. -@note: the client is not thread save, nor will it ever be. If you need that, create another client -and connect it to the node. +@note: the client is not thread save. Sample code. Connect to the freenet node:: @@ -316,6 +315,30 @@ ## private methods ## ############################################################### + def _close(self, msg): + """Closes the client + @param msg: message to pass to the ClientDisconnected event or None to not inform listeners + """ + self._log.info(consts.LogMessages.ClientClose) + + # clean left over DDA test tmp files + for initialRequest in self._ddaTests: + if initialRequest['FcTestDDA'].get('TmpFile', None) is not None: + saveRemoveFile(initialRequest['FcTestDDA']['TmpFile']) + + self._ddaTests = [] + self._requests = {} + + if self._socket is None: + #TODO: complain or not? + pass + else: + self._socket.close() + self._socket = None + if msg is not None: + self.events.ClientDisconnected(msg) + + def _finalizeRequest(self, msg, request, event): """Finalzes a request @param msg: message that is the reason for finalizing @@ -457,19 +480,13 @@ """Closes the client @note: make shure to call close() when done with the client """ - self._log.info(consts.LogMessages.ClientClose) - if self._socket is not None: - self._socket.close() - self._socket = None + msg = self.Message( + consts.Message.ClientDisconnected, + DisconnectReason=consts.DisconnectReason.Close, + Param=None, + ) + self._close(msg) - # clean left over DDA test tmp files - for initialRequest in self._ddaTests: - if initialRequest['FcTestDDA'].get('TmpFile', None) is not None: - saveRemoveFile(initialRequest['FcTestDDA']['TmpFile']) - - self._ddaTests = [] - self._requests = {} - def closeFreenet(self): """Shuts down the freenet node""" @@ -506,7 +523,7 @@ # try to Connect socket if self._socket is not None: - self.close() + self._close(None) # poll untill freenet responds timeElapsed = 0 @@ -548,13 +565,12 @@ if self.versionCheckNodeHello(msg): self.events.ClientConnected(msg) else: - self.close() - msg = self.Message( + disconnectMsg = self.Message( consts.Message.ClientDisconnected, DisconnectReason=consts.DisconnectReason.VersionMissmatch, Param=msg, ) - self.events.ClientDisconnected(msg) + self._close(disconnectMsg) yield self._nodeHelloMessage raise StopIteration @@ -568,14 +584,13 @@ timeElapsed += timeout time.sleep(timeout) - msg = self.Message( + self._log.info(consts.LogMessages.ConnectingFailed) + disconnectMsg = self.Message( consts.Message.ClientDisconnected, DisconnectReason=consts.DisconnectReason.ConnectingFailed, Param=None, ) - self.events.ClientDisconnected(msg) - self._log.info(consts.LogMessages.ConnectingFailed) - self.close() + self._close(disconnectMsg) raise StopIteration @@ -585,6 +600,10 @@ """ return self._connectionName + def getLogger(self): + """Returns the L{logging.Logger} used by the client""" + return self._log + def setConnectionName(self, connectionName=None): """Sets the connection name to be used by the client @param connectionName: (str) connection name or None to use an arbitrary connection name @@ -671,13 +690,12 @@ elif msg.name == consts.Message.ProtocolError: code = msg['Code'] if code == consts.ProtocolError.ShuttingDown: - self.close() - msg = self.Message( + disconnectMsg = self.Message( consts.Message.ClientDisconnected, DisconnectReason=consts.DisconnectReason.Shutdown, Param=None, ) - self.events.ClientDisconnected(msg) + self._close(disconnectMsg) return True @@ -1188,13 +1206,12 @@ ## #################################################### elif msg.name == consts.Message.CloseConnectionDuplicateClientName: - self.close() - msg = self.Message( + disconnectMsg = self.Message( consts.Message.ClientDisconnected, DisconnectReason=consts.DisconnectReason.DuplicateClientName, Param=None, ) - self.events.ClientDisconnected(msg) + self._close(disconnectMsg) return True @@ -1237,12 +1254,12 @@ if msg.name == consts.Message.ClientSocketDied: self._log.info(consts.LogMessages.SocketDied) if dispatch: - msg = self.Message( + disconnectMsg = self.Message( consts.Message.ClientDisconnected, DisconnectReason=consts.DisconnectReason.SocketDied, Param=msg, ) - self.events.ClientDisconnected(msg) + self._close(disconnectMsg) #raise socket.error(msg['Param']['Details']) elif msg.name == consts.Message.ClientSocketTimeout: @@ -1317,13 +1334,12 @@ msg.send(self._socket) except socket.error, d: self._log.info(consts.LogMessages.SocketDied) - self.close() - msg = self.Message( + disconnectMsg = self.Message( consts.Message.ClientDisconnected, DisconnectReason=consts.DisconnectReason.SocketDied, Param=self.Message(consts.Message.ClientSocketDied, Exception=socket.error, Details=d) ) - self.events.ClientDisconnected(msg) + self._close(disconnectMsg) raise socket.error(d) return msg @@ -1661,12 +1677,14 @@ return msg['Identifier'] def clientPut(self, + requestType, uri, - requestType, - userData, - persistentUserData, - data, - **messageParams): + data=None, + persistentUserData='', + userData=None, + + **messageParams + ): msg = self.Message(consts.Message.ClientPut, URI=uri) for paramName, value in messageParams.items(): @@ -1706,12 +1724,13 @@ @param data: () """ return self.clientPut( + consts.RequestType.Put, consts.KeyType.CHK, - consts.RequestType.Put, - userData, - persistentUserData, - data, + data=data, + persistentUserData=persistentUserData, + userData=userData, + # fcp params ContentType=contentType, DataLength=len(data), @@ -1733,9 +1752,9 @@ def chkPutFile(self, + filename, contentType=None, dontCompress=None, - filename=None, maxRetries=None, persistence=consts.Persistence.Connection, priorityClass=consts.Priority.Medium, @@ -1746,16 +1765,18 @@ ): """ - @param filename: (str) filename to append to the CHK key or None (may not contain slashes) + @param TargetFilename: (str) filename to append to the CHK key or None (may not contain slashes) """ return self.clientPut( + consts.RequestType.Put, consts.KeyType.CHK, - consts.RequestType.Put, - userData, - persistentUserData, - None, + + data=None, + persistentUserData=persistentUserData, + userData=userData, + # fcp params Filename=filename, ContentType=contentType, @@ -2279,8 +2300,10 @@ 'test123', #persistence=c.Persistence.Reboot, ) - for i in xrange(500): - c.next() + + c.run() + #for i in xrange(500): + # c.next() #c.removeRequest(myIdentifier) #for i in xrange(5): # c.next() @@ -2299,8 +2322,9 @@ ) - for i in xrange(500): - c.next() + c.run() + #for i in xrange(500): + # c.next() #c.removeRequest(identifier) #for i in xrange(5): # c.next() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |