SF.net SVN: fclient: [157] trunk/sandbox/fcp/fcp2_0_client.py
Status: Pre-Alpha
Brought to you by:
jurner
|
From: <ju...@us...> - 2008-02-06 10:54:02
|
Revision: 157
http://fclient.svn.sourceforge.net/fclient/?rev=157&view=rev
Author: jurner
Date: 2008-02-06 02:54:05 -0800 (Wed, 06 Feb 2008)
Log Message:
-----------
more fine grained status and type flags for requests
Modified Paths:
--------------
trunk/sandbox/fcp/fcp2_0_client.py
Modified: trunk/sandbox/fcp/fcp2_0_client.py
===================================================================
--- trunk/sandbox/fcp/fcp2_0_client.py 2008-02-06 10:52:05 UTC (rev 156)
+++ trunk/sandbox/fcp/fcp2_0_client.py 2008-02-06 10:54:05 UTC (rev 157)
@@ -294,7 +294,7 @@
def _addFcParamsToRequest(self,
msg,
userData,
- msgSubType,
+ msgType,
initTime,
persistentUserData,
filenameCollision,
@@ -305,7 +305,7 @@
msg.params.update({
# persistent params that will go into identifier
- 'FcSubType': msgSubType, # identifies sub message types
+ 'FcType': msgType, # identifies sub message types
'FcInitTime': initTime, # when was the request started?
'FcFilenameCollision': filenameCollision, # handle fielanem collisions?
'FcPersistentUserData': persistentUserData, # any user defined persistent data
@@ -343,7 +343,7 @@
def _registerRequest(self,
msg,
userData,
- msgSubType,
+ msgType,
initTime,
persistentUserData,
filenameCollision=consts.FilenameCollision.HandleNever,
@@ -351,7 +351,7 @@
"""Registers a message
@param msg: message to register for track keeping
@param userData: any user defined data
- @param msgSubType: one of the message sub type consts
+ @param msgType: one of the message sub type consts
@param initTime: (python time)
@param persistentUserData: (str) user defined persistent data
@param filenameCollision: (bool)
@@ -365,7 +365,7 @@
msg = self._addFcParamsToRequest(
msg,
userData,
- msgSubType,
+ msgType,
initTime,
persistentUserData,
filenameCollision,
@@ -701,35 +701,40 @@
# handle plugin related request failures
elif code == consts.ProtocolError.NoSuchPlugin:
if initialRequest.name == consts.Message.PluginInfo:
+ initialRequest['FcStatus'] |= consts.RequestStatus.Error | consts.RequestStatus.Success | consts.RequestStatus.Removed
+ self.events.PluginInfoFailed(initialRequest)
+ initialRequest['FcStatus'] |= consts.RequestStatus.Completed
del self._requests[requestIdentifier]
- initialRequest['FcStatus'] |= consts.RequestStatus.Error | consts.RequestStatus.Complete | consts.RequestStatus.Removed
- self.events.PluginInfoFailed(initialRequest)
return True
elif initialRequest.name == consts.Message.FCPPluginMessage:
+ initialRequest['FcStatus'] |= consts.RequestStatus.Error | consts.RequestStatus.Success | consts.RequestStatus.Removed
+ self.events.PluginMessageFailed(initialRequest)
+ initialRequest['FcStatus'] |= consts.RequestStatus.Completed
del self._requests[requestIdentifier]
- initialRequest['FcStatus'] |= consts.RequestStatus.Error | consts.RequestStatus.Complete | consts.RequestStatus.Removed
- self.events.PluginMessageFailed(initialRequest)
return True
elif code == consts.ProtocolError.AccessDenied:
if initialRequest.name == consts.Message.PluginInfo:
+ self.events.PluginInfoFailed(initialRequest)
+ initialRequest['FcStatus'] |= consts.RequestStatus.Completed
del self._requests[requestIdentifier]
- self.events.PluginInfoFailed(initialRequest)
return True
# TODO: just a guess that FCPPluginMessage can trigger an AccessDenied error
elif initialRequest.name == consts.Message.FCPPluginMessage:
+ self.events.PluginMessageFailed(initialRequest)
+ initialRequest['FcStatus'] |= consts.RequestStatus.Completed
del self._requests[requestIdentifier]
- self.events.PluginMessageFailed(initialRequest)
return True
# only requests should get through to here
# NOTE: Fcp already removed the request
- del self._requests[requestIdentifier]
initialRequest['FcErrorMessage'] = msg
- initialRequest['FcStatus'] = consts.RequestStatus.Complete | consts.RequestStatus.Error | consts.RequestStatus.Removed
+ initialRequest['FcStatus'] = consts.RequestStatus.Success | consts.RequestStatus.Error | consts.RequestStatus.Removed
self.events.RequestFailed(initialRequest)
+ initialRequest['FcStatus'] |= consts.RequestStatus.Completed
+ del self._requests[requestIdentifier]
return True
@@ -809,11 +814,14 @@
if testFailed:
#TODO: check if errorMsg gives reasonable feedback
-
- del self._requests[initialRequest['Identifier']]
initialRequest['FcStatus'] = consts.RequestStatus.Error | consts.RequestStatus.Removed
initialRequest['FcErrorMessage'] = initialRequest['FcTestDDA']['ErrorMsg']
+
+ # notify listeners
self.events.ProtocolError(initialRequest)
+ # the node removed the request in any case (ProtocolError) so do we...
+ initialRequest['FcStatus'] = consts.RequestStatus.Completed
+ del self._requests[initialRequest['Identifier']]
return True
@@ -846,30 +854,40 @@
if initialRequest is None:
return False
- initialRequest['FcStatus'] |= consts.RequestStatus.Complete
+ initialRequest['FcStatus'] |= consts.RequestStatus.Success
+ initialRequest.data = msg.data
+
# Fcp removes requests from queue with Persistence.Connection.. so do we
if initialRequest.params.get('Persistence', consts.Persistence.Connection) == consts.Persistence.Connection:
initialRequest['FcStatus'] |= consts.RequestStatus.Removed
+
+ # notify listeners
+ self.events.RequestCompleted(initialRequest)
+ initialRequest['FcStatus'] |= consts.RequestStatus.Completed
+ if initialRequest['FcStatus'] & consts.RequestStatus.Removed:
del self._requests[requestIdentifier]
-
- initialRequest.data = msg.data
- self.events.RequestCompleted(initialRequest)
return True
elif msg.name == consts.Message.DataFound:
if initialRequest is None:
return False
- initialRequest['FcStatus'] |= consts.RequestStatus.Complete
+ initialRequest['FcStatus'] |= consts.RequestStatus.Success
initialRequest['FcMetadataContentType'] = msg.get('Metadata.ContentType', '')
initialRequest['FcDataLength'] = msg.get('DataLength', '')
- if initialRequest['FcSubType'] != consts.RequestSubType.GetData:
-
+
+ # except from GetData all requests are complete here. Next GetData will run through AllData...
+ if initialRequest['FcType'] != consts.RequestType.GetData:
# Fcp removes requests from queue with Persistence.Connection.. so do we
if initialRequest.params.get('Persistence', consts.Persistence.Connection) == consts.Persistence.Connection:
initialRequest['FcStatus'] |= consts.RequestStatus.Removed
+
+ # notify listeners
+ self.events.RequestCompleted(initialRequest)
+ initialRequest['FcStatus'] |= consts.RequestStatus.Completed
+ if initialRequest['FcStatus'] & consts.RequestStatus.Removed:
del self._requests[requestIdentifier]
- self.events.RequestCompleted(initialRequest)
+
return True
@@ -880,12 +898,11 @@
# Fcp removes requests from queue with Persistence.Connection.. so do we
if initialRequest.params.get('Persistence', consts.Persistence.Connection) == consts.Persistence.Connection:
initialRequest['FcStatus'] |= consts.RequestStatus.Removed
- del self._requests[requestIdentifier]
-
+
# check if it is one of our requests for key information
code = msg['Code']
- if code == consts.FetchError.TooBig and initialRequest['FcSubType'] == consts.RequestSubType.GetKeyInfo:
- initialRequest['FcStatus'] |= consts.RequestStatus.Complete
+ if code == consts.FetchError.TooBig and initialRequest['FcType'] == consts.RequestType.GetKeyInfo:
+ initialRequest['FcStatus'] |= consts.RequestStatus.Success
initialRequest['FcMetadataContentType'] = msg.get('ExpectedMetadata.ContentType', '')
initialRequest['FcDataLength'] = msg.get('ExpectedDataLength', -1)
self.events.RequestCompleted(initialRequest)
@@ -893,6 +910,10 @@
initialRequest['FcErrorMessage'] = msg
initialRequest['FcStatus'] |= consts.RequestStatus.Error
self.events.RequestFailed(initialRequest)
+
+ initialRequest['FcStatus'] |= consts.RequestStatus.Completed
+ if initialRequest['FcStatus'] & consts.RequestStatus.Removed:
+ del self._requests[requestIdentifier]
return True
@@ -1004,11 +1025,11 @@
return True
# determine initial message name
- if restoredRequest['FcSubType'] == consts.RequestSubType.Put:
+ if restoredRequest['FcType'] == consts.RequestType.Put:
restoredRequest.name = consts.Message.ClientPut
- elif restoredRequest['FcSubType'] == consts.RequestSubType.PutDiskDir:
+ elif restoredRequest['FcType'] == consts.RequestType.PutDiskDir:
restoredRequest.name = consts.Message.ClientPutDiskDir
- elif restoredRequest['FcSubType'] == consts.RequestSubType.PutComplexDir:
+ elif restoredRequest['FcType'] == consts.RequestType.PutComplexDir:
restoredRequest.name = consts.Message.ClientPutComplexDir
# restore request
@@ -1034,14 +1055,18 @@
return False
initialRequest['FcStatus'] |= consts.RequestStatus.Error
+ initialRequest['FcErrorMessage'] = msg
# Fcp removes requests from queue with Persistence.Connection.. so do we
if initialRequest.params.get('Persistence', consts.Persistence.Connection) == consts.Persistence.Connection:
initialRequest['FcStatus'] |= consts.RequestStatus.Removed
del self._requests[requestIdentifier]
- initialRequest['FcErrorMessage'] = msg
+ # notify listeners
self.events.RequestFailed(initialRequest)
+ initialRequest['FcStatus'] |= consts.RequestStatus.Completed
+ if initialRequest['FcStatus'] & consts.RequestStatus.Removed:
+ del self._requests[requestIdentifier]
return True
@@ -1061,14 +1086,16 @@
# TODO: StartupTime and CompletionTime are passed, but
# as long as no corrosponding params are passed in DataFound
# we ignore them
- initialRequest['FcStatus'] |= consts.RequestStatus.Complete
-
+ initialRequest['FcStatus'] |= consts.RequestStatus.Success
+ initialRequest['URI'] = msg['URI']
if initialRequest.params.get('Persistence', consts.Persistence.Connection) == consts.Persistence.Connection:
initialRequest['FcStatus'] |= consts.RequestStatus.Removed
+
+ # notify listeners
+ self.events.RequestCompleted(initialRequest)
+ initialRequest['FcStatus'] |= consts.RequestStatus.Completed
+ if initialRequest['FcStatus'] & consts.RequestStatus.Removed:
del self._requests[requestIdentifier]
-
- initialRequest['URI'] = msg['URI']
- self.events.RequestCompleted(initialRequest)
return True
@@ -1130,18 +1157,24 @@
if initialRequest is None:
return False
+ initialRequest['FcStatus'] |= consts.RequestStatus.Success | consts.RequestStatus.Removed
+
+ # notify listeners
+ self.events.PluginInfo(msg)
+ initialRequest['FcStatus'] |= consts.RequestStatus.Completed
del self._pluginRequests[requestIdentifier]
- initialRequest['FcStatus'] |= consts.RequestStatus.Completed
- self.events.PluginInfo(msg)
return True
elif msg.name == consts.Message.FCPPluginReply:
if initialRequest is None:
return False
+ initialRequest['FcStatus'] |= consts.RequestStatus.Success | consts.RequestStatus.Removed
+
+ # notify listeners
+ self.events.PluginMessage(msg)
+ initialRequest['FcStatus'] |= consts.RequestStatus.Completed
del self._requests[requestIdentifier]
- initialRequest['FcStatus'] |= consts.RequestStatus.Completed
- self.events.PluginMessage(msg)
return True
####################################################
@@ -1160,27 +1193,29 @@
elif msg.name == consts.Message.SSKKeypair:
- if requestIdentifier not in self._requests:
+ if initialRequest is None:
return False
- del self._requests[requestIdentifier]
#TODO:no idea if the node may pass uris with prefixes like 'freenet:'... strip it anyways
insertURI = self.Uri(msg['InsertURI']).uri
requestURI = self.Uri(msg['RequestURI']).uri
createUSK = True if requestIdentifier.startswith(self.IdentifierPrefixGenerateUSK) else False
if createUSK:
- insertURI = requestURI.replace(consts.KeyType.SSK, consts.KeyType.USK, 1)
+ insertURI = insertURI.replace(consts.KeyType.SSK, consts.KeyType.USK, 1)
requestURI = requestURI.replace(consts.KeyType.SSK, consts.KeyType.USK, 1)
keyType = consts.KeyType.USK
else:
keyType = consts.KeyType.SSK
- msg['InsertURI'] = insertURI
- msg['RequestURI'] = requestURI
- msg['FcKeyType'] = keyType
- msg['FcStatus'] |= consts.RequestStatus.Completed
- self.events.KeypairGenerated(msg)
+ initialRequest['InsertURI'] = insertURI
+ initialRequest['RequestURI'] = requestURI
+ initialRequest['FcKeyType'] = keyType
+ initialRequest['FcStatus'] |= consts.RequestStatus.Success | consts.RequestStatus.Removed
+ self.events.KeypairGenerated(initialRequest)
+
+ initialRequest['FcStatus'] |= consts.RequestStatus.Completed
+ del self._requests[requestIdentifier]
return True
elif msg.name == consts.Message.SubscribedUSKUpdate:
@@ -1233,17 +1268,14 @@
#n += 1
#if n > 50: break
- # check if we have running requests
-
- # assert no requests has completed
- status = consts.RequestStatus.Null
+ # check if we have running requests. Assert False
+ haveRunningRequests = False
for request in self._requests.values():
- tmp_status = request.params.get('FcStatus', consts.RequestStatus.Null)
- if not tmp_status & consts.RequestStatus.MaskProcessed:
- status = consts.RequestStatus.Started
+ if not request.params['FcStatus'] & consts.RequestStatus.Completed:
+ haveRunningRequests = True
break
- if status == consts.RequestStatus.Null:
+ if not haveRunningRequests:
self._log.info(consts.LogMessages.AllRequestsCompleted)
break
@@ -1353,7 +1385,7 @@
):
"""Requests a key from the node
@param uri: (str) uri of the file to request (may contain prefixes like 'freenet:' or 'http://')
- @param messageSubType: (L{consts.RequestSubType}) sub type of the message
+ @param messageSubType: (L{consts.RequestType}) sub type of the message
@param userData: any non persistent data to associate to the request or None
@param persistentUserData: any string to associate to the request as persistent data or None
@param filenameCollision: what to do if the disk target alreaady exists. One of the FilenameCollision.* consts
@@ -1426,7 +1458,7 @@
"""
return self.clientGet(
uri,
- consts.RequestSubType.GetData,
+ consts.RequestType.GetData,
userData,
persistentUserData,
consts.FilenameCollision.HandleNever,
@@ -1495,7 +1527,7 @@
"""
return self.clientGet(
uri,
- consts.RequestSubType.GetFile,
+ consts.RequestType.GetFile,
userData,
persistentUserData,
filenameCollision,
@@ -1556,7 +1588,7 @@
# how to retrieve meta info about a key? ...idea is to provoke a GetFailed (TooBig)
return self.clientGet(
uri,
- consts.RequestSubType.GetKeyInfo,
+ consts.RequestType.GetKeyInfo,
userData,
persistentUserData,
consts.FilenameCollision.HandleNever,
@@ -1648,10 +1680,9 @@
persistentUserData='',
):
""""""
-
return self.clientPut(
consts.KeyType.CHK,
- consts.RequestSubType.Put,
+ consts.RequestType.Put,
userData,
persistentUserData,
data,
@@ -1692,7 +1723,7 @@
):
return self.clientPut(
consts.KeyType.CHK,
- consts.RequestSubType.Put,
+ consts.RequestType.Put,
userData,
persistentUserData,
None,
@@ -1752,8 +1783,44 @@
## USK ClientPut related methods
##
########################################################
- def uskPutData(self):
- pass
+ def uskPutData(self,
+ data,
+ insertURI,
+
+ contentType=None,
+ dontCompress=None,
+ maxRetries=None,
+ persistence=consts.Persistence.Connection,
+ priorityClass=consts.Priority.Medium,
+ targetFilename=None,
+
+ userData=None,
+ persistentUserData=''
+
+
+ ):
+ return self.clientPut(
+ insertURI,
+ #insertURI + 'foo/0/',
+ consts.RequestType.Put,
+ userData,
+ persistentUserData,
+ data,
+
+ # fcp params
+ ContentType=contentType,
+ DataLength=len(data),
+ #EarlyEncode='false',
+ #GetCHKOnly='false',
+ Global=False,
+ Identifier=None,
+ MaxRetries=maxRetries,
+ DontCompress=dontCompress,
+ Persistence=persistence,
+ TargetFilename=targetFilename,
+ UploadFrom=consts.UploadFrom.Direct,
+ Verbosity=consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression,
+ )
def uskPutDir(self):
pass
@@ -1986,6 +2053,7 @@
consts.Message.GetPluginInfo,
FcModified={},
FcStatus=consts.RequestStatus.Pending,
+ FcType=consts.RequestType.PluginInfo,
Identifier=identifier,
PluginName=pluginName,
Detailed=detailed,
@@ -2007,6 +2075,7 @@
consts.Message.GetPluginInfo,
FcModified={},
FcStatus=consts.RequestStatus.Pending,
+ FcType=consts.RequestType.PluginMessage,
Identifier=identifier,
PluginName=pluginName,
**params
@@ -2024,6 +2093,7 @@
## others
##
##########################################################
+ #TODO: kick out request prefix (use FcType instead)
def generateKeypair(self, keypairType=consts.KeyType.SSK):
"""
@param keypairType: type of keypair to generate (either L{consts.KeyType.SSK} or L{consts.KeyType.SSK})
@@ -2040,6 +2110,7 @@
consts.Message.GenerateSSK,
FcModified={},
FcStatus=consts.RequestStatus.Pending,
+ FcType=consts.RequestType.GenerateKeypair,
Identifier=identifier,
)
self._requests[identifier] = msg
@@ -2058,8 +2129,7 @@
nodeHello = c.connect()
if nodeHello is not None:
-
-
+
#for i in xrange(10):
# c.next()
@@ -2088,9 +2158,7 @@
# c.next()
#testGetData()
-
-
-
+
def testGetFile():
filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test.jpg')
print filename
@@ -2152,8 +2220,7 @@
# c.next()
#testChkPutData()
-
-
+
def testChkPutFile():
fpath = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test.jpg')
@@ -2171,7 +2238,30 @@
#testChkPutFile()
+ def testUskPutData():
+ def cb(event, request):
+ insertURI = request['InsertURI']
+ identifier = c.uskPutData(
+ 'foo',
+ insertURI + 'foo/0/',
+ )
+
+ c.events.KeypairGenerated += cb
+ c.generateKeypair(keypairType=consts.KeyType.USK)
+
+ #identifier = c.uskPutData(
+ #'foo1',
+ #'USK@dkbB9DSr6R2WWs0MFsB9BJvN2cRjNxSboanDQNMJVNc,uIi9-1JrCLZ~6MLa8UrxQCMLptu~PzL59hAtorUIStw,AQECAAE/foo/0/',
+ #)
+ c.run()
+
+ #for i in xrange(500):
+ # c.next()
+
+ #testUskPutData()
+
+
def testConfigData():
from fcp2_0_config import Config
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|