[maemo-commits] [maemo-commits] r17990 - projects/connectivity/osso-gwobex/trunk/src

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Thu Apr 2 13:59:09 EEST 2009
Author: jh
Date: 2009-04-02 13:59:08 +0300 (Thu, 02 Apr 2009)
New Revision: 17990

Modified:
   projects/connectivity/osso-gwobex/trunk/src/gw-obex.c
   projects/connectivity/osso-gwobex/trunk/src/gw-obex.h
   projects/connectivity/osso-gwobex/trunk/src/obex-priv.c
   projects/connectivity/osso-gwobex/trunk/src/obex-priv.h
   projects/connectivity/osso-gwobex/trunk/src/obex-xfer.c
   projects/connectivity/osso-gwobex/trunk/src/obex-xfer.h
Log:
Merge gwobex updates from obexd

Modified: projects/connectivity/osso-gwobex/trunk/src/gw-obex.c
===================================================================
--- projects/connectivity/osso-gwobex/trunk/src/gw-obex.c	2009-04-02 10:32:47 UTC (rev 17989)
+++ projects/connectivity/osso-gwobex/trunk/src/gw-obex.c	2009-04-02 10:59:08 UTC (rev 17990)
@@ -44,7 +44,7 @@
     gboolean ret;
     GW_OBEX_LOCK(ctx);
     CHECK_DISCONNECT(FALSE, error, ctx);
-    ret = gw_obex_get(ctx, local, remote, type, NULL, NULL, -1, FALSE);
+    ret = gw_obex_get(ctx, local, remote, type, NULL, 0, NULL, NULL, -1, FALSE);
     if (ret == FALSE)
         gw_obex_get_error(ctx, error);
     GW_OBEX_UNLOCK(ctx);
@@ -59,7 +59,7 @@
     gboolean ret;
     GW_OBEX_LOCK(ctx);
     CHECK_DISCONNECT(FALSE, error, ctx);
-    ret = gw_obex_get(ctx, NULL, remote, type, NULL, NULL, fd, FALSE);
+    ret = gw_obex_get(ctx, NULL, remote, type, NULL, 0, NULL, NULL, fd, FALSE);
     if (ret == FALSE)
         gw_obex_get_error(ctx, error);
     GW_OBEX_UNLOCK(ctx);
@@ -74,7 +74,7 @@
     gboolean ret;
     GW_OBEX_LOCK(ctx);
     CHECK_DISCONNECT(FALSE, error, ctx);
-    ret = gw_obex_put(ctx, NULL, remote, type, NULL, 0, -1, fd, FALSE);
+    ret = gw_obex_put(ctx, NULL, remote, type, NULL, 0, NULL, 0, -1, fd, FALSE);
     if (ret == FALSE)
         gw_obex_get_error(ctx, error);
     GW_OBEX_UNLOCK(ctx);
@@ -89,7 +89,7 @@
     gboolean ret;
     GW_OBEX_LOCK(ctx);
     CHECK_DISCONNECT(FALSE, error, ctx);
-    ret = gw_obex_put(ctx, local, remote, type, NULL, 0, -1, -1, FALSE);
+    ret = gw_obex_put(ctx, local, remote, type, NULL, 0, NULL, 0, -1, -1, FALSE);
     if (ret == FALSE)
         gw_obex_get_error(ctx, error);
     GW_OBEX_UNLOCK(ctx);
@@ -105,7 +105,7 @@
     gboolean ret;
     GW_OBEX_LOCK(ctx);
     CHECK_DISCONNECT(FALSE, error, ctx);
-    ret = gw_obex_get(ctx, NULL, remote, type, buf, buf_size, -1, FALSE);
+    ret = gw_obex_get(ctx, NULL, remote, type, NULL, 0, buf, buf_size, -1, FALSE);
     if (ret == FALSE)
         gw_obex_get_error(ctx, error);
     GW_OBEX_UNLOCK(ctx);
