Diff between 85a2f90d5829b68514058dbd520395a506b8c87c and 17ddbe8a0f810faf164bcba92226d232c746d258

Changed Files

File Additions Deletions Status
obexd/src/mimetype.c +29 -2 modified
obexd/src/obex.c +20 -30 modified

Full Patch

diff --git a/obexd/src/mimetype.c b/obexd/src/mimetype.c
index 0f638a0..da281fc 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 ad6bee1..337c834 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)