fclient-commit Mailing List for fclient (Page 33)
Status: Pre-Alpha
Brought to you by:
jurner
You can subscribe to this list here.
2007 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(23) |
Nov
(54) |
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2008 |
Jan
(17) |
Feb
(209) |
Mar
(63) |
Apr
(31) |
May
(7) |
Jun
(39) |
Jul
(390) |
Aug
(122) |
Sep
(6) |
Oct
|
Nov
|
Dec
|
From: <ju...@us...> - 2008-02-06 11:13:23
|
Revision: 162 http://fclient.svn.sourceforge.net/fclient/?rev=162&view=rev Author: jurner Date: 2008-02-06 03:13:27 -0800 (Wed, 06 Feb 2008) Log Message: ----------- adapt Modified Paths: -------------- trunk/sandbox/fcp/fcp2_0_consts.py Modified: trunk/sandbox/fcp/fcp2_0_consts.py =================================================================== --- trunk/sandbox/fcp/fcp2_0_consts.py 2008-02-06 11:13:03 UTC (rev 161) +++ trunk/sandbox/fcp/fcp2_0_consts.py 2008-02-06 11:13:27 UTC (rev 162) @@ -333,7 +333,7 @@ PutDiskDir = 0x10 PutComplexDir = 0x20 - GenerateSSKKeypair = GenerateKeypair = 0x1000 + GenerateSSKKeypair = 0x1000 GenerateUSKKeypair = 0x2000 PluginInfo = 0x2000000 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-06 11:13:02
|
Revision: 161 http://fclient.svn.sourceforge.net/fclient/?rev=161&view=rev Author: jurner Date: 2008-02-06 03:13:03 -0800 (Wed, 06 Feb 2008) Log Message: ----------- kicked out identifier prefixes. Use FcRequestType now Modified Paths: -------------- trunk/sandbox/fcp/fcp2_0_params.py Modified: trunk/sandbox/fcp/fcp2_0_params.py =================================================================== --- trunk/sandbox/fcp/fcp2_0_params.py 2008-02-06 11:12:36 UTC (rev 160) +++ trunk/sandbox/fcp/fcp2_0_params.py 2008-02-06 11:13:03 UTC (rev 161) @@ -60,7 +60,7 @@ MAGIC = '{8a7808d0-3934-465a-b1b4-b7150ed109a5}' # magic string to identify our requests FcParams = ( - ('FcType', validateInt), + ('FcRequestType', validateInt), ('FcInitTime', validateFloat), # can not take it from uuid cos requests may be resend multiple times ('FcFilenameCollision', validateInt), ('FcPersistentUserData', validateString), @@ -132,19 +132,16 @@ -def newUuid(prefix=None, uuids=None): +def newUuid(uuids=None): """Creates a new unique identifier - @param prefix: (str) identifier prefix or None @param uuids: if desired any iterable containing uuids to enshure the identifier is unique in the iterable @return: (str) uuid """ - if prefix is None: - prefix = '' - uuid_ = prefix + uuid.uuid_time() + uuid_ = uuid.uuid_time() if uuids is not None: while uuid_ in uuids: - uuid_ = prefix + uuid_time() + uuid_ = uuid_time() return uuid_ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-06 11:12:38
|
Revision: 160 http://fclient.svn.sourceforge.net/fclient/?rev=160&view=rev Author: jurner Date: 2008-02-06 03:12:36 -0800 (Wed, 06 Feb 2008) Log Message: ----------- kicked out identifier prefixes. Use FcRequestType now 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-06 10:54:42 UTC (rev 159) +++ trunk/sandbox/fcp/fcp2_0_client.py 2008-02-06 11:12:36 UTC (rev 160) @@ -249,11 +249,6 @@ ExpectedFcpVersion = 2.0 ExpectedNodeBuild = 1107 - IdentifierPrefixRequest = 'request:' - IdentifierPrefixGenerateSSK = 'ssk:' - IdentifierPrefixGenerateUSK = 'usk:' - IdentifierPrefixPluginMessage = 'plugin:' - consts = consts Config = Config Message = Message @@ -305,7 +300,7 @@ msg.params.update({ # persistent params that will go into identifier - 'FcType': msgType, # identifies sub message types + 'FcRequestType': msgType, # identifies sub message types 'FcInitTime': initTime, # when was the request started? 'FcFilenameCollision': filenameCollision, # handle fielanem collisions? 'FcPersistentUserData': persistentUserData, # any user defined persistent data @@ -359,7 +354,7 @@ @return: (str) uuid @note: the identifier returned is unique to the client but may not be unique to the node """ - identifier = self.FcParams.newUuid(prefix=self.IdentifierPrefixRequest, uuids=self._requests) + identifier = self.FcParams.newUuid(uuids=self._requests) # add additional params to msg msg = self._addFcParamsToRequest( @@ -612,23 +607,18 @@ ## #################################################### if msg.name == consts.Message.IdentifierCollision: - if initialRequest is not None: - # resend request with new identifier - - #TODO: just an assumption that pugin related messages my end up here - if initialRequest.name in (consts.Message.GetPluginInfo, consts.Message.FCPPlugin): - identifierPrefix = self.IdentifierPrefixPluginMessage - else: - identifierPrefix = self.IdentifierPrefixRequest + if initialRequest is None: + return False - newIdentifier = self.FcParams.newUuid(prefix=identifierPrefix, uuids=self._requests) - self._requests[newIdentifier] = initialRequest - del self._requests[requestIdentifier] - initialRequest['Identifier'] = newIdentifier - initialRequest['FcModified'] = {consts.RequestModified.Identifier: requestIdentifier} - self.events.RequestModified(initialRequest) - self.sendMessageEx(initialRequest) - return True + # resend request with new identifier + newIdentifier = self.FcParams.newUuid(uuids=self._requests) + self._requests[newIdentifier] = initialRequest + del self._requests[requestIdentifier] + initialRequest['Identifier'] = newIdentifier + initialRequest['FcModified'] = {consts.RequestModified.Identifier: requestIdentifier} + self.events.RequestModified(initialRequest) + self.sendMessageEx(initialRequest) + return True elif msg.name == consts.Message.ProtocolError: @@ -877,7 +867,7 @@ initialRequest['FcDataLength'] = msg.get('DataLength', '') # except from GetData all requests are complete here. Next GetData will run through AllData... - if initialRequest['FcType'] != consts.RequestType.GetData: + if initialRequest['FcRequestType'] != consts.RequestType.GetData: # Fcp removes requests from queue with Persistence.Connection.. so do we if initialRequest.params.get('Persistence', consts.Persistence.Connection) == consts.Persistence.Connection: initialRequest['FcStatus'] |= consts.RequestStatus.Removed @@ -901,7 +891,7 @@ # check if it is one of our requests for key information code = msg['Code'] - if code == consts.FetchError.TooBig and initialRequest['FcType'] == consts.RequestType.GetKeyInfo: + if code == consts.FetchError.TooBig and initialRequest['FcRequestType'] == consts.RequestType.GetKeyInfo: initialRequest['FcStatus'] |= consts.RequestStatus.Success initialRequest['FcMetadataContentType'] = msg.get('ExpectedMetadata.ContentType', '') initialRequest['FcDataLength'] = msg.get('ExpectedDataLength', -1) @@ -1025,11 +1015,11 @@ return True # determine initial message name - if restoredRequest['FcType'] == consts.RequestType.Put: + if restoredRequest['FcRequestType'] == consts.RequestType.Put: restoredRequest.name = consts.Message.ClientPut - elif restoredRequest['FcType'] == consts.RequestType.PutDiskDir: + elif restoredRequest['FcRequestType'] == consts.RequestType.PutDiskDir: restoredRequest.name = consts.Message.ClientPutDiskDir - elif restoredRequest['FcType'] == consts.RequestType.PutComplexDir: + elif restoredRequest['FcRequestType'] == consts.RequestType.PutComplexDir: restoredRequest.name = consts.Message.ClientPutComplexDir # restore request @@ -1200,20 +1190,16 @@ insertURI = self.Uri(msg['InsertURI']).uri requestURI = self.Uri(msg['RequestURI']).uri - createUSK = True if requestIdentifier.startswith(self.IdentifierPrefixGenerateUSK) else False - if createUSK: + if initialRequest['FcRequestType'] == consts.RequestType.GenerateUSKKeypair: insertURI = insertURI.replace(consts.KeyType.SSK, consts.KeyType.USK, 1) requestURI = requestURI.replace(consts.KeyType.SSK, consts.KeyType.USK, 1) - keyType = consts.KeyType.USK - else: - keyType = consts.KeyType.SSK - + initialRequest['InsertURI'] = insertURI initialRequest['RequestURI'] = requestURI - initialRequest['FcKeyType'] = keyType initialRequest['FcStatus'] |= consts.RequestStatus.Success | consts.RequestStatus.Removed self.events.KeypairGenerated(initialRequest) + # notify listeners initialRequest['FcStatus'] |= consts.RequestStatus.Completed del self._requests[requestIdentifier] return True @@ -2048,12 +2034,12 @@ @param detailed: (bool) If True, detailed information is returned @return: (str) request identifier """ - identifier = self.FcParam.newUuid(prefix=self.IdentifierPrefixPluginMessage, uuids=self._requests) + identifier = self.FcParam.newUuid(uuids=self._requests) msg = self.Message( consts.Message.GetPluginInfo, FcModified={}, FcStatus=consts.RequestStatus.Pending, - FcType=consts.RequestType.PluginInfo, + FcRequestType=consts.RequestType.PluginInfo, Identifier=identifier, PluginName=pluginName, Detailed=detailed, @@ -2070,12 +2056,12 @@ @param data: (str) data to pass along with the messaage or None @return: (str) request identifier """ - identifier = self.FcParam.newUuid(prefix=self.IdentifierPrefixPluginMessage, uuids=self._requests) + identifier = self.FcParam.newUuid(uuids=self._requests) msg = self.Message( consts.Message.GetPluginInfo, FcModified={}, FcStatus=consts.RequestStatus.Pending, - FcType=consts.RequestType.PluginMessage, + FcRequestType=consts.RequestType.PluginMessage, Identifier=identifier, PluginName=pluginName, **params @@ -2093,7 +2079,6 @@ ## others ## ########################################################## - #TODO: kick out request prefix (use FcType instead) def generateKeypair(self, keypairType=consts.KeyType.SSK): """ @param keypairType: type of keypair to generate (either L{consts.KeyType.SSK} or L{consts.KeyType.SSK}) @@ -2104,13 +2089,13 @@ if keypairType not in (consts.KeyType.SSK, consts.KeyType.USK): raise ValueError('keypairType must be %s or %s' % (consts.KeyType.SSK, consts.KeyType.USK)) - prefix = self.IdentifierPrefixGenerateSSK if keypairType == consts.KeyType.SSK else self.IdentifierPrefixGenerateUSK - identifier = self.FcParams.newUuid(prefix=prefix, uuids=self._requests) + requestType = consts.RequestType.GenerateSSKKeypair if keypairType == consts.KeyType.SSK else consts.RequestType.GenerateUSKKeypair + identifier = self.FcParams.newUuid(uuids=self._requests) msg = self.Message( consts.Message.GenerateSSK, FcModified={}, FcStatus=consts.RequestStatus.Pending, - FcType=consts.RequestType.GenerateKeypair, + FcRequestType=requestType, Identifier=identifier, ) self._requests[identifier] = msg This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-06 10:54:38
|
Revision: 159 http://fclient.svn.sourceforge.net/fclient/?rev=159&view=rev Author: jurner Date: 2008-02-06 02:54:42 -0800 (Wed, 06 Feb 2008) Log Message: ----------- adapt Modified Paths: -------------- trunk/sandbox/fcp/fcp2_0_params.py Modified: trunk/sandbox/fcp/fcp2_0_params.py =================================================================== --- trunk/sandbox/fcp/fcp2_0_params.py 2008-02-06 10:54:27 UTC (rev 158) +++ trunk/sandbox/fcp/fcp2_0_params.py 2008-02-06 10:54:42 UTC (rev 159) @@ -60,7 +60,7 @@ MAGIC = '{8a7808d0-3934-465a-b1b4-b7150ed109a5}' # magic string to identify our requests FcParams = ( - ('FcSubType', validateInt), + ('FcType', validateInt), ('FcInitTime', validateFloat), # can not take it from uuid cos requests may be resend multiple times ('FcFilenameCollision', validateInt), ('FcPersistentUserData', validateString), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-06 10:54:21
|
Revision: 158 http://fclient.svn.sourceforge.net/fclient/?rev=158&view=rev Author: jurner Date: 2008-02-06 02:54:27 -0800 (Wed, 06 Feb 2008) Log Message: ----------- more fine grained status and type flags for requests Modified Paths: -------------- trunk/sandbox/fcp/test_fcp/test_fcp2_0_client.py Modified: trunk/sandbox/fcp/test_fcp/test_fcp2_0_client.py =================================================================== --- trunk/sandbox/fcp/test_fcp/test_fcp2_0_client.py 2008-02-06 10:54:05 UTC (rev 157) +++ trunk/sandbox/fcp/test_fcp/test_fcp2_0_client.py 2008-02-06 10:54:27 UTC (rev 158) @@ -2,6 +2,7 @@ from __future__ import with_statement import os, sys +import copy import socket import tempfile import time @@ -60,6 +61,8 @@ self.messages.append(self.fcpClient.Message.fromSocket(s)) def _captureEventsFromClient(self, event, msg): + # have to copy message here, to get exact state + msg = copy.deepcopy(msg) self.events.append( (event, msg) ) def connectClient(self): @@ -536,17 +539,24 @@ self.assertHasNextEvent( self.fcpClient.events.RequestCompleted, consts.Message.ClientGet, - ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Complete | consts.RequestStatus.Removed), + ('FcStatus', consts.RequestStatus.Pending | + consts.RequestStatus.Started | + consts.RequestStatus.Success | + consts.RequestStatus.Removed), data=data ) self.failIf(myIdentifier in allRequests) + self.failUnless(myRequest['FcStatus'] & consts.RequestStatus.Completed) self.assertHasNextEvent(None) # cheat a bit to test peristence == Forever (client should not remove request) allRequests[myIdentifier] =myRequest myRequest['Persistence'] = consts.Persistence.Forever - myRequest['FcStatus'] &= ~(consts.RequestStatus.Complete | consts.RequestStatus.Removed) + myRequest['FcStatus'] &= ~(consts.RequestStatus.Success | + consts.RequestStatus.Removed | + consts.RequestStatus.Completed + ) self.sendResponseMessage( 'AllData', data=data, @@ -559,16 +569,16 @@ self.assertHasNextEvent( self.fcpClient.events.RequestCompleted, consts.Message.ClientGet, - ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Complete), + ('FcStatus', consts.RequestStatus.Pending | + consts.RequestStatus.Started | + consts.RequestStatus.Success), data=data ) self.failUnless(myIdentifier in allRequests) + self.failUnless(myRequest['FcStatus'] & consts.RequestStatus.Completed) self.assertHasNextEvent(None) - - - def testGetData_Failure(self): # request a arbitrary file @@ -604,8 +614,12 @@ self.assertHasNextEvent( self.fcpClient.events.RequestFailed, consts.Message.ClientGet, - ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Error | consts.RequestStatus.Removed) + ('FcStatus', consts.RequestStatus.Pending | + consts.RequestStatus.Started | + consts.RequestStatus.Error | + consts.RequestStatus.Removed) ) + self.failUnless(myRequest['FcStatus'] & consts.RequestStatus.Completed) self.assertHasNextEvent(None) #return @@ -614,7 +628,9 @@ allRequests[myIdentifier] =myRequest myRequest['Persistence'] = consts.Persistence.Forever - myRequest['FcStatus'] &= ~(consts.RequestStatus.Error | consts.RequestStatus.Removed) + myRequest['FcStatus'] &= ~(consts.RequestStatus.Error | + consts.RequestStatus.Removed | + consts.RequestStatus.Completed) self.sendResponseMessage( 'GetFailed', Code='28', # All data not found @@ -627,9 +643,13 @@ self.assertHasNextEvent( self.fcpClient.events.RequestFailed, consts.Message.ClientGet, - ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Error), + ('FcStatus', consts.RequestStatus.Pending | + consts.RequestStatus.Started | + consts.RequestStatus.Error + ), ) self.failUnless(myIdentifier in allRequests) + self.failUnless(myRequest['FcStatus'] & consts.RequestStatus.Completed) self.assertHasNextEvent(None) @@ -673,9 +693,10 @@ self.assertHasNextEvent( self.fcpClient.events.RequestCompleted, consts.Message.ClientGet, - ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Complete | consts.RequestStatus.Removed) + ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Success | consts.RequestStatus.Removed) ) self.failIf(myIdentifier in allRequests) + self.failUnless(myRequest['FcStatus'] & consts.RequestStatus.Completed) self.assertHasNextEvent(None) @@ -718,10 +739,10 @@ ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Error | consts.RequestStatus.Removed) ) self.failIf(myIdentifier in allRequests) + self.failUnless(myRequest['FcStatus'] & consts.RequestStatus.Completed) self.assertHasNextEvent(None) + - - def testGetKeyInfo_Success(self): # request a arbitrary uri @@ -762,13 +783,14 @@ self.assertHasNextEvent( self.fcpClient.events.RequestCompleted, consts.Message.ClientGet, - ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Complete) + ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Success) ) self.failIf(myIdentifier not in allRequests) + self.failUnless(myRequest['FcStatus'] & consts.RequestStatus.Completed) self.assertHasNextEvent(None) # test specdial case where ProtocolError.TooBig is handled as success - myRequest['FcStatus'] &= ~(consts.RequestStatus.Complete) + myRequest['FcStatus'] &= ~(consts.RequestStatus.Success) self.sendResponseMessage( 'GetFailed', Code='21', # Too big @@ -779,8 +801,13 @@ self.assertHasNextEvent( self.fcpClient.events.RequestCompleted, consts.Message.ClientGet, - ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Complete) + ('FcStatus', consts.RequestStatus.Pending | + consts.RequestStatus.Started | + consts.RequestStatus.Success | + consts.RequestStatus.Completed + ) ) + self.failUnless(myRequest['FcStatus'] & consts.RequestStatus.Completed) self.assertHasNextEvent(None) # cheat a bit to test persistence == Connection @@ -826,6 +853,7 @@ consts.Message.ClientGet, ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Error | consts.RequestStatus.Removed) ) + self.failUnless(myRequest['FcStatus'] & consts.RequestStatus.Completed) self.assertHasNextEvent(None) #*********************************************************************************** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-06 10:54:02
|
Revision: 157 http://fclient.svn.sourceforge.net/fclient/?rev=157&view=rev Author: jurner Date: 2008-02-06 02:54:05 -0800 (Wed, 06 Feb 2008) Log Message: ----------- more fine grained status and type flags for requests 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-06 10:52:05 UTC (rev 156) +++ trunk/sandbox/fcp/fcp2_0_client.py 2008-02-06 10:54:05 UTC (rev 157) @@ -294,7 +294,7 @@ def _addFcParamsToRequest(self, msg, userData, - msgSubType, + msgType, initTime, persistentUserData, filenameCollision, @@ -305,7 +305,7 @@ msg.params.update({ # persistent params that will go into identifier - 'FcSubType': msgSubType, # identifies sub message types + 'FcType': msgType, # identifies sub message types 'FcInitTime': initTime, # when was the request started? 'FcFilenameCollision': filenameCollision, # handle fielanem collisions? 'FcPersistentUserData': persistentUserData, # any user defined persistent data @@ -343,7 +343,7 @@ def _registerRequest(self, msg, userData, - msgSubType, + msgType, initTime, persistentUserData, filenameCollision=consts.FilenameCollision.HandleNever, @@ -351,7 +351,7 @@ """Registers a message @param msg: message to register for track keeping @param userData: any user defined data - @param msgSubType: one of the message sub type consts + @param msgType: one of the message sub type consts @param initTime: (python time) @param persistentUserData: (str) user defined persistent data @param filenameCollision: (bool) @@ -365,7 +365,7 @@ msg = self._addFcParamsToRequest( msg, userData, - msgSubType, + msgType, initTime, persistentUserData, filenameCollision, @@ -701,35 +701,40 @@ # handle plugin related request failures elif code == consts.ProtocolError.NoSuchPlugin: if initialRequest.name == consts.Message.PluginInfo: + initialRequest['FcStatus'] |= consts.RequestStatus.Error | consts.RequestStatus.Success | consts.RequestStatus.Removed + self.events.PluginInfoFailed(initialRequest) + initialRequest['FcStatus'] |= consts.RequestStatus.Completed del self._requests[requestIdentifier] - initialRequest['FcStatus'] |= consts.RequestStatus.Error | consts.RequestStatus.Complete | consts.RequestStatus.Removed - self.events.PluginInfoFailed(initialRequest) return True elif initialRequest.name == consts.Message.FCPPluginMessage: + initialRequest['FcStatus'] |= consts.RequestStatus.Error | consts.RequestStatus.Success | consts.RequestStatus.Removed + self.events.PluginMessageFailed(initialRequest) + initialRequest['FcStatus'] |= consts.RequestStatus.Completed del self._requests[requestIdentifier] - initialRequest['FcStatus'] |= consts.RequestStatus.Error | consts.RequestStatus.Complete | consts.RequestStatus.Removed - self.events.PluginMessageFailed(initialRequest) return True elif code == consts.ProtocolError.AccessDenied: if initialRequest.name == consts.Message.PluginInfo: + self.events.PluginInfoFailed(initialRequest) + initialRequest['FcStatus'] |= consts.RequestStatus.Completed del self._requests[requestIdentifier] - self.events.PluginInfoFailed(initialRequest) return True # TODO: just a guess that FCPPluginMessage can trigger an AccessDenied error elif initialRequest.name == consts.Message.FCPPluginMessage: + self.events.PluginMessageFailed(initialRequest) + initialRequest['FcStatus'] |= consts.RequestStatus.Completed del self._requests[requestIdentifier] - self.events.PluginMessageFailed(initialRequest) return True # only requests should get through to here # NOTE: Fcp already removed the request - del self._requests[requestIdentifier] initialRequest['FcErrorMessage'] = msg - initialRequest['FcStatus'] = consts.RequestStatus.Complete | consts.RequestStatus.Error | consts.RequestStatus.Removed + initialRequest['FcStatus'] = consts.RequestStatus.Success | consts.RequestStatus.Error | consts.RequestStatus.Removed self.events.RequestFailed(initialRequest) + initialRequest['FcStatus'] |= consts.RequestStatus.Completed + del self._requests[requestIdentifier] return True @@ -809,11 +814,14 @@ if testFailed: #TODO: check if errorMsg gives reasonable feedback - - del self._requests[initialRequest['Identifier']] initialRequest['FcStatus'] = consts.RequestStatus.Error | consts.RequestStatus.Removed initialRequest['FcErrorMessage'] = initialRequest['FcTestDDA']['ErrorMsg'] + + # notify listeners self.events.ProtocolError(initialRequest) + # the node removed the request in any case (ProtocolError) so do we... + initialRequest['FcStatus'] = consts.RequestStatus.Completed + del self._requests[initialRequest['Identifier']] return True @@ -846,30 +854,40 @@ if initialRequest is None: return False - initialRequest['FcStatus'] |= consts.RequestStatus.Complete + initialRequest['FcStatus'] |= consts.RequestStatus.Success + initialRequest.data = msg.data + # Fcp removes requests from queue with Persistence.Connection.. so do we if initialRequest.params.get('Persistence', consts.Persistence.Connection) == consts.Persistence.Connection: initialRequest['FcStatus'] |= consts.RequestStatus.Removed + + # notify listeners + self.events.RequestCompleted(initialRequest) + initialRequest['FcStatus'] |= consts.RequestStatus.Completed + if initialRequest['FcStatus'] & consts.RequestStatus.Removed: del self._requests[requestIdentifier] - - initialRequest.data = msg.data - self.events.RequestCompleted(initialRequest) return True elif msg.name == consts.Message.DataFound: if initialRequest is None: return False - initialRequest['FcStatus'] |= consts.RequestStatus.Complete + initialRequest['FcStatus'] |= consts.RequestStatus.Success initialRequest['FcMetadataContentType'] = msg.get('Metadata.ContentType', '') initialRequest['FcDataLength'] = msg.get('DataLength', '') - if initialRequest['FcSubType'] != consts.RequestSubType.GetData: - + + # except from GetData all requests are complete here. Next GetData will run through AllData... + if initialRequest['FcType'] != consts.RequestType.GetData: # Fcp removes requests from queue with Persistence.Connection.. so do we if initialRequest.params.get('Persistence', consts.Persistence.Connection) == consts.Persistence.Connection: initialRequest['FcStatus'] |= consts.RequestStatus.Removed + + # notify listeners + self.events.RequestCompleted(initialRequest) + initialRequest['FcStatus'] |= consts.RequestStatus.Completed + if initialRequest['FcStatus'] & consts.RequestStatus.Removed: del self._requests[requestIdentifier] - self.events.RequestCompleted(initialRequest) + return True @@ -880,12 +898,11 @@ # Fcp removes requests from queue with Persistence.Connection.. so do we if initialRequest.params.get('Persistence', consts.Persistence.Connection) == consts.Persistence.Connection: initialRequest['FcStatus'] |= consts.RequestStatus.Removed - del self._requests[requestIdentifier] - + # check if it is one of our requests for key information code = msg['Code'] - if code == consts.FetchError.TooBig and initialRequest['FcSubType'] == consts.RequestSubType.GetKeyInfo: - initialRequest['FcStatus'] |= consts.RequestStatus.Complete + if code == consts.FetchError.TooBig and initialRequest['FcType'] == consts.RequestType.GetKeyInfo: + initialRequest['FcStatus'] |= consts.RequestStatus.Success initialRequest['FcMetadataContentType'] = msg.get('ExpectedMetadata.ContentType', '') initialRequest['FcDataLength'] = msg.get('ExpectedDataLength', -1) self.events.RequestCompleted(initialRequest) @@ -893,6 +910,10 @@ initialRequest['FcErrorMessage'] = msg initialRequest['FcStatus'] |= consts.RequestStatus.Error self.events.RequestFailed(initialRequest) + + initialRequest['FcStatus'] |= consts.RequestStatus.Completed + if initialRequest['FcStatus'] & consts.RequestStatus.Removed: + del self._requests[requestIdentifier] return True @@ -1004,11 +1025,11 @@ return True # determine initial message name - if restoredRequest['FcSubType'] == consts.RequestSubType.Put: + if restoredRequest['FcType'] == consts.RequestType.Put: restoredRequest.name = consts.Message.ClientPut - elif restoredRequest['FcSubType'] == consts.RequestSubType.PutDiskDir: + elif restoredRequest['FcType'] == consts.RequestType.PutDiskDir: restoredRequest.name = consts.Message.ClientPutDiskDir - elif restoredRequest['FcSubType'] == consts.RequestSubType.PutComplexDir: + elif restoredRequest['FcType'] == consts.RequestType.PutComplexDir: restoredRequest.name = consts.Message.ClientPutComplexDir # restore request @@ -1034,14 +1055,18 @@ return False initialRequest['FcStatus'] |= consts.RequestStatus.Error + initialRequest['FcErrorMessage'] = msg # Fcp removes requests from queue with Persistence.Connection.. so do we if initialRequest.params.get('Persistence', consts.Persistence.Connection) == consts.Persistence.Connection: initialRequest['FcStatus'] |= consts.RequestStatus.Removed del self._requests[requestIdentifier] - initialRequest['FcErrorMessage'] = msg + # notify listeners self.events.RequestFailed(initialRequest) + initialRequest['FcStatus'] |= consts.RequestStatus.Completed + if initialRequest['FcStatus'] & consts.RequestStatus.Removed: + del self._requests[requestIdentifier] return True @@ -1061,14 +1086,16 @@ # TODO: StartupTime and CompletionTime are passed, but # as long as no corrosponding params are passed in DataFound # we ignore them - initialRequest['FcStatus'] |= consts.RequestStatus.Complete - + initialRequest['FcStatus'] |= consts.RequestStatus.Success + initialRequest['URI'] = msg['URI'] if initialRequest.params.get('Persistence', consts.Persistence.Connection) == consts.Persistence.Connection: initialRequest['FcStatus'] |= consts.RequestStatus.Removed + + # notify listeners + self.events.RequestCompleted(initialRequest) + initialRequest['FcStatus'] |= consts.RequestStatus.Completed + if initialRequest['FcStatus'] & consts.RequestStatus.Removed: del self._requests[requestIdentifier] - - initialRequest['URI'] = msg['URI'] - self.events.RequestCompleted(initialRequest) return True @@ -1130,18 +1157,24 @@ if initialRequest is None: return False + initialRequest['FcStatus'] |= consts.RequestStatus.Success | consts.RequestStatus.Removed + + # notify listeners + self.events.PluginInfo(msg) + initialRequest['FcStatus'] |= consts.RequestStatus.Completed del self._pluginRequests[requestIdentifier] - initialRequest['FcStatus'] |= consts.RequestStatus.Completed - self.events.PluginInfo(msg) return True elif msg.name == consts.Message.FCPPluginReply: if initialRequest is None: return False + initialRequest['FcStatus'] |= consts.RequestStatus.Success | consts.RequestStatus.Removed + + # notify listeners + self.events.PluginMessage(msg) + initialRequest['FcStatus'] |= consts.RequestStatus.Completed del self._requests[requestIdentifier] - initialRequest['FcStatus'] |= consts.RequestStatus.Completed - self.events.PluginMessage(msg) return True #################################################### @@ -1160,27 +1193,29 @@ elif msg.name == consts.Message.SSKKeypair: - if requestIdentifier not in self._requests: + if initialRequest is None: return False - del self._requests[requestIdentifier] #TODO:no idea if the node may pass uris with prefixes like 'freenet:'... strip it anyways insertURI = self.Uri(msg['InsertURI']).uri requestURI = self.Uri(msg['RequestURI']).uri createUSK = True if requestIdentifier.startswith(self.IdentifierPrefixGenerateUSK) else False if createUSK: - insertURI = requestURI.replace(consts.KeyType.SSK, consts.KeyType.USK, 1) + insertURI = insertURI.replace(consts.KeyType.SSK, consts.KeyType.USK, 1) requestURI = requestURI.replace(consts.KeyType.SSK, consts.KeyType.USK, 1) keyType = consts.KeyType.USK else: keyType = consts.KeyType.SSK - msg['InsertURI'] = insertURI - msg['RequestURI'] = requestURI - msg['FcKeyType'] = keyType - msg['FcStatus'] |= consts.RequestStatus.Completed - self.events.KeypairGenerated(msg) + initialRequest['InsertURI'] = insertURI + initialRequest['RequestURI'] = requestURI + initialRequest['FcKeyType'] = keyType + initialRequest['FcStatus'] |= consts.RequestStatus.Success | consts.RequestStatus.Removed + self.events.KeypairGenerated(initialRequest) + + initialRequest['FcStatus'] |= consts.RequestStatus.Completed + del self._requests[requestIdentifier] return True elif msg.name == consts.Message.SubscribedUSKUpdate: @@ -1233,17 +1268,14 @@ #n += 1 #if n > 50: break - # check if we have running requests - - # assert no requests has completed - status = consts.RequestStatus.Null + # check if we have running requests. Assert False + haveRunningRequests = False for request in self._requests.values(): - tmp_status = request.params.get('FcStatus', consts.RequestStatus.Null) - if not tmp_status & consts.RequestStatus.MaskProcessed: - status = consts.RequestStatus.Started + if not request.params['FcStatus'] & consts.RequestStatus.Completed: + haveRunningRequests = True break - if status == consts.RequestStatus.Null: + if not haveRunningRequests: self._log.info(consts.LogMessages.AllRequestsCompleted) break @@ -1353,7 +1385,7 @@ ): """Requests a key from the node @param uri: (str) uri of the file to request (may contain prefixes like 'freenet:' or 'http://') - @param messageSubType: (L{consts.RequestSubType}) sub type of the message + @param messageSubType: (L{consts.RequestType}) sub type of the message @param userData: any non persistent data to associate to the request or None @param persistentUserData: any string to associate to the request as persistent data or None @param filenameCollision: what to do if the disk target alreaady exists. One of the FilenameCollision.* consts @@ -1426,7 +1458,7 @@ """ return self.clientGet( uri, - consts.RequestSubType.GetData, + consts.RequestType.GetData, userData, persistentUserData, consts.FilenameCollision.HandleNever, @@ -1495,7 +1527,7 @@ """ return self.clientGet( uri, - consts.RequestSubType.GetFile, + consts.RequestType.GetFile, userData, persistentUserData, filenameCollision, @@ -1556,7 +1588,7 @@ # how to retrieve meta info about a key? ...idea is to provoke a GetFailed (TooBig) return self.clientGet( uri, - consts.RequestSubType.GetKeyInfo, + consts.RequestType.GetKeyInfo, userData, persistentUserData, consts.FilenameCollision.HandleNever, @@ -1648,10 +1680,9 @@ persistentUserData='', ): """""" - return self.clientPut( consts.KeyType.CHK, - consts.RequestSubType.Put, + consts.RequestType.Put, userData, persistentUserData, data, @@ -1692,7 +1723,7 @@ ): return self.clientPut( consts.KeyType.CHK, - consts.RequestSubType.Put, + consts.RequestType.Put, userData, persistentUserData, None, @@ -1752,8 +1783,44 @@ ## USK ClientPut related methods ## ######################################################## - def uskPutData(self): - pass + def uskPutData(self, + data, + insertURI, + + contentType=None, + dontCompress=None, + maxRetries=None, + persistence=consts.Persistence.Connection, + priorityClass=consts.Priority.Medium, + targetFilename=None, + + userData=None, + persistentUserData='' + + + ): + return self.clientPut( + insertURI, + #insertURI + 'foo/0/', + consts.RequestType.Put, + userData, + persistentUserData, + data, + + # fcp params + ContentType=contentType, + DataLength=len(data), + #EarlyEncode='false', + #GetCHKOnly='false', + Global=False, + Identifier=None, + MaxRetries=maxRetries, + DontCompress=dontCompress, + Persistence=persistence, + TargetFilename=targetFilename, + UploadFrom=consts.UploadFrom.Direct, + Verbosity=consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression, + ) def uskPutDir(self): pass @@ -1986,6 +2053,7 @@ consts.Message.GetPluginInfo, FcModified={}, FcStatus=consts.RequestStatus.Pending, + FcType=consts.RequestType.PluginInfo, Identifier=identifier, PluginName=pluginName, Detailed=detailed, @@ -2007,6 +2075,7 @@ consts.Message.GetPluginInfo, FcModified={}, FcStatus=consts.RequestStatus.Pending, + FcType=consts.RequestType.PluginMessage, Identifier=identifier, PluginName=pluginName, **params @@ -2024,6 +2093,7 @@ ## others ## ########################################################## + #TODO: kick out request prefix (use FcType instead) def generateKeypair(self, keypairType=consts.KeyType.SSK): """ @param keypairType: type of keypair to generate (either L{consts.KeyType.SSK} or L{consts.KeyType.SSK}) @@ -2040,6 +2110,7 @@ consts.Message.GenerateSSK, FcModified={}, FcStatus=consts.RequestStatus.Pending, + FcType=consts.RequestType.GenerateKeypair, Identifier=identifier, ) self._requests[identifier] = msg @@ -2058,8 +2129,7 @@ nodeHello = c.connect() if nodeHello is not None: - - + #for i in xrange(10): # c.next() @@ -2088,9 +2158,7 @@ # c.next() #testGetData() - - - + def testGetFile(): filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test.jpg') print filename @@ -2152,8 +2220,7 @@ # c.next() #testChkPutData() - - + def testChkPutFile(): fpath = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test.jpg') @@ -2171,7 +2238,30 @@ #testChkPutFile() + def testUskPutData(): + def cb(event, request): + insertURI = request['InsertURI'] + identifier = c.uskPutData( + 'foo', + insertURI + 'foo/0/', + ) + + c.events.KeypairGenerated += cb + c.generateKeypair(keypairType=consts.KeyType.USK) + + #identifier = c.uskPutData( + #'foo1', + #'USK@dkbB9DSr6R2WWs0MFsB9BJvN2cRjNxSboanDQNMJVNc,uIi9-1JrCLZ~6MLa8UrxQCMLptu~PzL59hAtorUIStw,AQECAAE/foo/0/', + #) + c.run() + + #for i in xrange(500): + # c.next() + + #testUskPutData() + + def testConfigData(): from fcp2_0_config import Config This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-06 10:52:03
|
Revision: 156 http://fclient.svn.sourceforge.net/fclient/?rev=156&view=rev Author: jurner Date: 2008-02-06 02:52:05 -0800 (Wed, 06 Feb 2008) Log Message: ----------- more fine grained status and type flags for requests Modified Paths: -------------- trunk/sandbox/fcp/fcp2_0_consts.py Modified: trunk/sandbox/fcp/fcp2_0_consts.py =================================================================== --- trunk/sandbox/fcp/fcp2_0_consts.py 2008-02-05 16:00:48 UTC (rev 155) +++ trunk/sandbox/fcp/fcp2_0_consts.py 2008-02-06 10:52:05 UTC (rev 156) @@ -298,9 +298,11 @@ @cvar Started: the request has started @cvar Compressing: the request is about to be compressed @cvar Compressed: compressing is completed - @cvar Complete: the request has completed successfuly + @cvar Success: the request has completed successfuly @cvar Error: the request has completed with an error - @cvar Removed: the request is no longer present in the client (and on the nodes queue) + @cvar Completed: processing of the request is completed + @cvar Removed: the request is no longer present in the nodes queue. The client will remove the request + from its own queue as soon as all event listeners have been notified. @cvar MaskProcessed: bitmask checking if a request is completely processed (either successfuly completed or completed with an error or removed) @@ -313,25 +315,31 @@ Started = 0x2 Compressing = 0x4 Compressed = 0x8 - Complete = 0x10 + Success = 0x10 Error = 0x20 - Removed = 0x40 - - MaskProcessed = Complete | Error | Removed + + Completed =0x10000000 + Removed = 0x2000000 + - -class RequestSubType: - """Consts indicating the subtype of a message""" +class RequestType: + """Consts indicating the type of a request""" Null = 0 - GetData = 1 - GetFile = 2 - GetKeyInfo = 3 - Put = 4 - PutDiskDir = 5 - PutComplexDir = 6 + GetData = 0x1 + GetFile = 0x2 + GetKeyInfo = 0x4 + Put = 0x8 + PutDiskDir = 0x10 + PutComplexDir = 0x20 + GenerateSSKKeypair = GenerateKeypair = 0x1000 + GenerateUSKKeypair = 0x2000 + + PluginInfo = 0x2000000 + PluginMessage = 0x4000000 + #TODO: no idea how fcp handles strings as in <Peer volatile.status=CONNECTED> # all I could find in the sources where these constants as in PEER_NODE_STATUS_CONNECTED # in --> freenet/node/PeerManager.java This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-05 16:00:52
|
Revision: 155 http://fclient.svn.sourceforge.net/fclient/?rev=155&view=rev Author: jurner Date: 2008-02-05 08:00:48 -0800 (Tue, 05 Feb 2008) Log Message: ----------- added request compression events Modified Paths: -------------- trunk/sandbox/fcp/fcp2_0_events.py Modified: trunk/sandbox/fcp/fcp2_0_events.py =================================================================== --- trunk/sandbox/fcp/fcp2_0_events.py 2008-02-05 16:00:15 UTC (rev 154) +++ trunk/sandbox/fcp/fcp2_0_events.py 2008-02-05 16:00:48 UTC (rev 155) @@ -68,6 +68,12 @@ class RequestCompleted(events.Event): """A request has been completed""" + class RequestCompressionStarted(events.Event): + """Compressing of a request has started""" + + class RequestCompressionFinished(events.Event): + """Compressing of a request is finished""" + class RequestFailed(events.Event): """A request failed""" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-05 16:00:10
|
Revision: 154 http://fclient.svn.sourceforge.net/fclient/?rev=154&view=rev Author: jurner Date: 2008-02-05 08:00:15 -0800 (Tue, 05 Feb 2008) Log Message: ----------- adapt to request status flag changes Modified Paths: -------------- trunk/sandbox/fcp/test_fcp/test_fcp2_0_client.py Modified: trunk/sandbox/fcp/test_fcp/test_fcp2_0_client.py =================================================================== --- trunk/sandbox/fcp/test_fcp/test_fcp2_0_client.py 2008-02-05 15:59:49 UTC (rev 153) +++ trunk/sandbox/fcp/test_fcp/test_fcp2_0_client.py 2008-02-05 16:00:15 UTC (rev 154) @@ -604,7 +604,7 @@ self.assertHasNextEvent( self.fcpClient.events.RequestFailed, consts.Message.ClientGet, - ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Complete | consts.RequestStatus.Error | consts.RequestStatus.Removed) + ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Error | consts.RequestStatus.Removed) ) self.assertHasNextEvent(None) @@ -627,7 +627,7 @@ self.assertHasNextEvent( self.fcpClient.events.RequestFailed, consts.Message.ClientGet, - ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Complete | consts.RequestStatus.Error), + ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Error), ) self.failUnless(myIdentifier in allRequests) self.assertHasNextEvent(None) @@ -715,7 +715,7 @@ self.assertHasNextEvent( self.fcpClient.events.RequestFailed, consts.Message.ClientGet, - ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Complete | consts.RequestStatus.Error | consts.RequestStatus.Removed) + ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Error | consts.RequestStatus.Removed) ) self.failIf(myIdentifier in allRequests) self.assertHasNextEvent(None) @@ -824,7 +824,7 @@ self.assertHasNextEvent( self.fcpClient.events.RequestFailed, consts.Message.ClientGet, - ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Complete | consts.RequestStatus.Error | consts.RequestStatus.Removed) + ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Error | consts.RequestStatus.Removed) ) self.assertHasNextEvent(None) @@ -906,7 +906,7 @@ # status of our request should be set to removed emidiately, but it should # not be removed from the client - self.assertEqual(myRequest['FcStatus'], consts.RequestStatus.Removed) + self.assertEqual(myRequest['FcStatus'], consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Removed) self.failUnless(myIdentifier in self.fcpClient.getRequests()) # client schould send a RemovePersistentRequest This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-05 15:59:43
|
Revision: 153 http://fclient.svn.sourceforge.net/fclient/?rev=153&view=rev Author: jurner Date: 2008-02-05 07:59:49 -0800 (Tue, 05 Feb 2008) Log Message: ----------- adapt to request status flag changes Modified Paths: -------------- trunk/sandbox/fcp/fcp2_0_consts.py Modified: trunk/sandbox/fcp/fcp2_0_consts.py =================================================================== --- trunk/sandbox/fcp/fcp2_0_consts.py 2008-02-05 15:58:32 UTC (rev 152) +++ trunk/sandbox/fcp/fcp2_0_consts.py 2008-02-05 15:59:49 UTC (rev 153) @@ -166,7 +166,7 @@ @cvar HandleNever: don't handle filename collisions @cvar HandleRename: rename file on collisions @cvar MaskHandle: bitmask indicating if collisions are hadled or not - @cvar CollisonHandled: if this bit is set, a collision has been handled + @cvar CollisonHandled: if this bit is set, a collision has actually been handled """ HandleNever = 0x0 HandleRename = 0x1 @@ -187,8 +187,6 @@ TypesAll = (SSK, KSK, CHK, USK, SVK) - - class LogMessages: """Strings used for log infos""" @@ -275,14 +273,13 @@ UnknownNodeIdentifier = 'UnknownNodeIdentifier' UnknownPeerNoteType = 'UnknownPeerNoteType' URIGenerated = 'URIGenerated' - - + # client s (internal use only) ClientSocketTimeout = 1 ClientSocketDied = 2 ClientDisconnected = 3 - ClientRequestMessages = ( + ClientKeyRequestMessages = ( ClientGet, ClientPut, ClientPutDiskDir, @@ -294,30 +291,35 @@ ) - class RequestStatus: """Request status flags @cvar Null: no status @cvar Pending: the request is not started yet + @cvar Started: the request has started @cvar Compressing: the request is about to be compressed @cvar Compressed: compressing is completed - @cvar Complete: the request is completed - @cvar Error: an error occured while processing ther request + @cvar Complete: the request has completed successfuly + @cvar Error: the request has completed with an error @cvar Removed: the request is no longer present in the client (and on the nodes queue) + @cvar MaskProcessed: bitmask checking if a request is completely processed (either + successfuly completed or completed with an error or removed) + @note: the FcStatus member of the params dict of a request should contain one or more of the bitflags it picked up while running through the client. """ Null = 0x0 Pending = 0x1 - Compressing = 0x2 - Compressed = 0x4 - Started = 0x8 + Started = 0x2 + Compressing = 0x4 + Compressed = 0x8 Complete = 0x10 Error = 0x20 Removed = 0x40 - + + MaskProcessed = Complete | Error | Removed + class RequestSubType: """Consts indicating the subtype of a message""" @@ -330,7 +332,6 @@ PutComplexDir = 6 - #TODO: no idea how fcp handles strings as in <Peer volatile.status=CONNECTED> # all I could find in the sources where these constants as in PEER_NODE_STATUS_CONNECTED # in --> freenet/node/PeerManager.java @@ -349,10 +350,12 @@ ConnError = 12 Disconnecting = 13 + class PeerNoteType: """All known peer note types""" Private = '1' + class Persistence: Connection = 'connection' Reboot = 'reboot' @@ -384,7 +387,6 @@ PriorityClass = 0x2 - class ReturnType: Direct = 'direct' Disk = 'disk' This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-05 15:59:03
|
Revision: 152 http://fclient.svn.sourceforge.net/fclient/?rev=152&view=rev Author: jurner Date: 2008-02-05 07:58:32 -0800 (Tue, 05 Feb 2008) Log Message: ----------- another comb-over status flags on error or remove RequestStatus.Comnplete should not be set 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-05 15:21:54 UTC (rev 151) +++ trunk/sandbox/fcp/fcp2_0_client.py 2008-02-05 15:58:32 UTC (rev 152) @@ -702,10 +702,12 @@ elif code == consts.ProtocolError.NoSuchPlugin: if initialRequest.name == consts.Message.PluginInfo: del self._requests[requestIdentifier] + initialRequest['FcStatus'] |= consts.RequestStatus.Error | consts.RequestStatus.Complete | consts.RequestStatus.Removed self.events.PluginInfoFailed(initialRequest) return True elif initialRequest.name == consts.Message.FCPPluginMessage: del self._requests[requestIdentifier] + initialRequest['FcStatus'] |= consts.RequestStatus.Error | consts.RequestStatus.Complete | consts.RequestStatus.Removed self.events.PluginMessageFailed(initialRequest) return True @@ -889,7 +891,7 @@ self.events.RequestCompleted(initialRequest) else: initialRequest['FcErrorMessage'] = msg - initialRequest['FcStatus'] |= consts.RequestStatus.Complete | consts.RequestStatus.Error + initialRequest['FcStatus'] |= consts.RequestStatus.Error self.events.RequestFailed(initialRequest) return True @@ -1031,7 +1033,7 @@ if initialRequest is None: return False - initialRequest['FcStatus'] |= consts.RequestStatus.Complete | consts.RequestStatus.Error + initialRequest['FcStatus'] |= consts.RequestStatus.Error # Fcp removes requests from queue with Persistence.Connection.. so do we if initialRequest.params.get('Persistence', consts.Persistence.Connection) == consts.Persistence.Connection: @@ -1129,6 +1131,7 @@ return False del self._pluginRequests[requestIdentifier] + initialRequest['FcStatus'] |= consts.RequestStatus.Completed self.events.PluginInfo(msg) return True @@ -1137,6 +1140,7 @@ return False del self._requests[requestIdentifier] + initialRequest['FcStatus'] |= consts.RequestStatus.Completed self.events.PluginMessage(msg) return True @@ -1163,8 +1167,7 @@ #TODO:no idea if the node may pass uris with prefixes like 'freenet:'... strip it anyways insertURI = self.Uri(msg['InsertURI']).uri requestURI = self.Uri(msg['RequestURI']).uri - - + createUSK = True if requestIdentifier.startswith(self.IdentifierPrefixGenerateUSK) else False if createUSK: insertURI = requestURI.replace(consts.KeyType.SSK, consts.KeyType.USK, 1) @@ -1176,6 +1179,7 @@ msg['InsertURI'] = insertURI msg['RequestURI'] = requestURI msg['FcKeyType'] = keyType + msg['FcStatus'] |= consts.RequestStatus.Completed self.events.KeypairGenerated(msg) return True @@ -1231,15 +1235,15 @@ # check if we have running requests - # assert all requests have completed - status = consts.RequestStatus.Complete + # assert no requests has completed + status = consts.RequestStatus.Null for request in self._requests.values(): tmp_status = request.params.get('FcStatus', consts.RequestStatus.Null) - if not tmp_status & consts.RequestStatus.Complete: - status = consts.RequestStatus.Null + if not tmp_status & consts.RequestStatus.MaskProcessed: + status = consts.RequestStatus.Started break - if status == consts.RequestStatus.Complete: + if status == consts.RequestStatus.Null: self._log.info(consts.LogMessages.AllRequestsCompleted) break @@ -1574,7 +1578,7 @@ #TODO: persists until connection is closed... can this request be removed? - # Anyway. It is not listed in consts.Message.ClientRequestMessages, + # Anyway. It is not listed in consts.Message.ClientKeyRequestMessages, # so any attempts will fail (wink) def subscribeUSK(self, uri, dontPoll=True): """Asks the node to notify the client when an USK is updated @@ -1787,12 +1791,12 @@ @param persistentUserData: (str) persistent user data or None @param priorityClass: (L{consts.Priority}) new priority or None - @note: you can use this method to modify requests as listed in L{consts.Message.ClientRequestMessages}. + @note: you can use this method to modify requests as listed in L{consts.Message.ClientKeyRequestMessages}. All attempts to modify other requests will fail @note: a RequestModified event is triggered as soon as the request has actually been modified """ initialRequest = self._requests[requestIdentifier] - if initialRequest.name not in consts.Message.ClientRequestMessages: + if initialRequest.name not in consts.Message.ClientKeyRequestMessages: raise ValueError('Can not modify request: %s' % initialRequest.name) msg = self.Message( @@ -1813,14 +1817,14 @@ """Removes a request @param requestIdentifier: (str) identifier of the request to remove - @note: you can use this method to remove requests as listed in L{consts.Message.ClientRequestMessages} + @note: you can use this method to remove requests as listed in L{consts.Message.ClientKeyRequestMessages} or L{consts.Message.ClientPluginMessages}. All attempts to remove other requests will fail - @note: if the request is one the requests listed in L{consts.Message.ClientRequestMessages} + @note: if the request is one the requests listed in L{consts.Message.ClientKeyRequestMessages} a RequestRemoved event is triggered as soon as the request has actually been removed """ initialRequest = self._requests[requestIdentifier] - if initialRequest.name in consts.Message.ClientRequestMessages: - initialRequest['FcStatus'] = consts.RequestStatus.Removed + initialRequest['FcStatus'] |= consts.RequestStatus.Removed + if initialRequest.name in consts.Message.ClientKeyRequestMessages: self.sendMessage( consts.Message.RemovePersistentRequest, Global=False, @@ -1838,11 +1842,11 @@ @param requestMessage: (L{fcp2_0_message.Message}) @return: (str) request identifier - @note: you can use this method to resend requests as listed in L{consts.Message.ClientRequestMessages} + @note: you can use this method to resend requests as listed in L{consts.Message.ClientKeyRequestMessages} or L{consts.Message.ClientPluginMessages}. All attempts to resend other requests will fail @note: the request passed is not removed in the call. Use L{removeRequest} if necessary """ - if requestMessage.name in consts.Message.ClientRequestMessages: + if requestMessage.name in consts.Message.ClientKeyRequestMessages: self._registerRequest( requestMessage, requestMessage['FcUserData'], @@ -1981,6 +1985,7 @@ msg = self.Message( consts.Message.GetPluginInfo, FcModified={}, + FcStatus=consts.RequestStatus.Pending, Identifier=identifier, PluginName=pluginName, Detailed=detailed, @@ -2001,6 +2006,7 @@ msg = self.Message( consts.Message.GetPluginInfo, FcModified={}, + FcStatus=consts.RequestStatus.Pending, Identifier=identifier, PluginName=pluginName, **params @@ -2033,6 +2039,7 @@ msg = self.Message( consts.Message.GenerateSSK, FcModified={}, + FcStatus=consts.RequestStatus.Pending, Identifier=identifier, ) self._requests[identifier] = msg This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-05 15:21:55
|
Revision: 151 http://fclient.svn.sourceforge.net/fclient/?rev=151&view=rev Author: jurner Date: 2008-02-05 07:21:54 -0800 (Tue, 05 Feb 2008) Log Message: ----------- adapt to request status flags changes Modified Paths: -------------- trunk/sandbox/fcp/test_fcp/test_fcp2_0_client.py Modified: trunk/sandbox/fcp/test_fcp/test_fcp2_0_client.py =================================================================== --- trunk/sandbox/fcp/test_fcp/test_fcp2_0_client.py 2008-02-05 15:21:08 UTC (rev 150) +++ trunk/sandbox/fcp/test_fcp/test_fcp2_0_client.py 2008-02-05 15:21:54 UTC (rev 151) @@ -478,7 +478,8 @@ myIdentifier = self.fcpClient.getData( 'arbitrary-uri', ) - myRequest = self.fcpClient.getRequest(myIdentifier) + myRequest = self.fcpClient.getRequest(myIdentifier) + allRequests = self.fcpClient.getRequests() # respond to the file request self.sendResponseMessage( @@ -489,7 +490,7 @@ self.assertHasNextEvent( self.fcpClient.events.RequestStarted, consts.Message.ClientGet, - ('FcStatus', consts.RequestStatus.Started) + ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started) ) self.assertHasNextEvent(None) @@ -530,15 +531,44 @@ Global='false', DataLength=len(data), ) + + # client should complete and remove the request self.assertHasNextEvent( self.fcpClient.events.RequestCompleted, consts.Message.ClientGet, - ('FcStatus', consts.RequestStatus.Complete | consts.RequestStatus.Removed), + ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Complete | consts.RequestStatus.Removed), data=data ) + self.failIf(myIdentifier in allRequests) self.assertHasNextEvent(None) - + + # cheat a bit to test peristence == Forever (client should not remove request) + allRequests[myIdentifier] =myRequest + myRequest['Persistence'] = consts.Persistence.Forever + myRequest['FcStatus'] &= ~(consts.RequestStatus.Complete | consts.RequestStatus.Removed) + self.sendResponseMessage( + 'AllData', + data=data, + Identifier=myIdentifier, + Global='false', + DataLength=len(data), + ) + + # client should complete but not remove the request + self.assertHasNextEvent( + self.fcpClient.events.RequestCompleted, + consts.Message.ClientGet, + ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Complete), + data=data + ) + self.failUnless(myIdentifier in allRequests) + self.assertHasNextEvent(None) + + + + + def testGetData_Failure(self): # request a arbitrary file @@ -546,6 +576,7 @@ 'arbitrary-uri', ) myRequest = self.fcpClient.getRequest(myIdentifier) + allRequests = self.fcpClient.getRequests() # respond to the file request self.sendResponseMessage( @@ -556,7 +587,7 @@ self.assertHasNextEvent( self.fcpClient.events.RequestStarted, consts.Message.ClientGet, - ('FcStatus', consts.RequestStatus.Started) + ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started) ) self.assertHasNextEvent(None) @@ -568,14 +599,40 @@ Global='false', # blah.. more here ) + + # client should complete request and remove it self.assertHasNextEvent( self.fcpClient.events.RequestFailed, consts.Message.ClientGet, - ('FcStatus', consts.RequestStatus.Complete | consts.RequestStatus.Error | consts.RequestStatus.Removed) + ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Complete | consts.RequestStatus.Error | consts.RequestStatus.Removed) ) self.assertHasNextEvent(None) + #return + + # cheat a bit to test peristence == Forever (client should not remove request) + + allRequests[myIdentifier] =myRequest + myRequest['Persistence'] = consts.Persistence.Forever + myRequest['FcStatus'] &= ~(consts.RequestStatus.Error | consts.RequestStatus.Removed) + self.sendResponseMessage( + 'GetFailed', + Code='28', # All data not found + Identifier=myIdentifier, + Global='false', + # blah.. more here + ) + + # client should complete but not remove the request + self.assertHasNextEvent( + self.fcpClient.events.RequestFailed, + consts.Message.ClientGet, + ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Complete | consts.RequestStatus.Error), + ) + self.failUnless(myIdentifier in allRequests) + self.assertHasNextEvent(None) + def testGetFile_Success(self): # request a arbitrary file @@ -584,6 +641,8 @@ 'arbitryry.txt' ) myRequest = self.fcpClient.getRequest(myIdentifier) + allRequests = self.fcpClient.getRequests() + self.assertHasNextMessage(consts.Message.ClientGet) # respond to the file request @@ -595,7 +654,7 @@ self.assertHasNextEvent( self.fcpClient.events.RequestStarted, consts.Message.ClientGet, - ('FcStatus', consts.RequestStatus.Started) + ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started) ) self.assertHasNextEvent(None) @@ -614,8 +673,9 @@ self.assertHasNextEvent( self.fcpClient.events.RequestCompleted, consts.Message.ClientGet, - ('FcStatus', consts.RequestStatus.Complete | consts.RequestStatus.Removed) + ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Complete | consts.RequestStatus.Removed) ) + self.failIf(myIdentifier in allRequests) self.assertHasNextEvent(None) @@ -627,6 +687,8 @@ 'arbitryry.txt' ) myRequest = self.fcpClient.getRequest(myIdentifier) + allRequests = self.fcpClient.getRequests() + self.assertHasNextMessage(consts.Message.ClientGet) # respond to the file request @@ -638,7 +700,7 @@ self.assertHasNextEvent( self.fcpClient.events.RequestStarted, consts.Message.ClientGet, - ('FcStatus', consts.RequestStatus.Started) + ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started) ) self.assertHasNextEvent(None) @@ -653,8 +715,9 @@ self.assertHasNextEvent( self.fcpClient.events.RequestFailed, consts.Message.ClientGet, - ('FcStatus', consts.RequestStatus.Complete | consts.RequestStatus.Error | consts.RequestStatus.Removed) + ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Complete | consts.RequestStatus.Error | consts.RequestStatus.Removed) ) + self.failIf(myIdentifier in allRequests) self.assertHasNextEvent(None) @@ -667,6 +730,8 @@ persistence=consts.Persistence.Forever, # cheat a bit, so we can test multiple cases ) myRequest = self.fcpClient.getRequest(myIdentifier) + allRequests = self.fcpClient.getRequests() + self.assertHasNextMessage(consts.Message.ClientGet) # respond to the file request @@ -678,7 +743,7 @@ self.assertHasNextEvent( self.fcpClient.events.RequestStarted, consts.Message.ClientGet, - ('FcStatus', consts.RequestStatus.Started) + ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started) ) self.assertHasNextEvent(None) @@ -697,11 +762,13 @@ self.assertHasNextEvent( self.fcpClient.events.RequestCompleted, consts.Message.ClientGet, - ('FcStatus', consts.RequestStatus.Complete | consts.RequestStatus.Removed) + ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Complete) ) + self.failIf(myIdentifier not in allRequests) self.assertHasNextEvent(None) # test specdial case where ProtocolError.TooBig is handled as success + myRequest['FcStatus'] &= ~(consts.RequestStatus.Complete) self.sendResponseMessage( 'GetFailed', Code='21', # Too big @@ -712,11 +779,18 @@ self.assertHasNextEvent( self.fcpClient.events.RequestCompleted, consts.Message.ClientGet, - ('FcStatus', consts.RequestStatus.Complete) + ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Complete) ) self.assertHasNextEvent(None) + + # cheat a bit to test persistence == Connection + myRequest['Persistence'] = consts.Persistence.Connection + myRequest['FcStatus'] = consts.RequestStatus.Started + + ########################################### + ########################################### - + def testGetKeyInfo_Failure(self): # request a arbitrary file @@ -735,7 +809,7 @@ self.assertHasNextEvent( self.fcpClient.events.RequestStarted, consts.Message.ClientGet, - ('FcStatus', consts.RequestStatus.Started) + ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started) ) self.assertHasNextEvent(None) @@ -750,7 +824,7 @@ self.assertHasNextEvent( self.fcpClient.events.RequestFailed, consts.Message.ClientGet, - ('FcStatus', consts.RequestStatus.Complete | consts.RequestStatus.Error | consts.RequestStatus.Removed) + ('FcStatus', consts.RequestStatus.Pending | consts.RequestStatus.Started | consts.RequestStatus.Complete | consts.RequestStatus.Error | consts.RequestStatus.Removed) ) self.assertHasNextEvent(None) @@ -892,12 +966,12 @@ 'arbitryry.txt' ) myRequest = self.fcpClient.getRequest(myIdentifier) - identifier = myRequest['Identifier'] - + allRequests = self.fcpClient.getRequests() + self.fcpClient.removeRequest(myIdentifier) self.sendResponseMessage( 'PersistentRequestRemoved', - Identifier=identifier, + Identifier=myIdentifier, ) self.messages = [] self.events = [] @@ -905,7 +979,7 @@ # throw a PersistentGet at the client with the identifier we hacked self.sendResponseMessage( 'PersistentGet', - Identifier=identifier, + Identifier=myIdentifier, Global='false', ReturnType='disk', Verbosity='1', @@ -918,9 +992,11 @@ msg = self.assertHasNextEvent( self.fcpClient.events.RequestRestored, consts.Message.ClientGet, - ('Identifier', myIdentifier) + ('Identifier', myIdentifier), + ('FcStatus', consts.RequestStatus.Started), # no RequestStatus.Pending flag should be set here ) + self.failUnless(myIdentifier in allRequests) self.assertHasNextEvent(None) #*********************************************************************************** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-05 15:21:02
|
Revision: 150 http://fclient.svn.sourceforge.net/fclient/?rev=150&view=rev Author: jurner Date: 2008-02-05 07:21:08 -0800 (Tue, 05 Feb 2008) Log Message: ----------- another comb-over the request status flags requests now pick up one after the other in the run through the client 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-05 15:19:28 UTC (rev 149) +++ trunk/sandbox/fcp/fcp2_0_client.py 2008-02-05 15:21:08 UTC (rev 150) @@ -311,7 +311,7 @@ 'FcPersistentUserData': persistentUserData, # any user defined persistent data # non persistent params - 'FcStatus': consts.RequestStatus.Pending, + 'FcStatus': consts.RequestStatus.Null, 'FcErrorMessage': None, # did an error occur? 'FcUserData': userData, # any user defined runtime data here @@ -372,6 +372,7 @@ ) msg['ClientToken'] = self.FcParams.messageToParams(msg) + msg['FcStatus'] |= consts.RequestStatus.Pending msg['Identifier'] = identifier self._requests[identifier] = msg @@ -394,7 +395,7 @@ fcParams[self.FcParams.IPersistentUserData], fcParams[self.FcParams.IFilenameCollision], ) - + #FIX: remove Started param from PersistentGet / Put if msg.name == consts.Message.PersistentGet: del msg.params['Started'] @@ -843,7 +844,7 @@ if initialRequest is None: return False - initialRequest['FcStatus'] = consts.RequestStatus.Complete + initialRequest['FcStatus'] |= consts.RequestStatus.Complete # Fcp removes requests from queue with Persistence.Connection.. so do we if initialRequest.params.get('Persistence', consts.Persistence.Connection) == consts.Persistence.Connection: initialRequest['FcStatus'] |= consts.RequestStatus.Removed @@ -857,13 +858,14 @@ if initialRequest is None: return False - initialRequest['FcStatus'] = consts.RequestStatus.Complete + initialRequest['FcStatus'] |= consts.RequestStatus.Complete initialRequest['FcMetadataContentType'] = msg.get('Metadata.ContentType', '') initialRequest['FcDataLength'] = msg.get('DataLength', '') if initialRequest['FcSubType'] != consts.RequestSubType.GetData: - initialRequest['FcStatus'] |= consts.RequestStatus.Removed + # Fcp removes requests from queue with Persistence.Connection.. so do we if initialRequest.params.get('Persistence', consts.Persistence.Connection) == consts.Persistence.Connection: + initialRequest['FcStatus'] |= consts.RequestStatus.Removed del self._requests[requestIdentifier] self.events.RequestCompleted(initialRequest) return True @@ -873,11 +875,9 @@ if initialRequest is None: return False - initialRequest['FcStatus'] = consts.RequestStatus.Null - # Fcp removes requests from queue with Persistence.Connection.. so do we if initialRequest.params.get('Persistence', consts.Persistence.Connection) == consts.Persistence.Connection: - initialRequest['FcStatus'] = consts.RequestStatus.Removed + initialRequest['FcStatus'] |= consts.RequestStatus.Removed del self._requests[requestIdentifier] # check if it is one of our requests for key information @@ -915,13 +915,13 @@ # restore request self._requests[requestIdentifier] = restoredRequest - restoredRequest['FcStatus'] = consts.RequestStatus.Started + restoredRequest['FcStatus'] |= consts.RequestStatus.Started self.events.RequestRestored(restoredRequest) return True # known request... filter out multiple PersistentGets - if initialRequest['FcStatus'] == consts.RequestStatus.Pending: - initialRequest['FcStatus'] = consts.RequestStatus.Started + if not initialRequest['FcStatus'] & consts.RequestStatus.Started: + initialRequest['FcStatus'] |= consts.RequestStatus.Started #TODO: update initialRequest with params from PersistentGet? @@ -930,48 +930,7 @@ return True - elif msg.name == consts.Message.PersistentPut: - - # unknown request... try to restore it - if initialRequest is None: - restoredRequest = self._restorePersistentRequestFromNode(msg) - - # not one of our requests... so cancel it - if restoredRequest is None or CancelPersistentRequests: - self.sendMessage( - consts.Message.RemovePersistentRequest, - Identifier=msg['Identifier'], - Global=msg['Global'], - ) - return True - - # determine initial message name - if restoredRequest['FcSubType'] == consts.RequestSubType.Put: - restoredRequest.name = consts.Message.ClientPut - elif restoredRequest['FcSubType'] == consts.RequestSubType.PutDiskDir: - restoredRequest.name = consts.Message.ClientPutDiskDir - elif restoredRequest['FcSubType'] == consts.RequestSubType.PutComplexDir: - restoredRequest.name = consts.Message.ClientPutComplexDir - - # restore request - self._requests[requestIdentifier] = restoredRequest - restoredRequest['FcStatus'] = consts.RequestStatus.Started - self.events.RequestRestored(restoredRequest) - return True - - # known request... filter out multiple PersistentGets - if initialRequest['FcStatus'] == consts.RequestStatus.Pending: - initialRequest['FcStatus'] = consts.RequestStatus.Started - - #TODO: update initialRequest with params from PersistentPut? - #TODO: update initialRequest with params from PersistentPut? - - self.events.RequestStarted(initialRequest) - return True - - return True - elif msg.name == consts.Message.PersistentRequestModified: if initialRequest is None: return False @@ -1007,7 +966,8 @@ if initialRequest is None: return False - #TODO: notify user ??? + #TODO: notify user ? + initialRequest['FcStatus'] |= consts.RequestStatus.Removed del self._requests[requestIdentifier] return True @@ -1026,17 +986,52 @@ ## put related - elif msg.name == consts.Message.URIGenerated: + elif msg.name == consts.Message.PersistentPut: + + # unknown request... try to restore it if initialRequest is None: - return False - initialRequest['URI'] = msg['URI'] + restoredRequest = self._restorePersistentRequestFromNode(msg) + + # not one of our requests... so cancel it + if restoredRequest is None or CancelPersistentRequests: + self.sendMessage( + consts.Message.RemovePersistentRequest, + Identifier=msg['Identifier'], + Global=msg['Global'], + ) + return True + + # determine initial message name + if restoredRequest['FcSubType'] == consts.RequestSubType.Put: + restoredRequest.name = consts.Message.ClientPut + elif restoredRequest['FcSubType'] == consts.RequestSubType.PutDiskDir: + restoredRequest.name = consts.Message.ClientPutDiskDir + elif restoredRequest['FcSubType'] == consts.RequestSubType.PutComplexDir: + restoredRequest.name = consts.Message.ClientPutComplexDir + + # restore request + self._requests[requestIdentifier] = restoredRequest + restoredRequest['FcStatus'] = consts.RequestStatus.Started + self.events.RequestRestored(restoredRequest) + return True + + # known request... filter out multiple PersistentGets + if not initialRequest['FcStatus'] & consts.RequestStatus.Started: + initialRequest['FcStatus'] |= consts.RequestStatus.Started + + #TODO: update initialRequest with params from PersistentPut? + + self.events.RequestStarted(initialRequest) + return True + return True + elif msg.name == consts.Message.PutFailed: if initialRequest is None: return False - initialRequest['FcStatus'] = consts.RequestStatus.Complete | consts.RequestStatus.Error + initialRequest['FcStatus'] |= consts.RequestStatus.Complete | consts.RequestStatus.Error # Fcp removes requests from queue with Persistence.Connection.. so do we if initialRequest.params.get('Persistence', consts.Persistence.Connection) == consts.Persistence.Connection: @@ -1064,7 +1059,7 @@ # TODO: StartupTime and CompletionTime are passed, but # as long as no corrosponding params are passed in DataFound # we ignore them - initialRequest['FcStatus'] = consts.RequestStatus.Complete + initialRequest['FcStatus'] |= consts.RequestStatus.Complete if initialRequest.params.get('Persistence', consts.Persistence.Connection) == consts.Persistence.Connection: initialRequest['FcStatus'] |= consts.RequestStatus.Removed @@ -1075,6 +1070,26 @@ return True + elif msg.name == consts.Message.URIGenerated: + if initialRequest is None: + return False + initialRequest['URI'] = msg['URI'] + return True + + elif msg.name == consts.Message.FinishedCompression: + if initialRequest is None: + return False + initialRequest['FcStatus'] |= consts.RequestStatus.Compressed + self.events.RequestCompressionFinished(initialRequest) + return True + + elif msg.name == consts.Message.StartedCompression: + if initialRequest is None: + return False + initialRequest['FcStatus'] |= consts.RequestStatus.Compressing + self.events.RequestCompressionStarted(initialRequest) + return True + #################################################### ## ## Peer related messages This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-05 15:19:27
|
Revision: 149 http://fclient.svn.sourceforge.net/fclient/?rev=149&view=rev Author: jurner Date: 2008-02-05 07:19:28 -0800 (Tue, 05 Feb 2008) Log Message: ----------- docs Modified Paths: -------------- trunk/sandbox/fcp/fcp2_0_consts.py Modified: trunk/sandbox/fcp/fcp2_0_consts.py =================================================================== --- trunk/sandbox/fcp/fcp2_0_consts.py 2008-02-05 12:27:53 UTC (rev 148) +++ trunk/sandbox/fcp/fcp2_0_consts.py 2008-02-05 15:19:28 UTC (rev 149) @@ -296,20 +296,31 @@ class RequestStatus: + """Request status flags + @cvar Null: no status + @cvar Pending: the request is not started yet + @cvar Compressing: the request is about to be compressed + @cvar Compressed: compressing is completed + @cvar Complete: the request is completed + @cvar Error: an error occured while processing ther request + @cvar Removed: the request is no longer present in the client (and on the nodes queue) + + @note: the FcStatus member of the params dict of a request should contain one or more + of the bitflags it picked up while running through the client. + """ Null = 0x0 Pending = 0x1 Compressing = 0x2 - Started = 0x4 - Complete = 0x8 - Error = 0x10 - Removed = 0x20 - RestoreFailed = 0x40 + Compressed = 0x4 + Started = 0x8 + Complete = 0x10 + Error = 0x20 + Removed = 0x40 + - class RequestSubType: """Consts indicating the subtype of a message""" - # some additional consts Null = 0 GetData = 1 GetFile = 2 @@ -362,6 +373,9 @@ @cvar Identifier: the identifier has been moodified @cvar PersistentUserData: thepersistent user data has been modified @cvar PriorityClass: the priority class has been modified + + @note: the FcModified member of the params dict of a request may contain + one or more of the bitflags """ Null = 0x0 Filename = 0x8 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-05 12:27:51
|
Revision: 148 http://fclient.svn.sourceforge.net/fclient/?rev=148&view=rev Author: jurner Date: 2008-02-05 04:27:53 -0800 (Tue, 05 Feb 2008) Log Message: ----------- adapt Modified Paths: -------------- trunk/sandbox/fcp/test_fcp/test_fcp2_0_client.py Modified: trunk/sandbox/fcp/test_fcp/test_fcp2_0_client.py =================================================================== --- trunk/sandbox/fcp/test_fcp/test_fcp2_0_client.py 2008-02-05 12:27:18 UTC (rev 147) +++ trunk/sandbox/fcp/test_fcp/test_fcp2_0_client.py 2008-02-05 12:27:53 UTC (rev 148) @@ -64,7 +64,7 @@ def connectClient(self): """Connects to the client""" - enum = self.fcpClient.connect(duration=0.2, timeout=0.1) + enum = self.fcpClient.iterConnect(duration=0.2, timeout=0.1) msg = enum.next() self.failIf(msg is not None) #NOTE: have to send directly via socket here (our sendResponseMessage @@ -198,8 +198,7 @@ # conect all events self.events = [] # events received from the client - for eventName in self.fcpClient.Events._events_: - event = getattr(self.fcpClient.events, eventName) + for event in self.fcpClient.events: event += self._captureEventsFromClient # capture all messages the client sent @@ -210,8 +209,7 @@ fcp2_0_client.socket = self.oldSocketModule # disconnect all events - for eventName in self.fcpClient.Events._events_: - event = getattr(self.fcpClient.events, eventName) + for event in self.fcpClient.events: event -= self._captureEventsFromClient # clean up tmpfiles for fpath in self.tmpfiles: os.remove(fpath) @@ -245,8 +243,30 @@ self.failUnless(self.socket.closed) - def testConnect_Failure(self): + + def testConnect(self): + nodeHello = self.fcpClient.connect(duration=0.2, timeout=0.1) + self.failIf(nodeHello is not None) + self.socket.sendResponseMessage( + 'NodeHello', + FCPVersion='2.0', + Node='Fred', + Version=str(self.fcpClient.ExpectedFcpVersion), + Revision='999999999999', + Build='9999999999', + ExRevision='9999999999', + Testnet='false', + CompressionCodecs='1', + ConnectionIdentifier='any', + NodeLanguage='en', + ) + nodeHello = self.fcpClient.connect(duration=0.2, timeout=0.1) + self.failIf(nodeHello is None) + + + def testIterConnect_Failure(self): + # simulate a failed connection attempt enum = self.fcpClient.connect(duration=0.2, timeout=0.1) t0 = time.time() @@ -274,10 +294,10 @@ self.failUnless(self.socket.closed) - def testConnect_Success(self): + def testIterConnect_Success(self): # simulate a successful connection attempt - enum = self.fcpClient.connect(duration=0.2, timeout=0.1) + enum = self.fcpClient.iterConnect(duration=0.2, timeout=0.1) msg = enum.next() self.failIf(msg is not None) @@ -394,7 +414,7 @@ def testVersionMismatch(self): # cheat a bit and reconnect client - enum = self.fcpClient.connect(duration=0.2, timeout=0.1) + enum = self.fcpClient.iterConnect(duration=0.2, timeout=0.1) msg = enum.next() self.failIf(msg is not None) @@ -449,7 +469,7 @@ self.failUnless(self.fcpClient.getRequests() ) myRequest = self.fcpClient.getRequest(myIdentifier) self.assertEqual(myIdentifier, myRequest['Identifier']) - self.assertEqual(myRequest['FcStatus'], consts.MessageStatus.Pending) + self.assertEqual(myRequest['FcStatus'], consts.RequestStatus.Pending) def testGetData_Success(self): @@ -469,7 +489,7 @@ self.assertHasNextEvent( self.fcpClient.events.RequestStarted, consts.Message.ClientGet, - ('FcStatus', consts.MessageStatus.Started) + ('FcStatus', consts.RequestStatus.Started) ) self.assertHasNextEvent(None) @@ -513,7 +533,7 @@ self.assertHasNextEvent( self.fcpClient.events.RequestCompleted, consts.Message.ClientGet, - ('FcStatus', consts.MessageStatus.Complete), + ('FcStatus', consts.RequestStatus.Complete | consts.RequestStatus.Removed), data=data ) self.assertHasNextEvent(None) @@ -536,7 +556,7 @@ self.assertHasNextEvent( self.fcpClient.events.RequestStarted, consts.Message.ClientGet, - ('FcStatus', consts.MessageStatus.Started) + ('FcStatus', consts.RequestStatus.Started) ) self.assertHasNextEvent(None) @@ -551,7 +571,7 @@ self.assertHasNextEvent( self.fcpClient.events.RequestFailed, consts.Message.ClientGet, - ('FcStatus', consts.MessageStatus.Error) + ('FcStatus', consts.RequestStatus.Complete | consts.RequestStatus.Error | consts.RequestStatus.Removed) ) self.assertHasNextEvent(None) @@ -575,7 +595,7 @@ self.assertHasNextEvent( self.fcpClient.events.RequestStarted, consts.Message.ClientGet, - ('FcStatus', consts.MessageStatus.Started) + ('FcStatus', consts.RequestStatus.Started) ) self.assertHasNextEvent(None) @@ -594,7 +614,7 @@ self.assertHasNextEvent( self.fcpClient.events.RequestCompleted, consts.Message.ClientGet, - ('FcStatus', consts.MessageStatus.Complete) + ('FcStatus', consts.RequestStatus.Complete | consts.RequestStatus.Removed) ) self.assertHasNextEvent(None) @@ -618,7 +638,7 @@ self.assertHasNextEvent( self.fcpClient.events.RequestStarted, consts.Message.ClientGet, - ('FcStatus', consts.MessageStatus.Started) + ('FcStatus', consts.RequestStatus.Started) ) self.assertHasNextEvent(None) @@ -633,7 +653,7 @@ self.assertHasNextEvent( self.fcpClient.events.RequestFailed, consts.Message.ClientGet, - ('FcStatus', consts.MessageStatus.Error) + ('FcStatus', consts.RequestStatus.Complete | consts.RequestStatus.Error | consts.RequestStatus.Removed) ) self.assertHasNextEvent(None) @@ -658,7 +678,7 @@ self.assertHasNextEvent( self.fcpClient.events.RequestStarted, consts.Message.ClientGet, - ('FcStatus', consts.MessageStatus.Started) + ('FcStatus', consts.RequestStatus.Started) ) self.assertHasNextEvent(None) @@ -677,7 +697,7 @@ self.assertHasNextEvent( self.fcpClient.events.RequestCompleted, consts.Message.ClientGet, - ('FcStatus', consts.MessageStatus.Complete) + ('FcStatus', consts.RequestStatus.Complete | consts.RequestStatus.Removed) ) self.assertHasNextEvent(None) @@ -692,7 +712,7 @@ self.assertHasNextEvent( self.fcpClient.events.RequestCompleted, consts.Message.ClientGet, - ('FcStatus', consts.MessageStatus.Complete) + ('FcStatus', consts.RequestStatus.Complete) ) self.assertHasNextEvent(None) @@ -715,7 +735,7 @@ self.assertHasNextEvent( self.fcpClient.events.RequestStarted, consts.Message.ClientGet, - ('FcStatus', consts.MessageStatus.Started) + ('FcStatus', consts.RequestStatus.Started) ) self.assertHasNextEvent(None) @@ -730,7 +750,7 @@ self.assertHasNextEvent( self.fcpClient.events.RequestFailed, consts.Message.ClientGet, - ('FcStatus', consts.MessageStatus.Error) + ('FcStatus', consts.RequestStatus.Complete | consts.RequestStatus.Error | consts.RequestStatus.Removed) ) self.assertHasNextEvent(None) @@ -812,7 +832,7 @@ # status of our request should be set to removed emidiately, but it should # not be removed from the client - self.assertEqual(myRequest['FcStatus'], consts.MessageStatus.Removed) + self.assertEqual(myRequest['FcStatus'], consts.RequestStatus.Removed) self.failUnless(myIdentifier in self.fcpClient.getRequests()) # client schould send a RemovePersistentRequest @@ -873,7 +893,7 @@ ) myRequest = self.fcpClient.getRequest(myIdentifier) identifier = myRequest['Identifier'] - + self.fcpClient.removeRequest(myIdentifier) self.sendResponseMessage( 'PersistentRequestRemoved', @@ -895,7 +915,7 @@ ) # check if the client restored the request - self.assertHasNextEvent( + msg = self.assertHasNextEvent( self.fcpClient.events.RequestRestored, consts.Message.ClientGet, ('Identifier', myIdentifier) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-05 12:27:14
|
Revision: 147 http://fclient.svn.sourceforge.net/fclient/?rev=147&view=rev Author: jurner Date: 2008-02-05 04:27:18 -0800 (Tue, 05 Feb 2008) Log Message: ----------- fix: added modified dict to all requests 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-05 12:26:13 UTC (rev 146) +++ trunk/sandbox/fcp/fcp2_0_client.py 2008-02-05 12:27:18 UTC (rev 147) @@ -596,7 +596,7 @@ @return: True if the message was handled, False otherwise """ - CancelPersistentRequests = 1 # for testing... if True, cancels all PersistentRequests + CancelPersistentRequests = 0 # for testing... if True, cancels all PersistentRequests if msg.name == consts.Message.ClientSocketTimeout: return True @@ -614,7 +614,13 @@ if initialRequest is not None: # resend request with new identifier - newIdentifier = self.FcParams.newUuid(uuids=self._requests) + #TODO: just an assumption that pugin related messages my end up here + if initialRequest.name in (consts.Message.GetPluginInfo, consts.Message.FCPPlugin): + identifierPrefix = self.IdentifierPrefixPluginMessage + else: + identifierPrefix = self.IdentifierPrefixRequest + + newIdentifier = self.FcParams.newUuid(prefix=identifierPrefix, uuids=self._requests) self._requests[newIdentifier] = initialRequest del self._requests[requestIdentifier] initialRequest['Identifier'] = newIdentifier @@ -1959,6 +1965,7 @@ identifier = self.FcParam.newUuid(prefix=self.IdentifierPrefixPluginMessage, uuids=self._requests) msg = self.Message( consts.Message.GetPluginInfo, + FcModified={}, Identifier=identifier, PluginName=pluginName, Detailed=detailed, @@ -1978,6 +1985,7 @@ identifier = self.FcParam.newUuid(prefix=self.IdentifierPrefixPluginMessage, uuids=self._requests) msg = self.Message( consts.Message.GetPluginInfo, + FcModified={}, Identifier=identifier, PluginName=pluginName, **params @@ -2009,6 +2017,7 @@ identifier = self.FcParams.newUuid(prefix=prefix, uuids=self._requests) msg = self.Message( consts.Message.GenerateSSK, + FcModified={}, Identifier=identifier, ) self._requests[identifier] = msg This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-05 12:26:08
|
Revision: 146 http://fclient.svn.sourceforge.net/fclient/?rev=146&view=rev Author: jurner Date: 2008-02-05 04:26:13 -0800 (Tue, 05 Feb 2008) Log Message: ----------- ... Modified Paths: -------------- trunk/sandbox/fcp/fcp2_0_consts.py Modified: trunk/sandbox/fcp/fcp2_0_consts.py =================================================================== --- trunk/sandbox/fcp/fcp2_0_consts.py 2008-02-05 12:11:06 UTC (rev 145) +++ trunk/sandbox/fcp/fcp2_0_consts.py 2008-02-05 12:26:13 UTC (rev 146) @@ -363,6 +363,7 @@ @cvar PersistentUserData: thepersistent user data has been modified @cvar PriorityClass: the priority class has been modified """ + Null = 0x0 Filename = 0x8 Identifier = 0x4 PersistentUserData = 0x1 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-05 12:11:05
|
Revision: 145 http://fclient.svn.sourceforge.net/fclient/?rev=145&view=rev Author: jurner Date: 2008-02-05 04:11:06 -0800 (Tue, 05 Feb 2008) Log Message: ----------- added prefix param Modified Paths: -------------- trunk/sandbox/fcp/fcp2_0_params.py Modified: trunk/sandbox/fcp/fcp2_0_params.py =================================================================== --- trunk/sandbox/fcp/fcp2_0_params.py 2008-02-05 12:10:33 UTC (rev 144) +++ trunk/sandbox/fcp/fcp2_0_params.py 2008-02-05 12:11:06 UTC (rev 145) @@ -132,16 +132,19 @@ -def newUuid(uuids=None): +def newUuid(prefix=None, uuids=None): """Creates a new unique identifier + @param prefix: (str) identifier prefix or None @param uuids: if desired any iterable containing uuids to enshure the identifier is unique in the iterable @return: (str) uuid """ - uuid_ = uuid.uuid_time() + if prefix is None: + prefix = '' + uuid_ = prefix + uuid.uuid_time() if uuids is not None: while uuid_ in uuids: - uuid_ = uuid_time() + uuid_ = prefix + uuid_time() return uuid_ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-05 12:10:28
|
Revision: 144 http://fclient.svn.sourceforge.net/fclient/?rev=144&view=rev Author: jurner Date: 2008-02-05 04:10:33 -0800 (Tue, 05 Feb 2008) Log Message: ----------- beautifications Modified Paths: -------------- trunk/sandbox/fcp/fcp2_0_events.py Modified: trunk/sandbox/fcp/fcp2_0_events.py =================================================================== --- trunk/sandbox/fcp/fcp2_0_events.py 2008-02-05 12:10:05 UTC (rev 143) +++ trunk/sandbox/fcp/fcp2_0_events.py 2008-02-05 12:10:33 UTC (rev 144) @@ -63,7 +63,7 @@ #TODO: not used currently class ProtocolError(events.Event): - """A protocol error was encountered""" + """A protocol error occured""" class RequestCompleted(events.Event): """A request has been completed""" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-05 12:10:03
|
Revision: 143 http://fclient.svn.sourceforge.net/fclient/?rev=143&view=rev Author: jurner Date: 2008-02-05 04:10:05 -0800 (Tue, 05 Feb 2008) Log Message: ----------- beautifications Modified Paths: -------------- trunk/sandbox/fcp/fcp2_0_consts.py Modified: trunk/sandbox/fcp/fcp2_0_consts.py =================================================================== --- trunk/sandbox/fcp/fcp2_0_consts.py 2008-02-05 12:09:32 UTC (rev 142) +++ trunk/sandbox/fcp/fcp2_0_consts.py 2008-02-05 12:10:05 UTC (rev 143) @@ -204,7 +204,7 @@ KeyboardInterrupt = 'keyboard interrupt' # kick out SocketDied = 'socket died' - + AllRequestsCompleted = 'All requests completed' class Message: @@ -295,7 +295,7 @@ -class MessageStatus: +class RequestStatus: Null = 0x0 Pending = 0x1 Compressing = 0x2 @@ -306,7 +306,7 @@ RestoreFailed = 0x40 -class MessageSubType: +class RequestSubType: """Consts indicating the subtype of a message""" # some additional consts This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-05 12:09:29
|
Revision: 142 http://fclient.svn.sourceforge.net/fclient/?rev=142&view=rev Author: jurner Date: 2008-02-05 04:09:32 -0800 (Tue, 05 Feb 2008) Log Message: ----------- added iterConnect and run methods ++ some fixes 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-05 12:08:45 UTC (rev 141) +++ trunk/sandbox/fcp/fcp2_0_client.py 2008-02-05 12:09:32 UTC (rev 142) @@ -8,7 +8,58 @@ @note: The client implementation never uses or watches the global queue. No implementation should ever do so. Global is evil. + + +Sample code, request data of a freenet key:: + + client = FcpClient() + nodeHello = client.connect() + if nodeHello is None: + pass + # something went wrong ..could not connect to the freenet node + else: + # request data associated to a freenet key + myRequestIdentifier = client.getData('CHK@ABCDE.......') + myRequest = c.getRequest(myIdentifier) + c.run() + print myRequest.data + +Usually you would connect handlers to client events to do processing or handle errors:: + + def handleSuccess(event, request): + print 'Here is the data:', request.data + + def handleFailure(event, request): + print 'Too bad, something went wrong' + + client.events.RequestCompleted += handleSuccess + client.events.RequestFailed += handleFailure + + client.getData('CHK@ABCDE.......') + c.run() + + +Instead of calling run() you may run the client step by step:: + + client.getData('CHK@ABCDE.......') + for i in xrange(50): + client.next() + +You may disconnect event handlers aswell:: + + client.events.RequestCompleted -= handleSuccess + client.events.RequestFailed -= handleFailure + + +Multiple event handlers may be connected / disconnected at once:: + + client.events += ( + (client.events.RequestCompleted, handleSuccess), + (client.events.RequestFailed, handleFailure) + ) + + """ @@ -115,7 +166,6 @@ import fcp2_0_params as FcParams from fcp2_0_requests import Upload from fcp2_0_uri import Uri - logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) @@ -199,6 +249,11 @@ ExpectedFcpVersion = 2.0 ExpectedNodeBuild = 1107 + IdentifierPrefixRequest = 'request:' + IdentifierPrefixGenerateSSK = 'ssk:' + IdentifierPrefixGenerateUSK = 'usk:' + IdentifierPrefixPluginMessage = 'plugin:' + consts = consts Config = Config Message = Message @@ -219,7 +274,6 @@ """ self._connectionName = self.setConnectionName(connectionName) self._ddaTests = [] # currently running DDA tests (request0, ... requestN) - self._sskRequests = [] # currently pending ssk requests (identifier1... identiferN) self._requests = {} # currently running requests (requestIdentifier --> request) self._log = logging.getLogger(self.__class__.__name__) @@ -257,7 +311,7 @@ 'FcPersistentUserData': persistentUserData, # any user defined persistent data # non persistent params - 'FcStatus': consts.MessageStatus.Pending, + 'FcStatus': consts.RequestStatus.Pending, 'FcErrorMessage': None, # did an error occur? 'FcUserData': userData, # any user defined runtime data here @@ -305,7 +359,7 @@ @return: (str) uuid @note: the identifier returned is unique to the client but may not be unique to the node """ - identifier = self.FcParams.newUuid(uuids=self._requests) + identifier = self.FcParams.newUuid(prefix=self.IdentifierPrefixRequest, uuids=self._requests) # add additional params to msg msg = self._addFcParamsToRequest( @@ -372,14 +426,29 @@ saveRemoveFile(initialRequest['FcTestDDA']['TmpFile']) self._ddaTests = [] - self._sskRequests = [] self._requests = {} def closeFreenet(self): """Shuts down the freenet node""" self.sendMessage(consts.Message.Shutdown) + def connect(self, host=DefaultFcpHost, port=DefaultFcpPort, duration=20, timeout=0.5): + """Connects to the freenet node + @param host: (str) host of th node + @param port: (int) port of the node + @param duration: (int) how many seconds try to connect before giving up + @param timeout: (int) how much time to wait before another attempt to connect + + @return: (L{fcp2_0_message.Message}) NodeHello or None if no connection could be established + """ + nodeHello = None + for nodeHello in self.iterConnect(host=host, port=port, duration=duration, timeout=timeout): + pass + return nodeHello + + + def iterConnect(self, host=DefaultFcpHost, port=DefaultFcpPort, duration=20, timeout=0.5): """Iterator to stablish a connection to a freenet node @param host: (str) host of th node @param port: (int) port of the node @@ -527,7 +596,7 @@ @return: True if the message was handled, False otherwise """ - CancelPersistentRequests = 0 # for testing... if True, cancels all PersistentRequests + CancelPersistentRequests = 1 # for testing... if True, cancels all PersistentRequests if msg.name == consts.Message.ClientSocketTimeout: return True @@ -650,7 +719,7 @@ # NOTE: Fcp already removed the request del self._requests[requestIdentifier] initialRequest['FcErrorMessage'] = msg - initialRequest['FcStatus'] = consts.MessageStatus.Error | consts.MessageStatus.Removed + initialRequest['FcStatus'] = consts.RequestStatus.Complete | consts.RequestStatus.Error | consts.RequestStatus.Removed self.events.RequestFailed(initialRequest) return True @@ -733,7 +802,7 @@ #TODO: check if errorMsg gives reasonable feedback del self._requests[initialRequest['Identifier']] - initialRequest['FcStatus'] = consts.MessageStatus.Error | consts.MessageStatus.Removed + initialRequest['FcStatus'] = consts.RequestStatus.Error | consts.RequestStatus.Removed initialRequest['FcErrorMessage'] = initialRequest['FcTestDDA']['ErrorMsg'] self.events.ProtocolError(initialRequest) return True @@ -768,10 +837,10 @@ if initialRequest is None: return False - initialRequest['FcStatus'] = consts.MessageStatus.Complete + initialRequest['FcStatus'] = consts.RequestStatus.Complete # Fcp removes requests from queue with Persistence.Connection.. so do we if initialRequest.params.get('Persistence', consts.Persistence.Connection) == consts.Persistence.Connection: - initialRequest['FcStatus'] |= consts.MessageStatus.Removed + initialRequest['FcStatus'] |= consts.RequestStatus.Removed del self._requests[requestIdentifier] initialRequest.data = msg.data @@ -782,11 +851,11 @@ if initialRequest is None: return False - initialRequest['FcStatus'] = consts.MessageStatus.Complete + initialRequest['FcStatus'] = consts.RequestStatus.Complete initialRequest['FcMetadataContentType'] = msg.get('Metadata.ContentType', '') initialRequest['FcDataLength'] = msg.get('DataLength', '') - if initialRequest['FcSubType'] != consts.MessageSubType.GetData: - initialRequest['FcStatus'] |= consts.MessageStatus.Removed + if initialRequest['FcSubType'] != consts.RequestSubType.GetData: + initialRequest['FcStatus'] |= consts.RequestStatus.Removed # Fcp removes requests from queue with Persistence.Connection.. so do we if initialRequest.params.get('Persistence', consts.Persistence.Connection) == consts.Persistence.Connection: del self._requests[requestIdentifier] @@ -798,23 +867,23 @@ if initialRequest is None: return False - initialRequest['FcStatus'] = consts.MessageStatus.Null + initialRequest['FcStatus'] = consts.RequestStatus.Null # Fcp removes requests from queue with Persistence.Connection.. so do we if initialRequest.params.get('Persistence', consts.Persistence.Connection) == consts.Persistence.Connection: - initialRequest['FcStatus'] = consts.MessageStatus.Removed + initialRequest['FcStatus'] = consts.RequestStatus.Removed del self._requests[requestIdentifier] # check if it is one of our requests for key information code = msg['Code'] - if code == consts.FetchError.TooBig and initialRequest['FcSubType'] == consts.MessageSubType.GetKeyInfo: - initialRequest['FcStatus'] |= consts.MessageStatus.Complete + if code == consts.FetchError.TooBig and initialRequest['FcSubType'] == consts.RequestSubType.GetKeyInfo: + initialRequest['FcStatus'] |= consts.RequestStatus.Complete initialRequest['FcMetadataContentType'] = msg.get('ExpectedMetadata.ContentType', '') initialRequest['FcDataLength'] = msg.get('ExpectedDataLength', -1) self.events.RequestCompleted(initialRequest) else: initialRequest['FcErrorMessage'] = msg - initialRequest['FcStatus'] |= consts.MessageStatus.Error + initialRequest['FcStatus'] |= consts.RequestStatus.Complete | consts.RequestStatus.Error self.events.RequestFailed(initialRequest) return True @@ -840,13 +909,13 @@ # restore request self._requests[requestIdentifier] = restoredRequest - restoredRequest['FcStatus'] = consts.MessageStatus.Started + restoredRequest['FcStatus'] = consts.RequestStatus.Started self.events.RequestRestored(restoredRequest) return True # known request... filter out multiple PersistentGets - if initialRequest['FcStatus'] == consts.MessageStatus.Pending: - initialRequest['FcStatus'] = consts.MessageStatus.Started + if initialRequest['FcStatus'] == consts.RequestStatus.Pending: + initialRequest['FcStatus'] = consts.RequestStatus.Started #TODO: update initialRequest with params from PersistentGet? @@ -871,22 +940,22 @@ return True # determine initial message name - if restoredRequest['FcSubType'] == consts.MessageSubType.Put: + if restoredRequest['FcSubType'] == consts.RequestSubType.Put: restoredRequest.name = consts.Message.ClientPut - elif restoredRequest['FcSubType'] == consts.MessageSubType.PutDiskDir: + elif restoredRequest['FcSubType'] == consts.RequestSubType.PutDiskDir: restoredRequest.name = consts.Message.ClientPutDiskDir - elif restoredRequest['FcSubType'] == consts.MessageSubType.PutComplexDir: + elif restoredRequest['FcSubType'] == consts.RequestSubType.PutComplexDir: restoredRequest.name = consts.Message.ClientPutComplexDir # restore request self._requests[requestIdentifier] = restoredRequest - restoredRequest['FcStatus'] = consts.MessageStatus.Started + restoredRequest['FcStatus'] = consts.RequestStatus.Started self.events.RequestRestored(restoredRequest) return True # known request... filter out multiple PersistentGets - if initialRequest['FcStatus'] == consts.MessageStatus.Pending: - initialRequest['FcStatus'] = consts.MessageStatus.Started + if initialRequest['FcStatus'] == consts.RequestStatus.Pending: + initialRequest['FcStatus'] = consts.RequestStatus.Started #TODO: update initialRequest with params from PersistentPut? #TODO: update initialRequest with params from PersistentPut? @@ -961,11 +1030,11 @@ if initialRequest is None: return False - initialRequest['FcStatus'] = consts.MessageStatus.Error + initialRequest['FcStatus'] = consts.RequestStatus.Complete | consts.RequestStatus.Error # Fcp removes requests from queue with Persistence.Connection.. so do we if initialRequest.params.get('Persistence', consts.Persistence.Connection) == consts.Persistence.Connection: - initialRequest['FcStatus'] |= consts.MessageStatus.Removed + initialRequest['FcStatus'] |= consts.RequestStatus.Removed del self._requests[requestIdentifier] initialRequest['FcErrorMessage'] = msg @@ -989,10 +1058,10 @@ # TODO: StartupTime and CompletionTime are passed, but # as long as no corrosponding params are passed in DataFound # we ignore them - initialRequest['FcStatus'] = consts.MessageStatus.Complete + initialRequest['FcStatus'] = consts.RequestStatus.Complete if initialRequest.params.get('Persistence', consts.Persistence.Connection) == consts.Persistence.Connection: - initialRequest['FcStatus'] |= consts.MessageStatus.Removed + initialRequest['FcStatus'] |= consts.RequestStatus.Removed del self._requests[requestIdentifier] initialRequest['URI'] = msg['URI'] @@ -1038,7 +1107,7 @@ if initialRequest is None: return False - self._pluginRequests[requestIdentifier] + del self._pluginRequests[requestIdentifier] self.events.PluginInfo(msg) return True @@ -1066,17 +1135,22 @@ elif msg.name == consts.Message.SSKKeypair: - if requestIdentifier not in self._sskRequests: + if requestIdentifier not in self._requests: return False - self._sskRequests.remove(requestIdentifier) + del self._requests[requestIdentifier] #TODO:no idea if the node may pass uris with prefixes like 'freenet:'... strip it anyways insertURI = self.Uri(msg['InsertURI']).uri requestURI = self.Uri(msg['RequestURI']).uri - keyType = consts.KeyType.USK if requestIdentifier.startswith(consts.KeyType.USK) else consts.KeyType.SSK - if keyType == consts.KeyType.USK: + + + createUSK = True if requestIdentifier.startswith(self.IdentifierPrefixGenerateUSK) else False + if createUSK: insertURI = requestURI.replace(consts.KeyType.SSK, consts.KeyType.USK, 1) requestURI = requestURI.replace(consts.KeyType.SSK, consts.KeyType.USK, 1) + keyType = consts.KeyType.USK + else: + keyType = consts.KeyType.SSK msg['InsertURI'] = insertURI msg['RequestURI'] = requestURI @@ -1099,9 +1173,12 @@ def next(self, dispatch=True): """Pumps the next message waiting @param dispatch: if True the message is dispatched to L{handleMessage} + @note: use this method to run the client step by step. If you want to run the + client unconditionally use L{run} """ msg = self.Message.fromSocket(self._socket) if msg.name == consts.Message.ClientSocketDied: + self._log.info(consts.LogMessages.SocketDied) if dispatch: msg = self.Message( consts.Message.ClientDisconnected, @@ -1121,6 +1198,40 @@ return msg + def run(self): + """Runs the client unconditionally untill all requests have completed + @note: a KeyboardInterrupt will stop the client + """ + + #n = 0 + while True: + #n += 1 + #if n > 50: break + + # check if we have running requests + + # assert all requests have completed + status = consts.RequestStatus.Complete + for request in self._requests.values(): + tmp_status = request.params.get('FcStatus', consts.RequestStatus.Null) + if not tmp_status & consts.RequestStatus.Complete: + status = consts.RequestStatus.Null + break + + if status == consts.RequestStatus.Complete: + self._log.info(consts.LogMessages.AllRequestsCompleted) + break + + try: + msg = self.next() + except KeyboardInterrupt: + self._log.info(consts.LogMessages.KeyboardInterrupt) + break + + if msg.name == consts.Message.ClientSocketDied: + break + + def sendMessage(self, name, data=None, **params): """Sends a message to freenet @param name: name of the message to send @@ -1217,7 +1328,7 @@ ): """Requests a key from the node @param uri: (str) uri of the file to request (may contain prefixes like 'freenet:' or 'http://') - @param messageSubType: (L{consts.MessageSubType}) sub type of the message + @param messageSubType: (L{consts.RequestSubType}) sub type of the message @param userData: any non persistent data to associate to the request or None @param persistentUserData: any string to associate to the request as persistent data or None @param filenameCollision: what to do if the disk target alreaady exists. One of the FilenameCollision.* consts @@ -1290,7 +1401,7 @@ """ return self.clientGet( uri, - consts.MessageSubType.GetData, + consts.RequestSubType.GetData, userData, persistentUserData, consts.FilenameCollision.HandleNever, @@ -1359,7 +1470,7 @@ """ return self.clientGet( uri, - consts.MessageSubType.GetFile, + consts.RequestSubType.GetFile, userData, persistentUserData, filenameCollision, @@ -1420,7 +1531,7 @@ # how to retrieve meta info about a key? ...idea is to provoke a GetFailed (TooBig) return self.clientGet( uri, - consts.MessageSubType.GetKeyInfo, + consts.RequestSubType.GetKeyInfo, userData, persistentUserData, consts.FilenameCollision.HandleNever, @@ -1461,40 +1572,9 @@ ######################################################## ## - ## ClientPut related methods + ## CHK ClientPut related methods ## ######################################################## - def putUpload(self, upload, userData=None, persistentUserData=''): - - msg = upload.getMessage(self.Message) - if msg is None: - raise ValueError('Nothing to upload') - - # determine SubType - if msg.name == consts.Message.ClientPut: - messageSubType = consts.MessageSubType.Put - elif msg.name == consts.Message.ClientPutDiskDir: - messageSubType = consts.MessageSubType.PutDiskDir - else: - messageSubType = consts.MessageSubType.PutComplexDir - - self._registerRequest( - msg, - userData, - messageSubType, - time.time(), - persistentUserData, - #filenameCollision=filenameCollision, - ) - - if upload.keyType in (consts.KeyType.SSK, consts.KeyType.USK): - msg['FcInsertUri'] = upload.privateKey - #NOTE: the caller may use the 'FcInsertUri' member to store the private key - - self.sendMessageEx(msg) - return msg['Identifier'] - - def clientPut(self, uri, messageSubType, @@ -1506,7 +1586,7 @@ msg = self.Message(consts.Message.ClientPut, URI=uri) for paramName, value in messageParams.items(): if value is not None: - if param == 'ContentType': + if paramName == 'ContentType': param = 'Metadata.ContentType' msg[paramName] = value if data is not None: @@ -1529,7 +1609,7 @@ #CHK - def putData(self, + def chkPutData(self, data, contentType=None, @@ -1546,7 +1626,7 @@ return self.clientPut( consts.KeyType.CHK, - consts.MessageSubType.Put, + consts.RequestSubType.Put, userData, persistentUserData, data, @@ -1566,7 +1646,12 @@ Verbosity=consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression, ) - def putFile(self, + def chkPutDir(self): + + pass + + + def chkPutFile(self, filename, contentType=None, @@ -1581,8 +1666,8 @@ ): return self.clientPut( - concts.KeyType.CHK, - consts.MessageSubType.Put, + consts.KeyType.CHK, + consts.RequestSubType.Put, userData, persistentUserData, None, @@ -1602,9 +1687,61 @@ Verbosity=consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression, ) + + def chkPutMultiple(self, + items, + defaultName=None, + ): + + msg = self.Message( + consts.PutComplexDir, + URI=consts.KeyType.CHK + + ) + + for n, item in enumerate(items): + + for paramName, value in item.items(): + pass + + ######################################################## + ## + ## SSK ClientPut related methods + ## + ######################################################## + def sskPutData(self): + pass + + def sskPutDir(self): + pass + def sskPutFile(self): + pass + + + def sskPutMultiple(self): + pass + ######################################################## ## + ## USK ClientPut related methods + ## + ######################################################## + def uskPutData(self): + pass + + def uskPutDir(self): + pass + + def uskPutFile(self): + pass + + + def uskPutMultiple(self): + pass + + ######################################################## + ## ## request related methods ## ######################################################## @@ -1662,7 +1799,7 @@ """ initialRequest = self._requests[requestIdentifier] if initialRequest.name in consts.Message.ClientRequestMessages: - initialRequest['FcStatus'] = consts.MessageStatus.Removed + initialRequest['FcStatus'] = consts.RequestStatus.Removed self.sendMessage( consts.Message.RemovePersistentRequest, Global=False, @@ -1813,15 +1950,13 @@ ## plugins ## ########################################################## - #TODO: curently it is just a guess the a plugin may respond with a IdentifierCollision. To make - # shure we register plugin related stuff as request def getPluginInfo(self, pluginName, detailed=False): """Requests information about a plugin @param pluginName: (str) name of the plugin to request info for @param detailed: (bool) If True, detailed information is returned @return: (str) request identifier """ - identifier = self.FcParam.newUuid(uuids=self._requests) + identifier = self.FcParam.newUuid(prefix=self.IdentifierPrefixPluginMessage, uuids=self._requests) msg = self.Message( consts.Message.GetPluginInfo, Identifier=identifier, @@ -1840,7 +1975,7 @@ @param data: (str) data to pass along with the messaage or None @return: (str) request identifier """ - identifier = self.FcParam.newUuid(uuids=self._requests) + identifier = self.FcParam.newUuid(prefix=self.IdentifierPrefixPluginMessage, uuids=self._requests) msg = self.Message( consts.Message.GetPluginInfo, Identifier=identifier, @@ -1855,9 +1990,6 @@ self.sendMessageEx(msg) return identifier - - - ########################################################## ## ## others @@ -1873,12 +2005,14 @@ if keypairType not in (consts.KeyType.SSK, consts.KeyType.USK): raise ValueError('keypairType must be %s or %s' % (consts.KeyType.SSK, consts.KeyType.USK)) - identifier = keypairType + self.FcParams.newUuid(self._sskRequests) - self._sskRequests.append(identifier) - self.sendMessage( - consts.Message.GenerateSSK, - Identifier=identifier, - ) + prefix = self.IdentifierPrefixGenerateSSK if keypairType == consts.KeyType.SSK else self.IdentifierPrefixGenerateUSK + identifier = self.FcParams.newUuid(prefix=prefix, uuids=self._requests) + msg = self.Message( + consts.Message.GenerateSSK, + Identifier=identifier, + ) + self._requests[identifier] = msg + self.sendMessageEx(msg) return identifier @@ -1891,7 +2025,7 @@ debugVerbosity=consts.DebugVerbosity.Debug ) - for nodeHello in c.connect(): pass + nodeHello = c.connect() if nodeHello is not None: @@ -1901,16 +2035,22 @@ def testGetData(): def cb(event, request): - print request['FcData'] - c.events.RequestCompleted += cb + pass + #print request.data + #c.modifyRequest(request['Identifier'], persistentUserData='foo') + + c.events.RequestCompleted += cb + c.events.RequestFailed += cb identifier = c.getData( 'CHK@q4~2soHTd9SOINIoXmg~dn7LNUAOYzN1tHNHT3j4c9E,gcVRtoglEhgqN-DJolXPqJ4yX1f~1gBGh89HNWlFMWQ,AAIC--8/snow_002%20%2810%29.jpg', + #persistence=consts.Persistence.Forever, #binaryBlob=True, ) - for i in xrange(50): - c.next() + c.run() + #for i in xrange(50): + # c.next() #c.removeRequest(identifier) #for i in xrange(5): @@ -1967,17 +2107,12 @@ #testGetKeyInfo() - def testPutData(): - myIdentifier = c.putData( + def testChkPutData(): + myIdentifier = c.chkPutData( 'test123', #persistence=c.Persistence.Reboot, ) - #u = c.Upload(c.consts.KeyType.USK, privateKey='USK@eeqMkAamPTUz983Sfr4Ce-ckPUwFgpuTwB~wce0BK3E,rMfH3jUrLRz23fltO-LGEEjnni9DwNKlPzWzaDqOTe8,AQACAAE/') - #u.addData('foo/0/', 'test1234') - #u.addData('bar', 'test12345678') - #u.addData('baz', 'test12345678') - #c.putUpload(u) for i in xrange(500): c.next() @@ -1985,26 +2120,24 @@ #for i in xrange(5): # c.next() - #testPutData() + #testChkPutData() - def testPutFile(): + def testChkPutFile(): fpath = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test.jpg') - #identifier = c.putFile( - # fpath, - # ) - u = c.Upload(c.consts.KeyType.CHK) - u.addFile('', fpath) - c.putUpload(u) + identifier = c.chkPutFile( + fpath, + ) + - for i in xrange(1000): + for i in xrange(500): c.next() #c.removeRequest(identifier) #for i in xrange(5): # c.next() - #testPutFile() + #testChkPutFile() @@ -2040,7 +2173,7 @@ for i in xrange(10): c.next() - testConfigData() + #testConfigData() @@ -2067,8 +2200,11 @@ c.events.KeypairGenerated += cb c.generateKeypair('SSK@') c.generateKeypair('USK@') - for i in xrange(10): - c.next() + + + c.run() + #for i in xrange(10): + # c.next() #testGenerateKeypair() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-05 12:08:41
|
Revision: 141 http://fclient.svn.sourceforge.net/fclient/?rev=141&view=rev Author: jurner Date: 2008-02-05 04:08:45 -0800 (Tue, 05 Feb 2008) Log Message: ----------- ... Modified Paths: -------------- trunk/sandbox/fcp/__init__.py Modified: trunk/sandbox/fcp/__init__.py =================================================================== --- trunk/sandbox/fcp/__init__.py 2008-02-04 11:55:35 UTC (rev 140) +++ trunk/sandbox/fcp/__init__.py 2008-02-05 12:08:45 UTC (rev 141) @@ -6,6 +6,12 @@ __author__ = 'Juergen Urner' __copyright__ = '(c) 2008 - Juergen Urner' -__email__ = 'jue...@go...' +__email__ = 'jue...@ar...' __licence__ = 'Mit' -__version__ = '0.1' \ No newline at end of file +__version__ = '0.1' + +#**************************************************************************************** +# +#**************************************************************************************** +def getFcpClient(): + pass This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-04 11:55:31
|
Revision: 140 http://fclient.svn.sourceforge.net/fclient/?rev=140&view=rev Author: jurner Date: 2008-02-04 03:55:35 -0800 (Mon, 04 Feb 2008) Log Message: ----------- separated events Added Paths: ----------- trunk/sandbox/fcp/fcp2_0_events.py Added: trunk/sandbox/fcp/fcp2_0_events.py =================================================================== --- trunk/sandbox/fcp/fcp2_0_events.py (rev 0) +++ trunk/sandbox/fcp/fcp2_0_events.py 2008-02-04 11:55:35 UTC (rev 140) @@ -0,0 +1,93 @@ +"""Fcp events + +""" + + +from fcp_lib import events +import fcp2_0_consts as consts +#******************************************************************************* +# +#******************************************************************************* +class Events(events.Events): + """All events the client may trigger""" + + class ConfigData(events.Event): + """Config data has arrived as requested or some value of the config has changed""" + + class ClientConnected(events.Event): + """The client is now connected to the node""" + + class ClientDisconnected(events.Event): + """The client has disconnected from the node""" + + class EndListPeers(events.Event): + """""" + + class Idle(events.Event): + """Client is idele currently""" + + class KeypairGenerated(events.Event): + """A public / private keypair has been generated""" + + + class NodeData(events.Event): + """Node data has arrived as requested or some value of the node has changed""" + + class Peer(events.Event): + """Information about a peer has arrived as requested or some value of a peer has changed + """ + + class PeerRemoved(events.Event): + """A peer has been removed""" + + class EndListPeerNotes(events.Event): + """Listing of peer notes is done""" + + class PeerNote(events.Event): + """A peer note has arrived""" + + class PeerUnknown(events.Event): + """Unknown peer""" + + class PluginInfo(events.Event): + """Plugin info has arrived""" + + class PluginInfoFailed(events.Event): + """Request for plugin info failed""" + + class PluginMessage(events.Event): + """A message from a plugin has arrived""" + + class PluginMessageFailed(events.Event): + """Sending of a plugin message failed""" + + #TODO: not used currently + class ProtocolError(events.Event): + """A protocol error was encountered""" + + class RequestCompleted(events.Event): + """A request has been completed""" + + class RequestFailed(events.Event): + """A request failed""" + + class RequestFetchable(events.Event): + """An upload is fetchable""" + + class RequestModified(events.Event): + """A request has been modified""" + + class RequestProgress(events.Event): + """A request has made some progress""" + + class RequestRestored(events.Event): + """A request has been restored""" + + class RequestStarted(events.Event): + """A request has been started""" + + class USKUpdated(events.Event): + """An update of an Usk has arrived""" + + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-04 11:55:01
|
Revision: 139 http://fclient.svn.sourceforge.net/fclient/?rev=139&view=rev Author: jurner Date: 2008-02-04 03:55:00 -0800 (Mon, 04 Feb 2008) Log Message: ----------- fixes Modified Paths: -------------- trunk/sandbox/fcp/fcp2_0_requests.py Modified: trunk/sandbox/fcp/fcp2_0_requests.py =================================================================== --- trunk/sandbox/fcp/fcp2_0_requests.py 2008-02-04 11:53:43 UTC (rev 138) +++ trunk/sandbox/fcp/fcp2_0_requests.py 2008-02-04 11:55:00 UTC (rev 139) @@ -7,6 +7,13 @@ class Upload(object): """Wrapper class to represent a freenet upload + @ivar directoryAdded: (bool) True if the upload contains a directory, False otherwise + @ivar items: (list) of dicts containing paramaters for each upload + @ivar keyType: L{consts.KeyType} the type of key to upload + @ivar params: (dict) request parameters + @ivar privateKey: (str) private keey (required for SSK or USK uploads) + @ivar targetNames: (list) of names already in use (for multi-uploads) + @note: you can upload one or more items of any kind (data, files, redirects), except from directories wich have to be the only item to upload """ @@ -39,10 +46,14 @@ @param privateKey: (str) privateKey if keyType is SSK or USK """ - if keyType not in consts.KeyType.TypesAll: raise ValueError('Invalid key type: %r' % keyType) - + if keyType in (consts.KeyType.SSK, consts.KeyType.USK) and privateKey is None: + raise ValueError('For %s a public key is required' % keyType) + elif keyType in (consts.KeyType.CHK, consts.KeyType.KSK) and privateKey is not None: + raise ValueError('For %s no public key is required' % keyType) + + self.directoryAdded = False self.items = [] self.keyType = keyType self.params = { @@ -53,27 +64,26 @@ 'PriorityClass': priorityClass, } self.privateKey = privateKey - self._directoryAdded = False - self._targetNames = [] # record to check if names are unique (assert order is arbitrary) + self.targetNames = [] # record to check if names are unique (assert order is arbitrary) def _addItem(self, **params): """Private method to add an upload item""" - if self._directoryAdded: + if self.directoryAdded: raise ValueError('A directory has already been added, no other items allowed') - if itemType == self.ItemTypeDirectory: - if self._directoryAdded: + if params['FcItemType'] == self.ItemTypeDirectory: + if self.directoryAdded: raise ValueError('An item has already been added, no additional directory allowed') else: - self._directoryAdded = True + self.directoryAdded = True name = params['Name'] - if name in self._targetNames: + if name in self.targetNames: raise ValueError('Target name already exists: %r' % name) self.targetNames.append(name) - self.iotems.append(params) + self.items.append(params) def addData(self, name, data, contentType=None): @@ -88,14 +98,15 @@ ContentType=contentType, DataLength=len(data), Name=name, - UploadFrom=self.UploadFrom.Direct + UploadFrom=consts.UploadFrom.Direct ) - def addDirectory(name, directory, allowUnreadableFiles=False): + def addDirectory(name, directory, allowUnreadableFiles=False, defaultName=None): """Adds a directory to be uploaded @param name: target name @param directory: (abspath) of the directory to be uploaded + @param defaultName: (for SSKs and USKs, the file to display when the key is requested) @note: if you add a directory, every attempt to add anything else will fail """ @@ -103,7 +114,8 @@ FcItemType=self.ItemTypeDirectory, AllowUnreadableFiles=allowUnreadableFiles, Filename=directory, - Name=name, + Name=name, + DefaultName=defaultName, ) @@ -118,7 +130,7 @@ ContentType=contentType, Filename=filename, Name=name, - UploadFrom=self.UploadFrom.Disk, + UploadFrom=consts.UploadFrom.Disk, ) @@ -133,7 +145,7 @@ DataLength=len(data), Name=name, TargetURI=redirect, - UploadFrom=self.UploadFrom.Redirect + UploadFrom=consts.UploadFrom.Redirect ) @@ -142,91 +154,88 @@ @param messageClass: (L{fcp2_0_message.Message}) class to fill in @return: (L{fcp2_0_message.Message}) instance """ - if self.keyType in (consts.KeyType.SSK, consts.KeyType.USK) and self.privateKey is None: - raise ValueError('For %s a public key is required' % self.keyType) - elif self.keyType in (consts.KeyType.CHK, consts.KeyType.KSK) and self.privateKey is not None: - raise ValueError('For %s no public key is required' % self.keyType) - - n = len(self.items) if n == 0: return None - elif n == 1 and self.itemTypes[0] == self.ItemTypeDirectory: - msg = messageClass(messageClass.MessageClientPutDiskDir, **self.params) + elif n == 1 and self.items[0]['FcItemType'] == self.ItemTypeDirectory: + msg = messageClass(consts.Message.ClientPutDiskDir) params = self.items[0] + targetName = params.pop('Name') for param, value in params.items(): if value is None: continue if param.startswith(self.ReservedParamPrefix): continue - - if param == 'Name': - param = 'TargetFilename' - elif param == 'ContentType': - param = 'Metadata.ContentType' msg[param] = value elif n == 1: - msg = messageClass(messageClass.MessageClientPut, **self.params) + msg = messageClass(consts.Message.ClientPut) params = self.items[0] + targetFilename = params.pop('Name') for param, value in params.items(): if value is None: continue if param.startswith(self.ReservedParamPrefix): continue - if param == 'Name': - param = 'TargetFilename' - elif param == 'ContentType': + if param == 'ContentType': param = 'Metadata.ContentType' msg[param] = value - if params['FcItemType'] == self.ItemTypeData: - msg.data = params['FcData'] + if params['FcItemType'] == self.ItemTypeData: + msg.data = params['FcData'] + if self.keyType == consts.Keytype.CHK: + msg['TargetFilename'] = targetFilename + #TODO: USK@s allowed for complex dirs? else: #NOTE: for simplicity we take the first item as default item and its name # as TargetName if that causes any problems, pass it twice - msg = messageClass(messageClass.MessageClientPutComplexDir, **self.params) + msg = messageClass(consts.Message.ClientPutComplexDir) msg.data = '' - defaultName = temParams[0]['Name'] - msg['DefaultName'] = defaultName - params = {'TargetFilename': defaultName} + header = self.items.pop(0) + targetFilename = header['Name'] + msg['DefaultName'] = self.items[0]['Name'] + k = 0 for itemParams in self.items: - k = 0 for param, value in itemParams.items(): if value is None: continue if param.startswith(self.ReservedParamPrefix): if param == 'FcData': - msg.data += data + msg.data += value continue if param == 'ContentType': param = 'Metadata.ContentType' param = 'Files.%s.%s' % (k, param) msg[param] = value - k += 1 + k += 1 - if not msg.data: - msg.data = None + if not msg.data: + msg.data = None - # set some defaults - msg['Global'] = consts.FcpFalse - msg['Verbosity'] = consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression - # compose URI - if self.KeyType == consts.KeyType.CHK: - msg['URI'] == consts.KeyType.CHK - elif self.KeyType == consts.KeyType.KSK: - msg['URI'] == consts.KeyType.KSK + '/' + params.pop('TargetFilename') - elif self.KeyType == consts.KeyType.SSK: - msg['URI'] == consts.KeyType.SSK + self.privateKey + '/' + params.pop('TargetFilename') - elif self.KeyType == consts.KeyType.USK: - msg['URI'] == consts.KeyType.USH + self.privateKey + '/' + params.pop('TargetFilename') - - return msg + # determine Uri + if self.keyType == consts.KeyType.CHK: + msg['URI'] = consts.KeyType.CHK + elif self.keyType == consts.KeyType.KSK: + msg['URI'] = consts.KeyType.KSK + '/' + targetFilename + elif self.keyType == consts.KeyType.SSK: + msg['URI'] = self.privateKey + targetFilename + elif self.keyType == consts.KeyType.USK: + msg['URI'] = self.privateKey + targetFilename + + # set params and some defaults + msg['Global'] = False + msg['Verbosity'] = consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression + for param, value in self.params.items(): + if value is None: + continue + msg[param] = value + + return msg This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-04 11:54:33
|
Revision: 138 http://fclient.svn.sourceforge.net/fclient/?rev=138&view=rev Author: jurner Date: 2008-02-04 03:53:43 -0800 (Mon, 04 Feb 2008) Log Message: ----------- fixes Modified Paths: -------------- trunk/sandbox/fcp/fcp2_0_types.py Modified: trunk/sandbox/fcp/fcp2_0_types.py =================================================================== --- trunk/sandbox/fcp/fcp2_0_types.py 2008-02-04 11:53:08 UTC (rev 137) +++ trunk/sandbox/fcp/fcp2_0_types.py 2008-02-04 11:53:43 UTC (rev 138) @@ -561,12 +561,13 @@ 'Global': FcpTypeBool, 'IgnoreDS': FcpTypeBool, 'DSOnly': FcpTypeBool, + 'MaxRetries': FcpTypeInt, 'MaxSize': FcpTypeInt, 'MaxTempSize': FcpTypeInt, 'Verbosity': FcpTypeInt, }, 'ClientHello': { - 'ExpectedVersion': FcpTypeInt, + 'ExpectedVersion': FcpTypeFloat, }, 'ClientPut': { 'BinaryBlob': FcpTypeBool, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |