Mercurial > libervia-backend
diff libervia/backend/bridge/bridge_constructor/constructors/dbus-xml/constructor.py @ 4071:4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 02 Jun 2023 11:49:51 +0200 |
parents | sat/bridge/bridge_constructor/constructors/dbus-xml/constructor.py@524856bd7b19 |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libervia/backend/bridge/bridge_constructor/constructors/dbus-xml/constructor.py Fri Jun 02 11:49:51 2023 +0200 @@ -0,0 +1,102 @@ +#!/usr/bin/env python3 + + +# Libervia: an XMPP client +# Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org) + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program 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 Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +from libervia.backend.bridge.bridge_constructor import base_constructor +from xml.dom import minidom +import sys + + +class DbusXmlConstructor(base_constructor.Constructor): + """Constructor for DBus XML syntaxt (used by Qt frontend)""" + + def __init__(self, bridge_template, options): + base_constructor.Constructor.__init__(self, bridge_template, options) + + self.template = "dbus_xml_template.xml" + self.core_dest = "org.libervia.sat.xml" + self.default_annotation = { + "a{ss}": "StringDict", + "a(sa{ss}as)": "QList<Contact>", + "a{i(ss)}": "HistoryT", + "a(sss)": "QList<MenuT>", + "a{sa{s(sia{ss})}}": "PresenceStatusT", + } + + def generate_core_side(self): + try: + doc = minidom.parse(self.get_template_path(self.template)) + interface_elt = doc.getElementsByTagName("interface")[0] + except IOError: + print("Can't access template") + sys.exit(1) + except IndexError: + print("Template error") + sys.exit(1) + + sections = self.bridge_template.sections() + sections.sort() + for section in sections: + function = self.getValues(section) + print(("Adding %s %s" % (section, function["type"]))) + new_elt = doc.createElement( + "method" if function["type"] == "method" else "signal" + ) + new_elt.setAttribute("name", section) + + idx = 0 + args_doc = self.get_arguments_doc(section) + for arg in self.arguments_parser(function["sig_in"] or ""): + arg_elt = doc.createElement("arg") + arg_elt.setAttribute( + "name", args_doc[idx][0] if idx in args_doc else "arg_%i" % idx + ) + arg_elt.setAttribute("type", arg) + _direction = "in" if function["type"] == "method" else "out" + arg_elt.setAttribute("direction", _direction) + new_elt.appendChild(arg_elt) + if "annotation" in self.args.flags: + if arg in self.default_annotation: + annot_elt = doc.createElement("annotation") + annot_elt.setAttribute( + "name", "com.trolltech.QtDBus.QtTypeName.In%d" % idx + ) + annot_elt.setAttribute("value", self.default_annotation[arg]) + new_elt.appendChild(annot_elt) + idx += 1 + + if function["sig_out"]: + arg_elt = doc.createElement("arg") + arg_elt.setAttribute("type", function["sig_out"]) + arg_elt.setAttribute("direction", "out") + new_elt.appendChild(arg_elt) + if "annotation" in self.args.flags: + if function["sig_out"] in self.default_annotation: + annot_elt = doc.createElement("annotation") + annot_elt.setAttribute( + "name", "com.trolltech.QtDBus.QtTypeName.Out0" + ) + annot_elt.setAttribute( + "value", self.default_annotation[function["sig_out"]] + ) + new_elt.appendChild(annot_elt) + + interface_elt.appendChild(new_elt) + + # now we write to final file + self.final_write(self.core_dest, [doc.toprettyxml()])