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