Diff between 331ea6fd144d230acaec2272484520255bccd8e5 and dcef4bec25e977c54d783e3821f5d2d6c0dca1ca

Changed Files

File Additions Deletions Status
obexd/gwobex/gw-obex.h +10 -0 modified
obexd/gwobex/obex-priv.c +15 -8 modified
obexd/gwobex/obex-xfer.c +7 -0 modified
obexd/gwobex/obex-xfer.h +4 -0 modified

Full Patch

diff --git a/obexd/gwobex/gw-obex.h b/obexd/gwobex/gw-obex.h
index 6f99430..1ac2ca2 100644
--- a/obexd/gwobex/gw-obex.h
+++ b/obexd/gwobex/gw-obex.h
@@ -568,6 +568,16 @@ time_t gw_obex_xfer_object_time(GwObexXfer *xfer);
 gint gw_obex_xfer_object_size(GwObexXfer *xfer);
 
 
+/** Get the contents of the application parameters header
+ *
+ * @param xfer Pointer returned by gw_obex_put_async or gw_obex_get_async
+ * @param apparam_size Return value for the size of the application parameters header.
+ *
+ * @returns The pointer to the buffer that hold the contents.
+ */
+unsigned char *gw_obex_xfer_object_apparam(GwObexXfer *xfer, size_t *apparam_size);
+
+
 /** Returns if a transfer is already done
  *
  * @param xfer Pointer returned by gw_obex_put_async or gw_obex_get_async
diff --git a/obexd/gwobex/obex-priv.c b/obexd/gwobex/obex-priv.c
index d67a4ac..cbae210 100644
--- a/obexd/gwobex/obex-priv.c
+++ b/obexd/gwobex/obex-priv.c
@@ -330,22 +330,30 @@ static void obex_request_done(GwObex *ctx, obex_object_t *object,
     }
 }
 
-static void get_target_size_and_time(obex_t *handle, obex_object_t *object,
-                                     gint *size, time_t *time) {
+static void get_non_body_headers(obex_t *handle, obex_object_t *object,
+                                     struct gw_obex_xfer *xfer) {
     obex_headerdata_t hv;
     uint8_t hi;
     unsigned int hlen;
 
-    *size = GW_OBEX_UNKNOWN_LENGTH;
-    *time = -1;
+    xfer->target_size = GW_OBEX_UNKNOWN_LENGTH;
+    xfer->modtime = -1;
 
     while (OBEX_ObjectGetNextHeader(handle, object, &hi, &hv, &hlen)) {
         switch (hi) {
             case OBEX_HDR_LENGTH:
-                *size = hv.bq4; //(gint) g_ntohl(hv.bq4);
+                xfer->target_size = hv.bq4; //(gint) g_ntohl(hv.bq4);
                 break;
             case OBEX_HDR_TIME:
-                *time = parse_iso8601((char *)hv.bs, hlen);
+                xfer->modtime = parse_iso8601((char *)hv.bs, hlen);
+                break;
+            case OBEX_HDR_APPARAM:
+                g_free(xfer->apparam_buf);
+                xfer->apparam_buf = NULL;
+                xfer->apparam_buf = g_try_malloc(hlen);
+		if (xfer->apparam_buf)
+                    memcpy(xfer->apparam_buf, hv.bs, hlen);
+                xfer->apparam_size = xfer->apparam_buf ? hlen : 0;
                 break;
             default:
                 break;
@@ -370,8 +378,7 @@ static void obex_readstream(GwObex *ctx, obex_object_t *object) {
     }
 
     if (ctx->xfer->counter == 0) {
-        get_target_size_and_time(ctx->handle, object,
-                                 &xfer->target_size, &xfer->modtime);
+        get_non_body_headers(ctx->handle, object, xfer);
         show_headers(ctx->handle, object);
     }
 
diff --git a/obexd/gwobex/obex-xfer.c b/obexd/gwobex/obex-xfer.c
index fcbee35..78d0759 100644
--- a/obexd/gwobex/obex-xfer.c
+++ b/obexd/gwobex/obex-xfer.c
@@ -196,6 +196,12 @@ gint gw_obex_xfer_object_size(GwObexXfer *xfer) {
     return xfer->target_size;
 }
 
+unsigned char *gw_obex_xfer_object_apparam(GwObexXfer *xfer, size_t *apparam_size) {
+    if (apparam_size)
+        *apparam_size = xfer->apparam_size;
+    return xfer->apparam_buf;
+}
+
 gboolean gw_obex_xfer_object_done(GwObexXfer *xfer) {
     return xfer->ctx->done;
 }
@@ -412,6 +418,7 @@ out:
 
 void _gw_obex_xfer_free(struct gw_obex_xfer *xfer) {
     g_free(xfer->buf);
+    g_free(xfer->apparam_buf);
     g_free(xfer);
 }
 
diff --git a/obexd/gwobex/obex-xfer.h b/obexd/gwobex/obex-xfer.h
index 9771f02..5a88b13 100644
--- a/obexd/gwobex/obex-xfer.h
+++ b/obexd/gwobex/obex-xfer.h
@@ -58,6 +58,10 @@ struct gw_obex_xfer {
     unsigned char           *buf;
     size_t                   buf_size;
 
+    /* Buffer and size for Application parameters */
+    unsigned char           *apparam_buf;
+    size_t                   apparam_size;
+
     /* These two elements are only used for async transfers */
     size_t                   data_start;
     size_t                   data_length;