diff --git a/sipsimple/payloads/rcsfthttp.py b/sipsimple/payloads/rcsfthttp.py new file mode 100644 index 00000000..4df228a2 --- /dev/null +++ b/sipsimple/payloads/rcsfthttp.py @@ -0,0 +1,130 @@ + +"""Parses and produces Filetransfer payloads according to RCC.07 """ + + +__all__ = ['namespace', + 'namespace_ext', + 'FTHTTPDocument', + 'FileSize', + 'FileName', + 'ContentType', + 'Data', + 'BrandedUrl', + 'FileHash', + 'FileInfo'] + + +from sipsimple.payloads import XMLDocument, XMLListRootElement, XMLAnyURIElement, XMLStringElement, XMLElementChild, XMLEmptyElement, XMLElement, XMLNonNegativeIntegerElement, XMLAttribute +from sipsimple.payloads.datatypes import DateTime, AnyURI + + +namespace = 'urn:gsma:params:xml:ns:rcs:rcs:fthttp' +namespace_ext = 'urn:gsma:params:xml:ns:rcs:rcs:up:fthttpext' + + +class FTHTTPDocument(XMLDocument): + content_type = "application/vnd.gsma.rcs-ft-http+xml" + + +FTHTTPDocument.register_namespace(namespace, prefix=None, schema='rcs-fthttp.xsd') +FTHTTPDocument.register_namespace(namespace_ext, prefix='x', schema='rcs-fthttd-ext.xsd') + + +# Attribute value types + + +class FileInfoTypeValue(str): + def __new__(cls, value): + if value not in ['file', 'thumbnail']: + raise ValueError("illegal value file info type") + return value + +# Elements + + +class FileSize(XMLNonNegativeIntegerElement): + _xml_tag = 'file-size' + _xml_namespace = namespace + _xml_document = FTHTTPDocument + + +class FileName(XMLStringElement): + _xml_tag = 'file-name' + _xml_namespace = namespace + _xml_document = FTHTTPDocument + + +class ContentType(XMLStringElement): + _xml_tag = 'content-type' + _xml_namespace = namespace + _xml_document = FTHTTPDocument + + +class Data(XMLEmptyElement): + _xml_tag = 'data' + _xml_namespace = namespace + _xml_document = FTHTTPDocument + + url = XMLAttribute('url', type=AnyURI, required=True, test_equal=True) + until = XMLAttribute('until', type=DateTime, required=False, test_equal=True) + + def __init__(self, url=None, until=None): + XMLEmptyElement.__init__(self) + self.url = url + self.until = until + + +class BrandedUrl(XMLAnyURIElement): + _xml_tag = 'branded-url' + _xml_namespace = namespace_ext + _xml_document = FTHTTPDocument + + +class FileHash(XMLStringElement): + _xml_tag = 'file-hash' + _xml_namespace = namespace_ext + _xml_document = FTHTTPDocument + + +class FileInfo(XMLElement): + _xml_tag = 'file-info' + _xml_namespace = namespace + _xml_document = FTHTTPDocument + + type = XMLAttribute('type', type=FileInfoTypeValue, required=True, test_equal=True) + file_disposition = XMLAttribute('file_disposition', type='str', required=False, test_equal=True) + + file_size = XMLElementChild('file_size', type=FileSize, required=True, test_equal=True) + file_name = XMLElementChild('file_name', type=FileName, required=False, test_equal=True) + content_type = XMLElementChild('content_type', type=ContentType, required=True, test_equal=True) + data = XMLElementChild('data', type=Data, required=True, test_equal=True) + branded_url = XMLElementChild('branded_url', type=BrandedUrl, required=False, test_equal=True) + hash = XMLElementChild('hash', type=FileHash, required=False, test_equal=True) + + def __init__(self, type='file', file_disposition=None, file_name=None, file_size=None, content_type=None, data=None, branded_url=None, url=None, until=None, hash=None): + XMLElement.__init__(self) + self.type = type + self.file_disposition = file_disposition + self.file_size = file_size + if type == 'file' and not file_name: + raise ValueError("File name is required for type file") + self.file_name = file_name + self.content_type = content_type + self.data = data + if url: + self.data = Data(url=url, until=until) + self.branded_url = branded_url + self.hash = hash + +# document + + +class FTHTTPMessage(XMLListRootElement): + _xml_tag = 'file' + _xml_namespace = namespace + _xml_document = FTHTTPDocument + _xml_item_type = FileInfo + + def __init__(self, file=[]): + XMLListRootElement.__init__(self) + self.update(file) diff --git a/sipsimple/payloads/xml-schemas/rcs-fthttp-ext.xsd b/sipsimple/payloads/xml-schemas/rcs-fthttp-ext.xsd new file mode 100644 index 00000000..0f5733d8 --- /dev/null +++ b/sipsimple/payloads/xml-schemas/rcs-fthttp-ext.xsd @@ -0,0 +1,6 @@ + + + + + + diff --git a/sipsimple/payloads/xml-schemas/rcs-fthttp.xsd b/sipsimple/payloads/xml-schemas/rcs-fthttp.xsd new file mode 100644 index 00000000..5807d563 --- /dev/null +++ b/sipsimple/payloads/xml-schemas/rcs-fthttp.xsd @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +