SF.net SVN: fclient: [167] trunk/sandbox/fcp/fcp2_0_client.py
Status: Pre-Alpha
Brought to you by:
jurner
From: <ju...@us...> - 2008-02-07 23:47:18
|
Revision: 167 http://fclient.svn.sourceforge.net/fclient/?rev=167&view=rev Author: jurner Date: 2008-02-07 15:47:22 -0800 (Thu, 07 Feb 2008) Log Message: ----------- renames 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 14:57:28 UTC (rev 166) +++ trunk/sandbox/fcp/fcp2_0_client.py 2008-02-07 23:47:22 UTC (rev 167) @@ -3,9 +3,9 @@ Compatibility: >= Freenet 0.7 Build #1107 -@newfield event: event, events +@newfield event: Event, Events +@newfield requestparam: RequestParam, RequestParams - @note: The client implementation never uses or watches the global queue. No implementation should ever do so. Global is evil. @@ -294,8 +294,7 @@ persistentUserData, filenameCollision, ): - - + # add additional params to msg msg.params.update({ @@ -306,7 +305,7 @@ 'FcPersistentUserData': persistentUserData, # any user defined persistent data # non persistent params - 'FcStatus': consts.RequestStatus.Null, + 'FcRequestStatus': consts.RequestStatus.Null, 'FcErrorMessage': None, # error message in case an error occured 'FcUserData': userData, # any user defined runtime data here @@ -353,12 +352,12 @@ #NOTE: non Get / Put related requests do not have a Persistence param removeRequest = request.params.get('Persistence', consts.Persistence.Connection) == consts.Persistence.Connection if removeRequest: - request['FcStatus'] |= consts.RequestStatus.RemovedFromQueue + request['FcRequestStatus'] |= consts.RequestStatus.RemovedFromQueue if event is not None: event(request) - request['FcStatus'] |= consts.RequestStatus.Completed + request['FcRequestStatus'] |= consts.RequestStatus.Completed if removeRequest: del self._requests[request['Identifier']] @@ -371,8 +370,8 @@ persistentUserData, filenameCollision=consts.FilenameCollision.HandleNever, ): - """Registers a message - @param msg: message to register for track keeping + """Registers a request + @param msg: message to register @param userData: any user defined data @param msgType: one of the message sub type consts @param initTime: (python time) @@ -395,7 +394,7 @@ ) msg['ClientToken'] = self.FcParams.messageToParams(msg) - msg['FcStatus'] |= consts.RequestStatus.Pending + msg['FcRequestStatus'] |= consts.RequestStatus.Pending msg['Identifier'] = identifier self._requests[identifier] = msg @@ -720,25 +719,25 @@ elif code == consts.ProtocolError.NoSuchPlugin: if initialRequest.name == consts.Message.PluginInfo: initialRequest['FcErrorMessage'] = msg - initialRequest['FcStatus'] |= consts.RequestStatus.Error + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Error self._finalizeRequest(msg, initialRequest, self.events.PluginInfoFailed) return True elif initialRequest.name == consts.Message.FCPPluginMessage: initialRequest['FcErrorMessage'] = msg - initialRequest['FcStatus'] |= consts.RequestStatus.Error + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Error self._finalizeRequest(msg, initialRequest, self.events.PluginMessageFailed) return True elif code == consts.ProtocolError.AccessDenied: if initialRequest.name == consts.Message.PluginInfo: self.events.PluginInfoFailed(initialRequest) - initialRequest['FcStatus'] |= consts.RequestStatus.Completed + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Completed del self._requests[requestIdentifier] 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 + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Completed del self._requests[requestIdentifier] return True @@ -747,7 +746,7 @@ # NOTE: Fcp already removed the request initialRequest['FcErrorMessage'] = msg - initialRequest['FcStatus'] = consts.RequestStatus.Error + initialRequest['FcRequestStatus'] = consts.RequestStatus.Error self._finalizeRequest(msg, initialRequest, self.events.RequestFailed) return True @@ -827,7 +826,7 @@ if testFailed: #TODO: check if errorMsg gives reasonable feedback - initialRequest['FcStatus'] = consts.RequestStatus.Error + initialRequest['FcRequestStatus'] = consts.RequestStatus.Error initialRequest['FcErrorMessage'] = initialRequest['FcTestDDA']['ErrorMsg'] self._finalizeRequest(msg, initialRequest, self.events.RequestFailed) return True @@ -861,7 +860,7 @@ if initialRequest is None: return False - initialRequest['FcStatus'] |= consts.RequestStatus.Success + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success initialRequest.data = msg.data self._finalizeRequest(msg, initialRequest, self.events.RequestCompleted) return True @@ -870,7 +869,7 @@ if initialRequest is None: return False - initialRequest['FcStatus'] |= consts.RequestStatus.Success + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success initialRequest['FcMetadataContentType'] = msg.get('Metadata.ContentType', '') initialRequest['FcDataLength'] = msg.get('DataLength', '') @@ -889,11 +888,11 @@ if code == consts.FetchError.TooBig and initialRequest['FcRequestType'] == consts.RequestType.GetKeyInfo: initialRequest['FcMetadataContentType'] = msg.get('ExpectedMetadata.ContentType', '') initialRequest['FcDataLength'] = msg.get('ExpectedDataLength', -1) - initialRequest['FcStatus'] |= consts.RequestStatus.Success + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success self._finalizeRequest(msg, initialRequest, self.events.RequestCompleted) else: initialRequest['FcErrorMessage'] = msg - initialRequest['FcStatus'] |= consts.RequestStatus.Error + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Error self._finalizeRequest(msg, initialRequest, self.events.RequestFailed) return True @@ -918,13 +917,13 @@ # restore request self._requests[requestIdentifier] = restoredRequest - restoredRequest['FcStatus'] |= consts.RequestStatus.Started + restoredRequest['FcRequestStatus'] |= 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 + if not initialRequest['FcRequestStatus'] & consts.RequestStatus.Started: + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Started #TODO: update initialRequest with params from PersistentGet? @@ -969,7 +968,7 @@ if initialRequest is None: return False #TODO: notify user? - initialRequest['FcStatus'] |= consts.RequestStatus.Removed + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Removed self._finalizeRequest(msg, initialRequest, None) return True @@ -1013,13 +1012,13 @@ # restore request self._requests[requestIdentifier] = restoredRequest - restoredRequest['FcStatus'] = consts.RequestStatus.Started + restoredRequest['FcRequestStatus'] = 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 + if not initialRequest['FcRequestStatus'] & consts.RequestStatus.Started: + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Started #TODO: update initialRequest with params from PersistentPut? @@ -1032,7 +1031,7 @@ elif msg.name == consts.Message.PutFailed: if initialRequest is None: return False - initialRequest['FcStatus'] |= consts.RequestStatus.Error + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Error initialRequest['FcErrorMessage'] = msg self._finalizeRequest(msg, initialRequest, self.events.RequestFailed) return True @@ -1053,7 +1052,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.Success + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success initialRequest['URI'] = msg['URI'] self._finalizeRequest(msg, initialRequest, self.events.RequestCompleted) return True @@ -1068,14 +1067,14 @@ elif msg.name == consts.Message.FinishedCompression: if initialRequest is None: return False - initialRequest['FcStatus'] |= consts.RequestStatus.Compressed + initialRequest['FcRequestStatus'] |= 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 + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Compressing self.events.RequestCompressionStarted(initialRequest) return True @@ -1116,14 +1115,14 @@ elif msg.name == consts.Message.PluginInfo: if initialRequest is None: return False - initialRequest['FcStatus'] |= consts.RequestStatus.Success + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success self._finalizeRequest(msg, initialRequest, self.events.PluginInfo) return True elif msg.name == consts.Message.FCPPluginReply: if initialRequest is None: return False - initialRequest['FcStatus'] |= consts.RequestStatus.Success + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success self._finalizeRequest(msg, initialRequest, self.events.PluginMessage) return True @@ -1154,9 +1153,9 @@ insertURI = insertURI.replace(consts.KeyType.SSK, consts.KeyType.USK, 1) requestURI = requestURI.replace(consts.KeyType.SSK, consts.KeyType.USK, 1) - initialRequest['InsertURI'] = insertURI - initialRequest['RequestURI'] = requestURI - initialRequest['FcStatus'] |= consts.RequestStatus.Success + initialRequest['FcPrivateKey'] = insertURI + initialRequest['FcPublicKey'] = requestURI + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success self._finalizeRequest(msg, initialRequest, self.events.KeypairGenerated) return True @@ -1213,7 +1212,7 @@ # check if we have running requests. Assert False haveRunningRequests = False for request in self._requests.values(): - if not request.params['FcStatus'] & consts.RequestStatus.Completed: + if not request.params['FcRequestStatus'] & consts.RequestStatus.Completed: haveRunningRequests = True break @@ -1372,9 +1371,9 @@ userData=None, persistentUserData='', ): - """Requests a file from the node + """Requests datae from the node - @param uri: uri of the file to request (may contain prefixes like 'freenet:' or 'http://') + @param uri: uri of the data to request (may contain prefixes like 'freenet:' or 'http://') @param allowedMimeTypes: (str) list of allowed mime types @param binaryBlob: (bool) if True, the file is retrieved as binary blob file @@ -1389,12 +1388,14 @@ @return: (str) request identifier - @event: RequestCompleted(event, message) triggered when the request is complete - @event: RequestFailed(event, message) triggered when the request failes - @event: RequestStarted(event, message) triggered when as the request is started - @event: RequestModified(event, message) trigggered if the request identifier changes + @event: L{Events.RequestCompleted} triggered as soon as the request is complete + @event: L{Events.RequestFailed} triggered if the request failes + @event: L{Events.RequestStarted} triggered as soon as the request is started + @event: L{Events.RequestModified} trigggered if the request identifier changes or the request is modified otherwise (see L{modifyRequest}) + @note: the identifier of the request may change at any time. You should be prepaired to handle + this @note: if persistence is L{consts.Persistence.Connection} the request is removed from the client as soon as it completes or failes """ @@ -1563,6 +1564,10 @@ identifier = self.FcParams.newUuid(uuids=self._requests) self.sendMessage( consts.Message.SubscribeUSK, + FcModified={}, + FcRequestStatus=consts.RequestStatus.Pending, #TODO: status? + FcRequestType=consts.RequestType.SubscribeUSK, + Identifier=identifier, URI=uri, DontPoll=dontPoll, @@ -1574,6 +1579,37 @@ ## 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: + messageType = consts.RequestType.Put + elif msg.name == consts.Message.ClientPutDiskDir: + messageType = consts.RequestType.PutDiskDir + else: + messageType = consts.RequestType.PutComplexDir + + self._registerRequest( + msg, + userData, + messageType, + 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, @@ -1590,7 +1626,7 @@ msg[paramName] = value if data is not None: msg.data = data - + self._registerRequest( msg, userData, @@ -1613,6 +1649,7 @@ contentType=None, dontCompress=None, + filename=None, maxRetries=None, persistence=consts.Persistence.Connection, priorityClass=consts.Priority.Medium, @@ -1621,7 +1658,9 @@ userData=None, persistentUserData='', ): - """""" + """ + @param data: () + """ return self.clientPut( consts.KeyType.CHK, consts.RequestType.Put, @@ -1650,10 +1689,9 @@ def chkPutFile(self, - filename, - contentType=None, dontCompress=None, + filename=None, maxRetries=None, persistence=consts.Persistence.Connection, priorityClass=consts.Priority.Medium, @@ -1663,6 +1701,10 @@ persistentUserData='', ): + """ + @param filename: (str) filename to append to the CHK key or None (may not contain slashes) + """ + return self.clientPut( consts.KeyType.CHK, consts.RequestType.Put, @@ -1832,7 +1874,7 @@ a RequestRemoved event is triggered as soon as the request has actually been removed """ initialRequest = self._requests[requestIdentifier] - initialRequest['FcStatus'] |= consts.RequestStatus.Removed + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Removed if initialRequest.name in consts.Message.ClientKeyRequestMessages: self.sendMessage( consts.Message.RemovePersistentRequest, @@ -1997,7 +2039,7 @@ FcErrorMessage=None, FcModified={}, FcRequestType=consts.RequestType.PluginInfo, - FcStatus=consts.RequestStatus.Pending, + FcRequestStatus=consts.RequestStatus.Pending, Identifier=identifier, PluginName=pluginName, @@ -2022,7 +2064,7 @@ FcErrorMessage=None, FcModified={}, FcRequestType=consts.RequestType.PluginMessage, - FcStatus=consts.RequestStatus.Pending, + FcRequestStatus=consts.RequestStatus.Pending, Identifier=identifier, PluginName=pluginName, @@ -2042,12 +2084,20 @@ ## ########################################################## def generateKeypair(self, keypairType=consts.KeyType.SSK): - """ + """Generates a public / private keypair + @param keypairType: type of keypair to generate (either L{consts.KeyType.SSK} or L{consts.KeyType.SSK}) @return: identifier of the request - @event: KeypairGenerated(event, params) is triggered when the request is complete + + @event: L{Events.KeypairGenerated} triggered as soon as the request is complete + + @requestparam: B{FcModified:} (dict) + @requestparam: B{FcPrivateKey:} None. Will contain the private key as soon as the key is generated + @requestparam: B{FcPublivcKey:} None. Will contain the public key as soon as the key is generated + @requestparam: B{FcRequestStatus:} one or more of the L{consts.RequestStatus} flags + @requestparam: B{FcRequestType:} one or more of the L{consts.RequestType} flags + @requestparam: B{Identifier:} identifier of the request """ - if keypairType not in (consts.KeyType.SSK, consts.KeyType.USK): raise ValueError('keypairType must be %s or %s' % (consts.KeyType.SSK, consts.KeyType.USK)) @@ -2056,7 +2106,9 @@ msg = self.Message( consts.Message.GenerateSSK, FcModified={}, - FcStatus=consts.RequestStatus.Pending, + FcPrivateKey= None, + FcPublicKey=None, + FcRequestStatus=consts.RequestStatus.Pending, FcRequestType=requestType, Identifier=identifier, ) @@ -2159,8 +2211,6 @@ 'test123', #persistence=c.Persistence.Reboot, ) - - for i in xrange(500): c.next() #c.removeRequest(myIdentifier) @@ -2169,6 +2219,10 @@ #testChkPutData() + + + + def testChkPutFile(): fpath = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test.jpg') @@ -2207,9 +2261,32 @@ # c.next() #testUskPutData() + + + def testUskPutData(): + def cb(event, request): + insertURI = request['InsertURI'] + insertURI = 'USK@AKva7OolWsdAICB8ZE1hDgFqBJigJpYN2edJd6deiApU,dOitAHZSrt27Tl4wK7F-VHVShJVvzR7eNWKsXBolq8k,AQECAAE/' + + u = c.Upload(consts.KeyType.USK, privateKey=insertURI) + u.addData('foo/0/', 'data here') + c.putUpload(u) + + + 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() + + #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. |