driver.c revision e55fd2c6706e41f6933e1656ac3da7527ee2514f
1aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson/* -*- mode: C; c-file-style: "gnu" -*- */
2c414488fe62605ebda5e875fc2db05c6b3dd199fHavoc Pennington/* driver.c  Bus client (driver)
3aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson *
4aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * Copyright (C) 2003  CodeFactory AB
5aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson *
6aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * Licensed under the Academic Free License version 1.2
7aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson *
8aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * This program is free software; you can redistribute it and/or modify
9aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * it under the terms of the GNU General Public License as published by
10aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * the Free Software Foundation; either version 2 of the License, or
11aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * (at your option) any later version.
12aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson *
13aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * This program is distributed in the hope that it will be useful,
14aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * but WITHOUT ANY WARRANTY; without even the implied warranty of
15aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * GNU General Public License for more details.
17aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson *
18aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * You should have received a copy of the GNU General Public License
19aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * along with this program; if not, write to the Free Software
20aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson *
22aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson */
23aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
24f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson#include "activation.h"
25aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include "connection.h"
26aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include "driver.h"
2739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson#include "dispatch.h"
28aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include "services.h"
2902dfd4fb3427a6afef6b9b99d39de6248a20e0cbAnders Carlsson#include "utils.h"
30aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include <dbus/dbus-string.h>
3139dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson#include <dbus/dbus-internals.h>
32aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson#include <string.h>
33aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
3429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t bus_driver_send_welcome_message (DBusConnection *connection,
3529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                                    DBusMessage    *hello_message,
3629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                                    BusTransaction *transaction,
3729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                                    DBusError      *error);
3829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
3929560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
4029560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_driver_send_service_deleted (const char     *service_name,
4129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 BusTransaction *transaction,
4229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBusError      *error)
43a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson{
4439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson  DBusMessage *message;
4529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
4690ed1d84588a84697051e643175452c50d682eceHavoc Pennington
4790ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
4829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
49ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  _dbus_verbose ("sending service deleted: %s\n", service_name);
503f4086f0fdd1cc7fc03585ec9f750897fb3c1d55Anders Carlsson
5129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  message = dbus_message_new (DBUS_SERVICE_BROADCAST,
5229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_MESSAGE_SERVICE_DELETED);
5329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (message == NULL)
5429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
5529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
5629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
5729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
5839dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
5929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS) ||
6029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      !dbus_message_append_args (message,
6129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBUS_TYPE_STRING, service_name,
6229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 0))
6329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
6429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
6529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
6629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
6729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
6839dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
6929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = bus_dispatch_broadcast_message (transaction, message, error);
7029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_message_unref (message);
7129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
7229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
73a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson}
74a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson
7529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
7629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonbus_driver_send_service_created (const char     *service_name,
7729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 BusTransaction *transaction,
7829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBusError      *error)
79a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson{
80a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson  DBusMessage *message;
8129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
8290ed1d84588a84697051e643175452c50d682eceHavoc Pennington
8390ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
8429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
8529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  message = dbus_message_new (DBUS_SERVICE_BROADCAST,
8629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_MESSAGE_SERVICE_CREATED);
8729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (message == NULL)
8829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
8929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
9029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
9129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
92a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson
9329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS))
9429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
9529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
9629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
9729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
9829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
9902dfd4fb3427a6afef6b9b99d39de6248a20e0cbAnders Carlsson
10029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_append_args (message,
10129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBUS_TYPE_STRING, service_name,
10229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 0))
10329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
10429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
10529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
10629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
10729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
10829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
10929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = bus_dispatch_broadcast_message (transaction, message, error);
110a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson  dbus_message_unref (message);
11129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
11229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
113a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson}
114a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson
11529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
116ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_send_service_lost (DBusConnection *connection,
11729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington			      const char     *service_name,
11829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              BusTransaction *transaction,
11929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBusError      *error)
120ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{
121ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusMessage *message;
122ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
12390ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
12490ed1d84588a84697051e643175452c50d682eceHavoc Pennington
12529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  message = dbus_message_new (bus_connection_get_name (connection),
12629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_MESSAGE_SERVICE_LOST);
12729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (message == NULL)
12829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
12929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
13029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
13129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
132ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
13329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS))
13429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
13529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
13629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
13729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
13829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
139ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
14029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_append_args (message,
14129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBUS_TYPE_STRING, service_name,
14229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 0))
14329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
14429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
14529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
14629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
14729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
14829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
14929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!bus_transaction_send_message (transaction, connection, message))
15029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
15129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
15229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
15329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
15429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
15529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
15629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
15729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
15829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return TRUE;
15929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
160ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson}
161ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
16229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
163ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_send_service_acquired (DBusConnection *connection,
16429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  const char     *service_name,
16529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  BusTransaction *transaction,
16629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  DBusError      *error)
167ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{
168ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusMessage *message;
169ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
17090ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
17190ed1d84588a84697051e643175452c50d682eceHavoc Pennington
17229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  message = dbus_message_new (bus_connection_get_name (connection),
17329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_MESSAGE_SERVICE_ACQUIRED);
17429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (message == NULL)
17529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
17629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
17729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
17829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
179ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
18029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS))
18129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
18229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
18329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
18429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
18529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
186ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
18729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_append_args (message,
18829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBUS_TYPE_STRING, service_name,
18929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 0))
19029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
19129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
19229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
19329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
19429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
19529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
19629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!bus_transaction_send_message (transaction, connection, message))
19729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
19829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
19929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
20029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
20129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
20229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
20329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
20429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (message);
20529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return TRUE;
20629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
207ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson}
208ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
209aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonstatic dbus_bool_t
2106ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtoncreate_unique_client_name (BusRegistry *registry,
2116ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington                           DBusString  *str)
212aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{
213d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  /* We never want to use the same unique client name twice, because
214d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   * we want to guarantee that if you send a message to a given unique
215d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   * name, you always get the same application. So we use two numbers
216d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   * for INT_MAX * INT_MAX combinations, should be pretty safe against
217d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   * wraparound.
218d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington   */
219d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  static int next_major_number = 0;
220d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  static int next_minor_number = 0;
221d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  int len;
222aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
223aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  len = _dbus_string_get_length (str);
224aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
225d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington  while (TRUE)
226aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson    {
227d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      /* start out with 1-0, go to 1-1, 1-2, 1-3,
228d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington       * up to 1-MAXINT, then 2-0, 2-1, etc.
229d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington       */
230d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      if (next_minor_number <= 0)
231d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        {
232d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington          next_major_number += 1;
233d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington          next_minor_number = 0;
234d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington          if (next_major_number <= 0)
235d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington            _dbus_assert_not_reached ("INT_MAX * INT_MAX clients were added");
236d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        }
237d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
238d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      _dbus_assert (next_major_number > 0);
239d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      _dbus_assert (next_minor_number >= 0);
240d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
241d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      /* appname:MAJOR-MINOR */
242d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
243d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      if (!_dbus_string_append (str, ":"))
244d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        return FALSE;
245d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
246d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      if (!_dbus_string_append_int (str, next_major_number))
247d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        return FALSE;
248d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
249d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      if (!_dbus_string_append (str, "-"))
250d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        return FALSE;
251d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
252d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      if (!_dbus_string_append_int (str, next_minor_number))
253d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington        return FALSE;
254d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington
255d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      next_minor_number += 1;
256aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
257aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson      /* Check if a client with the name exists */
2586ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      if (bus_registry_lookup (registry, str) == NULL)
259aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson	break;
260aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
261d6d50a29945ded04a17b3f42a3a1074449250ec0Havoc Pennington      /* drop the number again, try the next one. */
262aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson      _dbus_string_set_length (str, len);
263aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson    }
264aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
265aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  return TRUE;
266aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson}
267aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
26829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
269a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlssonbus_driver_handle_hello (DBusConnection *connection,
27029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                         BusTransaction *transaction,
27129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                         DBusMessage    *message,
27229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                         DBusError      *error)
273aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{
274aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  DBusString unique_name;
275aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  BusService *service;
27629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
2776ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusRegistry *registry;
27890ed1d84588a84697051e643175452c50d682eceHavoc Pennington
27990ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
28029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
281fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington  if (!_dbus_string_init (&unique_name))
28229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
28329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
28429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
28529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
286f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
28729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = FALSE;
2886ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
2896ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  registry = bus_connection_get_registry (connection);
29029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
2916ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  if (!create_unique_client_name (registry, &unique_name))
29229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
29329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
29429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out_0;
29529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
29697ee8d189948c9f2c86464ca33f82e6daeaedc72Anders Carlsson
29729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!bus_connection_set_name (connection, &unique_name))
29829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
29929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
30029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out_0;
30129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
30229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
30329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_set_sender (message,
30429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                bus_connection_get_name (connection)))
30529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
30629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
30729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out_0;
30829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
309d5ad082fecbbd803fd89b3574ac137b3fa964bc7Anders Carlsson
31029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!bus_driver_send_welcome_message (connection, message, transaction, error))
31129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    goto out_0;
31297ee8d189948c9f2c86464ca33f82e6daeaedc72Anders Carlsson
313aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  /* Create the service */
3146ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  service = bus_registry_ensure (registry,
3156ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington                                 &unique_name, connection, transaction, error);
31629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (service == NULL)
31729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    goto out_0;
318ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
31929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  bus_service_set_prohibit_replacement (service, TRUE);
320aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
32129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = TRUE;
32229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
32329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out_0:
324aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  _dbus_string_free (&unique_name);
32529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
326aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson}
327aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
32829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
329aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlssonbus_driver_send_welcome_message (DBusConnection *connection,
33029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBusMessage    *hello_message,
33129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 BusTransaction *transaction,
33229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBusError      *error)
333aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{
334aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  DBusMessage *welcome;
335aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  const char *name;
33690ed1d84588a84697051e643175452c50d682eceHavoc Pennington
33790ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
338aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
339aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  name = bus_connection_get_name (connection);
340aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  _dbus_assert (name != NULL);
341aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
34229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  welcome = dbus_message_new_reply (hello_message);
34329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (welcome == NULL)
34429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
34529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
34629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
34729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
34839dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
34929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_set_sender (welcome, DBUS_SERVICE_DBUS))
35029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
35129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (welcome);
35229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
35329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
35429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
355f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
35629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_append_args (welcome,
35729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBUS_TYPE_STRING, name,
35829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 NULL))
35929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
36029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (welcome);
36129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
36229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
36329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
36429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
36529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!bus_transaction_send_message (transaction, connection, welcome))
36629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
36729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (welcome);
36829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
36929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
37029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
37129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
37229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
37329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (welcome);
37429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return TRUE;
37529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
376aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson}
377aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
37829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
379a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlssonbus_driver_handle_list_services (DBusConnection *connection,
38029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 BusTransaction *transaction,
38129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBusMessage    *message,
38229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBusError      *error)
383a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson{
384a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson  DBusMessage *reply;
38529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  int len;
386a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson  char **services;
3876ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusRegistry *registry;
38890ed1d84588a84697051e643175452c50d682eceHavoc Pennington
38990ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
3906ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
3916ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  registry = bus_connection_get_registry (connection);
3926ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
39329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  reply = dbus_message_new_reply (message);
39429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply == NULL)
39529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
39629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
39729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
39829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
399a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson
4006ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  if (!bus_registry_list_services (registry, &services, &len))
40129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
40229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (reply);
40329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
40429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
40529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
40629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
40729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_append_args (reply,
40829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBUS_TYPE_STRING_ARRAY, services, len,
40929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 0))
41029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
41129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_free_string_array (services);
41229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (reply);
41329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
41429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
41529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
41639dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
41729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_free_string_array (services);
41829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
41929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!bus_transaction_send_message (transaction, connection, reply))
420a1a53c32422230fb76e8e3bca67c877dd2857563Havoc Pennington    {
42129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (reply);
42229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
42329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
42429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
42529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
42629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
42729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_message_unref (reply);
42829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return TRUE;
429a1a53c32422230fb76e8e3bca67c877dd2857563Havoc Pennington    }
430a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson}
431a16e83f45d33ae5f3bd5966416c57c8ad4448ae8Anders Carlsson
43229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
43334e6c6ff31e0bd27bf18c0e3c68b3a1ea9f0448dAnders Carlssonbus_driver_handle_acquire_service (DBusConnection *connection,
43429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                   BusTransaction *transaction,
43529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                   DBusMessage    *message,
43629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                   DBusError      *error)
437aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson{
438ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusMessage *reply;
439aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  DBusString service_name;
440ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  BusService *service;
441ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  char *name;
442ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  int service_reply;
443ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  int flags;
44429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
44529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusConnection *old_owner;
44629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusConnection *current_owner;
4476ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusRegistry *registry;
44890ed1d84588a84697051e643175452c50d682eceHavoc Pennington
44990ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
4506ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
4516ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  registry = bus_connection_get_registry (connection);
452ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
45329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_get_args (message,
45429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              error,
45529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_STRING, &name,
45629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_UINT32, &flags,
45729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              0))
45829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    return FALSE;
459ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
46029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _dbus_verbose ("Trying to own service %s with flags 0x%x\n", name, flags);
461aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
46229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = FALSE;
46329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  reply = NULL;
464aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
465aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson  _dbus_string_init_const (&service_name, name);
46629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
4676ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  service = bus_registry_lookup (registry, &service_name);
468ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
46929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (service != NULL)
47029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    old_owner = bus_service_get_primary_owner (service);
47129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
47229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    old_owner = NULL;
473aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
47429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  reply = dbus_message_new_reply (message);
47529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply == NULL)
47629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
47729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
47829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
479ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson    }
48029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
48129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (service == NULL)
482ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson    {
4836ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      service = bus_registry_ensure (registry,
4846ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington                                     &service_name, connection, transaction, error);
48529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      if (service == NULL)
48629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        goto out;
48729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
48829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
48929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  current_owner = bus_service_get_primary_owner (service);
49029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
49129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (old_owner == NULL)
49229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
49329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      _dbus_assert (current_owner == connection);
49429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
495ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson      bus_service_set_prohibit_replacement (service,
49629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington					    (flags & DBUS_SERVICE_FLAG_PROHIBIT_REPLACEMENT));
49729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
49829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      service_reply = DBUS_SERVICE_REPLY_PRIMARY_OWNER;
49929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
50029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else if (old_owner == connection)
50129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    service_reply = DBUS_SERVICE_REPLY_ALREADY_OWNER;
50229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else if (!((flags & DBUS_SERVICE_FLAG_REPLACE_EXISTING)))
50329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    service_reply = DBUS_SERVICE_REPLY_SERVICE_EXISTS;
50429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else if (bus_service_get_prohibit_replacement (service))
50529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
50629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      /* Queue the connection */
50729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      if (!bus_service_add_owner (service, connection,
50829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  transaction, error))
50929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        goto out;
510ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
51129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      service_reply = DBUS_SERVICE_REPLY_IN_QUEUE;
51229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
51329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
51429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
51529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      /* Replace the current owner */
51629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
51729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      /* We enqueue the new owner and remove the first one because
51829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington       * that will cause ServiceAcquired and ServiceLost messages to
51929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington       * be sent.
52029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington       */
521ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
52229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      /* FIXME this is broken, if the remove_owner fails
52329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington       * we don't undo the add_owner
52429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington       * (easiest fix is probably to move all this to
52529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington       * services.c and have a single routine for it)
52629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington       */
52729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
52829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      if (!bus_service_add_owner (service, connection,
52929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  transaction, error))
53029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        goto out;
53129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
53229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      if (!bus_service_remove_owner (service, old_owner,
53329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                     transaction, error))
53429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        goto out;
53529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
53629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      _dbus_assert (connection == bus_service_get_primary_owner (service));
537ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson      service_reply = DBUS_SERVICE_REPLY_PRIMARY_OWNER;
538ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson    }
539ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
54029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_append_args (reply, DBUS_TYPE_UINT32, service_reply, 0))
54129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
54229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
54329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
54429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
545ba60374e251cca8fe351b7dd4def595069323885James Willcox
54629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!bus_transaction_send_message (transaction, connection, reply))
54729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
54829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
54929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
55029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
55129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
55229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = TRUE;
55329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
55429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out:
555ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  dbus_free (name);
55629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply)
55729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    dbus_message_unref (reply);
55829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
55929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
560aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson
56129560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
562ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_handle_service_exists (DBusConnection *connection,
56329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  BusTransaction *transaction,
56429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  DBusMessage    *message,
56529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                  DBusError      *error)
566ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{
567ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusMessage *reply;
568ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  DBusString service_name;
569ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  BusService *service;
570ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson  char *name;
57129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
5726ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusRegistry *registry;
57390ed1d84588a84697051e643175452c50d682eceHavoc Pennington
57490ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
5756ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
5766ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  registry = bus_connection_get_registry (connection);
57739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
57829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_get_args (message, error,
57929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_STRING, &name,
58029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              0))
58129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    return FALSE;
582ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
58329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = FALSE;
58429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
585aa4b4ef5955606659557a40a2220090ee9c108d4Anders Carlsson  _dbus_string_init_const (&service_name, name);
5866ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  service = bus_registry_lookup (registry, &service_name);
587ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
58829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  reply = dbus_message_new_reply (message);
58929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply == NULL)
59029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
59129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
59229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
59329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
59429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
59529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_set_sender (reply, DBUS_SERVICE_DBUS))
59629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
59729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
59829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
59929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
60029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
60129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_append_args (reply,
60229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 DBUS_TYPE_UINT32, service != NULL,
60329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                 0))
60429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
60529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
60629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
60729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
60829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
60929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!bus_transaction_send_message (transaction, connection, reply))
61029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
61129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (error);
61229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
61329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
61429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
61529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = TRUE;
61629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
61729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out:
61829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (reply)
61929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    dbus_message_unref (reply);
620aa4b4ef5955606659557a40a2220090ee9c108d4Anders Carlsson  dbus_free (name);
62129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
62229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
623aff24a72c18a43dbb6f2d85e6d2226a3c2ea8f10Anders Carlsson}
62439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
62529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
626f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlssonbus_driver_handle_activate_service (DBusConnection *connection,
62729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                    BusTransaction *transaction,
62829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                    DBusMessage    *message,
62929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                    DBusError      *error)
630f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson{
631f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson  dbus_uint32_t flags;
632f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson  char *name;
63329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t retval;
6346ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusActivation *activation;
6356ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
63690ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
63790ed1d84588a84697051e643175452c50d682eceHavoc Pennington
6386ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  activation = bus_connection_get_activation (connection);
639f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
64029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (!dbus_message_get_args (message, error,
64129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_STRING, &name,
64229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              DBUS_TYPE_UINT32, &flags,
64329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                              0))
64429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    return FALSE;
645f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
64629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = FALSE;
647f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
648e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  if (!bus_activation_activate_service (activation, connection, transaction,
649e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington                                        message, name, error))
65029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    goto out;
65129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
65229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  retval = TRUE;
65329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
65429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out:
65529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_free (name);
65629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return retval;
657f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson}
658f116b1282f8482dff6dc797f64270d95f79b53a3Anders Carlsson
65929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/* For speed it might be useful to sort this in order of
66029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * frequency of use (but doesn't matter with only a few items
66129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * anyhow)
66229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */
66329560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstruct
66429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
66529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  const char *name;
66629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_bool_t (* handler) (DBusConnection *connection,
66729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           BusTransaction *transaction,
66829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           DBusMessage    *message,
66929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           DBusError      *error);
67029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} message_handlers[] = {
67129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  { DBUS_MESSAGE_ACQUIRE_SERVICE, bus_driver_handle_acquire_service },
67229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  { DBUS_MESSAGE_ACTIVATE_SERVICE, bus_driver_handle_activate_service },
67329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  { DBUS_MESSAGE_HELLO, bus_driver_handle_hello },
67429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  { DBUS_MESSAGE_SERVICE_EXISTS, bus_driver_handle_service_exists },
67529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  { DBUS_MESSAGE_LIST_SERVICES, bus_driver_handle_list_services }
67629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington};
67729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
67829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
67939dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlssonbus_driver_handle_message (DBusConnection *connection,
68029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           BusTransaction *transaction,
68129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington			   DBusMessage    *message,
68229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                           DBusError      *error)
68339dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson{
68439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson  const char *name, *sender;
68529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  int i;
68690ed1d84588a84697051e643175452c50d682eceHavoc Pennington
68790ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
68829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
68939dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson  _dbus_verbose ("Driver got a message: %s\n",
69039dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson		 dbus_message_get_name (message));
69139dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
69239dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson  name = dbus_message_get_name (message);
69339dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson  sender = dbus_message_get_sender (message);
69439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
69539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson  if (sender == NULL && (strcmp (name, DBUS_MESSAGE_HELLO) != 0))
69639dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson    {
69729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
69829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                      "Client tried to send a message other than %s without being registered",
69929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                      DBUS_MESSAGE_HELLO);
70029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
70139dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson      dbus_connection_disconnect (connection);
70229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
70329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
70429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
70529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  i = 0;
70629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  while (i < _DBUS_N_ELEMENTS (message_handlers))
70729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
70829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      if (strcmp (message_handlers[i].name, name) == 0)
70929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        {
71029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          if ((* message_handlers[i].handler) (connection, transaction, message, error))
71129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington            return TRUE;
71229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          else
71329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington            return FALSE;
71429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        }
71529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
71629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      ++i;
71729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
71829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
71929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_set_error (error, DBUS_ERROR_UNKNOWN_MESSAGE,
72029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                  "%s does not understand message %s",
72129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                  DBUS_SERVICE_DBUS, name);
72229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
72329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return FALSE;
724ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson}
725ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
726ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonvoid
727ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlssonbus_driver_remove_connection (DBusConnection *connection)
728ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson{
72929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  /* FIXME Does nothing for now, should unregister the connection
73029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * with the bus driver.
73129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   */
73239dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson}
733