Fix get widget info bug 86/128786/1
authorHyunho Kang <hhstark.kang@samsung.com>
Thu, 11 May 2017 10:08:30 +0000 (19:08 +0900)
committerHyunho Kang <hhstark.kang@samsung.com>
Thu, 11 May 2017 10:14:12 +0000 (19:14 +0900)
widget_service API return wrong value about
widget inforamtion like size types and preview image path
which has device not supported size.

Change-Id: Ib2191f2e205d3c1897352b427cd2f569e659652a
Signed-off-by: Hyunho Kang <hhstark.kang@samsung.com>
src/widget_service.c

index 2652843..9aaa2cc 100644 (file)
@@ -387,6 +387,34 @@ static int _get_supported_size(int type, int *width, int *height)
        return 0;
 }
 
+static int _convert_to_support_info(int *width, int *height, int *type, int count)
+{
+       int i;
+       int j;
+
+       if (!_is_resolution_loaded) {
+               _resolution_update_from_file();
+               _is_resolution_loaded = true;
+       }
+
+       for (j = 0; j < count; j++) {
+               for (i = 0; i < WIDGET_SIZE_TYPE_MAX; i++) {
+                       if (size_list[i][0] == width[j] &&
+                                       size_list[i][1] == height[j])
+                               break;
+               }
+               if (i == WIDGET_SIZE_TYPE_MAX) {
+                       _E("failed to get supported size type");
+                       return -1;
+               }
+               width[j] = size_list[i][2];
+               height[j] = size_list[i][3];
+               type[j] =  size_list[i][4];
+       }
+
+       return 0;
+}
+
 static int _convert_to_support_size(int *width, int *height, int count)
 {
        int i;
@@ -414,7 +442,7 @@ static int _convert_to_support_size(int *width, int *height, int count)
        return 0;
 }
 
-static int _convert_to_support_size_ratio(int width, int height, int *w, int *h)
+static int _convert_type_to_support_size_ratio(int type, int *w, int *h)
 {
        int i;
 
@@ -424,8 +452,7 @@ static int _convert_to_support_size_ratio(int width, int height, int *w, int *h)
        }
 
        for (i = 0; i < WIDGET_SIZE_TYPE_MAX; i++) {
-               if (size_list[i][2] == width &&
-                               size_list[i][3] == height)
+               if (size_list[i][4] == type)
                        break;
        }
 
@@ -508,6 +535,79 @@ static int _get_widget_supported_sizes(const char *widget_id, uid_t uid,
        return WIDGET_ERROR_NONE;
 }
 
