Re: [PATCH BlueZ 01/18] core: gatt: Add GattManager1 stubs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Arman,

On Sat, Feb 21, 2015 at 3:56 AM, Arman Uguray <armansito@xxxxxxxxxxxx> wrote:
> This patch introduces src/gatt-manager, which will implement the
> org.bluez.GattManager1 API outlined in doc/gatt-api.txt. The old
> src/gatt-dbus code has been removed to start from a clean slate.
> ---
>  Makefile.am        |   2 +-
>  src/adapter.c      |  18 +-
>  src/gatt-dbus.c    | 658 -----------------------------------------------------
>  src/gatt-dbus.h    |  25 --
>  src/gatt-manager.c | 121 ++++++++++
>  src/gatt-manager.h |  23 ++
>  src/gatt.c         |   5 -
>  7 files changed, 162 insertions(+), 690 deletions(-)
>  delete mode 100644 src/gatt-dbus.c
>  delete mode 100644 src/gatt-dbus.h
>  create mode 100644 src/gatt-manager.c
>  create mode 100644 src/gatt-manager.h
>
> diff --git a/Makefile.am b/Makefile.am
> index dd8cda2..c552d71 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -168,6 +168,7 @@ src_bluetoothd_SOURCES = $(builtin_sources) \
>                         src/sdpd-service.c src/sdpd-database.c \
>                         src/attrib-server.h src/attrib-server.c \
>                         src/gatt-database.h src/gatt-database.c \
> +                       src/gatt-manager.h src/gatt-manager.c \
>                         src/sdp-xml.h src/sdp-xml.c \
>                         src/sdp-client.h src/sdp-client.c \
>                         src/textfile.h src/textfile.c \
> @@ -180,7 +181,6 @@ src_bluetoothd_SOURCES = $(builtin_sources) \
>                         src/adapter.h src/adapter.c \
>                         src/profile.h src/profile.c \
>                         src/service.h src/service.c \
> -                       src/gatt-dbus.h src/gatt-dbus.c \
>                         src/gatt.h src/gatt.c \
>                         src/gatt-client.h src/gatt-client.c \
>                         src/device.h src/device.c src/attio.h \
> diff --git a/src/adapter.c b/src/adapter.c
> index 3353297..b9ec0a9 100644
> --- a/src/adapter.c
> +++ b/src/adapter.c
> @@ -72,6 +72,7 @@
>  #include "attrib/gatt.h"
>  #include "attrib-server.h"
>  #include "gatt-database.h"
> +#include "gatt-manager.h"
>  #include "eir.h"
>
>  #define ADAPTER_INTERFACE      "org.bluez.Adapter1"
> @@ -208,6 +209,7 @@ struct btd_adapter {
>         sdp_list_t *services;           /* Services associated to adapter */
>
>         struct btd_gatt_database *database;
> +       struct btd_gatt_manager *manager;
>
>         gboolean initialized;
>
> @@ -4591,6 +4593,10 @@ static void adapter_remove(struct btd_adapter *adapter)
>         adapter->db_id = 0;
>
>         btd_gatt_database_destroy(adapter->database);
> +       adapter->database = NULL;
> +
> +       btd_gatt_manager_destroy(adapter->manager);
> +       adapter->manager = NULL;
>
>         g_slist_free(adapter->pin_callbacks);
>         adapter->pin_callbacks = NULL;
> @@ -6642,8 +6648,18 @@ static int adapter_register(struct btd_adapter *adapter)
>         }
>
>         adapter->database = btd_gatt_database_new(adapter);
> -       if (!adapter->database)
> +       if (!adapter->database) {
>                 error("Failed to create GATT database for adapter");
> +               return -EINVAL;
> +       }
> +
> +       adapter->manager = btd_gatt_manager_new(adapter);
> +       if (!adapter->manager) {
> +               error("Failed to register GattManager1 interface for adapter");
> +               btd_gatt_database_destroy(adapter->database);
> +               adapter->database = NULL;
> +               return -EINVAL;
> +       }
>
>         db = btd_gatt_database_get_db(adapter->database);
>         adapter->db_id = gatt_db_register(db, services_modified,
> diff --git a/src/gatt-dbus.c b/src/gatt-dbus.c
> deleted file mode 100644
> index c22e8af..0000000
> --- a/src/gatt-dbus.c
> +++ /dev/null
> @@ -1,658 +0,0 @@
> -/*
> - *
> - *  BlueZ - Bluetooth protocol stack for Linux
> - *
> - *  Copyright (C) 2014  Instituto Nokia de Tecnologia - INdT
> - *
> - *
> - *  This program is free software; you can redistribute it and/or modify
> - *  it under the terms of the GNU General Public License as published by
> - *  the Free Software Foundation; either version 2 of the License, or
> - *  (at your option) any later version.
> - *
> - *  This program 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 General Public License for more details.
> - *
> - *  You should have received a copy of the GNU General Public License
> - *  along with this program; if not, write to the Free Software
> - *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
> - *
> - */
> -
> -#ifdef HAVE_CONFIG_H
> -#include <config.h>
> -#endif
> -
> -#include <stdint.h>
> -#include <errno.h>
> -
> -#include <glib.h>
> -#include <dbus/dbus.h>
> -#include <gdbus/gdbus.h>
> -
> -#include "adapter.h"
> -#include "device.h"
> -#include "lib/uuid.h"
> -#include "dbus-common.h"
> -#include "log.h"
> -
> -#include "error.h"
> -#include "attrib/gattrib.h"
> -#include "attrib/att.h"
> -#include "attrib/gatt.h"
> -#include "gatt.h"
> -#include "gatt-dbus.h"
> -
> -#define GATT_MGR_IFACE                 "org.bluez.GattManager1"
> -#define GATT_SERVICE_IFACE             "org.bluez.GattService1"
> -#define GATT_CHR_IFACE                 "org.bluez.GattCharacteristic1"
> -#define GATT_DESCRIPTOR_IFACE          "org.bluez.GattDescriptor1"
> -
> -struct external_service {
> -       char *owner;
> -       char *path;
> -       DBusMessage *reg;
> -       GDBusClient *client;
> -       GSList *proxies;
> -       struct btd_attribute *service;
> -};
> -
> -struct proxy_write_data {
> -       btd_attr_write_result_t result_cb;
> -       void *user_data;
> -};
> -
> -/*
> - * Attribute to Proxy hash table. Used to map incoming
> - * ATT operations to its external characteristic proxy.
> - */
> -static GHashTable *proxy_hash;
> -
> -static GSList *external_services;
> -
> -static int external_service_path_cmp(gconstpointer a, gconstpointer b)
> -{
> -       const struct external_service *esvc = a;
> -       const char *path = b;
> -
> -       return g_strcmp0(esvc->path, path);
> -}
> -
> -static gboolean external_service_destroy(void *user_data)
> -{
> -       struct external_service *esvc = user_data;
> -
> -       g_dbus_client_unref(esvc->client);
> -
> -       if (esvc->reg)
> -               dbus_message_unref(esvc->reg);
> -
> -       g_free(esvc->owner);
> -       g_free(esvc->path);
> -       g_free(esvc);
> -
> -       return FALSE;
> -}
> -
> -static void external_service_free(void *user_data)
> -{
> -       struct external_service *esvc = user_data;
> -
> -       /*
> -        * Set callback to NULL to avoid potential race condition
> -        * when calling remove_service and GDBusClient unref.
> -        */
> -       g_dbus_client_set_disconnect_watch(esvc->client, NULL, NULL);
> -
> -       external_service_destroy(user_data);
> -}
> -
> -static void remove_service(DBusConnection *conn, void *user_data)
> -{
> -       struct external_service *esvc = user_data;
> -
> -       external_services = g_slist_remove(external_services, esvc);
> -
> -       if (esvc->service)
> -               btd_gatt_remove_service(esvc->service);
> -
> -       /*
> -        * Do not run in the same loop, this may be a disconnect
> -        * watch call and GDBusClient should not be destroyed.
> -        */
> -       g_idle_add(external_service_destroy, esvc);
> -}
> -
> -static int proxy_path_cmp(gconstpointer a, gconstpointer b)
> -{
> -       GDBusProxy *proxy1 = (GDBusProxy *) a;
> -       GDBusProxy *proxy2 = (GDBusProxy *) b;
> -       const char *path1 = g_dbus_proxy_get_path(proxy1);
> -       const char *path2 = g_dbus_proxy_get_path(proxy2);
> -
> -       return g_strcmp0(path1, path2);
> -}
> -
> -static uint8_t flags_string2int(const char *proper)
> -{
> -       uint8_t value;
> -
> -       /* Regular Properties: See core spec 4.1 page 2183 */
> -       if (!strcmp("broadcast", proper))
> -               value = GATT_CHR_PROP_BROADCAST;
> -       else if (!strcmp("read", proper))
> -               value = GATT_CHR_PROP_READ;
> -       else if (!strcmp("write-without-response", proper))
> -               value = GATT_CHR_PROP_WRITE_WITHOUT_RESP;
> -       else if (!strcmp("write", proper))
> -               value = GATT_CHR_PROP_WRITE;
> -       else if (!strcmp("notify", proper))
> -               value = GATT_CHR_PROP_NOTIFY;
> -       else if (!strcmp("indicate", proper))
> -               value = GATT_CHR_PROP_INDICATE;
> -       else if (!strcmp("authenticated-signed-writes", proper))
> -               value = GATT_CHR_PROP_AUTH;
> -       else
> -               value = 0;
> -
> -       /* TODO: Extended properties. Ref core spec 4.1 page 2185  */
> -
> -       return value;
> -}
> -
> -static uint8_t flags_get_bitmask(DBusMessageIter *iter)
> -{
> -       DBusMessageIter istr;
> -       uint8_t propmask = 0, prop;
> -       const char *str;
> -
> -       if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY)
> -               goto fail;
> -
> -       dbus_message_iter_recurse(iter, &istr);
> -
> -       do {
> -               if (dbus_message_iter_get_arg_type(&istr) != DBUS_TYPE_STRING)
> -                       goto fail;
> -
> -               dbus_message_iter_get_basic(&istr, &str);
> -               prop = flags_string2int(str);
> -               if (!prop)
> -                       goto fail;
> -
> -               propmask |= prop;
> -       } while (dbus_message_iter_next(&istr));
> -
> -       return propmask;
> -
> -fail:
> -       error("Characteristic Flags: Invalid argument!");
> -
> -       return 0;
> -}
> -
> -static void proxy_added(GDBusProxy *proxy, void *user_data)
> -{
> -       struct external_service *esvc = user_data;
> -       const char *interface, *path;
> -
> -       interface = g_dbus_proxy_get_interface(proxy);
> -       path = g_dbus_proxy_get_path(proxy);
> -
> -       if (!g_str_has_prefix(path, esvc->path))
> -               return;
> -
> -       if (g_strcmp0(interface, GATT_CHR_IFACE) != 0 &&
> -                       g_strcmp0(interface, GATT_SERVICE_IFACE) != 0 &&
> -                       g_strcmp0(interface, GATT_DESCRIPTOR_IFACE) != 0)
> -               return;
> -
> -       DBG("path %s iface %s", path, interface);
> -
> -       /*
> -        * Object path follows a hierarchical organization. Add the
> -        * proxies sorted by path helps the logic to register the
> -        * object path later.
> -        */
> -       esvc->proxies = g_slist_insert_sorted(esvc->proxies, proxy,
> -                                                       proxy_path_cmp);
> -}
> -
> -static void proxy_removed(GDBusProxy *proxy, void *user_data)
> -{
> -       struct external_service *esvc = user_data;
> -       const char *interface, *path;
> -
> -       interface = g_dbus_proxy_get_interface(proxy);
> -       path = g_dbus_proxy_get_path(proxy);
> -
> -       DBG("path %s iface %s", path, interface);
> -
> -       esvc->proxies = g_slist_remove(esvc->proxies, proxy);
> -}
> -
> -static void proxy_read_cb(struct btd_attribute *attr,
> -                               btd_attr_read_result_t result, void *user_data)
> -{
> -       DBusMessageIter iter, array;
> -       GDBusProxy *proxy;
> -       uint8_t *value;
> -       int len;
> -
> -       /*
> -        * Remote device is trying to read the informed attribute,
> -        * "Value" should be read from the proxy. GDBusProxy tracks
> -        * properties changes automatically, it is not necessary to
> -        * get the value directly from the GATT server.
> -        */
> -       proxy = g_hash_table_lookup(proxy_hash, attr);
> -       if (!proxy) {
> -               result(-ENOENT, NULL, 0, user_data);
> -               return;
> -       }
> -
> -       if (!g_dbus_proxy_get_property(proxy, "Value", &iter)) {
> -               /* Unusual situation, read property will checked earlier */
> -               result(-EPERM, NULL, 0, user_data);
> -               return;
> -       }
> -
> -       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY) {
> -               DBG("External service inconsistent!");
> -               result(-EPERM, NULL, 0, user_data);
> -               return;
> -       }
> -
> -       dbus_message_iter_recurse(&iter, &array);
> -       dbus_message_iter_get_fixed_array(&array, &value, &len);
> -
> -       DBG("attribute: %p read %d bytes", attr, len);
> -
> -       result(0, value, len, user_data);
> -}
> -
> -static void proxy_write_reply(const DBusError *derr, void *user_data)
> -{
> -       struct proxy_write_data *wdata = user_data;
> -       int err;
> -
> -       /*
> -        * Security requirements shall be handled by the core. If external
> -        * applications returns an error, the reasons will be restricted to
> -        * invalid argument or application specific errors.
> -        */
> -
> -       if (!dbus_error_is_set(derr)) {
> -               err = 0;
> -               goto done;
> -       }
> -
> -       DBG("Write reply: %s", derr->message);
> -
> -       if (dbus_error_has_name(derr, DBUS_ERROR_NO_REPLY))
> -               err = -ETIMEDOUT;
> -       else if (dbus_error_has_name(derr, ERROR_INTERFACE ".InvalidArguments"))
> -               err = -EINVAL;
> -       else
> -               err = -EPROTO;
> -
> -done:
> -       if (wdata && wdata->result_cb)
> -               wdata->result_cb(err, wdata->user_data);
> -}
> -
> -static void proxy_write_cb(struct btd_attribute *attr,
> -                                       const uint8_t *value, size_t len,
> -                                       btd_attr_write_result_t result,
> -                                       void *user_data)
> -{
> -       GDBusProxy *proxy;
> -
> -       proxy = g_hash_table_lookup(proxy_hash, attr);
> -       if (!proxy) {
> -               result(-ENOENT, user_data);
> -               return;
> -       }
> -
> -       /*
> -        * "result" callback defines if the core wants to receive the
> -        * operation result, allowing to select ATT Write Request or Write
> -        * Command. Descriptors requires Write Request operation. For
> -        * Characteristics, the implementation will define which operations
> -        * are allowed based on the properties/flags.
> -        * TODO: Write Long Characteristics/Descriptors.
> -        */
> -
> -       if (result) {
> -               struct proxy_write_data *wdata;
> -
> -               wdata = g_new0(struct proxy_write_data, 1);
> -               wdata->result_cb = result;
> -               wdata->user_data = user_data;
> -
> -               if (!g_dbus_proxy_set_property_array(proxy, "Value",
> -                                               DBUS_TYPE_BYTE, value, len,
> -                                               proxy_write_reply,
> -                                               wdata, g_free)) {
> -                       g_free(wdata);
> -                       result(-ENOENT, user_data);
> -               }
> -       } else {
> -               /*
> -                * Caller is not interested in the Set method call result.
> -                * This flow implements the ATT Write Command scenario, where
> -                * the remote doesn't receive ATT response.
> -                */
> -               g_dbus_proxy_set_property_array(proxy, "Value", DBUS_TYPE_BYTE,
> -                                               value, len, proxy_write_reply,
> -                                               NULL, NULL);
> -       }
> -
> -       DBG("Server: Write attribute callback %s",
> -                                       g_dbus_proxy_get_path(proxy));
> -
> -}
> -
> -static int register_external_service(struct external_service *esvc,
> -                                                       GDBusProxy *proxy)
> -{
> -       DBusMessageIter iter;
> -       const char *str, *path, *iface;
> -       bt_uuid_t uuid;
> -
> -       path = g_dbus_proxy_get_path(proxy);
> -       iface = g_dbus_proxy_get_interface(proxy);
> -       if (g_strcmp0(esvc->path, path) != 0 ||
> -                       g_strcmp0(iface, GATT_SERVICE_IFACE) != 0)
> -               return -EINVAL;
> -
> -       if (!g_dbus_proxy_get_property(proxy, "UUID", &iter))
> -               return -EINVAL;
> -
> -       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
> -               return -EINVAL;
> -
> -       dbus_message_iter_get_basic(&iter, &str);
> -
> -       if (bt_string_to_uuid(&uuid, str) < 0)
> -               return -EINVAL;
> -
> -       esvc->service = btd_gatt_add_service(&uuid);
> -       if (!esvc->service)
> -               return -EINVAL;
> -
> -       return 0;
> -}
> -
> -static int add_char(GDBusProxy *proxy, const bt_uuid_t *uuid)
> -{
> -       DBusMessageIter iter;
> -       struct btd_attribute *attr;
> -       btd_attr_write_t write_cb;
> -       btd_attr_read_t read_cb;
> -       uint8_t propmask = 0;
> -
> -       /*
> -        * Optional property. If is not informed, read and write
> -        * procedures will be allowed. Upper-layer should handle
> -        * characteristic requirements.
> -        */
> -       if (g_dbus_proxy_get_property(proxy, "Flags", &iter))
> -               propmask = flags_get_bitmask(&iter);
> -       else
> -               propmask = GATT_CHR_PROP_WRITE_WITHOUT_RESP
> -                                               | GATT_CHR_PROP_WRITE
> -                                               | GATT_CHR_PROP_READ;
> -       if (!propmask)
> -               return -EINVAL;
> -
> -       if (propmask & GATT_CHR_PROP_READ)
> -               read_cb = proxy_read_cb;
> -       else
> -               read_cb = NULL;
> -
> -       if (propmask & (GATT_CHR_PROP_WRITE | GATT_CHR_PROP_WRITE_WITHOUT_RESP))
> -               write_cb = proxy_write_cb;
> -       else
> -               write_cb = NULL;
> -
> -       attr = btd_gatt_add_char(uuid, propmask, read_cb, write_cb);
> -       if (!attr)
> -               return -ENOMEM;
> -
> -       g_hash_table_insert(proxy_hash, attr, g_dbus_proxy_ref(proxy));
> -
> -       return 0;
> -}
> -
> -static int add_char_desc(GDBusProxy *proxy, const bt_uuid_t *uuid)
> -{
> -       struct btd_attribute *attr;
> -
> -       attr = btd_gatt_add_char_desc(uuid, proxy_read_cb, proxy_write_cb);
> -       if (!attr)
> -               return -ENOMEM;
> -
> -       g_hash_table_insert(proxy_hash, attr, g_dbus_proxy_ref(proxy));
> -
> -       return 0;
> -}
> -
> -static int register_external_characteristics(GSList *proxies)
> -
> -{
> -       GSList *list;
> -
> -       for (list = proxies; list; list = g_slist_next(list)) {
> -               GDBusProxy *proxy = list->data;
> -               DBusMessageIter iter;
> -               bt_uuid_t uuid;
> -               const char *path, *iface, *str;
> -               int ret;
> -
> -               /* Mandatory property */
> -               if (!g_dbus_proxy_get_property(proxy, "UUID", &iter))
> -                       return -EINVAL;
> -
> -               if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
> -                       return -EINVAL;
> -
> -               dbus_message_iter_get_basic(&iter, &str);
> -
> -               if (bt_string_to_uuid(&uuid, str) < 0)
> -                       return -EINVAL;
> -
> -               iface = g_dbus_proxy_get_interface(proxy);
> -               path = g_dbus_proxy_get_path(proxy);
> -
> -               if (!strcmp(GATT_CHR_IFACE, iface))
> -                       ret = add_char(proxy, &uuid);
> -               else
> -                       ret = add_char_desc(proxy, &uuid);
> -
> -               if (ret < 0)
> -                       return ret;
> -
> -               DBG("Added GATT: %s (%s)", path, str);
> -       }
> -
> -       return 0;
> -}
> -
> -static void client_ready(GDBusClient *client, void *user_data)
> -{
> -       struct external_service *esvc = user_data;
> -       GDBusProxy *proxy;
> -       DBusConnection *conn = btd_get_dbus_connection();
> -       DBusMessage *reply;
> -
> -       if (!esvc->proxies)
> -               goto fail;
> -
> -       proxy = esvc->proxies->data;
> -       if (register_external_service(esvc, proxy) < 0)
> -               goto fail;
> -
> -       if (register_external_characteristics(g_slist_next(esvc->proxies)) < 0)
> -               goto fail;
> -
> -       DBG("Added GATT service %s", esvc->path);
> -
> -       reply = dbus_message_new_method_return(esvc->reg);
> -       g_dbus_send_message(conn, reply);
> -
> -       dbus_message_unref(esvc->reg);
> -       esvc->reg = NULL;
> -
> -       return;
> -
> -fail:
> -       error("Could not register external service: %s", esvc->path);
> -
> -       /*
> -        * Set callback to NULL to avoid potential race condition
> -        * when calling remove_service and GDBusClient unref.
> -        */
> -       g_dbus_client_set_disconnect_watch(esvc->client, NULL, NULL);
> -
> -       remove_service(conn, esvc);
> -
> -       reply = btd_error_invalid_args(esvc->reg);
> -       g_dbus_send_message(conn, reply);
> -}
> -
> -static struct external_service *external_service_new(DBusConnection *conn,
> -                                       DBusMessage *msg, const char *path)
> -{
> -       struct external_service *esvc;
> -       GDBusClient *client;
> -       const char *sender = dbus_message_get_sender(msg);
> -
> -       client = g_dbus_client_new(conn, sender, "/");
> -       if (!client)
> -               return NULL;
> -
> -       esvc = g_new0(struct external_service, 1);
> -       esvc->owner = g_strdup(sender);
> -       esvc->reg = dbus_message_ref(msg);
> -       esvc->client = client;
> -       esvc->path = g_strdup(path);
> -
> -       g_dbus_client_set_disconnect_watch(client, remove_service, esvc);
> -
> -       g_dbus_client_set_proxy_handlers(client, proxy_added, proxy_removed,
> -                                                               NULL, esvc);
> -
> -       g_dbus_client_set_ready_watch(client, client_ready, esvc);
> -
> -       return esvc;
> -}
> -
> -static DBusMessage *register_service(DBusConnection *conn,
> -                                       DBusMessage *msg, void *user_data)
> -{
> -       struct external_service *esvc;
> -       DBusMessageIter iter;
> -       const char *path;
> -
> -       if (!dbus_message_iter_init(msg, &iter))
> -               return btd_error_invalid_args(msg);
> -
> -       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_OBJECT_PATH)
> -               return btd_error_invalid_args(msg);
> -
> -       dbus_message_iter_get_basic(&iter, &path);
> -
> -       if (g_slist_find_custom(external_services, path,
> -                                               external_service_path_cmp))
> -               return btd_error_already_exists(msg);
> -
> -       esvc = external_service_new(conn, msg, path);
> -       if (!esvc)
> -               return btd_error_failed(msg, "Not enough resources");
> -
> -       external_services = g_slist_prepend(external_services, esvc);
> -
> -       DBG("New service %p: %s", esvc, path);
> -
> -       return NULL;
> -}
> -
> -static DBusMessage *unregister_service(DBusConnection *conn,
> -                                       DBusMessage *msg, void *user_data)
> -{
> -       struct external_service *esvc;
> -       DBusMessageIter iter;
> -       const char *path;
> -       GSList *list;
> -
> -       if (!dbus_message_iter_init(msg, &iter))
> -               return btd_error_invalid_args(msg);
> -
> -       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_OBJECT_PATH)
> -               return btd_error_invalid_args(msg);
> -
> -       dbus_message_iter_get_basic(&iter, &path);
> -
> -       list = g_slist_find_custom(external_services, path,
> -                                               external_service_path_cmp);
> -       if (!list)
> -               return btd_error_does_not_exist(msg);
> -
> -       esvc = list->data;
> -       if (!strcmp(dbus_message_get_sender(msg), esvc->owner))
> -               return btd_error_does_not_exist(msg);
> -
> -       /*
> -        * Set callback to NULL to avoid potential race condition
> -        * when calling remove_service and GDBusClient unref.
> -        */
> -       g_dbus_client_set_disconnect_watch(esvc->client, NULL, NULL);
> -
> -       remove_service(conn, esvc);
> -
> -       return dbus_message_new_method_return(msg);
> -}
> -
> -static const GDBusMethodTable methods[] = {
> -       { GDBUS_EXPERIMENTAL_ASYNC_METHOD("RegisterService",
> -                               GDBUS_ARGS({ "service", "o"},
> -                                               { "options", "a{sv}"}),
> -                               NULL, register_service) },
> -       { GDBUS_EXPERIMENTAL_METHOD("UnregisterService",
> -                               GDBUS_ARGS({"service", "o"}),
> -                               NULL, unregister_service) },
> -       { }
> -};
> -
> -gboolean gatt_dbus_manager_register(void)
> -{
> -       if (!g_dbus_register_interface(btd_get_dbus_connection(),
> -                               "/org/bluez", GATT_MGR_IFACE,
> -                               methods, NULL, NULL, NULL, NULL))
> -               return FALSE;
> -
> -       proxy_hash = g_hash_table_new_full(g_direct_hash, g_direct_equal,
> -                               NULL, (GDestroyNotify) g_dbus_proxy_unref);
> -
> -       return TRUE;
> -}
> -
> -void gatt_dbus_manager_unregister(void)
> -{
> -       /* We might not have initialized if experimental features are
> -        * not enabled.
> -        */
> -       if (!proxy_hash)
> -               return;
> -
> -       g_hash_table_destroy(proxy_hash);
> -       proxy_hash = NULL;
> -
> -       g_slist_free_full(external_services, external_service_free);
> -
> -       g_dbus_unregister_interface(btd_get_dbus_connection(), "/org/bluez",
> -                                                       GATT_MGR_IFACE);
> -}
> diff --git a/src/gatt-dbus.h b/src/gatt-dbus.h
> deleted file mode 100644
> index 310cfa9..0000000
> --- a/src/gatt-dbus.h
> +++ /dev/null
> @@ -1,25 +0,0 @@
> -/*
> - *
> - *  BlueZ - Bluetooth protocol stack for Linux
> - *
> - *  Copyright (C) 2014  Instituto Nokia de Tecnologia - INdT
> - *
> - *
> - *  This program is free software; you can redistribute it and/or modify
> - *  it under the terms of the GNU General Public License as published by
> - *  the Free Software Foundation; either version 2 of the License, or
> - *  (at your option) any later version.
> - *
> - *  This program 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 General Public License for more details.
> - *
> - *  You should have received a copy of the GNU General Public License
> - *  along with this program; if not, write to the Free Software
> - *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
> - *
> - */
> -
> -gboolean gatt_dbus_manager_register(void);
> -void gatt_dbus_manager_unregister(void);
> diff --git a/src/gatt-manager.c b/src/gatt-manager.c
> new file mode 100644
> index 0000000..296eabc
> --- /dev/null
> +++ b/src/gatt-manager.c
> @@ -0,0 +1,121 @@
> +/*
> + *
> + *  BlueZ - Bluetooth protocol stack for Linux
> + *
> + *  Copyright (C) 2014  Instituto Nokia de Tecnologia - INdT
> + *  Copyright (C) 2015  Google Inc.
> + *
> + *
> + *  This program is free software; you can redistribute it and/or modify
> + *  it under the terms of the GNU General Public License as published by
> + *  the Free Software Foundation; either version 2 of the License, or
> + *  (at your option) any later version.
> + *
> + *  This program 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 General Public License for more details.
> + *
> + */
> +
> +#ifdef HAVE_CONFIG_H
> +#include <config.h>
> +#endif
> +
> +#include <stdint.h>
> +
> +#include <dbus/dbus.h>
> +#include <gdbus/gdbus.h>
> +
> +#include "adapter.h"
> +#include "gatt-manager.h"
> +#include "dbus-common.h"
> +#include "log.h"
> +#include "error.h"
> +#include "src/shared/queue.h"
> +#include "src/shared/util.h"
> +
> +#define GATT_MANAGER_IFACE     "org.bluez.GattManager1"
> +
> +struct btd_gatt_manager {
> +       struct btd_adapter *adapter;
> +};
> +
> +static DBusMessage *manager_register_service(DBusConnection *conn,
> +                                       DBusMessage *msg, void *user_data)
> +{
> +       DBG("RegisterService");
> +
> +       /* TODO */
> +       return NULL;
> +}
> +
> +static DBusMessage *manager_unregister_service(DBusConnection *conn,
> +                                       DBusMessage *msg, void *user_data)
> +{
> +       DBG("UnregisterService");
> +
> +       /* TODO */
> +       return NULL;
> +}
> +
> +static const GDBusMethodTable manager_methods[] = {
> +       { GDBUS_EXPERIMENTAL_ASYNC_METHOD("RegisterService",
> +                       GDBUS_ARGS({ "service", "o" }, { "options", "a{sv}" }),
> +                       NULL, manager_register_service) },
> +       { GDBUS_EXPERIMENTAL_ASYNC_METHOD("UnregisterService",
> +                                       GDBUS_ARGS({ "service", "o" }),
> +                                       NULL, manager_unregister_service) },
> +       { }
> +};
> +
> +static struct btd_gatt_manager *manager_create(struct btd_adapter *adapter)
> +{
> +       struct btd_gatt_manager *manager;
> +
> +       manager = new0(struct btd_gatt_manager, 1);
> +       if (!manager)
> +               return NULL;
> +
> +       manager->adapter = adapter;
> +
> +       if (!g_dbus_register_interface(btd_get_dbus_connection(),
> +                                               adapter_get_path(adapter),
> +                                               GATT_MANAGER_IFACE,
> +                                               manager_methods, NULL, NULL,
> +                                               manager, NULL)) {
> +               error("Failed to register " GATT_MANAGER_IFACE);
> +               free(manager);
> +               return NULL;
> +       }
> +
> +       return manager;
> +}
> +
> +struct btd_gatt_manager *btd_gatt_manager_new(struct btd_adapter *adapter)
> +{
> +       struct btd_gatt_manager *manager;
> +
> +       if (!adapter)
> +               return NULL;
> +
> +       manager = manager_create(adapter);
> +       if (!manager)
> +               return NULL;
> +
> +       DBG("GATT Manager registered for adapter: %s",
> +                                               adapter_get_path(adapter));
> +
> +       return manager;
> +}
> +
> +void btd_gatt_manager_destroy(struct btd_gatt_manager *manager)
> +{
> +       if (!manager)
> +               return;
> +
> +       g_dbus_unregister_interface(btd_get_dbus_connection(),
> +                                       adapter_get_path(manager->adapter),
> +                                       GATT_MANAGER_IFACE);
> +       free(manager);
> +}
> diff --git a/src/gatt-manager.h b/src/gatt-manager.h
> new file mode 100644
> index 0000000..9573341
> --- /dev/null
> +++ b/src/gatt-manager.h
> @@ -0,0 +1,23 @@
> +/*
> + *
> + *  BlueZ - Bluetooth protocol stack for Linux
> + *
> + *  Copyright (C) 2015  Google Inc.
> + *
> + *
> + *  This program is free software; you can redistribute it and/or modify
> + *  it under the terms of the GNU General Public License as published by
> + *  the Free Software Foundation; either version 2 of the License, or
> + *  (at your option) any later version.
> + *
> + *  This program 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 General Public License for more details.
> + *
> + */
> +
> +struct btd_gatt_manager;
> +
> +struct btd_gatt_manager *btd_gatt_manager_new(struct btd_adapter *adapter);
> +void btd_gatt_manager_destroy(struct btd_gatt_manager *manager);
> diff --git a/src/gatt.c b/src/gatt.c
> index df5ea1d..9e7de6f 100644
> --- a/src/gatt.c
> +++ b/src/gatt.c
> @@ -34,7 +34,6 @@
>  #include "attrib/att.h"
>  #include "src/shared/util.h"
>
> -#include "gatt-dbus.h"
>  #include "gatt.h"
>
>  /* Common GATT UUIDs */
> @@ -309,13 +308,9 @@ struct btd_attribute *btd_gatt_add_char_desc(const bt_uuid_t *uuid,
>  void gatt_init(void)
>  {
>         DBG("Starting GATT server");
> -
> -       gatt_dbus_manager_register();
>  }
>
>  void gatt_cleanup(void)
>  {
>         DBG("Stopping GATT server");
> -
> -       gatt_dbus_manager_unregister();
>  }

We could remove these functions don't we? They are just printing, and
even what they are printing is bogus since it doesn't what it says.



-- 
Luiz Augusto von Dentz
--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux