From dcef4bec25e977c54d783e3821f5d2d6c0dca1ca Mon Sep 17 00:00:00 2001 From: Raymond Liu Date: Mon, 1 Dec 2008 10:03:27 +0800 Subject: [PATCH] obexd: Add low level apparam header support in gw-obex --- obexd/gwobex/gw-obex.h | 10 ++++++++++ obexd/gwobex/obex-priv.c | 23 +++++++++++++++-------- obexd/gwobex/obex-xfer.c | 7 +++++++ obexd/gwobex/obex-xfer.h | 4 ++++ 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/obexd/gwobex/gw-obex.h b/obexd/gwobex/gw-obex.h index 6f9943096..1ac2ca200 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 d67a4ac71..cbae210a8 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 fcbee35e1..78d0759e8 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 9771f0228..5a88b13d2 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; -- 2.47.3