+
+static int _get_widget_supported_info(const char *widget_id, uid_t uid,
+               int *cnt, int **w, int **h, int **t)
+{
+       static const char query[] =
+               "SELECT width, height FROM support_size WHERE classid=?";
+       int ret;
+       sqlite3 *db;
+       sqlite3_stmt *stmt;
+       int count = 0;
+       int i;
+       int *width;
+       int *height;
+       int *type;
+
+       db = _open_db(uid);
+       if (db == NULL)
+               return WIDGET_ERROR_IO_ERROR;
+
+       ret = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
+       if (ret != SQLITE_OK) {
+               /* LCOV_EXCL_START */
+               _E("prepare error: %s", sqlite3_errmsg(db));
+               sqlite3_close_v2(db);
+               return WIDGET_ERROR_FAULT;
+               /* LCOV_EXCL_STOP */
+       }
+
+       sqlite3_bind_text(stmt, 1, widget_id, -1, SQLITE_STATIC);
+
+       while (sqlite3_step(stmt) == SQLITE_ROW)
+               count++;
+
+       if (count == 0) {
+               sqlite3_finalize(stmt);
+               sqlite3_close_v2(db);
+               *cnt = 0;
+               *w = NULL;
+               *h = NULL;
+               return WIDGET_ERROR_NOT_EXIST;
+       }
+
+       sqlite3_reset(stmt);
+       width = malloc(sizeof(int) * count);
+       height = malloc(sizeof(int) * count);
+       type = malloc(sizeof(int) * count);
+
+       for (i = 0; i < count; i++) {
+               sqlite3_step(stmt);
+               _get_column_int(stmt, 0, &width[i]);
+               _get_column_int(stmt, 1, &height[i]);
+       }
+
+       if (_convert_to_support_info(width, height, type, count)) {
+               _E("failed to convert size");
+               free(width);
+               free(height);
+               free(type);
+               sqlite3_finalize(stmt);
+               sqlite3_close_v2(db);
+               return WIDGET_ERROR_FAULT;
+       }
+       *t = type;
+       *w = width;
+       *h = height;
+       *cnt = count;
+
+       sqlite3_finalize(stmt);
+       sqlite3_close_v2(db);
+
+       return WIDGET_ERROR_NONE;
+}
+
 static int _instance_cb(const char *widget_id, const char *instance_id, void *data)
 {
        int ret;
@@ -841,10 +941,8 @@ EAPI int widget_service_get_supported_size_types(const char *widget_id,
                int *cnt, int **types)
 {
        int ret;
-       int i;
        int *width = NULL;
        int *height = NULL;
-       int type;
 
        if (!_is_widget_feature_enabled()) {
                _E("not supported");
@@ -861,11 +959,11 @@ EAPI int widget_service_get_supported_size_types(const char *widget_id,
 
        _D("id : %s", widget_id);
 
-       ret = _get_widget_supported_sizes(widget_id, getuid(), cnt,
-                       &width, &height);
+       ret = _get_widget_supported_info(widget_id, getuid(), cnt,
+                       &width, &height, types);
        if (ret == WIDGET_ERROR_NOT_EXIST)
-               ret = _get_widget_supported_sizes(widget_id, GLOBALAPP_USER,
-                               cnt, &width, &height);
+               ret = _get_widget_supported_info(widget_id, GLOBALAPP_USER,
+                               cnt, &width, &height, types);
 
        if (ret == WIDGET_ERROR_NOT_EXIST) {
                _E("cannot find supported sizes for widget %s", widget_id);
@@ -875,25 +973,6 @@ EAPI int widget_service_get_supported_size_types(const char *widget_id,
                return ret;
        }
 
-       *types = malloc(sizeof(int) * (*cnt));
-       if (*types == NULL) {
-               _E("out of memory");
-               free(width);
-               free(height);
-               return WIDGET_ERROR_OUT_OF_MEMORY;
-       }
-
-       for (i = 0; i < (*cnt); i++) {
-               if (_get_supported_size_type(width[i], height[i], &type)) {
-                       free(*types);
-                       free(width);
-                       free(height);
-                       return WIDGET_ERROR_NOT_SUPPORTED;
-               }
-
-               (*types)[i] = type;
-       }
-
        free(width);
        free(height);
 
@@ -1220,8 +1299,6 @@ EAPI char *widget_service_get_preview_image_path(const char *widget_id,
                widget_size_type_e size_type)
 {
        char *path;
-       int width = -1;
-       int height = -1;
        int w = -1;
        int h = -1;
        char *lang_path;
@@ -1247,16 +1324,7 @@ EAPI char *widget_service_get_preview_image_path(const char *widget_id,
                return NULL;
        }
 
-       if (_get_supported_size(size_type, &width, &height)) {
-               set_last_result(WIDGET_ERROR_NOT_SUPPORTED);
-               return NULL;
-       }
-
-       if (_convert_to_support_size_ratio(width, height, &w, &h)) {
-               set_last_result(WIDGET_ERROR_NOT_SUPPORTED);
-               return NULL;
-       }
-
+       _convert_type_to_support_size_ratio(size_type, &w, &h);
        path = _get_preview_image_path(widget_id, w, h, getuid());
        if (path == NULL && get_last_result() == WIDGET_ERROR_NOT_EXIST)
                path = _get_preview_image_path(widget_id, w, h, GLOBALAPP_USER);