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