SF.net SVN: fclient: [139] trunk/sandbox/fcp/fcp2_0_requests.py
Status: Pre-Alpha
Brought to you by:
jurner
|
From: <ju...@us...> - 2008-02-04 11:55:01
|
Revision: 139
http://fclient.svn.sourceforge.net/fclient/?rev=139&view=rev
Author: jurner
Date: 2008-02-04 03:55:00 -0800 (Mon, 04 Feb 2008)
Log Message:
-----------
fixes
Modified Paths:
--------------
trunk/sandbox/fcp/fcp2_0_requests.py
Modified: trunk/sandbox/fcp/fcp2_0_requests.py
===================================================================
--- trunk/sandbox/fcp/fcp2_0_requests.py 2008-02-04 11:53:43 UTC (rev 138)
+++ trunk/sandbox/fcp/fcp2_0_requests.py 2008-02-04 11:55:00 UTC (rev 139)
@@ -7,6 +7,13 @@
class Upload(object):
"""Wrapper class to represent a freenet upload
+ @ivar directoryAdded: (bool) True if the upload contains a directory, False otherwise
+ @ivar items: (list) of dicts containing paramaters for each upload
+ @ivar keyType: L{consts.KeyType} the type of key to upload
+ @ivar params: (dict) request parameters
+ @ivar privateKey: (str) private keey (required for SSK or USK uploads)
+ @ivar targetNames: (list) of names already in use (for multi-uploads)
+
@note: you can upload one or more items of any kind (data, files, redirects), except from directories
wich have to be the only item to upload
"""
@@ -39,10 +46,14 @@
@param privateKey: (str) privateKey if keyType is SSK or USK
"""
-
if keyType not in consts.KeyType.TypesAll:
raise ValueError('Invalid key type: %r' % keyType)
-
+ if keyType in (consts.KeyType.SSK, consts.KeyType.USK) and privateKey is None:
+ raise ValueError('For %s a public key is required' % keyType)
+ elif keyType in (consts.KeyType.CHK, consts.KeyType.KSK) and privateKey is not None:
+ raise ValueError('For %s no public key is required' % keyType)
+
+ self.directoryAdded = False
self.items = []
self.keyType = keyType
self.params = {
@@ -53,27 +64,26 @@
'PriorityClass': priorityClass,
}
self.privateKey = privateKey
- self._directoryAdded = False
- self._targetNames = [] # record to check if names are unique (assert order is arbitrary)
+ self.targetNames = [] # record to check if names are unique (assert order is arbitrary)
def _addItem(self, **params):
"""Private method to add an upload item"""
- if self._directoryAdded:
+ if self.directoryAdded:
raise ValueError('A directory has already been added, no other items allowed')
- if itemType == self.ItemTypeDirectory:
- if self._directoryAdded:
+ if params['FcItemType'] == self.ItemTypeDirectory:
+ if self.directoryAdded:
raise ValueError('An item has already been added, no additional directory allowed')
else:
- self._directoryAdded = True
+ self.directoryAdded = True
name = params['Name']
- if name in self._targetNames:
+ if name in self.targetNames:
raise ValueError('Target name already exists: %r' % name)
self.targetNames.append(name)
- self.iotems.append(params)
+ self.items.append(params)
def addData(self, name, data, contentType=None):
@@ -88,14 +98,15 @@
ContentType=contentType,
DataLength=len(data),
Name=name,
- UploadFrom=self.UploadFrom.Direct
+ UploadFrom=consts.UploadFrom.Direct
)
- def addDirectory(name, directory, allowUnreadableFiles=False):
+ def addDirectory(name, directory, allowUnreadableFiles=False, defaultName=None):
"""Adds a directory to be uploaded
@param name: target name
@param directory: (abspath) of the directory to be uploaded
+ @param defaultName: (for SSKs and USKs, the file to display when the key is requested)
@note: if you add a directory, every attempt to add anything else will fail
"""
@@ -103,7 +114,8 @@
FcItemType=self.ItemTypeDirectory,
AllowUnreadableFiles=allowUnreadableFiles,
Filename=directory,
- Name=name,
+ Name=name,
+ DefaultName=defaultName,
)
@@ -118,7 +130,7 @@
ContentType=contentType,
Filename=filename,
Name=name,
- UploadFrom=self.UploadFrom.Disk,
+ UploadFrom=consts.UploadFrom.Disk,
)
@@ -133,7 +145,7 @@
DataLength=len(data),
Name=name,
TargetURI=redirect,
- UploadFrom=self.UploadFrom.Redirect
+ UploadFrom=consts.UploadFrom.Redirect
)
@@ -142,91 +154,88 @@
@param messageClass: (L{fcp2_0_message.Message}) class to fill in
@return: (L{fcp2_0_message.Message}) instance
"""
- if self.keyType in (consts.KeyType.SSK, consts.KeyType.USK) and self.privateKey is None:
- raise ValueError('For %s a public key is required' % self.keyType)
- elif self.keyType in (consts.KeyType.CHK, consts.KeyType.KSK) and self.privateKey is not None:
- raise ValueError('For %s no public key is required' % self.keyType)
-
-
n = len(self.items)
if n == 0:
return None
- elif n == 1 and self.itemTypes[0] == self.ItemTypeDirectory:
- msg = messageClass(messageClass.MessageClientPutDiskDir, **self.params)
+ elif n == 1 and self.items[0]['FcItemType'] == self.ItemTypeDirectory:
+ msg = messageClass(consts.Message.ClientPutDiskDir)
params = self.items[0]
+ targetName = params.pop('Name')
for param, value in params.items():
if value is None:
continue
if param.startswith(self.ReservedParamPrefix):
continue
-
- if param == 'Name':
- param = 'TargetFilename'
- elif param == 'ContentType':
- param = 'Metadata.ContentType'
msg[param] = value
elif n == 1:
- msg = messageClass(messageClass.MessageClientPut, **self.params)
+ msg = messageClass(consts.Message.ClientPut)
params = self.items[0]
+ targetFilename = params.pop('Name')
for param, value in params.items():
if value is None:
continue
if param.startswith(self.ReservedParamPrefix):
continue
- if param == 'Name':
- param = 'TargetFilename'
- elif param == 'ContentType':
+ if param == 'ContentType':
param = 'Metadata.ContentType'
msg[param] = value
- if params['FcItemType'] == self.ItemTypeData:
- msg.data = params['FcData']
+ if params['FcItemType'] == self.ItemTypeData:
+ msg.data = params['FcData']
+ if self.keyType == consts.Keytype.CHK:
+ msg['TargetFilename'] = targetFilename
+
#TODO: USK@s allowed for complex dirs?
else:
#NOTE: for simplicity we take the first item as default item and its name
# as TargetName if that causes any problems, pass it twice
- msg = messageClass(messageClass.MessageClientPutComplexDir, **self.params)
+ msg = messageClass(consts.Message.ClientPutComplexDir)
msg.data = ''
- defaultName = temParams[0]['Name']
- msg['DefaultName'] = defaultName
- params = {'TargetFilename': defaultName}
+ header = self.items.pop(0)
+ targetFilename = header['Name']
+ msg['DefaultName'] = self.items[0]['Name']
+ k = 0
for itemParams in self.items:
- k = 0
for param, value in itemParams.items():
if value is None:
continue
if param.startswith(self.ReservedParamPrefix):
if param == 'FcData':
- msg.data += data
+ msg.data += value
continue
if param == 'ContentType':
param = 'Metadata.ContentType'
param = 'Files.%s.%s' % (k, param)
msg[param] = value
- k += 1
+ k += 1
- if not msg.data:
- msg.data = None
+ if not msg.data:
+ msg.data = None
- # set some defaults
- msg['Global'] = consts.FcpFalse
- msg['Verbosity'] = consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression
- # compose URI
- if self.KeyType == consts.KeyType.CHK:
- msg['URI'] == consts.KeyType.CHK
- elif self.KeyType == consts.KeyType.KSK:
- msg['URI'] == consts.KeyType.KSK + '/' + params.pop('TargetFilename')
- elif self.KeyType == consts.KeyType.SSK:
- msg['URI'] == consts.KeyType.SSK + self.privateKey + '/' + params.pop('TargetFilename')
- elif self.KeyType == consts.KeyType.USK:
- msg['URI'] == consts.KeyType.USH + self.privateKey + '/' + params.pop('TargetFilename')
-
- return msg
+ # determine Uri
+ if self.keyType == consts.KeyType.CHK:
+ msg['URI'] = consts.KeyType.CHK
+ elif self.keyType == consts.KeyType.KSK:
+ msg['URI'] = consts.KeyType.KSK + '/' + targetFilename
+ elif self.keyType == consts.KeyType.SSK:
+ msg['URI'] = self.privateKey + targetFilename
+ elif self.keyType == consts.KeyType.USK:
+ msg['URI'] = self.privateKey + targetFilename
+
+ # set params and some defaults
+ msg['Global'] = False
+ msg['Verbosity'] = consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression
+ for param, value in self.params.items():
+ if value is None:
+ continue
+ msg[param] = value
+
+ return msg
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|