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.
|