From 17ddbe8a0f810faf164bcba92226d232c746d258 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Mon, 31 May 2010 16:30:39 +0300 Subject: [PATCH] obexd: Fix mimetype driver match when service has .who In situation such as pcsuite service driver which has .who we need to fallback to an empty one otherwise it will not be possible to reuse drivers such as capability which doesn't need a specific version in this case. The order is now: who specific: who not NULL, target not NULL and mimetype not NULL non-who/mimetype specific: target not NULL and mimetype not NULL target default: target not NULL general default: target is NULL aka Highlander - there can be only one --- obexd/src/mimetype.c | 31 +++++++++++++++++++++++++-- obexd/src/obex.c | 50 ++++++++++++++++++-------------------------- 2 files changed, 49 insertions(+), 32 deletions(-) diff --git a/obexd/src/mimetype.c b/obexd/src/mimetype.c index 0f638a07e..da281fc4d 100644 --- a/obexd/src/mimetype.c +++ b/obexd/src/mimetype.c @@ -117,7 +117,7 @@ static int set_io_watch(void *object, obex_object_io_func func, return 0; } -struct obex_mime_type_driver *obex_mime_type_driver_find(const uint8_t *target, +static struct obex_mime_type_driver *find_driver(const uint8_t *target, const char *mimetype, const uint8_t *who, unsigned int who_size) { @@ -139,6 +139,33 @@ struct obex_mime_type_driver *obex_mime_type_driver_find(const uint8_t *target, return NULL; } +struct obex_mime_type_driver *obex_mime_type_driver_find(const uint8_t *target, + const char *mimetype, const uint8_t *who, + unsigned int who_size) +{ + struct obex_mime_type_driver *driver; + + driver = find_driver(target, mimetype, who, who_size); + if (driver == NULL) { + if (who != NULL) { + /* Fallback to non-who specific */ + driver = find_driver(target, mimetype, NULL, 0); + if (driver != NULL) + return driver; + } + + if (mimetype != NULL) + /* Fallback to target default */ + driver = find_driver(target, NULL, NULL, 0); + + if (driver == NULL) + /* Fallback to general default */ + driver = find_driver(NULL, NULL, NULL, 0); + } + + return driver; +} + int obex_mime_type_driver_register(struct obex_mime_type_driver *driver) { if (!driver) { @@ -146,7 +173,7 @@ int obex_mime_type_driver_register(struct obex_mime_type_driver *driver) return -EINVAL; } - if (obex_mime_type_driver_find(driver->target, driver->mimetype, + if (find_driver(driver->target, driver->mimetype, driver->who, driver->who_size)) { error("Permission denied: %s could not be registered", driver->mimetype); diff --git a/obexd/src/obex.c b/obexd/src/obex.c index ad6bee137..337c834f9 100644 --- a/obexd/src/obex.c +++ b/obexd/src/obex.c @@ -555,22 +555,17 @@ static void cmd_get(struct obex_session *os, obex_t *obex, obex_object_t *obj) } } - if (!os->driver) { - /* Fallback to target default */ + if (os->type == NULL) os->driver = obex_mime_type_driver_find(os->service->target, - NULL, NULL, 0); - if (!os->driver) { - /* Fallback to general default */ - os->driver = obex_mime_type_driver_find(NULL, - NULL, NULL, 0); - if (!os->driver) { - error("No driver found"); - OBEX_ObjectSetRsp(obj, - OBEX_RSP_NOT_IMPLEMENTED, - OBEX_RSP_NOT_IMPLEMENTED); - return; - } - } + NULL, + os->service->who, + os->service->who_size); + + if (!os->driver) { + error("No driver found"); + OBEX_ObjectSetRsp(obj, OBEX_RSP_NOT_IMPLEMENTED, + OBEX_RSP_NOT_IMPLEMENTED); + return; } err = os->service->get(os, obj, &stream, os->service_data); @@ -789,22 +784,17 @@ static gboolean check_put(obex_t *obex, obex_object_t *obj) OBEX_ObjectReParseHeaders(obex, obj); - if (!os->driver) { - /* Fallback to target default */ + if (os->type == NULL) os->driver = obex_mime_type_driver_find(os->service->target, - NULL, NULL, 0); - if (!os->driver) { - /* Fallback to general default */ - os->driver = obex_mime_type_driver_find(NULL, - NULL, NULL, 0); - if (!os->driver) { - error("No driver found"); - OBEX_ObjectSetRsp(obj, - OBEX_RSP_NOT_IMPLEMENTED, - OBEX_RSP_NOT_IMPLEMENTED); - return FALSE; - } - } + NULL, + os->service->who, + os->service->who_size); + + if (!os->driver) { + error("No driver found"); + OBEX_ObjectSetRsp(obj, OBEX_RSP_NOT_IMPLEMENTED, + OBEX_RSP_NOT_IMPLEMENTED); + return FALSE; } if (!os->service->chkput) -- 2.47.3