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. |