@@ -122,13 +122,50 @@
     gboolean ret;
     GW_OBEX_LOCK(ctx);
     CHECK_DISCONNECT(FALSE, error, ctx);
-    ret = gw_obex_put(ctx, NULL, remote, type, buf, buf_size, time, -1, FALSE);
+    ret = gw_obex_put(ctx, NULL, remote, type, NULL, 0, buf, buf_size, time, -1, FALSE);
     if (ret == FALSE)
         gw_obex_get_error(ctx, error);
     GW_OBEX_UNLOCK(ctx);
     return ret;
 }
 
+gboolean gw_obex_get_buf_with_apparam(GwObex        *ctx,
+                                      const gchar   *remote,
+                                      const gchar   *type,
+                                      const guint8  *apparam,
+                                      gint           apparam_size,
+                                      gchar        **buf,
+                                      gint          *buf_size,
+                                      gint          *error) {
+    gboolean ret;
+    GW_OBEX_LOCK(ctx);
+    CHECK_DISCONNECT(FALSE, error, ctx);
+    ret = gw_obex_get(ctx, NULL, remote, type, apparam, apparam_size, buf, buf_size, -1, FALSE);
+    if (ret == FALSE)
+        gw_obex_get_error(ctx, error);
+    GW_OBEX_UNLOCK(ctx);
+    return ret;
+}
+
+gboolean gw_obex_put_buf_with_apparam(GwObex       *ctx,
+                                      const gchar  *remote,
+                                      const gchar  *type,
+                                      const guint8 *apparam,
+                                      gint          apparam_size,
+                                      const gchar  *buf,
+                                      gint          buf_size,
+                                      gint          time,
+                                      gint         *error) {
+    gboolean ret;
+    GW_OBEX_LOCK(ctx);
+    CHECK_DISCONNECT(FALSE, error, ctx);
+    ret = gw_obex_put(ctx, NULL, remote, type, apparam, apparam_size, buf, buf_size, time, -1, FALSE);
+    if (ret == FALSE)
+        gw_obex_get_error(ctx, error);
+    GW_OBEX_UNLOCK(ctx);
+    return ret;
+}
+
 gboolean gw_obex_chdir(GwObex *ctx, const gchar *dir, gint *error) {
     gboolean ret;
     GW_OBEX_LOCK(ctx);
@@ -158,7 +195,7 @@
     gboolean ret;
     GW_OBEX_LOCK(ctx);
     CHECK_DISCONNECT(FALSE, error, ctx);
-    ret = gw_obex_get(ctx, NULL, dir ? dir : "", LST_TYPE, buf, buf_size, -1, FALSE);
+    ret = gw_obex_get(ctx, NULL, dir ? dir : "", LST_TYPE, NULL, 0, buf, buf_size, -1, FALSE);
     if (ret == FALSE)
         gw_obex_get_error(ctx, error);
     else if (*buf_size > 0) {
@@ -181,7 +218,7 @@
     gboolean ret;
     GW_OBEX_LOCK(ctx);
     CHECK_DISCONNECT(FALSE, error, ctx);
-    ret = gw_obex_put(ctx, NULL, name, NULL, NULL, 0, -1, -1, FALSE);
+    ret = gw_obex_put(ctx, NULL, name, NULL, NULL, 0, NULL, 0, -1, -1, FALSE);
     if (ret == FALSE)
         gw_obex_get_error(ctx, error);
     GW_OBEX_UNLOCK(ctx);
@@ -214,7 +251,7 @@
     gboolean ret;
     GW_OBEX_LOCK(ctx);
     CHECK_DISCONNECT(FALSE, error, ctx);
-    ret = gw_obex_get(ctx, NULL, NULL, CAP_TYPE, cap, cap_len, -1, FALSE);
+    ret = gw_obex_get(ctx, NULL, NULL, CAP_TYPE, NULL, 0, cap, cap_len, -1, FALSE);
     if (ret == FALSE) {
         *cap = NULL;
         *cap_len = 0;

Modified: projects/connectivity/osso-gwobex/trunk/src/gw-obex.h
===================================================================
--- projects/connectivity/osso-gwobex/trunk/src/gw-obex.h	2009-04-02 10:32:47 UTC (rev 17989)
+++ projects/connectivity/osso-gwobex/trunk/src/gw-obex.h	2009-04-02 10:59:08 UTC (rev 17990)
@@ -88,6 +88,12 @@
 /** Length of OBEX_PBAP_UUID */
 #define OBEX_PBAP_UUID_LEN 16
 
+/** IrMC Sync Profile UUID */
+#define OBEX_SYNC_UUID \
+	"IRMC-SYNC"
+/** Length of OBEX_SYNC_UUID */
+#define OBEX_SYNC_UUID_LEN 9
+
 /** Struct containing the context of a gwobex connection */
 typedef struct gw_obex GwObex;
 
@@ -365,6 +371,48 @@
                          const gchar *buf, gint buf_size, gint time, gint *error);
 
 
+/** Get an object from the remote device and store it in a memory buffer.
+ * Either remote filename or type must be supplied (or both).
+ *
+ * @param ctx          Pointer returned by gw_obex_setup()
+ * @param remote       Remote filename (null terminated UTF-8)
+ * @param type         MIME-type of the object
+ * @param apparam      Application parameters of the object
+ * @param apparam_size Application parameters size
+ * @param buf          Buffer to store the object in.
+ *                      g_free() when not needed anymore.
+ * @param buf_size     Place to store length of fetched object
+ * @param error        Place to store error code on failure
+ *                     (NULL if not interested)
+ *
+ * @returns TRUE on success, FALSE on failure
+ */
+gboolean gw_obex_get_buf_with_apparam(GwObex *ctx, const gchar *remote, const gchar *type,
+                                      const guint8 *apparam, gint apparam_size,
+                                      gchar **buf, gint *buf_size, gint *error);
+
+
+/** Send a object located in a memory buffer to the remote device.
+ * Either remote filename or type must be supplied (or both)
+ *
+ * @param ctx          Pointer returned by gw_obex_setup()
+ * @param remote       Remote filename (null terminated UTF-8)
+ * @param type         MIME-type of the object
+ * @param apparam      Application parameters of the object
+ * @param apparam_size Application parameters size
+ * @param buf          Buffer containing the object
+ * @param buf_size     Buffer (object) size
+ * @param time         Last modification time of object (or -1 if not known)
+ * @param error        Place to store error code on failure
+ *                     (NULL if not interested)
+ *
+ * @returns TRUE on success, FALSE on failure
+ */
+gboolean gw_obex_put_buf_with_apparam(GwObex *ctx, const gchar *remote, const gchar *type,
+                                     const guint8 *apparam, gint apparam_size,
+                                     const gchar *buf, gint buf_size, gint time, gint *error);
+
+
 /** Change directory (relative to the current one).
  *
  * @param ctx   Pointer returned by gw_obex_setup()
@@ -474,7 +522,22 @@
  */
 GwObexXfer *gw_obex_get_async(GwObex *ctx, const char *name, const char *type, gint *error);
 
+/** Start a GET operation asynchronously with application parameters
+ *
+ * @param ctx   Pointer returned by gw_obex_setup()
+ * @param name  Name of the object (null terminated UTF-8)
+ * @param type  Type of the object (null terminated UTF-8), or NULL
+ * @param apparam      Application parameters of the object
+ * @param apparam_size Application paramters' size
+ * @param error Place to store error code on failure (NULL if not interested)
+ *
+ * @returns a new GwObexXfer object on success, NULL on failure
+ */
 
+GwObexXfer *gw_obex_get_async_with_apparam(GwObex *ctx, const char *name, const char *type,
+		const guint8  *apparam, gint apparam_size, gint *error);
+
+
 /** Set a callback function for a GwObexXfer object
  * The callback function will be called in the following situations:
  * <ul>
@@ -511,6 +574,16 @@
 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

Modified: projects/connectivity/osso-gwobex/trunk/src/obex-priv.c
===================================================================
--- projects/connectivity/osso-gwobex/trunk/src/obex-priv.c	2009-04-02 10:32:47 UTC (rev 17989)
+++ projects/connectivity/osso-gwobex/trunk/src/obex-priv.c	2009-04-02 10:59:08 UTC (rev 17990)
@@ -330,23 +330,33 @@
     }
 }
 
-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 = g_try_malloc(hlen);
+		if (xfer->apparam_buf) {
+                    memcpy(xfer->apparam_buf, hv.bs, hlen);
+                    xfer->apparam_size = hlen;
+                }
+                else
+                    xfer->apparam_size = 0;
+                break;
             default:
                 break;
         }
@@ -370,8 +380,7 @@
     }
 
     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);
     }
 
@@ -829,6 +838,7 @@
 
 gboolean gw_obex_get(GwObex *ctx,
                      const gchar *local, const gchar *remote, const gchar *type,
+                     const guint8 *apparam, gint apparam_size,
                      gchar **buf, gint *buf_size, int stream_fd,
                      gboolean async) {
     gboolean ret = FALSE;
@@ -854,6 +864,11 @@
         OBEX_ObjectAddHeader(ctx->handle, object, OBEX_HDR_CONNECTION, hv, 4, 0);
     }
 
+    if (apparam && apparam_size > 0) {
+        hv.bs = (unsigned char *)apparam;
+        OBEX_ObjectAddHeader(ctx->handle, object, OBEX_HDR_APPARAM, hv, apparam_size, 0);
+    }
+
     if (type) {
         hv.bs = (unsigned char *)type;
         OBEX_ObjectAddHeader(ctx->handle, object, OBEX_HDR_TYPE, hv, strlen(type) + 1, 0);
@@ -940,6 +955,7 @@
 
 gboolean gw_obex_put(GwObex *ctx,
                      const gchar *local, const gchar *remote, const gchar *type,
+                     const guint8 *apparam, gint apparam_size,
                      const gchar *buf, gint object_size, time_t object_time,
                      int stream_fd, gboolean async) {
     gboolean ret = FALSE;
@@ -1016,6 +1032,11 @@
         OBEX_ObjectAddHeader(ctx->handle, object, OBEX_HDR_TYPE, hv, strlen(type) + 1, 0);
     }
 
+    if (apparam && apparam_size > 0) {
+        hv.bs = (unsigned char *)apparam;
+        OBEX_ObjectAddHeader(ctx->handle, object, OBEX_HDR_APPARAM, hv, apparam_size, 0);
+    }
+
     /* Try to figure out modification time if none was given */
     if (ctx->xfer->stream_fd >= 0) {
         struct stat stats;

Modified: projects/connectivity/osso-gwobex/trunk/src/obex-priv.h
===================================================================
--- projects/connectivity/osso-gwobex/trunk/src/obex-priv.h	2009-04-02 10:32:47 UTC (rev 17989)
+++ projects/connectivity/osso-gwobex/trunk/src/obex-priv.h	2009-04-02 10:59:08 UTC (rev 17990)
@@ -197,6 +197,7 @@
  */
 gboolean gw_obex_get(GwObex *ctx,
                      const gchar *local, const gchar *remote, const gchar *type,
+                     const guint8 *apparam, gint apparam_size,
                      gchar **buf, gint *buf_size, int stream_fd,
                      gboolean async);
 
@@ -209,6 +210,7 @@
  */
 gboolean gw_obex_put(GwObex *ctx,
                      const gchar *local, const gchar *remote, const gchar *type,
+                     const guint8 *apparam, gint apparam_size,
                      const gchar *buf, gint buf_size, time_t object_time,
                      int stream_fd, gboolean async);
 

Modified: projects/connectivity/osso-gwobex/trunk/src/obex-xfer.c
===================================================================
--- projects/connectivity/osso-gwobex/trunk/src/obex-xfer.c	2009-04-02 10:32:47 UTC (rev 17989)
+++ projects/connectivity/osso-gwobex/trunk/src/obex-xfer.c	2009-04-02 10:59:08 UTC (rev 17990)
@@ -117,7 +117,7 @@
     gboolean ret;
     GW_OBEX_LOCK(ctx);
     CHECK_DISCONNECT(NULL, error, ctx);
-    ret = gw_obex_put(ctx, NULL, name, type, NULL, size, time, -1, TRUE);
+    ret = gw_obex_put(ctx, NULL, name, type, NULL, 0, NULL, size, time, -1, TRUE);
     if (ret == FALSE)
         gw_obex_get_error(ctx, error);
     GW_OBEX_UNLOCK(ctx);
@@ -128,13 +128,25 @@
     gboolean ret;
     GW_OBEX_LOCK(ctx);
     CHECK_DISCONNECT(NULL, error, ctx);
-    ret = gw_obex_get(ctx, NULL, name, type, NULL, NULL, -1, TRUE);
+    ret = gw_obex_get(ctx, NULL, name, type, NULL, 0, NULL, NULL, -1, TRUE);
     if (ret == FALSE)
         gw_obex_get_error(ctx, error);
     GW_OBEX_UNLOCK(ctx);
     return ret ? ctx->xfer : NULL;
 }
 
+GwObexXfer *gw_obex_get_async_with_apparam(GwObex *ctx, const char *name, const char *type,
+		const guint8  *apparam, gint apparam_size, gint *error) {
+    gboolean ret;
+    GW_OBEX_LOCK(ctx);
+    CHECK_DISCONNECT(NULL, error, ctx);
+    ret = gw_obex_get(ctx, NULL, name, type, apparam, apparam_size, NULL, NULL, -1, TRUE);
+    if (ret == FALSE)
+        gw_obex_get_error(ctx, error);
+    GW_OBEX_UNLOCK(ctx);
+    return ret ? ctx->xfer : NULL;
+}
+
 static gboolean gw_obex_put_idle(GwObexXfer *xfer) {
     struct gw_obex *ctx = xfer->ctx;
 
@@ -184,6 +196,12 @@
     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;
 }
@@ -241,7 +259,7 @@
     }
 
     if (xfer->data_length >= ctx->tx_max || !free_space) {
-        gint old_length = xfer->data_length;
+        guint old_length = xfer->data_length;
 
         debug("OBEX_ResumeRequest at %s:%d (%s)\n", __FILE__, __LINE__, __PRETTY_FUNCTION__);
         OBEX_ResumeRequest(ctx->handle);
@@ -283,6 +301,7 @@
 gboolean gw_obex_xfer_read(GwObexXfer *xfer, char *buf, gint buf_size,
 		           gint *bytes_read, gint *err) {
     GwObex *ctx = xfer->ctx;
+    gint data_length;
     gboolean ret = TRUE;
 
     debug("gw_obex_xfer_read(buf_size=%d): entered\n", buf_size);
@@ -331,7 +350,8 @@
         }
     }
 
-    *bytes_read = buf_size < xfer->data_length ? buf_size : xfer->data_length;
+    data_length = xfer->data_length;
+    *bytes_read = buf_size < data_length ? buf_size : data_length;
 
     memcpy(buf, &xfer->buf[xfer->data_start], *bytes_read);
 
@@ -400,6 +420,7 @@
 
 void _gw_obex_xfer_free(struct gw_obex_xfer *xfer) {
     g_free(xfer->buf);
+    g_free(xfer->apparam_buf);
     g_free(xfer);
 }
 

Modified: projects/connectivity/osso-gwobex/trunk/src/obex-xfer.h
===================================================================
--- projects/connectivity/osso-gwobex/trunk/src/obex-xfer.h	2009-04-02 10:32:47 UTC (rev 17989)
+++ projects/connectivity/osso-gwobex/trunk/src/obex-xfer.h	2009-04-02 10:59:08 UTC (rev 17990)
@@ -58,6 +58,10 @@
     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;


More information about the maemo-commits mailing list