From 5bb6f1c0b0236dee7f17be9d90ef58f6d97c9c42 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Mon, 9 Nov 2009 16:00:41 -0300 Subject: [PATCH] obexd: Move service specific code to its respective driver Service specific code should not reside in core so a few extra callbacks was created to receive this code in the drivers --- obexd/plugins/ftp.c | 37 ++++++++++++++++++++++++++++++++-- obexd/plugins/opp.c | 31 +++++++++++++++++++++++++++++ obexd/plugins/pbap.c | 34 +++++++++++++++++++++++++++++++- obexd/src/obex.c | 47 ++++++++------------------------------------ obexd/src/service.h | 3 +++ 5 files changed, 110 insertions(+), 42 deletions(-) diff --git a/obexd/plugins/ftp.c b/obexd/plugins/ftp.c index 0736095b6..f5a8fd0f8 100644 --- a/obexd/plugins/ftp.c +++ b/obexd/plugins/ftp.c @@ -189,6 +189,27 @@ 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) +{ + 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); +} + static void ftp_get(obex_t *obex, obex_object_t *obj) { obex_headerdata_t hv; @@ -432,16 +453,26 @@ done: g_free(fullname); } +static void ftp_disconnect(obex_t *obex) +{ + struct obex_session *os = OBEX_GetUserData(obex); + + emit_session_removed(os->cid); + unregister_session(os->cid); +} + struct obex_service_driver pcsuite = { .name = "Nokia OBEX PC Suite Services", .service = OBEX_PCSUITE, .channel = PCSUITE_CHANNEL, .record = PCSUITE_RECORD, .target = FTP_TARGET, + .connect = ftp_connect, .get = ftp_get, .put = ftp_put, .chkput = ftp_chkput, - .setpath = ftp_setpath + .setpath = ftp_setpath, + .disconnect = ftp_disconnect }; struct obex_service_driver ftp = { @@ -450,10 +481,12 @@ struct obex_service_driver ftp = { .channel = FTP_CHANNEL, .record = FTP_RECORD, .target = FTP_TARGET, + .connect = ftp_connect, .get = ftp_get, .put = ftp_put, .chkput = ftp_chkput, - .setpath = ftp_setpath + .setpath = ftp_setpath, + .disconnect = ftp_disconnect }; static int ftp_init(void) diff --git a/obexd/plugins/opp.c b/obexd/plugins/opp.c index 64de753f7..d7f2999c6 100644 --- a/obexd/plugins/opp.c +++ b/obexd/plugins/opp.c @@ -94,6 +94,15 @@ \ " +static void opp_connect(obex_t *obex, obex_object_t *obj) +{ + struct obex_session *os = OBEX_GetUserData(obex); + + register_transfer(os->cid, os); + /* OPP doesn't contains target or connection id. */ + OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS); +} + static gint opp_chkput(obex_t *obex, obex_object_t *obj) { struct obex_session *os; @@ -132,6 +141,7 @@ static gint opp_chkput(obex_t *obex, obex_object_t *obj) } skip_auth: + emit_transfer_started(os->cid); return os_prepare_put(os); } @@ -199,14 +209,35 @@ fail: OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN); } +static void opp_disconnect(obex_t *obex) +{ + struct obex_session *os = OBEX_GetUserData(obex); + + /* Got an error during a transfer. */ + if (os->object) + emit_transfer_completed(os->cid, os->offset == os->size); + + unregister_transfer(os->cid); +} + +static void opp_reset(obex_t *obex) +{ + struct obex_session *os = OBEX_GetUserData(obex); + + emit_transfer_completed(os->cid, !os->aborted); +} + struct obex_service_driver driver = { .name = "Object Push server", .service = OBEX_OPP, .channel = OPP_CHANNEL, .record = OPP_RECORD, + .connect = opp_connect, + .disconnect = opp_disconnect, .get = opp_get, .put = opp_put, .chkput = opp_chkput, + .reset = opp_reset }; static int opp_init(void) diff --git a/obexd/plugins/pbap.c b/obexd/plugins/pbap.c index c553deb0c..340fb066c 100644 --- a/obexd/plugins/pbap.c +++ b/obexd/plugins/pbap.c @@ -40,6 +40,7 @@ #include "service.h" #include "phonebook.h" #include "telephony.h" +#include "dbus.h" #define PHONEBOOK_TYPE "x-bt/phonebook" #define VCARDLISTING_TYPE "x-bt/vcard-listing" @@ -377,6 +378,27 @@ static int pbap_pullvcardentry(obex_t *obex, obex_object_t *obj) return err; } +static void pbap_connect(obex_t *obex, obex_object_t *obj) +{ + 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 = 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); +} + static void pbap_get(obex_t *obex, obex_object_t *obj) { struct obex_session *session = OBEX_GetUserData(obex); @@ -528,14 +550,24 @@ static void pbap_setpath(obex_t *obex, obex_object_t *obj) OBEX_ObjectSetRsp(obj, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS); } +static void pbap_disconnect(obex_t *obex) +{ + struct obex_session *os = OBEX_GetUserData(obex); + + emit_session_removed(os->cid); + unregister_session(os->cid); +} + struct obex_service_driver pbap = { .name = "Phonebook Access server", .service = OBEX_PBAP, .channel = PBAP_CHANNEL, .record = PBAP_RECORD, .target = PBAP_TARGET, + .connect = pbap_connect, .get = pbap_get, - .setpath = pbap_setpath + .setpath = pbap_setpath, + .disconnect = pbap_disconnect }; static int pbap_init(void) diff --git a/obexd/src/obex.c b/obexd/src/obex.c index bdf370362..b333b6a9c 100644 --- a/obexd/src/obex.c +++ b/obexd/src/obex.c @@ -214,28 +214,8 @@ static void cmd_connect(struct obex_session *os, return; } - if (os->service->service == OBEX_OPP) { - register_transfer(os->cid, os); - /* OPP doesn't contains target or connection id. */ - OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS); - - return; - } - - register_session(cid, os); - emit_session_created(cid); - - /* Append received UUID in WHO header */ - hd.bs = os->service->target; - OBEX_ObjectAddHeader(obex, obj, - OBEX_HDR_WHO, hd, TARGET_SIZE, - OBEX_FL_FIT_ONE_PACKET); - hd.bq4 = cid; - OBEX_ObjectAddHeader(obex, obj, - OBEX_HDR_CONNECTION, hd, 4, - OBEX_FL_FIT_ONE_PACKET); - - OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS); + if (os->service->connect) + os->service->connect(obex, obj); } static gboolean chk_cid(obex_t *obex, obex_object_t *obj, guint32 cid) @@ -501,9 +481,6 @@ gint os_prepare_put(struct obex_session *os) g_free(path); - if (os->service->service == OBEX_OPP) - emit_transfer_started(os->cid); - if (!os->buf) { debug("PUT request checked, no buffered data"); return 0; @@ -754,8 +731,8 @@ static void obex_event(obex_t *obex, obex_object_t *obj, gint mode, break; case OBEX_EV_ABORT: os->aborted = TRUE; - if (os->service->service == OBEX_OPP) - emit_transfer_completed(os->cid, FALSE); + if (os->service->reset) + os->service->reset(obex); os_reset_session(os); OBEX_ObjectSetRsp(obj, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS); break; @@ -767,8 +744,8 @@ static void obex_event(obex_t *obex, obex_object_t *obj, gint mode, case OBEX_CMD_PUT: case OBEX_CMD_GET: os_session_mark_aborted(os); - if (os->service->service == OBEX_OPP) - emit_transfer_completed(os->cid, !os->aborted); + if (os->service->reset) + os->service->reset(obex); os_reset_session(os); break; default: @@ -874,16 +851,8 @@ static void obex_handle_destroy(gpointer user_data) os = OBEX_GetUserData(obex); - if (os->service->service == OBEX_OPP) { - /* Got an error during a transfer. */ - if (os->object) - emit_transfer_completed(os->cid, os->offset == os->size); - - unregister_transfer(os->cid); - } else { - emit_session_removed(os->cid); - unregister_session(os->cid); - } + if (os->service && os->service->disconnect) + os->service->disconnect(obex); obex_session_free(os); diff --git a/obexd/src/service.h b/obexd/src/service.h index 2cf344306..32720e180 100644 --- a/obexd/src/service.h +++ b/obexd/src/service.h @@ -27,10 +27,13 @@ struct obex_service_driver { guint8 channel; const guint8 *target; const gchar *record; + void (*connect) (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); gint (*chkput) (obex_t *obex, obex_object_t *obj); void (*setpath) (obex_t *obex, obex_object_t *obj); + void (*disconnect) (obex_t *obex); + void (*reset) (obex_t *obex); }; int obex_service_driver_register(struct obex_service_driver *driver); -- 2.47.3