From 556447e3b854ebf569bbb0d808806fe55e4f901a Mon Sep 17 00:00:00 2001 From: Vinicius Costa Gomes Date: Fri, 5 Mar 2010 20:18:36 -0300 Subject: [PATCH] obexd: Add support for per service user data --- obexd/plugins/ftp.c | 19 ++++++++++++------- obexd/plugins/opp.c | 20 ++++++++++++-------- obexd/plugins/pbap.c | 19 +++++++++++++------ obexd/plugins/syncevolution.c | 13 ++++++++----- obexd/src/obex-priv.h | 1 + obexd/src/obex.c | 21 ++++++++++++--------- obexd/src/service.h | 16 ++++++++-------- 7 files changed, 66 insertions(+), 43 deletions(-) diff --git a/obexd/plugins/ftp.c b/obexd/plugins/ftp.c index ccba5f267..1b4b27280 100644 --- a/obexd/plugins/ftp.c +++ b/obexd/plugins/ftp.c @@ -186,14 +186,18 @@ static gint ftp_prepare_get(struct obex_session *os, gchar *file) return obex_stream_start(os, file); } -static int ftp_connect(struct obex_session *os) +static gpointer ftp_connect(struct obex_session *os, int *err) { manager_register_session(os); - return 0; + if (err) + *err = 0; + + return NULL; } -static int ftp_get(struct obex_session *os, obex_object_t *obj) +static int ftp_get(struct obex_session *os, obex_object_t *obj, + gpointer user_data) { const char *folder = obex_get_folder(os); const char *type = obex_get_type(os); @@ -247,7 +251,7 @@ static gint ftp_delete(struct obex_session *os) return ret; } -static gint ftp_chkput(struct obex_session *os) +static gint ftp_chkput(struct obex_session *os, gpointer user_data) { if (obex_get_size(os) == OBJECT_SIZE_DELETE) @@ -256,7 +260,7 @@ static gint ftp_chkput(struct obex_session *os) return obex_prepare_put(os); } -static int ftp_put(struct obex_session *os) +static int ftp_put(struct obex_session *os, gpointer user_data) { const char *folder = obex_get_folder(os); const char *name = obex_get_name(os); @@ -274,7 +278,8 @@ static int ftp_put(struct obex_session *os) return 0; } -static int ftp_setpath(struct obex_session *os, obex_object_t *obj) +static int ftp_setpath(struct obex_session *os, obex_object_t *obj, + gpointer user_data) { const gchar *root_folder, *current_folder, *name; guint8 *nonhdr; @@ -372,7 +377,7 @@ done: return err; } -static void ftp_disconnect(struct obex_session *os) +static void ftp_disconnect(struct obex_session *os, gpointer user_data) { manager_unregister_session(os); } diff --git a/obexd/plugins/opp.c b/obexd/plugins/opp.c index 60ef1a2f3..9c1d95904 100644 --- a/obexd/plugins/opp.c +++ b/obexd/plugins/opp.c @@ -93,19 +93,22 @@ \ " -static int opp_connect(struct obex_session *os) +static gpointer opp_connect(struct obex_session *os, int *err) { manager_register_transfer(os); - return 0; + if (err) + *err = 0; + + return NULL; } -static void opp_progress(struct obex_session *os) +static void opp_progress(struct obex_session *os, gpointer user_data) { manager_emit_transfer_progress(os); } -static gint opp_chkput(struct obex_session *os) +static gint opp_chkput(struct obex_session *os, gpointer user_data) { gchar *new_folder, *new_name; gint32 time; @@ -137,7 +140,7 @@ skip_auth: return obex_prepare_put(os); } -static int opp_put(struct obex_session *os) +static int opp_put(struct obex_session *os, gpointer user_data) { const char *name = obex_get_name(os); const char *folder = obex_get_folder(os); @@ -151,7 +154,8 @@ static int opp_put(struct obex_session *os) return 0; } -static int opp_get(struct obex_session *os, obex_object_t *obj) +static int opp_get(struct obex_session *os, obex_object_t *obj, + gpointer user_data) { const char *type; @@ -173,12 +177,12 @@ static int opp_get(struct obex_session *os, obex_object_t *obj) return 0; } -static void opp_disconnect(struct obex_session *os) +static void opp_disconnect(struct obex_session *os, gpointer user_data) { manager_unregister_transfer(os); } -static void opp_reset(struct obex_session *os) +static void opp_reset(struct obex_session *os, gpointer user_data) { manager_emit_transfer_completed(os); } diff --git a/obexd/plugins/pbap.c b/obexd/plugins/pbap.c index 1866854bf..a37b738d4 100644 --- a/obexd/plugins/pbap.c +++ b/obexd/plugins/pbap.c @@ -144,14 +144,18 @@ static const guint8 PBAP_TARGET[TARGET_SIZE] = { 0x79, 0x61, 0x35, 0xF0, 0xF0, 0xC5, 0x11, 0xD8, 0x09, 0x66, 0x08, 0x00, 0x20, 0x0C, 0x9A, 0x66 }; -static int pbap_connect(struct obex_session *os) +static gpointer pbap_connect(struct obex_session *os, int *err) { manager_register_session(os); - return 0; + if (*err) + err = 0; + + return NULL; } -static int pbap_get(struct obex_session *os, obex_object_t *obj) +static int pbap_get(struct obex_session *os, obex_object_t *obj, + gpointer user_data) { const gchar *type = obex_get_type(os); const gchar *folder = obex_get_folder(os); @@ -187,7 +191,8 @@ static int pbap_get(struct obex_session *os, obex_object_t *obj) } -static int pbap_setpath(struct obex_session *os, obex_object_t *obj) +static int pbap_setpath(struct obex_session *os, obex_object_t *obj, + gpointer user_data) { const gchar *current_folder, *name; guint8 *nonhdr; @@ -222,12 +227,14 @@ static int pbap_setpath(struct obex_session *os, obex_object_t *obj) return 0; } -static void pbap_disconnect(struct obex_session *os) +static void pbap_disconnect(struct obex_session *os, + gpointer user_data) { manager_unregister_session(os); } -static gint pbap_chkput(struct obex_session *os) +static gint pbap_chkput(struct obex_session *os, + gpointer user_data) { /* Rejects all PUTs */ return -EINVAL; diff --git a/obexd/plugins/syncevolution.c b/obexd/plugins/syncevolution.c index c255ebfca..a352ede4d 100644 --- a/obexd/plugins/syncevolution.c +++ b/obexd/plugins/syncevolution.c @@ -213,19 +213,22 @@ done: dbus_message_unref(reply); } -static int synce_connect(struct obex_session *os) +static gpointer synce_connect(struct obex_session *os, int *err) { manager_register_session(os); - return 0; + if (err) + *err = 0; + + return NULL; } -static int synce_put(struct obex_session *os) +static int synce_put(struct obex_session *os, gpointer user_data) { return 0; } -static int synce_get(struct obex_session *os, obex_object_t *obj) +static int synce_get(struct obex_session *os, obex_object_t *obj, gpointer user_data) { return 0; } @@ -246,7 +249,7 @@ static void close_cb(DBusPendingCall *call, void *user_data) dbus_message_unref(reply); } -static void synce_disconnect(struct obex_session *os) +static void synce_disconnect(struct obex_session *os, gpointer user_data) { } diff --git a/obexd/src/obex-priv.h b/obexd/src/obex-priv.h index 7bc4dbdba..28deef2ca 100644 --- a/obexd/src/obex-priv.h +++ b/obexd/src/obex-priv.h @@ -53,6 +53,7 @@ struct obex_session { gpointer object; gboolean aborted; struct obex_service_driver *service; + gpointer service_data; struct server *server; gboolean checked; obex_t *obex; diff --git a/obexd/src/obex.c b/obexd/src/obex.c index 3092fc6a4..ab701e21f 100644 --- a/obexd/src/obex.c +++ b/obexd/src/obex.c @@ -222,6 +222,7 @@ static void cmd_connect(struct obex_session *os, const guint8 *target = NULL, *who = NULL; guint target_size = 0, who_size = 0; int err; + gpointer user_data; if (OBEX_ObjectGetNonHdrData(obj, &buffer) != sizeof(*nonhdr)) { OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN); @@ -273,7 +274,7 @@ static void cmd_connect(struct obex_session *os, return; } - err = os->service->connect(os); + user_data = os->service->connect(os, &err); if (err == 0 && os->service->target) { hd.bs = os->service->target; OBEX_ObjectAddHeader(obex, obj, @@ -283,6 +284,8 @@ static void cmd_connect(struct obex_session *os, OBEX_ObjectAddHeader(obex, obj, OBEX_HDR_CONNECTION, hd, 4, OBEX_FL_FIT_ONE_PACKET); + + os->service_data = user_data; } os_set_response(obj, err); @@ -388,7 +391,7 @@ static void cmd_get(struct obex_session *os, obex_t *obex, obex_object_t *obj) } } - err = os->service->get(os, obj); + err = os->service->get(os, obj, os->service_data); if (err == 0) { if (os->size != OBJECT_SIZE_UNKNOWN) { hd.bq4 = os->size; @@ -456,7 +459,7 @@ static void cmd_setpath(struct obex_session *os, break; } - err = os->service->setpath(os, obj); + err = os->service->setpath(os, obj, os->service_data); os_set_response(obj, err); } @@ -773,7 +776,7 @@ static gboolean check_put(obex_t *obex, obex_object_t *obj) return FALSE; } - ret = os->service->chkput(os); + ret = os->service->chkput(os, os->service_data); switch (ret) { case 0: break; @@ -822,7 +825,7 @@ static void cmd_put(struct obex_session *os, obex_t *obex, obex_object_t *obj) return; } - os->service->put(os); + os->service->put(os, os->service_data); } static void obex_event(obex_t *obex, obex_object_t *obj, gint mode, @@ -837,12 +840,12 @@ static void obex_event(obex_t *obex, obex_object_t *obj, gint mode, switch (evt) { case OBEX_EV_PROGRESS: if (os->service->progress) - os->service->progress(os); + os->service->progress(os, os->service_data); break; case OBEX_EV_ABORT: os->aborted = TRUE; if (os->service->reset) - os->service->reset(os); + os->service->reset(os, os->service_data); os_reset_session(os); OBEX_ObjectSetRsp(obj, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS); break; @@ -857,7 +860,7 @@ static void obex_event(obex_t *obex, obex_object_t *obj, gint mode, default: os_session_mark_aborted(os); if (os->service->reset) - os->service->reset(os); + os->service->reset(os, os->service_data); os_reset_session(os); break; } @@ -981,7 +984,7 @@ static void obex_handle_destroy(gpointer user_data) os = OBEX_GetUserData(obex); if (os->service && os->service->disconnect) - os->service->disconnect(os); + os->service->disconnect(os, os->service_data); obex_session_free(os); diff --git a/obexd/src/service.h b/obexd/src/service.h index 615f3597b..1ff960366 100644 --- a/obexd/src/service.h +++ b/obexd/src/service.h @@ -30,14 +30,14 @@ struct obex_service_driver { const guint8 *who; guint who_size; const gchar *record; - int (*connect) (struct obex_session *os); - void (*progress) (struct obex_session *os); - int (*get) (struct obex_session *os, obex_object_t *obj); - int (*put) (struct obex_session *os); - gint (*chkput) (struct obex_session *os); - int (*setpath) (struct obex_session *os, obex_object_t *obj); - void (*disconnect) (struct obex_session *os); - void (*reset) (struct obex_session *os); + gpointer (*connect) (struct obex_session *os, int *err); + void (*progress) (struct obex_session *os, gpointer user_data); + int (*get) (struct obex_session *os, obex_object_t *obj, gpointer user_data); + int (*put) (struct obex_session *os, gpointer user_data); + gint (*chkput) (struct obex_session *os, gpointer user_data); + int (*setpath) (struct obex_session *os, obex_object_t *obj, gpointer user_data); + void (*disconnect) (struct obex_session *os, gpointer user_data); + void (*reset) (struct obex_session *os, gpointer user_data); }; int obex_service_driver_register(struct obex_service_driver *driver); -- 2.47.3