From ac94e9bd284043150693943d34ec690a0a277232 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Thu, 25 Feb 2010 17:24:59 -0300 Subject: [PATCH] obexd: Initial core cleanup Changed connect function of OBEX service driver to avoid access internal obex session structure attributes. --- obexd/plugins/ftp.c | 22 ++++----------------- obexd/plugins/opp.c | 10 ++++------ obexd/plugins/pbap.c | 20 +++---------------- obexd/plugins/syncevolution.c | 22 ++++++++++++--------- obexd/src/dbus.h | 3 +++ obexd/src/manager.c | 11 +++++++++++ obexd/src/obex.c | 36 +++++++++++++++++++++++++++++++++-- obexd/src/obex.h | 3 +++ obexd/src/service.c | 2 +- obexd/src/service.h | 4 +++- 10 files changed, 79 insertions(+), 54 deletions(-) diff --git a/obexd/plugins/ftp.c b/obexd/plugins/ftp.c index c3a419346..b7f16f100 100644 --- a/obexd/plugins/ftp.c +++ b/obexd/plugins/ftp.c @@ -182,25 +182,11 @@ static gint ftp_prepare_get(struct obex_session *os, gchar *file, return os_prepare_get(os, file, size); } -static void ftp_connect(obex_t *obex, obex_object_t *obj) +static obex_rsp_t ftp_connect(struct OBEX_session *os) { - struct obex_session *os = OBEX_GetUserData(obex); - obex_headerdata_t hd; - - register_session(os->cid, os); - emit_session_created(os->cid); - - /* Append received UUID in WHO header */ - hd.bs = FTP_TARGET; - OBEX_ObjectAddHeader(obex, obj, - OBEX_HDR_WHO, hd, sizeof(FTP_TARGET), - OBEX_FL_FIT_ONE_PACKET); - hd.bq4 = os->cid; - OBEX_ObjectAddHeader(obex, obj, - OBEX_HDR_CONNECTION, hd, 4, - OBEX_FL_FIT_ONE_PACKET); - - OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS); + manager_register_session(os); + + return OBEX_RSP_SUCCESS; } static void ftp_get(obex_t *obex, obex_object_t *obj) diff --git a/obexd/plugins/opp.c b/obexd/plugins/opp.c index d531e3c49..aa690f882 100644 --- a/obexd/plugins/opp.c +++ b/obexd/plugins/opp.c @@ -34,9 +34,9 @@ #include #include "plugin.h" +#include "obex.h" #include "service.h" #include "logging.h" -#include "obex.h" #include "dbus.h" #define VCARD_TYPE "text/x-vcard" @@ -93,13 +93,11 @@ \ " -static void opp_connect(obex_t *obex, obex_object_t *obj) +static obex_rsp_t opp_connect(struct OBEX_session *os) { - struct obex_session *os = OBEX_GetUserData(obex); + manager_register_transfer(os); - register_transfer(os->cid, os); - /* OPP doesn't contains target or connection id. */ - OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS); + return OBEX_RSP_SUCCESS; } static void opp_progress(obex_t *obex, obex_object_t *obj) diff --git a/obexd/plugins/pbap.c b/obexd/plugins/pbap.c index 807e68fb5..43d421450 100644 --- a/obexd/plugins/pbap.c +++ b/obexd/plugins/pbap.c @@ -378,25 +378,11 @@ static int pbap_pullvcardentry(obex_t *obex, obex_object_t *obj) return err; } -static void pbap_connect(obex_t *obex, obex_object_t *obj) +static obex_rsp_t pbap_connect(struct OBEX_session *os) { - struct obex_session *os = OBEX_GetUserData(obex); - obex_headerdata_t hd; - - register_session(os->cid, os); - emit_session_created(os->cid); + manager_register_session(os); - /* Append received UUID in WHO header */ - hd.bs = PBAP_TARGET; - OBEX_ObjectAddHeader(obex, obj, - OBEX_HDR_WHO, hd, sizeof(PBAP_TARGET), - OBEX_FL_FIT_ONE_PACKET); - hd.bq4 = os->cid; - OBEX_ObjectAddHeader(obex, obj, - OBEX_HDR_CONNECTION, hd, 4, - OBEX_FL_FIT_ONE_PACKET); - - OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS); + return OBEX_RSP_SUCCESS; } static void pbap_get(obex_t *obex, obex_object_t *obj) diff --git a/obexd/plugins/syncevolution.c b/obexd/plugins/syncevolution.c index 711b5a010..9b7749260 100644 --- a/obexd/plugins/syncevolution.c +++ b/obexd/plugins/syncevolution.c @@ -219,8 +219,7 @@ static void connect_cb(DBusPendingCall *call, void *user_data) g_free(cb_data); /* Append received UUID in WHO header */ - register_session(os->cid, os); - emit_session_created(os->cid); + manager_register_session(os); hd.bs = SYNCML_TARGET; OBEX_ObjectAddHeader(obex, obj, OBEX_HDR_WHO, hd, SYNCML_TARGET_SIZE, @@ -254,9 +253,8 @@ static void process_cb(DBusPendingCall *call, void *user_data) dbus_message_unref(reply); } -static void synce_connect(obex_t *obex, obex_object_t *obj) +static obex_rsp_t synce_connect(struct OBEX_session *os) { - struct obex_session *os = OBEX_GetUserData(obex); DBusConnection *conn; GError *err = NULL; gchar address[18], id[36], transport[36], transport_description[24]; @@ -320,9 +318,13 @@ static void synce_connect(obex_t *obex, obex_object_t *obj) goto failed; } + /* FIXME: completely broken */ + cb_data = g_malloc0(sizeof(struct callback_data)); - cb_data->obex = obex; - cb_data->obj = obj; +#if 0 + cb_data->obex = os->obex; + cb_data->obj = os->obj; +#endif dbus_pending_call_set_notify(call, connect_cb, cb_data, NULL); context = g_new0(struct synce_context, 1); @@ -332,12 +334,14 @@ static void synce_connect(obex_t *obex, obex_object_t *obj) dbus_pending_call_unref(call); dbus_message_unref(msg); +#if 0 + /* FIXME: broken */ OBEX_SuspendRequest(obex, obj); - - return; +#endif + return OBEX_RSP_SUCCESS; failed: - OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN); + return OBEX_RSP_FORBIDDEN; } static void synce_put(obex_t *obex, obex_object_t *obj) diff --git a/obexd/src/dbus.h b/obexd/src/dbus.h index 7c3d360b6..d24085b38 100644 --- a/obexd/src/dbus.h +++ b/obexd/src/dbus.h @@ -47,3 +47,6 @@ gint request_service_authorization(struct server *server, GIOChannel *io, void register_session(guint32 id, struct obex_session *os); void unregister_session(guint32 id); + +void manager_register_session(struct OBEX_session *os); +void manager_register_transfer(struct OBEX_session *os); diff --git a/obexd/src/manager.c b/obexd/src/manager.c index 28ad0e141..962cd4ee2 100644 --- a/obexd/src/manager.c +++ b/obexd/src/manager.c @@ -642,6 +642,11 @@ void emit_transfer_progress(guint32 id, guint32 total, guint32 transfered) g_free(path); } +void manager_register_transfer(struct OBEX_session *os) +{ + register_transfer(os->cid, os); +} + void register_transfer(guint32 id, struct obex_session *os) { gchar *path = g_strdup_printf("/transfer%u", id); @@ -1022,6 +1027,12 @@ void register_session(guint32 id, struct obex_session *os) g_free(path); } +void manager_register_session(struct OBEX_session *os) +{ + register_session(os->cid, os); + emit_session_created(os->cid); +} + void unregister_session(guint32 id) { gchar *path = g_strdup_printf("/session%u", id); diff --git a/obexd/src/obex.c b/obexd/src/obex.c index 3035b1fb4..bd8391722 100644 --- a/obexd/src/obex.c +++ b/obexd/src/obex.c @@ -64,6 +64,21 @@ typedef struct { guint16 mtu; } __attribute__ ((packed)) obex_connect_hdr_t; +static void os_set_response(obex_object_t *obj, obex_rsp_t lastrsp) +{ + guint8 rsp; + + switch (lastrsp) { + case OBEX_RSP_SUCCESS: + rsp = OBEX_RSP_CONTINUE; + break; + default: + rsp = lastrsp; + } + + OBEX_ObjectSetRsp(obj, rsp, lastrsp); +} + static void os_reset_session(struct obex_session *os) { if (os->object) { @@ -182,6 +197,7 @@ static void cmd_connect(struct obex_session *os, guint8 hi; const guint8 *target = NULL, *who = NULL; guint target_size = 0, who_size = 0; + obex_rsp_t rsp; if (OBEX_ObjectGetNonHdrData(obj, &buffer) != sizeof(*nonhdr)) { OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN); @@ -228,8 +244,24 @@ static void cmd_connect(struct obex_session *os, debug("Selected driver: %s", os->service->name); - if (os->service->connect) - os->service->connect(obex, obj); + if (!os->service->connect) { + OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN); + return; + } + + rsp = os->service->connect(os); + if (rsp == OBEX_RSP_SUCCESS && os->service->target) { + hd.bs = os->service->target; + OBEX_ObjectAddHeader(obex, obj, + OBEX_HDR_WHO, hd, 16, + OBEX_FL_FIT_ONE_PACKET); + hd.bq4 = os->cid; + OBEX_ObjectAddHeader(obex, obj, + OBEX_HDR_CONNECTION, hd, 4, + OBEX_FL_FIT_ONE_PACKET); + } + + os_set_response(obj, rsp); } static gboolean chk_cid(obex_t *obex, obex_object_t *obj, guint32 cid) diff --git a/obexd/src/obex.h b/obexd/src/obex.h index 3e206ad07..76dbdc11d 100644 --- a/obexd/src/obex.h +++ b/obexd/src/obex.h @@ -82,6 +82,9 @@ struct obex_session { gboolean finished; }; +/* FIXME: first step to obsfuscate */ +#define OBEX_session obex_session + gint obex_session_start(GIOChannel *io, struct server *server); struct obex_session *obex_get_session(gpointer object); gint obex_tty_session_stop(void); diff --git a/obexd/src/service.c b/obexd/src/service.c index c6ce10165..2a376bec7 100644 --- a/obexd/src/service.c +++ b/obexd/src/service.c @@ -32,9 +32,9 @@ #include #include +#include "obex.h" #include "service.h" #include "logging.h" -#include "obex.h" static GSList *drivers = NULL; diff --git a/obexd/src/service.h b/obexd/src/service.h index 94017adfa..a4f3e34b1 100644 --- a/obexd/src/service.h +++ b/obexd/src/service.h @@ -21,6 +21,8 @@ * */ +typedef guint8 obex_rsp_t; + struct obex_service_driver { const char *name; guint16 service; @@ -30,7 +32,7 @@ struct obex_service_driver { const guint8 *who; guint who_size; const gchar *record; - void (*connect) (obex_t *obex, obex_object_t *obj); + obex_rsp_t (*connect) (struct OBEX_session *os); void (*progress) (obex_t *obex, obex_object_t *obj); void (*get) (obex_t *obex, obex_object_t *obj); void (*put) (obex_t *obex, obex_object_t *obj); -- 2.47.3