Thread: SF.net SVN: fclient: [82] trunk/sandbox/fcp/fcp2_0_client.py
Status: Pre-Alpha
Brought to you by:
jurner
From: <ju...@us...> - 2008-01-28 11:22:23
|
Revision: 82 http://fclient.svn.sourceforge.net/fclient/?rev=82&view=rev Author: jurner Date: 2008-01-28 03:22:27 -0800 (Mon, 28 Jan 2008) Log Message: ----------- continued working on 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-01-28 11:21:45 UTC (rev 81) +++ trunk/sandbox/fcp/fcp2_0_client.py 2008-01-28 11:22:27 UTC (rev 82) @@ -11,6 +11,40 @@ """ + +#Bug reports filed and open: +#-------------------------------------------------------------------------------------------------------------------------------------------- +# [0001931: Send EndListPersistentRequests following client connect] +# +# PendingRequests currently get lost if a.) the node goes down b.) if the client goes down unexpectedly. +# This affects IdentifierCollision + FilenameCollision + ClientPut when a SSK needs to be created first +# +# we can handle this case none short of maintaining a file keeping messages. But still there is the +# problem of knowing when the node has actually registered a request. The node does not send +# an EndListPersistentRequests on connect so it is impossible to tell when or if to restore one of +# the pending requests we stored. +#--------------------------------------------------------------------------------------------------------------------------------------------- +# [0001893: CloseConnectionDuplicateClientName bug or feature?] +# +# CloseConnectionDuplicateClientName +# currently fcp takes down a our connection if another client (...) uses the same connection name. +#---------------------------------------------------------------------------------------------------------------------------------------------- +# [0001888: explicite connection locale] +# +# Many strings are already translated by freenet, but there is no way to tell the node wich language +# to use to talk to a client. Maybe a good idea, maybe not. +#----------------------------------------------------------------------------------------------------------------------------------------------- +# [0001781: unregister directories registered via TestDDARequest] +# +# With current state of the art DDA handling it is not possiblr to unregister directories (may pile +# up in memory over time). +#------------------------------------------------------------------------------------------------------------------------------------------------ +# [0002019: Socket dies if first message is not ClientHello] +# +# minor one +#------------------------------------------------------------------------------------------------------------------------------------------------- + + import atexit import base64 import cPickle @@ -135,6 +169,7 @@ Priority, ProtocolError, ReturnType, + UploadFrom, Verbosity, ) from fcp2_0_message import Message @@ -154,6 +189,7 @@ 'RequestCompleted', # the request is not removed neither from node nor client 'RequestFailed', # the request is already removed from node and client + 'RequestFetchable', 'RequestModified', 'RequestProgress', 'RequestRestored', @@ -174,13 +210,14 @@ 'PeerNote', + # others + 'SSKKeypair', + ############################### 'ProtocolError', - 'PersistentGet', + - # others - 'SSKKeypair', ) @@ -191,15 +228,15 @@ debugVerbosity=None, ): """ - @param conectionName: name of the connection + @param conectionName: name of the connection or None to use an arbitrary connection name @param debugVerbosity: verbosity level for debugging. Default is L{Verbosity.Warning} @ivar events: events the client supports """ - self._connectionName = connectionName - self._ddaTests = [] - self._identifierMapping = {} # mapping from identifiers to FcRequestIdentifiers - self._requests = {} + self._connectionName = self.setConnectionName(connectionName) + self._ddaTests = [] # currently running DDA tests (request0, ... requestN) + self._sskRequests = {} # currently pending ssk requests (sskIdentifier --> request) + self._requests = {} # currently running requests (requestIdentifier --> request) self._log = logging.getLogger(self.__class__.__name__) self._socket = None @@ -208,7 +245,7 @@ self.setDebugVerbosity(self.DebugVerbosity.Warning if debugVerbosity is None else debugVerbosity) atexit.register(self.close) - + ############################################################### ## @@ -253,6 +290,8 @@ # params from PersistentRequestModified 'FcModified': {}, + # params for DDA test + 'FcTestDDA': {}, # params for SimpleProgress 'FcProgressTotal': '0', @@ -284,8 +323,6 @@ @return: (str) uuid @note: the identifier returned is unique to the client but may not be unique to the node """ - - # we store FcRequestIdentifier and additional params in ClientToken identifier = self.FcParams.newUuid() # add additional params to msg @@ -384,12 +421,16 @@ self._socket.close() self._socket = None - # clean left over tmp files + # clean left over DDA test tmp files for initialRequest in self._ddaTests: - if initialRequest['FcTestDDA']['TmpFile'] is not None: + if initialRequest['FcTestDDA'].get('TmpFile', None) is not None: saveRemoveFile(initialRequest['FcTestDDA']['TmpFile']) - - + + self._ddaTests = [] + self._requests = {} + self._sskRequests = {} + + def connect(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 @@ -402,6 +443,10 @@ """ self._log.info(self.LogMessages.Connecting) + # try to Connect socket + if self._socket is not None: + self.close() + # poll untill freenet responds timeElapsed = 0 while timeElapsed <= duration: @@ -425,7 +470,7 @@ # So take it over here. self.sendMessage( self.Message.MessageClientHello, - Name=self._connectionName if self._connectionName is not None else uuid.uuid_time(), + Name=self._connectionName, ExpectedVersion=self.Version, ) while timeElapsed <= duration: @@ -458,6 +503,21 @@ raise StopIteration + def getConnectionName(self): + """Returns the connection name used by the client + @return: (str) connection name + """ + return self._connectionName + + def setConnectionName(self, connectionName=None): + """Sets the connection name to be used by the client + @param connectionName: (str) connection name or None to use an arbitrary connection name + @return: (str) connection name + """ + self._connectionName = uuid.uuid_time() if connectionName is None else connectionName + return self._connectionName + + def setDebugVerbosity(self, debugVerbosity): """Sets the verbosity level of the client @note: see L{Verbosity} @@ -490,14 +550,13 @@ @param msg: (Message) to handle @return: True if the message was handled, False otherwise """ + + CancelPersistentRequests = 0 # for testing... if True, cancels all PersistentRequests + if msg.name == self.Message.MessageClientSocketTimeout: return True self._log.debug(self.LogMessages.MessageReceived + msg.pprint()) - # check if we have a corrosponding initial message - fcRequestIdentifier = None - initialRequest = None - # check if we have an initial request corrosponding to msg requestIdentifier = msg.get('Identifier', None) initialRequest = None if requestIdentifier is None else self._requests.get(requestIdentifier, None) @@ -666,8 +725,6 @@ if initialRequest['FcTestDDA']['TmpFile'] is not None: saveRemoveFile(initialRequest['FcTestDDA']['TmpFile']) wantWrite = initialRequest.params['FcTestDDA']['WantWrite'] - errorMsg = initialRequest['FcTestDDA']['ErrorMsg'] - del initialRequest.params['FcTestDDA'] # check if test was sucessful testFailed = False @@ -678,12 +735,11 @@ if testFailed: - #TODO: check if Fcp removed the request #TODO: check if errorMsg gives reasonable feedback - del self._request[fcRequestIdentifier] + del self._request[initialRequest['Identifier']] initialRequest['FcStatus'] = self.Message.StatusError | self.Message.StatusRemoved - initialRequest['FcErrorMessage'] = errorMsg + initialRequest['FcErrorMessage'] = initialRequest['FcTestDDA']['ErrorMsg'] self.events.ProtocolError(initialRequest) return True @@ -767,8 +823,6 @@ # Fcp does no good job in handling persistent requests and identifiers. Already dropped some # notes and reports regarding this. See freenet-tech mailing list [Fcp notes and issues] - CancelPersistentRequests = 0 # for testing... if True, cancels all persistent requests - # unknown request... try to restore it if initialRequest is None: restoredRequest = self._restorePersistentRequestFromNode(msg) @@ -852,6 +906,37 @@ self.events.RequestProgress(initialRequest) return True + ## put related + + elif msg.name == self.Message.MessageURIGenerated: + if initialRequest is None: # something went wrong + return False + initialRequest['URI'] = msg['URI'] + return True + + + elif msg.name == self.Message.MessagePutFetchable: + if initialRequest is None: + # something went wrong + return False + + self.events.RequestFetchable(initialRequest) + return True + + + elif msg.name == self.Message.MessagePutSuccessful: + if initialRequest is None: + # something went wrong + return False + + # TODO: StartupTime and CompletionTime are passed, but + # as long as no corrosponding params are passed in DataFound + # we ignore them + initialRequest['URI'] = msg['URI'] + self.events.RequestCompleted(initialRequest) + return True + + #################################################### ## ## Peer related messages @@ -892,18 +977,26 @@ #################################################### elif msg.name == self.Message.MessageSSKKeypair: if initialRequest is None: - return False + self.events.SSKKeypair(msg) + return True - #TODO: maybe we need a mapping from SSKKeypair to pending request - initialRequest['Uri'] = msg['InsertUri'] initialRequest['FcRequestUri'] = msg['RequestUri'] - self.sendMessageEx(initialRequest) return True + + elif msg.name == self.Message.MessageCloseConnectionDuplicateClientName: + msg = self.Message( + self.Message.MessageClientDisconnected, + DisconnectReason=DisconnectReason.DuplicateClientName, + ) + self.events.ClientDisconnect(msg) + return True + + # default return False @@ -1018,6 +1111,46 @@ ## ClientGet related methods ## ######################################################## + def clientGet(self, + uri, + messageSubType, + userData, + persistentUserData, + filenameCollision, + **messageParams + ): + """Requests a key from the node + @param uri: uri of the file to request (may contain prefixes like 'freenet:' or 'http://') + @param messageSubType: one of the Message.SubType* consts to the desired request + @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 + @param messageParams: keyword arguments to pass along with the ClientGet message (uppercase first letter!!). + If the value of a keyword is None, it is ignored. + + @return: (str) identifier of the request + + + """ + uri = self.Uri(uri).uri + msg = self.Message(self.Message.MessageClientGet, URI=uri) + for paramName, value in messageParams.items(): + if value is not None: + msg[paramName] = value + + self._registerRequest( + msg, + userData, + messageSubType, + time.time(), + persistentUserData, + filenameCollision=filenameCollision, + ) + self.sendMessageEx(msg) + return msg['Identifier'] + + + def getData(self, uri, @@ -1052,45 +1185,30 @@ @return: (str) request identifier @note: if a filename collision is handled a RequestFilenameChanged event is triggered """ + return self.clientGet( + uri, + self.Message.SubTypeGetData, + userData, + persistentUserData, + consts.FilenameCollision.HandleNever, - msg = self.Message( - self.Message.MessageClientGet, - - BinaryBlob=binaryBlob, - Global=self.FcpFalse, - DSOnly=dsOnly, - - Identifier=None, - IgnoreDS=ignoreDS, - Persistence=persistence, - PriorityClass=priorityClass, - - ReturnType=self.ReturnType.Direct, - URI=self.Uri(uri).uri, - Verbosity=self.Verbosity.ReportProgress, - - #MaxTempSize=whatever, - #TempFilename=whatever - ) - if allowedMimeTypes is not None: - msg['AllowedMimeTypes'] = allowedMimeTypes - if maxRetries is not None: - msg['MaxRetries'] = maxRetries - if maxSize is not None: - msg['MaxSize'] = maxSize + # Fcp params + AllowedMimeTypes = allowedMimeTypes, + BinaryBlob=binaryBlob, + Global=self.FcpFalse, + DSOnly=dsOnly, + Identifier=None, + IgnoreDS=ignoreDS, + MaxRetries = maxRetries, + MaxSize = maxSize, + Persistence=persistence, + PriorityClass=priorityClass, + ReturnType=self.ReturnType.Direct, + URI=self.Uri(uri).uri, + Verbosity=self.Verbosity.ReportProgress, + ) - self._registerRequest( - msg, - userData, - self.Message.SubTypeGetData, - time.time(), - persistentUserData, - ) - self.sendMessageEx(msg) - return msg['Identifier'] - - def getFile(self, uri, filename, @@ -1129,52 +1247,37 @@ @return: (str) request identifier @note: if a filename collision is handled a RequestFilenameChanged event is triggered """ + return self.clientGet( + uri, + self.Message.SubTypeGetFile, + userData, + persistentUserData, + filenameCollision, - msg = self.Message( - self.Message.MessageClientGet, - - BinaryBlob=binaryBlob, - Filename=filename, - Global=self.FcpFalse, - DSOnly=dsOnly, - - Identifier=None, - IgnoreDS=ignoreDS, - Persistence=persistence, - PriorityClass=priorityClass, - - ReturnType=self.ReturnType.Disk, - URI=self.Uri(uri).uri, - Verbosity=self.Verbosity.ReportProgress, - - #MaxTempSize=whatever, - #TempFilename=whatever - ) - if allowedMimeTypes is not None: - msg['AllowedMimeTypes'] = allowedMimeTypes - if maxRetries is not None: - msg['MaxRetries'] = maxRetries - if maxSize is not None: - msg['MaxSize'] = maxSize + # Fcp params + AllowedMimeTypes = allowedMimeTypes, + BinaryBlob=binaryBlob, + Filename=filename, + Global=self.FcpFalse, + DSOnly=dsOnly, + Identifier=None, + IgnoreDS=ignoreDS, + MaxRetries = maxRetries, + MaxSize = maxSize, + Persistence=persistence, + PriorityClass=priorityClass, + ReturnType=self.ReturnType.Disk, + URI=self.Uri(uri).uri, + Verbosity=self.Verbosity.ReportProgress, + ) - self._registerRequest( - msg, - userData, - self.Message.SubTypeGetFile, - time.time(), - persistentUserData, - filenameCollision, - ) - self.sendMessageEx(msg) - return msg['Identifier'] - - def getKeyInfo(self, uri, dsOnly=consts.FcpFalse, ignoreDS=consts.FcpFalse, + maxRetries=None, persistence=consts.Persistence.Connection, priorityClass=consts.Priority.Medium, @@ -1187,6 +1290,7 @@ @param dsOnly: if FcpTrue, retrieves the file from the local data store only @param ignoreDs: If FcpTrue, ignores the local data store + @param maxRetries: (int) maximum number of retries or -1 to retry forver or None to leave it to the node to decide @param persistence: persistence of the request as one of the L{consts.Persistence} constants @param priorityClass: priority of the request as one of the L{consts.Priority} consts @param userData: any non persistent data to associate to the request @@ -1194,49 +1298,123 @@ @return: (str) request identifier """ - - # how to retrieve meta info about a key? - # ...idea is to provoke a GetFailed (TooBig) - - msg = self.Message( - self.Message.MessageClientGet, + # how to retrieve meta info about a key? ...idea is to provoke a GetFailed (TooBig) + return self.clientGet( + uri, + self.Message.SubTypeGetKeyInfo, + userData, + persistentUserData, + consts.FilenameCollision.HandleNever, + # Fcp params + Global=self.FcpFalse, DSOnly=dsOnly, - Global=self.FcpFalse, Identifier=None, IgnoreDS=ignoreDS, - + MaxRetries = maxRetries, MaxSize=self.MaxSizeKeyInfo, - Persistence=persistence, PriorityClass=priorityClass, ReturnType=self.ReturnType.Nothing, - URI=self.Uri(uri).uri, Verbosity=self.Verbosity.ReportProgress, ) + + + ######################################################## + ## + ## ClientPut related methods + ## + ######################################################## + def clientPut(self, + uri, + messageSubType, + userData, + persistentUserData, + data, + **messageParams): + + msg = self.Message(self.Message.MessageClientPut, URI=uri) + for paramName, value in messageParams.items(): + if value is not None: + msg[paramName] = value + if data is not None: + msg.data = data self._registerRequest( msg, userData, - self.Message.SubTypeGetKeyInfo, + messageSubType, time.time(), persistentUserData, + #filenameCollision=filenameCollision, ) self.sendMessageEx(msg) return msg['Identifier'] - - ######################################################## - ## - ## ClientPut related methods - ## - ######################################################## - def put(self): + + + #TODO: method names + + #CHK + def putData(self, + data, + + contentType=None, + dontCompress=None, + maxRetries=None, + persistence=consts.Persistence.Connection, + priorityClass=consts.Priority.Medium, + targetFilename=None, + + userData=None, + persistentUserData='', + ): + + return self.clientPut( + self.Uri.KeyCHK, + self.Message.SubTypePutData, + userData, + persistentUserData, + data, + + # fcp params + ContentType=contentType, + DataLength=len(data), + #EarlyEncode='false', + #GetCHKOnly='false', + Global=self.FcpFalse, + Identifier=None, + MaxRetries=maxRetries, + DontCompress=dontCompress, + Persistence=persistence, + TergetFilename=targetFilename, + UploadFrom=self.UploadFrom.Direct, + Verbosity=self.Verbosity.ReportProgressAndCompression, + ) + + def putFile(self): pass + + #KSK + def putNamedData(self): + pass + def putReference(self): + pass + #SSK + def putUpdatableData(self): + pass + + + #USK + def putVersionedData(self): + pass + + + ######################################################## ## ## request related methods @@ -1379,7 +1557,7 @@ """ while True: identifier = uuid.uuid_time() - if identifier not in self._requests: + if identifier not in self._sskRequests: break self.sendMessage( self.Message.MessageGenerateSSK, @@ -1427,7 +1605,7 @@ def testGetFile(): filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test.jpg') - + print filename identifier = c.getFile( 'CHK@q4~2soHTd9SOINIoXmg~dn7LNUAOYzN1tHNHT3j4c9E,gcVRtoglEhgqN-DJolXPqJ4yX1f~1gBGh89HNWlFMWQ,AAIC--8/snow_002%20%2810%29.jpg', filename, @@ -1438,11 +1616,11 @@ for i in xrange(50): c.next() - #c.removeRequest(identifier) - #for i in xrange(5): - # c.next() + c.removeRequest(identifier) + for i in xrange(5): + c.next() - testGetFile() + #testGetFile() @@ -1457,10 +1635,25 @@ for i in xrange(5): c.next() - #testgetKeyInfo() + #testGetKeyInfo() + def testPutData(): + identifier = c.putData( + 'test123', + ) + + for i in xrange(1000): + c.next() + c.removeRequest(identifier) + for i in xrange(5): + c.next() + + #testPutData() + + + def testConfigData(): from fcp2_0_config import Config @@ -1478,7 +1671,7 @@ #testConfigData() - + def testNodeData(): def cb(event, msg): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-01-29 11:28:05
|
Revision: 85 http://fclient.svn.sourceforge.net/fclient/?rev=85&view=rev Author: jurner Date: 2008-01-29 03:28:06 -0800 (Tue, 29 Jan 2008) Log Message: ----------- Started implementing python <--> fcp value type mapping 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-01-29 11:27:31 UTC (rev 84) +++ trunk/sandbox/fcp/fcp2_0_client.py 2008-01-29 11:28:06 UTC (rev 85) @@ -46,7 +46,6 @@ import atexit -import base64 import cPickle import logging import os @@ -157,8 +156,6 @@ ConnectReason, DebugVerbosity, DisconnectReason, - FcpTrue, - FcpFalse, FetchError, FilenameCollision, InsertError, @@ -229,7 +226,7 @@ ): """ @param conectionName: name of the connection or None to use an arbitrary connection name - @param debugVerbosity: verbosity level for debugging. Default is L{Verbosity.Warning} + @param debugVerbosity: verbosity level for debugging. Default is L{DebugVerbosity.Warning} @ivar events: events the client supports """ @@ -267,8 +264,8 @@ # persistent params that will go into identifier 'FcSubType': msgSubType, # identifies sub message types - 'FcInitTime': self.fcpTime(initTime), # when was the request started? - 'FcFilenameCollision': filenameCollision, # handle fielanem collisions? + 'FcInitTime': initTime, # when was the request started? + 'FcFilenameCollision': filenameCollision, # handle fielanem collisions? 'FcPersistentUserData': persistentUserData, # any user defined persistent data # non persistent params @@ -349,9 +346,6 @@ if fcParams is None: return None - # have to re-adjust initTime to python time - fcParams[self.FcParams.IInitTime] = self.pythonTime(fcParams[self.FcParams.IInitTime]) - # add additional params to msg msg = self._addFcParamsToRequest( msg, @@ -370,45 +364,8 @@ return msg - - ############################################################### ## - ## Fcp <--> Python mappings - ## - ############################################################### - def fcpBool(self, pythonBool): - """Converts a python bool to a fcp bool - @param pythonBool: (bool) - @return: (str) 'true' or 'false' - """ - return self.FcpTrue if pythonBool else self.FcpFalse - - def fcpTime(self, pythonTime): - """Converts a python time value to a fcp time value - @param fcpTime: (int, str) time to convert - @raise ValueError: if the python time could not be converted - @return: (int) fcp time - """ - return pythonTime * 1000 - - def pythonBool(self, fcpBool): - """Converts a fcp bool to a python bool - @param pythonBool: 'true' or 'false' - @return: (bool) True or False - """ - return fcpBool == self.FcpTrue - - def pythonTime(self, fcpTime): - """Converts a fcp time value to a python time value - @param fcpTime: (int, str) time to convert - @raise ValueError: if the fcp time could not be converted - @return: (int) python time - """ - return int(fcpTime) / 1000 - - ############################################################### - ## ## connection related methods ## ############################################################### @@ -520,7 +477,7 @@ def setDebugVerbosity(self, debugVerbosity): """Sets the verbosity level of the client - @note: see L{Verbosity} + @note: see L{DebugVerbosity} """ self._log.setLevel(debugVerbosity) @@ -604,14 +561,14 @@ elif code == self.ProtocolError.DDADenied: ddaRequestMsg = self.Message(self.Message.MessageTestDDARequest) if initialRequest.name == self.Message.MessageClientGet: - ddaRequestMsg['WantWriteDirectory'] = self.FcpTrue + ddaRequestMsg['WantWriteDirectory'] = True directory = os.path.dirname(initialRequest['Filename']) else: #TODO: determine directory for other cases raise RuntimeError(NotImplemented) - ddaRequestMsg['WantReadDirectory'] = self.FcpTrue + ddaRequestMsg['WantReadDirectory'] = True directory = None ddaRequestMsg['Directory'] = directory @@ -621,7 +578,7 @@ 'Directory': directory, 'Replied': False, 'TmpFile': None, - 'WantWrite': self.pythonBool(ddaRequestMsg.get('WantWriteDirectory', self.FcpFalse)), + 'WantWrite': ddaRequestMsg.get('WantWriteDirectory', False), 'ErrorMsg': msg, } self._ddaTests.append(initialRequest) @@ -729,15 +686,15 @@ # check if test was sucessful testFailed = False if wantWrite: - testFailed = not self.pythonBool(msg.params.get('WriteDirectoryAllowed', self.FcpFalse) ) + testFailed = not msg.params.get('WriteDirectoryAllowed', False) else: - testFailed = not self.pythonBool(msg.params.get('ReadDirectoryAllowed', self.FcpFalse) ) + testFailed = not msg.params.get('ReadDirectoryAllowed', False) if testFailed: #TODO: check if errorMsg gives reasonable feedback - del self._request[initialRequest['Identifier']] + del self._requests[initialRequest['Identifier']] initialRequest['FcStatus'] = self.Message.StatusError | self.Message.StatusRemoved initialRequest['FcErrorMessage'] = initialRequest['FcTestDDA']['ErrorMsg'] self.events.ProtocolError(initialRequest) @@ -801,8 +758,8 @@ if code == self.FetchError.TooBig and initialRequest['FcSubType'] == self.Message.SubTypeGetKeyInfo: initialRequest['FcStatus'] = self.Message.StatusComplete initialRequest['FcMetadataContentType'] = msg.get('ExpectedMetadata.ContentType', '') - initialRequest['FcDataLength'] = msg.get('ExpectedDataLength', '') - initialRequest['FcProgressCompleted'] = self.FcpTrue + initialRequest['FcDataLength'] = msg.get('ExpectedDataLength', -1) + initialRequest['FcProgressCompleted'] = True #TODO: check if Fcp removed the request self.events.RequestCompleted(initialRequest) @@ -955,10 +912,6 @@ return True elif msg.name == self.Message.MessagePeerNote: - note = msg.get('NoteText', '') - if note: - note = base64.decodestring(note) - msg['NoteText'] = note self.events.PeerNote(msg) return True @@ -1068,13 +1021,13 @@ ######################################################### #TODO: WithDefault never returns defaults def getConfig(self, - withCurrent=consts.FcpTrue, - withDefaults=consts.FcpTrue, - withExpertFlag=consts.FcpTrue, - withForceWriteFlag=consts.FcpTrue, - withSortOrder=consts.FcpTrue, - withShortDescription=consts.FcpTrue, - withLongDescription=consts.FcpTrue, + withCurrent=True, + withDefaults=True, + withExpertFlag=True, + withForceWriteFlag=True, + withSortOrder=True, + withShortDescription=True, + withLongDescription=True, ): """ @event: ConfigData(event, msg) @@ -1155,9 +1108,9 @@ uri, allowedMimeTypes=None, - binaryBlob=consts.FcpFalse, - dsOnly=consts.FcpFalse, - ignoreDS=consts.FcpFalse, + binaryBlob=False, + dsOnly=False, + ignoreDS=False, maxRetries=None, maxSize=None, persistence=consts.Persistence.Connection, @@ -1171,9 +1124,9 @@ @param uri: uri of the file to request (may contain prefixes like 'freenet:' or 'http://') @param allowedMimeTypes: (str) list of allowed mime types - @param binaryBlob: if FcpTrue, the file is retrieved as binary blob file - @param dsOnly: if FcpTrue, retrieves the file from the local data store only - @param ignoreDs: If FcpTrue, ignores the local data store + @param binaryBlob: if True, the file is retrieved as binary blob file + @param dsOnly: if True, retrieves the file from the local data store only + @param ignoreDs: If True, ignores the local data store @param maxRetries: (int) maximum number of retries or -1 to retry forver or None to leave it to the node to decide @param maxSize: (int) maximum size of the file in bytes or None to set no limited @param persistence: persistence of the request as one of the L{consts.Persistence} constants @@ -1195,7 +1148,7 @@ # Fcp params AllowedMimeTypes = allowedMimeTypes, BinaryBlob=binaryBlob, - Global=self.FcpFalse, + Global=False, DSOnly=dsOnly, Identifier=None, IgnoreDS=ignoreDS, @@ -1214,9 +1167,9 @@ filename, allowedMimeTypes=None, - binaryBlob=consts.FcpFalse, - dsOnly=consts.FcpFalse, - ignoreDS=consts.FcpFalse, + binaryBlob=False, + dsOnly=False, + ignoreDS=False, maxRetries=None, maxSize=None, persistence=consts.Persistence.Connection, @@ -1232,9 +1185,9 @@ @param filename: (full path) filename to store the file to @param allowedMimeTypes: (str) list of allowed mime types - @param binaryBlob: if FcpTrue, the file is retrieved as binary blob file - @param dsOnly: if FcpTrue, retrieves the file from the local data store only - @param ignoreDs: If FcpTrue, ignores the local data store + @param binaryBlob: if True, the file is retrieved as binary blob file + @param dsOnly: if True, retrieves the file from the local data store only + @param ignoreDs: If True, ignores the local data store @param maxRetries: (int) maximum number of retries or -1 to retry forver or None to leave it to the node to decide @param maxSize: (int) maximum size of the file in bytes or None to set no limited @param persistence: persistence of the request as one of the L{consts.Persistence} constants @@ -1258,7 +1211,7 @@ AllowedMimeTypes = allowedMimeTypes, BinaryBlob=binaryBlob, Filename=filename, - Global=self.FcpFalse, + Global=False, DSOnly=dsOnly, Identifier=None, IgnoreDS=ignoreDS, @@ -1275,8 +1228,8 @@ def getKeyInfo(self, uri, - dsOnly=consts.FcpFalse, - ignoreDS=consts.FcpFalse, + dsOnly=False, + ignoreDS=False, maxRetries=None, persistence=consts.Persistence.Connection, priorityClass=consts.Priority.Medium, @@ -1288,8 +1241,8 @@ @param uri: uri of the file to request (may contain prefixes like 'freenet:' or 'http://') - @param dsOnly: if FcpTrue, retrieves the file from the local data store only - @param ignoreDs: If FcpTrue, ignores the local data store + @param dsOnly: if True, retrieves the file from the local data store only + @param ignoreDs: If True, ignores the local data store @param maxRetries: (int) maximum number of retries or -1 to retry forver or None to leave it to the node to decide @param persistence: persistence of the request as one of the L{consts.Persistence} constants @param priorityClass: priority of the request as one of the L{consts.Priority} consts @@ -1307,7 +1260,7 @@ consts.FilenameCollision.HandleNever, # Fcp params - Global=self.FcpFalse, + Global=False, DSOnly=dsOnly, Identifier=None, IgnoreDS=ignoreDS, @@ -1382,14 +1335,14 @@ DataLength=len(data), #EarlyEncode='false', #GetCHKOnly='false', - Global=self.FcpFalse, + Global=False, Identifier=None, MaxRetries=maxRetries, DontCompress=dontCompress, Persistence=persistence, TergetFilename=targetFilename, UploadFrom=self.UploadFrom.Direct, - Verbosity=self.Verbosity.ReportProgressAndCompression, + Verbosity=self.Verbosity.ReportProgress | self.Verbosity.ReportCompression, ) def putFile(self): @@ -1447,7 +1400,7 @@ msg = self.Message( self.Message.MessageModifyPersistentRequest, Identifier=initialRequest['Identifier'], - Global=self.FcpFalse, + Global=False, ) if persistentUserData is not None: initialRequest['FcPersistentUserData'] = persistentUserData @@ -1467,7 +1420,7 @@ initialRequest['FcStatus'] = self.Message.StatusRemoved self.sendMessage( self.Message.MessageRemovePersistentRequest, - Global=self.FcpFalse, + Global=False, Identifier=requestIdentifier, ) @@ -1578,6 +1531,7 @@ for nodeHello in c.connect(): pass if nodeHello is not None: + #for i in xrange(5): # c.next() @@ -1589,7 +1543,7 @@ identifier = c.getData( 'CHK@q4~2soHTd9SOINIoXmg~dn7LNUAOYzN1tHNHT3j4c9E,gcVRtoglEhgqN-DJolXPqJ4yX1f~1gBGh89HNWlFMWQ,AAIC--8/snow_002%20%2810%29.jpg', - #binaryBlob=c.FcpTrue, + #binaryBlob=True, ) for i in xrange(50): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-03 13:14:54
|
Revision: 126 http://fclient.svn.sourceforge.net/fclient/?rev=126&view=rev Author: jurner Date: 2008-02-03 05:14:59 -0800 (Sun, 03 Feb 2008) Log Message: ----------- persistence == connection is now handled ++ 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-03 13:13:56 UTC (rev 125) +++ trunk/sandbox/fcp/fcp2_0_client.py 2008-02-03 13:14:59 UTC (rev 126) @@ -485,7 +485,8 @@ self.close() msg = self.Message( consts.Message.ClientDisconnected, - DisconnectReason=consts.DisconnectReason.VersionMissmatch + DisconnectReason=consts.DisconnectReason.VersionMissmatch, + Param=msg, ) self.events.ClientDisconnected(msg) yield self._nodeHelloMessage @@ -503,7 +504,8 @@ msg = self.Message( consts.Message.ClientDisconnected, - DisconnectReason=consts.DisconnectReason.ConnectingFailed + DisconnectReason=consts.DisconnectReason.ConnectingFailed, + Param=None, ) self.events.ClientDisconnected(msg) self._log.info(consts.LogMessages.ConnectingFailed) @@ -605,7 +607,8 @@ self.close() msg = self.Message( consts.Message.ClientDisconnected, - DisconnectReason=DisconnectReason.Shutdown, + DisconnectReason=consts.DisconnectReason.Shutdown, + Param=None, ) self.events.ClientDisconnected(msg) return True @@ -810,45 +813,49 @@ elif msg.name == consts.Message.AllData: if initialRequest is None: return False - + + # 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] + + initialRequest['FcStatus'] = consts.MessageStatus.Complete initialRequest.data = msg.data self.events.RequestCompleted(initialRequest) return True elif msg.name == consts.Message.DataFound: - if initialRequest is None: - # something is going wrong return False initialRequest['FcStatus'] = consts.MessageStatus.Complete initialRequest['FcMetadataContentType'] = msg.get('Metadata.ContentType', '') initialRequest['FcDataLength'] = msg.get('DataLength', '') if initialRequest['FcSubType'] != consts.MessageSubType.GetData: + initialRequest['FcStatus'] = consts.MessageStatus.Complete + + # 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] self.events.RequestCompleted(initialRequest) return True - + - elif msg.name == consts.Message.GetFailed: - code = msg['Code'] if initialRequest is None: - # something is going wrong return False + # 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] + # check if it is one of our requests for key information - if code == self.FetchError.TooBig and initialRequest['FcSubType'] == consts.MessageSubType.GetKeyInfo: + code = msg['Code'] + if code == consts.FetchError.TooBig and initialRequest['FcSubType'] == consts.MessageSubType.GetKeyInfo: initialRequest['FcStatus'] = consts.MessageStatus.Complete initialRequest['FcMetadataContentType'] = msg.get('ExpectedMetadata.ContentType', '') initialRequest['FcDataLength'] = msg.get('ExpectedDataLength', -1) - initialRequest['FcProgressCompleted'] = True - #TODO: check if Fcp removed the request - self.events.RequestCompleted(initialRequest) else: - - #TODO: check if Fcp removed the request - initialRequest['FcErrorMessage'] = msg initialRequest['FcStatus'] = consts.MessageStatus.Error self.events.RequestFailed(initialRequest) @@ -975,7 +982,6 @@ elif msg.name == consts.Message.SimpleProgress: if initialRequest is None: - # something went wrong return False initialRequest['FcProgressTotal'] = msg['Total'] @@ -989,11 +995,24 @@ ## put related elif msg.name == consts.Message.URIGenerated: - if initialRequest is None: # something went wrong + if initialRequest is None: return False initialRequest['URI'] = msg['URI'] return True + elif msg.name == consts.Message.PutFailed: + if initialRequest is None: + return False + + # 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] + + initialRequest['FcErrorMessage'] = msg + initialRequest['FcStatus'] = consts.MessageStatus.Error + self.events.RequestFailed(initialRequest) + return True + elif msg.name == consts.Message.PutFetchable: if initialRequest is None: @@ -1006,12 +1025,12 @@ elif msg.name == consts.Message.PutSuccessful: if initialRequest is None: - # something went wrong return False # 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['URI'] = msg['URI'] self.events.RequestCompleted(initialRequest) return True @@ -1075,9 +1094,10 @@ elif msg.name == consts.Message.CloseConnectionDuplicateClientName: msg = self.Message( consts.Message.ClientDisconnected, - DisconnectReason=DisconnectReason.DuplicateClientName, + DisconnectReason=consts.DisconnectReason.DuplicateClientName, + Param=None, ) - self.events.ClientDisconnect(msg) + self.events.ClientDisconnected(msg) return True @@ -1119,9 +1139,13 @@ msg = self.Message.fromSocket(self._socket) if msg.name == consts.Message.ClientSocketDied: if dispatch: - msg['DisconnectReason'] = consts.DisconnectReason.SocketDied + msg = self.Message( + consts.Message.ClientDisconnected, + DisconnectReason=consts.DisconnectReason.SocketDied, + Param=msg, + ) self.events.ClientDisconnected(msg) - raise socket.error(msg['Details']) + #raise socket.error(msg['Param']['Details']) elif msg.name == consts.Message.ClientSocketTimeout: if dispatch: @@ -1166,14 +1190,12 @@ except socket.error, d: self._log.info(consts.LogMessages.SocketDied) self.close() - - errorMsg = self.Message( - consts.Message.ClientSocketDied, - DisconnectReason=consts.DisconnectReason.SocketDied, - Exception=socket.error, - Details=d + msg = self.Message( + consts.Message.ClientDisconnected, + DisconnectReason=consts.DisconnectReason.SocketDied, + Param=self.Message(consts.Message.ClientSocketDied, Exception=socket.error, Details=d) ) - self.events.ClientDisconnected(errorMsg) + self.events.ClientDisconnected(msg) raise socket.error(d) return msg @@ -1288,12 +1310,19 @@ @param maxSize: (int) maximum size of the file in bytes or None to set no limited @param persistence: (L{consts.Persistence}) persistence of the request @param priorityClass: (L{consts.Priority}) priority of the request - @param userData: any non persistent data to associate to the request @param persistentUserData: any string to associate to the request as persistent data + + @return: (str) request identifier - @return: (str) request identifier - @note: if a filename collision is handled a RequestFilenameChanged event is triggered + @param event: RequestCompleted(event, message) triggered when the request is complete + @param event: RequestFailed(event, message) triggered when the request failes + @param event: RequestStarted(event, message) triggered when as the request is started + @param event: RequestModified(event, message) trigggered if the request identifier changes + or the request is modified otherwise (see L{modifyRequest}) + + @note: if persistence is L{consts.Persistence.Connection} the request is removed from the client + as soon as it completes or failes """ return self.clientGet( uri, @@ -1349,13 +1378,20 @@ @param maxSize: (int) maximum size of the file in bytes or None to set no limited @param persistence: (L{consts.Persistence}) persistence of the request @param priorityClass: (L{consts.Priority}) priority of the request - @param filenameCollision: what to do if the disk target alreaady exists. One of the FilenameCollision.* consts @param userData: any non persistent data to associate to the request @param persistentUserData: any string to associate to the request as persistent data @return: (str) request identifier - @note: if a filename collision is handled a RequestFilenameChanged event is triggered + + @param event: RequestCompleted(event, message) triggered when the request is complete + @param event: RequestFailed(event, message) triggered when the request failes + @param event: RequestStarted(event, message) triggered when as the request is started + @param event: RequestModified(event, message) trigggered if the request identifier changes, + filename changes or the request is modified otherwise (see L{modifyRequest}) + + @note: if persistence is L{consts.Persistence.Connection} the request is removed from the client + as soon as it completes or failes """ return self.clientGet( uri, @@ -1407,6 +1443,15 @@ @param persistentUserData: any string to associate to the request as persistent data @return: (str) request identifier + + @param event: RequestCompleted(event, message) triggered when the request is complete + @param event: RequestFailed(event, message) triggered when the request failes + @param event: RequestStarted(event, message) triggered when as the request is started + @param event: RequestModified(event, message) trigggered if the request identifier changes + or the request is modified otherwise (see L{modifyRequest}) + + @note: if persistence is L{consts.Persistence.Connection} the request is removed from the client + as soon as it completes or failes """ # how to retrieve meta info about a key? ...idea is to provoke a GetFailed (TooBig) return self.clientGet( @@ -1902,9 +1947,9 @@ for i in xrange(50): c.next() - c.removeRequest(identifier) - for i in xrange(5): - c.next() + #c.removeRequest(identifier) + #for i in xrange(5): + # c.next() #testGetData() @@ -1917,30 +1962,42 @@ 'CHK@q4~2soHTd9SOINIoXmg~dn7LNUAOYzN1tHNHT3j4c9E,gcVRtoglEhgqN-DJolXPqJ4yX1f~1gBGh89HNWlFMWQ,AAIC--8/snow_002%20%2810%29.jpg', filename, filenameCollision=c.FilenameCollision.HandleRename, - persistence=consts.Persistence.Forever, + #persistence=consts.Persistence.Forever, ) for i in xrange(50): c.next() - c.removeRequest(identifier) - for i in xrange(5): - c.next() + #c.removeRequest(identifier) + #for i in xrange(5): + # c.next() #testGetFile() def testGetKeyInfo(): + + + identifier = c.getKeyInfo( 'CHK@q4~2soHTd9SOINIoXmg~dn7LNUAOYzN1tHNHT3j4c9E,gcVRtoglEhgqN-DJolXPqJ4yX1f~1gBGh89HNWlFMWQ,AAIC--8/snow_002%20%2810%29.jpg', + #persistence=c.consts.Persistence.Reboot, ) - - for i in xrange(50): + + + def cb(event, msg): + if event == c.events.RequestCompleted: + pass + #c.sendMessage(c.consts.Message.GetRequestStatus, Identifier=identifier) + c.events.RequestCompleted += cb + + for i in xrange(55): c.next() - c.removeRequest(identifier) - for i in xrange(5): - c.next() + #c.removeRequest(identifier) + #for i in xrange(5): + # c.next() + c.events.RequestCompleted -= cb #testGetKeyInfo() @@ -1953,9 +2010,9 @@ for i in xrange(100): c.next() - c.removeRequest(myIdentifier) - for i in xrange(5): - c.next() + #c.removeRequest(myIdentifier) + #for i in xrange(5): + # c.next() #testPutData() @@ -1969,9 +2026,9 @@ for i in xrange(1000): c.next() - c.removeRequest(identifier) - for i in xrange(5): - c.next() + #c.removeRequest(identifier) + #for i in xrange(5): + # c.next() #testPutFile() 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:50:53
|
Revision: 135 http://fclient.svn.sourceforge.net/fclient/?rev=135&view=rev Author: jurner Date: 2008-02-04 03:50:30 -0800 (Mon, 04 Feb 2008) Log Message: ----------- 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-04 11:49:28 UTC (rev 134) +++ trunk/sandbox/fcp/fcp2_0_client.py 2008-02-04 11:50:30 UTC (rev 135) @@ -113,6 +113,7 @@ from fcp2_0_config import Config from fcp2_0_message import Message import fcp2_0_params as FcParams +from fcp2_0_requests import Upload from fcp2_0_uri import Uri @@ -203,6 +204,7 @@ Message = Message FcParams = FcParams Uri = Uri + Upload = Upload @@ -339,7 +341,7 @@ fcParams[self.FcParams.IFilenameCollision], ) - # fix some Fcp inconsistencies ClientGet vs. PersistentGet + #FIX: remove Started param from PersistentGet / Put if msg.name == consts.Message.PersistentGet: del msg.params['Started'] #FIX: [0001965: Persistence vs PersistenceType] @@ -1462,7 +1464,7 @@ ## ClientPut related methods ## ######################################################## - def clientPutUpload(self, upload, userData=None, persistentUserData=''): + def putUpload(self, upload, userData=None, persistentUserData=''): msg = upload.getMessage(self.Message) if msg is None: @@ -1486,10 +1488,9 @@ ) if upload.keyType in (consts.KeyType.SSK, consts.KeyType.USK): - msg['FcRequestUri'] = upload.publicKey + msg['FcInsertUri'] = upload.privateKey #NOTE: the caller may use the 'FcInsertUri' member to store the private key - self.sendMessageEx(msg) return msg['Identifier'] @@ -1505,6 +1506,8 @@ msg = self.Message(consts.Message.ClientPut, URI=uri) for paramName, value in messageParams.items(): if value is not None: + if param == 'ContentType': + param = 'Metadata.ContentType' msg[paramName] = value if data is not None: msg.data = data @@ -1892,7 +1895,7 @@ if nodeHello is not None: - #for i in xrange(50): + #for i in xrange(10): # c.next() @@ -1970,7 +1973,13 @@ #persistence=c.Persistence.Reboot, ) - for i in xrange(100): + #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() #c.removeRequest(myIdentifier) #for i in xrange(5): @@ -1982,9 +1991,12 @@ def testPutFile(): fpath = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test.jpg') - identifier = c.putFile( - fpath, - ) + #identifier = c.putFile( + # fpath, + # ) + u = c.Upload(c.consts.KeyType.CHK) + u.addFile('', fpath) + c.putUpload(u) for i in xrange(1000): c.next() @@ -1993,6 +2005,7 @@ # c.next() #testPutFile() + def testConfigData(): @@ -2027,7 +2040,7 @@ for i in xrange(10): c.next() - #testConfigData() + testConfigData() @@ -2049,6 +2062,7 @@ def cb(event, msg): print msg.pprint() + pass c.events.KeypairGenerated += cb c.generateKeypair('SSK@') 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-08 23:40:27
|
Revision: 191 http://fclient.svn.sourceforge.net/fclient/?rev=191&view=rev Author: jurner Date: 2008-02-08 15:40:33 -0800 (Fri, 08 Feb 2008) Log Message: ----------- what a bitch to implement .. Modified Paths: -------------- trunk/sandbox/fcp/fcp2_0_client.py Modified: trunk/sandbox/fcp/fcp2_0_client.py =================================================================== --- trunk/sandbox/fcp/fcp2_0_client.py 2008-02-08 18:54:35 UTC (rev 190) +++ trunk/sandbox/fcp/fcp2_0_client.py 2008-02-08 23:40:33 UTC (rev 191) @@ -870,8 +870,11 @@ if initialRequest is None: return False + code = msg['Code'] + if code == consts.FetchError.Canceled: + return False + # check if it is one of our requests for key information - code = msg['Code'] if code == consts.FetchError.TooBig and initialRequest['FcRequestType'] == consts.RequestType.GetKeyInfo: initialRequest['FcMetadataContentType'] = msg.get('ExpectedMetadata.ContentType', '') initialRequest['FcDataLength'] = msg.get('ExpectedDataLength', -1) @@ -958,9 +961,13 @@ elif msg.name == consts.Message.PersistentRequestRemoved: if initialRequest is None: return False - #TODO: notify user? - initialRequest['FcRequestStatus'] |= consts.RequestStatus.Removed - self._finalizeRequest(msg, initialRequest, None) + + initialRequest['FcRequestStatus'] |= (consts.RequestStatus.Removed | + consts.RequestStatus.Completed | + consts.RequestStatus.RemovedFromQueue + ) + + del self._requests[requestIdentifier] return True @@ -1026,6 +1033,11 @@ elif msg.name == consts.Message.PutFailed: if initialRequest is None: return False + + code = msg['Code'] + if code == consts.InsertError.Canceled: + return False + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Error initialRequest['FcErrorMessage'] = msg self._finalizeRequest(msg, initialRequest, self.events.RequestFailed) @@ -1853,17 +1865,23 @@ def removeRequest(self, requestIdentifier): """Removes a request @param requestIdentifier: (str) identifier of the request to remove - - @note: you can use this method to remove get / put requests . All attempts to remove other requests will fail """ initialRequest = self._requests[requestIdentifier] initialRequest['FcRequestStatus'] |= consts.RequestStatus.Removed if initialRequest['FcRequestType'] & (consts.RequestType.MaskGet | consts.RequestType.MaskPut): - self.sendMessage( - consts.Message.RemovePersistentRequest, - Global=False, - Identifier=requestIdentifier, - ) + + # remove Persistence.Connection emidiately + if initialRequest['Persistence'] == consts.Persistence.Connection: + initialRequest['FcRequestStatus'] |= (consts.RequestStatus.Completed | + consts.RequestStatus.RemovedFromQueue + ) + del self._requests[requestIdentifier] + else: + self.sendMessage( + consts.Message.RemovePersistentRequest, + Global=False, + Identifier=requestIdentifier, + ) else: del self._requests[requestIdentifier] @@ -1871,36 +1889,37 @@ # werong. Maybe a ProtocolError.NoSuchIdentifier ??? - def resendRequest(self, requestMessage): + def resendRequest(self, request): """Resends a request - @param requestMessage: (L{fcp2_0_message.Message}) + @param request: (L{fcp2_0_message.Message}) @return: (str) request identifier - @note: you can use this method to resend get / put request, genarate keypair requests or - plugin messages. All attempts to resend other requests will fail - @note: the request passed is not removed in the call. Use L{removeRequest} if necessary + @note: you can use this method to resend get / put requests.All attempts to resend other requests + will fail + @note: the request passed removed in the call if necessary. Except for FcInitTime is reseet, but + otherwise it is left unchanged """ - requestType = requestMessage.get('FcRequestType', None) - if requestType is None: + requestType = request.get('FcRequestType', consts.RequestType.Null) + if not requestType & (consts.RequestType.MaskGet | consts.RequestType.MaskPut): raise ValueError('Can not resend request: %s' % requestMessage.name) - - if requestType & (consts.RequestType.MaskGet | consts.RequestType.MaskPut): - self._registerRequest( - requestMessage, - requestType, - filenameCollision=requestMessage['FcFilenameCollision'] & consts.FilenameCollision.MaskHandle, - #initTime=time.time(), # TODO: reset init time or not? - persistentUserData=requestMessage['FcPersistentUserData'], - userData=requestMessage['FcUserData'], - ) - elif requestType & (consts.RequestType.MaskGenerateKeypair | onsts.RequestType.MaskPlugin): - self._registerRequest(requestMessage, requestType) - else: - raise ValueError('Should not have ended here') + + # remove and cancel request + oldIdentifier = request['Identifier'] + self._registerRequest( + request, + requestType, + filenameCollision=request['FcFilenameCollision'] & consts.FilenameCollision.MaskHandle, + #initTime=time.time(), # TODO: reset init time or not? + persistentUserData=request['FcPersistentUserData'], + userData=request['FcUserData'], + ) + + if oldIdentifier in self._requests: + self.removeRequest(oldIdentifier) + + self.sendMessageEx(request) + return request['Identifier'] - self.sendMessageEx(msg) - return requestMessage['Identifier'] - ######################################################## ## ## Peer related methods @@ -2207,10 +2226,12 @@ def testUskPutData(): def cb(event, request): insertURI = request['FcPrivateKey'] - identifier = c.uskPutData( + myIdentifier = c.uskPutData( 'foo', insertURI + 'foo/0/', + persistence=consts.Persistence.Reboot, ) + c.removeRequest(myIdentifier) c.events.KeypairGenerated += cb c.generateKeypair(keypairType=consts.KeyType.USK) @@ -2219,10 +2240,10 @@ #'foo1', #'USK@dkbB9DSr6R2WWs0MFsB9BJvN2cRjNxSboanDQNMJVNc,uIi9-1JrCLZ~6MLa8UrxQCMLptu~PzL59hAtorUIStw,AQECAAE/foo/0/', #) - c.run() + #c.run() - #for i in xrange(500): - # c.next() + for i in xrange(700): + c.next() #testUskPutData() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-17 09:19:47
|
Revision: 221 http://fclient.svn.sourceforge.net/fclient/?rev=221&view=rev Author: jurner Date: 2008-02-17 01:19:52 -0800 (Sun, 17 Feb 2008) Log Message: ----------- removed getLogger() 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-16 11:02:46 UTC (rev 220) +++ trunk/sandbox/fcp/fcp2_0_client.py 2008-02-17 09:19:52 UTC (rev 221) @@ -604,9 +604,6 @@ """ return self._connectionName - def getLogger(self): - """Returns the L{logging.Logger} used by the client""" - return self._log def setConnectionName(self, connectionName=None): """Sets the connection name to be used by the client This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-18 13:37:10
|
Revision: 230 http://fclient.svn.sourceforge.net/fclient/?rev=230&view=rev Author: jurner Date: 2008-02-18 05:37:05 -0800 (Mon, 18 Feb 2008) Log Message: ----------- fix: setDebugVerosity() for all loggers 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-18 13:30:13 UTC (rev 229) +++ trunk/sandbox/fcp/fcp2_0_client.py 2008-02-18 13:37:05 UTC (rev 230) @@ -621,7 +621,9 @@ """Sets the verbosity level of the client @note: see L{consts.DebugVerbosity} """ + self._logEvent.setLevel(debugVerbosity) self._logMessage.setLevel(debugVerbosity) + self._logRuntime.setLevel(debugVerbosity) def startFreenet(self, cmdline): @@ -2315,398 +2317,3 @@ return msg['Identifier'] -#***************************************************************************** -# -#***************************************************************************** -if __name__ == '__main__': - - Dir = os.path.dirname(os.path.abspath(__file__)) - - c = FcpClient( - connectionName='test', - debugVerbosity=consts.DebugVerbosity.Debug - ) - - fpath = os.path.join(Dir, 'test.log') - handler = logging.FileHandler(fpath, 'w') - #formatter = logging.Formatter('%(name)s:%(levelname)s:%(funcName)s:%(message)s') - #handler.setFormatter(formatter) - logging.getLogger('Fcp.Client').addHandler(handler) - - - nodeHello = c.connect() - if nodeHello is not None: - - - - #for i in xrange(10): - # c.next() - - - def testGetData(): - def cb(event, request): - 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.Connection, - #binaryBlob=True, - ) - - c.run() - #for i in xrange(50): - # c.next() - - #c.removeRequest(identifier) - #for i in xrange(5): - # c.next() - - #testGetData() - - def testGetFile(): - - def cb(event, request): - c.sendMessage( - #c.consts.Message.RemovePersistentRequest, - c.consts.Message.ModifyPersistentRequest, - Identifier=request['Identifier'], - PriorityClass=0, - Global=False, - ) - pass - - filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test.jpg') - print filename - identifier = c.getFile( - 'CHK@q4~2soHTd9SOINIoXmg~dn7LNUAOYzN1tHNHT3j4c9E,gcVRtoglEhgqN-DJolXPqJ4yX1f~1gBGh89HNWlFMWQ,AAIC--8/snow_002%20%2810%29.jpg', - filename, - filenameCollision=consts.FilenameCollision.HandleRename, - #persistence=consts.Persistence.Reboot, - ) - - c.events.RequestProgress += cb - - #c.run() - for i in xrange(50): - c.next() - - #c.removeRequest(identifier) - #for i in xrange(5): - # c.next() - - #testGetFile() - - - - def testGetKeyInfo(): - - - - identifier = c.getKeyInfo( - 'CHK@q4~2soHTd9SOINIoXmg~dn7LNUAOYzN1tHNHT3j4c9E,gcVRtoglEhgqN-DJolXPqJ4yX1f~1gBGh89HNWlFMWQ,AAIC--8/snow_002%20%2810%29.jpg', - #persistence=c.consts.Persistence.Reboot, - ) - - - def cb(event, msg): - if event == c.events.RequestCompleted: - pass - #c.sendMessage(c.consts.Message.GetRequestStatus, Identifier=identifier) - c.events.RequestCompleted += cb - - #for i in xrange(55): - # c.next() - #c.removeRequest(identifier) - #for i in xrange(5): - # c.next() - c.run() - - #testGetKeyInfo() - - - def testPutRedirect(): - - - - - def cb(event, msg): - if event == c.events.RequestCompleted: - - identifier = c.putRedirect( - 'HaHaHa', - msg['URI'] - ) - - pass - #c.sendMessage(c.consts.Message.GetRequestStatus, Identifier=identifier) - #print msg['FcErrorMessage'] - - - c.events.RequestCompleted += cb - c.events.RequestFailed += cb - - #c.chkPutData('HaHaHaHa') - - #identifier = c.putRedirect( - # 'foo', - # 'USK@zQyF2O1o8B4y40w7Twz8y2I9haW3d2DTlxjTHPu7zc8,h2mhQNNE9aQvF~2yKAmKV1uorr7141-QOroBf5hrlbw,AQACAAE/AnotherIndex/0/', - #'foo/bar' - #persistence=c.consts.Persistence.Reboot, - # ) - - #c.sendMessage( - # consts.Message.ClientPut, - # Identifier='blah', - # URI='KSK@foo', - # TargetURI='USK@zQyF2O1o8B4y40w7Twz8y2I9haW3d2DTlxjTHPu7zc8,h2mhQNNE9aQvF~2yKAmKV1uorr7141-QOroBf5hrlbw,AQACAAE/AnotherIndex/0/', - # UploadFrom='redirect', - # ) - - c.chkPutData('arggggggggg!') - - #for i in xrange(55): - # c.next() - #c.removeRequest(identifier) - #for i in xrange(5): - # c.next() - c.run() - - #testPutRedirect() - - - - - - def testChkPutData(): - myIdentifier = c.chkPutData( - 'test123hahaha', - #persistence=c.Persistence.Reboot, - ) - - c.run() - #for i in xrange(500): - # c.next() - #c.removeRequest(myIdentifier) - #for i in xrange(5): - # c.next() - - #testChkPutData() - - - - def testChkPutFile(): - fpath = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test.jpg') - - identifier = c.chkPutFile( - fpath, - ) - c.run() - #for i in xrange(500): - # c.next() - #c.removeRequest(identifier) - #for i in xrange(5): - # c.next() - - #testChkPutFile() - - - def testUskPutData(): - def cb(event, request): - insertURI = request['FcPrivateKey'] - myIdentifier = c.uskPutData( - 'foo', - insertURI + 'foo/0/', - #persistence=consts.Persistence.Reboot, - ) - #c.removeRequest(myIdentifier) - - 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(700): - # c.next() - - #testUskPutData() - - - def testUskPutData(): - def cb(event, request): - insertURI = request['FcPrivateKey'] - 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 - - def cb(event, msg): - - #print msg['current.fcp.persistentDownloadsInterval'] - #return - root=Config(configDataMsg=msg) - - print - print '***************************************' - print '* walking config tree' - print '***************************************' - for node in root.walk(): - if node.name is None: # skip root - continue - print node.key() - for valueClass, (value, valueType) in sorted(node.values.items()): - print ' %s=%r (%s)' % (valueClass, value, valueType) - - print - print '***************************************' - print '* generating dict from config tree' - print '***************************************' - for key, value in root.toMessageParams().items(): - print '%s: %s (%s)' % (key, value, type(value)) - - #c.setDebugVerbosity(c.DebugVerbosity.Warning) - - c.events.ConfigData += cb - c.getConfig() - for i in xrange(10): - c.next() - - #testConfigData() - - - #testConfigData() - - - def testModifyConfig(): - - from fcp2_0_config import Config - - def cb(event, msg): - print msg['current.logger.interval'] - #print msg['current.fcp.persistentDownloadsInterval'] - - c.setDebugVerbosity(c.consts.DebugVerbosity.Warning) - - c.events.ConfigData += cb - #c.modifyConfig({'fcp.persistentDownloadsInterval': '3000000h'}) - - c.modifyConfig({'logger.interval': '1'}) - - for i in xrange(10): - c.next() - - #testModifyConfig() - - - - def testNodeData(): - - def cb(event, msg): - pass - - - c.events.NodeData += cb - c.getNode() - for i in xrange(10): - c.next() - - #testNodeData() - - - def testGenerateKeypair(): - - def cb(event, msg): - print '--------------------------------' - print '>>>>privateKey:', msg['FcPrivateKey'] - print '>>>>publicKey:', msg['FcPublicKey'] - pass - - c.events.KeypairGenerated += cb - c.generateKeypair('SSK@') - c.generateKeypair('USK@') - - - c.run() - #for i in xrange(10): - # c.next() - - #testGenerateKeypair() - - - def testListPeers(): - - def peerCb(event, msg): - c.listPeerNotes(msg['identity']) - - c.events.Peer += peerCb - c.listPeers() - - - - for i in xrange(50): - c.next() - - - #testListPeers() - - def testGetNode(): - c.getNode() - for i in xrange(10): - c.next() - - #testGetNode() - - def testGetPluginInfo(): - c.getPluginInfo('plugins.XMLLibrarian') - for i in xrange(10): - c.next() - - #testGetPluginInfo() - - - def testListPeers(): - c.listPeers() - for i in xrange(30): - c.next() - - #testListPeers() - - - def testSubscribeUSK(): - myIdentifier = c.subscribeUSK('USK@zQyF2O1o8B4y40w7Twz8y2I9haW3d2DTlxjTHPu7zc8,h2mhQNNE9aQvF~2yKAmKV1uorr7141-QOroBf5hrlbw,AQACAAE/AnotherIndex/0/') - for i in xrange(10): - c.next() - - for i in xrange(10): - c.next() - - - #testSubscribeUSK() \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-21 13:08:35
|
Revision: 236 http://fclient.svn.sourceforge.net/fclient/?rev=236&view=rev Author: jurner Date: 2008-02-21 05:08:36 -0800 (Thu, 21 Feb 2008) Log Message: ----------- fix: run did not run untill all requests where completed if a request was removed or modified 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-20 17:48:09 UTC (rev 235) +++ trunk/sandbox/fcp/fcp2_0_client.py 2008-02-21 13:08:36 UTC (rev 236) @@ -375,7 +375,6 @@ if event is not None: event(request) - request['FcRequestStatus'] |= consts.RequestStatus.Completed if removeRequest: del self._requests[request['Identifier']] @@ -765,12 +764,12 @@ elif code == consts.ProtocolError.NoSuchPlugin: if initialRequest.name == consts.Message.GetPluginInfo: initialRequest['FcErrorMessage'] = msg - initialRequest['FcRequestStatus'] |= consts.RequestStatus.Error + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Error | consts.RequestStatus.Completed self._finalizeRequest(msg, initialRequest, self.events.PluginInfoFailed) return True elif initialRequest.name == consts.Message.FCPPluginMessage: initialRequest['FcErrorMessage'] = msg - initialRequest['FcRequestStatus'] |= consts.RequestStatus.Error + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Error | consts.RequestStatus.Completed self._finalizeRequest(msg, initialRequest, self.events.PluginMessageFailed) return True @@ -792,7 +791,7 @@ # NOTE: Fcp already removed the request initialRequest['FcErrorMessage'] = msg - initialRequest['FcRequestStatus'] = consts.RequestStatus.Error + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Error | consts.RequestStatus.Completed self._finalizeRequest(msg, initialRequest, self.events.RequestFailed) return True @@ -872,7 +871,7 @@ if testFailed: #TODO: check if errorMsg gives reasonable feedback - initialRequest['FcRequestStatus'] = consts.RequestStatus.Error + initialRequest['FcRequestStatus'] = consts.RequestStatus.Error | consts.RequestStatus.Completed initialRequest['FcErrorMessage'] = initialRequest['FcTestDDA']['ErrorMsg'] self._finalizeRequest(msg, initialRequest, self.events.RequestFailed) return True @@ -906,7 +905,7 @@ if initialRequest is None: return False - initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success | consts.RequestStatus.Completed initialRequest.data = msg.data self._finalizeRequest(msg, initialRequest, self.events.RequestCompleted) return True @@ -923,7 +922,7 @@ # For GetData with persistence != connection the node sends no All Data message # whatever that is good for ..fix this here to get all GetData request to complete on - # All Data, too. + # All Data. if initialRequest['FcRequestType'] == consts.RequestType.GetData: if initialRequest['Persistence'] != consts.Persistence.Connection: self.sendMessage( @@ -933,9 +932,9 @@ OnlyData=True ) else: + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Completed self._finalizeRequest(msg, initialRequest, self.events.RequestCompleted) - - + return True @@ -951,11 +950,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['FcRequestStatus'] |= consts.RequestStatus.Success + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success | consts.RequestStatus.Completed self._finalizeRequest(msg, initialRequest, self.events.RequestCompleted) else: initialRequest['FcErrorMessage'] = msg - initialRequest['FcRequestStatus'] |= consts.RequestStatus.Error + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Error | consts.RequestStatus.Completed self._finalizeRequest(msg, initialRequest, self.events.RequestFailed) return True @@ -1035,7 +1034,7 @@ if initialRequest is None: return False - initialRequest['FcRequestStatus'] |= consts.RequestStatus.Removed + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Removed | consts.RequestStatus.Completed self._finalizeRequest(msg, initialRequest, self.events.RequestRemoved) return True @@ -1107,7 +1106,7 @@ if code == consts.InsertError.Canceled: return False - initialRequest['FcRequestStatus'] |= consts.RequestStatus.Error + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Error | consts.RequestStatus.Completed initialRequest['FcErrorMessage'] = msg self._finalizeRequest(msg, initialRequest, self.events.RequestFailed) return True @@ -1128,7 +1127,7 @@ # TODO: StartupTime and CompletionTime are passed, but # as long as no corrosponding params are passed in DataFound # we ignore them - initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success | consts.RequestStatus.Completed initialRequest['URI'] = msg['URI'] self._finalizeRequest(msg, initialRequest, self.events.RequestCompleted) return True @@ -1195,14 +1194,14 @@ if initialRequest is None: return False - initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success | consts.RequestStatus.Completed self._finalizeRequest(msg, initialRequest, self.events.PluginInfo) return True elif msg.name == consts.Message.FCPPluginReply: if initialRequest is None: return False - initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success | consts.RequestStatus.Completed initialRequest['FcPluginReply'] = msg self._finalizeRequest(msg, initialRequest, self.events.PluginMessage) return True @@ -1236,7 +1235,7 @@ initialRequest['FcPrivateKey'] = insertURI initialRequest['FcPublicKey'] = requestURI - initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success | consts.RequestStatus.Completed self._finalizeRequest(msg, initialRequest, self.events.KeypairGenerated) return True @@ -1304,7 +1303,7 @@ # check if we have running requests. Assert False haveRunningRequests = False for request in self._requests.values(): - if not request.params['FcRequestStatus'] & consts.RequestStatus.Completed: + if not request['FcRequestStatus'] & consts.RequestStatus.Completed: haveRunningRequests = True break @@ -2074,6 +2073,7 @@ return + initialRequest['FcRequestStatus'] &= ~consts.RequestStatus.Completed msg = self.Message( consts.Message.ModifyPersistentRequest, Identifier=initialRequest['Identifier'], @@ -2093,15 +2093,16 @@ @param requestIdentifier: (str) identifier of the request to remove """ initialRequest = self._requests[requestIdentifier] - initialRequest['FcRequestStatus'] |= consts.RequestStatus.Removed + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Removed | consts.RequestStatus.Completed if initialRequest['FcRequestType'] & (consts.RequestType.MaskGet | consts.RequestType.MaskPut): # remove Persistence.Connection emidiately - #todo so we make up a PersistentRequestRemoved message + # ..make up a PersistentRequestRemoved message for this case if initialRequest['Persistence'] == consts.Persistence.Connection: msg = self.Message(consts.Message.PersistentRequestRemoved, Identifier=requestIdentifier, Global=False) self._finalizeRequest(msg, initialRequest, self.events.RequestRemoved) else: + initialRequest['FcRequestStatus'] &= ~consts.RequestStatus.Completed self.sendMessage( consts.Message.RemovePersistentRequest, Global=False, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-23 08:17:28
|
Revision: 242 http://fclient.svn.sourceforge.net/fclient/?rev=242&view=rev Author: jurner Date: 2008-02-23 00:17:33 -0800 (Sat, 23 Feb 2008) Log Message: ----------- removed Fcp bugfix ++ Completd flag is now set in finalizeRequest() 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-21 13:14:57 UTC (rev 241) +++ trunk/sandbox/fcp/fcp2_0_client.py 2008-02-23 08:17:33 UTC (rev 242) @@ -167,7 +167,20 @@ # requests the node does not know about. # #------------------------------------------------------------------------------------------------------------------------------------------------ +# request status +# +# x. have to set a dedicated flag when a request is about to be modified or removed +# Fcp gets confused if we disconnect emidiately after sending a modify or remove request +# Curretnly the RequestStatus.Completed flag is removed and later set again to get some +# control over the process. +# +# TODO: check if this is a bug in Fcp +# NOTE: seems to be fixed in [build 1112], fixes removed +#------------------------------------------------------------------------------------------------------------------------------------------------- + + + import atexit import copy import cPickle @@ -371,7 +384,8 @@ removeRequest = request.params.get('Persistence', consts.Persistence.Connection) == consts.Persistence.Connection if removeRequest: request['FcRequestStatus'] |= consts.RequestStatus.RemovedFromQueue - + + request['FcRequestStatus'] |= consts.RequestStatus.Completed if event is not None: event(request) @@ -761,37 +775,25 @@ # handle plugin related request failures - elif code == consts.ProtocolError.NoSuchPlugin: + elif code == consts.ProtocolError.NoSuchPlugin or code == consts.ProtocolError.AccessDenied: if initialRequest.name == consts.Message.GetPluginInfo: initialRequest['FcErrorMessage'] = msg - initialRequest['FcRequestStatus'] |= consts.RequestStatus.Error | consts.RequestStatus.Completed + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Error self._finalizeRequest(msg, initialRequest, self.events.PluginInfoFailed) return True + + # TODO: just a guess that FCPPluginMessage can trigger an AccessDenied error elif initialRequest.name == consts.Message.FCPPluginMessage: initialRequest['FcErrorMessage'] = msg - initialRequest['FcRequestStatus'] |= consts.RequestStatus.Error | consts.RequestStatus.Completed + 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['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['FcRequestStatus'] |= consts.RequestStatus.Completed - del self._requests[requestIdentifier] - return True - - # only requests should get through to here # NOTE: Fcp already removed the request initialRequest['FcErrorMessage'] = msg - initialRequest['FcRequestStatus'] |= consts.RequestStatus.Error | consts.RequestStatus.Completed + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Error self._finalizeRequest(msg, initialRequest, self.events.RequestFailed) return True @@ -871,7 +873,7 @@ if testFailed: #TODO: check if errorMsg gives reasonable feedback - initialRequest['FcRequestStatus'] = consts.RequestStatus.Error | consts.RequestStatus.Completed + initialRequest['FcRequestStatus'] = consts.RequestStatus.Error initialRequest['FcErrorMessage'] = initialRequest['FcTestDDA']['ErrorMsg'] self._finalizeRequest(msg, initialRequest, self.events.RequestFailed) return True @@ -905,7 +907,7 @@ if initialRequest is None: return False - initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success | consts.RequestStatus.Completed + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success initialRequest.data = msg.data self._finalizeRequest(msg, initialRequest, self.events.RequestCompleted) return True @@ -932,7 +934,6 @@ OnlyData=True ) else: - initialRequest['FcRequestStatus'] |= consts.RequestStatus.Completed self._finalizeRequest(msg, initialRequest, self.events.RequestCompleted) return True @@ -950,11 +951,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['FcRequestStatus'] |= consts.RequestStatus.Success | consts.RequestStatus.Completed + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success self._finalizeRequest(msg, initialRequest, self.events.RequestCompleted) else: initialRequest['FcErrorMessage'] = msg - initialRequest['FcRequestStatus'] |= consts.RequestStatus.Error | consts.RequestStatus.Completed + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Error self._finalizeRequest(msg, initialRequest, self.events.RequestFailed) return True @@ -1034,7 +1035,7 @@ if initialRequest is None: return False - initialRequest['FcRequestStatus'] |= consts.RequestStatus.Removed | consts.RequestStatus.Completed + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Removed self._finalizeRequest(msg, initialRequest, self.events.RequestRemoved) return True @@ -1106,7 +1107,7 @@ if code == consts.InsertError.Canceled: return False - initialRequest['FcRequestStatus'] |= consts.RequestStatus.Error | consts.RequestStatus.Completed + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Error initialRequest['FcErrorMessage'] = msg self._finalizeRequest(msg, initialRequest, self.events.RequestFailed) return True @@ -1127,7 +1128,7 @@ # TODO: StartupTime and CompletionTime are passed, but # as long as no corrosponding params are passed in DataFound # we ignore them - initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success | consts.RequestStatus.Completed + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success initialRequest['URI'] = msg['URI'] self._finalizeRequest(msg, initialRequest, self.events.RequestCompleted) return True @@ -1194,14 +1195,14 @@ if initialRequest is None: return False - initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success | consts.RequestStatus.Completed + 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['FcRequestStatus'] |= consts.RequestStatus.Success | consts.RequestStatus.Completed + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success initialRequest['FcPluginReply'] = msg self._finalizeRequest(msg, initialRequest, self.events.PluginMessage) return True @@ -1235,7 +1236,7 @@ initialRequest['FcPrivateKey'] = insertURI initialRequest['FcPublicKey'] = requestURI - initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success | consts.RequestStatus.Completed + initialRequest['FcRequestStatus'] |= consts.RequestStatus.Success self._finalizeRequest(msg, initialRequest, self.events.KeypairGenerated) return True @@ -2072,8 +2073,6 @@ self.events.RequestModified(initialRequest) return - - initialRequest['FcRequestStatus'] &= ~consts.RequestStatus.Completed msg = self.Message( consts.Message.ModifyPersistentRequest, Identifier=initialRequest['Identifier'], @@ -2102,7 +2101,6 @@ msg = self.Message(consts.Message.PersistentRequestRemoved, Identifier=requestIdentifier, Global=False) self._finalizeRequest(msg, initialRequest, self.events.RequestRemoved) else: - initialRequest['FcRequestStatus'] &= ~consts.RequestStatus.Completed self.sendMessage( consts.Message.RemovePersistentRequest, Global=False, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-01-30 13:22:42
|
Revision: 89 http://fclient.svn.sourceforge.net/fclient/?rev=89&view=rev Author: jurner Date: 2008-01-30 05:22:48 -0800 (Wed, 30 Jan 2008) Log Message: ----------- adapt to type conversions 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-01-30 13:21:55 UTC (rev 88) +++ trunk/sandbox/fcp/fcp2_0_client.py 2008-01-30 13:22:48 UTC (rev 89) @@ -1432,6 +1432,16 @@ ## Peer related methods ## ######################################################## + def getNode(self, withPrivate=True, withVolantile=True): + self.sendMessage( + self.Message.MessageGetNode, + WithPrivate=withPrivate, + WithVolatile=withVolantile, + ) + + + + def listPeer(self, identity): self.jobClient.sendMessage( self.Message.MessageListPeer, @@ -1462,8 +1472,8 @@ """ self.sendMessage( self.Message.MessageListPeers, - WithMetadata=self.fcpBool(withMetaData), - WithVolatile=self.fcpBool(withVolantile), + WithMetadata=withMetaData, + WithVolatile=withVolantile, ) @@ -1654,4 +1664,18 @@ #testGenerateSSK() + def testListPeers(): + c.listPeers() + for i in xrange(10): + c.next() + + #testListPeers() + + def testGetNode(): + c.getNode() + for i in xrange(10): + c.next() + + #testGetNode() + \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-01-30 14:36:33
|
Revision: 93 http://fclient.svn.sourceforge.net/fclient/?rev=93&view=rev Author: jurner Date: 2008-01-30 06:36:38 -0800 (Wed, 30 Jan 2008) Log Message: ----------- ... 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-01-30 14:35:57 UTC (rev 92) +++ trunk/sandbox/fcp/fcp2_0_client.py 2008-01-30 14:36:38 UTC (rev 93) @@ -1625,8 +1625,17 @@ def cb(event, msg): root=Config(configDataMsg=msg) for node in root.walk(): - print node.key() + key = node.key() + if key is None: # skip root + continue + print key + for keyName, values in sorted(node.values.items()): + print ' ' + keyName + for valueClass, (value, valueType) in sorted(values.items()): + print ' %s=%r (%s)' % (valueClass, value, valueType) + #c.setDebugVerbosity(c.DebugVerbosity.Warning) + c.events.ConfigData += cb c.getConfig() for i in xrange(10): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-01-30 17:17:08
|
Revision: 95 http://fclient.svn.sourceforge.net/fclient/?rev=95&view=rev Author: jurner Date: 2008-01-30 09:17:10 -0800 (Wed, 30 Jan 2008) Log Message: ----------- thises and thats 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-01-30 17:16:34 UTC (rev 94) +++ trunk/sandbox/fcp/fcp2_0_client.py 2008-01-30 17:17:10 UTC (rev 95) @@ -1043,20 +1043,14 @@ WithLongDescription=withLongDescription, ) - def getNode(self, - withPrivate=True, - withVolatile=True, - giveOpennetRef=True, - ): + + def modifyConfig(self, params): + """Modifies node configuration values + @param params: (dict) containing parameters to modify """ - @event: NodeData(event, msg) - """ - self.sendMessage( - self.Message.MessageGetNode, - WithPrivate=self.fcpBool(withPrivate), - WithVolatile=self.fcpBool(withVolatile), - GiveOpennetRef=self.fcpBool(giveOpennetRef), - ) + msg = self.Message(self.Message.MessageModifyConfig) + msg.params = params + self.sendMessageEx(msg) ######################################################## @@ -1427,22 +1421,35 @@ #TODO: check how Fcp responds when the identifier is unknwon or something else goes # werong. Maybe a ProtocolError.NoSuchIdentifier ??? + + ######################################################## ## ## Peer related methods ## ######################################################## - def getNode(self, withPrivate=True, withVolantile=True): + def getNode(self, + withPrivate=True, + withVolatile=True, + giveOpennetRef=True, + ): + """Request information about the node + @param withPrivate: if True, private data is included + @param withVolatile: if True, statistical data is included + @param giveOppennetRef: if True, the opennet reference is retuned instead of the darknet + """ self.sendMessage( - self.Message.MessageGetNode, - WithPrivate=withPrivate, - WithVolatile=withVolantile, - ) - - + self.Message.MessageGetNode, + WithPrivate=withPrivate, + WithVolatile=withVolatile, + GiveOpennetRef=giveOpennetRef, + ) def listPeer(self, identity): + """Requests information about a peer node + @param identifier: identifier of the peer to request information for + """ self.jobClient.sendMessage( self.Message.MessageListPeer, NodeIdentifier=identity, @@ -1478,21 +1485,31 @@ def modifyPeer(self, identity, allowLocalAddresses=None, isDisabled=None, isListenOnly=None): + """Modifies a peer node + @param identity: identity of the peer node to modify + @param allowLocalAddresses: if True, whatever is done + @param isDisabled: if True, the peer is disabled + @param isListenOnly: if True, the peer is set to listen only status + """ msg = Message( self.Message.MessageModifyPeer, NodeIdentifier=identity, ) if allowLocalAddresses is not None: - msg['AllowLocalAddresses'] = self.fcpBool(allowLocalAddresses) + msg['AllowLocalAddresses'] = allowLocalAddresses if isDisabled is not None: - msg['isDisabled'] = self.fcpBool(isDisabled) + msg['isDisabled'] = isDisabled if isListenOnly is not None: - msg['isListenOnly'] = self.fcpBool(isListenOnly) + msg['isListenOnly'] = isListenOnly self.jobClient.sendMessageEx(msg) self.sendMessageEx(msg) def modifyPeerNote(self, identity, note): + """Modifies the note associated to a peer + @param identity: identity of the peer node to modify + @param note: (str) new note to associate to the peer + """ self.sendMessage( self.Message.MessageModifyPeerNote, NodeIdentifier=identity, @@ -1503,6 +1520,9 @@ def removePeer(self, identity): + """Removes a peer + @param identity: identity of the peer node to remove + """ self.sendMessage( self.Message.MessageRemovePeer, NodeIdentifier=identity, @@ -1624,16 +1644,25 @@ def cb(event, msg): root=Config(configDataMsg=msg) + + print + print '***************************************' + print '* walking config tree' + print '***************************************' for node in root.walk(): - key = node.key() - if key is None: # skip root + if node.name is None: # skip root continue - print key - for keyName, values in sorted(node.values.items()): - print ' ' + keyName - for valueClass, (value, valueType) in sorted(values.items()): - print ' %s=%r (%s)' % (valueClass, value, valueType) - + print node.key() + for valueClass, (value, valueType) in sorted(node.values.items()): + print ' %s=%r (%s)' % (valueClass, value, valueType) + + print + print '***************************************' + print '* generating dict from config tree' + print '***************************************' + for key, value in root.toMessageParams().items(): + print '%s: %s (%s)' % (key, value, type(value)) + #c.setDebugVerbosity(c.DebugVerbosity.Warning) c.events.ConfigData += cb This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-01 14:46:05
|
Revision: 101 http://fclient.svn.sourceforge.net/fclient/?rev=101&view=rev Author: jurner Date: 2008-02-01 06:46:08 -0800 (Fri, 01 Feb 2008) Log Message: ----------- added plugin related mesages experimental Upload class to tackle single / multiple item uploads 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-01 14:44:41 UTC (rev 100) +++ trunk/sandbox/fcp/fcp2_0_client.py 2008-02-01 14:46:08 UTC (rev 101) @@ -23,28 +23,64 @@ # problem of knowing when the node has actually registered a request. The node does not send # an EndListPersistentRequests on connect so it is impossible to tell when or if to restore one of # the pending requests we stored. +# +#FIX: None #--------------------------------------------------------------------------------------------------------------------------------------------- # [0001893: CloseConnectionDuplicateClientName bug or feature?] # # CloseConnectionDuplicateClientName # currently fcp takes down a our connection if another client (...) uses the same connection name. +# +#FIX: None #---------------------------------------------------------------------------------------------------------------------------------------------- # [0001888: explicite connection locale] # # Many strings are already translated by freenet, but there is no way to tell the node wich language # to use to talk to a client. Maybe a good idea, maybe not. +# +#FIX: None #----------------------------------------------------------------------------------------------------------------------------------------------- # [0001781: unregister directories registered via TestDDARequest] # # With current state of the art DDA handling it is not possiblr to unregister directories (may pile # up in memory over time). +# +#FIX: None #------------------------------------------------------------------------------------------------------------------------------------------------ # [0002019: Socket dies if first message is not ClientHello] # # minor one +# +#FIX: None +#------------------------------------------------------------------------------------------------------------------------------------------------ +# [0001965: Persistence vs PersistenceType] +# +# PersistentGet passes persistence field as "PersistenceType", PersistentPut as "Persistence" +# already fixed this here in the client +# +# FIX: implemented in client #------------------------------------------------------------------------------------------------------------------------------------------------- +# [0002015: Drop the global queue] +# +# this one is somewhat related to [0001931: Send EndListPersistentRequests following client connect] +# +# We never use or watch the global queue. It is to dangerous. But problems remain when it comes +# to restoring persistent requests. Shure these are our requests? Worst case is a client with a colliding +# connection name flooding our client with an unknown number of left overs. +# +#FIX: None (that is, this case is handled as savely as possible - except from possible slowdowns - but no +# guarantee that no unknown request may slip through) +#------------------------------------------------------------------------------------------------------------------------------------------------- +# [0001894: HandleCollision field in ClientGet] +# +# minor one. When downloading a file, filename collisions may occur. Fcp does not handle these very well +# It checks if the tempfile (filename ?) can be created newly when the request is started. IIRC In the final +# rename of the tempfile to filename no check is done and filename will get overwritten. +# +#FIX: we handle collisions in the client as savely as possible. But no guarantee either when a colliding file +# (...) finds his way into the download directory while downloading another. +#------------------------------------------------------------------------------------------------------------------------------------------------ - import atexit import cPickle import logging @@ -143,13 +179,16 @@ except ValueError: DefaultFcpPort = 9481 + + #TODO: check if required # suggested by Mathew Toseland to use about 32k for mimeType requests # basic sizes of keys are: 1k for SSks and 32k for CHKs # without MaxSize DataFound will have DataLength set to 0 (?!) MaxSizeKeyInfo = '32000' SocketTimeout = 0.1 - Version = '2.0' + ExpectedFcpVersion = 2.0 + ExpectedNodeBuild = 1107 from fcp2_0_config import Config from fcp2_0_consts import ( @@ -159,6 +198,7 @@ FetchError, FilenameCollision, InsertError, + KeyType, LogMessages, PeerNodeStatus, PeerNoteType, @@ -207,8 +247,14 @@ 'PeerNote', + # plugins + 'PluginInfo', + 'PluginInfoFailed', + 'PluginMessage' + 'PluginMessagefailed', + # others - 'SSKKeypair', + 'KeypairGenerated', ############################### @@ -232,10 +278,11 @@ """ self._connectionName = self.setConnectionName(connectionName) self._ddaTests = [] # currently running DDA tests (request0, ... requestN) - self._sskRequests = {} # currently pending ssk requests (sskIdentifier --> request) + self._sskRequests = [] # currently pending ssk requests (identifier1... identiferN) self._requests = {} # currently running requests (requestIdentifier --> request) self._log = logging.getLogger(self.__class__.__name__) + self._nodeHelloMessage = None self._socket = None self.events = self.Events() @@ -359,8 +406,11 @@ # fix some Fcp inconsistencies ClientGet vs. PersistentGet if msg.name == self.Message.MessagePersistentGet: del msg.params['Started'] + #FIX: [0001965: Persistence vs PersistenceType] if 'PersistenceType' in msg.params: msg['Persistence'] = msg.params.pop('PersistenceType') + elif msg.name == self.Message.MessagePersistentPut: + del msg.params['Started'] return msg @@ -385,9 +435,9 @@ self._ddaTests = [] self._requests = {} - self._sskRequests = {} + self._sskRequests = [] - + def connect(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 @@ -428,18 +478,31 @@ self.sendMessage( self.Message.MessageClientHello, Name=self._connectionName, - ExpectedVersion=self.Version, + ExpectedVersion=self.ExpectedFcpVersion, ) while timeElapsed <= duration: msg = self.next(dispatch=False) + if msg.name == self.Message.MessageClientSocketTimeout: timeElapsed += self.SocketTimeout yield None + elif msg.name == self.Message.MessageNodeHello: + self._nodeHelloMessage = msg self._log.debug(self.LogMessages.MessageReceived + msg.pprint()) - self.events.ClientConnected(msg) - yield msg + # check if version is ok + if self.versionCheckNodeHello(msg): + self.events.ClientConnected(msg) + else: + self.close() + msg = self.Message( + self.Message.MessageClientDisconnected, + DisconnectReason=self.DisconnectReason.VersionMissmatch + ) + self.events.ClientDisconnected(msg) + yield self._nodeHelloMessage raise StopIteration + else: self._log.debug(self.LogMessages.MessageReceived + msg.pprint()) break @@ -497,6 +560,18 @@ stdout, stderr = p.communicate() return stdout + + def versionCheckNodeHello(self, nodeHelloMessage): + """Performa a version check of the client against the specified NodeHello message + @return: (bool) True if version is ok, False otherwise + @note: if this check returns False the client will emidiately disconnect in L{connect()} + and triggers a ClientDisconnected event. Overwrite to adjust + """ + if nodeHelloMessage['FCPVersion'] >= self.ExpectedFcpVersion: + if nodeHelloMessage['Build'] >= self.ExpectedNodeBuild: + return True + return False + ######################################################### ## ## runtime related methods @@ -553,7 +628,7 @@ self.Message.MessageClientDisconnected, DisconnectReason=DisconnectReason.Shutdown, ) - self.events.ClientDisconnect(msg) + self.events.ClientDisconnected(msg) return True @@ -564,12 +639,8 @@ ddaRequestMsg['WantWriteDirectory'] = True directory = os.path.dirname(initialRequest['Filename']) else: - - #TODO: determine directory for other cases - raise RuntimeError(NotImplemented) - ddaRequestMsg['WantReadDirectory'] = True - directory = None + directory = os.path.dirname(initialRequest['Filename']) ddaRequestMsg['Directory'] = directory @@ -607,6 +678,30 @@ initialRequest['FcFilenameCollision'] &= ~self.FilenameCollision.CollisionHandled + # handle plugin related request failures + elif code == self.ProtocolError.NoSuchPlugin: + if initialRequest.name == self.Message.MessagePluginInfo: + del self._requests[requestIdentifier] + self.events.PluginInfoFailed(initialRequest) + return True + elif initialRequest.name == self.Message.MessageFCPPluginMessage: + del self._requests[requestIdentifier] + self.events.PluginMessageFailed(initialRequest) + return True + + elif code == self.ProtocolError.AccessDenied: + if initialRequest.name == self.Message.MessagePluginInfo: + del self._requests[requestIdentifier] + self.events.PluginInfoFailed(initialRequest) + return True + # TODO: just a guess that FCPPluginMessage can trigger an AccessDenied error + elif initialRequest.name == self.Message.MessageFCPPluginMessage: + del self._requests[requestIdentifier] + self.events.PluginMessageFailed(initialRequest) + return True + + + # only requests should get through to here # NOTE: Fcp already removed the request @@ -776,10 +871,6 @@ elif msg.name == self.Message.MessagePersistentGet: - # NOTE: - # Fcp does no good job in handling persistent requests and identifiers. Already dropped some - # notes and reports regarding this. See freenet-tech mailing list [Fcp notes and issues] - # unknown request... try to restore it if initialRequest is None: restoredRequest = self._restorePersistentRequestFromNode(msg) @@ -793,7 +884,10 @@ ) return True + # determine initial message name restoredRequest.name = self.Message.MessageClientGet + + # restore request self._requests[requestIdentifier] = restoredRequest restoredRequest['FcStatus'] = self.Message.StatusStarted self.events.RequestRestored(restoredRequest) @@ -810,7 +904,48 @@ return True + elif msg.name == self.Message.MessagePersistentPut: + + # 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( + self.Message.MessageRemovePersistentRequest, + Identifier=msg['Identifier'], + Global=msg['Global'], + ) + return True + + # determine initial message name + if restoredRequest['FcSubType'] == self.Message.SubTypePut: + restoredRequest.name = self.Message.MessageClientPut + elif restoredRequest['FcSubType'] == self.Message.SubTypePutDiskDir: + restoredRequest.name = self.Message.MessageClientPutDiskDir + elif restoredRequest['FcSubType'] == self.Message.SubTypePutComplexDir: + restoredRequest.name = self.Message.MessageClientPutComplexDir + + # restore request + self._requests[requestIdentifier] = restoredRequest + restoredRequest['FcStatus'] = self.Message.StatusStarted + self.events.RequestRestored(restoredRequest) + return True + + # known request... filter out multiple PersistentGets + if initialRequest['FcStatus'] == self.Message.StatusPending: + initialRequest['FcStatus'] = self.Message.StatusStarted + + #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 == self.Message.MessagePersistentRequestModified: if initialRequest is None: return False @@ -925,21 +1060,49 @@ #################################################### ## + ## plugins + ## + #################################################### + elif msg.name == self.Message.MessagePluginInfo: + if initialRequest is None: + return False + + del self._requests[requestIdentifier] + self.events.PluginInfo(msg) + return True + + elif msg.name == self.Message.MessageFCPPluginReply: + if initialRequest is None: + return False + + del self._requests[requestIdentifier] + self.events.PluginMessage(msg) + return True + + #################################################### + ## ## others ## #################################################### elif msg.name == self.Message.MessageSSKKeypair: - if initialRequest is None: - self.events.SSKKeypair(msg) - return True + if requestIdentifier not in self._sskRequests: + return False - initialRequest['Uri'] = msg['InsertUri'] - initialRequest['FcRequestUri'] = msg['RequestUri'] - self.sendMessageEx(initialRequest) + self._sskRequests.remove(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: + insertURI = requestURI.replace(consts.KeyType.SSK, consts.KeyType.USK, 1) + requestURI = requestURI.replace(consts.KeyType.SSK, consts.KeyType.USK, 1) + + msg['InsertURI'] = insertURI + msg['RequestURI'] = requestURI + msg['FcKeyType'] = keyType + self.events.KeypairGenerated(msg) return True - - elif msg.name == self.Message.MessageCloseConnectionDuplicateClientName: msg = self.Message( @@ -1273,6 +1436,38 @@ ## ClientPut related methods ## ######################################################## + def clientPutUpload(self, upload, userData=None, persistentUserData=''): + + msg = upload.getMessage(self.Message) + if msg is None: + raise ValueError('Nothing to upload') + + # determine SubType + if msg.name == self.Message.MessageClientPut: + messageSubType = self.Message.SubTypePut + elif msg.name == self.Message.MessageClientPutDiskDir: + messageSubType = self.Message.SubTypePutDiskDir + else: + messageSubType = self.Message.SubTypePutComplexDir + + self._registerRequest( + msg, + userData, + messageSubType, + time.time(), + persistentUserData, + #filenameCollision=filenameCollision, + ) + + if upload.keyType in (consts.KeyType.SSK, consts.KeyType.USK): + msg['FcRequestUri'] = upload.publicKey + #NOTE: the caller may use the 'FcInsertUri' member to store the private key + + + self.sendMessageEx(msg) + return msg['Identifier'] + + def clientPut(self, uri, messageSubType, @@ -1303,9 +1498,11 @@ #TODO: method names #CHK + + def putData(self, data, - + contentType=None, dontCompress=None, maxRetries=None, @@ -1316,10 +1513,11 @@ userData=None, persistentUserData='', ): + """""" return self.clientPut( - self.Uri.KeyCHK, - self.Message.SubTypePutData, + consts.KeyType.CHK, + self.Message.SubTypePut, userData, persistentUserData, data, @@ -1334,34 +1532,48 @@ MaxRetries=maxRetries, DontCompress=dontCompress, Persistence=persistence, - TergetFilename=targetFilename, + TargetFilename=targetFilename, UploadFrom=self.UploadFrom.Direct, Verbosity=self.Verbosity.ReportProgress | self.Verbosity.ReportCompression, ) - def putFile(self): - pass + def putFile(self, + filename, + + contentType=None, + dontCompress=None, + maxRetries=None, + persistence=consts.Persistence.Connection, + priorityClass=consts.Priority.Medium, + targetFilename=None, + + userData=None, + persistentUserData='', + + ): + return self.clientPut( + concts.KeyType.CHK, + self.Message.SubTypePut, + userData, + persistentUserData, + None, + + # fcp params + Filename=filename, + ContentType=contentType, + #EarlyEncode='false', + #GetCHKOnly='false', + Global=False, + Identifier=None, + MaxRetries=maxRetries, + DontCompress=dontCompress, + Persistence=persistence, + TergetFilename=targetFilename, + UploadFrom=self.UploadFrom.Disk, + Verbosity=self.Verbosity.ReportProgress | self.Verbosity.ReportCompression, + ) - #KSK - def putNamedData(self): - pass - - def putReference(self): - pass - - - #SSK - def putUpdatableData(self): - pass - - - #USK - def putVersionedData(self): - pass - - - ######################################################## ## ## request related methods @@ -1530,18 +1742,79 @@ ########################################################## ## + ## plugins + ## + ########################################################## + #TODO: curently it is just a guess the a plugin may respond with a IdentifierCollision + 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 + """ + while True: + identifier = uuid.uuid_time() + if identifier not in self._requests: + break + msg = self.Message( + self.Message.MessageGetPluginInfo, + Identifier=identifier, + PluginName=pluginName, + Detailed=detailed, + ) + self._requests[identifier] = msg + self.sendMessageEx(msg) + return identifier + + + def sendPluginMessage(self, pluginName, params, data=None): + """Sends a message to a plugin + @param pluginName: name of the plugin to send the message to + @param poarams: (dict) additional params to pass to the plugin (each parameter has to be prefixed with 'Param.') + @param data: (str) data to pass along with the messaage or None + @return: (str) request identifier + """ + while True: + identifier = uuid.uuid_time() + if identifier not in self._requests: + break + msg = self.Message( + self.Message.MessageGetPluginInfo, + Identifier=identifier, + PluginName=pluginName, + **params + ) + if data is not None: + msg['DataLength'] = len(data) + msg.data = data + + self._requests[identifier] = msg + self.sendMessageEx(msg) + return identifier + + + + + ########################################################## + ## ## others ## ########################################################## - def generateSSK(self): + def generateKeypair(self, keypairType=consts.KeyType.SSK): """ - @event: SSKKeypair(event, params), triggered when the request is complete + @param keypairType: type of keypair to generate (either L{KeyType.SSK} or L{KeyType.SSK}) @return: identifier of the request + @event: KeypairGenerated(event, params) is triggered when the request is complete """ + + if keypairType not in (consts.KeyType.SSK, consts.KeyType.USK): + raise ValueError('keypairType must be %s or %s' % (consts.KeyType.SSK, consts.KeyType.USK)) + while True: - identifier = uuid.uuid_time() + identifier = keypairType + uuid.uuid_time() if identifier not in self._sskRequests: break + self._sskRequests.append(identifier) self.sendMessage( self.Message.MessageGenerateSSK, Identifier=identifier, @@ -1562,7 +1835,7 @@ if nodeHello is not None: - #for i in xrange(5): + #for i in xrange(50): # c.next() @@ -1623,9 +1896,26 @@ def testPutData(): - identifier = c.putData( + myIdentifier = c.putData( 'test123', + #persistence=c.Persistence.Reboot, ) + + for i in xrange(100): + c.next() + c.removeRequest(myIdentifier) + for i in xrange(5): + c.next() + + #testPutData() + + + def testPutFile(): + fpath = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test.jpg') + + identifier = c.putFile( + fpath, + ) for i in xrange(1000): c.next() @@ -1633,11 +1923,9 @@ for i in xrange(5): c.next() - #testPutData() - + #testPutFile() - def testConfigData(): from fcp2_0_config import Config @@ -1688,32 +1976,39 @@ #testNodeData() - def testGenerateSSK(): + def testGenerateKeypair(): - #def cb(event, msg): - # pass - - - #c.events.NodeData += cb - c.generateSSK() + def cb(event, msg): + print msg.pprint() + + c.events.KeypairGenerated += cb + c.generateKeypair('SSK@') + c.generateKeypair('USK@') for i in xrange(10): c.next() - #testGenerateSSK() + #testGenerateKeypair() - def testListPeers(): - c.listPeers() - for i in xrange(10): - c.next() - - #testListPeers() + def testListPeers(): + c.listPeers() + for i in xrange(10): + c.next() + - def testGetNode(): - c.getNode() - for i in xrange(10): - c.next() + #testListPeers() - #testGetNode() + def testGetNode(): + c.getNode() + for i in xrange(10): + c.next() + + #testGetNode() - \ No newline at end of file + def testGetPluginInfo(): + c.getPluginInfo('plugins.XMLLibrarian') + for i in xrange(10): + c.next() + + #testGetPluginInfo() + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-02 05:14:02
|
Revision: 107 http://fclient.svn.sourceforge.net/fclient/?rev=107&view=rev Author: jurner Date: 2008-02-01 21:14:06 -0800 (Fri, 01 Feb 2008) Log Message: ----------- adapt to recent combed over documentation 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-02 05:13:24 UTC (rev 106) +++ trunk/sandbox/fcp/fcp2_0_client.py 2008-02-02 05:14:06 UTC (rev 107) @@ -3,11 +3,11 @@ Compatibility: >= Freenet 0.7 Build #1084 -@newfield event, events +@newfield event: event, events -@note: The client implementation never uses or watches the global queue. No (in words N-O) -implementation should ever do so. Global is evil... so avoid it. Already filed a bug report regarding this. +@note: The client implementation never uses or watches the global queue. No implementation +should ever do so. Global is evil. """ @@ -149,7 +149,7 @@ def saveWriteFile(fpath, data): - """Writes data to a file i the savest manner possible + """Writes data to a file in the savest manner possible @param fpath: file to write @param data: data to write to file @return: True if successful, False otherwise @@ -172,6 +172,9 @@ # #************************************************************************************************* class FcpClient(object): + """ + @ivar events: events the client supports + """ DefaultFcpHost = os.environ.get('FCP_HOST', '127.0.0.1').strip() try: @@ -191,24 +194,7 @@ ExpectedNodeBuild = 1107 from fcp2_0_config import Config - from fcp2_0_consts import ( - ConnectReason, - DebugVerbosity, - DisconnectReason, - FetchError, - FilenameCollision, - InsertError, - KeyType, - LogMessages, - PeerNodeStatus, - PeerNoteType, - Persistence, - Priority, - ProtocolError, - ReturnType, - UploadFrom, - Verbosity, - ) + consts = consts from fcp2_0_message import Message import fcp2_0_params as FcParams from fcp2_0_uri import Uri @@ -271,10 +257,9 @@ debugVerbosity=None, ): """ - @param conectionName: name of the connection or None to use an arbitrary connection name - @param debugVerbosity: verbosity level for debugging. Default is L{DebugVerbosity.Warning} - - @ivar events: events the client supports + @param connectionName: name of the connection or None to use an arbitrary connection name + @param debugVerbosity: verbosity level for debugging. Default is L{consts.DebugVerbosity.Warning} + """ self._connectionName = self.setConnectionName(connectionName) self._ddaTests = [] # currently running DDA tests (request0, ... requestN) @@ -287,7 +272,7 @@ self.events = self.Events() - self.setDebugVerbosity(self.DebugVerbosity.Warning if debugVerbosity is None else debugVerbosity) + self.setDebugVerbosity(consts.DebugVerbosity.Warning if debugVerbosity is None else debugVerbosity) atexit.register(self.close) @@ -316,7 +301,7 @@ 'FcPersistentUserData': persistentUserData, # any user defined persistent data # non persistent params - 'FcStatus': self.Message.StatusPending, + 'FcStatus': consts.MessageStatus.Pending, 'FcErrorMessage': None, # did an error occur? 'FcUserData': userData, # any user defined runtime data here @@ -358,11 +343,11 @@ ): """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 requestIdentifier: (str) - @param userData: (str) @param initTime: (python time) - @param handleCollisions: (bool) + @param persistentUserData: (str) user defined persistent data + @param filenameCollision: (bool) @return: (str) uuid @note: the identifier returned is unique to the client but may not be unique to the node @@ -404,12 +389,12 @@ ) # fix some Fcp inconsistencies ClientGet vs. PersistentGet - if msg.name == self.Message.MessagePersistentGet: + if msg.name == consts.Message.PersistentGet: del msg.params['Started'] #FIX: [0001965: Persistence vs PersistenceType] if 'PersistenceType' in msg.params: msg['Persistence'] = msg.params.pop('PersistenceType') - elif msg.name == self.Message.MessagePersistentPut: + elif msg.name == consts.Message.PersistentPut: del msg.params['Started'] return msg @@ -423,7 +408,7 @@ """Closes the client @note: make shure to call close() when done with the client """ - self._log.info(self.LogMessages.ClientClose) + self._log.info(consts.LogMessages.ClientClose) if self._socket is not None: self._socket.close() self._socket = None @@ -444,11 +429,12 @@ @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 - @event: Connected(event, params). Triggered as soon as the client is connected. Params - will be the parameters of the NodeHello message. - @return: (Message) NodeHello if successful, None otherwise for the next iteration + + @return: (L{fcp2_0_message.Message}) NodeHello if successful, None otherwise for the next iteration + + @event: ClientConnected(event, message) is triggered as soon as the client is connected """ - self._log.info(self.LogMessages.Connecting) + self._log.info(consts.LogMessages.Connecting) # try to Connect socket if self._socket is not None: @@ -468,7 +454,7 @@ except socket.error, d: yield None else: - self._log.info(self.LogMessages.Connected) + self._log.info(consts.LogMessages.Connected) # send ClientHello and wait for NodeHello #NOTE: thought I could leave ClientHelloing up to the caller @@ -476,49 +462,49 @@ # as expected when not doing so, the node disconnects. # So take it over here. self.sendMessage( - self.Message.MessageClientHello, + consts.Message.ClientHello, Name=self._connectionName, ExpectedVersion=self.ExpectedFcpVersion, ) while timeElapsed <= duration: msg = self.next(dispatch=False) - if msg.name == self.Message.MessageClientSocketTimeout: + if msg.name == consts.Message.ClientSocketTimeout: timeElapsed += self.SocketTimeout yield None - elif msg.name == self.Message.MessageNodeHello: + elif msg.name == consts.Message.NodeHello: self._nodeHelloMessage = msg - self._log.debug(self.LogMessages.MessageReceived + msg.pprint()) + self._log.debug(consts.LogMessages.MessageReceived + msg.pprint()) # check if version is ok if self.versionCheckNodeHello(msg): self.events.ClientConnected(msg) else: self.close() msg = self.Message( - self.Message.MessageClientDisconnected, - DisconnectReason=self.DisconnectReason.VersionMissmatch + consts.Message.ClientDisconnected, + DisconnectReason=consts.DisconnectReason.VersionMissmatch ) self.events.ClientDisconnected(msg) yield self._nodeHelloMessage raise StopIteration else: - self._log.debug(self.LogMessages.MessageReceived + msg.pprint()) + self._log.debug(consts.LogMessages.MessageReceived + msg.pprint()) break break # continue polling - self._log.info(self.LogMessages.ConnectionRetry) + self._log.info(consts.LogMessages.ConnectionRetry) timeElapsed += timeout time.sleep(timeout) msg = self.Message( - self.Message.MessageClientDisconnected, - DisconnectReason=self.DisconnectReason.ConnectingFailed + consts.Message.ClientDisconnected, + DisconnectReason=consts.DisconnectReason.ConnectingFailed ) self.events.ClientDisconnected(msg) - self._log.info(self.LogMessages.ConnectingFailed) + self._log.info(consts.LogMessages.ConnectingFailed) self.close() raise StopIteration @@ -540,7 +526,7 @@ def setDebugVerbosity(self, debugVerbosity): """Sets the verbosity level of the client - @note: see L{DebugVerbosity} + @note: see L{consts.DebugVerbosity} """ self._log.setLevel(debugVerbosity) @@ -548,7 +534,7 @@ def startFreenet(self, cmdline): """Starts freenet @param cmdline: commandline to start freenet (like '/freenet/run.sh start' or 'c:\freenet\start.bat') - @return: (string) whatever freenet returns + @return: (str) whatever freenet returns """ #TODO: on windows it may be necessary to hide the command window p = subprocess.Popen( @@ -585,9 +571,9 @@ CancelPersistentRequests = 0 # for testing... if True, cancels all PersistentRequests - if msg.name == self.Message.MessageClientSocketTimeout: + if msg.name == consts.Message.ClientSocketTimeout: return True - self._log.debug(self.LogMessages.MessageReceived + msg.pprint()) + self._log.debug(consts.LogMessages.MessageReceived + msg.pprint()) # check if we have an initial request corrosponding to msg requestIdentifier = msg.get('Identifier', None) @@ -597,7 +583,7 @@ ## errors ## #################################################### - if msg.name == self.Message.MessageIdentifierCollision: + if msg.name == consts.Message.IdentifierCollision: if initialRequest is not None: # resend request with new identifier @@ -605,37 +591,36 @@ self._requests[newIdentifier] = initialRequest del self._requests[requestIdentifier] initialRequest['Identifier'] = newIdentifier - initialRequest['FcModified'] = {self.Message.ModifiedRequestIdentifier: requestIdentifier} + initialRequest['FcModified'] = {consts.RequestModified.Identifier: requestIdentifier} self.events.RequestModified(initialRequest) self.sendMessageEx(initialRequest) return True - elif msg.name == self.Message.MessageProtocolError: + elif msg.name == consts.Message.ProtocolError: code = msg['Code'] - if requestIdentifier is None: - #TODO: check how to handle this - raise self.ProtocolError(msg) - - if initialRequest is None: - #TODO: check how to handle this - raise self.ProtocolError(msg) - - - if code == self.ProtocolError.ShuttingDown: + if code == consts.ProtocolError.ShuttingDown: self.close() msg = self.Message( - self.Message.MessageClientDisconnected, + consts.Message.ClientDisconnected, DisconnectReason=DisconnectReason.Shutdown, ) self.events.ClientDisconnected(msg) return True + if requestIdentifier is None: + #TODO: check how to handle this + raise consts.ProtocolError(msg) + + if initialRequest is None: + #TODO: check how to handle this + raise consts.ProtocolError(msg) + # handle DDA errors - elif code == self.ProtocolError.DDADenied: - ddaRequestMsg = self.Message(self.Message.MessageTestDDARequest) - if initialRequest.name == self.Message.MessageClientGet: + elif code == consts.ProtocolError.DDADenied: + ddaRequestMsg = self.Message(consts.Message.TestDDARequest) + if initialRequest.name == consts.Message.ClientGet: ddaRequestMsg['WantWriteDirectory'] = True directory = os.path.dirname(initialRequest['Filename']) else: @@ -658,44 +643,44 @@ # handle filename collisions - elif code == self.ProtocolError.DiskTargetExists: - handleCollision = initialRequest.get('FcFilenameCollision', self.FilenameCollision.HandleNever) - collisionHandled = bool(handleCollision & self.FilenameCollision.CollisionHandled) + elif code == consts.ProtocolError.DiskTargetExists: + handleCollision = initialRequest.get('FcFilenameCollision', consts.FilenameCollision.HandleNever) + collisionHandled = bool(handleCollision & consts.FilenameCollision.CollisionHandled) # rename filename - if handleCollision & self.FilenameCollision.HandleRename: + if handleCollision & consts.FilenameCollision.HandleRename: filename = initialRequest['Filename'] - initialRequest['FcFilenameCollision'] |= self.FilenameCollision.CollisionHandled + initialRequest['FcFilenameCollision'] |= consts.FilenameCollision.CollisionHandled newFilename = namespace.unique_filename(filename, extensions=1, ispostfixed=collisionHandled) initialRequest['Filename'] = newFilename - initialRequest['FcModified'] = {self.Message.ModifiedRequestFilename: filename} + initialRequest['FcModified'] = {consts.RequestModified.Filename: filename} self.sendMessageEx(initialRequest) self.events.RequestModified(initialRequest) return True # don't handle else: - initialRequest['FcFilenameCollision'] &= ~self.FilenameCollision.CollisionHandled + initialRequest['FcFilenameCollision'] &= ~consts.FilenameCollision.CollisionHandled # handle plugin related request failures - elif code == self.ProtocolError.NoSuchPlugin: - if initialRequest.name == self.Message.MessagePluginInfo: + elif code == consts.ProtocolError.NoSuchPlugin: + if initialRequest.name == consts.Message.PluginInfo: del self._requests[requestIdentifier] self.events.PluginInfoFailed(initialRequest) return True - elif initialRequest.name == self.Message.MessageFCPPluginMessage: + elif initialRequest.name == consts.Message.FCPPluginMessage: del self._requests[requestIdentifier] self.events.PluginMessageFailed(initialRequest) return True - elif code == self.ProtocolError.AccessDenied: - if initialRequest.name == self.Message.MessagePluginInfo: + elif code == consts.ProtocolError.AccessDenied: + if initialRequest.name == consts.Message.PluginInfo: del self._requests[requestIdentifier] self.events.PluginInfoFailed(initialRequest) return True # TODO: just a guess that FCPPluginMessage can trigger an AccessDenied error - elif initialRequest.name == self.Message.MessageFCPPluginMessage: + elif initialRequest.name == consts.Message.FCPPluginMessage: del self._requests[requestIdentifier] self.events.PluginMessageFailed(initialRequest) return True @@ -707,7 +692,7 @@ # NOTE: Fcp already removed the request del self._requests[requestIdentifier] initialRequest['FcErrorMessage'] = msg - initialRequest['FcStatus'] = self.Message.StatusError | self.Message.StatusRemoved + initialRequest['FcStatus'] = consts.MessageStatus.Error | consts.MessageStatus.Removed self.events.RequestFailed(initialRequest) return True @@ -721,7 +706,7 @@ ## TestDDA drill. ## #################################################### - elif msg.name == self.Message.MessageTestDDAReply: + elif msg.name == consts.Message.TestDDAReply: directory = msg['Directory'] # find message that triggered the call @@ -752,14 +737,14 @@ initialRequest['FcTestDDA']['TmpFile'] = fpathWrite self.sendMessage( - self.Message.MessageTestDDAResponse, + consts.Message.TestDDAResponse, Directory=msg['Directory'], ReadContent=readContent, ) return True - elif msg.name == self.Message.MessageTestDDAComplete: + elif msg.name == consts.Message.TestDDAComplete: # clean up tmp file directory = msg['Directory'] @@ -790,7 +775,7 @@ #TODO: check if errorMsg gives reasonable feedback del self._requests[initialRequest['Identifier']] - initialRequest['FcStatus'] = self.Message.StatusError | self.Message.StatusRemoved + initialRequest['FcStatus'] = consts.MessageStatus.Error | consts.MessageStatus.Removed initialRequest['FcErrorMessage'] = initialRequest['FcTestDDA']['ErrorMsg'] self.events.ProtocolError(initialRequest) return True @@ -807,11 +792,11 @@ ## config related ## #################################################### - elif msg.name == self.Message.MessageConfigData: + elif msg.name == consts.Message.ConfigData: self.events.ConfigData(msg) return True - elif msg.name == self.Message.MessageNodeData: + elif msg.name == consts.Message.NodeData: self.events.NodeData(msg) return True @@ -821,7 +806,7 @@ ## get / put related ## #################################################### - elif msg.name == self.Message.MessageAllData: + elif msg.name == consts.Message.AllData: if initialRequest is None: return False @@ -829,13 +814,13 @@ self.events.RequestCompleted(initialRequest) return True - elif msg.name == self.Message.MessageDataFound: + elif msg.name == consts.Message.DataFound: if initialRequest is None: # something is going wrong return False - initialRequest['FcStatus'] = self.Message.StatusComplete + initialRequest['FcStatus'] = consts.MessageStatus.Complete initialRequest['FcMetadataContentType'] = msg.get('Metadata.ContentType', '') initialRequest['FcDataLength'] = msg.get('DataLength', '') self.events.RequestCompleted(initialRequest) @@ -843,15 +828,15 @@ - elif msg.name == self.Message.MessageGetFailed: + elif msg.name == consts.Message.GetFailed: code = msg['Code'] if initialRequest is None: # something is going wrong return False # check if it is one of our requests for key information - if code == self.FetchError.TooBig and initialRequest['FcSubType'] == self.Message.SubTypeGetKeyInfo: - initialRequest['FcStatus'] = self.Message.StatusComplete + if code == self.FetchError.TooBig and initialRequest['FcSubType'] == consts.MessageSubType.GetKeyInfo: + initialRequest['FcStatus'] = consts.MessageStatus.Complete initialRequest['FcMetadataContentType'] = msg.get('ExpectedMetadata.ContentType', '') initialRequest['FcDataLength'] = msg.get('ExpectedDataLength', -1) initialRequest['FcProgressCompleted'] = True @@ -863,13 +848,13 @@ #TODO: check if Fcp removed the request initialRequest['FcErrorMessage'] = msg - initialRequest['FcStatus'] = self.Message.StatusError + initialRequest['FcStatus'] = consts.MessageStatus.Error self.events.RequestFailed(initialRequest) return True - elif msg.name == self.Message.MessagePersistentGet: + elif msg.name == consts.Message.PersistentGet: # unknown request... try to restore it if initialRequest is None: @@ -878,24 +863,24 @@ # not one of our requests... so cancel it if restoredRequest is None or CancelPersistentRequests: self.sendMessage( - self.Message.MessageRemovePersistentRequest, + consts.Message.RemovePersistentRequest, Identifier=msg['Identifier'], Global=msg['Global'], ) return True # determine initial message name - restoredRequest.name = self.Message.MessageClientGet + restoredRequest.name = consts.Message.ClientGet # restore request self._requests[requestIdentifier] = restoredRequest - restoredRequest['FcStatus'] = self.Message.StatusStarted + restoredRequest['FcStatus'] = consts.MessageStatus.Started self.events.RequestRestored(restoredRequest) return True # known request... filter out multiple PersistentGets - if initialRequest['FcStatus'] == self.Message.StatusPending: - initialRequest['FcStatus'] = self.Message.StatusStarted + if initialRequest['FcStatus'] == consts.MessageStatus.Pending: + initialRequest['FcStatus'] = consts.MessageStatus.Started #TODO: update initialRequest with params from PersistentGet? @@ -904,7 +889,7 @@ return True - elif msg.name == self.Message.MessagePersistentPut: + elif msg.name == consts.Message.PersistentPut: # unknown request... try to restore it if initialRequest is None: @@ -913,29 +898,29 @@ # not one of our requests... so cancel it if restoredRequest is None or CancelPersistentRequests: self.sendMessage( - self.Message.MessageRemovePersistentRequest, + consts.Message.RemovePersistentRequest, Identifier=msg['Identifier'], Global=msg['Global'], ) return True # determine initial message name - if restoredRequest['FcSubType'] == self.Message.SubTypePut: - restoredRequest.name = self.Message.MessageClientPut - elif restoredRequest['FcSubType'] == self.Message.SubTypePutDiskDir: - restoredRequest.name = self.Message.MessageClientPutDiskDir - elif restoredRequest['FcSubType'] == self.Message.SubTypePutComplexDir: - restoredRequest.name = self.Message.MessageClientPutComplexDir + if restoredRequest['FcSubType'] == consts.MessageSubType.Put: + restoredRequest.name = consts.Message.ClientPut + elif restoredRequest['FcSubType'] == consts.MessageSubType.PutDiskDir: + restoredRequest.name = consts.Message.ClientPutDiskDir + elif restoredRequest['FcSubType'] == consts.MessageSubType.PutComplexDir: + restoredRequest.name = consts.Message.ClientPutComplexDir # restore request self._requests[requestIdentifier] = restoredRequest - restoredRequest['FcStatus'] = self.Message.StatusStarted + restoredRequest['FcStatus'] = consts.MessageStatus.Started self.events.RequestRestored(restoredRequest) return True # known request... filter out multiple PersistentGets - if initialRequest['FcStatus'] == self.Message.StatusPending: - initialRequest['FcStatus'] = self.Message.StatusStarted + if initialRequest['FcStatus'] == consts.MessageStatus.Pending: + initialRequest['FcStatus'] = consts.MessageStatus.Started #TODO: update initialRequest with params from PersistentPut? #TODO: update initialRequest with params from PersistentPut? @@ -946,7 +931,7 @@ return True - elif msg.name == self.Message.MessagePersistentRequestModified: + elif msg.name == consts.Message.PersistentRequestModified: if initialRequest is None: return False @@ -962,14 +947,14 @@ # ...as long as no other param is changed at runtime we are ok # otherwise we would have to set flags to indicate wich member # of ClientToken changed. See --> modifyRequest() - modified[self.Message.ModifiedRequestPersistentUserData] = None + modified[consts.RequestModified.PersistentUserData] = None for i, fcParam in enumerate(self.FcParams.FcParams): initialRequest[fcParam] = params[i] # check if PriorityClass has changed priorityClass = msg.get('PriorityClass', None) if priorityClass is not None: - modified[self.Message.ModifiedRequestPriorityClass] = None + modified[consts.RequestModified.PriorityClass] = None initialRequest['PriorityClass'] = priorityClass initialRequest['FcModified'] = modified @@ -977,7 +962,7 @@ return True - elif msg.name == self.Message.MessagePersistentRequestRemoved: + elif msg.name == consts.Message.PersistentRequestRemoved: if initialRequest is None: return False @@ -985,7 +970,7 @@ return True - elif msg.name == self.Message.MessageSimpleProgress: + elif msg.name == consts.Message.SimpleProgress: if initialRequest is None: # something went wrong return False @@ -1000,14 +985,14 @@ ## put related - elif msg.name == self.Message.MessageURIGenerated: + elif msg.name == consts.Message.URIGenerated: if initialRequest is None: # something went wrong return False initialRequest['URI'] = msg['URI'] return True - elif msg.name == self.Message.MessagePutFetchable: + elif msg.name == consts.Message.PutFetchable: if initialRequest is None: # something went wrong return False @@ -1016,7 +1001,7 @@ return True - elif msg.name == self.Message.MessagePutSuccessful: + elif msg.name == consts.Message.PutSuccessful: if initialRequest is None: # something went wrong return False @@ -1034,27 +1019,27 @@ ## Peer related messages ## #################################################### - elif msg.name == self.Message.MessageEndListPeers: + elif msg.name == consts.Message.EndListPeers: self.events.EndListPeers(msg) return True - elif msg.name == self.Message.MessageEndListPeerNotes: + elif msg.name == consts.Message.EndListPeerNotes: self.events.EndListPeerNotes(msg.params) return True - elif msg.name == self.Message.MessagePeer: + elif msg.name == consts.Message.Peer: self.events.Peer(msg) return True - elif msg.name == self.Message.MessagePeerNote: + elif msg.name == consts.Message.PeerNote: self.events.PeerNote(msg) return True - elif msg.name == self.Message.MessagePeerRemoved: + elif msg.name == consts.Message.PeerRemoved: self.events.PeerRemoved(msg) return True - elif msg.name == self.Message.MessageUnknownNodeIdentifier: + elif msg.name == consts.Message.UnknownNodeIdentifier: self.events.UnknownNodeIdentifier(msg) return True @@ -1063,7 +1048,7 @@ ## plugins ## #################################################### - elif msg.name == self.Message.MessagePluginInfo: + elif msg.name == consts.Message.PluginInfo: if initialRequest is None: return False @@ -1071,7 +1056,7 @@ self.events.PluginInfo(msg) return True - elif msg.name == self.Message.MessageFCPPluginReply: + elif msg.name == consts.Message.FCPPluginReply: if initialRequest is None: return False @@ -1084,7 +1069,7 @@ ## others ## #################################################### - elif msg.name == self.Message.MessageSSKKeypair: + elif msg.name == consts.Message.SSKKeypair: if requestIdentifier not in self._sskRequests: return False @@ -1104,9 +1089,9 @@ return True - elif msg.name == self.Message.MessageCloseConnectionDuplicateClientName: + elif msg.name == consts.Message.CloseConnectionDuplicateClientName: msg = self.Message( - self.Message.MessageClientDisconnected, + consts.Message.ClientDisconnected, DisconnectReason=DisconnectReason.DuplicateClientName, ) self.events.ClientDisconnect(msg) @@ -1123,13 +1108,13 @@ @note: use this method instead of run() to run the client step by step """ msg = self.Message.fromSocket(self._socket) - if msg.name == self.Message.MessageClientSocketDied: + if msg.name == consts.Message.ClientSocketDied: if dispatch: - msg['DisconnectReason'] = self.DisconnectReason.SocketDied + msg['DisconnectReason'] = consts.DisconnectReason.SocketDied self.events.ClientDisconnected(msg) raise socket.error(msg['Details']) - elif msg.name == self.Message.MessageClientSocketTimeout: + elif msg.name == consts.Message.ClientSocketTimeout: if dispatch: self.events.Idle(msg) @@ -1160,16 +1145,16 @@ If an error handler is passed to the client it is called emidiately before the error is raised. """ - self._log.debug(self.LogMessages.MessageSend + msg.pprint()) + self._log.debug(consts.LogMessages.MessageSend + msg.pprint()) try: msg.send(self._socket) except socket.error, d: - self._log.info(self.LogMessages.SocketDied) + self._log.info(consts.LogMessages.SocketDied) self.close() errorMsg = self.Message( - self.Message.MessageClientSocketDied, - DisconnectReason=self.DisconnectReason.SocketDied, + consts.Message.ClientSocketDied, + DisconnectReason=consts.DisconnectReason.SocketDied, Exception=socket.error, Details=d ) @@ -1196,7 +1181,7 @@ @event: ConfigData(event, msg) """ self.sendMessage( - self.Message.MessageGetConfig, + consts.Message.GetConfig, WithSortOrder=withSortOrder, WithCurrent=withCurrent, WithDefaults=withDefaults, @@ -1211,7 +1196,7 @@ """Modifies node configuration values @param params: (dict) containing parameters to modify """ - msg = self.Message(self.Message.MessageModifyConfig) + msg = self.Message(consts.Message.ModifyConfig) msg.params = params self.sendMessageEx(msg) @@ -1230,8 +1215,8 @@ **messageParams ): """Requests a key from the node - @param uri: uri of the file to request (may contain prefixes like 'freenet:' or 'http://') - @param messageSubType: one of the Message.SubType* consts to the desired request + @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 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 @@ -1243,7 +1228,7 @@ """ uri = self.Uri(uri).uri - msg = self.Message(self.Message.MessageClientGet, URI=uri) + msg = self.Message(consts.Message.ClientGet, URI=uri) for paramName, value in messageParams.items(): if value is not None: msg[paramName] = value @@ -1281,13 +1266,13 @@ @param uri: uri of the file to request (may contain prefixes like 'freenet:' or 'http://') @param allowedMimeTypes: (str) list of allowed mime types - @param binaryBlob: if True, the file is retrieved as binary blob file - @param dsOnly: if True, retrieves the file from the local data store only - @param ignoreDs: If True, ignores the local data store + @param binaryBlob: (bool) if True, the file is retrieved as binary blob file + @param dsOnly: (bool) if True, retrieves the file from the local data store only + @param ignoreDS: (bool) if True, ignores the local data store @param maxRetries: (int) maximum number of retries or -1 to retry forver or None to leave it to the node to decide @param maxSize: (int) maximum size of the file in bytes or None to set no limited - @param persistence: persistence of the request as one of the L{consts.Persistence} constants - @param priorityClass: priority of the request as one of the L{consts.Priority} consts + @param persistence: (L{consts.Persistence}) persistence of the request + @param priorityClass: (L{consts.Priority}) priority of the request @param userData: any non persistent data to associate to the request @param persistentUserData: any string to associate to the request as persistent data @@ -1297,7 +1282,7 @@ """ return self.clientGet( uri, - self.Message.SubTypeGetData, + consts.MessageSubType.GetData, userData, persistentUserData, consts.FilenameCollision.HandleNever, @@ -1313,9 +1298,9 @@ MaxSize = maxSize, Persistence=persistence, PriorityClass=priorityClass, - ReturnType=self.ReturnType.Direct, + ReturnType=consts.ReturnType.Direct, URI=self.Uri(uri).uri, - Verbosity=self.Verbosity.ReportProgress, + Verbosity=consts.Verbosity.ReportProgress, ) @@ -1344,11 +1329,11 @@ @param allowedMimeTypes: (str) list of allowed mime types @param binaryBlob: if True, the file is retrieved as binary blob file @param dsOnly: if True, retrieves the file from the local data store only - @param ignoreDs: If True, ignores the local data store + @param ignoreDS: If True, ignores the local data store @param maxRetries: (int) maximum number of retries or -1 to retry forver or None to leave it to the node to decide @param maxSize: (int) maximum size of the file in bytes or None to set no limited - @param persistence: persistence of the request as one of the L{consts.Persistence} constants - @param priorityClass: priority of the request as one of the L{consts.Priority} consts + @param persistence: (L{consts.Persistence}) persistence of the request + @param priorityClass: (L{consts.Priority}) priority of the request @param filenameCollision: what to do if the disk target alreaady exists. One of the FilenameCollision.* consts @param userData: any non persistent data to associate to the request @@ -1359,7 +1344,7 @@ """ return self.clientGet( uri, - self.Message.SubTypeGetFile, + consts.MessageSubType.GetFile, userData, persistentUserData, filenameCollision, @@ -1376,9 +1361,9 @@ MaxSize = maxSize, Persistence=persistence, PriorityClass=priorityClass, - ReturnType=self.ReturnType.Disk, + ReturnType=consts.ReturnType.Disk, URI=self.Uri(uri).uri, - Verbosity=self.Verbosity.ReportProgress, + Verbosity=consts.Verbosity.ReportProgress, ) @@ -1399,10 +1384,10 @@ @param uri: uri of the file to request (may contain prefixes like 'freenet:' or 'http://') @param dsOnly: if True, retrieves the file from the local data store only - @param ignoreDs: If True, ignores the local data store + @param ignoreDS: If True, ignores the local data store @param maxRetries: (int) maximum number of retries or -1 to retry forver or None to leave it to the node to decide - @param persistence: persistence of the request as one of the L{consts.Persistence} constants - @param priorityClass: priority of the request as one of the L{consts.Priority} consts + @param persistence: (L{consts.Persistence}) persistence of the request + @param priorityClass: (L{consts.Priority}) priority of the request @param userData: any non persistent data to associate to the request @param persistentUserData: any string to associate to the request as persistent data @@ -1411,7 +1396,7 @@ # how to retrieve meta info about a key? ...idea is to provoke a GetFailed (TooBig) return self.clientGet( uri, - self.Message.SubTypeGetKeyInfo, + consts.MessageSubType.GetKeyInfo, userData, persistentUserData, consts.FilenameCollision.HandleNever, @@ -1425,9 +1410,9 @@ MaxSize=self.MaxSizeKeyInfo, Persistence=persistence, PriorityClass=priorityClass, - ReturnType=self.ReturnType.Nothing, + ReturnType=consts.ReturnType.Nothing, URI=self.Uri(uri).uri, - Verbosity=self.Verbosity.ReportProgress, + Verbosity=consts.Verbosity.ReportProgress, ) @@ -1443,12 +1428,12 @@ raise ValueError('Nothing to upload') # determine SubType - if msg.name == self.Message.MessageClientPut: - messageSubType = self.Message.SubTypePut - elif msg.name == self.Message.MessageClientPutDiskDir: - messageSubType = self.Message.SubTypePutDiskDir + if msg.name == consts.Message.ClientPut: + messageSubType = consts.MessageSubType.Put + elif msg.name == consts.Message.ClientPutDiskDir: + messageSubType = consts.MessageSubType.PutDiskDir else: - messageSubType = self.Message.SubTypePutComplexDir + messageSubType = consts.MessageSubType.PutComplexDir self._registerRequest( msg, @@ -1476,7 +1461,7 @@ data, **messageParams): - msg = self.Message(self.Message.MessageClientPut, URI=uri) + msg = self.Message(consts.Message.ClientPut, URI=uri) for paramName, value in messageParams.items(): if value is not None: msg[paramName] = value @@ -1517,7 +1502,7 @@ return self.clientPut( consts.KeyType.CHK, - self.Message.SubTypePut, + consts.MessageSubType.Put, userData, persistentUserData, data, @@ -1533,8 +1518,8 @@ DontCompress=dontCompress, Persistence=persistence, TargetFilename=targetFilename, - UploadFrom=self.UploadFrom.Direct, - Verbosity=self.Verbosity.ReportProgress | self.Verbosity.ReportCompression, + UploadFrom=consts.UploadFrom.Direct, + Verbosity=consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression, ) def putFile(self, @@ -1553,7 +1538,7 @@ ): return self.clientPut( concts.KeyType.CHK, - self.Message.SubTypePut, + consts.MessageSubType.Put, userData, persistentUserData, None, @@ -1569,8 +1554,8 @@ DontCompress=dontCompress, Persistence=persistence, TergetFilename=targetFilename, - UploadFrom=self.UploadFrom.Disk, - Verbosity=self.Verbosity.ReportProgress | self.Verbosity.ReportCompression, + UploadFrom=consts.UploadFrom.Disk, + Verbosity=consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression, ) @@ -1596,15 +1581,15 @@ def modifyRequest(self, requestIdentifier, persistentUserData=None, priorityClass=None): """Modifies a request - @param identifier: identifier of the request to modify - @param clientToken: new client token or None - @param priorityClass: new priority or None + @param requestIdentifier: identifier of the request to modify + @param persistentUserData: (str) persistent user data or None + @param priorityClass: (L{consts.Priority}) new priority or None @note: a RequestModified event is triggered as soon as the request has actually been modified """ initialRequest = self._requests[requestIdentifier] msg = self.Message( - self.Message.MessageModifyPersistentRequest, + consts.Message.ModifyPersistentRequest, Identifier=initialRequest['Identifier'], Global=False, ) @@ -1618,14 +1603,14 @@ def removeRequest(self, requestIdentifier): """Removes a request - @param identifier: (str) identifier of the request to remove + @param requestIdentifier: (str) identifier of the request to remove @note: a RequestRemoved event is triggered as soon as the request has actually been removed """ initialRequest = self._requests[requestIdentifier] - initialRequest['FcStatus'] = self.Message.StatusRemoved + initialRequest['FcStatus'] = consts.MessageStatus.Removed self.sendMessage( - self.Message.MessageRemovePersistentRequest, + consts.Message.RemovePersistentRequest, Global=False, Identifier=requestIdentifier, ) @@ -1648,36 +1633,36 @@ """Request information about the node @param withPrivate: if True, private data is included @param withVolatile: if True, statistical data is included - @param giveOppennetRef: if True, the opennet reference is retuned instead of the darknet + @param giveOpennetRef: if True, the opennet reference is retuned instead of the darknet """ self.sendMessage( - self.Message.MessageGetNode, + consts.Message.GetNode, WithPrivate=withPrivate, WithVolatile=withVolatile, GiveOpennetRef=giveOpennetRef, ) - def listPeer(self, identity): + def listPeer(self, nodeIdentity): """Requests information about a peer node - @param identifier: identifier of the peer to request information for + @param nodeIdentity: identity of the peer to request information for """ - self.jobClient.sendMessage( - self.Message.MessageListPeer, + self.sendMessage( + consts.Message.ListPeer, NodeIdentifier=identity, ) - def listPeerNotes(self, identity): + def listPeerNotes(self, nodeIdentity): """Lists all text notes associated to a peer - @param identifier: peer as returned in a call to L{peerList} + @param nodeIdentity: peer as returned in a call to L{listPeer} @event: ListPeerNote(event, params) @event: EndListPeerNotes(event, params) @note: listPeerNotes() is only available for darknet nodes """ self.sendMessage( - self.Message.MessageListPeerNotes, - NodeIdentifier=identity + consts.Message.ListPeerNotes, + NodeIdentifier=nodeIdentity ) @@ -1690,54 +1675,54 @@ @event: EndListPeers(event, params). """ self.sendMessage( - self.Message.MessageListPeers, + consts.Message.ListPeers, WithMetadata=withMetaData, WithVolatile=withVolantile, ) - def modifyPeer(self, identity, allowLocalAddresses=None, isDisabled=None, isListenOnly=None): + + def modifyPeer(self, nodeIdentifier, allowLocalAddresses=None, isDisabled=None, isListenOnly=None): """Modifies a peer node - @param identity: identity of the peer node to modify + @param nodeIdentifier: identitfier of the peer node to modify @param allowLocalAddresses: if True, whatever is done @param isDisabled: if True, the peer is disabled @param isListenOnly: if True, the peer is set to listen only status """ msg = Message( - self.Message.MessageModifyPeer, - NodeIdentifier=identity, + consts.Message.ModifyPeer, + NodeIdentifier=nodeidentifier, ) if allowLocalAddresses is not None: msg['AllowLocalAddresses'] = allowLocalAddresses if isDisabled is not None: - msg['isDisabled'] = isDisabled + msg['IsDisabled'] = isDisabled if isListenOnly is not None: - msg['isListenOnly'] = isListenOnly - self.jobClient.sendMessageEx(msg) + msg['IsListenOnly'] = isListenOnly self.sendMessageEx(msg) - + - def modifyPeerNote(self, identity, note): + def modifyPeerNote(self, nodeIdentifier, note): """Modifies the note associated to a peer - @param identity: identity of the peer node to modify + @param nodeIdentifier: identitifier of the peer node to modify @param note: (str) new note to associate to the peer """ self.sendMessage( - self.Message.MessageModifyPeerNote, - NodeIdentifier=identity, + consts.Message.ModifyPeerNote, + NodeIdentifier=nodeIdentifier, #NOTE: currently fcp supports only this one type - PeerNoteType=self.PeerNoteType.Private, + PeerNoteType=consts.PeerNoteType.Private, NoteText=note ) - def removePeer(self, identity): + def removePeer(self, nodeIdentifier): """Removes a peer - @param identity: identity of the peer node to remove + @param nodeIdentifier: identitfier of the peer node to remove """ self.sendMessage( - self.Message.MessageRemovePeer, - NodeIdentifier=identity, + consts.Message.RemovePeer, + NodeIdentifier=nodeidentifier, ) ########################################################## @@ -1757,7 +1742,7 @@ if identifier not in self._requests: break msg = self.Message( - self.Message.MessageGetPluginInfo, + consts.Message.GetPluginInfo, Identifier=identifier, PluginName=pluginName, Detailed=detailed, @@ -1770,7 +1755,7 @@ def sendPluginMessage(self, pluginName, params, data=None): """Sends a message to a plugin @param pluginName: name of the plugin to send the message to - @param poarams: (dict) additional params to pass to the plugin (each parameter has to be prefixed with 'Param.') + @param params: (dict) additional params to pass to the plugin (each parameter has to be prefixed with 'Param.') @param data: (str) data to pass along with the messaage or None @return: (str) request identifier """ @@ -1779,7 +1764,7 @@ if identifier not in self._requests: break msg = self.Message( - self.Message.MessageGetPluginInfo, + consts.Message.GetPluginInfo, Identifier=identifier, PluginName=pluginName, **params @@ -1802,7 +1787,7 @@ ########################################################## def generateKeypair(self, keypairType=consts.KeyType.SSK): """ - @param keypairType: type of keypair to generate (either L{KeyType.SSK} or L{KeyType.SSK}) + @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 """ @@ -1816,7 +1801,7 @@ break self._sskRequests.append(identifier) self.sendMessage( - self.Message.MessageGenerateSSK, + consts.Message.GenerateSSK, Identifier=identifier, ) return identifier @@ -1828,7 +1813,7 @@ if __name__ == '__main__': c = FcpClient( connectionName='test', - debugVerbosity=FcpClient.DebugVerbosity.Debug + debugVerbosity=consts.DebugVerbosity.Debug ) for nodeHello in c.connect(): pass @@ -2012,3 +1997,10 @@ #testGetPluginInfo() + + def testListPeers(): + c.listPeers() + for i in xrange(30): + c.next() + + #testListPeers() \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-02 11:26:27
|
Revision: 111 http://fclient.svn.sourceforge.net/fclient/?rev=111&view=rev Author: jurner Date: 2008-02-02 03:26:28 -0800 (Sat, 02 Feb 2008) Log Message: ----------- bit of this and that 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-02 11:25:23 UTC (rev 110) +++ trunk/sandbox/fcp/fcp2_0_client.py 2008-02-02 11:26:28 UTC (rev 111) @@ -1,6 +1,6 @@ """Freenet client protocol 2.0 implementation -Compatibility: >= Freenet 0.7 Build #1084 +Compatibility: >= Freenet 0.7 Build #1107 @newfield event: event, events @@ -102,7 +102,7 @@ hack = SysPathHack(3) -from fcp_lib import events, namespace, uuid +from fcp_lib import events, namespace del hack @@ -242,6 +242,8 @@ # others 'KeypairGenerated', + 'USKUpdated', + ############################### 'ProtocolError', @@ -305,9 +307,6 @@ 'FcErrorMessage': None, # did an error occur? 'FcUserData': userData, # any user defined runtime data here - # params for AllData - 'FcData': '', # if data was requested via requestData you will find it here - # params for SSKKeypair 'FcInsertUri': None, 'FcRequestUri': None, @@ -352,7 +351,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() + identifier = self.FcParams.newUuid(uuids=self._requests) # add additional params to msg msg = self._addFcParamsToRequest( @@ -419,10 +418,13 @@ saveRemoveFile(initialRequest['FcTestDDA']['TmpFile']) self._ddaTests = [] - self._requests = {} 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): """Iterator to stablish a connection to a freenet node @param host: (str) host of th node @@ -520,7 +522,7 @@ @param connectionName: (str) connection name or None to use an arbitrary connection name @return: (str) connection name """ - self._connectionName = uuid.uuid_time() if connectionName is None else connectionName + self._connectionName = self.FcParams.newUuid() if connectionName is None else connectionName return self._connectionName @@ -578,6 +580,9 @@ # check if we have an initial request corrosponding to msg requestIdentifier = msg.get('Identifier', None) initialRequest = None if requestIdentifier is None else self._requests.get(requestIdentifier, None) + + + #################################################### ## ## errors @@ -614,9 +619,9 @@ raise consts.ProtocolError(msg) if initialRequest is None: - #TODO: check how to handle this - raise consts.ProtocolError(msg) + return False + # handle DDA errors elif code == consts.ProtocolError.DDADenied: ddaRequestMsg = self.Message(consts.Message.TestDDARequest) @@ -684,9 +689,8 @@ del self._requests[requestIdentifier] self.events.PluginMessageFailed(initialRequest) return True - - + # only requests should get through to here # NOTE: Fcp already removed the request @@ -810,7 +814,7 @@ if initialRequest is None: return False - initialRequest['FcData'] = msg.data + initialRequest.data = msg.data self.events.RequestCompleted(initialRequest) return True @@ -819,11 +823,12 @@ if initialRequest is None: # something is going wrong return False - + initialRequest['FcStatus'] = consts.MessageStatus.Complete initialRequest['FcMetadataContentType'] = msg.get('Metadata.ContentType', '') initialRequest['FcDataLength'] = msg.get('DataLength', '') - self.events.RequestCompleted(initialRequest) + if initialRequest['FcSubType'] != consts.MessageSubType.GetData: + self.events.RequestCompleted(initialRequest) return True @@ -1052,7 +1057,7 @@ if initialRequest is None: return False - del self._requests[requestIdentifier] + self._pluginRequests[requestIdentifier] self.events.PluginInfo(msg) return True @@ -1069,6 +1074,15 @@ ## others ## #################################################### + elif msg.name == consts.Message.CloseConnectionDuplicateClientName: + msg = self.Message( + consts.Message.ClientDisconnected, + DisconnectReason=DisconnectReason.DuplicateClientName, + ) + self.events.ClientDisconnect(msg) + return True + + elif msg.name == consts.Message.SSKKeypair: if requestIdentifier not in self._sskRequests: return False @@ -1088,13 +1102,11 @@ self.events.KeypairGenerated(msg) return True - - elif msg.name == consts.Message.CloseConnectionDuplicateClientName: - msg = self.Message( - consts.Message.ClientDisconnected, - DisconnectReason=DisconnectReason.DuplicateClientName, - ) - self.events.ClientDisconnect(msg) + elif msg.name == consts.Message.SubscribedUSKUpdate: + if initialRequest is None: + return False + + self.events.USKUpdated(msg) return True @@ -1105,7 +1117,6 @@ 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 instead of run() to run the client step by step """ msg = self.Message.fromSocket(self._socket) if msg.name == consts.Message.ClientSocketDied: @@ -1133,6 +1144,9 @@ @raise SocketError: if the socket connection to the node dies unexpectedly If an error handler is passed to the client it is called emidiately before the error is raised. + + @note: you can use this method to send a message to the node, bypassing all + track keeping methods of the client """ return self.sendMessageEx(self.Message(name, data=data, **params)) @@ -1144,6 +1158,9 @@ @raise SocketError: if the socket connection to the node dies unexpectedly. If an error handler is passed to the client it is called emidiately before the error is raised. + + @note: you can use this method to send a message to the node, bypassing all + track keeping methods of the client """ self._log.debug(consts.LogMessages.MessageSend + msg.pprint()) try: @@ -1416,6 +1433,25 @@ ) + + #TODO: persists until connection is closed... can this request be removed? + # Anyway. It is not listed in consts.Message.ClientRequestMessages, + # so any attempts will fail (wink) + def subscribeUSK(self, uri, dontPoll=True): + """Asks the node to notify the client when an USK is updated + @param uri: uri of the USK to subscribe to + @param dontPoll: if True, whatever ??? + @return: (str) identifer of the request + """ + identifier = self.FcParams.newUuid(uuids=self._requests) + self.sendMessage( + consts.Message.SubscribeUSK, + Identifier=identifier, + URI=uri, + DontPoll=dontPoll, + ) + return identifier + ######################################################## ## ## ClientPut related methods @@ -1585,9 +1621,14 @@ @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}. + 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: + raise ValueError('Can not modify request: %s' % initialRequest.name) + msg = self.Message( consts.Message.ModifyPersistentRequest, Identifier=initialRequest['Identifier'], @@ -1598,6 +1639,7 @@ msg['ClientToken'] = self.FcParams.messageToParams(initialRequest) if priorityClass is not None: msg['PriorityClass'] = priorityClass + self.sendMessageEx(msg) @@ -1605,21 +1647,54 @@ """Removes a request @param requestIdentifier: (str) identifier of the request to remove - @note: a RequestRemoved event is triggered as soon as the request has actually been removed + @note: you can use this method to remove requests as listed in L{consts.Message.ClientRequestMessages} + 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} + a RequestRemoved event is triggered as soon as the request has actually been removed """ initialRequest = self._requests[requestIdentifier] - initialRequest['FcStatus'] = consts.MessageStatus.Removed - self.sendMessage( - consts.Message.RemovePersistentRequest, - Global=False, - Identifier=requestIdentifier, - ) + if initialRequest.name in consts.Message.ClientRequestMessages: + initialRequest['FcStatus'] = consts.MessageStatus.Removed + self.sendMessage( + consts.Message.RemovePersistentRequest, + Global=False, + Identifier=requestIdentifier, + ) + else: + del self._requests[requestIdentifier] - #TODO: check how Fcp responds when the identifier is unknwon or something else goes + #TODO: check how Fcp responds when the identifier is unknown or something else goes # werong. Maybe a ProtocolError.NoSuchIdentifier ??? - - + + def resendRequest(self, requestMessage): + """Resends a request + @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} + 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: + self._registerRequest( + requestMessage, + requestMessage['FcUserData'], + requestMessage['FcMessageSubType'], + time.time(), # TOSO: reset init time? + requestMessage['FcPersistentUserData'], + requestMessage['FcFilenameCollision=filenameCollision'], + ) + elif requestMessage.name in consts.Message.ClientPluginMessages: + identifier = self.FcParam.newUuid(uuids=self._requests) + initialRequest['Identifier'] = identifier + self._requests[identifier] = initialRequest + else: + raise ValueError('Can not resend request: %s' % requestMessage.name) + + self.sendMessageEx(msg) + return requestMessage['Identifier'] + ######################################################## ## ## Peer related methods @@ -1730,17 +1805,15 @@ ## plugins ## ########################################################## - #TODO: curently it is just a guess the a plugin may respond with a IdentifierCollision + #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 """ - while True: - identifier = uuid.uuid_time() - if identifier not in self._requests: - break + identifier = self.FcParam.newUuid(uuids=self._requests) msg = self.Message( consts.Message.GetPluginInfo, Identifier=identifier, @@ -1759,10 +1832,7 @@ @param data: (str) data to pass along with the messaage or None @return: (str) request identifier """ - while True: - identifier = uuid.uuid_time() - if identifier not in self._requests: - break + identifier = self.FcParam.newUuid(uuids=self._requests) msg = self.Message( consts.Message.GetPluginInfo, Identifier=identifier, @@ -1795,10 +1865,7 @@ if keypairType not in (consts.KeyType.SSK, consts.KeyType.USK): raise ValueError('keypairType must be %s or %s' % (consts.KeyType.SSK, consts.KeyType.USK)) - while True: - identifier = keypairType + uuid.uuid_time() - if identifier not in self._sskRequests: - break + identifier = keypairType + self.FcParams.newUuid(self._sskRequests) self._sskRequests.append(identifier) self.sendMessage( consts.Message.GenerateSSK, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-02 18:26:08
|
Revision: 114 http://fclient.svn.sourceforge.net/fclient/?rev=114&view=rev Author: jurner Date: 2008-02-02 10:26:10 -0800 (Sat, 02 Feb 2008) Log Message: ----------- ... 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-02 11:27:23 UTC (rev 113) +++ trunk/sandbox/fcp/fcp2_0_client.py 2008-02-02 18:26:10 UTC (rev 114) @@ -580,9 +580,6 @@ # check if we have an initial request corrosponding to msg requestIdentifier = msg.get('Identifier', None) initialRequest = None if requestIdentifier is None else self._requests.get(requestIdentifier, None) - - - #################################################### ## ## errors @@ -971,6 +968,7 @@ if initialRequest is None: return False + #TODO: notify user ??? del self._requests[requestIdentifier] return True This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-04 03:14:19
|
Revision: 129 http://fclient.svn.sourceforge.net/fclient/?rev=129&view=rev Author: jurner Date: 2008-02-03 19:14:24 -0800 (Sun, 03 Feb 2008) Log Message: ----------- fixes request.status 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-03 13:16:37 UTC (rev 128) +++ trunk/sandbox/fcp/fcp2_0_client.py 2008-02-04 03:14:24 UTC (rev 129) @@ -102,14 +102,19 @@ hack = SysPathHack(3) -from fcp_lib import events, namespace +from fcp_lib import namespace del hack #<-- rel import hack -import fcp2_0_message import fcp2_0_consts as consts +from fcp2_0_events import Events +from fcp2_0_config import Config +from fcp2_0_message import Message +import fcp2_0_params as FcParams +from fcp2_0_uri import Uri + logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) @@ -193,67 +198,14 @@ ExpectedFcpVersion = 2.0 ExpectedNodeBuild = 1107 - from fcp2_0_config import Config consts = consts - from fcp2_0_message import Message - import fcp2_0_params as FcParams - from fcp2_0_uri import Uri + Config = Config + Message = Message + FcParams = FcParams + Uri = Uri - class Events(events.Events): - """All events the client supports""" - _events_ = ( - - 'Idle', - - 'ClientConnected', - 'ClientDisconnected', - - 'RequestCompleted', # the request is not removed neither from node nor client - 'RequestFailed', # the request is already removed from node and client - 'RequestFetchable', - 'RequestModified', - 'RequestProgress', - 'RequestRestored', - 'RequestStarted', - - - # config related events - 'ConfigData', - 'NodeData', - - - #Peer related events - 'EndListPeers', - 'Peer', - 'PeerRemoved', - 'UnknownNodeIdentifier', - 'EndListPeerNotes', - 'PeerNote', - - - # plugins - 'PluginInfo', - 'PluginInfoFailed', - 'PluginMessage' - 'PluginMessagefailed', - - # others - 'KeypairGenerated', - - 'USKUpdated', - - ############################### - - 'ProtocolError', - - - - ) - - - def __init__(self, connectionName=None, debugVerbosity=None, @@ -272,7 +224,7 @@ self._nodeHelloMessage = None self._socket = None - self.events = self.Events() + self.events = Events() self.setDebugVerbosity(consts.DebugVerbosity.Warning if debugVerbosity is None else debugVerbosity) atexit.register(self.close) @@ -814,11 +766,12 @@ if initialRequest is None: return False + initialRequest['FcStatus'] = consts.MessageStatus.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 del self._requests[requestIdentifier] - initialRequest['FcStatus'] = consts.MessageStatus.Complete initialRequest.data = msg.data self.events.RequestCompleted(initialRequest) return True @@ -831,8 +784,7 @@ initialRequest['FcMetadataContentType'] = msg.get('Metadata.ContentType', '') initialRequest['FcDataLength'] = msg.get('DataLength', '') if initialRequest['FcSubType'] != consts.MessageSubType.GetData: - initialRequest['FcStatus'] = consts.MessageStatus.Complete - + initialRequest['FcStatus'] |= consts.MessageStatus.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] @@ -843,21 +795,24 @@ elif msg.name == consts.Message.GetFailed: if initialRequest is None: return False - + + initialRequest['FcStatus'] = consts.MessageStatus.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 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 + initialRequest['FcStatus'] |= consts.MessageStatus.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.MessageStatus.Error self.events.RequestFailed(initialRequest) return True @@ -1004,12 +959,14 @@ if initialRequest is None: return False + initialRequest['FcStatus'] = consts.MessageStatus.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 del self._requests[requestIdentifier] initialRequest['FcErrorMessage'] = msg - initialRequest['FcStatus'] = consts.MessageStatus.Error self.events.RequestFailed(initialRequest) return True @@ -1031,6 +988,11 @@ # as long as no corrosponding params are passed in DataFound # we ignore them initialRequest['FcStatus'] = consts.MessageStatus.Complete + + if initialRequest.params.get('Persistence', consts.Persistence.Connection) == consts.Persistence.Connection: + initialRequest['FcStatus'] |= consts.MessageStatus.Removed + del self._requests[requestIdentifier] + initialRequest['URI'] = msg['URI'] self.events.RequestCompleted(initialRequest) return True @@ -1062,7 +1024,7 @@ return True elif msg.name == consts.Message.UnknownNodeIdentifier: - self.events.UnknownNodeIdentifier(msg) + self.events.PeerUnknown(msg) return True #################################################### @@ -1315,10 +1277,10 @@ @return: (str) request identifier - @param event: RequestCompleted(event, message) triggered when the request is complete - @param event: RequestFailed(event, message) triggered when the request failes - @param event: RequestStarted(event, message) triggered when as the request is started - @param event: RequestModified(event, message) trigggered if the request identifier changes + @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 or the request is modified otherwise (see L{modifyRequest}) @note: if persistence is L{consts.Persistence.Connection} the request is removed from the client @@ -1384,10 +1346,10 @@ @return: (str) request identifier - @param event: RequestCompleted(event, message) triggered when the request is complete - @param event: RequestFailed(event, message) triggered when the request failes - @param event: RequestStarted(event, message) triggered when as the request is started - @param event: RequestModified(event, message) trigggered if the request identifier changes, + @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, filename changes or the request is modified otherwise (see L{modifyRequest}) @note: if persistence is L{consts.Persistence.Connection} the request is removed from the client @@ -1444,10 +1406,10 @@ @return: (str) request identifier - @param event: RequestCompleted(event, message) triggered when the request is complete - @param event: RequestFailed(event, message) triggered when the request failes - @param event: RequestStarted(event, message) triggered when as the request is started - @param event: RequestModified(event, message) trigggered if the request identifier changes + @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 or the request is modified otherwise (see L{modifyRequest}) @note: if persistence is L{consts.Persistence.Connection} the request is removed from the client @@ -1726,7 +1688,7 @@ requestMessage['FcMessageSubType'], time.time(), # TOSO: reset init time? requestMessage['FcPersistentUserData'], - requestMessage['FcFilenameCollision=filenameCollision'], + requestMessage['FcFilenameCollision'] & consts.FilenameCollision.MaskHandle, ) elif requestMessage.name in consts.Message.ClientPluginMessages: identifier = self.FcParam.newUuid(uuids=self._requests) 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: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 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: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-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 13:57:33
|
Revision: 163 http://fclient.svn.sourceforge.net/fclient/?rev=163&view=rev Author: jurner Date: 2008-02-06 05:57:32 -0800 (Wed, 06 Feb 2008) Log Message: ----------- refactored finalizing of requests to handle it in one place 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 11:13:27 UTC (rev 162) +++ trunk/sandbox/fcp/fcp2_0_client.py 2008-02-06 13:57:32 UTC (rev 163) @@ -307,7 +307,7 @@ # non persistent params 'FcStatus': consts.RequestStatus.Null, - 'FcErrorMessage': None, # did an error occur? + 'FcErrorMessage': None, # error message in case an error occured 'FcUserData': userData, # any user defined runtime data here # params for SSKKeypair @@ -335,6 +335,34 @@ return msg + def _finalizeRequest(self, msg, request, event): + """Finalzes a request + @param msg: message that is the reason for finalizing + @param request: request to finalize + @param event: event to trigger or None + + @note: this method sets the requests L{consts.RequestStatus.Removed} and + L{consts.RequestStatus.Completed} flags accordingly + @note: Fcp removes Get / Put requests with Persistence == connection emidiately + from its queue. Same goes all requests on ProtocolError. We inform the caller + that the request has been completed and remove it fom our queue if necessary. + Non Get / Put requests will be removed in any case. + """ + removeRequest = msg.name in (consts.Message.ProtocolError, consts.Message.PersistentRequestRemoved) + if not removeRequest: + #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.Removed + + if event is not None: + event(request) + + request['FcStatus'] |= consts.RequestStatus.Completed + if removeRequest: + del self._requests[request['Identifier']] + + def _registerRequest(self, msg, userData, @@ -691,16 +719,14 @@ # 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['FcErrorMessage'] = msg + initialRequest['FcStatus'] |= consts.RequestStatus.Error + self._finalizeRequest(msg, initialRequest, self.events.PluginInfoFailed) 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['FcErrorMessage'] = msg + initialRequest['FcStatus'] |= consts.RequestStatus.Error + self._finalizeRequest(msg, initialRequest, self.events.PluginMessageFailed) return True elif code == consts.ProtocolError.AccessDenied: @@ -721,10 +747,8 @@ # NOTE: Fcp already removed the request initialRequest['FcErrorMessage'] = msg - initialRequest['FcStatus'] = consts.RequestStatus.Success | consts.RequestStatus.Error | consts.RequestStatus.Removed - self.events.RequestFailed(initialRequest) - initialRequest['FcStatus'] |= consts.RequestStatus.Completed - del self._requests[requestIdentifier] + initialRequest['FcStatus'] = consts.RequestStatus.Error + self._finalizeRequest(msg, initialRequest, self.events.RequestFailed) return True @@ -802,20 +826,13 @@ testFailed = not msg.params.get('ReadDirectoryAllowed', False) if testFailed: - #TODO: check if errorMsg gives reasonable feedback - initialRequest['FcStatus'] = consts.RequestStatus.Error | consts.RequestStatus.Removed + initialRequest['FcStatus'] = consts.RequestStatus.Error 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']] + self._finalizeRequest(msg, initialRequest, self.events.RequestFailed) return True - - - # resend message + + # else: resend message self.sendMessageEx(initialRequest) return True @@ -846,16 +863,7 @@ 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] + self._finalizeRequest(msg, initialRequest, self.events.RequestCompleted) return True elif msg.name == consts.Message.DataFound: @@ -868,16 +876,7 @@ # except from GetData all requests are complete here. Next GetData will run through AllData... 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 - - # notify listeners - self.events.RequestCompleted(initialRequest) - initialRequest['FcStatus'] |= consts.RequestStatus.Completed - if initialRequest['FcStatus'] & consts.RequestStatus.Removed: - del self._requests[requestIdentifier] - + self._finalizeRequest(msg, initialRequest, self.events.RequestCompleted) return True @@ -885,29 +884,20 @@ if initialRequest is None: return False - # 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 - # check if it is one of our requests for key information code = msg['Code'] 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) - self.events.RequestCompleted(initialRequest) + initialRequest['FcStatus'] |= consts.RequestStatus.Success + self._finalizeRequest(msg, initialRequest, self.events.RequestCompleted) else: 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] + self._finalizeRequest(msg, initialRequest, self.events.RequestFailed) return True - - - + + elif msg.name == consts.Message.PersistentGet: # unknown request... try to restore it @@ -978,10 +968,8 @@ elif msg.name == consts.Message.PersistentRequestRemoved: if initialRequest is None: return False - - #TODO: notify user ? - initialRequest['FcStatus'] |= consts.RequestStatus.Removed - del self._requests[requestIdentifier] + #TODO: notify user? + self._finalizeRequest(msg, initialRequest, None) return True @@ -1043,20 +1031,9 @@ elif msg.name == consts.Message.PutFailed: if initialRequest is None: 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] - - # notify listeners - self.events.RequestFailed(initialRequest) - initialRequest['FcStatus'] |= consts.RequestStatus.Completed - if initialRequest['FcStatus'] & consts.RequestStatus.Removed: - del self._requests[requestIdentifier] + self._finalizeRequest(msg, initialRequest, self.events.RequestFailed) return True @@ -1072,20 +1049,12 @@ elif msg.name == consts.Message.PutSuccessful: if initialRequest is None: return False - # 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['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] + self._finalizeRequest(msg, initialRequest, self.events.RequestCompleted) return True @@ -1146,25 +1115,15 @@ elif msg.name == consts.Message.PluginInfo: 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.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 | consts.RequestStatus.Removed - - # notify listeners - self.events.PluginMessage(msg) - initialRequest['FcStatus'] |= consts.RequestStatus.Completed - del self._requests[requestIdentifier] + initialRequest['FcStatus'] |= consts.RequestStatus.Success + self._finalizeRequest(msg, initialRequest, self.events.PluginMessage) return True #################################################### @@ -1196,12 +1155,8 @@ initialRequest['InsertURI'] = insertURI initialRequest['RequestURI'] = requestURI - initialRequest['FcStatus'] |= consts.RequestStatus.Success | consts.RequestStatus.Removed - self.events.KeypairGenerated(initialRequest) - - # notify listeners - initialRequest['FcStatus'] |= consts.RequestStatus.Completed - del self._requests[requestIdentifier] + initialRequest['FcStatus'] |= consts.RequestStatus.Success + self._finalizeRequest(msg, initialRequest, self.events.KeypairGenerated) return True elif msg.name == consts.Message.SubscribedUSKUpdate: @@ -2036,14 +1991,17 @@ """ identifier = self.FcParam.newUuid(uuids=self._requests) msg = self.Message( - consts.Message.GetPluginInfo, - FcModified={}, - FcStatus=consts.RequestStatus.Pending, - FcRequestType=consts.RequestType.PluginInfo, - Identifier=identifier, - PluginName=pluginName, - Detailed=detailed, - ) + consts.Message.GetPluginInfo, + + FcErrorMessage=None, + FcModified={}, + FcRequestType=consts.RequestType.PluginInfo, + FcStatus=consts.RequestStatus.Pending, + + Identifier=identifier, + PluginName=pluginName, + Detailed=detailed, + ) self._requests[identifier] = msg self.sendMessageEx(msg) return identifier @@ -2058,14 +2016,17 @@ """ identifier = self.FcParam.newUuid(uuids=self._requests) msg = self.Message( - consts.Message.GetPluginInfo, - FcModified={}, - FcStatus=consts.RequestStatus.Pending, - FcRequestType=consts.RequestType.PluginMessage, - Identifier=identifier, - PluginName=pluginName, - **params - ) + consts.Message.GetPluginInfo, + + FcErrorMessage=None, + FcModified={}, + FcRequestType=consts.RequestType.PluginMessage, + FcStatus=consts.RequestStatus.Pending, + + Identifier=identifier, + PluginName=pluginName, + **params + ) if data is not None: msg['DataLength'] = len(data) msg.data = data @@ -2150,12 +2111,13 @@ identifier = c.getFile( 'CHK@q4~2soHTd9SOINIoXmg~dn7LNUAOYzN1tHNHT3j4c9E,gcVRtoglEhgqN-DJolXPqJ4yX1f~1gBGh89HNWlFMWQ,AAIC--8/snow_002%20%2810%29.jpg', filename, - filenameCollision=c.FilenameCollision.HandleRename, + filenameCollision=consts.FilenameCollision.HandleRename, #persistence=consts.Persistence.Forever, ) - for i in xrange(50): - c.next() + c.run() + #for i in xrange(50): + # c.next() #c.removeRequest(identifier) #for i in xrange(5): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ju...@us...> - 2008-02-06 14:57:02
|
Revision: 164 http://fclient.svn.sourceforge.net/fclient/?rev=164&view=rev Author: jurner Date: 2008-02-06 06:57:01 -0800 (Wed, 06 Feb 2008) Log Message: ----------- distinguish Removed from RemovedFromQueue 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 13:57:32 UTC (rev 163) +++ trunk/sandbox/fcp/fcp2_0_client.py 2008-02-06 14:57:01 UTC (rev 164) @@ -341,7 +341,7 @@ @param request: request to finalize @param event: event to trigger or None - @note: this method sets the requests L{consts.RequestStatus.Removed} and + @note: this method sets the requests L{consts.RequestStatus.RemovedFromQueue} and L{consts.RequestStatus.Completed} flags accordingly @note: Fcp removes Get / Put requests with Persistence == connection emidiately from its queue. Same goes all requests on ProtocolError. We inform the caller @@ -353,7 +353,7 @@ #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.Removed + request['FcStatus'] |= consts.RequestStatus.RemovedFromQueue if event is not None: event(request) @@ -969,6 +969,7 @@ if initialRequest is None: return False #TODO: notify user? + initialRequest['FcStatus'] |= consts.RequestStatus.Removed self._finalizeRequest(msg, initialRequest, None) return True @@ -1831,7 +1832,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['FcStatus'] |= consts.RequestStatus.Removed if initialRequest.name in consts.Message.ClientKeyRequestMessages: self.sendMessage( consts.Message.RemovePersistentRequest, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |