Re: [PATCH BlueZ] client: Fix using RegisterProfile

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

 



Hi,

On Thu, May 25, 2017 at 1:37 PM, Luiz Augusto von Dentz
<luiz.dentz@xxxxxxxxx> wrote:
> From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx>
>
> RegisterProfile no longer works for registering GattProfile instances
> as this functionality has been moved to RegisterApplication.
>
> In order to make this more clear this replaces the (un)register-profile
> with (un)register-application and enable ObjectManager, here is an
> example how to register for 12345678-1234-5678-1234-56789abcdef1:
>
> [bluetooth]# register-application 12345678-1234-5678-1234-56789abcdef1
> Application registered
>
> bluetoothd[8777]: src/gatt-database.c:manager_register_app() Registering application: :1.483:/
> bluetoothd[8777]: src/gatt-database.c:proxy_added_cb() Object received: /org/bluez/application, iface: org.bluez.GattProfile1
> bluetoothd[8777]: src/gatt-database.c:proxy_added_cb() Object received: /org/bluez/agent, iface: org.bluez.Agent1
> bluetoothd[8777]: src/gatt-database.c:profile_add() Added ":1.483/org/bluez/application/12345678-1234-5678-1234-56789abcdef1"
> bluetoothd[8777]: src/gatt-database.c:client_ready_cb() GATT application registered: :1.483:/
>
> [bluetooth]# unregister-application
> Application unregistered
>
> bluetoothd[8777]: src/gatt-database.c:profile_remove() Removed ":1.483/org/bluez/application/12345678-1234-5678-1234-56789abcdef1"
> bluetoothd[8777]: src/gatt-database.c:profile_release() Releasing ":1.483"
> ---
>  client/gatt.c | 94 +++++++++++++++++++++++++++++++++++++----------------------
>  client/gatt.h |  5 ++--
>  client/main.c | 13 +++++----
>  3 files changed, 68 insertions(+), 44 deletions(-)
>
> diff --git a/client/gatt.c b/client/gatt.c
> index 79bc7a3..40d3f6a 100644
> --- a/client/gatt.c
> +++ b/client/gatt.c
> @@ -37,12 +37,13 @@
>  #include <readline/history.h>
>  #include <glib.h>
>
> +#include "src/shared/queue.h"
>  #include "gdbus/gdbus.h"
>  #include "monitor/uuid.h"
>  #include "display.h"
>  #include "gatt.h"
>
> -#define PROFILE_PATH "/org/bluez/profile"
> +#define APP_PATH "/org/bluez/app"
>  #define PROFILE_INTERFACE "org.bluez.GattProfile1"
>
>  /* String display constants */
> @@ -54,6 +55,7 @@ static GList *services;
>  static GList *characteristics;
>  static GList *descriptors;
>  static GList *managers;
> +static GList *uuids;
>
>  static void print_service(GDBusProxy *proxy, const char *description)
>  {
> @@ -626,21 +628,13 @@ void gatt_notify_attribute(GDBusProxy *proxy, bool enable)
>                                                 g_dbus_proxy_get_path(proxy));
>  }
>
> -static void register_profile_setup(DBusMessageIter *iter, void *user_data)
> +static void register_app_setup(DBusMessageIter *iter, void *user_data)
>  {
> -       wordexp_t *w = user_data;
> -       DBusMessageIter uuids, opt;
> -       const char *path = PROFILE_PATH;
> -       size_t i;
> +       DBusMessageIter opt;
> +       const char *path = "/";
>
>         dbus_message_iter_append_basic(iter, DBUS_TYPE_OBJECT_PATH, &path);
>
> -       dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, "s", &uuids);
> -       for (i = 0; i < w->we_wordc; i++)
> -               dbus_message_iter_append_basic(&uuids, DBUS_TYPE_STRING,
> -                                                       &w->we_wordv[i]);
> -       dbus_message_iter_close_container(iter, &uuids);
> -
>         dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
>                                         DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
>                                         DBUS_TYPE_STRING_AS_STRING
> @@ -651,19 +645,19 @@ static void register_profile_setup(DBusMessageIter *iter, void *user_data)
>
>  }
>
> -static void register_profile_reply(DBusMessage *message, void *user_data)
> +static void register_app_reply(DBusMessage *message, void *user_data)
>  {
>         DBusError error;
>
>         dbus_error_init(&error);
>
>         if (dbus_set_error_from_message(&error, message) == TRUE) {
> -               rl_printf("Failed to register profile: %s\n", error.name);
> +               rl_printf("Failed to register application: %s\n", error.name);
>                 dbus_error_free(&error);
>                 return;
>         }
>
> -       rl_printf("Profile registered\n");
> +       rl_printf("Application registered\n");
>  }
>
>  void gatt_add_manager(GDBusProxy *proxy)
> @@ -688,7 +682,7 @@ static int match_proxy(const void *a, const void *b)
>  static DBusMessage *release_profile(DBusConnection *conn,
>                                         DBusMessage *msg, void *user_data)
>  {
> -       g_dbus_unregister_interface(conn, PROFILE_PATH, PROFILE_INTERFACE);
> +       g_dbus_unregister_interface(conn, APP_PATH, PROFILE_INTERFACE);
>
>         return dbus_message_new_method_return(msg);
>  }
> @@ -698,10 +692,33 @@ static const GDBusMethodTable methods[] = {
>         { }
>  };
>
> -void gatt_register_profile(DBusConnection *conn, GDBusProxy *proxy,
> -                                                               wordexp_t *w)
> +static gboolean get_uuids(const GDBusPropertyTable *property,
> +                                       DBusMessageIter *iter, void *data)
> +{
> +       DBusMessageIter entry;
> +       GList *uuid;
> +
> +       dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
> +                               DBUS_TYPE_STRING_AS_STRING, &entry);
> +
> +       for (uuid = uuids; uuid; uuid = g_list_next(uuid->next))
> +               dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING,
> +                                                       &uuid->data);
> +
> +       dbus_message_iter_close_container(iter, &entry);
> +
> +       return TRUE;
> +}
> +
> +static const GDBusPropertyTable properties[] = {
> +       { "UUIDs", "as", get_uuids },
> +       { }
> +};
> +
> +void gatt_register_app(DBusConnection *conn, GDBusProxy *proxy, wordexp_t *w)
>  {
>         GList *l;
> +       unsigned int i;
>
>         l = g_list_find_custom(managers, proxy, match_proxy);
>         if (!l) {
> @@ -709,23 +726,27 @@ void gatt_register_profile(DBusConnection *conn, GDBusProxy *proxy,
>                 return;
>         }
>
> -       if (g_dbus_register_interface(conn, PROFILE_PATH,
> +       if (g_dbus_register_interface(conn, APP_PATH,
>                                         PROFILE_INTERFACE, methods,
> -                                       NULL, NULL, NULL, NULL) == FALSE) {
> -               rl_printf("Failed to register profile object\n");
> +                                       NULL, properties, NULL, NULL) == FALSE) {
> +               rl_printf("Failed to register application object\n");
>                 return;
>         }
>
> -       if (g_dbus_proxy_method_call(l->data, "RegisterProfile",
> -                                               register_profile_setup,
> -                                               register_profile_reply, w,
> +       for (i = 0; i < w->we_wordc; i++)
> +               uuids = g_list_append(uuids, g_strdup(w->we_wordv[i]));
> +
> +       if (g_dbus_proxy_method_call(l->data, "RegisterApplication",
> +                                               register_app_setup,
> +                                               register_app_reply, w,
>                                                 NULL) == FALSE) {
> -               rl_printf("Failed register profile\n");
> +               rl_printf("Failed register application\n");
> +               g_dbus_unregister_interface(conn, APP_PATH, PROFILE_INTERFACE);
>                 return;
>         }
>  }
>
> -static void unregister_profile_reply(DBusMessage *message, void *user_data)
> +static void unregister_app_reply(DBusMessage *message, void *user_data)
>  {
>         DBusConnection *conn = user_data;
>         DBusError error;
> @@ -733,24 +754,27 @@ static void unregister_profile_reply(DBusMessage *message, void *user_data)
>         dbus_error_init(&error);
>
>         if (dbus_set_error_from_message(&error, message) == TRUE) {
> -               rl_printf("Failed to unregister profile: %s\n", error.name);
> +               rl_printf("Failed to unregister application: %s\n", error.name);
>                 dbus_error_free(&error);
>                 return;
>         }
>
> -       rl_printf("Profile unregistered\n");
> +       g_list_free_full(uuids, g_free);
> +       uuids = NULL;
> +
> +       rl_printf("Application unregistered\n");
>
> -       g_dbus_unregister_interface(conn, PROFILE_PATH, PROFILE_INTERFACE);
> +       g_dbus_unregister_interface(conn, APP_PATH, PROFILE_INTERFACE);
>  }
>
> -static void unregister_profile_setup(DBusMessageIter *iter, void *user_data)
> +static void unregister_app_setup(DBusMessageIter *iter, void *user_data)
>  {
> -       const char *path = PROFILE_PATH;
> +       const char *path = "/";
>
>         dbus_message_iter_append_basic(iter, DBUS_TYPE_OBJECT_PATH, &path);
>  }
>
> -void gatt_unregister_profile(DBusConnection *conn, GDBusProxy *proxy)
> +void gatt_unregister_app(DBusConnection *conn, GDBusProxy *proxy)
>  {
>         GList *l;
>
> @@ -760,9 +784,9 @@ void gatt_unregister_profile(DBusConnection *conn, GDBusProxy *proxy)
>                 return;
>         }
>
> -       if (g_dbus_proxy_method_call(l->data, "UnregisterProfile",
> -                                               unregister_profile_setup,
> -                                               unregister_profile_reply, conn,
> +       if (g_dbus_proxy_method_call(l->data, "UnregisterApplication",
> +                                               unregister_app_setup,
> +                                               unregister_app_reply, conn,
>                                                 NULL) == FALSE) {
>                 rl_printf("Failed unregister profile\n");
>                 return;
> diff --git a/client/gatt.h b/client/gatt.h
> index 7a91975..4c9fd5b 100644
> --- a/client/gatt.h
> +++ b/client/gatt.h
> @@ -41,6 +41,5 @@ void gatt_notify_attribute(GDBusProxy *proxy, bool enable);
>  void gatt_add_manager(GDBusProxy *proxy);
>  void gatt_remove_manager(GDBusProxy *proxy);
>
> -void gatt_register_profile(DBusConnection *conn, GDBusProxy *proxy,
> -                                                               wordexp_t *w);
> -void gatt_unregister_profile(DBusConnection *conn, GDBusProxy *proxy);
> +void gatt_register_app(DBusConnection *conn, GDBusProxy *proxy, wordexp_t *w);
> +void gatt_unregister_app(DBusConnection *conn, GDBusProxy *proxy);
> diff --git a/client/main.c b/client/main.c
> index 255cbd5..2f269af 100644
> --- a/client/main.c
> +++ b/client/main.c
> @@ -1814,7 +1814,7 @@ static void cmd_notify(const char *arg)
>         gatt_notify_attribute(default_attr, enable ? true : false);
>  }
>
> -static void cmd_register_profile(const char *arg)
> +static void cmd_register_app(const char *arg)
>  {
>         wordexp_t w;
>
> @@ -1831,17 +1831,17 @@ static void cmd_register_profile(const char *arg)
>                 return;
>         }
>
> -       gatt_register_profile(dbus_conn, default_ctrl->proxy, &w);
> +       gatt_register_app(dbus_conn, default_ctrl->proxy, &w);
>
>         wordfree(&w);
>  }
>
> -static void cmd_unregister_profile(const char *arg)
> +static void cmd_unregister_app(const char *arg)
>  {
>         if (check_default_ctrl() == FALSE)
>                 return;
>
> -       gatt_unregister_profile(dbus_conn, default_ctrl->proxy);
> +       gatt_unregister_app(dbus_conn, default_ctrl->proxy);
>  }
>
>  static void cmd_version(const char *arg)
> @@ -2138,9 +2138,9 @@ static const struct {
>         { "write",        "<data=[xx xx ...]>", cmd_write,
>                                                 "Write attribute value" },
>         { "notify",       "<on/off>", cmd_notify, "Notify attribute value" },
> -       { "register-profile", "<UUID ...>", cmd_register_profile,
> +       { "register-application", "<UUID ...>", cmd_register_app,
>                                                 "Register profile to connect" },
> -       { "unregister-profile", NULL, cmd_unregister_profile,
> +       { "unregister-application", NULL, cmd_unregister_app,
>                                                 "Unregister profile" },
>         { "version",      NULL,       cmd_version, "Display version" },
>         { "quit",         NULL,       cmd_quit, "Quit program" },
> @@ -2407,6 +2407,7 @@ int main(int argc, char *argv[])
>
>         main_loop = g_main_loop_new(NULL, FALSE);
>         dbus_conn = g_dbus_setup_bus(DBUS_BUS_SYSTEM, NULL, NULL);
> +       g_dbus_attach_object_manager(dbus_conn);
>
>         setlinebuf(stdout);
>         rl_attempted_completion_function = cmd_completion;
> --
> 2.9.4
>

Applied.

-- 
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