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
+ @para...
[truncated message content] |
|
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.
|