All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gustavo F. Padovan <padovan@profusion.mobi>
To: ofono@ofono.org
Subject: Re: [PATCH] hfp: break down send_method_call in two functions
Date: Mon, 08 Feb 2010 16:58:18 -0200	[thread overview]
Message-ID: <20100208185818.GA6797@vigoh> (raw)
In-Reply-To: <1265655180-14232-1-git-send-email-padovan@profusion.mobi>

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

      reply	other threads:[~2010-02-08 18:58 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20100208185818.GA6797@vigoh \
    --to=padovan@profusion.mobi \
    --cc=ofono@ofono.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.