From 1dfe8712cb8465b84b2271d216fc88d1688b4a16 Mon Sep 17 00:00:00 2001 From: Kunhoon Baik Date: Fri, 17 Jun 2016 14:08:50 +0900 Subject: [PATCH] Providing backward compatibility for APPs in the store which use libstorage APIs incorrectly. Change-Id: I31e265900f9087123fe1e6a0d31d3c67c7d8cd6b --- src/storage.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/src/storage.c b/src/storage.c index 7a35693..452c230 100644 --- a/src/storage.c +++ b/src/storage.c @@ -40,6 +40,12 @@ const char *dir_path[STORAGE_DIRECTORY_MAX] = { static dd_list *st_int_head; /* Internal storage list */ +static dd_list *compat_cb_list; +struct compat_cb_info { + storage_state_changed_cb user_cb; + void *user_data; +}; + void add_device(const struct storage_ops *st) { DD_LIST_APPEND(st_int_head, st); @@ -259,6 +265,20 @@ API int storage_get_state(int storage_id, storage_state_e *state) return STORAGE_ERROR_NONE; } +static void compat_cb(int storage_id, + storage_dev_e dev, storage_state_e state, + const char *fstype, const char *fsuuid, const char *mountpath, + bool primary, int flags, void *user_data) +{ + struct compat_cb_info* ccb_info; + dd_list *elem; + + if(storage_id == STORAGE_TYPE_EXTERNAL && dev == STORAGE_DEV_EXT_SDCARD){ + DD_LIST_FOREACH(compat_cb_list, elem, ccb_info) + ccb_info->user_cb(storage_id, state, ccb_info->user_data); + } +} + API int storage_set_state_changed_cb(int storage_id, storage_state_changed_cb callback, void *user_data) { const struct storage_ops *st; @@ -266,6 +286,9 @@ API int storage_set_state_changed_cb(int storage_id, storage_state_changed_cb ca int ret; dd_list *elem; + struct compat_cb_info* ccb_info; + static int compat_cb_init = 0; + if (storage_id < 0) return STORAGE_ERROR_NOT_SUPPORTED; @@ -274,6 +297,26 @@ API int storage_set_state_changed_cb(int storage_id, storage_state_changed_cb ca return STORAGE_ERROR_INVALID_PARAMETER; } + /* For backward compatability */ + if (storage_id == STORAGE_TYPE_EXTERNAL) { + if(!compat_cb_init){ + ret = storage_set_changed_cb(STORAGE_TYPE_EXTERNAL, compat_cb, NULL); + if(ret == STORAGE_ERROR_NONE) + compat_cb_init = 1; + else + return ret; + } + + ccb_info = malloc(sizeof(struct compat_cb_info)); + if(ccb_info == NULL) + return STORAGE_ERROR_OPERATION_FAILED; + ccb_info->user_cb = callback; + ccb_info->user_data = user_data; + DD_LIST_APPEND(compat_cb_list, ccb_info); + + return STORAGE_ERROR_NONE; + } + /* Internal storage does not support registering changed callback */ DD_LIST_FOREACH(st_int_head, elem, st) if (st->storage_id == storage_id) @@ -308,6 +351,21 @@ API int storage_unset_state_changed_cb(int storage_id, storage_state_changed_cb return STORAGE_ERROR_INVALID_PARAMETER; } + /* For backward compatability */ + if (storage_id == STORAGE_TYPE_EXTERNAL) { + dd_list *elem_n; + struct compat_cb_info* ccb_info; + + DD_LIST_FOREACH_SAFE(compat_cb_list, elem, elem_n, ccb_info) { + if(ccb_info->user_cb == callback){ + DD_LIST_REMOVE(compat_cb_list, ccb_info); + free(ccb_info); + return STORAGE_ERROR_NONE; + } + } + return STORAGE_ERROR_OPERATION_FAILED; + } + /* Internal storage does not support registering changed callback */ DD_LIST_FOREACH(st_int_head, elem, st) if (st->storage_id == storage_id) -- 2.7.4