| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  | # -*- Mode: Python -*- | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-15 08:33:30 -04:00
										 |  |  | # GDBus - GLib D-Bus Library | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Copyright (C) 2008-2011 Red Hat, Inc. | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2024-04-17 15:31:50 +01:00
										 |  |  | # SPDX-License-Identifier: LGPL-2.1-or-later | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2011-04-15 08:33:30 -04:00
										 |  |  | # This library is free software; you can redistribute it and/or | 
					
						
							|  |  |  | # modify it under the terms of the GNU Lesser General Public | 
					
						
							|  |  |  | # License as published by the Free Software Foundation; either | 
					
						
							| 
									
										
										
										
											2017-01-05 14:44:41 +01:00
										 |  |  | # version 2.1 of the License, or (at your option) any later version. | 
					
						
							| 
									
										
										
										
											2011-04-15 08:33:30 -04:00
										 |  |  | # | 
					
						
							|  |  |  | # This library is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | # but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
					
						
							|  |  |  | # Lesser General Public License for more details. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # You should have received a copy of the GNU Lesser General | 
					
						
							| 
									
										
										
										
											2014-01-23 12:58:29 +01:00
										 |  |  | # Public License along with this library; if not, see <http://www.gnu.org/licenses/>. | 
					
						
							| 
									
										
										
										
											2011-04-15 08:33:30 -04:00
										 |  |  | # | 
					
						
							|  |  |  | # Author: David Zeuthen <davidz@redhat.com> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  | import xml.parsers.expat | 
					
						
							| 
									
										
										
										
											2023-08-14 23:31:05 -03:00
										 |  |  | import textwrap | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-23 07:35:01 +02:00
										 |  |  | from . import dbustypes | 
					
						
							| 
									
										
										
										
											2018-01-12 08:55:36 +01:00
										 |  |  | from .utils import print_error | 
					
						
							| 
									
										
										
										
											2011-08-23 07:35:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  | class DBusXMLParser: | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |     STATE_TOP = "top" | 
					
						
							|  |  |  |     STATE_NODE = "node" | 
					
						
							|  |  |  |     STATE_INTERFACE = "interface" | 
					
						
							|  |  |  |     STATE_METHOD = "method" | 
					
						
							|  |  |  |     STATE_SIGNAL = "signal" | 
					
						
							|  |  |  |     STATE_PROPERTY = "property" | 
					
						
							|  |  |  |     STATE_ARG = "arg" | 
					
						
							|  |  |  |     STATE_ANNOTATION = "annotation" | 
					
						
							|  |  |  |     STATE_IGNORED = "ignored" | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-02 16:20:16 +00:00
										 |  |  |     def __init__(self, xml_data, h_type_implies_unix_fd=True): | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |         self._parser = xml.parsers.expat.ParserCreate() | 
					
						
							|  |  |  |         self._parser.CommentHandler = self.handle_comment | 
					
						
							|  |  |  |         self._parser.CharacterDataHandler = self.handle_char_data | 
					
						
							|  |  |  |         self._parser.StartElementHandler = self.handle_start_element | 
					
						
							|  |  |  |         self._parser.EndElementHandler = self.handle_end_element | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.parsed_interfaces = [] | 
					
						
							|  |  |  |         self._cur_object = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.state = DBusXMLParser.STATE_TOP | 
					
						
							|  |  |  |         self.state_stack = [] | 
					
						
							|  |  |  |         self._cur_object = None | 
					
						
							|  |  |  |         self._cur_object_stack = [] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |         self.doc_comment_last_symbol = "" | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-02 16:20:16 +00:00
										 |  |  |         self._h_type_implies_unix_fd = h_type_implies_unix_fd | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |         self._parser.Parse(xml_data) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |     COMMENT_STATE_BEGIN = "begin" | 
					
						
							|  |  |  |     COMMENT_STATE_PARAMS = "params" | 
					
						
							|  |  |  |     COMMENT_STATE_BODY = "body" | 
					
						
							|  |  |  |     COMMENT_STATE_SKIP = "skip" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |     def handle_comment(self, data): | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |         comment_state = DBusXMLParser.COMMENT_STATE_BEGIN | 
					
						
							| 
									
										
										
										
											2023-08-14 23:31:05 -03:00
										 |  |  |         lines = textwrap.dedent(data).split("\n") | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |         symbol = "" | 
					
						
							|  |  |  |         body = "" | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |         in_para = False | 
					
						
							|  |  |  |         params = {} | 
					
						
							|  |  |  |         for line in lines: | 
					
						
							|  |  |  |             if comment_state == DBusXMLParser.COMMENT_STATE_BEGIN: | 
					
						
							|  |  |  |                 if len(line) > 0: | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |                     colon_index = line.find(": ") | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                     if colon_index == -1: | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |                         if line.endswith(":"): | 
					
						
							| 
									
										
										
										
											2022-02-18 01:45:10 +00:00
										 |  |  |                             symbol = line[0 : len(line) - 1] | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                             comment_state = DBusXMLParser.COMMENT_STATE_PARAMS | 
					
						
							|  |  |  |                         else: | 
					
						
							|  |  |  |                             comment_state = DBusXMLParser.COMMENT_STATE_SKIP | 
					
						
							|  |  |  |                     else: | 
					
						
							|  |  |  |                         symbol = line[0:colon_index] | 
					
						
							| 
									
										
										
										
											2022-02-18 01:45:10 +00:00
										 |  |  |                         rest_of_line = line[colon_index + 2 :].strip() | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                         if len(rest_of_line) > 0: | 
					
						
							| 
									
										
										
										
											2022-01-20 15:15:49 +00:00
										 |  |  |                             body += f"{rest_of_line}\n" | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                         comment_state = DBusXMLParser.COMMENT_STATE_PARAMS | 
					
						
							|  |  |  |             elif comment_state == DBusXMLParser.COMMENT_STATE_PARAMS: | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |                 if line.startswith("@"): | 
					
						
							|  |  |  |                     colon_index = line.find(": ") | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                     if colon_index == -1: | 
					
						
							|  |  |  |                         comment_state = DBusXMLParser.COMMENT_STATE_BODY | 
					
						
							|  |  |  |                         if not in_para: | 
					
						
							| 
									
										
										
										
											2022-01-20 15:15:49 +00:00
										 |  |  |                             body += "\n" | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                             in_para = True | 
					
						
							| 
									
										
										
										
											2023-08-14 23:31:05 -03:00
										 |  |  |                         body += f"{line}\n" | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                     else: | 
					
						
							|  |  |  |                         param = line[1:colon_index] | 
					
						
							| 
									
										
										
										
											2022-02-18 01:45:10 +00:00
										 |  |  |                         docs = line[colon_index + 2 :] | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                         params[param] = docs | 
					
						
							|  |  |  |                 else: | 
					
						
							|  |  |  |                     comment_state = DBusXMLParser.COMMENT_STATE_BODY | 
					
						
							|  |  |  |                     if len(line) > 0: | 
					
						
							|  |  |  |                         if not in_para: | 
					
						
							| 
									
										
										
										
											2022-01-20 15:15:49 +00:00
										 |  |  |                             body += "\n" | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                             in_para = True | 
					
						
							| 
									
										
										
										
											2023-08-14 23:31:05 -03:00
										 |  |  |                         body += line + "\n" | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |             elif comment_state == DBusXMLParser.COMMENT_STATE_BODY: | 
					
						
							|  |  |  |                 if len(line) > 0: | 
					
						
							|  |  |  |                     if not in_para: | 
					
						
							|  |  |  |                         in_para = True | 
					
						
							| 
									
										
										
										
											2023-08-14 23:31:05 -03:00
										 |  |  |                     body += line + "\n" | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                 else: | 
					
						
							|  |  |  |                     if in_para: | 
					
						
							| 
									
										
										
										
											2022-01-20 15:15:49 +00:00
										 |  |  |                         body += "\n" | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                         in_para = False | 
					
						
							|  |  |  |         if in_para: | 
					
						
							| 
									
										
										
										
											2022-01-20 15:15:49 +00:00
										 |  |  |             body += "\n" | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |         if symbol != "": | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |             self.doc_comment_last_symbol = symbol | 
					
						
							|  |  |  |             self.doc_comment_params = params | 
					
						
							|  |  |  |             self.doc_comment_body = body | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def handle_char_data(self, data): | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |         # print 'char_data=%s'%data | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |         pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def handle_start_element(self, name, attrs): | 
					
						
							|  |  |  |         old_state = self.state | 
					
						
							|  |  |  |         old_cur_object = self._cur_object | 
					
						
							| 
									
										
										
										
											2011-05-23 23:22:04 -04:00
										 |  |  |         if self.state == DBusXMLParser.STATE_IGNORED: | 
					
						
							|  |  |  |             self.state = DBusXMLParser.STATE_IGNORED | 
					
						
							|  |  |  |         elif self.state == DBusXMLParser.STATE_TOP: | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |             if name == DBusXMLParser.STATE_NODE: | 
					
						
							|  |  |  |                 self.state = DBusXMLParser.STATE_NODE | 
					
						
							|  |  |  |             else: | 
					
						
							| 
									
										
										
										
											2011-05-23 23:22:04 -04:00
										 |  |  |                 self.state = DBusXMLParser.STATE_IGNORED | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |         elif self.state == DBusXMLParser.STATE_NODE: | 
					
						
							|  |  |  |             if name == DBusXMLParser.STATE_INTERFACE: | 
					
						
							|  |  |  |                 self.state = DBusXMLParser.STATE_INTERFACE | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |                 iface = dbustypes.Interface(attrs["name"]) | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                 self._cur_object = iface | 
					
						
							|  |  |  |                 self.parsed_interfaces.append(iface) | 
					
						
							|  |  |  |             elif name == DBusXMLParser.STATE_ANNOTATION: | 
					
						
							|  |  |  |                 self.state = DBusXMLParser.STATE_ANNOTATION | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |                 anno = dbustypes.Annotation(attrs["name"], attrs["value"]) | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                 self._cur_object.annotations.append(anno) | 
					
						
							|  |  |  |                 self._cur_object = anno | 
					
						
							|  |  |  |             else: | 
					
						
							| 
									
										
										
										
											2011-05-23 23:22:04 -04:00
										 |  |  |                 self.state = DBusXMLParser.STATE_IGNORED | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |             # assign docs, if any | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |             if "name" in attrs and self.doc_comment_last_symbol == attrs["name"]: | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                 self._cur_object.doc_string = self.doc_comment_body | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |                 if "short_description" in self.doc_comment_params: | 
					
						
							|  |  |  |                     short_description = self.doc_comment_params["short_description"] | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                     self._cur_object.doc_string_brief = short_description | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |                 if "since" in self.doc_comment_params: | 
					
						
							|  |  |  |                     self._cur_object.since = self.doc_comment_params["since"].strip() | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         elif self.state == DBusXMLParser.STATE_INTERFACE: | 
					
						
							|  |  |  |             if name == DBusXMLParser.STATE_METHOD: | 
					
						
							|  |  |  |                 self.state = DBusXMLParser.STATE_METHOD | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |                 method = dbustypes.Method( | 
					
						
							|  |  |  |                     attrs["name"], h_type_implies_unix_fd=self._h_type_implies_unix_fd | 
					
						
							|  |  |  |                 ) | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                 self._cur_object.methods.append(method) | 
					
						
							|  |  |  |                 self._cur_object = method | 
					
						
							|  |  |  |             elif name == DBusXMLParser.STATE_SIGNAL: | 
					
						
							|  |  |  |                 self.state = DBusXMLParser.STATE_SIGNAL | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |                 signal = dbustypes.Signal(attrs["name"]) | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                 self._cur_object.signals.append(signal) | 
					
						
							|  |  |  |                 self._cur_object = signal | 
					
						
							|  |  |  |             elif name == DBusXMLParser.STATE_PROPERTY: | 
					
						
							|  |  |  |                 self.state = DBusXMLParser.STATE_PROPERTY | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |                 prop = dbustypes.Property(attrs["name"], attrs["type"], attrs["access"]) | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                 self._cur_object.properties.append(prop) | 
					
						
							|  |  |  |                 self._cur_object = prop | 
					
						
							|  |  |  |             elif name == DBusXMLParser.STATE_ANNOTATION: | 
					
						
							|  |  |  |                 self.state = DBusXMLParser.STATE_ANNOTATION | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |                 anno = dbustypes.Annotation(attrs["name"], attrs["value"]) | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                 self._cur_object.annotations.append(anno) | 
					
						
							|  |  |  |                 self._cur_object = anno | 
					
						
							|  |  |  |             else: | 
					
						
							| 
									
										
										
										
											2011-05-23 23:22:04 -04:00
										 |  |  |                 self.state = DBusXMLParser.STATE_IGNORED | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |             # assign docs, if any | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |             if "name" in attrs and self.doc_comment_last_symbol == attrs["name"]: | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                 self._cur_object.doc_string = self.doc_comment_body | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |                 if "since" in self.doc_comment_params: | 
					
						
							|  |  |  |                     self._cur_object.since = self.doc_comment_params["since"].strip() | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         elif self.state == DBusXMLParser.STATE_METHOD: | 
					
						
							|  |  |  |             if name == DBusXMLParser.STATE_ARG: | 
					
						
							|  |  |  |                 self.state = DBusXMLParser.STATE_ARG | 
					
						
							|  |  |  |                 arg_name = None | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |                 if "name" in attrs: | 
					
						
							|  |  |  |                     arg_name = attrs["name"] | 
					
						
							|  |  |  |                 arg = dbustypes.Arg(arg_name, attrs["type"]) | 
					
						
							|  |  |  |                 direction = attrs.get("direction", "in") | 
					
						
							|  |  |  |                 if direction == "in": | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                     self._cur_object.in_args.append(arg) | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |                 elif direction == "out": | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                     self._cur_object.out_args.append(arg) | 
					
						
							|  |  |  |                 else: | 
					
						
							| 
									
										
										
										
											2018-01-12 08:55:36 +01:00
										 |  |  |                     print_error('Invalid direction "{}"'.format(direction)) | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                 self._cur_object = arg | 
					
						
							|  |  |  |             elif name == DBusXMLParser.STATE_ANNOTATION: | 
					
						
							|  |  |  |                 self.state = DBusXMLParser.STATE_ANNOTATION | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |                 anno = dbustypes.Annotation(attrs["name"], attrs["value"]) | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                 self._cur_object.annotations.append(anno) | 
					
						
							|  |  |  |                 self._cur_object = anno | 
					
						
							|  |  |  |             else: | 
					
						
							| 
									
										
										
										
											2011-05-23 23:22:04 -04:00
										 |  |  |                 self.state = DBusXMLParser.STATE_IGNORED | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |             # assign docs, if any | 
					
						
							|  |  |  |             if self.doc_comment_last_symbol == old_cur_object.name: | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |                 if "name" in attrs and attrs["name"] in self.doc_comment_params: | 
					
						
							|  |  |  |                     doc_string = self.doc_comment_params[attrs["name"]] | 
					
						
							| 
									
										
										
										
											2020-11-17 15:32:10 +00:00
										 |  |  |                     if doc_string is not None: | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                         self._cur_object.doc_string = doc_string | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |                     if "since" in self.doc_comment_params: | 
					
						
							|  |  |  |                         self._cur_object.since = self.doc_comment_params[ | 
					
						
							|  |  |  |                             "since" | 
					
						
							|  |  |  |                         ].strip() | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         elif self.state == DBusXMLParser.STATE_SIGNAL: | 
					
						
							|  |  |  |             if name == DBusXMLParser.STATE_ARG: | 
					
						
							|  |  |  |                 self.state = DBusXMLParser.STATE_ARG | 
					
						
							|  |  |  |                 arg_name = None | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |                 if "name" in attrs: | 
					
						
							|  |  |  |                     arg_name = attrs["name"] | 
					
						
							|  |  |  |                 arg = dbustypes.Arg(arg_name, attrs["type"]) | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                 self._cur_object.args.append(arg) | 
					
						
							|  |  |  |                 self._cur_object = arg | 
					
						
							|  |  |  |             elif name == DBusXMLParser.STATE_ANNOTATION: | 
					
						
							|  |  |  |                 self.state = DBusXMLParser.STATE_ANNOTATION | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |                 anno = dbustypes.Annotation(attrs["name"], attrs["value"]) | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                 self._cur_object.annotations.append(anno) | 
					
						
							|  |  |  |                 self._cur_object = anno | 
					
						
							|  |  |  |             else: | 
					
						
							| 
									
										
										
										
											2011-05-23 23:22:04 -04:00
										 |  |  |                 self.state = DBusXMLParser.STATE_IGNORED | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |             # assign docs, if any | 
					
						
							|  |  |  |             if self.doc_comment_last_symbol == old_cur_object.name: | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |                 if "name" in attrs and attrs["name"] in self.doc_comment_params: | 
					
						
							|  |  |  |                     doc_string = self.doc_comment_params[attrs["name"]] | 
					
						
							| 
									
										
										
										
											2020-11-17 15:32:10 +00:00
										 |  |  |                     if doc_string is not None: | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                         self._cur_object.doc_string = doc_string | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |                     if "since" in self.doc_comment_params: | 
					
						
							|  |  |  |                         self._cur_object.since = self.doc_comment_params[ | 
					
						
							|  |  |  |                             "since" | 
					
						
							|  |  |  |                         ].strip() | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         elif self.state == DBusXMLParser.STATE_PROPERTY: | 
					
						
							|  |  |  |             if name == DBusXMLParser.STATE_ANNOTATION: | 
					
						
							|  |  |  |                 self.state = DBusXMLParser.STATE_ANNOTATION | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |                 anno = dbustypes.Annotation(attrs["name"], attrs["value"]) | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                 self._cur_object.annotations.append(anno) | 
					
						
							|  |  |  |                 self._cur_object = anno | 
					
						
							|  |  |  |             else: | 
					
						
							| 
									
										
										
										
											2011-05-23 23:22:04 -04:00
										 |  |  |                 self.state = DBusXMLParser.STATE_IGNORED | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |         elif self.state == DBusXMLParser.STATE_ARG: | 
					
						
							|  |  |  |             if name == DBusXMLParser.STATE_ANNOTATION: | 
					
						
							|  |  |  |                 self.state = DBusXMLParser.STATE_ANNOTATION | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |                 anno = dbustypes.Annotation(attrs["name"], attrs["value"]) | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                 self._cur_object.annotations.append(anno) | 
					
						
							|  |  |  |                 self._cur_object = anno | 
					
						
							|  |  |  |             else: | 
					
						
							| 
									
										
										
										
											2011-05-23 23:22:04 -04:00
										 |  |  |                 self.state = DBusXMLParser.STATE_IGNORED | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |         elif self.state == DBusXMLParser.STATE_ANNOTATION: | 
					
						
							|  |  |  |             if name == DBusXMLParser.STATE_ANNOTATION: | 
					
						
							|  |  |  |                 self.state = DBusXMLParser.STATE_ANNOTATION | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |                 anno = dbustypes.Annotation(attrs["name"], attrs["value"]) | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |                 self._cur_object.annotations.append(anno) | 
					
						
							|  |  |  |                 self._cur_object = anno | 
					
						
							|  |  |  |             else: | 
					
						
							| 
									
										
										
										
											2011-05-23 23:22:04 -04:00
										 |  |  |                 self.state = DBusXMLParser.STATE_IGNORED | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  |             print_error( | 
					
						
							|  |  |  |                 'Unhandled state "{}" while entering element with name "{}"'.format( | 
					
						
							|  |  |  |                     self.state, name | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         self.state_stack.append(old_state) | 
					
						
							|  |  |  |         self._cur_object_stack.append(old_cur_object) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def handle_end_element(self, name): | 
					
						
							|  |  |  |         self.state = self.state_stack.pop() | 
					
						
							|  |  |  |         self._cur_object = self._cur_object_stack.pop() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-17 15:07:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-02 16:20:16 +00:00
										 |  |  | def parse_dbus_xml(xml_data, h_type_implies_unix_fd): | 
					
						
							|  |  |  |     parser = DBusXMLParser(xml_data, h_type_implies_unix_fd) | 
					
						
							| 
									
										
										
										
											2011-04-08 16:57:31 -04:00
										 |  |  |     return parser.parsed_interfaces |