* [PATCH] hfp: break down send_method_call in two functions
@ 2010-02-08 18:53 Gustavo F. Padovan
2010-02-08 18:58 ` Gustavo F. Padovan
0 siblings, 1 reply; 2+ messages in thread
From: Gustavo F. Padovan @ 2010-02-08 18:53 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 7203 bytes --]
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
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] hfp: break down send_method_call in two functions
2010-02-08 18:53 [PATCH] hfp: break down send_method_call in two functions Gustavo F. Padovan
@ 2010-02-08 18:58 ` Gustavo F. Padovan
0 siblings, 0 replies; 2+ messages in thread
From: Gustavo F. Padovan @ 2010-02-08 18:58 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 7866 bytes --]
* Gustavo F. Padovan <padovan@profusion.mobi> [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
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2010-02-08 18:58 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-02-08 18:53 [PATCH] hfp: break down send_method_call in two functions Gustavo F. Padovan
2010-02-08 18:58 ` Gustavo F. Padovan
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.