SF.net SVN: fclient: [113] trunk/sandbox/fcp
Status: Pre-Alpha
Brought to you by:
jurner
From: <ju...@us...> - 2008-02-02 11:27:18
|
Revision: 113 http://fclient.svn.sourceforge.net/fclient/?rev=113&view=rev Author: jurner Date: 2008-02-02 03:27:23 -0800 (Sat, 02 Feb 2008) Log Message: ----------- ... Added Paths: ----------- trunk/sandbox/fcp/fcp2_0_requests.py Removed Paths: ------------- trunk/sandbox/fcp/fcp_2_0_requests.py Copied: trunk/sandbox/fcp/fcp2_0_requests.py (from rev 112, trunk/sandbox/fcp/fcp_2_0_requests.py) =================================================================== --- trunk/sandbox/fcp/fcp2_0_requests.py (rev 0) +++ trunk/sandbox/fcp/fcp2_0_requests.py 2008-02-02 11:27:23 UTC (rev 113) @@ -0,0 +1,232 @@ +"""fcp request objects""" + +import fcp2_0_consts as consts +#****************************************************************************************************************** +# +#****************************************************************************************************************** +class Upload(object): + """Wrapper class to represent a freenet upload + + @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 + """ + + + 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, + earlyEncode=None, + maxRetries=None, + persistence=consts.Persistence.Connection, + priorityClass=consts.Priority.Medium, + + privateKey=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 + """ + + if keyType not in consts.KeyType.TypesAll: + raise ValueError('Invalid key type: %r' % keyType) + + self.items = [] + self.keyType = keyType + self.params = { + 'DontCompress': dontCompress, + 'EarlyEncode': earlyEncode, + 'MaxRetries': maxRetries, + 'Persistence': persistence, + 'PriorityClass': priorityClass, + } + self.privateKey = privateKey + self._directoryAdded = False + 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: + raise ValueError('A directory has already been added, no other items allowed') + + if itemType == self.ItemTypeDirectory: + 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.iotems.append(params) + + + def addData(self, name, data, contentType=None): + """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) + """ + return self._addItem( + FcItemType=self.ItemTypeData, + FcData=data, + ContentType=contentType, + DataLength=len(data), + Name=name, + UploadFrom=self.UploadFrom.Direct + ) + + + def addDirectory(name, directory, allowUnreadableFiles=False): + """Adds a directory to be uploaded + @param name: target name + @param directory: (abspath) of the directory to be uploaded + + @note: if you add a directory, every attempt to add anything else will fail + """ + return self._addItem( + FcItemType=self.ItemTypeDirectory, + AllowUnreadableFiles=allowUnreadableFiles, + Filename=directory, + Name=name, + ) + + + def addFile(self, name, filename, contentType=None): + """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) + """ + return self._addItem( + FcItemType=self.ItemTypeFile, + ContentType=contentType, + Filename=filename, + Name=name, + UploadFrom=self.UploadFrom.Disk, + ) + + + def addRedirect(self, name, redirect): + """Adds a redirect to be uploaded + @param name: target name + @param redirect: (freenet-key) to redirect to + """ + return self._addItem( + FcItemType=self.ItemTypeRedirect, + ContentType=contentType, + DataLength=len(data), + Name=name, + TargetURI=redirect, + UploadFrom=self.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: (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) + params = self.items[0] + 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) + params = self.items[0] + 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 + + if params['FcItemType'] == self.ItemTypeData: + msg.data = params['FcData'] + + #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.data = '' + defaultName = temParams[0]['Name'] + msg['DefaultName'] = defaultName + params = {'TargetFilename': defaultName} + 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 + continue + + if param == 'ContentType': + param = 'Metadata.ContentType' + param = 'Files.%s.%s' % (k, param) + msg[param] = value + k += 1 + + 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 + Deleted: trunk/sandbox/fcp/fcp_2_0_requests.py =================================================================== --- trunk/sandbox/fcp/fcp_2_0_requests.py 2008-02-02 11:26:43 UTC (rev 112) +++ trunk/sandbox/fcp/fcp_2_0_requests.py 2008-02-02 11:27:23 UTC (rev 113) @@ -1,232 +0,0 @@ -"""fcp request objects""" - -import fcp2_0_consts as consts -#****************************************************************************************************************** -# -#****************************************************************************************************************** -class Upload(object): - """Wrapper class to represent a freenet upload - - @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 - """ - - - 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, - earlyEncode=None, - maxRetries=None, - persistence=consts.Persistence.Connection, - priorityClass=consts.Priority.Medium, - - privateKey=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 - """ - - if keyType not in consts.KeyType.TypesAll: - raise ValueError('Invalid key type: %r' % keyType) - - self.items = [] - self.keyType = keyType - self.params = { - 'DontCompress': dontCompress, - 'EarlyEncode': earlyEncode, - 'MaxRetries': maxRetries, - 'Persistence': persistence, - 'PriorityClass': priorityClass, - } - self.privateKey = privateKey - self._directoryAdded = False - 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: - raise ValueError('A directory has already been added, no other items allowed') - - if itemType == self.ItemTypeDirectory: - 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.iotems.append(params) - - - def addData(self, name, data, contentType=None): - """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) - """ - return self._addItem( - FcItemType=self.ItemTypeData, - FcData=data, - ContentType=contentType, - DataLength=len(data), - Name=name, - UploadFrom=self.UploadFrom.Direct - ) - - - def addDirectory(name, directory, allowUnreadableFiles=False): - """Adds a directory to be uploaded - @param name: target name - @param directory: (abspath) of the directory to be uploaded - - @note: if you add a directory, every attempt to add anything else will fail - """ - return self._addItem( - FcItemType=self.ItemTypeDirectory, - AllowUnreadableFiles=allowUnreadableFiles, - Filename=directory, - Name=name, - ) - - - def addFile(self, name, filename, contentType=None): - """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) - """ - return self._addItem( - FcItemType=self.ItemTypeFile, - ContentType=contentType, - Filename=filename, - Name=name, - UploadFrom=self.UploadFrom.Disk, - ) - - - def addRedirect(self, name, redirect): - """Adds a redirect to be uploaded - @param name: target name - @param redirect: (freenet-key) to redirect to - """ - return self._addItem( - FcItemType=self.ItemTypeRedirect, - ContentType=contentType, - DataLength=len(data), - Name=name, - TargetURI=redirect, - UploadFrom=self.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: (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) - params = self.items[0] - 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) - params = self.items[0] - 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 - - if params['FcItemType'] == self.ItemTypeData: - msg.data = params['FcData'] - - #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.data = '' - defaultName = temParams[0]['Name'] - msg['DefaultName'] = defaultName - params = {'TargetFilename': defaultName} - 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 - continue - - if param == 'ContentType': - param = 'Metadata.ContentType' - param = 'Files.%s.%s' % (k, param) - msg[param] = value - k += 1 - - 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 - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |