1# -------------------------------------------------------------------------
2# Copyright (c) Microsoft Corporation. All rights reserved.
3# Licensed under the MIT License. See License.txt in the project root for
4# license information.
5# --------------------------------------------------------------------------
6import sys
7
8if sys.version_info >= (3,):
9    from io import BytesIO
10else:
11    try:
12        from cStringIO import StringIO as BytesIO
13    except:
14        from StringIO import StringIO as BytesIO
15
16try:
17    from xml.etree import cElementTree as ETree
18except ImportError:
19    from xml.etree import ElementTree as ETree
20
21from ..common._common_conversion import (
22    _str,
23)
24from ._encryption import (
25    _encrypt_queue_message,
26)
27
28
29def _get_path(queue_name=None, include_messages=None, message_id=None):
30    '''
31    Creates the path to access a queue resource.
32
33    queue_name:
34        Name of queue.
35    include_messages:
36        Whether or not to include messages.
37    message_id:
38        Message id.
39    '''
40    if queue_name and include_messages and message_id:
41        return '/{0}/messages/{1}'.format(_str(queue_name), message_id)
42    if queue_name and include_messages:
43        return '/{0}/messages'.format(_str(queue_name))
44    elif queue_name:
45        return '/{0}'.format(_str(queue_name))
46    else:
47        return '/'
48
49
50def _convert_queue_message_xml(message_text, encode_function, key_encryption_key):
51    '''
52    <?xml version="1.0" encoding="utf-8"?>
53    <QueueMessage>
54        <MessageText></MessageText>
55    </QueueMessage>
56    '''
57    queue_message_element = ETree.Element('QueueMessage')
58
59    # Enabled
60    message_text = encode_function(message_text)
61    if key_encryption_key is not None:
62        message_text = _encrypt_queue_message(message_text, key_encryption_key)
63    ETree.SubElement(queue_message_element, 'MessageText').text = message_text
64
65    # Add xml declaration and serialize
66    try:
67        stream = BytesIO()
68        ETree.ElementTree(queue_message_element).write(stream, xml_declaration=True, encoding='utf-8', method='xml')
69        output = stream.getvalue()
70    finally:
71        stream.close()
72
73    return output
74