* python/dbus_bindings.pyx (MessageIter::append_strict): check for
authorJohn (J5) Palmieri <johnp@redhat.com>
Fri, 14 Oct 2005 21:44:00 +0000 (21:44 +0000)
committerJohn (J5) Palmieri <johnp@redhat.com>
Fri, 14 Oct 2005 21:44:00 +0000 (21:44 +0000)
  STRUCT_BEGIN not TYPE_STRUCT in indicate we are marshalling a struct

* python/service.py (Object::_message_cb): handle exceptions correctly
  by sending them over the wire to the calling app.  This makes sure
  the client returns immediately instead of waiting the 15 seconds to
  timeout.

* test/python/test-client.py (TestDBusBindings::testBenchmarkIntrospect):
  Add a test to benchmark how long it takes to introspect a service and
  call a method which returns a large element (pretty fast)

* test/python/test-service.py (TestObject::GetComplexArray): new test
  method which pushes a lot of data

ChangeLog
python/dbus_bindings.pyx
python/service.py
test/python/run-test.sh
test/python/test-client.py
test/python/test-service.py

index e62e1e8..3d6cce4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,24 @@
+2005-10-14  John (J5) Palmieri  <johnp@redhat.com>
+
+       * python/dbus_bindings.pyx (MessageIter::append_strict): check for
+       STRUCT_BEGIN not TYPE_STRUCT in indicate we are marshalling a struct
+
+       * python/service.py (Object::_message_cb): handle exceptions correctly
+       by sending them over the wire to the calling app.  This makes sure
+       the client returns immediately instead of waiting the 15 seconds to
+       timeout.
+
+       * test/python/test-client.py (TestDBusBindings::testBenchmarkIntrospect): 
+       Add a test to benchmark how long it takes to introspect a service and 
+       call a method which returns a large element (pretty fast)
+
+       * test/python/test-service.py (TestObject::GetComplexArray): new test 
+       method which pushes a lot of data
+
 2005-10-13  John (J5) Palmieri  <johnp@redhat.com>
 
-       * python/service.py(ObjectType::_reflect_on_signal, _reflect_on_method):        reclaim memory outside of the loop and use del istead of just setting
+       * python/service.py(ObjectType::_reflect_on_signal, _reflect_on_method):        
+       reclaim memory outside of the loop and use del istead of just setting
        the key to None
 
 2005-10-13  John (J5) Palmieri  <johnp@redhat.com>
index 0060373..35ad492 100644 (file)
@@ -978,7 +978,6 @@ cdef class MessageIter:
         return (sig, remainder)
   
     def append_strict(self, value, sig):
-        
     
         if sig == TYPE_INVALID or sig == None:
             raise TypeError, 'Invalid arg type sent to append_strict'
@@ -1023,7 +1022,7 @@ cdef class MessageIter:
                 retval = self.append_array(Array(value, signature=tmp_sig))
         elif sig_type == TYPE_OBJECT_PATH:
             retval = self.append_object_path(value)
-        elif sig_type == TYPE_STRUCT:
+        elif sig_type == STRUCT_BEGIN:
             tmp_sig = sig[1:-1]
             retval = self.append_struct(value, signature = tmp_sig)
         elif sig_type == TYPE_VARIANT:
index a439183..0cc2ed9 100644 (file)
@@ -168,13 +168,19 @@ class Object:
         print ("Unregister")
 
     def _message_cb(self, connection, message):
-        target_method_name = message.get_member()
-        target_methods = self._dbus_method_vtable[target_method_name]
-        args = message.get_args_list()
+        try:
+            target_method_name = message.get_member()
+            target_methods = self._dbus_method_vtable[target_method_name]
+            args = message.get_args_list()
         
-        reply = _dispatch_dbus_method_call(target_methods, self, args, message)
-
-        self._connection.send(reply)
+            reply = _dispatch_dbus_method_call(target_methods, self, args, message)
+
+            self._connection.send(reply)
+        except Exception, e:
+            error_reply = dbus_bindings.Error(message, 
+                                             "org.freedesktop.DBus.Python.%s" % e.__class__.__name__, 
+                                              str(e))
+            self._connection.send(error_reply)
 
     @method('org.freedesktop.DBus.Introspectable')
     def Introspect(self):
index 600eb6d..aa6bd36 100755 (executable)
@@ -29,6 +29,10 @@ fi
 
 ln -s $DBUS_TOP_BUILDDIR/python $DBUS_TOP_BUILDDIR/python/dbus
 echo "running test-client.py"
+#uncomment this if you need to see the output from the service for debugging
+#otherwise keep it commented so we can test activation
+#libtool --mode=execute $DEBUG $DBUS_TOP_BUILDDIR/test/python/test-service.py &
+
 libtool --mode=execute $DEBUG $DBUS_TOP_BUILDDIR/test/python/test-client.py || die "test-client.py failed"
 rm $DBUS_TOP_BUILDDIR/python/dbus
 
index 08c547f..f90ce13 100755 (executable)
@@ -2,6 +2,7 @@
 import sys
 import os
 import unittest
+import time
 
 builddir = os.environ["DBUS_TOP_BUILDDIR"]
 pydir = builddir + "/python"
@@ -29,7 +30,6 @@ test_types_vals = [1, 12323231, 3.14159265, 99999999.99,
                  ([1,2,3],"c", 1.2, ["a","b","c"], {"a": (1,"v"), "b": (2,"d")})
                  ]
 
-
 class TestDBusBindings(unittest.TestCase):
     def setUp(self):
         self.bus = dbus.SessionBus()
@@ -57,7 +57,17 @@ class TestDBusBindings(unittest.TestCase):
             print "Testing %s"% str(send_val)
             recv_val = self.iface.Echo(send_val)
             self.assertEquals(send_val, recv_val)
-   
+
+    def testBenchmarkIntrospect(self):
+        print "\n********* Benchmark Introspect ************"
+       a = time.time()
+       print a
+        print self.iface.GetComplexArray()
+       b = time.time()
+       print b
+       print "Delta: %f" % (b - a)
+        self.assert_(True)
+
     def testAsyncCalls(self):
         #test sending python types and getting them back async
         print "\n********* Testing Async Calls ***********"
index 8f3cb7a..36c2df7 100755 (executable)
@@ -16,6 +16,7 @@ if not dbus.__file__.startswith(pydir):
 import dbus.service
 import dbus.glib
 import gobject
+import random
 
 class TestObject(dbus.service.Object):
     def __init__(self, bus_name, object_path="/org/freedesktop/DBus/TestSuitePythonObject"):
@@ -27,6 +28,14 @@ class TestObject(dbus.service.Object):
     def Echo(self, arg):
         return arg
 
+    @dbus.service.method("org.freedesktop.DBus.TestSuiteInterface")
+    def GetComplexArray(self):
+        ret = []
+        for i in range(0,100):
+            ret.append((random.randint(0,100), random.randint(0,100), str(random.randint(0,100))))
+
+        return dbus.Array(ret, signature="(uus)")
+
 session_bus = dbus.SessionBus()
 name = dbus.service.BusName("org.freedesktop.DBus.TestSuitePythonService", bus=session_bus)
 object = TestObject(name)