SF.net SVN: fclient: [194] trunk/sandbox/fcp/fcp2_0_client.py
Status: Pre-Alpha
Brought to you by:
jurner
From: <ju...@us...> - 2008-02-09 09:34:35
|
Revision: 194 http://fclient.svn.sourceforge.net/fclient/?rev=194&view=rev Author: jurner Date: 2008-02-09 01:34:37 -0800 (Sat, 09 Feb 2008) Log Message: ----------- refactored removeRequest() and resendRequest() fixed bugs in plugin messages 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-08 23:41:20 UTC (rev 193) +++ trunk/sandbox/fcp/fcp2_0_client.py 2008-02-09 09:34:37 UTC (rev 194) @@ -8,6 +8,8 @@ @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. Sample code. Connect to the freenet node:: @@ -389,6 +391,18 @@ 'FcPublicKey': None, }) + elif requestType & consts.RequestType.PluginMessage: + msg.params.update({ + 'FcRequestType': requestType, # identifies sub message types + 'FcRequestStatus': consts.RequestStatus.Null, + 'FcInitTime': initTime, # when was the request started? + 'FcModified': {}, + + 'FcPluginReply': None, + }) + + + else: msg.params.update({ 'FcRequestType': requestType, # identifies sub message types @@ -689,7 +703,7 @@ # handle plugin related request failures elif code == consts.ProtocolError.NoSuchPlugin: - if initialRequest.name == consts.Message.PluginInfo: + if initialRequest.name == consts.Message.GetPluginInfo: initialRequest['FcErrorMessage'] = msg initialRequest['FcRequestStatus'] |= consts.RequestStatus.Error self._finalizeRequest(msg, initialRequest, self.events.PluginInfoFailed) @@ -962,12 +976,8 @@ if initialRequest is None: return False - initialRequest['FcRequestStatus'] |= (consts.RequestStatus.Removed | - consts.RequestStatus.Completed | - consts.RequestStatus.RemovedFromQueue - ) - - del self._requests[requestIdentifier] + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Removed + self._finalizeRequest(msg, initialRequest, self.events.RequestRemoved) return True @@ -1125,6 +1135,7 @@ elif msg.name == consts.Message.PluginInfo: if initialRequest is None: return False + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success self._finalizeRequest(msg, initialRequest, self.events.PluginInfo) return True @@ -1133,6 +1144,7 @@ if initialRequest is None: return False initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success + initialRequest['FcPluginReply'] = msg self._finalizeRequest(msg, initialRequest, self.events.PluginMessage) return True @@ -1819,12 +1831,12 @@ ## request related methods ## ######################################################## - def getRequest(self, identifier): + def getRequest(self, requestIdentifier): """Returns a (initial) message, given its identifier - @param identifier: identifier of the message + @param requestIdentifier: identifier of the message @return: L{Message} """ - return self._requests[identifier] + return self._requests[requestIdentifier] def getRequests(self): @@ -1871,11 +1883,10 @@ if initialRequest['FcRequestType'] & (consts.RequestType.MaskGet | consts.RequestType.MaskPut): # remove Persistence.Connection emidiately + #todo so we make up a PersistentRequestRemoved message if initialRequest['Persistence'] == consts.Persistence.Connection: - initialRequest['FcRequestStatus'] |= (consts.RequestStatus.Completed | - consts.RequestStatus.RemovedFromQueue - ) - del self._requests[requestIdentifier] + msg = self.Message(consts.Message.PersistentRequestRemoved, Identifier=requestIdentifier, Global=False) + self._finalizeRequest(msg, initialRequest, self.events.RequestRemoved) else: self.sendMessage( consts.Message.RemovePersistentRequest, @@ -1886,7 +1897,7 @@ del self._requests[requestIdentifier] #TODO: check how Fcp responds when the identifier is unknown or something else goes - # werong. Maybe a ProtocolError.NoSuchIdentifier ??? + # werong. Maybe a ProtocolError.NoSuchIdentifier ??? Naa ...never seen this def resendRequest(self, request): @@ -1896,29 +1907,35 @@ @note: you can use this method to resend get / put requests.All attempts to resend other requests will fail - @note: the request passed removed in the call if necessary. Except for FcInitTime is reseet, but - otherwise it is left unchanged + @note: actually a new request is created and registered. Todo so, the request passed is copied and removed from + the queue (if necessary). The new request will have FcInitTime reseet and FcUserData amd FcPersistentUserData + taken over from the old request """ requestType = request.get('FcRequestType', consts.RequestType.Null) if not requestType & (consts.RequestType.MaskGet | consts.RequestType.MaskPut): raise ValueError('Can not resend request: %s' % requestMessage.name) + # we don't know what UserData may be, so back it up before copying + oldIdentifier = request['Identifier'] + oldUserData, request['FcUserData'] = request['FcUserData'], None + newRequest = copy.deepcopy(request) + # remove and cancel request - oldIdentifier = request['Identifier'] self._registerRequest( - request, + newRequest, requestType, - filenameCollision=request['FcFilenameCollision'] & consts.FilenameCollision.MaskHandle, + filenameCollision=newRequest['FcFilenameCollision'] & consts.FilenameCollision.MaskHandle, #initTime=time.time(), # TODO: reset init time or not? - persistentUserData=request['FcPersistentUserData'], - userData=request['FcUserData'], + persistentUserData=newRequest['FcPersistentUserData'], + userData=oldUserData, ) if oldIdentifier in self._requests: - self.removeRequest(oldIdentifier) + request['FcUserData'] = oldUserData + self.removeRequest(request['Identifier']) - self.sendMessageEx(request) - return request['Identifier'] + self.sendMessageEx(newRequest) + return newRequest['Identifier'] ######################################################## ## @@ -2040,14 +2057,14 @@ @param detailed: (bool) If True, detailed information is returned @return: (str) request identifier """ - identifier = self.FcParam.newUuid(uuids=self._requests) msg = self.Message( + consts.Message.GetPluginInfo, PluginName=pluginName, Detailed=detailed, ) - self._registerRequest(msg, consts.Message.GetPluginInfo) + self._registerRequest(msg, consts.RequestType.PluginInfo) self.sendMessageEx(msg) - return identifier + return msg['Identifier'] def sendPluginMessage(self, pluginName, params, data=None): @@ -2057,18 +2074,17 @@ @param data: (str) data to pass along with the messaage or None @return: (str) request identifier """ - identifier = self.FcParam.newUuid(uuids=self._requests) msg = self.Message( - consts.Message.GetPluginInfo, + consts.Message.FCPPluginMessage, PluginName=pluginName, **params ) if data is not None: msg['DataLength'] = len(data) msg.data = data - self._registerRequest(msg, onsts.RequestType.PluginMessage) + self._registerRequest(msg, consts.RequestType.PluginMessage) self.sendMessageEx(msg) - return identifier + return msg['Identifier'] ########################################################## ## This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |