2 * Copyright 2013 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.1 (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://floralicense.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>
34 #include <pkgmgr-info.h>
36 #include <vconf-keys.h>
42 #include "livebox-service.h"
43 #include "livebox-errno.h"
45 #define SAMSUNG_PREFIX "com.samsung."
46 #define EAPI __attribute__((visibility("default")))
47 #define DEFAULT_TIMEOUT 2.0
50 static struct supported_size_list {
53 } SIZE_LIST[NR_OF_SIZE_LIST] = {
54 { 175, 175 }, /*!< 1x1 */
55 { 354, 175 }, /*!< 2x1 */
56 { 354, 354 }, /*!< 2x2 */
57 { 712, 175 }, /*!< 4x1 */
58 { 712, 354 }, /*!< 4x2 */
59 { 712, 533 }, /*!< 4x3 */
60 { 712, 712 }, /*!< 4x4 */
61 { 712, 891 }, /*!< 4x5 */
62 { 712, 1070 }, /*!< 4x6 */
63 { 216, 207 }, /*!< 21x21 */
64 { 672, 207 }, /*!< 23x21 */
65 { 672, 672 }, /*!< 23x23 */
66 { 720, 1280 }, /*!< 0x0 */
72 const char *conf_file;
77 .dbfile = "/opt/dbspace/.livebox.db",
78 .conf_file = "/usr/share/data-provider-master/resolution.ini",
83 static inline int update_info(int width_type, int height_type, int width, int height)
87 if (width_type == 1 && height_type == 1) {
89 } else if (width_type == 2 && height_type == 1) {
91 } else if (width_type == 2 && height_type == 2) {
93 } else if (width_type == 4 && height_type == 1) {
95 } else if (width_type == 4 && height_type == 2) {
97 } else if (width_type == 4 && height_type == 3) {
99 } else if (width_type == 4 && height_type == 4) {
101 } else if (width_type == 4 && height_type == 5) {
103 } else if (width_type == 4 && height_type == 6) {
105 } else if (width_type == 21 && height_type == 21) {
107 } else if (width_type == 23 && height_type == 21) {
109 } else if (width_type == 23 && height_type == 23) {
111 } else if (width_type == 0 && height_type == 0) {
114 ErrPrint("Unknown size type: %dx%d (%dx%d)\n", width_type, height_type, width, height);
118 SIZE_LIST[idx].w = width;
119 SIZE_LIST[idx].h = height;
123 static inline int update_from_file(void)
131 char buffer[MAX_COLUMN];
145 fp = fopen(s_info.conf_file, "r");
147 ErrPrint("Open failed: %s\n", strerror(errno));
148 return LB_STATUS_ERROR_IO;
157 if (idx == MAX_COLUMN) {
158 ErrPrint("Buffer overflow. Too long line. LINE MUST BE SHOT THAN %d\n", MAX_COLUMN);
164 if (isspace(ch) || ch == EOF)
179 if (sscanf(buffer, "%dx%d", &width_type, &height_type) != 2) {
180 ErrPrint("Invalid syntax: [%s]\n", buffer);
184 } else if (ch == '=') {
187 if (sscanf(buffer, "%dx%d", &width_type, &height_type) != 2) {
188 ErrPrint("Invalid syntax: [%s]\n", buffer);
192 } else if (ch == EOF) {
193 ErrPrint("Invalid Syntax\n");
204 if (isspace(ch) || ch == EOF)
212 if (isspace(ch) || ch == EOF) {
216 if (sscanf(buffer, "%dx%d", &width, &height) != 2) {
217 ErrPrint("Invalid syntax: [%s]\n", buffer);
219 } else if (ch == EOF) {
220 updated += update_info(width_type, height_type, width, height);
227 updated += update_info(width_type, height_type, width, height);
232 if (ch == '\n' || ch == '\r' || ch == '\f')
236 if (ch == '\n' || ch == '\r' || ch == '\f')
240 ErrPrint("Unknown status. couldn't be reach to here\n");
246 return NR_OF_SIZE_LIST - updated;
249 static int update_resolution(void)
261 if (s_info.res_resolved)
262 return LB_STATUS_SUCCESS;
264 disp = XOpenDisplay(NULL);
266 ErrPrint("Failed to open a display\n");
267 return LB_STATUS_ERROR_FAULT;
270 root = XDefaultRootWindow(disp);
271 if (!XGetGeometry(disp, root, &dummy, &x, &y, &width, &height, &border, &depth)) {
273 return LB_STATUS_ERROR_FAULT;
276 if (update_from_file() == 0)
277 DbgPrint("Resolution info is all updated by file\n");
279 for (i = 0; i < NR_OF_SIZE_LIST; i++) {
280 SIZE_LIST[i].w = (unsigned int)((double)SIZE_LIST[i].w * (double)width / 720.0f);
281 SIZE_LIST[i].h = (unsigned int)((double)SIZE_LIST[i].h * (double)width / 720.0f);
285 s_info.res_resolved = 1;
286 return LB_STATUS_SUCCESS;
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: /*!< 175x175 */
322 case LB_SIZE_TYPE_2x1: /*!< 354x175 */
325 case LB_SIZE_TYPE_2x2: /*!< 354x354 */
328 case LB_SIZE_TYPE_4x1: /*!< 712x175 */
331 case LB_SIZE_TYPE_4x2: /*!< 712x354 */
334 case LB_SIZE_TYPE_4x3: /*!< 712x533 */
337 case LB_SIZE_TYPE_4x4: /*!< 712x712 */
340 case LB_SIZE_TYPE_4x5: /*!< 712x891 */
343 case LB_SIZE_TYPE_4x6: /*!< 712x1070 */
346 case LB_SIZE_TYPE_EASY_1x1: /*< 216x207 */
349 case LB_SIZE_TYPE_EASY_3x1: /*!< 672x207 */
352 case LB_SIZE_TYPE_EASY_3x3: /*!< 672x672 */
355 case LB_SIZE_TYPE_0x0: /*!< 720x1280 */
359 return LB_STATUS_ERROR_INVALID;
362 if (update_resolution() < 0)
363 ErrPrint("Failed to update resolution\n");
365 *width = SIZE_LIST[idx].w;
366 *height = SIZE_LIST[idx].h;
367 return LB_STATUS_SUCCESS;
370 EAPI int livebox_service_change_period(const char *pkgname, const char *id, double period)
372 struct packet *packet;
373 struct packet *result;
377 if (!pkgname || !id || period < 0.0f) {
378 ErrPrint("Invalid argument\n");
379 return LB_STATUS_ERROR_INVALID;
382 uri = util_id_to_uri(id);
384 return LB_STATUS_ERROR_MEMORY;
386 packet = packet_create("service_change_period", "ssd", pkgname, uri, period);
389 ErrPrint("Failed to create a packet for period changing\n");
390 return LB_STATUS_ERROR_FAULT;
393 result = com_core_packet_oneshot_send(SERVICE_SOCKET, packet, DEFAULT_TIMEOUT);
394 packet_unref(packet);
397 if (packet_get(result, "i", &ret) != 1) {
398 ErrPrint("Failed to parse a result packet\n");
399 ret = LB_STATUS_ERROR_INVALID;
401 packet_unref(result);
403 ErrPrint("Failed to get result packet\n");
404 ret = LB_STATUS_ERROR_FAULT;
410 EAPI int livebox_service_trigger_update(const char *pkgname, const char *id, const char *cluster, const char *category, int force)
412 struct packet *packet;
413 struct packet *result;
418 ErrPrint("Invalid argument\n");
419 return LB_STATUS_ERROR_INVALID;
422 if (!force && access("/tmp/.live.paused", R_OK) == 0) {
423 DbgPrint("Provider is paused\n");
424 return LB_STATUS_ERROR_CANCEL;
427 uri = util_id_to_uri(id);
429 return LB_STATUS_ERROR_MEMORY;
432 cluster = "user,created";
435 category = "default";
437 packet = packet_create("service_update", "ssss", pkgname, uri, cluster, category);
440 ErrPrint("Failed to create a packet for service_update\n");
441 return LB_STATUS_ERROR_FAULT;
444 result = com_core_packet_oneshot_send(SERVICE_SOCKET, packet, DEFAULT_TIMEOUT);
445 packet_unref(packet);
448 if (packet_get(result, "i", &ret) != 1) {
449 ErrPrint("Failed to parse a result packet\n");
450 ret = LB_STATUS_ERROR_INVALID;
453 packet_unref(result);
455 ErrPrint("Failed to get result packet\n");
456 ret = LB_STATUS_ERROR_FAULT;
462 EAPI int livebox_service_get_pkglist(int (*cb)(const char *appid, const char *pkgname, int is_prime, void *data), void *data)
472 return LB_STATUS_ERROR_INVALID;
476 return LB_STATUS_ERROR_IO;
478 ret = sqlite3_prepare_v2(handle, "SELECT appid, pkgid, prime FROM pkgmap", -1, &stmt, NULL);
479 if (ret != SQLITE_OK) {
480 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
481 ret = LB_STATUS_ERROR_IO;
486 while (sqlite3_step(stmt) == SQLITE_ROW) {
487 appid = (char *)sqlite3_column_text(stmt, 0);
488 if (!appid || !strlen(appid)) {
489 ErrPrint("APPID is not valid\n");
493 pkgid = (char *)sqlite3_column_text(stmt, 1);
494 if (!pkgid || !strlen(pkgid)) {
495 ErrPrint("pkgid is not valid\n");
499 is_prime = sqlite3_column_int(stmt, 2);
503 if (cb(appid, pkgid, is_prime, data) < 0) {
504 DbgPrint("Callback stopped package crawling\n");
510 sqlite3_finalize(stmt);
517 EAPI int livebox_service_get_pkglist_by_pkgid(const char *pkgid, int (*cb)(const char *lbid, int is_prime, void *data), void *data)
526 return LB_STATUS_ERROR_INVALID;
530 return LB_STATUS_ERROR_IO;
532 ret = sqlite3_prepare_v2(handle, "SELECT pkgid, prime FROM pkgmap WHERE appid = ?", -1, &stmt, NULL);
533 if (ret != SQLITE_OK) {
534 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
535 ret = LB_STATUS_ERROR_IO;
539 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
540 if (ret != SQLITE_OK) {
541 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
543 sqlite3_finalize(stmt);
544 ret = LB_STATUS_ERROR_IO;
549 while (sqlite3_step(stmt) == SQLITE_ROW) {
550 lbid = (const char *)sqlite3_column_text(stmt, 0);
551 if (!lbid || !strlen(lbid)) {
552 ErrPrint("LBID is not valid\n");
556 is_prime = sqlite3_column_int(stmt, 1);
560 if (cb(lbid, is_prime, data) < 0) {
561 DbgPrint("Callback stopped package crawling\n");
567 sqlite3_finalize(stmt);
574 struct pkgmgr_cbdata {
576 void (*cb)(const char *lbid, const char *appid, void *data);
580 static int pkgmgr_cb(const pkgmgrinfo_appinfo_h handle, void *user_data)
582 struct pkgmgr_cbdata *cbdata = (struct pkgmgr_cbdata *)user_data;
586 ret = pkgmgrinfo_appinfo_get_appid(handle, &appid);
588 ErrPrint("Unable to get appid\n");
590 cbdata->cb(cbdata->lbid, appid, cbdata->cbdata);
595 static inline char *pkgmgr_get_mainapp(const char *pkgid)
597 pkgmgrinfo_pkginfo_h handle;
600 if (pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle) != PMINFO_R_OK) {
601 ErrPrint("Unable to get mainapp: %s\n", pkgid);
605 if (pkgmgrinfo_pkginfo_get_mainappid(handle, &ret) == PMINFO_R_OK) {
608 ErrPrint("Failed to get mainappid\n");
609 ret = NULL; /* I cannot believe the pkgmgrinfo_pkginfo_get_mainappid. it maybe able to touch my "ret" even though it fails */
613 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
617 static inline int pkgmgr_get_applist(const char *pkgid, const char *lbid, void (*cb)(const char *lbid, const char *appid, void *data), void *data)
619 struct pkgmgr_cbdata cbdata;
620 pkgmgrinfo_pkginfo_h handle;
623 ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle);
625 ErrPrint("Unable to get pkginfo: %s\n", pkgid);
631 cbdata.cbdata = data;
633 ret = pkgmgrinfo_appinfo_get_list(handle, PM_UI_APP, pkgmgr_cb, &cbdata);
635 ErrPrint("Failed to get applist\n");
637 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
641 EAPI int livebox_service_get_applist(const char *lbid, void (*cb)(const char *lbid, const char *appid, void *data), void *data)
650 return LB_STATUS_ERROR_INVALID;
654 return LB_STATUS_ERROR_IO;
656 ret = sqlite3_prepare_v2(handle, "SELECT appid FROM pkgmap WHERE (pkgid = ?) or (appid = ?)", -1, &stmt, NULL);
657 if (ret != SQLITE_OK) {
658 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
659 ret = LB_STATUS_ERROR_IO;
663 ret = sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT);
664 if (ret != SQLITE_OK) {
665 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
666 ret = LB_STATUS_ERROR_IO;
670 ret = sqlite3_bind_text(stmt, 2, lbid, -1, SQLITE_TRANSIENT);
671 if (ret != SQLITE_OK) {
672 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
673 ret = LB_STATUS_ERROR_IO;
677 if (sqlite3_step(stmt) != SQLITE_ROW) {
678 ret = LB_STATUS_ERROR_INVALID;
680 sqlite3_finalize(stmt);
684 tmp = (const char *)sqlite3_column_text(stmt, 0);
685 if (!tmp || !strlen(tmp)) {
686 ErrPrint("Invalid package name (%s)\n", lbid);
687 ret = LB_STATUS_ERROR_INVALID;
689 sqlite3_finalize(stmt);
695 ErrPrint("Error: %s\n", strerror(errno));
696 ret = LB_STATUS_ERROR_MEMORY;
698 sqlite3_finalize(stmt);
703 sqlite3_finalize(stmt);
705 ret = pkgmgr_get_applist(pkgid, lbid, cb, data);
713 EAPI char *livebox_service_mainappid(const char *lbid)
728 if (sqlite3_prepare_v2(handle, "SELECT appid, uiapp FROM pkgmap WHERE (pkgid = ?) or (appid = ? and prime = 1)", -1, &stmt, NULL) != SQLITE_OK) {
729 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
733 if (sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT) != SQLITE_OK) {
734 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
738 if (sqlite3_bind_text(stmt, 2, lbid, -1, SQLITE_TRANSIENT) != SQLITE_OK) {
739 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
743 if (sqlite3_step(stmt) != SQLITE_ROW) {
745 sqlite3_finalize(stmt);
749 tmp = (const char *)sqlite3_column_text(stmt, 0);
750 if (!tmp || !strlen(tmp)) {
751 ErrPrint("Invalid package name (%s)\n", lbid);
753 sqlite3_finalize(stmt);
757 pkgid = (const char *)sqlite3_column_text(stmt, 1);
758 if (!pkgid || !strlen(pkgid)) {
760 * This record has no uiapp.
761 * Try to find the main ui-app id.
763 ret = pkgmgr_get_mainapp(tmp);
767 ErrPrint("Error: %s\n", strerror(errno));
771 sqlite3_finalize(stmt);
778 EAPI int livebox_service_get_supported_size_types(const char *pkgid, int *cnt, int *types)
785 if (!types || !cnt || !pkgid)
786 return LB_STATUS_ERROR_INVALID;
790 return LB_STATUS_ERROR_IO;
792 ret = sqlite3_prepare_v2(handle, "SELECT size_type FROM box_size WHERE pkgid = ? ORDER BY size_type ASC", -1, &stmt, NULL);
793 if (ret != SQLITE_OK) {
794 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
795 ret = LB_STATUS_ERROR_IO;
799 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
800 if (ret != SQLITE_OK) {
801 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
803 sqlite3_finalize(stmt);
804 ret = LB_STATUS_ERROR_IO;
808 if (*cnt > NR_OF_SIZE_LIST)
809 *cnt = NR_OF_SIZE_LIST;
812 while (sqlite3_step(stmt) == SQLITE_ROW && ret < *cnt) {
813 size = sqlite3_column_int(stmt, 0);
820 sqlite3_finalize(stmt);
827 static inline char *cur_locale(void)
830 language = vconf_get_str(VCONFKEY_LANGSET);
847 language = strdup("en-us");
849 ErrPrint("Heap: %s\n", strerror(errno));
855 static inline char *get_default_name(const char *pkgid)
866 ret = sqlite3_prepare_v2(handle, "SELECT name FROM client WHERE pkgid = ?", -1, &stmt, NULL);
867 if (ret != SQLITE_OK) {
868 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
873 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
874 if (ret != SQLITE_OK) {
875 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
879 ret = sqlite3_step(stmt);
880 if (ret == SQLITE_ROW) {
883 tmp = (const char *)sqlite3_column_text(stmt, 0);
884 if (tmp && strlen(tmp)) {
887 ErrPrint("Heap: %s\n", strerror(errno));
893 sqlite3_finalize(stmt);
898 static inline char *get_default_icon(const char *pkgid)
909 ret = sqlite3_prepare_v2(handle, "SELECT icon FROM client WHERE pkgid = ?", -1, &stmt, NULL);
910 if (ret != SQLITE_OK) {
911 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
916 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
917 if (ret != SQLITE_OK) {
918 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
922 ret = sqlite3_step(stmt);
923 if (ret == SQLITE_ROW) {
926 tmp = (const char *)sqlite3_column_text(stmt, 0);
927 if (tmp && strlen(tmp)) {
930 ErrPrint("Heap: %s\n", strerror(errno));
936 sqlite3_finalize(stmt);
941 EAPI char *livebox_service_content(const char *pkgid)
945 char *content = NULL;
952 ret = sqlite3_prepare_v2(handle, "SELECT content FROM client WHERE pkgid = ?", -1, &stmt, NULL);
953 if (ret != SQLITE_OK) {
954 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
959 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
960 if (ret != SQLITE_OK) {
961 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
965 ret = sqlite3_step(stmt);
966 if (ret == SQLITE_ROW) {
969 tmp = (const char *)sqlite3_column_text(stmt, 0);
970 if (tmp && strlen(tmp)) {
971 content = strdup(tmp);
973 ErrPrint("Heap: %s\n", strerror(errno));
979 sqlite3_finalize(stmt);
984 EAPI char *livebox_service_setup_appid(const char *lbid)
995 ret = sqlite3_prepare_v2(handle, "SELECT setup FROM client WHERE pkgid = ?", -1, &stmt, NULL);
996 if (ret != SQLITE_OK) {
997 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1003 ret = sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT);
1004 if (ret != SQLITE_OK) {
1005 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1009 ret = sqlite3_step(stmt);
1010 if (ret == SQLITE_ROW) {
1013 tmp = (const char *)sqlite3_column_text(stmt, 0);
1014 if (!tmp || !strlen(tmp))
1017 appid = strdup(tmp);
1019 ErrPrint("Error: %s\n", strerror(errno));
1023 sqlite3_reset(stmt);
1024 sqlite3_finalize(stmt);
1029 EAPI int livebox_service_nodisplay(const char *pkgid)
1039 ret = sqlite3_prepare_v2(handle, "SELECT nodisplay FROM client WHERE pkgid = ?", -1, &stmt, NULL);
1040 if (ret != SQLITE_OK) {
1041 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1046 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1047 if (ret != SQLITE_OK) {
1048 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1053 ret = sqlite3_step(stmt);
1054 if (ret == SQLITE_ROW)
1055 ret = !!sqlite3_column_int(stmt, 0);
1060 sqlite3_reset(stmt);
1061 sqlite3_finalize(stmt);
1066 static inline char *get_lb_pkgname_by_appid(const char *appid)
1082 ret = sqlite3_prepare_v2(handle, "SELECT pkgid FROM pkgmap WHERE (appid = ? AND prime = 1) OR pkgid = ?", -1, &stmt, NULL);
1083 if (ret != SQLITE_OK) {
1084 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1089 ret = sqlite3_bind_text(stmt, 1, appid, -1, SQLITE_TRANSIENT);
1090 if (ret != SQLITE_OK) {
1091 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1095 ret = sqlite3_bind_text(stmt, 2, appid, -1, SQLITE_TRANSIENT);
1096 if (ret != SQLITE_OK) {
1097 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1101 if (sqlite3_step(stmt) != SQLITE_ROW) {
1102 ErrPrint("Error: %s (has no record? - %s)\n", sqlite3_errmsg(handle), appid);
1106 tmp = (char *)sqlite3_column_text(stmt, 0);
1107 if (tmp && strlen(tmp)) {
1108 pkgid = strdup(tmp);
1110 ErrPrint("Heap: %s\n", strerror(errno));
1114 sqlite3_reset(stmt);
1115 sqlite3_finalize(stmt);
1120 EAPI int livebox_service_need_frame(const char *pkgid, int size_type)
1129 ErrPrint("Unable to open a DB\n");
1133 ret = sqlite3_prepare_v2(handle, "SELECT need_frame FROM box_size WHERE pkgid = ? AND size_type = ?", -1, &stmt, NULL);
1134 if (ret != SQLITE_OK) {
1135 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1142 lbid = livebox_service_pkgname(pkgid);
1144 ErrPrint("Invalid appid (%s)\n", pkgid);
1149 ret = sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT);
1151 if (ret != SQLITE_OK) {
1152 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1157 ret = sqlite3_bind_int(stmt, 2, size_type);
1158 if (ret != SQLITE_OK) {
1159 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1164 ret = sqlite3_step(stmt);
1165 if (ret == SQLITE_ROW) {
1166 ret = !!sqlite3_column_int(stmt, 0);
1169 ErrPrint("There is no such result\n");
1172 sqlite3_reset(stmt);
1173 sqlite3_finalize(stmt);
1178 EAPI int livebox_service_touch_effect(const char *pkgid, int size_type)
1187 ErrPrint("Unable to open a DB\n");
1191 ret = sqlite3_prepare_v2(handle, "SELECT touch_effect FROM box_size WHERE pkgid = ? AND size_type = ?", -1, &stmt, NULL);
1192 if (ret != SQLITE_OK) {
1193 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1200 * This function will validate the "pkgid"
1201 * call the exported API in the exported API is not recomended
1204 lbid = livebox_service_pkgname(pkgid);
1206 ErrPrint("Invalid appid (%s)\n", pkgid);
1211 ret = sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT);
1213 if (ret != SQLITE_OK) {
1214 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1219 ret = sqlite3_bind_int(stmt, 2, size_type);
1220 if (ret != SQLITE_OK) {
1221 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1226 ret = sqlite3_step(stmt);
1227 if (ret == SQLITE_ROW) {
1228 ret = !!sqlite3_column_int(stmt, 0);
1230 ret = 1; /*!< Default true: In this case the DB is corrupted. */
1231 ErrPrint("There is no result\n");
1235 sqlite3_reset(stmt);
1236 sqlite3_finalize(stmt);
1241 EAPI int livebox_service_mouse_event(const char *pkgid)
1252 ret = sqlite3_prepare_v2(handle, "SELECT mouse_event FROM client WHERE pkgid = ?", -1, &stmt, NULL);
1253 if (ret != SQLITE_OK) {
1254 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1259 lbid = livebox_service_pkgname(pkgid);
1261 ErrPrint("Failed to get lbid: %s\n", pkgid);
1266 ret = sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT);
1268 if (ret != SQLITE_OK) {
1269 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1274 ret = sqlite3_step(stmt);
1275 if (ret == SQLITE_ROW) {
1276 ret = !!sqlite3_column_int(stmt, 0);
1278 ret = 0; /*!< Default is false, In this case the DB is corrupted */
1279 ErrPrint("There is no result.\n");
1283 sqlite3_reset(stmt);
1284 sqlite3_finalize(stmt);
1289 EAPI char *livebox_service_preview(const char *pkgid, int size_type)
1294 char *preview = NULL;
1300 ret = sqlite3_prepare_v2(handle, "SELECT preview FROM box_size WHERE pkgid = ? AND size_type = ?", -1, &stmt, NULL);
1301 if (ret != SQLITE_OK) {
1302 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1307 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1308 if (ret != SQLITE_OK) {
1309 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1313 ret = sqlite3_bind_int(stmt, 2, size_type);
1314 if (ret != SQLITE_OK) {
1315 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1319 ret = sqlite3_step(stmt);
1320 if (ret == SQLITE_ROW) {
1322 tmp = (const char *)sqlite3_column_text(stmt, 0);
1323 if (tmp && strlen(tmp)) {
1324 preview = strdup(tmp);
1326 ErrPrint("Heap: %s\n", strerror(errno));
1331 sqlite3_reset(stmt);
1332 sqlite3_finalize(stmt);
1337 EAPI char *livebox_service_i18n_icon(const char *pkgid, const char *lang)
1346 language = strdup(lang);
1348 ErrPrint("Heap: %s\n", strerror(errno));
1352 language = cur_locale();
1363 ret = sqlite3_prepare_v2(handle, "SELECT icon FROM i18n WHERE pkgid = ? AND lang = ?", -1, &stmt, NULL);
1364 if (ret != SQLITE_OK) {
1365 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1371 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1372 if (ret != SQLITE_OK) {
1373 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1377 ret = sqlite3_bind_text(stmt, 2, language, -1, SQLITE_TRANSIENT);
1378 if (ret != SQLITE_OK) {
1379 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1383 ret = sqlite3_step(stmt);
1384 if (ret == SQLITE_ROW) {
1386 tmp = (const char *)sqlite3_column_text(stmt, 0);
1387 if (!tmp || !strlen(tmp)) {
1388 icon = get_default_icon(pkgid);
1392 ErrPrint("Heap: %s\n", strerror(errno));
1395 icon = get_default_icon(pkgid);
1399 sqlite3_reset(stmt);
1400 sqlite3_finalize(stmt);
1406 EAPI char *livebox_service_i18n_name(const char *pkgid, const char *lang)
1415 language = strdup(lang);
1417 ErrPrint("Error: %s\n", strerror(errno));
1421 language = cur_locale();
1432 ret = sqlite3_prepare_v2(handle, "SELECT name FROM i18n WHERE pkgid = ? AND lang = ?", -1, &stmt, NULL);
1433 if (ret != SQLITE_OK) {
1434 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1440 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1441 if (ret != SQLITE_OK) {
1442 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1446 ret = sqlite3_bind_text(stmt, 2, language, -1, SQLITE_TRANSIENT);
1447 if (ret != SQLITE_OK) {
1448 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1452 ret = sqlite3_step(stmt);
1453 if (ret == SQLITE_ROW) {
1455 tmp = (const char *)sqlite3_column_text(stmt, 0);
1456 if (!tmp || !strlen(tmp)) {
1457 name = get_default_name(pkgid);
1461 ErrPrint("Heap: %s\n", strerror(errno));
1464 name = get_default_name(pkgid);
1468 sqlite3_reset(stmt);
1469 sqlite3_finalize(stmt);
1475 EAPI int livebox_service_get_supported_sizes(const char *pkgid, int *cnt, int *w, int *h)
1482 if (!w || !h || !cnt || !pkgid)
1483 return LB_STATUS_ERROR_INVALID;
1487 return LB_STATUS_ERROR_IO;
1489 ret = sqlite3_prepare_v2(handle, "SELECT size_type FROM box_size WHERE pkgid = ? ORDER BY size_type ASC", -1, &stmt, NULL);
1490 if (ret != SQLITE_OK) {
1491 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1492 ret = LB_STATUS_ERROR_IO;
1496 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1497 if (ret != SQLITE_OK) {
1498 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1499 sqlite3_reset(stmt);
1500 sqlite3_finalize(stmt);
1501 ret = LB_STATUS_ERROR_IO;
1505 if (*cnt > NR_OF_SIZE_LIST)
1506 *cnt = NR_OF_SIZE_LIST;
1509 while (sqlite3_step(stmt) == SQLITE_ROW && ret < *cnt) {
1510 size = sqlite3_column_int(stmt, 0);
1511 ret += (convert_size_from_type(size, w + ret, h + ret) == 0);
1515 sqlite3_reset(stmt);
1516 sqlite3_finalize(stmt);
1523 EAPI char *livebox_service_libexec(const char *pkgid)
1540 ret = sqlite3_prepare_v2(handle, "SELECT pkgmap.appid, provider.libexec FROM pkgmap, provider WHERE pkgmap.pkgid = ? AND provider.pkgid = ?", -1, &stmt, NULL);
1541 if (ret != SQLITE_OK) {
1542 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1546 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1547 if (ret != SQLITE_OK) {
1548 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1549 sqlite3_finalize(stmt);
1553 ret = sqlite3_bind_text(stmt, 2, pkgid, -1, SQLITE_TRANSIENT);
1554 if (ret != SQLITE_OK) {
1555 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1556 sqlite3_finalize(stmt);
1560 if (sqlite3_step(stmt) != SQLITE_ROW) {
1561 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1562 sqlite3_reset(stmt);
1563 sqlite3_finalize(stmt);
1565 libexec = util_conf_get_libexec(pkgid);
1566 DbgPrint("Fallback to conf checker: %s\n", libexec);
1570 appid = (char *)sqlite3_column_text(stmt, 0);
1571 if (!appid || !strlen(appid)) {
1572 ErrPrint("Invalid appid: %s\n", sqlite3_errmsg(handle));
1573 sqlite3_reset(stmt);
1574 sqlite3_finalize(stmt);
1578 path = (char *)sqlite3_column_text(stmt, 1);
1579 if (!path || !strlen(path)) {
1580 ErrPrint("Invalid libexec: %s\n", sqlite3_errmsg(handle));
1581 sqlite3_reset(stmt);
1582 sqlite3_finalize(stmt);
1586 libexec = strdup(path);
1588 ErrPrint("Heap: %s\n", strerror(errno));
1589 sqlite3_reset(stmt);
1590 sqlite3_finalize(stmt);
1594 DbgPrint("libexec: %s\n", libexec);
1596 sqlite3_reset(stmt);
1597 sqlite3_finalize(stmt);
1603 EAPI char *livebox_service_pkgname(const char *appid)
1606 pkgmgr_appinfo_h handle;
1613 lb_pkgname = get_lb_pkgname_by_appid(appid);
1619 * Try to get the package id using given appid
1621 ret = pkgmgr_appinfo_get_appinfo(appid, &handle);
1622 if (ret != PKGMGR_R_OK) {
1623 ErrPrint("Failed to get appinfo\n");
1627 ret = pkgmgr_appinfo_get_pkgname(handle, &new_appid);
1628 if (ret != PKGMGR_R_OK) {
1629 pkgmgr_appinfo_destroy_appinfo(handle);
1630 ErrPrint("Failed to get pkgname for (%s)\n", appid);
1634 lb_pkgname = get_lb_pkgname_by_appid(new_appid);
1635 pkgmgr_appinfo_destroy_appinfo(handle);
1637 if (!lb_pkgname && util_validate_livebox_package(appid) == 0)
1638 return strdup(appid);
1643 EAPI char *livebox_service_provider_name(const char *lbid)
1649 char *str = SAMSUNG_PREFIX;
1654 while (str[idx] && lbid[idx] && lbid[idx] == str[idx]) {
1656 if (seq < 2 && lbid[idx] == '.') {
1662 if (!str[idx] && lbid[idx]) {
1664 return strdup(lbid);
1665 } else if (seq < 2) {
1667 if (lbid[idx] == '.') {
1669 } else if (!lbid[idx]) {
1670 ErrPrint("Invalid lbid: %s\n", lbid);
1682 ret = strdup(lbid + stage);
1684 ErrPrint("Error: %s\n", strerror(errno));
1691 EAPI int livebox_service_is_enabled(const char *lbid)
1700 pkgname = livebox_service_appid(lbid);
1704 ret = ail_get_appinfo(pkgname, &ai);
1705 if (ret != AIL_ERROR_OK) {
1710 if (ail_appinfo_get_bool(ai, AIL_PROP_X_SLP_ENABLED_BOOL, &enabled) != AIL_ERROR_OK)
1713 ail_destroy_appinfo(ai);
1715 return enabled == true;
1719 EAPI int livebox_service_is_primary(const char *lbid)
1732 ret = sqlite3_prepare_v2(handle, "SELECT prime FROM pkgmap WHERE pkgid = ?", -1, &stmt, NULL);
1733 if (ret != SQLITE_OK) {
1734 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1739 ret = sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT);
1740 if (ret != SQLITE_OK) {
1741 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1745 ret = sqlite3_step(stmt);
1746 if (ret != SQLITE_ROW) {
1747 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1751 ret = sqlite3_column_int(stmt, 0);
1754 sqlite3_reset(stmt);
1755 sqlite3_finalize(stmt);
1761 * appid == Package ID
1762 * pkgid == Livebox ID
1764 EAPI char *livebox_service_appid(const char *pkgname)
1770 int is_prime __attribute__((__unused__));
1781 ret = sqlite3_prepare_v2(handle, "SELECT appid, prime FROM pkgmap WHERE pkgid = ? OR appid = ?", -1, &stmt, NULL);
1782 if (ret != SQLITE_OK) {
1783 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1787 ret = sqlite3_bind_text(stmt, 1, pkgname, -1, SQLITE_TRANSIENT);
1788 if (ret != SQLITE_OK) {
1789 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1790 sqlite3_reset(stmt);
1791 sqlite3_finalize(stmt);
1795 ret = sqlite3_bind_text(stmt, 2, pkgname, -1, SQLITE_TRANSIENT);
1796 if (ret != SQLITE_OK) {
1797 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1798 sqlite3_reset(stmt);
1799 sqlite3_finalize(stmt);
1803 ret = sqlite3_step(stmt);
1804 if (ret != SQLITE_ROW) {
1805 pkgmgr_appinfo_h pkg_handle;
1808 ErrPrint("Has no record?: %s\n", sqlite3_errmsg(handle));
1809 sqlite3_reset(stmt);
1810 sqlite3_finalize(stmt);
1812 ret = pkgmgr_appinfo_get_appinfo(pkgname, &pkg_handle);
1813 if (ret != PKGMGR_R_OK) {
1814 ErrPrint("Failed to get appinfo: %s\n", pkgname);
1818 ret = pkgmgr_appinfo_get_pkgname(pkg_handle, &new_appid);
1819 if (ret != PKGMGR_R_OK) {
1820 ErrPrint("Failed to get pkgname for (%s)\n", appid);
1821 pkgmgr_appinfo_destroy_appinfo(pkg_handle);
1825 appid = strdup(new_appid);
1827 ErrPrint("Heap: %s\n", strerror(errno));
1829 pkgmgr_appinfo_destroy_appinfo(pkg_handle);
1833 tmp = (char *)sqlite3_column_text(stmt, 0);
1834 if (!tmp || !strlen(tmp)) {
1835 ErrPrint("APPID is NIL\n");
1836 sqlite3_reset(stmt);
1837 sqlite3_finalize(stmt);
1841 appid = strdup(tmp);
1843 ErrPrint("Heap: %s\n", strerror(errno));
1844 sqlite3_reset(stmt);
1845 sqlite3_finalize(stmt);
1849 is_prime = sqlite3_column_int(stmt, 1);
1851 sqlite3_reset(stmt);
1852 sqlite3_finalize(stmt);
1858 EAPI char *livebox_service_lb_script_path(const char *pkgid)
1875 ret = sqlite3_prepare_v2(handle, "SELECT pkgmap.appid, provider.box_src FROM provider, pkgmap WHERE pkgmap.pkgid = ? AND provider.pkgid = ?", -1, &stmt, NULL);
1876 if (ret != SQLITE_OK) {
1877 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1881 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1882 if (ret != SQLITE_OK) {
1883 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1884 sqlite3_finalize(stmt);
1888 ret = sqlite3_bind_text(stmt, 2, pkgid, -1, SQLITE_TRANSIENT);
1889 if (ret != SQLITE_OK) {
1890 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1891 sqlite3_finalize(stmt);
1895 ret = sqlite3_step(stmt);
1896 if (ret != SQLITE_ROW) {
1897 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1898 sqlite3_reset(stmt);
1899 sqlite3_finalize(stmt);
1903 appid = (char *)sqlite3_column_text(stmt, 0);
1904 if (!appid || !strlen(appid)) {
1905 ErrPrint("Invalid appid : %s\n", sqlite3_errmsg(handle));
1906 sqlite3_reset(stmt);
1907 sqlite3_finalize(stmt);
1911 lb_src = (char *)sqlite3_column_text(stmt, 1);
1912 if (!lb_src || !strlen(lb_src)) {
1913 ErrPrint("No records for lb src : %s\n", sqlite3_errmsg(handle));
1914 sqlite3_reset(stmt);
1915 sqlite3_finalize(stmt);
1919 path = strdup(lb_src);
1921 ErrPrint("Heap: %s\n", strerror(errno));
1922 sqlite3_reset(stmt);
1923 sqlite3_finalize(stmt);
1927 DbgPrint("LB Src: %s\n", path);
1928 sqlite3_reset(stmt);
1929 sqlite3_finalize(stmt);
1935 EAPI char *livebox_service_lb_script_group(const char *pkgid)
1951 ret = sqlite3_prepare_v2(handle, "SELECT box_group FROM provider WHERE pkgid = ?", -1, &stmt, NULL);
1952 if (ret != SQLITE_OK) {
1953 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1957 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1958 if (ret != SQLITE_OK) {
1959 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1960 sqlite3_finalize(stmt);
1964 ret = sqlite3_step(stmt);
1965 if (ret != SQLITE_ROW) {
1966 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1967 sqlite3_reset(stmt);
1968 sqlite3_finalize(stmt);
1972 tmp = (char *)sqlite3_column_text(stmt, 0);
1973 if (tmp && strlen(tmp)) {
1974 group = strdup(tmp);
1976 ErrPrint("Heap: %s\n", strerror(errno));
1979 sqlite3_reset(stmt);
1980 sqlite3_finalize(stmt);
1986 EAPI char *livebox_service_pd_script_path(const char *pkgid)
2003 ret = sqlite3_prepare_v2(handle, "SELECT pkgmap.appid, provider.pd_src FROM provider, pkgmap WHERE provider.pkgid = ? AND pkgmap.pkgid = ?", -1, &stmt, NULL);
2004 if (ret != SQLITE_OK) {
2005 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2009 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
2010 if (ret != SQLITE_OK) {
2011 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2012 sqlite3_finalize(stmt);
2016 ret = sqlite3_bind_text(stmt, 2, pkgid, -1, SQLITE_TRANSIENT);
2017 if (ret != SQLITE_OK) {
2018 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2019 sqlite3_finalize(stmt);
2023 ret = sqlite3_step(stmt);
2024 if (ret != SQLITE_ROW) {
2025 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2026 sqlite3_reset(stmt);
2027 sqlite3_finalize(stmt);
2031 appid = (char *)sqlite3_column_text(stmt, 0);
2032 if (!appid || !strlen(appid)) {
2033 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2034 sqlite3_reset(stmt);
2035 sqlite3_finalize(stmt);
2039 pd_src = (char *)sqlite3_column_text(stmt, 1);
2040 if (!pd_src || !strlen(pd_src)) {
2041 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2042 sqlite3_reset(stmt);
2043 sqlite3_finalize(stmt);
2047 path = strdup(pd_src);
2049 ErrPrint("Heap: %s\n", strerror(errno));
2050 sqlite3_reset(stmt);
2051 sqlite3_finalize(stmt);
2055 DbgPrint("PD Src: %s\n", path);
2056 sqlite3_reset(stmt);
2057 sqlite3_finalize(stmt);
2063 EAPI char *livebox_service_pd_script_group(const char *pkgid)
2079 ret = sqlite3_prepare_v2(handle, "SELECT pd_group FROM provider WHERE pkgid = ?", -1, &stmt, NULL);
2080 if (ret != SQLITE_OK) {
2081 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2085 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
2086 if (ret != SQLITE_OK) {
2087 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2088 sqlite3_finalize(stmt);
2092 ret = sqlite3_step(stmt);
2093 if (ret != SQLITE_ROW) {
2094 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2095 sqlite3_reset(stmt);
2096 sqlite3_finalize(stmt);
2100 tmp = (char *)sqlite3_column_text(stmt, 0);
2101 if (tmp && strlen(tmp)) {
2102 group = strdup(tmp);
2104 ErrPrint("Heap: %s\n", strerror(errno));
2106 sqlite3_reset(stmt);
2107 sqlite3_finalize(stmt);
2113 EAPI int livebox_service_enumerate_cluster_list(int (*cb)(const char *cluster, void *data), void *data)
2117 const char *cluster;
2122 return LB_STATUS_ERROR_INVALID;
2126 return LB_STATUS_ERROR_IO;
2129 ret = sqlite3_prepare_v2(handle, "SELECT DISTINCT cluster FROM groupinfo", -1, &stmt, NULL);
2130 if (ret != SQLITE_OK) {
2131 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2132 cnt = LB_STATUS_ERROR_IO;
2136 while (sqlite3_step(stmt) == SQLITE_ROW) {
2137 cluster = (const char *)sqlite3_column_text(stmt, 0);
2138 if (!cluster || !strlen(cluster))
2141 if (cb(cluster, data) < 0)
2147 sqlite3_reset(stmt);
2148 sqlite3_finalize(stmt);
2154 EAPI int livebox_service_enumerate_category_list(const char *cluster, int (*cb)(const char *cluster, const char *category, void *data), void *data)
2158 const char *category;
2162 if (!cluster || !cb)
2163 return LB_STATUS_ERROR_INVALID;
2167 return LB_STATUS_ERROR_IO;
2169 ret = sqlite3_prepare_v2(handle, "SELECT DISTINCT category FROM groupinfo WHERE cluster = ?", -1, &stmt, NULL);
2170 if (ret != SQLITE_OK) {
2171 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2172 cnt = LB_STATUS_ERROR_IO;
2177 while (sqlite3_step(stmt) == SQLITE_ROW) {
2178 category = (const char *)sqlite3_column_text(stmt, 0);
2179 if (!category || !strlen(category))
2182 if (cb(cluster, category, data) < 0)
2188 sqlite3_reset(stmt);
2189 sqlite3_finalize(stmt);
2195 EAPI int livebox_service_init(void)
2197 if (s_info.handle) {
2198 DbgPrint("Already initialized\n");
2199 s_info.init_count++;
2203 s_info.handle = open_db();
2204 if (s_info.handle) {
2205 s_info.init_count++;
2209 return LB_STATUS_ERROR_IO;
2212 EAPI int livebox_service_fini(void)
2214 if (!s_info.handle || s_info.init_count <= 0) {
2215 ErrPrint("Service is not initialized\n");
2216 return LB_STATUS_ERROR_IO;
2219 s_info.init_count--;
2220 if (s_info.init_count > 0) {
2221 DbgPrint("Init count %d\n", s_info.init_count);
2225 db_util_close(s_info.handle);
2226 s_info.handle = NULL;
2230 EAPI int livebox_service_get_size(int type, int *width, int *height)
2241 return convert_size_from_type(type, width, height);
2244 EAPI int livebox_service_size_type(int width, int height)
2248 if (update_resolution() < 0)
2249 ErrPrint("Failed to update the size list\n");
2251 for (idx = 0; idx < NR_OF_SIZE_LIST; idx++) {
2252 if (SIZE_LIST[idx].w == width && SIZE_LIST[idx].h == height)
2258 return LB_SIZE_TYPE_1x1;
2260 return LB_SIZE_TYPE_2x1;
2262 return LB_SIZE_TYPE_2x2;
2264 return LB_SIZE_TYPE_4x1;
2266 return LB_SIZE_TYPE_4x2;
2268 return LB_SIZE_TYPE_4x3;
2270 return LB_SIZE_TYPE_4x4;
2272 return LB_SIZE_TYPE_4x5;
2274 return LB_SIZE_TYPE_4x6;
2276 return LB_SIZE_TYPE_EASY_1x1;
2278 return LB_SIZE_TYPE_EASY_3x1;
2280 return LB_SIZE_TYPE_EASY_3x3;
2282 return LB_SIZE_TYPE_0x0;
2287 return LB_SIZE_TYPE_UNKNOWN;