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