This email list is read-only.  Emails sent to this list will be discarded
----------------------------------
 client/session.c   |    2 +-
 gwobex/gw-obex.h   |   10 +++++
 gwobex/obex-priv.c |   25 ++++++++----
 gwobex/obex-xfer.c |    7 +++
 gwobex/obex-xfer.h |    4 ++
 src/obex.c         |    1 +
 src/obex.h         |    1 +
 src/pbap.c         |  106 +++++++++++++++++++++++++++++++++++++++++++++++++--
 8 files changed, 142 insertions(+), 14 deletions(-)

New commits:
commit 95f53bef9ff20c553400b8aa13afa27c04d7d588
Author: Marcel Holtmann <[EMAIL PROTECTED]>
Date:   Mon Dec 1 11:21:16 2008 +0100

    Some minor cleanups

commit 5c1d5721c87e6aec69617da3279d65fe0e5acf90
Merge: 2bff28ff83f3c828051ee59b0458d63bb41d627c 
87b34ceff1204ce0f5f003826a1ffca3e0d3bf84
Author: Marcel Holtmann <[EMAIL PROTECTED]>
Date:   Mon Dec 1 11:19:37 2008 +0100

    Merge branch 'app' of http://git.moblin.org/repos/users/raymond/obexd

commit 87b34ceff1204ce0f5f003826a1ffca3e0d3bf84
Author: Raymond Liu <[EMAIL PROTECTED]>
Date:   Mon Dec 1 10:03:27 2008 +0800

    Add low level apparam header support in gw-obex

commit 2bff28ff83f3c828051ee59b0458d63bb41d627c
Author: Marcel Holtmann <[EMAIL PROTECTED]>
Date:   Mon Dec 1 10:40:29 2008 +0100

    Make the style a little bit more consistent

commit cfdb7351d7fba66f8004c59dd06a2131e30e834d
Merge: 6ae7785396dcc1cf888818657337b6ddc279bd80 
a320845ec698416041238f9e4848f195d4bedcc9
Author: Marcel Holtmann <[EMAIL PROTECTED]>
Date:   Mon Dec 1 10:39:41 2008 +0100

    Merge branch 'pbap-dev' of git://git.moblin.org/obexd

commit 6ae7785396dcc1cf888818657337b6ddc279bd80
Author: Raymond Liu <[EMAIL PROTECTED]>
Date:   Mon Dec 1 12:59:36 2008 +0800

    Do not send NULL to g_str_equal for compare

commit a320845ec698416041238f9e4848f195d4bedcc9
Author: Forrest Zhao <[EMAIL PROTECTED]>
Date:   Mon Dec 1 11:42:52 2008 +0800

    implement the PBAP SetPhonebook for PBAP server


Diff in this email is a maximum of 400 lines.
diff --git a/client/session.c b/client/session.c
index b8ec987..c76dabb 100644
--- a/client/session.c
+++ b/client/session.c
@@ -1208,7 +1208,7 @@ int session_get(struct session_data *session, const char 
*type,
                return -EIO;
        }
 
