Merge "[lib-fix] Fixed return value of kdbus_write_msg Change-Id: Ia3a45a6a79b4078929...
[platform/upstream/dbus.git] / dbus / dbus-connection.c
index 21d0db9..401e888 100644 (file)
@@ -2,6 +2,7 @@
 /* dbus-connection.c DBusConnection object
  *
  * Copyright (C) 2002-2006  Red Hat Inc.
+ * Copyright (C) 2013  Samsung Electronics
  *
  * Licensed under the Academic Free License version 2.1
  * 
 #include "dbus-threads-internal.h"
 #include "dbus-bus.h"
 #include "dbus-marshal-basic.h"
+#ifdef ENABLE_KDBUS_TRANSPORT
 #include "dbus-transport-kdbus.h"
 #include <stdlib.h>
+#endif
 
 #ifdef DBUS_DISABLE_CHECKS
 #define TOOK_LOCK_CHECK(connection)
@@ -1247,8 +1250,13 @@ _dbus_connection_do_iteration_unlocked (DBusConnection *connection,
  * @param transport the transport.
  * @returns the new connection, or #NULL on failure.
 */
+#ifdef ENABLE_KDBUS_TRANSPORT
 static DBusConnection*
 _dbus_connection_new_for_transport_internal (DBusTransport *transport, dbus_bool_t exists)
