Hi Vinicius,

On 01/22/2013 03:43 PM, Vinicius Costa Gomes wrote:
This patch adds the initial callbacks to track when BlueZ connects or
disconnects from the system bus. And tracks the interfaces added or
removed.
---
  plugins/bluez5.h        |  3 ++-
  plugins/hfp_hf_bluez5.c | 72 ++++++++++++++++++++++++++++++++++++++++++-------
  2 files changed, 65 insertions(+), 10 deletions(-)

diff --git a/plugins/bluez5.h b/plugins/bluez5.h
index 01ecfe8..893072f 100644
--- a/plugins/bluez5.h
+++ b/plugins/bluez5.h
@@ -19,7 +19,8 @@
   *
   */

-#define        BLUEZ_SERVICE "org.bluez"
+#define BLUEZ_SERVICE                  "org.bluez"
+#define BLUEZ_MANAGER_PATH             "/"
  #define BLUEZ_PROFILE_INTERFACE               BLUEZ_SERVICE ".Profile1"
  #define BLUEZ_ERROR_INTERFACE         BLUEZ_SERVICE ".Error"

diff --git a/plugins/hfp_hf_bluez5.c b/plugins/hfp_hf_bluez5.c
index e024838..c5c5cd7 100644
--- a/plugins/hfp_hf_bluez5.c
+++ b/plugins/hfp_hf_bluez5.c
@@ -42,6 +42,8 @@

  #define HFP_EXT_PROFILE_PATH   "/bluetooth/profile/hfp_hf"

+static GDBusClient *bluez = NULL;
+
  static int hfp_probe(struct ofono_modem *modem)
  {
        DBG("modem: %p", modem);
@@ -143,6 +145,60 @@ static const GDBusMethodTable profile_methods[] = {
        { }
  };

+static void connect_handler(DBusConnection *conn, void *user_data)
+{
+       DBG("Registering External Profile handler ...");
+
+       if (!g_dbus_register_interface(conn, HFP_EXT_PROFILE_PATH,
+                                       BLUEZ_PROFILE_INTERFACE,
+                                       profile_methods, NULL,
+                                       NULL, NULL, NULL)) {

We just performed this operation in hfp_init, why are we doing it again here?

+               ofono_error("Register Profile interface failed: %s",
+                                               HFP_EXT_PROFILE_PATH);
+       }
+
+       bluetooth_register_profile(conn, HFP_HS_UUID, "hfp_hf",
+                                                  HFP_EXT_PROFILE_PATH);

You have a whitespace violation here, mixing tabs & spaces.

+}
+
+static void disconnect_handler(DBusConnection *conn, void *user_data)
+{
+
+       DBG("Unregistering External Profile handler ...");
+
+       g_dbus_unregister_interface(conn, HFP_EXT_PROFILE_PATH,
+                                               BLUEZ_PROFILE_INTERFACE);

Why do we bother?  Should we not leave this always registered?

+}
+
+static void proxy_added(GDBusProxy *proxy, void *user_data)
+{
+       const char *path;
+
+       path = g_dbus_proxy_get_path(proxy);
+
+       DBG("Device proxy: %s(%p)", path, proxy);
+}
+
+static void proxy_removed(GDBusProxy *proxy, void *user_data)
+{
+       const char *path;
+
+       path = g_dbus_proxy_get_path(proxy);
+
+       DBG("Device proxy: %s(%p)", path, proxy);
+}
+
+static void property_changed(GDBusProxy *proxy, const char *name,
+                                       DBusMessageIter *iter, void *user_data)
+{
+       const char *interface, *path;
+
+       interface = g_dbus_proxy_get_interface(proxy);
+       path = g_dbus_proxy_get_path(proxy);
+
+       DBG("path: %s interface: %s", path, interface);
+}
+
  static int hfp_init(void)
  {
        DBusConnection *conn = ofono_dbus_get_connection();
@@ -161,19 +217,16 @@ static int hfp_init(void)
                return -EIO;
        }

-       err = ofono_modem_driver_register(&hfp_driver);
-       if (err<  0) {
-               g_dbus_unregister_interface(conn, HFP_EXT_PROFILE_PATH,
-                                               BLUEZ_PROFILE_INTERFACE);
-               return err;
-       }
+       bluez = g_dbus_client_new(conn, BLUEZ_SERVICE, BLUEZ_MANAGER_PATH);
+       g_dbus_client_set_connect_watch(bluez, connect_handler, NULL);
+       g_dbus_client_set_disconnect_watch(bluez, disconnect_handler, NULL);
+       g_dbus_client_set_proxy_handlers(bluez, proxy_added, proxy_removed,
+                                               property_changed, NULL);

Error handling here is all messed up. ofono_modem_driver_register operation might still fail below and you never destroy the 'bluez' object in that case.


-       err = bluetooth_register_profile(conn, HFP_HS_UUID, "hfp_hf",
-                                               HFP_EXT_PROFILE_PATH);
+       err = ofono_modem_driver_register(&hfp_driver);
        if (err<  0) {
                g_dbus_unregister_interface(conn, HFP_EXT_PROFILE_PATH,
                                                BLUEZ_PROFILE_INTERFACE);
-               ofono_modem_driver_unregister(&hfp_driver);
                return err;
        }

@@ -188,6 +241,7 @@ static void hfp_exit(void)
        g_dbus_unregister_interface(conn, HFP_EXT_PROFILE_PATH,
                                                BLUEZ_PROFILE_INTERFACE);
        ofono_modem_driver_unregister(&hfp_driver);
+       g_dbus_client_unref(bluez);
  }

  OFONO_PLUGIN_DEFINE(hfp_bluez5, "External Hands-Free Profile Plugin", VERSION,

Regards,
-Denis
_______________________________________________
ofono mailing list
ofono@ofono.org
http://lists.ofono.org/listinfo/ofono

Reply via email to