From cec04075a7ba438cb0159174d3a11bb9a9a3d044 Mon Sep 17 00:00:00 2001 From: Vinicius Costa Gomes Date: Thu, 25 Feb 2010 20:22:59 -0300 Subject: [PATCH] obexd: Cleanup of get function of OBEX service driver --- obexd/plugins/ftp.c | 48 +++++++++-------------------------- obexd/plugins/opp.c | 48 +++++++++-------------------------- obexd/plugins/pbap.c | 45 +++++++++++++++++--------------- obexd/plugins/syncevolution.c | 19 +++----------- obexd/src/obex.c | 41 +++++++++++++++++++++++++++--- obexd/src/obex.h | 8 +++++- obexd/src/service.h | 2 +- 7 files changed, 96 insertions(+), 115 deletions(-) diff --git a/obexd/plugins/ftp.c b/obexd/plugins/ftp.c index 5da0a1ba1..354eaad97 100644 --- a/obexd/plugins/ftp.c +++ b/obexd/plugins/ftp.c @@ -144,22 +144,21 @@ static const guint8 FTP_TARGET[TARGET_SIZE] = { static const guint8 PCSUITE_WHO[PCSUITE_WHO_SIZE] = { 'P','C',' ','S','u','i','t','e' }; -static gint get_by_type(struct obex_session *os, gchar *type, size_t *size) +static gint get_by_type(struct OBEX_session *os, gchar *type) { if (type == NULL) return -ENOENT; if (g_str_equal(type, CAP_TYPE)) - return os_prepare_get(os, os->server->capability, size); + return obex_stream_start(os, os->server->capability); if (g_str_equal(type, LST_TYPE)) - return os_prepare_get(os, os->current_folder, size); + return obex_stream_start(os, os->current_folder); return -ENOENT; } -static gint ftp_prepare_get(struct obex_session *os, gchar *file, - size_t *size) +static gint ftp_prepare_get(struct obex_session *os, gchar *file) { gboolean root; @@ -179,7 +178,7 @@ static gint ftp_prepare_get(struct obex_session *os, gchar *file, return -EPERM; } - return os_prepare_get(os, file, size); + return obex_stream_start(os, file); } static obex_rsp_t ftp_connect(struct OBEX_session *os) @@ -189,31 +188,24 @@ static obex_rsp_t ftp_connect(struct OBEX_session *os) return OBEX_RSP_SUCCESS; } -static void ftp_get(obex_t *obex, obex_object_t *obj) +static obex_rsp_t ftp_get(struct OBEX_session *os) { - obex_headerdata_t hv; - struct obex_session *os; - size_t size; gint err; gchar *path; - os = OBEX_GetUserData(obex); - if (os == NULL) - return; - if (os->current_folder == NULL) { err = -ENOENT; goto fail; } - err = get_by_type(os, os->type, &size); + err = get_by_type(os, os->type); if (err < 0) { if (!os->name) goto fail; path = g_build_filename(os->current_folder, os->name, NULL); - err = ftp_prepare_get(os, path, &size); + err = ftp_prepare_get(os, path); g_free(path); @@ -221,31 +213,15 @@ static void ftp_get(obex_t *obex, obex_object_t *obj) goto fail; } - hv.bq4 = size; - os->size = size; - OBEX_ObjectAddHeader(obex, obj, OBEX_HDR_LENGTH, hv, 4, 0); - - /* Add body header */ - hv.bs = NULL; - if (size == 0) - OBEX_ObjectAddHeader (obex, obj, OBEX_HDR_BODY, - hv, 0, OBEX_FL_FIT_ONE_PACKET); - else - OBEX_ObjectAddHeader (obex, obj, OBEX_HDR_BODY, - hv, 0, OBEX_FL_STREAM_START); - - OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, - OBEX_RSP_SUCCESS); - - return; + return OBEX_RSP_SUCCESS; fail: switch (err) { case -ENOENT: - OBEX_ObjectSetRsp(obj, OBEX_RSP_NOT_FOUND, OBEX_RSP_NOT_FOUND); - break; + return OBEX_RSP_NOT_FOUND; + default: - OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN); + return OBEX_RSP_FORBIDDEN; } } diff --git a/obexd/plugins/opp.c b/obexd/plugins/opp.c index 34bdbdb42..04bd57a32 100644 --- a/obexd/plugins/opp.c +++ b/obexd/plugins/opp.c @@ -171,50 +171,26 @@ static void opp_put(obex_t *obex, obex_object_t *obj) OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS); } -static void opp_get(obex_t *obex, obex_object_t *obj) +static obex_rsp_t opp_get(struct OBEX_session *os) { - struct obex_session *os; - obex_headerdata_t hv; - size_t size; + const char *type; - os = OBEX_GetUserData(obex); - if (os == NULL) - return; + if (obex_session_get_name(os) == NULL) + return OBEX_RSP_FORBIDDEN; - if (os->name) - goto fail; + type = obex_session_get_type(os); - if (os->type == NULL) - goto fail; + if (type == NULL) + return OBEX_RSP_FORBIDDEN; if (g_str_equal(os->type, VCARD_TYPE)) { - if (os_prepare_get(os, VCARD_FILE, &size) < 0) { - OBEX_ObjectSetRsp(obj, OBEX_RSP_NOT_FOUND, - OBEX_RSP_NOT_FOUND); - return; - } - } else - goto fail; - + if (obex_stream_start(os, VCARD_FILE) < 0) + return OBEX_RSP_NOT_FOUND; - hv.bq4 = size; - OBEX_ObjectAddHeader(obex, obj, OBEX_HDR_LENGTH, hv, 4, 0); - - /* Add body header */ - hv.bs = NULL; - if (size == 0) - OBEX_ObjectAddHeader(obex, obj, OBEX_HDR_BODY, - hv, 0, OBEX_FL_FIT_ONE_PACKET); - else - OBEX_ObjectAddHeader(obex, obj, OBEX_HDR_BODY, - hv, 0, OBEX_FL_STREAM_START); - - OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS); - - return; + } else + return OBEX_RSP_FORBIDDEN; -fail: - OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN); + return OBEX_RSP_SUCCESS; } static void opp_disconnect(struct OBEX_session *os) diff --git a/obexd/plugins/pbap.c b/obexd/plugins/pbap.c index 10fe86338..bb518fa23 100644 --- a/obexd/plugins/pbap.c +++ b/obexd/plugins/pbap.c @@ -385,31 +385,30 @@ static obex_rsp_t pbap_connect(struct OBEX_session *os) return OBEX_RSP_SUCCESS; } -static void pbap_get(obex_t *obex, obex_object_t *obj) +static obex_rsp_t pbap_get(struct OBEX_session *os) { - struct obex_session *session = OBEX_GetUserData(obex); - obex_headerdata_t hd; - gboolean addbody = TRUE; + int addbody = TRUE; + const char *type = obex_session_get_type(os); + const char *name = obex_session_get_name(os); int err; - if (session == NULL) - return; - - if (session->type == NULL) + if (type == NULL) goto fail; - if (g_str_equal(session->type, VCARDLISTING_TYPE) == FALSE - && session->name == NULL) + if (g_str_equal(type, VCARDLISTING_TYPE) == FALSE + && name == NULL) goto fail; - OBEX_ObjectReParseHeaders(obex, obj); - - if (g_str_equal(session->type, PHONEBOOK_TYPE) == TRUE) - err = pbap_pullphonebook(obex, obj, &addbody); - else if (g_str_equal(session->type, VCARDLISTING_TYPE) == TRUE) - err = pbap_pullvcardlisting(obex, obj, &addbody); - else if (g_str_equal(session->type, VCARDENTRY_TYPE) == TRUE) - err = pbap_pullvcardentry(obex, obj); + /* FIXME: broken */ +#if 0 + OBEX_ObjectReParseHeaders(, obj); +#endif + if (g_str_equal(type, PHONEBOOK_TYPE) == TRUE) + err = pbap_pullphonebook(NULL, NULL, NULL); + else if (g_str_equal(type, VCARDLISTING_TYPE) == TRUE) + err = pbap_pullvcardlisting(NULL, NULL, NULL); + else if (g_str_equal(type, VCARDENTRY_TYPE) == TRUE) + err = pbap_pullvcardentry(NULL, NULL); else goto fail; @@ -417,21 +416,25 @@ static void pbap_get(obex_t *obex, obex_object_t *obj) goto fail; if (addbody == TRUE) { +#if 0 OBEX_SuspendRequest(obex, obj); session->size = 0; /* Add body header */ hd.bs = NULL; OBEX_ObjectAddHeader(obex, obj, OBEX_HDR_BODY, - hd, 0, OBEX_FL_STREAM_START); + hd, 0, OBEX_FL_STREAM_START); +#endif } +#if 0 OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS); +#endif - return; + return OBEX_RSP_SUCCESS; fail: - OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN); + return OBEX_RSP_FORBIDDEN; } static gboolean pbap_is_valid_folder(struct obex_session *session) diff --git a/obexd/plugins/syncevolution.c b/obexd/plugins/syncevolution.c index 02fb6fba8..94bb3b4a5 100644 --- a/obexd/plugins/syncevolution.c +++ b/obexd/plugins/syncevolution.c @@ -397,28 +397,15 @@ static void synce_put(obex_t *obex, obex_object_t *obj) OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS); } -static void synce_get(obex_t *obex, obex_object_t *obj) +static obex_rsp_t synce_get(struct OBEX_session *os) { - obex_headerdata_t hd; - struct obex_session *os; struct synce_context *context; - os = OBEX_GetUserData(obex); - if (!os) - return; - context = find_context(os); if (!context) - return; - - if (!context->reply_received) - OBEX_SuspendRequest(obex, obj); - - hd.bs = NULL; - OBEX_ObjectAddHeader(obex, obj, OBEX_HDR_BODY, hd, 0, - OBEX_FL_STREAM_START); + return OBEX_RSP_FORBIDDEN; - OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS); + return OBEX_RSP_SUCCESS; } static void close_cb(DBusPendingCall *call, void *user_data) diff --git a/obexd/src/obex.c b/obexd/src/obex.c index b8e8b5d7d..c07754b38 100644 --- a/obexd/src/obex.c +++ b/obexd/src/obex.c @@ -299,6 +299,7 @@ static void cmd_get(struct obex_session *os, obex_t *obex, obex_object_t *obj) obex_headerdata_t hd; guint hlen; guint8 hi; + guint rsp; if (!os->service) { OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN); @@ -363,7 +364,22 @@ static void cmd_get(struct obex_session *os, obex_t *obex, obex_object_t *obj) } } - os->service->get(obex, obj); + rsp = os->service->get(os); + if (rsp == OBEX_RSP_SUCCESS) { + hd.bq4 = os->size; + OBEX_ObjectAddHeader(obex, obj, OBEX_HDR_LENGTH, hd, 4, 0); + + /* Add body header */ + hd.bs = NULL; + if (os->size == 0) + OBEX_ObjectAddHeader (obex, obj, OBEX_HDR_BODY, + hd, 0, OBEX_FL_FIT_ONE_PACKET); + else + OBEX_ObjectAddHeader (obex, obj, OBEX_HDR_BODY, + hd, 0, OBEX_FL_STREAM_START); + } + + os_set_response(obj, rsp); } static void cmd_setpath(struct obex_session *os, @@ -415,12 +431,13 @@ static void cmd_setpath(struct obex_session *os, os->service->setpath(obex, obj); } -int os_prepare_get(struct obex_session *os, gchar *filename, size_t *size) +int obex_stream_start(struct OBEX_session *os, gchar *filename) { gint err; gpointer object; + size_t size; - object = os->driver->open(filename, O_RDONLY, 0, size, &err); + object = os->driver->open(filename, O_RDONLY, 0, &size, &err); if (object == NULL) { error("open(%s): %s (%d)", filename, strerror(-err), -err); goto fail; @@ -428,8 +445,9 @@ int os_prepare_get(struct obex_session *os, gchar *filename, size_t *size) os->object = object; os->offset = 0; + os->size = size; - if (*size > 0) + if (size > 0) os->buf = g_malloc0(os->tx_mtu); return 0; @@ -1077,3 +1095,18 @@ struct obex_session *obex_get_session(gpointer object) return NULL; } + +const char *obex_session_get_name(struct OBEX_session *os) +{ + return os->name; +} + +const char *obex_session_get_type(struct OBEX_session *os) +{ + return os->type; +} + +ssize_t obex_session_get_size(struct OBEX_session *os) +{ + return os->size; +} diff --git a/obexd/src/obex.h b/obexd/src/obex.h index f710a9f68..4d4f60a18 100644 --- a/obexd/src/obex.h +++ b/obexd/src/obex.h @@ -91,7 +91,7 @@ gint obex_session_start(GIOChannel *io, struct server *server); struct obex_session *obex_get_session(gpointer object); gint obex_tty_session_stop(void); -gint os_prepare_get(struct obex_session *os, gchar *file, size_t *size); +int obex_stream_start(struct OBEX_session *os, gchar *filename); gint os_prepare_put(struct obex_session *os); void server_free(struct server *server); @@ -99,3 +99,9 @@ void server_free(struct server *server); int tty_init(gint service, const gchar *folder, const gchar *capability, gboolean symlinks, const gchar *devnode); void tty_closed(void); + +const char *obex_session_get_name(struct OBEX_session *os); + +ssize_t obex_session_get_size(struct OBEX_session *os); + +const char *obex_session_get_type(struct OBEX_session *os); diff --git a/obexd/src/service.h b/obexd/src/service.h index 3f35b80f7..3b6e4bab3 100644 --- a/obexd/src/service.h +++ b/obexd/src/service.h @@ -34,7 +34,7 @@ struct obex_service_driver { const gchar *record; obex_rsp_t (*connect) (struct OBEX_session *os); void (*progress) (struct OBEX_session *os); - void (*get) (obex_t *obex, obex_object_t *obj); + obex_rsp_t (*get) (struct OBEX_session *os); void (*put) (obex_t *obex, obex_object_t *obj); gint (*chkput) (obex_t *obex, obex_object_t *obj); void (*setpath) (obex_t *obex, obex_object_t *obj); -- 2.47.3