obexd: Add support for specific headers in obex transfer
authorFrédéric Danis <frederic.danis@collabora.com>
Mon, 16 Sep 2024 13:28:08 +0000 (15:28 +0200)
committerWootak Jung <wootak.jung@samsung.com>
Thu, 20 Feb 2025 07:43:22 +0000 (16:43 +0900)
The BIP is using the Image Handle Tag header to set the file handle
to transfer.

Signed-off-by: Anuj Jain <anuj01.jain@samsung.com>
obexd/client/transfer.c
obexd/client/transfer.h

index f05c84458b2c22a7dc9d220e4fa34764174d8281..0ca99378a9e08d7ea9915a0a56382a3ddb825e42 100755 (executable)
@@ -57,6 +57,7 @@ struct obc_transfer {
        GObex *obex;
        uint8_t status;
        GObexApparam *apparam;
+       GSList *headers;
        guint8 op;
        struct transfer_callback *callback;
        DBusConnection *conn;
@@ -400,6 +401,11 @@ static const GDBusPropertyTable obc_transfer_properties[] = {
        { }
 };
 
+static void header_free(void *data, void *user_data)
+{
+       g_obex_header_free(data);
+}
+
 static void obc_transfer_free(struct obc_transfer *transfer)
 {
        DBG("%p", transfer);
@@ -441,6 +447,8 @@ static void obc_transfer_free(struct obc_transfer *transfer)
        if (transfer->obex)
                g_obex_unref(transfer->obex);
 
+       g_slist_foreach(transfer->headers, header_free, NULL);
+       g_slist_free(transfer->headers);
        g_free(transfer->callback);
        g_free(transfer->owner);
        g_free(transfer->filename);
@@ -839,6 +847,12 @@ static gboolean transfer_start_get(struct obc_transfer *transfer, GError **err)
                g_obex_packet_add_bytes(req, G_OBEX_HDR_TYPE, transfer->type,
                                                strlen(transfer->type) + 1);
 
+       while (transfer->headers) {
+               hdr = transfer->headers->data;
+               g_obex_packet_add_header(req, hdr);
+               transfer->headers = g_slist_remove(transfer->headers, hdr);
+       }
+
        if (transfer->apparam != NULL) {
                hdr = g_obex_header_new_apparam(transfer->apparam);
                g_obex_packet_add_header(req, hdr);
@@ -998,3 +1012,8 @@ gint64 obc_transfer_get_size(struct obc_transfer *transfer)
 {
        return transfer->size;
 }
+
+void obc_transfer_add_header(struct obc_transfer *transfer, void *data)
+{
+       transfer->headers = g_slist_append(transfer->headers, data);
+}
index 323332a624a68e37504309138bc0558be27447ca..1ed195984ffb2460ead5ed287cd5695d8b9dc2e0 100755 (executable)
@@ -47,3 +47,5 @@ gint64 obc_transfer_get_size(struct obc_transfer *transfer);
 
 DBusMessage *obc_transfer_create_dbus_reply(struct obc_transfer *transfer,
                                                        DBusMessage *message);
+
+void obc_transfer_add_header(struct obc_transfer *transfer, void *data);