-       if (!g_str_equal(type, "x-obex/folder-listing")) {
+       if (type && !g_str_equal(type, "x-obex/folder-listing")) {
                session->transfer_path = register_transfer(session->conn, 
session);
                if (session->transfer_path == NULL) {
                        if (fd)
diff --git a/gwobex/gw-obex.h b/gwobex/gw-obex.h
index 6f99430..1ac2ca2 100644
--- a/gwobex/gw-obex.h
+++ b/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/gwobex/obex-priv.c b/gwobex/obex-priv.c
index d67a4ac..86e9dd9 100644
--- a/gwobex/obex-priv.c
+++ b/gwobex/obex-priv.c
@@ -330,22 +330,32 @@ 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 = 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 @@ 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/gwobex/obex-xfer.c b/gwobex/obex-xfer.c
index fcbee35..78d0759 100644
--- a/gwobex/obex-xfer.c
+++ b/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/gwobex/obex-xfer.h b/gwobex/obex-xfer.h
index 9771f02..5a88b13 100644
--- a/gwobex/obex-xfer.h
+++ b/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;
diff --git a/src/obex.c b/src/obex.c
index 0bedbe3..13c3013 100644
--- a/src/obex.c
+++ b/src/obex.c
@@ -86,6 +86,7 @@ struct obex_commands ftp = {
 
 struct obex_commands pbap = {
        .get            = pbap_get,
+       .setpath        = pbap_setpath,
 };
 
 static void os_reset_session(struct obex_session *os)
diff --git a/src/obex.h b/src/obex.h
index 9856e3c..8e61895 100644
--- a/src/obex.h
+++ b/src/obex.h
@@ -99,6 +99,7 @@ gint ftp_chkput(obex_t *obex, obex_object_t *obj);
 void ftp_setpath(obex_t *obex, obex_object_t *obj);
 
 void pbap_get(obex_t *obex, obex_object_t *obj);
+void pbap_setpath(obex_t *obex, obex_object_t *obj);
 gboolean pbap_phonebook_context_create(struct obex_session *session);
 void pbap_phonebook_context_destroy(struct obex_session *session);
 struct obex_session *pbap_get_session(struct phonebook_context *context);
diff --git a/src/pbap.c b/src/pbap.c
index 2c523ee..efa5209 100644
--- a/src/pbap.c
+++ b/src/pbap.c
@@ -76,7 +76,7 @@ static GSList *session_list = NULL;
 static int pbap_pullphonebook(obex_t *obex, obex_object_t *obj,
                                                        gboolean *addbody)
 {
-       struct obex_session *session;
+       struct obex_session *session = OBEX_GetUserData(obex);
        obex_headerdata_t hd;
        guint8 hi, format, newmissedcalls = 0, rspsize = 0;
        guint16 maxlistcount, liststartoffset, phonebooksize = 0;
@@ -85,8 +85,6 @@ static int pbap_pullphonebook(obex_t *obex, obex_object_t 
*obj,
        gboolean addmissedcalls = FALSE;
        int err;
 
-       session = OBEX_GetUserData(obex);
-
        while (OBEX_ObjectGetNextHeader(obex, obj, &hi, &hd, &hlen)) {
                void *ptr = (void *) hd.bs;
                uint32_t len = hlen;
@@ -201,12 +199,11 @@ static int pbap_pullphonebook(obex_t *obex, obex_object_t 
*obj,
 
 void pbap_get(obex_t *obex, obex_object_t *obj)
 {
-       struct obex_session *session;
+       struct obex_session *session = OBEX_GetUserData(obex);
        obex_headerdata_t hd;
        gboolean addbody = TRUE;
        int err;
 
-       session = OBEX_GetUserData(obex);
        if (session == NULL)
                return;
 
@@ -241,6 +238,105 @@ fail:
        OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN);
 }
 
+static gboolean pbap_is_valid_folder(struct obex_session *session)
+{
+       if (session->current_folder == NULL) {
+               if (g_str_equal(session->name, "telecom") == TRUE ||
+                       g_str_equal(session->name, "SIM1") == TRUE)
+                       return TRUE;
+       } else if (g_str_equal(session->current_folder, "SIM1") == TRUE) {
+               if (g_str_equal(session->name, "telecom") == TRUE)
+                       return TRUE;
+       } else if (g_str_equal(session->current_folder, "telecom") == TRUE ||
+               g_str_equal(session->current_folder, "SIM1/telecom") == TRUE) {
+               if (g_str_equal(session->name, "pb") == TRUE ||
+                               g_str_equal(session->name, "ich") == TRUE ||
+                               g_str_equal(session->name, "och") == TRUE ||
+                               g_str_equal(session->name, "mch") == TRUE ||
+                               g_str_equal(session->name, "cch") == TRUE)
+                       return TRUE;
+       }
+
+       return FALSE;
+}
+
+void pbap_setpath(obex_t *obex, obex_object_t *obj)
+{
+       struct obex_session *session = OBEX_GetUserData(obex);
+       guint8 *nonhdr;
+       gchar *fullname;
+
+       if (OBEX_ObjectGetNonHdrData(obj, &nonhdr) != 2) {
+               OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE,
+                               OBEX_RSP_PRECONDITION_FAILED);
+               error("Set path failed: flag and constants not found!");
+               return;
+       }
+
+       /* Check "Backup" flag */
+       if ((nonhdr[0] & 0x01) == 0x01) {
+               debug("Set to parent path");
+
+               if (session->current_folder == NULL) {
+                       /* we are already in top level folder */
+                       OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN,
+                                       OBEX_RSP_FORBIDDEN);
+                       return;
+               }
+
+               fullname = g_path_get_dirname(session->current_folder);
+               g_free(session->current_folder);
+
+               if (strlen(fullname) == 1 && *fullname == '.')
+                       session->current_folder = NULL;
+               else
+                       session->current_folder = g_strdup(fullname);
+
+               g_free(fullname);
+
+               debug("Set to parent path: %s", session->current_folder);
+
+               OBEX_ObjectSetRsp(obj, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS);
+               return;
+       }
+
+       if (!session->name) {
+               OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_BAD_REQUEST);
+               error("Set path failed: name missing!");
+               return;
+       }
+
+       if (strlen(session->name) == 0) {
+               debug("Set to root");
+
+               g_free(session->current_folder);
+               session->current_folder = NULL;
+
+               OBEX_ObjectSetRsp(obj, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS);
+               return;
+       }
+
+       /* Check and set to name path */
+       if (strstr(session->name, "/")) {
+               OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN);
+               error("Set path failed: name incorrect!");
+               return;
+       }
+
+       if (pbap_is_valid_folder(session) == FALSE) {
+               OBEX_ObjectSetRsp(obj, OBEX_RSP_NOT_FOUND, OBEX_RSP_NOT_FOUND);
+               return;
+       }
+
+       fullname = g_build_filename(session->current_folder, session->name, 
NULL);
+
+       debug("Fullname: %s", fullname);
+
+       g_free(session->current_folder);
+       session->current_folder = fullname;
+       OBEX_ObjectSetRsp(obj, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS);
+}
+
 gboolean pbap_phonebook_context_create(struct obex_session *session)
 {
        struct phonebook_context *context;
_______________________________________________
Commits mailing list
[email protected]
https://lists.moblin.org/mailman/listinfo/commits

Reply via email to