home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / lib / python2.4 / site-packages / dbus / proxies.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2006-08-31  |  6.7 KB  |  205 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. import dbus_bindings
  5. import introspect_parser
  6. import sys
  7. from exceptions import MissingReplyHandlerException, MissingErrorHandlerException, IntrospectionParserException
  8.  
  9. class DeferedMethod:
  10.     '''A DeferedMethod
  11.     
  12.     This is returned instead of ProxyMethod when we are defering DBus calls
  13.     while waiting for introspection data to be returned
  14.     '''
  15.     
  16.     def __init__(self, proxy_method):
  17.         self._proxy_method = proxy_method
  18.         self._method_name = proxy_method._method_name
  19.  
  20.     
  21.     def __call__(self, *args, **keywords):
  22.         reply_handler = None
  23.         if keywords.has_key('reply_handler'):
  24.             reply_handler = keywords['reply_handler']
  25.         
  26.         self._proxy_method._proxy._pending_introspect.block()
  27.         ret = self._proxy_method(*args, **keywords)
  28.         return ret
  29.  
  30.  
  31.  
  32. class ProxyMethod:
  33.     '''A proxy Method.
  34.  
  35.     Typically a member of a ProxyObject. Calls to the
  36.     method produce messages that travel over the Bus and are routed
  37.     to a specific named Service.
  38.     '''
  39.     
  40.     def __init__(self, proxy, connection, named_service, object_path, method_name, iface):
  41.         self._proxy = proxy
  42.         self._connection = connection
  43.         self._named_service = named_service
  44.         self._object_path = object_path
  45.         self._method_name = method_name
  46.         self._dbus_interface = iface
  47.  
  48.     
  49.     def __call__(self, *args, **keywords):
  50.         timeout = -1
  51.         if keywords.has_key('timeout'):
  52.             timeout = keywords['timeout']
  53.         
  54.         reply_handler = None
  55.         if keywords.has_key('reply_handler'):
  56.             reply_handler = keywords['reply_handler']
  57.         
  58.         error_handler = None
  59.         if keywords.has_key('error_handler'):
  60.             error_handler = keywords['error_handler']
  61.         
  62.         ignore_reply = False
  63.         if keywords.has_key('ignore_reply'):
  64.             ignore_reply = keywords['ignore_reply']
  65.         
  66.         if not reply_handler and error_handler:
  67.             if reply_handler:
  68.                 raise MissingErrorHandlerException()
  69.             elif error_handler:
  70.                 raise MissingReplyHandlerException()
  71.             
  72.         
  73.         dbus_interface = self._dbus_interface
  74.         if keywords.has_key('dbus_interface'):
  75.             dbus_interface = keywords['dbus_interface']
  76.         
  77.         tmp_iface = ''
  78.         if dbus_interface:
  79.             tmp_iface = dbus_interface + '.'
  80.         
  81.         key = tmp_iface + self._method_name
  82.         introspect_sig = None
  83.         if self._proxy._introspect_method_map.has_key(key):
  84.             introspect_sig = self._proxy._introspect_method_map[key]
  85.         
  86.         message = dbus_bindings.MethodCall(self._object_path, dbus_interface, self._method_name)
  87.         message.set_destination(self._named_service)
  88.         iter = message.get_iter(True)
  89.         if introspect_sig:
  90.             for arg, sig in zip(args, dbus_bindings.Signature(introspect_sig)):
  91.                 iter.append_strict(arg, sig)
  92.             
  93.         else:
  94.             for arg in args:
  95.                 iter.append(arg)
  96.             
  97.         if ignore_reply:
  98.             result = self._connection.send(message)
  99.             args_tuple = (result,)
  100.         elif reply_handler:
  101.             result = self._connection.send_with_reply_handlers(message, timeout, reply_handler, error_handler)
  102.             args_tuple = result
  103.         else:
  104.             reply_message = self._connection.send_with_reply_and_block(message, timeout)
  105.             args_tuple = reply_message.get_args_list()
  106.         if len(args_tuple) == 0:
  107.             return None
  108.         elif len(args_tuple) == 1:
  109.             return args_tuple[0]
  110.         else:
  111.             return args_tuple
  112.  
  113.  
  114.  
  115. class ProxyObject:
  116.     '''A proxy to the remote Object.
  117.  
  118.     A ProxyObject is provided by the Bus. ProxyObjects
  119.     have member functions, and can be called like normal Python objects.
  120.     '''
  121.     ProxyMethodClass = ProxyMethod
  122.     DeferedMethodClass = DeferedMethod
  123.     INTROSPECT_STATE_DONT_INTROSPECT = 0
  124.     INTROSPECT_STATE_INTROSPECT_IN_PROGRESS = 1
  125.     INTROSPECT_STATE_INTROSPECT_DONE = 2
  126.     
  127.     def __init__(self, bus, named_service, object_path, introspect = True):
  128.         self._bus = bus
  129.         self._named_service = named_service
  130.         self._object_path = object_path
  131.         self._pending_introspect = None
  132.         self._pending_introspect_queue = []
  133.         self._introspect_method_map = { }
  134.         if not introspect:
  135.             self._introspect_state = self.INTROSPECT_STATE_DONT_INTROSPECT
  136.         else:
  137.             self._introspect_state = self.INTROSPECT_STATE_INTROSPECT_IN_PROGRESS
  138.             (result, self._pending_introspect) = self._Introspect()
  139.  
  140.     
  141.     def connect_to_signal(self, signal_name, handler_function, dbus_interface = None, **keywords):
  142.         self._bus.add_signal_receiver(handler_function, signal_name = signal_name, dbus_interface = dbus_interface, named_service = self._named_service, path = self._object_path, **keywords)
  143.  
  144.     
  145.     def _Introspect(self):
  146.         message = dbus_bindings.MethodCall(self._object_path, 'org.freedesktop.DBus.Introspectable', 'Introspect')
  147.         message.set_destination(self._named_service)
  148.         result = self._bus.get_connection().send_with_reply_handlers(message, -1, self._introspect_reply_handler, self._introspect_error_handler)
  149.         return result
  150.  
  151.     
  152.     def _introspect_execute_queue(self):
  153.         for call in self._pending_introspect_queue:
  154.             (member, iface, args, keywords) = call
  155.             introspect_sig = None
  156.             tmp_iface = ''
  157.             if iface:
  158.                 tmp_iface = iface + '.'
  159.             
  160.             key = tmp_iface + '.' + member
  161.             if self._introspect_method_map.has_key(key):
  162.                 introspect_sig = self._introspect_method_map[key]
  163.             
  164.             call_object = self.ProxyMethodClass(self._bus.get_connection(), self._named_service, self._object_path, iface, member, introspect_sig)
  165.             call_object(args, keywords)
  166.         
  167.  
  168.     
  169.     def _introspect_reply_handler(self, data):
  170.         
  171.         try:
  172.             self._introspect_method_map = introspect_parser.process_introspection_data(data)
  173.         except IntrospectionParserException:
  174.             e = None
  175.             self._introspect_error_handler(e)
  176.             return None
  177.  
  178.         self._introspect_state = self.INTROSPECT_STATE_INTROSPECT_DONE
  179.  
  180.     
  181.     def _introspect_error_handler(self, error):
  182.         self._introspect_state = self.INTROSPECT_STATE_DONT_INTROSPECT
  183.         self._introspect_execute_queue()
  184.         sys.stderr.write('Introspect error: ' + str(error) + '\n')
  185.  
  186.     
  187.     def __getattr__(self, member, dbus_interface = None):
  188.         if member == '__call__':
  189.             return object.__call__
  190.         elif member.startswith('__') and member.endswith('__'):
  191.             raise AttributeError(member)
  192.         else:
  193.             ret = self.ProxyMethodClass(self, self._bus.get_connection(), self._named_service, self._object_path, member, dbus_interface)
  194.             if self._introspect_state == self.INTROSPECT_STATE_INTROSPECT_IN_PROGRESS:
  195.                 ret = self.DeferedMethodClass(ret)
  196.             
  197.             return ret
  198.  
  199.     
  200.     def __repr__(self):
  201.         return '<ProxyObject wrapping %s %s %s at %#x>' % (self._bus, self._named_service, self._object_path, id(self))
  202.  
  203.     __str__ = __repr__
  204.  
  205.