+#else
+DBusConnection*
+_dbus_connection_new_for_transport (DBusTransport *transport)
+#endif
 {
   DBusConnection *connection;
   DBusWatchList *watch_list;
@@ -1359,7 +1367,9 @@ _dbus_connection_new_for_transport_internal (DBusTransport *transport, dbus_bool
 
   connection->disconnect_message_link = disconnect_link;
 
+#ifdef ENABLE_KDBUS_TRANSPORT
   if(!exists)
+#endif
   {
       CONNECTION_LOCK (connection);
 
@@ -1413,6 +1423,7 @@ _dbus_connection_new_for_transport_internal (DBusTransport *transport, dbus_bool
   return NULL;
 }
 
+#ifdef ENABLE_KDBUS_TRANSPORT
 /**
  * Creates a new connection for the given transport.  A transport
  * represents a message stream that uses some concrete mechanism, such
@@ -1433,6 +1444,7 @@ _dbus_connection_new_for_used_transport (DBusTransport *transport)
 {
     return _dbus_connection_new_for_transport_internal(transport, TRUE);
 }
+#endif
 
 /**
  * Increments the reference count of a DBusConnection.
@@ -2702,12 +2714,13 @@ free_outgoing_message (void *element,
   dbus_message_unref (message);
 }
 
-/* This is run without the mutex held, but after the last reference
- * to the connection has been dropped we should have no thread-related
- * problems
- */
+#ifdef ENABLE_KDBUS_TRANSPORT
+static void
+_dbus_connection_last_unref_internal (DBusConnection *connection, dbus_bool_t unref_transport)
+#else
 static void
 _dbus_connection_last_unref (DBusConnection *connection)
+#endif
 {
   DBusList *link;
 
@@ -2718,7 +2731,10 @@ _dbus_connection_last_unref (DBusConnection *connection)
   /* You have to disconnect the connection before unref:ing it. Otherwise
    * you won't get the disconnected message.
    */
-  _dbus_assert (!_dbus_transport_get_is_connected (connection->transport));
+#ifdef ENABLE_KDBUS_TRANSPORT
+  if(unref_transport)
+#endif
+      _dbus_assert (!_dbus_transport_get_is_connected (connection->transport));
   _dbus_assert (connection->server_guid == NULL);
   
   /* ---- We're going to call various application callbacks here, hope it doesn't break anything... */
@@ -2762,17 +2778,20 @@ _dbus_connection_last_unref (DBusConnection *connection)
   
   _dbus_list_foreach (&connection->outgoing_messages,
                       free_outgoing_message,
-                     connection);
+              connection);
   _dbus_list_clear (&connection->outgoing_messages);
   
   _dbus_list_foreach (&connection->incoming_messages,
-                     (DBusForeachFunction) dbus_message_unref,
-                     NULL);
+              (DBusForeachFunction) dbus_message_unref,
+              NULL);
   _dbus_list_clear (&connection->incoming_messages);
 
   _dbus_counter_unref (connection->outgoing_counter);
 
-  _dbus_transport_unref (connection->transport);
+#ifdef ENABLE_KDBUS_TRANSPORT
+  if(unref_transport)
+#endif
+      _dbus_transport_unref (connection->transport);
 
   if (connection->disconnect_message_link)
     {
@@ -2794,6 +2813,18 @@ _dbus_connection_last_unref (DBusConnection *connection)
   dbus_free (connection);
 }
 
+#ifdef ENABLE_KDBUS_TRANSPORT
+/* This is run without the mutex held, but after the last reference
+ * to the connection has been dropped we should have no thread-related
+ * problems
+ */
+static void
+_dbus_connection_last_unref (DBusConnection *connection)
+{
+    _dbus_connection_last_unref_internal(connection, TRUE);
+}
+#endif
+
 /**
  * Decrements the reference count of a DBusConnection, and finalizes
  * it if the count reaches zero.
@@ -2842,6 +2873,24 @@ dbus_connection_unref (DBusConnection *connection)
     }
 }
 
+#ifdef ENABLE_KDBUS_TRANSPORT
+void
+dbus_connection_unref_phantom (DBusConnection *connection)
+{
+  dbus_int32_t old_refcount;
+
+  _dbus_return_if_fail (connection != NULL);
+  _dbus_return_if_fail (connection->generation == _dbus_current_generation);
+
+  old_refcount = _dbus_atomic_dec (&connection->refcount);
+
+  _dbus_connection_trace_ref (connection, old_refcount, old_refcount - 1, "unref");
+
+  if (old_refcount == 1)
+      _dbus_connection_last_unref_internal(connection, FALSE);
+}
+#endif
+
 /*
  * Note that the transport can disconnect itself (other end drops us)
  * and in that case this function never runs. So this function must
@@ -3005,6 +3054,7 @@ dbus_connection_get_is_authenticated (DBusConnection *connection)
   return res;
 }
 
+#ifdef ENABLE_KDBUS_TRANSPORT
 /**
  * Sets authenticated status for connection. Needed for kdbus, where authentication is
  * made in different manner.
@@ -3022,6 +3072,7 @@ dbus_connection_set_is_authenticated (DBusConnection *connection)
 
   return TRUE;
 }
+#endif
 
 /**
  * Gets whether the connection is not authenticated as a specific
@@ -3262,7 +3313,7 @@ dbus_connection_send_preallocated (DBusConnection       *connection,
     }
 
 #endif
-  _dbus_verbose ("Reply sender: %s, destination: %s\n", dbus_message_get_sender(message), dbus_message_get_destination(message));  //todo kdbus temp addon
+
   _dbus_connection_send_preallocated_and_unlock (connection,
                                                 preallocated,
                                                 message, client_serial);
@@ -5181,7 +5232,6 @@ dbus_connection_get_socket(DBusConnection              *connection,
   return retval;
 }
 
-
 /**
  * Gets the UNIX user ID of the connection if known.  Returns #TRUE if
  * the uid is filled in.  Always returns #FALSE on non-UNIX platforms
@@ -5204,9 +5254,15 @@ dbus_connection_get_socket(DBusConnection              *connection,
  * @param uid return location for the user ID
  * @returns #TRUE if uid is filled in with a valid user ID
  */
+#ifdef ENABLE_KDBUS_TRANSPORT
+dbus_bool_t
+dbus_connection_get_unix_user_dbus (DBusConnection *connection,
+                               unsigned long  *uid)
+#else
 dbus_bool_t
 dbus_connection_get_unix_user (DBusConnection *connection,
                                unsigned long  *uid)
+#endif
 {
   dbus_bool_t result;
 
@@ -5240,9 +5296,15 @@ dbus_connection_get_unix_user (DBusConnection *connection,
  * @param pid return location for the process ID
  * @returns #TRUE if uid is filled in with a valid process ID
  */
+#ifdef ENABLE_KDBUS_TRANSPORT
+dbus_bool_t
+dbus_connection_get_unix_process_id_dbus (DBusConnection *connection,
+             unsigned long  *pid)
+#else
 dbus_bool_t
 dbus_connection_get_unix_process_id (DBusConnection *connection,
                                     unsigned long  *pid)
+#endif
 {
   dbus_bool_t result;
 
@@ -6335,6 +6397,7 @@ _dbus_connection_get_address (DBusConnection *connection)
   return _dbus_transport_get_address (connection->transport);
 }
 
+#ifdef ENABLE_KDBUS_TRANSPORT
 DBusTransport*
 dbus_connection_get_transport(DBusConnection *connection)
 {
@@ -6342,5 +6405,6 @@ dbus_connection_get_transport(DBusConnection *connection)
 
        return connection->transport;
 }
+#endif
 
 /** @} */