Re: [PATCH 1/2] obexd: Move Message.Get parameter attachment into dictionary

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Christian,

On Thu, Feb 28, 2013 at 5:08 PM, Christian Fetzer
<christian.fetzer@xxxxxxxxxxxxxxxx> wrote:
> From: Christian Fetzer <christian.fetzer@xxxxxxxxxxxx>
>
> This is a preparation for adding additional parameters to Message.Get.
> The parsing of the args dictionary is done in parse_get_options.
>
> The Attachment parameter has been moved into the args dictionary.
> The parameter is now optional defaulting to true.
> ---
>  doc/obex-api.txt   |  9 ++++++-
>  obexd/client/map.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++--------
>  2 files changed, 76 insertions(+), 12 deletions(-)
>
> diff --git a/doc/obex-api.txt b/doc/obex-api.txt
> index 759c4d8..0dd1261 100644
> --- a/doc/obex-api.txt
> +++ b/doc/obex-api.txt
> @@ -717,7 +717,7 @@ Service             org.bluez.obex
>  Interface      org.bluez.obex.Message1
>  Object path    [variable prefix]/{session0,session1,...}/{message0,...}
>
> -Methods                object, dict Get(string targetfile, boolean attachment)
> +Methods                object, dict Get(string targetfile, dict args)
>
>                         Download message and store it in the target file.
>
> @@ -731,6 +731,13 @@ Methods            object, dict Get(string targetfile, boolean attachment)
>                         The properties of this transfer are also returned along
>                         with the object path, to avoid a call to GetProperties.
>
> +                       Possible args:
> +
> +                               boolean Attachment
> +
> +                                       Request message attachment,
> +                                       defaults to True
> +
>                         Possible errors: org.bluez.obex.Error.InvalidArguments
>                                          org.bluez.obex.Error.Failed
>
> diff --git a/obexd/client/map.c b/obexd/client/map.c
> index 2b665ec..b7e6428 100644
> --- a/obexd/client/map.c
> +++ b/obexd/client/map.c
> @@ -385,34 +385,91 @@ static void map_msg_free(void *data)
>         g_free(msg);
>  }
>
> +static GObexApparam *parse_attachment(GObexApparam *apparam,
> +                                                       DBusMessageIter *iter)
> +{
> +       dbus_bool_t attachment;
> +
> +       if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_BOOLEAN)
> +               return NULL;
> +
> +       dbus_message_iter_get_basic(iter, &attachment);
> +
> +       return g_obex_apparam_set_uint8(apparam, MAP_AP_ATTACHMENT,
> +                                               attachment ? TRUE : FALSE);
> +}
> +
> +static GObexApparam *parse_get_options(GObexApparam *apparam,
> +                                                       DBusMessageIter *iter)
> +{
> +       DBusMessageIter array;
> +
> +       DBG("");
> +
> +       if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY)
> +               return NULL;
> +
> +       dbus_message_iter_recurse(iter, &array);
> +
> +       while (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_DICT_ENTRY) {
> +               const char *key;
> +               DBusMessageIter value, entry;
> +
> +               dbus_message_iter_recurse(&array, &entry);
> +               dbus_message_iter_get_basic(&entry, &key);
> +
> +               dbus_message_iter_next(&entry);
> +               dbus_message_iter_recurse(&entry, &value);
> +
> +               if (strcasecmp(key, "Attachment") == 0) {
> +                       if (parse_attachment(apparam, &value) == NULL)
> +                               return NULL;
> +               }
> +
> +               dbus_message_iter_next(&array);
> +       }
> +
> +       return apparam;
> +}
> +
>  static DBusMessage *map_msg_get(DBusConnection *connection,
>                                         DBusMessage *message, void *user_data)
>  {
>         struct map_msg *msg = user_data;
>         struct obc_transfer *transfer;
>         const char *target_file;
> -       gboolean attachment;
>         GError *err = NULL;
>         DBusMessage *reply;
>         GObexApparam *apparam;
> +       DBusMessageIter args;
> +
> +       dbus_message_iter_init(message, &args);
>
> -       if (dbus_message_get_args(message, NULL,
> -                               DBUS_TYPE_STRING, &target_file,
> -                               DBUS_TYPE_BOOLEAN, &attachment,
> -                               DBUS_TYPE_INVALID) == FALSE)
> +       if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_STRING)
>                 return g_dbus_create_error(message,
>                                 ERROR_INTERFACE ".InvalidArguments", NULL);
>
> -       transfer = obc_transfer_get("x-bt/message", msg->handle, target_file,
> -                                                                       &err);
> -       if (transfer == NULL)
> -               goto fail;
> +       dbus_message_iter_get_basic(&args, &target_file);
> +
> +       dbus_message_iter_next(&args);
>
>         apparam = g_obex_apparam_set_uint8(NULL, MAP_AP_ATTACHMENT,
> -                                                               attachment);
> +                                                               TRUE);
> +
>         apparam = g_obex_apparam_set_uint8(apparam, MAP_AP_CHARSET,
>                                                                 CHARSET_UTF8);
>
> +       if (parse_get_options(apparam, &args) == NULL) {
> +               g_obex_apparam_free(apparam);
> +               return g_dbus_create_error(message,
> +                               ERROR_INTERFACE ".InvalidArguments", NULL);
> +       }
> +
> +       transfer = obc_transfer_get("x-bt/message", msg->handle, target_file,
> +                                                                       &err);
> +       if (transfer == NULL)
> +               goto fail;
> +
>         obc_transfer_set_apparam(transfer, apparam);
>
>         if (!obc_session_queue(msg->data->session, transfer, NULL, NULL, &err))
> @@ -731,7 +788,7 @@ static void set_deleted(const GDBusPropertyTable *property,
>  static const GDBusMethodTable map_msg_methods[] = {
>         { GDBUS_METHOD("Get",
>                         GDBUS_ARGS({ "targetfile", "s" },
> -                                               { "attachment", "b" }),
> +                                               { "args", "a{sv}" }),
>                         GDBUS_ARGS({ "transfer", "o" },
>                                                 { "properties", "a{sv}" }),
>                         map_msg_get) },
> --
> 1.8.1.4

Im not against it, but we need to update the version number of the
interface if we break the API which these changes does.


-- 
Luiz Augusto von Dentz
--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux