Re: [PATCH 1/1] obexd: Add PushMessage

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

 



Hi Christian,

On Fri, Jan 25, 2013 at 6:44 PM, Christian Fetzer
<christian.fetzer@xxxxxxxxxxxxxxxx> wrote:
> From: Christian Fetzer <christian.fetzer@xxxxxxxxxxxx>
>
> Push message has been implemented similar to send file (OPP),
> the message to send (in bMessage format) is read from a file.
> ---
>  doc/obex-api.txt   |  22 ++++++++
>  obexd/client/map.c | 161 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 183 insertions(+)
>
> diff --git a/doc/obex-api.txt b/doc/obex-api.txt
> index 6246933..759c4d8 100644
> --- a/doc/obex-api.txt
> +++ b/doc/obex-api.txt
> @@ -630,6 +630,28 @@ Methods            void SetFolder(string name)
>
>                         Possible errors: org.bluez.obex.Error.Failed
>
> +               object, dict
> +               PushMessage(string sourcefile, string folder, dict args)
> +
> +                       Transfer a message (in bMessage format) to the
> +                       remote device.
> +
> +                       The message is transferred either to the given folder,
> +                       or to the current folder if folder is omitted.
> +
> +                       Possible args: Transparent, Retry, Charset
> +
> +                       The returned path represents the newly created transfer,
> +                       which should be used to find out if the content has been
> +                       successfully transferred or if the operation fails.
> +
> +                       The properties of this transfer are also returned along
> +                       with the object path, to avoid a call to GetAll.
> +
> +                       Possible errors: org.bluez.obex.Error.InvalidArguments
> +                                        org.bluez.obex.Error.Failed
> +
> +
>  Filter:                uint16 Offset:
>
>                         Offset of the first item, default is 0
> diff --git a/obexd/client/map.c b/obexd/client/map.c
> index ea5681a..2b665ec 100644
> --- a/obexd/client/map.c
> +++ b/obexd/client/map.c
> @@ -52,6 +52,7 @@
>  #define DEFAULT_COUNT 1024
>  #define DEFAULT_OFFSET 0
>
> +#define CHARSET_NATIVE 0
>  #define CHARSET_UTF8 1
>
>  static const char * const filter_list[] = {
> @@ -1495,6 +1496,160 @@ fail:
>         return reply;
>  }
>
> +static DBusMessage *push_message(struct map_data *map,
> +                                                       DBusMessage *message,
> +                                                       const char *filename,
> +                                                       const char *folder,
> +                                                       GObexApparam *apparam)
> +{
> +       struct obc_transfer *transfer;
> +       GError *err = NULL;
> +       DBusMessage *reply;
> +
> +       transfer = obc_transfer_put("x-bt/message", folder, filename,
> +                                                               NULL, 0, &err);
> +       if (transfer == NULL) {
> +               g_obex_apparam_free(apparam);
> +               goto fail;
> +       }
> +
> +       obc_transfer_set_apparam(transfer, apparam);
> +
> +       if (!obc_session_queue(map->session, transfer, NULL, NULL, &err))
> +               goto fail;
> +
> +       return obc_transfer_create_dbus_reply(transfer, message);
> +
> +fail:
> +       reply = g_dbus_create_error(message, ERROR_INTERFACE ".Failed", "%s",
> +                                                               err->message);
> +       g_error_free(err);
> +       return reply;
> +}
> +
> +static GObexApparam *parse_transparent(GObexApparam *apparam,
> +                                                       DBusMessageIter *iter)
> +{
> +       dbus_bool_t transparent;
> +
> +       if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_BOOLEAN)
> +               return NULL;
> +
> +       dbus_message_iter_get_basic(iter, &transparent);
> +
> +       return g_obex_apparam_set_uint8(apparam, MAP_AP_TRANSPARENT,
> +                                               transparent ? TRUE : FALSE);
> +}
> +
> +static GObexApparam *parse_retry(GObexApparam *apparam, DBusMessageIter *iter)
> +{
> +       dbus_bool_t retry;
> +
> +       if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_BOOLEAN)
> +               return NULL;
> +
> +       dbus_message_iter_get_basic(iter, &retry);
> +
> +       return g_obex_apparam_set_uint8(apparam, MAP_AP_RETRY,
> +                                                       retry ? TRUE : FALSE);
> +}
> +
> +static GObexApparam *parse_charset(GObexApparam *apparam, DBusMessageIter *iter)
> +{
> +       guint8 charset = 0;
> +       const char *string;
> +
> +       if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_STRING)
> +               return NULL;
> +
> +       dbus_message_iter_get_basic(iter, &string);
> +
> +       if (strcasecmp(string, "native") == 0)
> +               charset = CHARSET_NATIVE;
> +       else if (strcasecmp(string, "utf8") == 0)
> +               charset = CHARSET_UTF8;
> +       else
> +               return NULL;
> +
> +       return g_obex_apparam_set_uint8(apparam, MAP_AP_CHARSET, charset);
> +}
> +
> +static GObexApparam *parse_push_options(GObexApparam *apparam,
> +                                                       DBusMessageIter *iter)
> +{
> +       DBusMessageIter array;
> +
> +       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, "Transparent") == 0) {
> +                       if (parse_transparent(apparam, &value) == NULL)
> +                               return NULL;
> +               } else if (strcasecmp(key, "Retry") == 0) {
> +                       if (parse_retry(apparam, &value) == NULL)
> +                               return NULL;
> +               } else if (strcasecmp(key, "Charset") == 0) {
> +                       if (parse_charset(apparam, &value) == NULL)
> +                               return NULL;
> +               }
> +
> +               dbus_message_iter_next(&array);
> +       }
> +
> +       return apparam;
> +}
> +
> +static DBusMessage *map_push_message(DBusConnection *connection,
> +                                       DBusMessage *message, void *user_data)
> +{
> +       struct map_data *map = user_data;
> +       char *filename;
> +       char *folder;
> +       GObexApparam *apparam;
> +       DBusMessageIter args;
> +
> +       dbus_message_iter_init(message, &args);
> +
> +       if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_STRING)
> +               return g_dbus_create_error(message,
> +                               ERROR_INTERFACE ".InvalidArguments", NULL);
> +
> +       dbus_message_iter_get_basic(&args, &filename);
> +
> +       dbus_message_iter_next(&args);
> +
> +       if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_STRING) {
> +               return g_dbus_create_error(message,
> +                               ERROR_INTERFACE ".InvalidArguments", NULL);
> +       }
> +
> +       dbus_message_iter_get_basic(&args, &folder);
> +
> +       dbus_message_iter_next(&args);
> +
> +       apparam = g_obex_apparam_set_uint8(NULL, MAP_AP_CHARSET, CHARSET_UTF8);
> +
> +       if (parse_push_options(apparam, &args) == NULL) {
> +               g_obex_apparam_free(apparam);
> +               return g_dbus_create_error(message,
> +                               ERROR_INTERFACE ".InvalidArguments", NULL);
> +       }
> +
> +       return push_message(map, message, filename, folder, apparam);
> +}
> +
>  static const GDBusMethodTable map_methods[] = {
>         { GDBUS_ASYNC_METHOD("SetFolder",
>                                 GDBUS_ARGS({ "name", "s" }), NULL,
> @@ -1515,6 +1670,12 @@ static const GDBusMethodTable map_methods[] = {
>                         NULL,
>                         NULL,
>                         map_update_inbox) },
> +       { GDBUS_ASYNC_METHOD("PushMessage",
> +                       GDBUS_ARGS({ "file", "s" }, { "folder", "s" },
> +                                               { "args", "a{sv}" }),
> +                       GDBUS_ARGS({ "transfer", "o" },
> +                                               { "properties", "a{sv}" }),
> +                       map_push_message) },
>         { }
>  };
>
> --
> 1.8.1

Pushed, thanks.

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