2003-04-02 Havoc Pennington <hp@redhat.com>
[platform/upstream/dbus.git] / bus / activation.c
index c7d08ba..0dfce3f 100644 (file)
@@ -2,6 +2,7 @@
 /* activation.c  Activation of services
  *
  * Copyright (C) 2003  CodeFactory AB
+ * Copyright (C) 2003  Red Hat, Inc.
  *
  * Licensed under the Academic Free License version 1.2
  * 
@@ -119,6 +120,8 @@ add_desktop_file_entry (BusActivation  *activation,
   char *name, *exec;
   BusActivationEntry *entry;
 
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
+  
   name = NULL;
   exec = NULL;
   entry = NULL;
@@ -194,19 +197,21 @@ load_directory (BusActivation *activation,
   DBusString full_path;
   BusDesktopFile *desktop_file;
   DBusError tmp_error;
+
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
   
   _dbus_string_init_const (&dir, directory);
 
   iter = NULL;
   desktop_file = NULL;
   
-  if (!_dbus_string_init (&filename, _DBUS_INT_MAX))
+  if (!_dbus_string_init (&filename))
     {
       BUS_SET_OOM (error);
       return FALSE;
     }
 
-  if (!_dbus_string_init (&full_path, _DBUS_INT_MAX))
+  if (!_dbus_string_init (&full_path))
     {
       BUS_SET_OOM (error);
       _dbus_string_free (&filename);
@@ -240,10 +245,8 @@ load_directory (BusActivation *activation,
       
       if (!_dbus_string_ends_with_c_str (&filename, ".service"))
        {
-          const char *filename_c;
-          _dbus_string_get_const_data (&filename, &filename_c);
           _dbus_verbose ("Skipping non-.service file %s\n",
-                         filename_c);
+                         _dbus_string_get_const_data (&filename));
           continue;
        }
       
@@ -251,11 +254,8 @@ load_directory (BusActivation *activation,
 
       if (desktop_file == NULL)
        {
-         const char *full_path_c;
-
-          _dbus_string_get_const_data (&full_path, &full_path_c);
-         
-         _dbus_verbose ("Could not load %s: %s\n", full_path_c,
+         _dbus_verbose ("Could not load %s: %s\n",
+                         _dbus_string_get_const_data (&full_path),
                         tmp_error.message);
 
           if (dbus_error_has_name (&tmp_error, DBUS_ERROR_NO_MEMORY))
@@ -270,15 +270,11 @@ load_directory (BusActivation *activation,
 
       if (!add_desktop_file_entry (activation, desktop_file, &tmp_error))
        {
-         const char *full_path_c;
-
           bus_desktop_file_free (desktop_file);
           desktop_file = NULL;
-          
-          _dbus_string_get_const_data (&full_path, &full_path_c);
          
          _dbus_verbose ("Could not add %s to activation entry list: %s\n",
-                         full_path_c, tmp_error.message);
+                         _dbus_string_get_const_data (&full_path), tmp_error.message);
 
           if (dbus_error_has_name (&tmp_error, DBUS_ERROR_NO_MEMORY))
             {
@@ -319,14 +315,16 @@ load_directory (BusActivation *activation,
 }
 
 BusActivation*
-bus_activation_new (BusContext  *context,
-                   const char  *address,
-                    const char **directories,
-                    DBusError   *error)
+bus_activation_new (BusContext        *context,
+                   const DBusString  *address,
+                    DBusList         **directories,
+                    DBusError         *error)
 {
-  int i;
   BusActivation *activation;
-
+  DBusList *link;
+  
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
+  
   activation = dbus_new0 (BusActivation, 1);
   if (activation == NULL)
     {
@@ -337,9 +335,7 @@ bus_activation_new (BusContext  *context,
   activation->refcount = 1;
   activation->context = context;
   
-  /* FIXME: We should split up the server addresses. */
-  activation->server_address = _dbus_strdup (address);
-  if (activation->server_address == NULL)
+  if (!_dbus_string_copy_data (address, &activation->server_address))
     {
       BUS_SET_OOM (error);
       goto failed;
@@ -363,12 +359,12 @@ bus_activation_new (BusContext  *context,
     }
   
   /* Load service files */
-  i = 0;
-  while (directories[i] != NULL)
+  link = _dbus_list_get_first_link (directories);
+  while (link != NULL)
     {
-      if (!load_directory (activation, directories[i], error))
+      if (!load_directory (activation, link->data, error))
         goto failed;
-      ++i;
+      link = _dbus_list_get_next_link (directories, link);
     }
 
   return activation;
@@ -417,13 +413,16 @@ child_setup (void *data)
 }
 
 dbus_bool_t
-bus_activation_service_created (BusActivation *activation,
-                               const char    *service_name,
-                               DBusError     *error)
+bus_activation_service_created (BusActivation  *activation,
+                               const char     *service_name,
+                                BusTransaction *transaction,
+                               DBusError      *error)
 {
   BusPendingActivation *pending_activation;
   DBusMessage *message;
   DBusList *link;
+
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
   
   /* Check if it's a pending activation */
   pending_activation = _dbus_hash_table_lookup_string (activation->pending_activations, service_name);
@@ -446,7 +445,8 @@ bus_activation_service_created (BusActivation *activation,
              goto error;
            }
 
-         if (!dbus_message_append_args (message,
+         if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS) ||
+              !dbus_message_append_args (message,
                                         DBUS_TYPE_UINT32, DBUS_ACTIVATION_REPLY_ACTIVATED,
                                         0))
            {
@@ -454,8 +454,8 @@ bus_activation_service_created (BusActivation *activation,
              BUS_SET_OOM (error);
              goto error;
            }
-
-         if (!dbus_connection_send (entry->connection, message, NULL))
+          
+         if (!bus_transaction_send_message (transaction, entry->connection, message))
            {
              dbus_message_unref (message);
              BUS_SET_OOM (error);
@@ -481,6 +481,7 @@ bus_activation_service_created (BusActivation *activation,
 dbus_bool_t
 bus_activation_activate_service (BusActivation  *activation,
                                 DBusConnection *connection,
+                                 BusTransaction *transaction,
                                 DBusMessage    *activation_message,
                                  const char     *service_name,
                                 DBusError      *error)
@@ -492,6 +493,8 @@ bus_activation_activate_service (BusActivation  *activation,
   DBusString service_str;
   char *argv[2];
   dbus_bool_t retval;
+
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
   
   entry = _dbus_hash_table_lookup_string (activation->entries, service_name);
 
@@ -515,7 +518,8 @@ bus_activation_activate_service (BusActivation  *activation,
          return FALSE;
        }
 
-      if (!dbus_message_append_args (message,
+      if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS) ||
+          !dbus_message_append_args (message,
                                     DBUS_TYPE_UINT32, DBUS_ACTIVATION_REPLY_ALREADY_ACTIVE, 
                                     0))
        {
@@ -524,7 +528,7 @@ bus_activation_activate_service (BusActivation  *activation,
          return FALSE;
        }
 
-      retval = dbus_connection_send (connection, message, NULL);
+      retval = bus_transaction_send_message (transaction, connection, message);
       dbus_message_unref (message);
       if (!retval)
        BUS_SET_OOM (error);
@@ -548,7 +552,7 @@ bus_activation_activate_service (BusActivation  *activation,
   pending_activation = _dbus_hash_table_lookup_string (activation->pending_activations, service_name);
   if (pending_activation)
     {
-      if (!_dbus_list_append (&pending_activation->entries, entry))
+      if (!_dbus_list_append (&pending_activation->entries, pending_activation_entry))
        {
          BUS_SET_OOM (error);
          bus_pending_activation_entry_free (pending_activation_entry);
@@ -574,7 +578,7 @@ bus_activation_activate_service (BusActivation  *activation,
          return FALSE;
        }
 
-      if (!_dbus_list_append (&pending_activation->entries, entry))
+      if (!_dbus_list_append (&pending_activation->entries, pending_activation_entry))
        {
          BUS_SET_OOM (error);
          bus_pending_activation_free (pending_activation);