2.34.0
[platform/upstream/at-spi2-core.git] / dbind / dbind.c
index a463308..e154f85 100644 (file)
@@ -2,19 +2,19 @@
  * Copyright 2008-2011 Novell, Inc.
  *
  * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
+ * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
+ * version 2.1 of the License, or (at your option) any later version.
  *
  * This library 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
- * Library General Public License for more details.
+ * Lesser General Public License for more details.
  *
- * You should have received a copy of the GNU Library General Public
+ * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
  */
 
 #include <stdio.h>
@@ -68,18 +68,30 @@ dbind_send_and_allow_reentry (DBusConnection * bus, DBusMessage * message, DBusE
   const char *destination = dbus_message_get_destination (message);
   struct timeval tv;
   DBusMessage *ret;
+  static gboolean in_dispatch = FALSE;
 
   if (unique_name && destination &&
       strcmp (destination, unique_name) != 0)
-    return dbus_connection_send_with_reply_and_block (bus, message, dbind_timeout, error);
+    {
+      ret = dbus_connection_send_with_reply_and_block (bus, message,
+                                                       dbind_timeout, error);
+      if (g_main_depth () == 0 && !in_dispatch)
+      {
+        in_dispatch = TRUE;
+        while (dbus_connection_dispatch (bus) == DBUS_DISPATCH_DATA_REMAINS);
+        in_dispatch = FALSE;
+      }
+      return ret;
+    }
 
   closure = g_new0 (SpiReentrantCallClosure, 1);
   closure->reply = NULL;
-  atspi_dbus_connection_setup_with_g_main(bus, NULL);
-  if (!dbus_connection_send_with_reply (bus, message, &pending, dbind_timeout))
+  if (!dbus_connection_send_with_reply (bus, message, &pending, dbind_timeout)
+      || !pending)
+    {
+      g_free (closure);
       return NULL;
-  if (!pending)
-    return NULL;
+    }
   dbus_pending_call_set_notify (pending, set_reply, (void *) closure, g_free);
 
   closure->reply = NULL;
@@ -89,11 +101,15 @@ dbind_send_and_allow_reentry (DBusConnection * bus, DBusMessage * message, DBusE
     {
       if (!dbus_connection_read_write_dispatch (bus, dbind_timeout))
         {
+          //dbus_pending_call_set_notify (pending, NULL, NULL, NULL);
+          dbus_pending_call_cancel (pending);
           dbus_pending_call_unref (pending);
           return NULL;
         }
       if (time_elapsed (&tv) > dbind_timeout)
         {
+          //dbus_pending_call_set_notify (pending, NULL, NULL, NULL);
+          dbus_pending_call_cancel (pending);
           dbus_pending_call_unref (pending);
           dbus_set_error_const (error, "org.freedesktop.DBus.Error.NoReply",
                                 "timeout from dbind");
@@ -146,7 +162,6 @@ dbind_method_call_reentrant_va (DBusConnection *cnx,
 
     if (dbus_message_get_type (reply) == DBUS_MESSAGE_TYPE_ERROR)
     {
-      const char *name = dbus_message_get_error_name (reply);
       goto out;
     }
     /* demarshal */
@@ -230,6 +245,7 @@ dbind_method_call_reentrant (DBusConnection *cnx,
 
 /*---------------------------------------------------------------------------*/
 
+/* TODO: opt_error is unused; should be removed */
 dbus_bool_t
 dbind_emit_signal_va (DBusConnection *cnx,
                       const char     *path,
@@ -242,17 +258,8 @@ dbind_emit_signal_va (DBusConnection *cnx,
     dbus_bool_t success = FALSE;
     DBusMessage *msg = NULL;
     DBusMessageIter iter;
-    DBusError *err, real_err;
     const char *p;
 
-    dbus_error_init (&real_err);
-
-    if (opt_error)
-        err = opt_error;
-    else {
-        err = &real_err;
-    }
-
     msg = dbus_message_new_signal (path, interface, signal);
     if (!msg)
         goto out;
@@ -270,9 +277,6 @@ out:
     if (msg)
         dbus_message_unref (msg);
 
-    if (dbus_error_is_set (&real_err))
-        dbus_error_free (&real_err);
-
     return success;
 }