Mercurial > libervia-backend
annotate libervia/backend/bridge/bridge_constructor/constructors/dbus/dbus_frontend_template.py @ 4304:92a886f31581 default tip @
doc (components): new Email gateway documentation:
fix 449
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 06 Sep 2024 18:07:44 +0200 |
parents | 0d7bb4df2343 |
children |
rev | line source |
---|---|
3028 | 1 #!/usr/bin/env python3 |
267 | 2 |
3143
830fce0db15d
bridge (dbus): new `bridge_dbus_int_prefix` option (in `[DEFAULT]` settings) to change interface prefix
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
3 # SàT communication bridge |
3479 | 4 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org) |
267 | 5 |
609
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
595
diff
changeset
|
6 # This program is free software: you can redistribute it and/or modify |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
595
diff
changeset
|
7 # it under the terms of the GNU Affero General Public License as published by |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
595
diff
changeset
|
8 # the Free Software Foundation, either version 3 of the License, or |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
595
diff
changeset
|
9 # (at your option) any later version. |
267 | 10 |
609
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
595
diff
changeset
|
11 # This program is distributed in the hope that it will be useful, |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
595
diff
changeset
|
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
595
diff
changeset
|
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
595
diff
changeset
|
14 # GNU Affero General Public License for more details. |
267 | 15 |
609
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
595
diff
changeset
|
16 # You should have received a copy of the GNU Affero General Public License |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
595
diff
changeset
|
17 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
267 | 18 |
3042
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
19 import asyncio |
535
790be337cc41
bridge: fixed D-Bus warning in frontend side of bridge
Goffi <goffi@goffi.org>
parents:
480
diff
changeset
|
20 import dbus |
3042
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
21 import ast |
4071
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
22 from libervia.backend.core.i18n import _ |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
23 from libervia.backend.tools import config |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
24 from libervia.backend.core.log import getLogger |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
25 from libervia.backend.core.exceptions import BridgeExceptionNoService, BridgeInitError |
3042
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
26 from dbus.mainloop.glib import DBusGMainLoop |
3143
830fce0db15d
bridge (dbus): new `bridge_dbus_int_prefix` option (in `[DEFAULT]` settings) to change interface prefix
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
27 from .bridge_frontend import BridgeException |
830fce0db15d
bridge (dbus): new `bridge_dbus_int_prefix` option (in `[DEFAULT]` settings) to change interface prefix
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
28 |
267 | 29 |
535
790be337cc41
bridge: fixed D-Bus warning in frontend side of bridge
Goffi <goffi@goffi.org>
parents:
480
diff
changeset
|
30 DBusGMainLoop(set_as_default=True) |
3042
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
31 log = getLogger(__name__) |
535
790be337cc41
bridge: fixed D-Bus warning in frontend side of bridge
Goffi <goffi@goffi.org>
parents:
480
diff
changeset
|
32 |
1073
f094583732de
bridge: DBusException also transports the twisted failure condition
souliane <souliane@mailoo.org>
parents:
1072
diff
changeset
|
33 |
3143
830fce0db15d
bridge (dbus): new `bridge_dbus_int_prefix` option (in `[DEFAULT]` settings) to change interface prefix
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
34 # Interface prefix |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3648
diff
changeset
|
35 const_INT_PREFIX = config.config_get( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
36 config.parse_main_conf(), "", "bridge_dbus_int_prefix", "org.libervia.Libervia" |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
37 ) |
595
1f160467f5de
Fix pep8 support in src/bridge.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
38 const_ERROR_PREFIX = const_INT_PREFIX + ".error" |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
39 const_OBJ_PATH = "/org/libervia/Libervia/bridge" |
371
3ea41a199b36
bridge refactoring: categories are now core and plugin instead of communication and request
Goffi <goffi@goffi.org>
parents:
363
diff
changeset
|
40 const_CORE_SUFFIX = ".core" |
3ea41a199b36
bridge refactoring: categories are now core and plugin instead of communication and request
Goffi <goffi@goffi.org>
parents:
363
diff
changeset
|
41 const_PLUGIN_SUFFIX = ".plugin" |
1072
d123d61976c8
bridge (D-Bus): frontend side now use a 120 s timeout for async calls
Goffi <goffi@goffi.org>
parents:
1062
diff
changeset
|
42 const_TIMEOUT = 120 |
359
eb9d33ba4e36
bridge: templates' constants can now be overrided
Goffi <goffi@goffi.org>
parents:
337
diff
changeset
|
43 |
595
1f160467f5de
Fix pep8 support in src/bridge.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
44 |
1062
95758ef3faa8
bridge: async failures are more detailed (full class name + error message)
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
45 def dbus_to_bridge_exception(dbus_e): |
95758ef3faa8
bridge: async failures are more detailed (full class name + error message)
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
46 """Convert a DBusException to a BridgeException. |
95758ef3faa8
bridge: async failures are more detailed (full class name + error message)
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
47 |
95758ef3faa8
bridge: async failures are more detailed (full class name + error message)
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
48 @param dbus_e (DBusException) |
95758ef3faa8
bridge: async failures are more detailed (full class name + error message)
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
49 @return: BridgeException |
95758ef3faa8
bridge: async failures are more detailed (full class name + error message)
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
50 """ |
1188
bf2927e6a0f5
frontends (dbus): error is not truncated anymore if it's not a SàT error.
Goffi <goffi@goffi.org>
parents:
1073
diff
changeset
|
51 full_name = dbus_e.get_dbus_name() |
bf2927e6a0f5
frontends (dbus): error is not truncated anymore if it's not a SàT error.
Goffi <goffi@goffi.org>
parents:
1073
diff
changeset
|
52 if full_name.startswith(const_ERROR_PREFIX): |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
53 name = dbus_e.get_dbus_name()[len(const_ERROR_PREFIX) + 1 :] |
1188
bf2927e6a0f5
frontends (dbus): error is not truncated anymore if it's not a SàT error.
Goffi <goffi@goffi.org>
parents:
1073
diff
changeset
|
54 else: |
bf2927e6a0f5
frontends (dbus): error is not truncated anymore if it's not a SàT error.
Goffi <goffi@goffi.org>
parents:
1073
diff
changeset
|
55 name = full_name |
1073
f094583732de
bridge: DBusException also transports the twisted failure condition
souliane <souliane@mailoo.org>
parents:
1072
diff
changeset
|
56 # XXX: dbus_e.args doesn't contain the original DBusException args, but we |
f094583732de
bridge: DBusException also transports the twisted failure condition
souliane <souliane@mailoo.org>
parents:
1072
diff
changeset
|
57 # receive its serialized form in dbus_e.args[0]. From that we can rebuild |
f094583732de
bridge: DBusException also transports the twisted failure condition
souliane <souliane@mailoo.org>
parents:
1072
diff
changeset
|
58 # the original arguments list thanks to ast.literal_eval (secure eval). |
f094583732de
bridge: DBusException also transports the twisted failure condition
souliane <souliane@mailoo.org>
parents:
1072
diff
changeset
|
59 message = dbus_e.get_dbus_message() # similar to dbus_e.args[0] |
f094583732de
bridge: DBusException also transports the twisted failure condition
souliane <souliane@mailoo.org>
parents:
1072
diff
changeset
|
60 try: |
f094583732de
bridge: DBusException also transports the twisted failure condition
souliane <souliane@mailoo.org>
parents:
1072
diff
changeset
|
61 message, condition = ast.literal_eval(message) |
f094583732de
bridge: DBusException also transports the twisted failure condition
souliane <souliane@mailoo.org>
parents:
1072
diff
changeset
|
62 except (SyntaxError, ValueError, TypeError): |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
63 condition = "" |
1073
f094583732de
bridge: DBusException also transports the twisted failure condition
souliane <souliane@mailoo.org>
parents:
1072
diff
changeset
|
64 return BridgeException(name, message, condition) |
1062
95758ef3faa8
bridge: async failures are more detailed (full class name + error message)
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
65 |
95758ef3faa8
bridge: async failures are more detailed (full class name + error message)
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
66 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3648
diff
changeset
|
67 class bridge: |
2091
f413bfc24458
bridge, quick_frontend: preparation for async bridge
Goffi <goffi@goffi.org>
parents:
2086
diff
changeset
|
68 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3648
diff
changeset
|
69 def bridge_connect(self, callback, errback): |
267 | 70 try: |
71 self.sessions_bus = dbus.SessionBus() | |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
72 self.db_object = self.sessions_bus.get_object( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
73 const_INT_PREFIX, const_OBJ_PATH |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
74 ) |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
75 self.db_core_iface = dbus.Interface( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
76 self.db_object, dbus_interface=const_INT_PREFIX + const_CORE_SUFFIX |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
77 ) |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
78 self.db_plugin_iface = dbus.Interface( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
79 self.db_object, dbus_interface=const_INT_PREFIX + const_PLUGIN_SUFFIX |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
80 ) |
3028 | 81 except dbus.exceptions.DBusException as e: |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
82 if e._dbus_error_name in ( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
83 "org.freedesktop.DBus.Error.ServiceUnknown", |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
84 "org.freedesktop.DBus.Error.Spawn.ExecFailed", |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
85 ): |
2091
f413bfc24458
bridge, quick_frontend: preparation for async bridge
Goffi <goffi@goffi.org>
parents:
2086
diff
changeset
|
86 errback(BridgeExceptionNoService()) |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
87 elif e._dbus_error_name == "org.freedesktop.DBus.Error.NotSupported": |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
88 log.error( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
89 _( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
90 "D-Bus is not launched, please see README to see instructions on how to launch it" |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
91 ) |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
92 ) |
2091
f413bfc24458
bridge, quick_frontend: preparation for async bridge
Goffi <goffi@goffi.org>
parents:
2086
diff
changeset
|
93 errback(BridgeInitError) |
267 | 94 else: |
2091
f413bfc24458
bridge, quick_frontend: preparation for async bridge
Goffi <goffi@goffi.org>
parents:
2086
diff
changeset
|
95 errback(e) |
3042
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
96 else: |
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
97 callback() |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
98 # props = self.db_core_iface.getProperties() |
267 | 99 |
2086 | 100 def register_signal(self, functionName, handler, iface="core"): |
371
3ea41a199b36
bridge refactoring: categories are now core and plugin instead of communication and request
Goffi <goffi@goffi.org>
parents:
363
diff
changeset
|
101 if iface == "core": |
3ea41a199b36
bridge refactoring: categories are now core and plugin instead of communication and request
Goffi <goffi@goffi.org>
parents:
363
diff
changeset
|
102 self.db_core_iface.connect_to_signal(functionName, handler) |
3ea41a199b36
bridge refactoring: categories are now core and plugin instead of communication and request
Goffi <goffi@goffi.org>
parents:
363
diff
changeset
|
103 elif iface == "plugin": |
3ea41a199b36
bridge refactoring: categories are now core and plugin instead of communication and request
Goffi <goffi@goffi.org>
parents:
363
diff
changeset
|
104 self.db_plugin_iface.connect_to_signal(functionName, handler) |
3ea41a199b36
bridge refactoring: categories are now core and plugin instead of communication and request
Goffi <goffi@goffi.org>
parents:
363
diff
changeset
|
105 else: |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
106 log.error(_("Unknown interface")) |
267 | 107 |
568
239abc5484c9
bridge: generic plugin methods handling for frontend side in D-Bus Bridge \o/
Goffi <goffi@goffi.org>
parents:
562
diff
changeset
|
108 def __getattribute__(self, name): |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
109 """usual __getattribute__ if the method exists, else try to find a plugin method""" |
568
239abc5484c9
bridge: generic plugin methods handling for frontend side in D-Bus Bridge \o/
Goffi <goffi@goffi.org>
parents:
562
diff
changeset
|
110 try: |
239abc5484c9
bridge: generic plugin methods handling for frontend side in D-Bus Bridge \o/
Goffi <goffi@goffi.org>
parents:
562
diff
changeset
|
111 return object.__getattribute__(self, name) |
239abc5484c9
bridge: generic plugin methods handling for frontend side in D-Bus Bridge \o/
Goffi <goffi@goffi.org>
parents:
562
diff
changeset
|
112 except AttributeError: |
239abc5484c9
bridge: generic plugin methods handling for frontend side in D-Bus Bridge \o/
Goffi <goffi@goffi.org>
parents:
562
diff
changeset
|
113 # The attribute is not found, we try the plugin proxy to find the requested method |
239abc5484c9
bridge: generic plugin methods handling for frontend side in D-Bus Bridge \o/
Goffi <goffi@goffi.org>
parents:
562
diff
changeset
|
114 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3648
diff
changeset
|
115 def get_plugin_method(*args, **kwargs): |
568
239abc5484c9
bridge: generic plugin methods handling for frontend side in D-Bus Bridge \o/
Goffi <goffi@goffi.org>
parents:
562
diff
changeset
|
116 # We first check if we have an async call. We detect this in two ways: |
239abc5484c9
bridge: generic plugin methods handling for frontend side in D-Bus Bridge \o/
Goffi <goffi@goffi.org>
parents:
562
diff
changeset
|
117 # - if we have the 'callback' and 'errback' keyword arguments |
239abc5484c9
bridge: generic plugin methods handling for frontend side in D-Bus Bridge \o/
Goffi <goffi@goffi.org>
parents:
562
diff
changeset
|
118 # - or if the last two arguments are callable |
239abc5484c9
bridge: generic plugin methods handling for frontend side in D-Bus Bridge \o/
Goffi <goffi@goffi.org>
parents:
562
diff
changeset
|
119 |
3028 | 120 async_ = False |
1794
b0ed4863dbc7
bridge (D-Bus): fixed handling of profile in kwargs:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
121 args = list(args) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
122 |
568
239abc5484c9
bridge: generic plugin methods handling for frontend side in D-Bus Bridge \o/
Goffi <goffi@goffi.org>
parents:
562
diff
changeset
|
123 if kwargs: |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
124 if "callback" in kwargs: |
3028 | 125 async_ = True |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
126 _callback = kwargs.pop("callback") |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
127 _errback = kwargs.pop( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
128 "errback", lambda failure: log.error(str(failure)) |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
129 ) |
1794
b0ed4863dbc7
bridge (D-Bus): fixed handling of profile in kwargs:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
130 try: |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
131 args.append(kwargs.pop("profile")) |
1794
b0ed4863dbc7
bridge (D-Bus): fixed handling of profile in kwargs:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
132 except KeyError: |
b0ed4863dbc7
bridge (D-Bus): fixed handling of profile in kwargs:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
133 try: |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
134 args.append(kwargs.pop("profile_key")) |
1794
b0ed4863dbc7
bridge (D-Bus): fixed handling of profile in kwargs:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
135 except KeyError: |
b0ed4863dbc7
bridge (D-Bus): fixed handling of profile in kwargs:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
136 pass |
b0ed4863dbc7
bridge (D-Bus): fixed handling of profile in kwargs:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
137 # at this point, kwargs should be empty |
b0ed4863dbc7
bridge (D-Bus): fixed handling of profile in kwargs:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
138 if kwargs: |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
139 log.warning( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
140 "unexpected keyword arguments, they will be ignored: {}".format( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
141 kwargs |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
142 ) |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
143 ) |
595
1f160467f5de
Fix pep8 support in src/bridge.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
144 elif len(args) >= 2 and callable(args[-1]) and callable(args[-2]): |
3028 | 145 async_ = True |
568
239abc5484c9
bridge: generic plugin methods handling for frontend side in D-Bus Bridge \o/
Goffi <goffi@goffi.org>
parents:
562
diff
changeset
|
146 _errback = args.pop() |
239abc5484c9
bridge: generic plugin methods handling for frontend side in D-Bus Bridge \o/
Goffi <goffi@goffi.org>
parents:
562
diff
changeset
|
147 _callback = args.pop() |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
148 |
568
239abc5484c9
bridge: generic plugin methods handling for frontend side in D-Bus Bridge \o/
Goffi <goffi@goffi.org>
parents:
562
diff
changeset
|
149 method = getattr(self.db_plugin_iface, name) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
150 |
3028 | 151 if async_: |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
152 kwargs["timeout"] = const_TIMEOUT |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
153 kwargs["reply_handler"] = _callback |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
154 kwargs["error_handler"] = lambda err: _errback( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
155 dbus_to_bridge_exception(err) |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
156 ) |
568
239abc5484c9
bridge: generic plugin methods handling for frontend side in D-Bus Bridge \o/
Goffi <goffi@goffi.org>
parents:
562
diff
changeset
|
157 |
3648
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
158 try: |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
159 return method(*args, **kwargs) |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
160 except ValueError as e: |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
161 if e.args[0].startswith("Unable to guess signature"): |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
162 # XXX: if frontend is started too soon after backend, the |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
163 # inspection misses methods (notably plugin dynamically added |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
164 # methods). The following hack works around that by redoing the |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
165 # cache of introspected methods signatures. |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
166 log.debug("using hack to work around inspection issue") |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
167 proxy = self.db_plugin_iface.proxy_object |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
168 IN_PROGRESS = proxy.INTROSPECT_STATE_INTROSPECT_IN_PROGRESS |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
169 proxy._introspect_state = IN_PROGRESS |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
170 proxy._Introspect() |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
171 return self.db_plugin_iface.get_dbus_method(name)(*args, **kwargs) |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
172 raise e |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
173 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3648
diff
changeset
|
174 return get_plugin_method |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1188
diff
changeset
|
175 |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
176 |
723 | 177 ##METHODS_PART## |
3042
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
178 |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
179 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3648
diff
changeset
|
180 class AIOBridge(bridge): |
3042
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
181 |
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
182 def register_signal(self, functionName, handler, iface="core"): |
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
183 loop = asyncio.get_running_loop() |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
184 async_handler = lambda *args: asyncio.run_coroutine_threadsafe( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
185 handler(*args), loop |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
186 ) |
3042
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
187 return super().register_signal(functionName, async_handler, iface) |
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
188 |
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
189 def __getattribute__(self, name): |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
190 """usual __getattribute__ if the method exists, else try to find a plugin method""" |
3042
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
191 try: |
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
192 return object.__getattribute__(self, name) |
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
193 except AttributeError: |
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
194 # The attribute is not found, we try the plugin proxy to find the requested method |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3648
diff
changeset
|
195 def get_plugin_method(*args, **kwargs): |
3042
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
196 loop = asyncio.get_running_loop() |
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
197 fut = loop.create_future() |
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
198 method = getattr(self.db_plugin_iface, name) |
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
199 reply_handler = lambda ret=None: loop.call_soon_threadsafe( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
200 fut.set_result, ret |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
201 ) |
3042
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
202 error_handler = lambda err: loop.call_soon_threadsafe( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
203 fut.set_exception, dbus_to_bridge_exception(err) |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
204 ) |
3648
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
205 try: |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
206 method( |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
207 *args, |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
208 **kwargs, |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
209 timeout=const_TIMEOUT, |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
210 reply_handler=reply_handler, |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
211 error_handler=error_handler, |
3648
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
212 ) |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
213 except ValueError as e: |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
214 if e.args[0].startswith("Unable to guess signature"): |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3648
diff
changeset
|
215 # same hack as for bridge.__getattribute__ |
3648
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
216 log.warning("using hack to work around inspection issue") |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
217 proxy = self.db_plugin_iface.proxy_object |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
218 IN_PROGRESS = proxy.INTROSPECT_STATE_INTROSPECT_IN_PROGRESS |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
219 proxy._introspect_state = IN_PROGRESS |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
220 proxy._Introspect() |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
221 self.db_plugin_iface.get_dbus_method(name)( |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
222 *args, |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
223 **kwargs, |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
224 timeout=const_TIMEOUT, |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
225 reply_handler=reply_handler, |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
226 error_handler=error_handler, |
3648
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
227 ) |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
228 |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
229 else: |
71cfe9334f73
bridge (dbus/frontend): reintrospect signature in case of guess error:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
230 raise e |
3042
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
231 return fut |
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
232 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3648
diff
changeset
|
233 return get_plugin_method |
3042
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
234 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3648
diff
changeset
|
235 def bridge_connect(self): |
3042
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
236 loop = asyncio.get_running_loop() |
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
237 fut = loop.create_future() |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3648
diff
changeset
|
238 super().bridge_connect( |
3042
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
239 callback=lambda: loop.call_soon_threadsafe(fut.set_result, None), |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
240 errback=lambda e: loop.call_soon_threadsafe(fut.set_exception, e), |
3042
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
241 ) |
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
242 return fut |
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
243 |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
244 |
3042
964abd07dc03
bridge (dbus): AsyncIO version of D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
245 ##ASYNC_METHODS_PART## |