SF.net SVN: fclient: [157] trunk/sandbox/fcp/fcp2_0_client.py
Status: Pre-Alpha
Brought to you by:
jurner
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. |