Thread: 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.
|
|
From: <ju...@us...> - 2008-02-07 23:49:39
|
Revision: 171
http://fclient.svn.sourceforge.net/fclient/?rev=171&view=rev
Author: jurner
Date: 2008-02-07 15:49:44 -0800 (Thu, 07 Feb 2008)
Log Message:
-----------
some 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-07 23:49:12 UTC (rev 170)
+++ trunk/sandbox/fcp/fcp2_0_requests.py 2008-02-07 23:49:44 UTC (rev 171)
@@ -185,7 +185,7 @@
if params['FcItemType'] == self.ItemTypeData:
msg.data = params['FcData']
- if self.keyType == consts.Keytype.CHK:
+ if self.keyType == consts.KeyType.CHK:
msg['TargetFilename'] = targetFilename
@@ -217,13 +217,12 @@
if not msg.data:
msg.data = None
-
-
+
# 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
+ msg['URI'] = consts.KeyType.KSK + targetFilename
elif self.keyType == consts.KeyType.SSK:
msg['URI'] = self.privateKey + targetFilename
elif self.keyType == consts.KeyType.USK:
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-16 10:07:49
|
Revision: 216
http://fclient.svn.sourceforge.net/fclient/?rev=216&view=rev
Author: jurner
Date: 2008-02-16 02:07:55 -0800 (Sat, 16 Feb 2008)
Log Message:
-----------
worked a bit on uploads. Still a sketch
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-16 10:07:11 UTC (rev 215)
+++ trunk/sandbox/fcp/fcp2_0_requests.py 2008-02-16 10:07:55 UTC (rev 216)
@@ -4,28 +4,29 @@
#******************************************************************************************************************
#
#******************************************************************************************************************
+#TODO: if only one item is added its name is ignored so far. How to handle self.targetName vs. item['Name']
+#TODO: Metadata.ContentType vs. ContentType is pretty inconsistent
class Upload(object):
- """Wrapper class to represent a freenet upload
+ """Wrapper class to manage a freenet uploads
+ @ivar defaultItem: (int) for directories or multiple uploads the name of this item is used as
+ default item when a page is displayed
@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 targetName: (str) for CHKs the name to be appended to the CHK. For SSKs and USKs the
+ (target-name/version) part of the key
@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
"""
+ PrivateParamNames = ('Data', 'RequestType', 'Name')
- ReservedParamPrefix = 'Fc' # params prefixed with this are skipped when generating the message
- ItemTypeData = 0
- ItemTypeDirectory = 1
- ItemTypeFile = 2
- ItemTypeRedirect = 3
-
def __init__(self,
keyType,
dontCompress=None,
@@ -35,6 +36,7 @@
priorityClass=consts.Priority.Medium,
privateKey=None,
+ targetName=None,
):
"""
@param keyType: (L{consts.KeyType}) the desired key type to upload
@@ -45,14 +47,19 @@
@param priorityClass:
@param privateKey: (str) privateKey if keyType is SSK or USK
+ @param targetName:
"""
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)
+ if keyType in (consts.KeyType.SSK, consts.KeyType.USK) :
+ if privateKey is None:
+ raise ValueError('For %s a public key is required' % keyType)
+ if not targetName:
+ raise ValueError('For %s a target name 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.defaultItem = 0
self.directoryAdded = False
self.items = []
self.keyType = keyType
@@ -64,15 +71,16 @@
'PriorityClass': priorityClass,
}
self.privateKey = privateKey
+ self.targetName = targetName
self.targetNames = [] # record to check if names are unique (assert order is arbitrary)
- def _addItem(self, **params):
+ def _addItem(self, isDefault=False, **params):
"""Private method to add an upload item"""
if self.directoryAdded:
raise ValueError('A directory has already been added, no other items allowed')
- if params['FcItemType'] == self.ItemTypeDirectory:
+ if params['RequestType'] == self.RequestTypeDirectory:
if self.directoryAdded:
raise ValueError('An item has already been added, no additional directory allowed')
else:
@@ -85,16 +93,22 @@
self.targetNames.append(name)
self.items.append(params)
+ if isDefault:
+ self.defaultItem =len(self.items) -1
+
- def addData(self, name, data, contentType=None):
+ def addData(self, name, data, contentType=None, isDefault=False):
"""Adds data to be uploaded
@param name: target name
@param data: (str) data to upload
@param contentType: (str) content type of the data (if desired)
+ @param isDefault: (bool) if True, the item is the default item
"""
return self._addItem(
- FcItemType=self.ItemTypeData,
- FcData=data,
+ isDefault=isDefault,
+
+ RequestType=consts.RequestType.PutData,
+ Data=data,
ContentType=contentType,
DataLength=len(data),
Name=name,
@@ -111,7 +125,7 @@
@note: if you add a directory, every attempt to add anything else will fail
"""
return self._addItem(
- FcItemType=self.ItemTypeDirectory,
+ RequestType=consts.RequestType.PutDir,
AllowUnreadableFiles=allowUnreadableFiles,
Filename=directory,
Name=name,
@@ -119,28 +133,34 @@
)
- def addFile(self, name, filename, contentType=None):
+ def addFile(self, name, filename, contentType=None, isDefault=False):
"""Adds a file to be uploaded
@param name: target name
@param filename: (abspath) of the file to be uploaded
@param contentType: (str) content type of the file (if desired)
+ @param isDefault: (bool) if True, the item is the default item
"""
return self._addItem(
- FcItemType=self.ItemTypeFile,
+ isDefault=isDefault,
+
+ RequestType=sconsts.RequestType.PutFile,
ContentType=contentType,
Filename=filename,
Name=name,
UploadFrom=consts.UploadFrom.Disk,
)
-
- def addRedirect(self, name, redirect):
+ #TODO: isDefault for redirects???
+ def addRedirect(self, name, redirect, isDefault=False):
"""Adds a redirect to be uploaded
@param name: target name
@param redirect: (freenet-key) to redirect to
+ @param isDefault: (bool) if True, the item is the default item
"""
return self._addItem(
- FcItemType=self.ItemTypeRedirect,
+ isDefault=isDefault,
+
+ RequestType=consts.RequestType.PutRedirect,
ContentType=contentType,
DataLength=len(data),
Name=name,
@@ -152,81 +172,80 @@
def getMessage(self, messageClass):
"""Returns the message for the request, ready to send the request to the node
@param messageClass: (L{fcp2_0_message.Message}) class to fill in
- @return: (L{fcp2_0_message.Message}) instance
+ @return: (tuple) (L{consts.RequestType}, L{fcp2_0_message.Message}) or (None, None)
+ if ther is nothing to upload
"""
n = len(self.items)
if n == 0:
- return None
+ return None, None
- 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
- msg[param] = value
+ elif n == 1:
+ requestType = self.items[0]['RequestType']
- elif n == 1:
- 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 requestType == consts.RequestType.PutDir:
+ msg = messageClass(consts.Message.ClientPutDiskDir)
+ params = self.items[0]
+ for param, value in params.items():
+ if value is None or param in PrivateParamNames:
+ continue
+ msg[param] = value
+
+ item = self.items[self.defaultItem]
+ msg['DefaultName'] = item['Name']
+
+ else:
+ msg = messageClass(consts.Message.ClientPut)
+ for param, value in params.items():
+ if value is None or param in PrivateParamNames:
+ continue
+ if param == 'ContentType':
+ param = 'Metadata.ContentType'
+ msg[param] = value
+
+ if params['RequestType'] == self.RequestTypeData:
+ msg.data = params['Data']
- if param == 'ContentType':
- param = 'Metadata.ContentType'
- msg[param] = value
-
- 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
+ requestType = consts.PutMultipole
msg = messageClass(consts.Message.ClientPutComplexDir)
- msg.data = ''
- header = self.items.pop(0)
- targetFilename = header['Name']
- msg['DefaultName'] = self.items[0]['Name']
- k = 0
- for itemParams in self.items:
+ data = None
+ for n, itemParams in enumerate(self.items):
for param, value in itemParams.items():
- if value is None:
+ if param == 'Data':
+ if data is None:
+ data = ''
+ data += value
continue
- if param.startswith(self.ReservedParamPrefix):
- if param == 'FcData':
- msg.data += value
+
+ if param == 'Name':
+ param = 'Files.%s.%s' % (n, param)
+ msg[param] = value
continue
-
+
+ if value is None or param in PrivateParamNames:
+ continue
+
if param == 'ContentType':
param = 'Metadata.ContentType'
- param = 'Files.%s.%s' % (k, param)
+ param = 'Files.%s.%s' % (n, param)
msg[param] = value
- k += 1
+
+ item = self.items[self.defaultItem]
+ msg['DefaultName'] = item['Name']
+ if data is not None:
+ msg.data = data
- if not msg.data:
- msg.data = None
-
# determine Uri
if self.keyType == consts.KeyType.CHK:
msg['URI'] = consts.KeyType.CHK
+ if self.targetName:
+ msg['TargetFilename'] = self.targetName
elif self.keyType == consts.KeyType.KSK:
- msg['URI'] = consts.KeyType.KSK + targetFilename
+ msg['URI'] = consts.KeyType.KSK + self.targetName
elif self.keyType == consts.KeyType.SSK:
- msg['URI'] = self.privateKey + targetFilename
+ msg['URI'] = self.privateKey + self.targetName
elif self.keyType == consts.KeyType.USK:
- msg['URI'] = self.privateKey + targetFilename
+ msg['URI'] = self.privateKey + self.targetName
# set params and some defaults
msg['Global'] = False
@@ -236,5 +255,5 @@
continue
msg[param] = value
- return msg
+ return requestType, msg
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-24 11:50:40
|
Revision: 246
http://fclient.svn.sourceforge.net/fclient/?rev=246&view=rev
Author: jurner
Date: 2008-02-24 03:50:43 -0800 (Sun, 24 Feb 2008)
Log Message:
-----------
del
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-24 11:50:25 UTC (rev 245)
+++ trunk/sandbox/fcp/fcp2_0_requests.py 2008-02-24 11:50:43 UTC (rev 246)
@@ -22,6 +22,7 @@
@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
+ @note: if you want to upload a single redirect keyType has to be set to L{consts.KeyType.KSK}
"""
PrivateParamNames = ('Data', 'RequestType', 'Name')
@@ -80,7 +81,7 @@
if self.directoryAdded:
raise ValueError('A directory has already been added, no other items allowed')
- if params['RequestType'] == self.RequestTypeDirectory:
+ if params['RequestType'] == consts.RequestType.PutDir:
if self.directoryAdded:
raise ValueError('An item has already been added, no additional directory allowed')
else:
@@ -116,7 +117,7 @@
)
- def addDirectory(name, directory, allowUnreadableFiles=False, defaultName=None):
+ def addDirectory(self, 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
@@ -143,14 +144,14 @@
return self._addItem(
isDefault=isDefault,
- RequestType=sconsts.RequestType.PutFile,
+ RequestType=consts.RequestType.PutFile,
ContentType=contentType,
Filename=filename,
Name=name,
UploadFrom=consts.UploadFrom.Disk,
)
- #TODO: isDefault for redirects???
+
def addRedirect(self, name, redirect, isDefault=False):
"""Adds a redirect to be uploaded
@param name: target name
@@ -161,8 +162,6 @@
isDefault=isDefault,
RequestType=consts.RequestType.PutRedirect,
- ContentType=contentType,
- DataLength=len(data),
Name=name,
TargetURI=redirect,
UploadFrom=consts.UploadFrom.Redirect
@@ -186,7 +185,7 @@
msg = messageClass(consts.Message.ClientPutDiskDir)
params = self.items[0]
for param, value in params.items():
- if value is None or param in PrivateParamNames:
+ if value is None or param in self.PrivateParamNames:
continue
msg[param] = value
@@ -195,18 +194,23 @@
else:
msg = messageClass(consts.Message.ClientPut)
- for param, value in params.items():
- if value is None or param in PrivateParamNames:
+ item = self.items[0]
+ for param, value in item.items():
+ if value is None or param in self.PrivateParamNames:
continue
if param == 'ContentType':
param = 'Metadata.ContentType'
msg[param] = value
- if params['RequestType'] == self.RequestTypeData:
- msg.data = params['Data']
+ # handle some specilal cases
+ if requestType == consts.RequestType.PutData:
+ msg.data = item['Data']
+ elif requestType == consts.RequestType.PutRedirect:
+ if self.keyType != consts.KeyType.KSK:
+ raise ValueError('For redirects keyType must be %s' % consts.KeyType.KSK)
else:
- requestType = consts.PutMultipole
+ requestType = consts.RequestType.PutMultiple
msg = messageClass(consts.Message.ClientPutComplexDir)
data = None
for n, itemParams in enumerate(self.items):
@@ -222,7 +226,7 @@
msg[param] = value
continue
- if value is None or param in PrivateParamNames:
+ if value is None or param in self.PrivateParamNames:
continue
if param == 'ContentType':
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-24 11:52:31
|
Revision: 247
http://fclient.svn.sourceforge.net/fclient/?rev=247&view=rev
Author: jurner
Date: 2008-02-24 03:52:23 -0800 (Sun, 24 Feb 2008)
Log Message:
-----------
too much trouble, split requests up into client methods. Del module.
Removed Paths:
-------------
trunk/sandbox/fcp/fcp2_0_requests.py
Deleted: trunk/sandbox/fcp/fcp2_0_requests.py
===================================================================
--- trunk/sandbox/fcp/fcp2_0_requests.py 2008-02-24 11:50:43 UTC (rev 246)
+++ trunk/sandbox/fcp/fcp2_0_requests.py 2008-02-24 11:52:23 UTC (rev 247)
@@ -1,263 +0,0 @@
-"""fcp request objects"""
-
-import fcp2_0_consts as consts
-#******************************************************************************************************************
-#
-#******************************************************************************************************************
-#TODO: if only one item is added its name is ignored so far. How to handle self.targetName vs. item['Name']
-#TODO: Metadata.ContentType vs. ContentType is pretty inconsistent
-class Upload(object):
- """Wrapper class to manage a freenet uploads
-
- @ivar defaultItem: (int) for directories or multiple uploads the name of this item is used as
- default item when a page is displayed
- @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 targetName: (str) for CHKs the name to be appended to the CHK. For SSKs and USKs the
- (target-name/version) part of the key
- @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
- @note: if you want to upload a single redirect keyType has to be set to L{consts.KeyType.KSK}
- """
-
- PrivateParamNames = ('Data', 'RequestType', 'Name')
-
-
- def __init__(self,
- keyType,
- dontCompress=None,
- earlyEncode=None,
- maxRetries=None,
- persistence=consts.Persistence.Connection,
- priorityClass=consts.Priority.Medium,
-
- privateKey=None,
- targetName=None,
- ):
- """
- @param keyType: (L{consts.KeyType}) the desired key type to upload
- @param dontCompress:
- @param earlyEncode:
- @param maxRetries:
- @param persistence:
- @param priorityClass:
-
- @param privateKey: (str) privateKey if keyType is SSK or USK
- @param targetName:
- """
- if keyType not in consts.KeyType.TypesAll:
- raise ValueError('Invalid key type: %r' % keyType)
- if keyType in (consts.KeyType.SSK, consts.KeyType.USK) :
- if privateKey is None:
- raise ValueError('For %s a public key is required' % keyType)
- if not targetName:
- raise ValueError('For %s a target name 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.defaultItem = 0
- self.directoryAdded = False
- self.items = []
- self.keyType = keyType
- self.params = {
- 'DontCompress': dontCompress,
- 'EarlyEncode': earlyEncode,
- 'MaxRetries': maxRetries,
- 'Persistence': persistence,
- 'PriorityClass': priorityClass,
- }
- self.privateKey = privateKey
- self.targetName = targetName
- self.targetNames = [] # record to check if names are unique (assert order is arbitrary)
-
-
- def _addItem(self, isDefault=False, **params):
- """Private method to add an upload item"""
- if self.directoryAdded:
- raise ValueError('A directory has already been added, no other items allowed')
-
- if params['RequestType'] == consts.RequestType.PutDir:
- if self.directoryAdded:
- raise ValueError('An item has already been added, no additional directory allowed')
- else:
- self.directoryAdded = True
-
- name = params['Name']
- if name in self.targetNames:
- raise ValueError('Target name already exists: %r' % name)
-
- self.targetNames.append(name)
- self.items.append(params)
-
- if isDefault:
- self.defaultItem =len(self.items) -1
-
-
- def addData(self, name, data, contentType=None, isDefault=False):
- """Adds data to be uploaded
- @param name: target name
- @param data: (str) data to upload
- @param contentType: (str) content type of the data (if desired)
- @param isDefault: (bool) if True, the item is the default item
- """
- return self._addItem(
- isDefault=isDefault,
-
- RequestType=consts.RequestType.PutData,
- Data=data,
- ContentType=contentType,
- DataLength=len(data),
- Name=name,
- UploadFrom=consts.UploadFrom.Direct
- )
-
-
- def addDirectory(self, 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
- """
- return self._addItem(
- RequestType=consts.RequestType.PutDir,
- AllowUnreadableFiles=allowUnreadableFiles,
- Filename=directory,
- Name=name,
- DefaultName=defaultName,
- )
-
-
- def addFile(self, name, filename, contentType=None, isDefault=False):
- """Adds a file to be uploaded
- @param name: target name
- @param filename: (abspath) of the file to be uploaded
- @param contentType: (str) content type of the file (if desired)
- @param isDefault: (bool) if True, the item is the default item
- """
- return self._addItem(
- isDefault=isDefault,
-
- RequestType=consts.RequestType.PutFile,
- ContentType=contentType,
- Filename=filename,
- Name=name,
- UploadFrom=consts.UploadFrom.Disk,
- )
-
-
- def addRedirect(self, name, redirect, isDefault=False):
- """Adds a redirect to be uploaded
- @param name: target name
- @param redirect: (freenet-key) to redirect to
- @param isDefault: (bool) if True, the item is the default item
- """
- return self._addItem(
- isDefault=isDefault,
-
- RequestType=consts.RequestType.PutRedirect,
- Name=name,
- TargetURI=redirect,
- UploadFrom=consts.UploadFrom.Redirect
- )
-
-
- def getMessage(self, messageClass):
- """Returns the message for the request, ready to send the request to the node
- @param messageClass: (L{fcp2_0_message.Message}) class to fill in
- @return: (tuple) (L{consts.RequestType}, L{fcp2_0_message.Message}) or (None, None)
- if ther is nothing to upload
- """
- n = len(self.items)
- if n == 0:
- return None, None
-
- elif n == 1:
- requestType = self.items[0]['RequestType']
-
- if requestType == consts.RequestType.PutDir:
- msg = messageClass(consts.Message.ClientPutDiskDir)
- params = self.items[0]
- for param, value in params.items():
- if value is None or param in self.PrivateParamNames:
- continue
- msg[param] = value
-
- item = self.items[self.defaultItem]
- msg['DefaultName'] = item['Name']
-
- else:
- msg = messageClass(consts.Message.ClientPut)
- item = self.items[0]
- for param, value in item.items():
- if value is None or param in self.PrivateParamNames:
- continue
- if param == 'ContentType':
- param = 'Metadata.ContentType'
- msg[param] = value
-
- # handle some specilal cases
- if requestType == consts.RequestType.PutData:
- msg.data = item['Data']
- elif requestType == consts.RequestType.PutRedirect:
- if self.keyType != consts.KeyType.KSK:
- raise ValueError('For redirects keyType must be %s' % consts.KeyType.KSK)
-
- else:
- requestType = consts.RequestType.PutMultiple
- msg = messageClass(consts.Message.ClientPutComplexDir)
- data = None
- for n, itemParams in enumerate(self.items):
- for param, value in itemParams.items():
- if param == 'Data':
- if data is None:
- data = ''
- data += value
- continue
-
- if param == 'Name':
- param = 'Files.%s.%s' % (n, param)
- msg[param] = value
- continue
-
- if value is None or param in self.PrivateParamNames:
- continue
-
- if param == 'ContentType':
- param = 'Metadata.ContentType'
- param = 'Files.%s.%s' % (n, param)
- msg[param] = value
-
- item = self.items[self.defaultItem]
- msg['DefaultName'] = item['Name']
- if data is not None:
- msg.data = data
-
- # determine Uri
- if self.keyType == consts.KeyType.CHK:
- msg['URI'] = consts.KeyType.CHK
- if self.targetName:
- msg['TargetFilename'] = self.targetName
- elif self.keyType == consts.KeyType.KSK:
- msg['URI'] = consts.KeyType.KSK + self.targetName
- elif self.keyType == consts.KeyType.SSK:
- msg['URI'] = self.privateKey + self.targetName
- elif self.keyType == consts.KeyType.USK:
- msg['URI'] = self.privateKey + self.targetName
-
- # 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 requestType, msg
-
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|