From 0154580c521536e50ea98ea60c6c6d51c32b5769 Mon Sep 17 00:00:00 2001 From: "John (J5) Palmieri" Date: Fri, 24 Feb 2006 18:18:41 +0000 Subject: 2006-02-24 John (J5) Palmieri * Released 0.61 2006-02-24 John (J5) Palmieri * proxies.py: Fix the callchain --- python/proxies.py | 96 ++++++++++++++++++++++++++----------------------------- 1 file changed, 45 insertions(+), 51 deletions(-) (limited to 'python/proxies.py') diff --git a/python/proxies.py b/python/proxies.py index d13b72b1..80e9ac27 100644 --- a/python/proxies.py +++ b/python/proxies.py @@ -8,11 +8,23 @@ class DeferedMethod: This is returned instead of ProxyMethod when we are defering DBus calls while waiting for introspection data to be returned - - This class can be used for debugging purposes """ + def __init__(self, proxy_method): + self._proxy_method = proxy_method + self._method_name = proxy_method._method_name + def __call__(self, *args, **keywords): - return None + reply_handler = None + if keywords.has_key('reply_handler'): + reply_handler = keywords['reply_handler'] + + #block for now even on async + # FIXME: put ret in async queue in future if we have a reply handler + + self._proxy_method._proxy._pending_introspect.block() + ret = self._proxy_method (*args, **keywords) + + return ret class ProxyMethod: """A proxy Method. @@ -21,19 +33,15 @@ class ProxyMethod: method produce messages that travel over the Bus and are routed to a specific named Service. """ - def __init__(self, connection, named_service, object_path, dbus_interface, method_name, introspect_sig): - self._connection = connection - self._named_service = named_service - self._object_path = object_path - self._method_name = method_name - self._dbus_interface = dbus_interface - self._introspect_sig = introspect_sig + def __init__(self, proxy, connection, named_service, object_path, method_name, iface): + self._proxy = proxy + self._connection = connection + self._named_service = named_service + self._object_path = object_path + self._method_name = method_name + self._dbus_interface = iface def __call__(self, *args, **keywords): - dbus_interface = self._dbus_interface - if keywords.has_key('dbus_interface'): - dbus_interface = keywords['dbus_interface'] - timeout = -1 if keywords.has_key('timeout'): timeout = keywords['timeout'] @@ -50,20 +58,35 @@ class ProxyMethod: if keywords.has_key('ignore_reply'): ignore_reply = keywords['ignore_reply'] + if not(reply_handler and error_handler): if reply_handler: raise MissingErrorHandlerException() elif error_handler: raise MissingReplyHandlerException() + dbus_interface = self._dbus_interface + if keywords.has_key('dbus_interface'): + dbus_interface = keywords['dbus_interface'] + + tmp_iface = '' + if dbus_interface: + tmp_iface = dbus_interface + '.' + + key = tmp_iface + self._method_name + + introspect_sig = None + if self._proxy._introspect_method_map.has_key (key): + introspect_sig = self._proxy._introspect_method_map[key] + message = dbus_bindings.MethodCall(self._object_path, dbus_interface, self._method_name) message.set_destination(self._named_service) # Add the arguments to the function iter = message.get_iter(True) - if self._introspect_sig: - for (arg, sig) in zip(args, dbus_bindings.Signature(self._introspect_sig)): + if introspect_sig: + for (arg, sig) in zip(args, dbus_bindings.Signature(introspect_sig)): iter.append_strict(arg, sig) else: for arg in args: @@ -176,49 +199,20 @@ class ProxyObject: self._introspect_execute_queue() sys.stderr.write("Introspect error: " + str(error) + "\n") - def __getattr__(self, member, **keywords): + def __getattr__(self, member, dbus_interface=None): if member == '__call__': return object.__call__ elif member.startswith('__') and member.endswith('__'): raise AttributeError(member) else: - introspect_sig = None + ret = self.ProxyMethodClass(self, self._bus.get_connection(), + self._named_service, + self._object_path, member, + dbus_interface) - iface = None - if keywords.has_key('dbus_interface'): - iface = keywords['dbus_interface'] - if self._introspect_state == self.INTROSPECT_STATE_INTROSPECT_IN_PROGRESS: - reply_handler = None - if keywords.has_key('reply_handler'): - reply_handler = keywords['reply_handler'] - - error_handler = None - if keywords.has_key('error_handler'): - error_handler = keywords['error_handler'] - - if not reply_handler: - self._pending_introspect.block() - else: - call = (memeber, iface, args, keywords) - self._pending_introspect_queue.append(call) + ret = self.DeferedMethodClass(ret) - ret = self.DeferedMethodClass() - return ret - - if self._introspect_state == self.INTROSPECT_STATE_INTROSPECT_DONE: - tmp_iface = '' - if iface: - tmp_iface = iface + '.' - - key = tmp_iface + member - if self._introspect_method_map.has_key (key): - introspect_sig = self._introspect_method_map[key] - - ret = self.ProxyMethodClass(self._bus.get_connection(), - self._named_service, - self._object_path, iface, member, - introspect_sig) return ret def __repr__(self): -- cgit