2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.tizenopensource.org/license
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <stdlib.h> /* malloc */
20 #include <string.h> /* strdup, strerror */
21 #include <sys/types.h>
29 #include <com-core_packet.h>
33 #include <package-manager.h>
35 #include <vconf-keys.h>
41 #include "livebox-service.h"
43 #define EAPI __attribute__((visibility("default")))
44 #define DEFAULT_TIMEOUT 2.0
47 static struct supported_size_list {
50 } SIZE_LIST[NR_OF_SIZE_LIST] = {
51 { 172, 172 }, /*!< 1x1 */
52 { 348, 172 }, /*!< 2x1 */
53 { 348, 348 }, /*!< 2x2 */
54 { 700, 172 }, /*!< 4x1 */
55 { 700, 348 }, /*!< 4x2 */
56 { 700, 520 }, /*!< 4x3 */
57 { 700, 700 }, /*!< 4x4 */
58 { 207, 207 }, /*!< 21x21 */
59 { 645, 207 }, /*!< 23x21 */
60 { 645, 645 }, /*!< 23x23 */
66 const char *conf_file;
71 .dbfile = "/opt/dbspace/.livebox.db",
72 .conf_file = "/usr/share/data-provider-master/resolution.ini",
77 static inline int update_info(int width_type, int height_type, int width, int height)
81 if (width_type == 1 && height_type == 1) {
82 DbgPrint("1x1 Updated to %dx%d\n", width, height);
84 } else if (width_type == 2 && height_type == 1) {
85 DbgPrint("2x1 Updated to %dx%d\n", width, height);
87 } else if (width_type == 2 && height_type == 2) {
88 DbgPrint("2x2 Updated to %dx%d\n", width, height);
90 } else if (width_type == 4 && height_type == 1) {
91 DbgPrint("4x1 Updated to %dx%d\n", width, height);
93 } else if (width_type == 4 && height_type == 2) {
94 DbgPrint("4x2 Updated to %dx%d\n", width, height);
96 } else if (width_type == 4 && height_type == 3) {
97 DbgPrint("4x3 Updated to %dx%d\n", width, height);
99 } else if (width_type == 4 && height_type == 4) {
100 DbgPrint("4x4 Updated to %dx%d\n", width, height);
102 } else if (width_type == 21 && height_type == 21) {
103 DbgPrint("Easy 1x1 Updated to %dx%d\n", width, height);
105 } else if (width_type == 23 && height_type == 21) {
106 DbgPrint("Easy 3x1 Updated to %dx%d\n", width, height);
108 } else if (width_type == 23 && height_type == 23) {
109 DbgPrint("Easy 3x3 Updated to %dx%d\n", width, height);
112 ErrPrint("Unknown size type: %dx%d (%dx%d)\n", width_type, height_type, width, height);
116 SIZE_LIST[idx].w = width;
117 SIZE_LIST[idx].h = height;
121 static inline int update_from_file(void)
129 char buffer[MAX_COLUMN];
143 fp = fopen(s_info.conf_file, "r");
145 ErrPrint("Open failed: %s\n", strerror(errno));
155 if (idx == MAX_COLUMN) {
156 ErrPrint("Buffer overflow. Too long line. LINE MUST BE SHOT THAN %d\n", MAX_COLUMN);
162 if (isspace(ch) || ch == EOF)
177 if (sscanf(buffer, "%dx%d", &width_type, &height_type) != 2) {
178 ErrPrint("Invalid syntax: [%s]\n", buffer);
182 } else if (ch == '=') {
185 if (sscanf(buffer, "%dx%d", &width_type, &height_type) != 2) {
186 ErrPrint("Invalid syntax: [%s]\n", buffer);
190 } else if (ch == EOF) {
191 ErrPrint("Invalid Syntax\n");
202 if (isspace(ch) || ch == EOF)
210 if (isspace(ch) || ch == EOF) {
214 if (sscanf(buffer, "%dx%d", &width, &height) != 2) {
215 ErrPrint("Invalid syntax: [%s]\n", buffer);
217 } else if (ch == EOF) {
218 updated += update_info(width_type, height_type, width, height);
225 updated += update_info(width_type, height_type, width, height);
230 if (ch == '\n' || ch == '\r' || ch == '\f')
234 if (ch == '\n' || ch == '\r' || ch == '\f')
238 ErrPrint("Unknown status. couldn't be reach to here\n");
244 return NR_OF_SIZE_LIST - updated;
247 static int update_resolution(void)
259 if (s_info.res_resolved)
262 disp = XOpenDisplay(NULL);
264 ErrPrint("Failed to open a display\n");
268 root = XDefaultRootWindow(disp);
269 if (!XGetGeometry(disp, root, &dummy, &x, &y, &width, &height, &border, &depth)) {
274 if (update_from_file() == 0)
275 DbgPrint("Resolution info is all updated by file\n");
277 DbgPrint("Screen resolution: %dx%d\n", width, height);
278 for (i = 0; i < NR_OF_SIZE_LIST; i++) {
279 SIZE_LIST[i].w = (unsigned int)((double)SIZE_LIST[i].w * (double)width / 720.0f);
280 SIZE_LIST[i].h = (unsigned int)((double)SIZE_LIST[i].h * (double)height / 1280.0f);
281 DbgPrint("(Ratio)Size is updated [%d] %dx%d\n", i, SIZE_LIST[i].w, SIZE_LIST[i].h);
285 s_info.res_resolved = 1;
289 static inline sqlite3 *open_db(void)
293 if (!s_info.handle) {
296 ret = db_util_open(s_info.dbfile, &handle, DB_UTIL_REGISTER_HOOK_METHOD);
297 if (ret != SQLITE_OK) {
298 ErrPrint("Failed to open a DB\n");
302 handle = s_info.handle;
308 static inline void close_db(sqlite3 *handle)
311 db_util_close(handle);
314 static inline int convert_size_from_type(enum livebox_size_type type, int *width, int *height)
319 case LB_SIZE_TYPE_1x1: /*!< 172x172 */
322 case LB_SIZE_TYPE_2x1: /*!< 348x172 */
325 case LB_SIZE_TYPE_2x2: /*!< 348x348 */
328 case LB_SIZE_TYPE_4x1: /*!< 700x172 */
331 case LB_SIZE_TYPE_4x2: /*!< 700x348 */
334 case LB_SIZE_TYPE_4x3: /*!< 700x520 */
337 case LB_SIZE_TYPE_4x4: /*!< 700x700 */
340 case LB_SIZE_TYPE_EASY_1x1: /*< 207x207 */
343 case LB_SIZE_TYPE_EASY_3x1: /*!< 645x207 */
346 case LB_SIZE_TYPE_EASY_3x3: /*!< 645x645 */
353 if (update_resolution() < 0)
354 ErrPrint("Failed to update resolution\n");
356 *width = SIZE_LIST[idx].w;
357 *height = SIZE_LIST[idx].h;
361 EAPI int livebox_service_trigger_update(const char *pkgname, const char *cluster, const char *category)
363 struct packet *packet;
364 struct packet *result;
368 ErrPrint("Invalid argument\n");
372 if (access("/tmp/.live.paused", R_OK) == 0) {
373 DbgPrint("Provider is paused\n");
378 cluster = "user,created";
381 category = "default";
383 packet = packet_create("service_update", "sss", pkgname, cluster, category);
385 ErrPrint("Failed to create a packet for service_update\n");
389 result = com_core_packet_oneshot_send(SERVICE_SOCKET, packet, DEFAULT_TIMEOUT);
390 packet_unref(packet);
393 if (packet_get(result, "i", &ret) != 1) {
394 ErrPrint("Failed to parse a result packet\n");
398 packet_unref(result);
400 ErrPrint("Failed to get result packet\n");
407 EAPI int livebox_service_get_pkglist(int (*cb)(const char *appid, const char *pkgname, int is_prime, void *data), void *data)
423 ret = sqlite3_prepare_v2(handle, "SELECT appid, pkgid, prime FROM pkgmap", -1, &stmt, NULL);
424 if (ret != SQLITE_OK) {
425 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
431 while (sqlite3_step(stmt) == SQLITE_ROW) {
432 appid = (char *)sqlite3_column_text(stmt, 0);
433 if (!appid || !strlen(appid)) {
434 ErrPrint("APPID is not valid\n");
438 pkgid = (char *)sqlite3_column_text(stmt, 1);
439 if (!pkgid || !strlen(pkgid)) {
440 ErrPrint("pkgid is not valid\n");
444 is_prime = sqlite3_column_int(stmt, 2);
448 if (cb(appid, pkgid, is_prime, data) < 0) {
449 DbgPrint("Callback stopped package crawling\n");
455 sqlite3_finalize(stmt);
462 EAPI int livebox_service_get_supported_size_types(const char *pkgid, int *cnt, int *types)
469 if (!types || !cnt || !pkgid)
476 ret = sqlite3_prepare_v2(handle, "SELECT size_type FROM box_size WHERE pkgid = ? ORDER BY size_type ASC", -1, &stmt, NULL);
477 if (ret != SQLITE_OK) {
478 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
483 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, NULL);
484 if (ret != SQLITE_OK) {
485 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
487 sqlite3_finalize(stmt);
492 if (*cnt > NR_OF_SIZE_LIST)
493 *cnt = NR_OF_SIZE_LIST;
496 while (sqlite3_step(stmt) == SQLITE_ROW && ret < *cnt) {
497 size = sqlite3_column_int(stmt, 0);
504 sqlite3_finalize(stmt);
511 static inline char *cur_locale(void)
514 language = vconf_get_str(VCONFKEY_LANGSET);
531 language = strdup("en-us");
533 ErrPrint("Heap: %s\n", strerror(errno));
539 static inline char *get_default_name(const char *pkgid)
550 ret = sqlite3_prepare_v2(handle, "SELECT name FROM client WHERE pkgid = ?", -1, &stmt, NULL);
551 if (ret != SQLITE_OK) {
552 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
557 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, NULL);
558 if (ret != SQLITE_OK) {
559 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
563 ret = sqlite3_step(stmt);
564 if (ret == SQLITE_ROW) {
567 tmp = (const char *)sqlite3_column_text(stmt, 0);
568 if (tmp && strlen(tmp)) {
571 ErrPrint("Heap: %s\n", strerror(errno));
577 sqlite3_finalize(stmt);
582 static inline char *get_default_icon(const char *pkgid)
593 ret = sqlite3_prepare_v2(handle, "SELECT icon FROM client WHERE pkgid = ?", -1, &stmt, NULL);
594 if (ret != SQLITE_OK) {
595 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
600 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, NULL);
601 if (ret != SQLITE_OK) {
602 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
606 ret = sqlite3_step(stmt);
607 if (ret == SQLITE_ROW) {
610 tmp = (const char *)sqlite3_column_text(stmt, 0);
611 if (tmp && strlen(tmp)) {
614 ErrPrint("Heap: %s\n", strerror(errno));
620 sqlite3_finalize(stmt);
625 EAPI char *livebox_service_content(const char *pkgid)
629 char *content = NULL;
636 ret = sqlite3_prepare_v2(handle, "SELECT content FROM client WHERE pkgid = ?", -1, &stmt, NULL);
637 if (ret != SQLITE_OK) {
638 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
643 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, NULL);
644 if (ret != SQLITE_OK) {
645 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
649 ret = sqlite3_step(stmt);
650 if (ret == SQLITE_ROW) {
653 tmp = (const char *)sqlite3_column_text(stmt, 0);
654 if (tmp && strlen(tmp)) {
655 content = strdup(tmp);
657 ErrPrint("Heap: %s\n", strerror(errno));
663 sqlite3_finalize(stmt);
668 EAPI char *livebox_service_setup_appid(const char *lbid)
679 ret = sqlite3_prepare_v2(handle, "SELECT setup FROM client WHERE pkgid = ?", -1, &stmt, NULL);
680 if (ret != SQLITE_OK) {
681 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
687 ret = sqlite3_bind_text(stmt, 1, lbid, -1, NULL);
688 if (ret != SQLITE_OK) {
689 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
693 ret = sqlite3_step(stmt);
694 if (ret == SQLITE_ROW) {
697 tmp = (const char *)sqlite3_column_text(stmt, 0);
698 if (!tmp || !strlen(tmp))
703 ErrPrint("Error: %s\n", strerror(errno));
708 sqlite3_finalize(stmt);
713 EAPI int livebox_service_nodisplay(const char *pkgid)
723 ret = sqlite3_prepare_v2(handle, "SELECT nodisplay FROM client WHERE pkgid = ?", -1, &stmt, NULL);
724 if (ret != SQLITE_OK) {
725 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
730 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, NULL);
731 if (ret != SQLITE_OK) {
732 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
737 ret = sqlite3_step(stmt);
738 if (ret == SQLITE_ROW)
739 ret = !!sqlite3_column_int(stmt, 0);
745 sqlite3_finalize(stmt);
750 EAPI int livebox_service_touch_effect(const char *pkgid)
760 ret = sqlite3_prepare_v2(handle, "SELECT touch_effect FROM client WHERE pkgid = ?", -1, &stmt, NULL);
761 if (ret != SQLITE_OK) {
762 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
767 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, NULL);
768 if (ret != SQLITE_OK) {
769 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
774 ret = sqlite3_step(stmt);
775 if (ret == SQLITE_ROW)
776 ret = !!sqlite3_column_int(stmt, 0);
782 sqlite3_finalize(stmt);
787 EAPI int livebox_service_mouse_event(const char *pkgid)
797 ret = sqlite3_prepare_v2(handle, "SELECT mouse_event FROM client WHERE pkgid = ?", -1, &stmt, NULL);
798 if (ret != SQLITE_OK) {
799 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
804 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, NULL);
805 if (ret != SQLITE_OK) {
806 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
811 ret = sqlite3_step(stmt);
812 if (ret == SQLITE_ROW)
813 ret = !!sqlite3_column_int(stmt, 0);
819 sqlite3_finalize(stmt);
824 EAPI char *livebox_service_preview(const char *pkgid, int size_type)
829 char *preview = NULL;
835 ret = sqlite3_prepare_v2(handle, "SELECT preview FROM box_size WHERE pkgid = ? AND size_type = ?", -1, &stmt, NULL);
836 if (ret != SQLITE_OK) {
837 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
842 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, NULL);
843 if (ret != SQLITE_OK) {
844 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
848 ret = sqlite3_bind_int(stmt, 2, size_type);
849 if (ret != SQLITE_OK) {
850 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
854 ret = sqlite3_step(stmt);
855 if (ret == SQLITE_ROW) {
857 tmp = (const char *)sqlite3_column_text(stmt, 0);
858 if (tmp && strlen(tmp)) {
859 preview = strdup(tmp);
861 ErrPrint("Heap: %s\n", strerror(errno));
867 sqlite3_finalize(stmt);
872 EAPI char *livebox_service_i18n_icon(const char *pkgid, const char *lang)
881 language = strdup(lang);
883 ErrPrint("Heap: %s\n", strerror(errno));
887 language = cur_locale();
898 ret = sqlite3_prepare_v2(handle, "SELECT icon FROM i18n WHERE pkgid = ? AND lang = ?", -1, &stmt, NULL);
899 if (ret != SQLITE_OK) {
900 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
906 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, NULL);
907 if (ret != SQLITE_OK) {
908 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
912 ret = sqlite3_bind_text(stmt, 2, language, -1, NULL);
913 if (ret != SQLITE_OK) {
914 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
918 ret = sqlite3_step(stmt);
919 if (ret == SQLITE_ROW) {
921 tmp = (const char *)sqlite3_column_text(stmt, 0);
922 if (!tmp || !strlen(tmp)) {
923 icon = get_default_icon(pkgid);
927 ErrPrint("Heap: %s\n", strerror(errno));
930 icon = get_default_icon(pkgid);
935 sqlite3_finalize(stmt);
941 EAPI char *livebox_service_i18n_name(const char *pkgid, const char *lang)
950 language = strdup(lang);
952 ErrPrint("Error: %s\n", strerror(errno));
956 language = cur_locale();
967 ret = sqlite3_prepare_v2(handle, "SELECT name FROM i18n WHERE pkgid = ? AND lang = ?", -1, &stmt, NULL);
968 if (ret != SQLITE_OK) {
969 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
975 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, NULL);
976 if (ret != SQLITE_OK) {
977 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
981 ret = sqlite3_bind_text(stmt, 2, language, -1, NULL);
982 if (ret != SQLITE_OK) {
983 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
987 ret = sqlite3_step(stmt);
988 if (ret == SQLITE_ROW) {
990 tmp = (const char *)sqlite3_column_text(stmt, 0);
991 if (!tmp || !strlen(tmp)) {
992 name = get_default_name(pkgid);
996 ErrPrint("Heap: %s\n", strerror(errno));
999 name = get_default_name(pkgid);
1003 sqlite3_reset(stmt);
1004 sqlite3_finalize(stmt);
1010 EAPI int livebox_service_get_supported_sizes(const char *pkgid, int *cnt, int *w, int *h)
1017 if (!w || !h || !cnt || !pkgid)
1024 ret = sqlite3_prepare_v2(handle, "SELECT size_type FROM box_size WHERE pkgid = ? ORDER BY size_type ASC", -1, &stmt, NULL);
1025 if (ret != SQLITE_OK) {
1026 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1031 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, NULL);
1032 if (ret != SQLITE_OK) {
1033 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1034 sqlite3_reset(stmt);
1035 sqlite3_finalize(stmt);
1040 if (*cnt > NR_OF_SIZE_LIST)
1041 *cnt = NR_OF_SIZE_LIST;
1044 while (sqlite3_step(stmt) == SQLITE_ROW && ret < *cnt) {
1045 size = sqlite3_column_int(stmt, 0);
1046 ret += (convert_size_from_type(size, w + ret, h + ret) == 0);
1050 sqlite3_reset(stmt);
1051 sqlite3_finalize(stmt);
1058 EAPI char *livebox_service_libexec(const char *pkgid)
1075 ret = sqlite3_prepare_v2(handle, "SELECT pkgmap.appid, provider.libexec FROM pkgmap, provider WHERE pkgmap.pkgid = ? AND provider.pkgid = ?", -1, &stmt, NULL);
1076 if (ret != SQLITE_OK) {
1077 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1081 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, NULL);
1082 if (ret != SQLITE_OK) {
1083 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1084 sqlite3_finalize(stmt);
1088 ret = sqlite3_bind_text(stmt, 2, pkgid, -1, NULL);
1089 if (ret != SQLITE_OK) {
1090 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1091 sqlite3_finalize(stmt);
1095 if (sqlite3_step(stmt) != SQLITE_ROW) {
1096 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1097 sqlite3_reset(stmt);
1098 sqlite3_finalize(stmt);
1100 libexec = util_conf_get_libexec(pkgid);
1101 DbgPrint("Fallback to conf checker: %s\n", libexec);
1105 appid = (char *)sqlite3_column_text(stmt, 0);
1106 if (!appid || !strlen(appid)) {
1107 ErrPrint("Invalid appid: %s\n", sqlite3_errmsg(handle));
1108 sqlite3_reset(stmt);
1109 sqlite3_finalize(stmt);
1113 path = (char *)sqlite3_column_text(stmt, 1);
1114 if (!path || !strlen(path)) {
1115 ErrPrint("Invalid libexec: %s\n", sqlite3_errmsg(handle));
1116 sqlite3_reset(stmt);
1117 sqlite3_finalize(stmt);
1121 libexec = strdup(path);
1123 ErrPrint("Heap: %s\n", strerror(errno));
1124 sqlite3_reset(stmt);
1125 sqlite3_finalize(stmt);
1129 DbgPrint("libexec: %s\n", libexec);
1131 sqlite3_reset(stmt);
1132 sqlite3_finalize(stmt);
1138 static inline char *get_lb_pkgname_by_appid(const char *appid)
1154 ret = sqlite3_prepare_v2(handle, "SELECT pkgid FROM pkgmap WHERE (appid = ? AND prime = 1) OR pkgid = ?", -1, &stmt, NULL);
1155 if (ret != SQLITE_OK) {
1156 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1161 ret = sqlite3_bind_text(stmt, 1, appid, -1, NULL);
1162 if (ret != SQLITE_OK) {
1163 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1167 ret = sqlite3_bind_text(stmt, 2, appid, -1, NULL);
1168 if (ret != SQLITE_OK) {
1169 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1173 if (sqlite3_step(stmt) != SQLITE_ROW) {
1174 ErrPrint("Error: %s (has no record? - %s)\n", sqlite3_errmsg(handle), appid);
1178 tmp = (char *)sqlite3_column_text(stmt, 0);
1179 if (tmp && strlen(tmp)) {
1180 pkgid = strdup(tmp);
1182 ErrPrint("Heap: %s\n", strerror(errno));
1186 sqlite3_reset(stmt);
1187 sqlite3_finalize(stmt);
1192 EAPI char *livebox_service_pkgname(const char *appid)
1195 pkgmgr_appinfo_h handle;
1202 lb_pkgname = get_lb_pkgname_by_appid(appid);
1208 * Try to get the package id using given appid
1210 ret = pkgmgr_appinfo_get_appinfo(appid, &handle);
1211 if (ret != PKGMGR_R_OK) {
1212 ErrPrint("Failed to get appinfo\n");
1216 ret = pkgmgr_appinfo_get_pkgname(handle, &new_appid);
1217 if (ret != PKGMGR_R_OK) {
1218 pkgmgr_appinfo_destroy_appinfo(handle);
1219 ErrPrint("Failed to get pkgname for (%s)\n", appid);
1223 lb_pkgname = get_lb_pkgname_by_appid(new_appid);
1224 pkgmgr_appinfo_destroy_appinfo(handle);
1226 if (!lb_pkgname && util_validate_livebox_package(appid) == 0)
1227 return strdup(appid);
1232 EAPI char *livebox_service_provider_name(const char *lbid)
1238 char *str = "com.samsung.";
1243 while (str[idx] && lbid[idx] && lbid[idx] == str[idx]) {
1245 if (seq < 2 && lbid[idx] == '.') {
1251 if (!str[idx] && lbid[idx]) {
1253 return strdup(lbid);
1254 } else if (seq < 2) {
1256 if (lbid[idx] == '.') {
1258 } else if (!lbid[idx]) {
1259 ErrPrint("Invalid lbid: %s\n", lbid);
1271 ret = strdup(lbid + stage);
1273 ErrPrint("Error: %s\n", strerror(errno));
1280 EAPI int livebox_service_is_enabled(const char *lbid)
1289 pkgname = livebox_service_appid(lbid);
1293 ret = ail_get_appinfo(pkgname, &ai);
1294 if (ret != AIL_ERROR_OK) {
1299 if (ail_appinfo_get_bool(ai, AIL_PROP_X_SLP_ENABLED_BOOL, &enabled) != AIL_ERROR_OK)
1302 ail_destroy_appinfo(ai);
1304 return enabled == true;
1309 * appid == Package ID
1310 * pkgid == Livebox ID
1312 EAPI char *livebox_service_appid(const char *pkgname)
1318 int is_prime __attribute__((__unused__));
1329 ret = sqlite3_prepare_v2(handle, "SELECT appid, prime FROM pkgmap WHERE pkgid = ? OR appid = ?", -1, &stmt, NULL);
1330 if (ret != SQLITE_OK) {
1331 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1335 ret = sqlite3_bind_text(stmt, 1, pkgname, -1, NULL);
1336 if (ret != SQLITE_OK) {
1337 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1338 sqlite3_reset(stmt);
1339 sqlite3_finalize(stmt);
1343 ret = sqlite3_bind_text(stmt, 2, pkgname, -1, NULL);
1344 if (ret != SQLITE_OK) {
1345 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1346 sqlite3_reset(stmt);
1347 sqlite3_finalize(stmt);
1351 ret = sqlite3_step(stmt);
1352 if (ret != SQLITE_ROW) {
1353 pkgmgr_appinfo_h pkg_handle;
1356 ErrPrint("Has no record?: %s\n", sqlite3_errmsg(handle));
1357 sqlite3_reset(stmt);
1358 sqlite3_finalize(stmt);
1360 ret = pkgmgr_appinfo_get_appinfo(pkgname, &pkg_handle);
1361 if (ret != PKGMGR_R_OK) {
1362 ErrPrint("Failed to get appinfo: %s\n", pkgname);
1366 ret = pkgmgr_appinfo_get_pkgname(pkg_handle, &new_appid);
1367 if (ret != PKGMGR_R_OK) {
1368 ErrPrint("Failed to get pkgname for (%s)\n", appid);
1369 pkgmgr_appinfo_destroy_appinfo(pkg_handle);
1373 appid = strdup(new_appid);
1375 ErrPrint("Heap: %s\n", strerror(errno));
1377 pkgmgr_appinfo_destroy_appinfo(pkg_handle);
1381 tmp = (char *)sqlite3_column_text(stmt, 0);
1382 if (!tmp || !strlen(tmp)) {
1383 ErrPrint("APPID is NIL\n");
1384 sqlite3_reset(stmt);
1385 sqlite3_finalize(stmt);
1389 appid = strdup(tmp);
1391 ErrPrint("Heap: %s\n", strerror(errno));
1392 sqlite3_reset(stmt);
1393 sqlite3_finalize(stmt);
1397 is_prime = sqlite3_column_int(stmt, 1);
1399 sqlite3_reset(stmt);
1400 sqlite3_finalize(stmt);
1406 EAPI char *livebox_service_lb_script_path(const char *pkgid)
1423 ret = sqlite3_prepare_v2(handle, "SELECT pkgmap.appid, provider.box_src FROM provider, pkgmap WHERE pkgmap.pkgid = ? AND provider.pkgid = ?", -1, &stmt, NULL);
1424 if (ret != SQLITE_OK) {
1425 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1429 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, NULL);
1430 if (ret != SQLITE_OK) {
1431 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1432 sqlite3_finalize(stmt);
1436 ret = sqlite3_bind_text(stmt, 2, pkgid, -1, NULL);
1437 if (ret != SQLITE_OK) {
1438 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1439 sqlite3_finalize(stmt);
1443 ret = sqlite3_step(stmt);
1444 if (ret != SQLITE_ROW) {
1445 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1446 sqlite3_reset(stmt);
1447 sqlite3_finalize(stmt);
1451 appid = (char *)sqlite3_column_text(stmt, 0);
1452 if (!appid || !strlen(appid)) {
1453 ErrPrint("Invalid appid : %s\n", sqlite3_errmsg(handle));
1454 sqlite3_reset(stmt);
1455 sqlite3_finalize(stmt);
1459 lb_src = (char *)sqlite3_column_text(stmt, 1);
1460 if (!lb_src || !strlen(lb_src)) {
1461 ErrPrint("No records for lb src : %s\n", sqlite3_errmsg(handle));
1462 sqlite3_reset(stmt);
1463 sqlite3_finalize(stmt);
1467 path = strdup(lb_src);
1469 ErrPrint("Heap: %s\n", strerror(errno));
1470 sqlite3_reset(stmt);
1471 sqlite3_finalize(stmt);
1475 DbgPrint("LB Src: %s\n", path);
1477 sqlite3_reset(stmt);
1478 sqlite3_finalize(stmt);
1484 EAPI char *livebox_service_lb_script_group(const char *pkgid)
1500 ret = sqlite3_prepare_v2(handle, "SELECT box_group FROM provider WHERE pkgid = ?", -1, &stmt, NULL);
1501 if (ret != SQLITE_OK) {
1502 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1506 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, NULL);
1507 if (ret != SQLITE_OK) {
1508 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1509 sqlite3_finalize(stmt);
1513 ret = sqlite3_step(stmt);
1514 if (ret != SQLITE_ROW) {
1515 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1516 sqlite3_reset(stmt);
1517 sqlite3_finalize(stmt);
1521 tmp = (char *)sqlite3_column_text(stmt, 0);
1522 if (tmp && strlen(tmp)) {
1523 group = strdup(tmp);
1525 ErrPrint("Heap: %s\n", strerror(errno));
1528 sqlite3_reset(stmt);
1529 sqlite3_finalize(stmt);
1535 EAPI char *livebox_service_pd_script_path(const char *pkgid)
1552 ret = sqlite3_prepare_v2(handle, "SELECT pkgmap.appid, provider.pd_src FROM provider, pkgmap WHERE provider.pkgid = ? AND pkgmap.pkgid = ?", -1, &stmt, NULL);
1553 if (ret != SQLITE_OK) {
1554 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1558 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, NULL);
1559 if (ret != SQLITE_OK) {
1560 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1561 sqlite3_finalize(stmt);
1565 ret = sqlite3_bind_text(stmt, 2, pkgid, -1, NULL);
1566 if (ret != SQLITE_OK) {
1567 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1568 sqlite3_finalize(stmt);
1572 ret = sqlite3_step(stmt);
1573 if (ret != SQLITE_ROW) {
1574 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1575 sqlite3_reset(stmt);
1576 sqlite3_finalize(stmt);
1580 appid = (char *)sqlite3_column_text(stmt, 0);
1581 if (!appid || !strlen(appid)) {
1582 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1583 sqlite3_reset(stmt);
1584 sqlite3_finalize(stmt);
1588 pd_src = (char *)sqlite3_column_text(stmt, 1);
1589 if (!pd_src || !strlen(pd_src)) {
1590 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1591 sqlite3_reset(stmt);
1592 sqlite3_finalize(stmt);
1596 path = strdup(pd_src);
1598 ErrPrint("Heap: %s\n", strerror(errno));
1599 sqlite3_reset(stmt);
1600 sqlite3_finalize(stmt);
1604 DbgPrint("PD Src: %s\n", path);
1605 sqlite3_reset(stmt);
1606 sqlite3_finalize(stmt);
1612 EAPI char *livebox_service_pd_script_group(const char *pkgid)
1628 ret = sqlite3_prepare_v2(handle, "SELECT pd_group FROM provider WHERE pkgid = ?", -1, &stmt, NULL);
1629 if (ret != SQLITE_OK) {
1630 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1634 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, NULL);
1635 if (ret != SQLITE_OK) {
1636 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1637 sqlite3_finalize(stmt);
1641 ret = sqlite3_step(stmt);
1642 if (ret != SQLITE_ROW) {
1643 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1644 sqlite3_reset(stmt);
1645 sqlite3_finalize(stmt);
1649 tmp = (char *)sqlite3_column_text(stmt, 0);
1650 if (tmp && strlen(tmp)) {
1651 group = strdup(tmp);
1653 ErrPrint("Heap: %s\n", strerror(errno));
1655 sqlite3_reset(stmt);
1656 sqlite3_finalize(stmt);
1662 EAPI int livebox_service_enumerate_cluster_list(int (*cb)(const char *cluster, void *data), void *data)
1666 const char *cluster;
1678 ret = sqlite3_prepare_v2(handle, "SELECT DISTINCT cluster FROM groupinfo", -1, &stmt, NULL);
1679 if (ret != SQLITE_OK) {
1680 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1685 while (sqlite3_step(stmt) == SQLITE_ROW) {
1686 cluster = (const char *)sqlite3_column_text(stmt, 0);
1687 if (!cluster || !strlen(cluster))
1690 if (cb(cluster, data) < 0)
1696 sqlite3_reset(stmt);
1697 sqlite3_finalize(stmt);
1703 EAPI int livebox_service_enumerate_category_list(const char *cluster, int (*cb)(const char *cluster, const char *category, void *data), void *data)
1707 const char *category;
1711 if (!cluster || !cb)
1718 ret = sqlite3_prepare_v2(handle, "SELECT DISTINCT category FROM groupinfo WHERE cluster = ?", -1, &stmt, NULL);
1719 if (ret != SQLITE_OK) {
1720 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1726 while (sqlite3_step(stmt) == SQLITE_ROW) {
1727 category = (const char *)sqlite3_column_text(stmt, 0);
1728 if (!category || !strlen(category))
1731 if (cb(cluster, category, data) < 0)
1737 sqlite3_reset(stmt);
1738 sqlite3_finalize(stmt);
1744 EAPI int livebox_service_init(void)
1746 if (s_info.handle) {
1747 DbgPrint("Already initialized\n");
1748 s_info.init_count++;
1752 s_info.handle = open_db();
1753 if (s_info.handle) {
1754 s_info.init_count++;
1761 EAPI int livebox_service_fini(void)
1763 if (!s_info.handle || s_info.init_count <= 0) {
1764 ErrPrint("Service is not initialized\n");
1768 s_info.init_count--;
1769 if (s_info.init_count > 0) {
1770 DbgPrint("Init count %d\n", s_info.init_count);
1774 db_util_close(s_info.handle);
1775 s_info.handle = NULL;
1779 EAPI int livebox_service_get_size(int type, int *width, int *height)
1790 return convert_size_from_type(type, width, height);
1793 EAPI int livebox_service_size_type(int width, int height)
1797 if (update_resolution() < 0)
1798 ErrPrint("Failed to update the size list\n");
1800 for (idx = 0; idx < NR_OF_SIZE_LIST; idx++) {
1801 if (SIZE_LIST[idx].w == width && SIZE_LIST[idx].h == height)
1807 return LB_SIZE_TYPE_1x1;
1809 return LB_SIZE_TYPE_2x1;
1811 return LB_SIZE_TYPE_2x2;
1813 return LB_SIZE_TYPE_4x1;
1815 return LB_SIZE_TYPE_4x2;
1817 return LB_SIZE_TYPE_4x3;
1819 return LB_SIZE_TYPE_4x4;
1821 return LB_SIZE_TYPE_EASY_1x1;
1823 return LB_SIZE_TYPE_EASY_3x1;
1825 return LB_SIZE_TYPE_EASY_3x3;
1830 return LB_SIZE_TYPE_UNKNOWN;