Mercurial > libervia-backend
annotate libervia/cli/xml_tools.py @ 4118:07370d2a9bde
plugin XEP-0167: keep media order when starting a call:
media content order is relevant when building Jingle contents/SDP notably for bundling.
This patch fixes the previous behaviour of always using the same order by keeping the
order of the data (i.e. order of original SDP offer). Previous behaviour could lead to
call failure.
rel 424
author | Goffi <goffi@goffi.org> |
---|---|
date | Tue, 03 Oct 2023 15:15:24 +0200 |
parents | 47401850dec6 |
children | 0d7bb4df2343 |
rev | line source |
---|---|
3137 | 1 #!/usr/bin/env python3 |
2 | |
2777 | 3 |
4075
47401850dec6
refactoring: rename `libervia.frontends.jp` to `libervia.cli`
Goffi <goffi@goffi.org>
parents:
4074
diff
changeset
|
4 # Libervia CLI |
3479 | 5 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org) |
2777 | 6 |
7 # This program is free software: you can redistribute it and/or modify | |
8 # it under the terms of the GNU Affero General Public License as published by | |
9 # the Free Software Foundation, either version 3 of the License, or | |
10 # (at your option) any later version. | |
11 | |
12 # This program is distributed in the hope that it will be useful, | |
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 # GNU Affero General Public License for more details. | |
16 | |
17 # You should have received a copy of the GNU Affero General Public License | |
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 | |
4071
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
20 from libervia.backend.core.i18n import _ |
4075
47401850dec6
refactoring: rename `libervia.frontends.jp` to `libervia.cli`
Goffi <goffi@goffi.org>
parents:
4074
diff
changeset
|
21 from libervia.cli.constants import Const as C |
2777 | 22 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
23 def etree_parse(cmd, raw_xml, reraise=False): |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
24 """import lxml and parse raw XML |
2777 | 25 |
26 @param cmd(CommandBase): current command instance | |
27 @param raw_xml(file, str): an XML bytestring, string or file-like object | |
2804
710de41da2f2
jp (pubsub/node): new "import" command, to publish many nodes from an XML file
Goffi <goffi@goffi.org>
parents:
2777
diff
changeset
|
28 @param reraise(bool): if True, re raise exception on parse error instead of doing a |
710de41da2f2
jp (pubsub/node): new "import" command, to publish many nodes from an XML file
Goffi <goffi@goffi.org>
parents:
2777
diff
changeset
|
29 parser.error (which terminate the execution) |
2777 | 30 @return (tuple(etree.Element, module): parsed element, etree module |
31 """ | |
32 try: | |
33 from lxml import etree | |
34 except ImportError: | |
35 cmd.disp( | |
3028 | 36 'lxml module must be installed, please install it with "pip install lxml"', |
2777 | 37 error=True, |
38 ) | |
39 cmd.host.quit(C.EXIT_ERROR) | |
40 try: | |
3028 | 41 if isinstance(raw_xml, str): |
2777 | 42 parser = etree.XMLParser(remove_blank_text=True) |
43 element = etree.fromstring(raw_xml, parser) | |
44 else: | |
45 element = etree.parse(raw_xml).getroot() | |
46 except Exception as e: | |
2804
710de41da2f2
jp (pubsub/node): new "import" command, to publish many nodes from an XML file
Goffi <goffi@goffi.org>
parents:
2777
diff
changeset
|
47 if reraise: |
710de41da2f2
jp (pubsub/node): new "import" command, to publish many nodes from an XML file
Goffi <goffi@goffi.org>
parents:
2777
diff
changeset
|
48 raise e |
2777 | 49 cmd.parser.error( |
3028 | 50 _("Can't parse the payload XML in input: {msg}").format(msg=e) |
2777 | 51 ) |
52 return element, etree | |
53 | |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
54 def get_payload(cmd, element): |
2777 | 55 """Retrieve payload element and exit with and error if not found |
56 | |
57 @param element(etree.Element): root element | |
58 @return element(etree.Element): payload element | |
59 """ | |
60 if element.tag in ("item", "{http://jabber.org/protocol/pubsub}item"): | |
61 if len(element) > 1: | |
3028 | 62 cmd.disp(_("<item> can only have one child element (the payload)"), |
2777 | 63 error=True) |
64 cmd.host.quit(C.EXIT_DATA_ERROR) | |
65 element = element[0] | |
66 return element |