From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: multipart/mixed; boundary="===============4293779617052592149==" MIME-Version: 1.0 From: Gustavo F. Padovan Subject: Re: [PATCH] hfp: break down send_method_call in two functions Date: Mon, 08 Feb 2010 16:58:18 -0200 Message-ID: <20100208185818.GA6797@vigoh> In-Reply-To: <1265655180-14232-1-git-send-email-padovan@profusion.mobi> List-Id: To: ofono@ofono.org --===============4293779617052592149== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable * Gustavo F. Padovan [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 =3D 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 *pat= h, > + 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 =3D 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 c= har *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 =3D 0 ; i < num ; i++) { > - ret =3D send_method_call(BLUEZ_SERVICE, device[i], > + ret =3D 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 *connect= ion, DBusMessage *message, > dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &path, > DBUS_TYPE_INVALID); > = > - ret =3D send_method_call(BLUEZ_SERVICE, path, > + ret =3D 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, g= pointer user_data) > } > = > for (i =3D 0 ; i < num ; i++) { > - ret =3D send_method_call(BLUEZ_SERVICE, adapter[i], > + ret =3D 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 ofon= o_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 =3D ofono_modem_get_data(modem); > + DBusError derr; > + DBusMessage *reply; > = > - ofono_debug("Connect to bluetooth daemon"); > + reply =3D 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_da= ta) > = > ret =3D 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 =3D 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 ofo= no_modem *modem) > { > struct hfp_data *data =3D 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 --===============4293779617052592149==--