* Gustavo F. Padovan <[email protected]> [2010-02-08 16:53:00 -0200]:

> Now we have send_method_call_with_reply, for DBus messages that needs a
> reply. A timeout callback was added to this funcion too.
> The other funcion is called send_method_call with no timeout or reply
> parameters.
> ---
>  plugins/hfp.c |  102 
> ++++++++++++++++++++++++++++++++++++++++-----------------
>  1 files changed, 72 insertions(+), 30 deletions(-)
> 
> diff --git a/plugins/hfp.c b/plugins/hfp.c
> index 02258b9..6d32899 100644
> --- a/plugins/hfp.c
> +++ b/plugins/hfp.c
> @@ -186,11 +186,9 @@ static void cmer_cb(gboolean ok, GAtResult *result, 
> gpointer user_data)
>  
>  static int send_method_call(const char *dest, const char *path,
>                               const char *interface, const char *method,
> -                             DBusPendingCallNotifyFunction cb,
> -                             void *user_data, int type, ...)
> +                             int type, ...)
>  {
>       DBusMessage *msg;
> -     DBusPendingCall *call;
>       va_list args;
>  
>       msg = dbus_message_new_method_call(dest, path, interface, method);
> @@ -209,11 +207,36 @@ static int send_method_call(const char *dest, const 
> char *path,
>  
>       va_end(args);
>  
> -     if (!cb) {
> -             g_dbus_send_message(connection, msg);
> -             return 0;
> +     g_dbus_send_message(connection, msg);
> +     return 0;
> +}
> +
> +static int send_method_call_with_reply(const char *dest, const char *path,
> +                             const char *interface, const char *method,
> +                             DBusPendingCallNotifyFunction cb,
> +                             void *user_data, void *timeout_cb, int timeout,
> +                             void *timeout_data, int type, ...)
> +{
> +     DBusMessage *msg;
> +     DBusPendingCall *call;
> +     va_list args;
> +
> +     msg = dbus_message_new_method_call(dest, path, interface, method);
> +     if (!msg) {
> +             ofono_error("Unable to allocate new D-Bus %s message", method);
> +             return -ENOMEM;
> +     }
> +
> +     va_start(args, type);
> +
> +     if (!dbus_message_append_args_valist(msg, type, args)) {
> +             dbus_message_unref(msg);
> +             va_end(args);
> +             return -EIO;
>       }
>  
> +     va_end(args);
> +
>       if (!dbus_connection_send_with_reply(connection, msg, &call, -1)) {
>               ofono_error("Sending %s failed", method);
>               dbus_message_unref(msg);
> @@ -224,6 +247,9 @@ static int send_method_call(const char *dest, const char 
> *path,
>       dbus_pending_call_unref(call);
>       dbus_message_unref(msg);
>  
> +     if (timeout_data)
> +             g_timeout_add_seconds(timeout, timeout_cb, timeout_data);
> +
>       return 0;
>  }
>  
> @@ -603,10 +629,10 @@ static void list_devices_cb(DBusPendingCall *call, 
> gpointer user_data)
>       }
>  
>       for (i = 0 ; i < num ; i++) {
> -             ret = send_method_call(BLUEZ_SERVICE, device[i],
> +             ret = send_method_call_with_reply(BLUEZ_SERVICE, device[i],
>                               BLUEZ_DEVICE_INTERFACE, "GetProperties",
> -                             get_properties_cb, (void *)device[i],
> -                             DBUS_TYPE_INVALID);
> +                             get_properties_cb, (void *)device[i], NULL, 0,
> +                             NULL, DBUS_TYPE_INVALID);
>               if (ret < 0)
>                       ofono_error("GetProperties failed(%d)", ret);
>       }
> @@ -624,9 +650,9 @@ static gboolean adapter_added(DBusConnection *connection, 
> DBusMessage *message,
>       dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &path,
>                               DBUS_TYPE_INVALID);
>  
> -     ret = send_method_call(BLUEZ_SERVICE, path,
> +     ret = send_method_call_with_reply(BLUEZ_SERVICE, path,
>                       BLUEZ_ADAPTER_INTERFACE, "ListDevices",
> -                     list_devices_cb, NULL,
> +                     list_devices_cb, NULL, NULL, 0, NULL,
>                       DBUS_TYPE_INVALID);
>  
>       if (ret < 0)
> @@ -695,9 +721,9 @@ static void list_adapters_cb(DBusPendingCall *call, 
> gpointer user_data)
>       }
>  
>       for (i = 0 ; i < num ; i++) {
> -             ret = send_method_call(BLUEZ_SERVICE, adapter[i],
> +             ret = send_method_call_with_reply(BLUEZ_SERVICE, adapter[i],
>                               BLUEZ_ADAPTER_INTERFACE, "ListDevices",
> -                             list_devices_cb, NULL,
> +                             list_devices_cb, NULL, NULL, 0, NULL,
>                               DBUS_TYPE_INVALID);
>  
>               if (ret < 0)
> @@ -712,9 +738,9 @@ done:
>  
>  static int hfp_load_modems()
>  {
> -     return send_method_call(BLUEZ_SERVICE, "/",
> +     return send_method_call_with_reply(BLUEZ_SERVICE, "/",
>                               BLUEZ_MANAGER_INTERFACE, "ListAdapters",
> -                             list_adapters_cb, NULL,
> +                             list_adapters_cb, NULL, NULL, 0, NULL,
>                               DBUS_TYPE_INVALID);
>  }
>  
> @@ -727,8 +753,8 @@ static int hfp_register_ofono_handsfree(struct 
> ofono_modem *modem)
>  
>       return send_method_call(BLUEZ_SERVICE, data->handsfree_path,
>                               BLUEZ_GATEWAY_INTERFACE, "RegisterAgent",
> -                             NULL, NULL, DBUS_TYPE_OBJECT_PATH,
> -                             &obj_path, DBUS_TYPE_INVALID);
> +                             DBUS_TYPE_OBJECT_PATH, &obj_path,
> +                             DBUS_TYPE_INVALID);
>  }
>  
>  static int hfp_unregister_ofono_handsfree(struct ofono_modem *modem)
> @@ -740,8 +766,8 @@ static int hfp_unregister_ofono_handsfree(struct 
> ofono_modem *modem)
>  
>       return send_method_call(BLUEZ_SERVICE, data->handsfree_path,
>                               BLUEZ_GATEWAY_INTERFACE, "UnregisterAgent",
> -                             NULL, NULL, DBUS_TYPE_OBJECT_PATH,
> -                             &obj_path, DBUS_TYPE_INVALID);
> +                             DBUS_TYPE_OBJECT_PATH, &obj_path,
> +                             DBUS_TYPE_INVALID);
>  }
>  
>  static int hfp_probe(struct ofono_modem *modem)
> @@ -774,15 +800,20 @@ static void hfp_remove(struct ofono_modem *modem)
>       ofono_modem_set_data(modem, NULL);
>  }
>  
> -static int hfp_connect_ofono_handsfree(struct ofono_modem *modem)
> +static void hfp_connect_failed(DBusPendingCall *call, gpointer user_data)
>  {
> -     struct hfp_data *data = ofono_modem_get_data(modem);
> +     DBusError derr;
> +     DBusMessage *reply;
>  
> -     ofono_debug("Connect to bluetooth daemon");
> +     reply = dbus_pending_call_steal_reply(call);
>  
> -     return send_method_call(BLUEZ_SERVICE, data->handsfree_path,
> -                             BLUEZ_GATEWAY_INTERFACE, "Connect",
> -                             NULL, NULL, DBUS_TYPE_INVALID);
> +     dbus_error_init(&derr);
> +     if (dbus_set_error_from_message(&derr, reply)) {
> +             ofono_debug("Connect reply: %s", derr.message);
> +             dbus_error_free(&derr);
> +     }
> +
> +     dbus_message_unref(reply);
>  }
>  
>  static gboolean hfp_enable_timeout(gpointer user_data)
> @@ -796,20 +827,30 @@ static gboolean hfp_enable_timeout(gpointer user_data)
>  
>       ret = send_method_call(BLUEZ_SERVICE, data->handsfree_path,
>                               BLUEZ_GATEWAY_INTERFACE, "Disconnect",
> -                             NULL, NULL, DBUS_TYPE_INVALID);
> +                             DBUS_TYPE_INVALID);
>       if (ret < 0)
>               ofono_error("Disconnect failed(%d)", ret);
>  
>       return FALSE;
>  }
>  
> +static int hfp_connect_ofono_handsfree(struct ofono_modem *modem)
> +{
> +     struct hfp_data *data = ofono_modem_get_data(modem);
> +
> +     ofono_debug("Connect to bluetooth daemon");
> +
> +     return send_method_call_with_reply(BLUEZ_SERVICE, data->handsfree_path,
> +                             BLUEZ_GATEWAY_INTERFACE, "Connect",
> +                             hfp_connect_failed, NULL, hfp_enable_timeout,
> +                             15, modem, DBUS_TYPE_INVALID);
> +}
> +
>  /* power up hardware */
>  static int hfp_enable(struct ofono_modem *modem)
>  {
>       DBG("%p", modem);
>  
> -     g_timeout_add_seconds(15, hfp_enable_timeout, modem);
> -
>       if (hfp_connect_ofono_handsfree(modem) < 0)
>               return -EINVAL;
>  
> @@ -841,9 +882,10 @@ static int hfp_disconnect_ofono_handsfree(struct 
> ofono_modem *modem)
>  {
>       struct hfp_data *data = ofono_modem_get_data(modem);
>  
> -     return send_method_call(BLUEZ_SERVICE, data->handsfree_path,
> +     return send_method_call_with_reply(BLUEZ_SERVICE, data->handsfree_path,
>                               BLUEZ_GATEWAY_INTERFACE, "Disconnect",
> -                             hfp_power_down, modem, DBUS_TYPE_INVALID);
> +                             hfp_power_down, modem, NULL, 0, NULL,
> +                             DBUS_TYPE_INVALID);
>  }
>  
>  static int hfp_disable(struct ofono_modem *modem)
> -- 
> 1.6.4.4
> 

I forgot to rebase. Ignore it :(

-- 
Gustavo F. Padovan
http://padovan.org

ProFUSION embedded systems - http://profusion.mobi
_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono

Reply via email to