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 { 224, 215 }, /*!< 21x21 */
64 { 680, 215 }, /*!< 23x21 */
65 { 680, 653 }, /*!< 23x23 */
66 { 720, 1280 }, /*!< 0x0 */
69 struct pkglist_handle {
71 PKGLIST_TYPE_LB_LIST = 0x00beef00,
72 PKGLIST_TYPE_UNKNOWN = 0x00dead00,
81 const char *conf_file;
86 .dbfile = "/opt/dbspace/.livebox.db",
87 .conf_file = "/usr/share/data-provider-master/resolution.ini",
92 static inline int update_info(int width_type, int height_type, int width, int height)
96 if (width_type == 1 && height_type == 1) {
98 } else if (width_type == 2 && height_type == 1) {
100 } else if (width_type == 2 && height_type == 2) {
102 } else if (width_type == 4 && height_type == 1) {
104 } else if (width_type == 4 && height_type == 2) {
106 } else if (width_type == 4 && height_type == 3) {
108 } else if (width_type == 4 && height_type == 4) {
110 } else if (width_type == 4 && height_type == 5) {
112 } else if (width_type == 4 && height_type == 6) {
114 } else if (width_type == 21 && height_type == 21) {
116 } else if (width_type == 23 && height_type == 21) {
118 } else if (width_type == 23 && height_type == 23) {
120 } else if (width_type == 0 && height_type == 0) {
123 ErrPrint("Unknown size type: %dx%d (%dx%d)\n", width_type, height_type, width, height);
127 SIZE_LIST[idx].w = width;
128 SIZE_LIST[idx].h = height;
132 static inline int update_from_file(void)
140 char buffer[MAX_COLUMN];
154 fp = fopen(s_info.conf_file, "r");
156 ErrPrint("Open failed: %s\n", strerror(errno));
157 return LB_STATUS_ERROR_IO;
166 if (idx == MAX_COLUMN) {
167 ErrPrint("Buffer overflow. Too long line. LINE MUST BE SHOT THAN %d\n", MAX_COLUMN);
173 if (isspace(ch) || ch == EOF)
188 if (sscanf(buffer, "%dx%d", &width_type, &height_type) != 2) {
189 ErrPrint("Invalid syntax: [%s]\n", buffer);
193 } else if (ch == '=') {
196 if (sscanf(buffer, "%dx%d", &width_type, &height_type) != 2) {
197 ErrPrint("Invalid syntax: [%s]\n", buffer);
201 } else if (ch == EOF) {
202 ErrPrint("Invalid Syntax\n");
213 if (isspace(ch) || ch == EOF)
221 if (isspace(ch) || ch == EOF) {
225 if (sscanf(buffer, "%dx%d", &width, &height) != 2) {
226 ErrPrint("Invalid syntax: [%s]\n", buffer);
228 } else if (ch == EOF) {
229 updated += update_info(width_type, height_type, width, height);
236 updated += update_info(width_type, height_type, width, height);
241 if (ch == '\n' || ch == '\r' || ch == '\f')
245 if (ch == '\n' || ch == '\r' || ch == '\f')
249 ErrPrint("Unknown status. couldn't be reach to here\n");
255 return NR_OF_SIZE_LIST - updated;
258 static int update_resolution(void)
270 if (s_info.res_resolved)
271 return LB_STATUS_SUCCESS;
273 disp = XOpenDisplay(NULL);
275 ErrPrint("Failed to open a display\n");
276 return LB_STATUS_ERROR_FAULT;
279 root = XDefaultRootWindow(disp);
280 if (!XGetGeometry(disp, root, &dummy, &x, &y, &width, &height, &border, &depth)) {
282 return LB_STATUS_ERROR_FAULT;
285 if (update_from_file() == 0)
286 DbgPrint("Resolution info is all updated by file\n");
288 for (i = 0; i < NR_OF_SIZE_LIST; i++) {
289 SIZE_LIST[i].w = (unsigned int)((double)SIZE_LIST[i].w * (double)width / 720.0f);
290 SIZE_LIST[i].h = (unsigned int)((double)SIZE_LIST[i].h * (double)width / 720.0f);
294 s_info.res_resolved = 1;
295 return LB_STATUS_SUCCESS;
298 static sqlite3 *open_db(void)
302 if (!s_info.handle) {
305 ret = db_util_open(s_info.dbfile, &handle, DB_UTIL_REGISTER_HOOK_METHOD);
306 if (ret != SQLITE_OK) {
307 ErrPrint("Failed to open a DB\n");
311 handle = s_info.handle;
317 static inline __attribute__((always_inline)) void close_db(sqlite3 *handle)
320 db_util_close(handle);
323 static inline int convert_size_from_type(enum livebox_size_type type, int *width, int *height)
328 case LB_SIZE_TYPE_1x1: /*!< 175x175 */
331 case LB_SIZE_TYPE_2x1: /*!< 354x175 */
334 case LB_SIZE_TYPE_2x2: /*!< 354x354 */
337 case LB_SIZE_TYPE_4x1: /*!< 712x175 */
340 case LB_SIZE_TYPE_4x2: /*!< 712x354 */
343 case LB_SIZE_TYPE_4x3: /*!< 712x533 */
346 case LB_SIZE_TYPE_4x4: /*!< 712x712 */
349 case LB_SIZE_TYPE_4x5: /*!< 712x891 */
352 case LB_SIZE_TYPE_4x6: /*!< 712x1070 */
355 case LB_SIZE_TYPE_EASY_1x1: /*< 224x215 */
358 case LB_SIZE_TYPE_EASY_3x1: /*!< 680x215 */
361 case LB_SIZE_TYPE_EASY_3x3: /*!< 680x653 */
364 case LB_SIZE_TYPE_0x0: /*!< 720x1280 */
368 return LB_STATUS_ERROR_INVALID;
371 if (update_resolution() < 0)
372 ErrPrint("Failed to update resolution\n");
374 *width = SIZE_LIST[idx].w;
375 *height = SIZE_LIST[idx].h;
376 return LB_STATUS_SUCCESS;
379 EAPI int livebox_service_change_period(const char *pkgname, const char *id, double period)
381 struct packet *packet;
382 struct packet *result;
386 if (!pkgname || !id || period < 0.0f) {
387 ErrPrint("Invalid argument\n");
388 return LB_STATUS_ERROR_INVALID;
391 uri = util_id_to_uri(id);
393 return LB_STATUS_ERROR_MEMORY;
395 packet = packet_create("service_change_period", "ssd", pkgname, uri, period);
398 ErrPrint("Failed to create a packet for period changing\n");
399 return LB_STATUS_ERROR_FAULT;
402 result = com_core_packet_oneshot_send(SERVICE_SOCKET, packet, DEFAULT_TIMEOUT);
403 packet_unref(packet);
406 if (packet_get(result, "i", &ret) != 1) {
407 ErrPrint("Failed to parse a result packet\n");
408 ret = LB_STATUS_ERROR_INVALID;
410 packet_unref(result);
412 ErrPrint("Failed to get result packet\n");
413 ret = LB_STATUS_ERROR_FAULT;
419 EAPI int livebox_service_trigger_update(const char *pkgname, const char *id, const char *cluster, const char *category, int force)
421 struct packet *packet;
422 struct packet *result;
427 ErrPrint("Invalid argument\n");
428 return LB_STATUS_ERROR_INVALID;
431 if (!force && access("/tmp/.live.paused", R_OK) == 0) {
432 DbgPrint("Provider is paused\n");
433 return LB_STATUS_ERROR_CANCEL;
436 uri = util_id_to_uri(id);
438 return LB_STATUS_ERROR_MEMORY;
441 cluster = "user,created";
444 category = "default";
446 packet = packet_create("service_update", "ssss", pkgname, uri, cluster, category);
449 ErrPrint("Failed to create a packet for service_update\n");
450 return LB_STATUS_ERROR_FAULT;
453 result = com_core_packet_oneshot_send(SERVICE_SOCKET, packet, DEFAULT_TIMEOUT);
454 packet_unref(packet);
457 if (packet_get(result, "i", &ret) != 1) {
458 ErrPrint("Failed to parse a result packet\n");
459 ret = LB_STATUS_ERROR_INVALID;
462 packet_unref(result);
464 ErrPrint("Failed to get result packet\n");
465 ret = LB_STATUS_ERROR_FAULT;
472 * pkgid == Package Id (not the livebox id)
474 EAPI struct pkglist_handle *livebox_service_pkglist_create(const char *pkgid, struct pkglist_handle *handle)
479 if (handle->type != PKGLIST_TYPE_LB_LIST) {
480 ErrPrint("Invalid handle\n");
485 ErrPrint("pkgid should be NULL\n");
489 sqlite3_reset(handle->stmt);
493 handle = calloc(1, sizeof(*handle));
495 ErrPrint("Heap: %s\n", strerror(errno));
499 handle->type = PKGLIST_TYPE_LB_LIST;
501 handle->handle = open_db();
502 if (!handle->handle) {
508 ret = sqlite3_prepare_v2(handle->handle, "SELECT appid, pkgid, prime FROM pkgmap", -1, &handle->stmt, NULL);
509 if (ret != SQLITE_OK) {
510 ErrPrint("Error: %s\n", sqlite3_errmsg(handle->handle));
511 close_db(handle->handle);
516 ret = sqlite3_prepare_v2(handle->handle, "SELECT appid, pkgid, prime FROM pkgmap WHERE appid = ?", -1, &handle->stmt, NULL);
517 if (ret != SQLITE_OK) {
518 ErrPrint("Error: %s\n", sqlite3_errmsg(handle->handle));
519 close_db(handle->handle);
524 ret = sqlite3_bind_text(handle->stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
525 if (ret != SQLITE_OK) {
526 ErrPrint("Error: %s\n", sqlite3_errmsg(handle->handle));
527 sqlite3_finalize(handle->stmt);
528 close_db(handle->handle);
537 EAPI int livebox_service_get_pkglist_item(struct pkglist_handle *handle, char **appid, char **pkgname, int *is_prime)
541 char *_pkgname = NULL;
543 if (!handle || handle->type != PKGLIST_TYPE_LB_LIST)
544 return LB_STATUS_ERROR_INVALID;
546 if (sqlite3_step(handle->stmt) != SQLITE_ROW)
547 return LB_STATUS_ERROR_NOT_EXIST;
550 tmp = (const char *)sqlite3_column_text(handle->stmt, 0);
551 if (tmp && strlen(tmp)) {
552 _appid = strdup(tmp);
554 ErrPrint("Heap: %s\n", strerror(errno));
555 return LB_STATUS_ERROR_MEMORY;
561 tmp = (const char *)sqlite3_column_text(handle->stmt, 1);
562 if (tmp && strlen(tmp)) {
563 _pkgname = strdup(tmp);
565 ErrPrint("Heap: %s\n", strerror(errno));
567 return LB_STATUS_ERROR_MEMORY;
573 *is_prime = sqlite3_column_int(handle->stmt, 2);
581 return LB_STATUS_SUCCESS;
584 EAPI int livebox_service_pkglist_destroy(struct pkglist_handle *handle)
586 if (!handle || handle->type != PKGLIST_TYPE_LB_LIST)
587 return LB_STATUS_ERROR_INVALID;
589 handle->type = PKGLIST_TYPE_UNKNOWN;
590 sqlite3_reset(handle->stmt);
591 sqlite3_finalize(handle->stmt);
592 close_db(handle->handle);
594 return LB_STATUS_SUCCESS;
597 EAPI int livebox_service_get_pkglist(int (*cb)(const char *appid, const char *pkgname, int is_prime, void *data), void *data)
607 return LB_STATUS_ERROR_INVALID;
611 return LB_STATUS_ERROR_IO;
613 ret = sqlite3_prepare_v2(handle, "SELECT appid, pkgid, prime FROM pkgmap", -1, &stmt, NULL);
614 if (ret != SQLITE_OK) {
615 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
616 ret = LB_STATUS_ERROR_IO;
621 while (sqlite3_step(stmt) == SQLITE_ROW) {
622 appid = (char *)sqlite3_column_text(stmt, 0);
623 if (!appid || !strlen(appid)) {
624 ErrPrint("APPID is not valid\n");
628 pkgid = (char *)sqlite3_column_text(stmt, 1);
629 if (!pkgid || !strlen(pkgid)) {
630 ErrPrint("pkgid is not valid\n");
634 is_prime = sqlite3_column_int(stmt, 2);
638 if (cb(appid, pkgid, is_prime, data) < 0) {
639 DbgPrint("Callback stopped package crawling\n");
645 sqlite3_finalize(stmt);
652 EAPI int livebox_service_get_pkglist_by_pkgid(const char *pkgid, int (*cb)(const char *lbid, int is_prime, void *data), void *data)
661 return LB_STATUS_ERROR_INVALID;
665 return LB_STATUS_ERROR_IO;
667 ret = sqlite3_prepare_v2(handle, "SELECT pkgid, prime FROM pkgmap WHERE appid = ?", -1, &stmt, NULL);
668 if (ret != SQLITE_OK) {
669 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
670 ret = LB_STATUS_ERROR_IO;
674 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
675 if (ret != SQLITE_OK) {
676 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
678 sqlite3_finalize(stmt);
679 ret = LB_STATUS_ERROR_IO;
684 while (sqlite3_step(stmt) == SQLITE_ROW) {
685 lbid = (const char *)sqlite3_column_text(stmt, 0);
686 if (!lbid || !strlen(lbid)) {
687 ErrPrint("LBID is not valid\n");
691 is_prime = sqlite3_column_int(stmt, 1);
695 if (cb(lbid, is_prime, data) < 0) {
696 DbgPrint("Callback stopped package crawling\n");
702 sqlite3_finalize(stmt);
709 struct pkgmgr_cbdata {
711 void (*cb)(const char *lbid, const char *appid, void *data);
715 static int pkgmgr_cb(const pkgmgrinfo_appinfo_h handle, void *user_data)
717 struct pkgmgr_cbdata *cbdata = (struct pkgmgr_cbdata *)user_data;
721 ret = pkgmgrinfo_appinfo_get_appid(handle, &appid);
723 ErrPrint("Unable to get appid\n");
725 cbdata->cb(cbdata->lbid, appid, cbdata->cbdata);
730 static inline char *pkgmgr_get_mainapp(const char *pkgid)
732 pkgmgrinfo_pkginfo_h handle;
735 if (pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle) != PMINFO_R_OK) {
736 ErrPrint("Unable to get mainapp: %s\n", pkgid);
740 if (pkgmgrinfo_pkginfo_get_mainappid(handle, &ret) == PMINFO_R_OK) {
743 ErrPrint("Failed to get mainappid\n");
744 ret = NULL; /* I cannot believe the pkgmgrinfo_pkginfo_get_mainappid. it maybe able to touch my "ret" even though it fails */
748 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
752 static inline int pkgmgr_get_applist(const char *pkgid, const char *lbid, void (*cb)(const char *lbid, const char *appid, void *data), void *data)
754 struct pkgmgr_cbdata cbdata;
755 pkgmgrinfo_pkginfo_h handle;
758 ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle);
760 ErrPrint("Unable to get pkginfo: %s\n", pkgid);
766 cbdata.cbdata = data;
768 ret = pkgmgrinfo_appinfo_get_list(handle, PM_UI_APP, pkgmgr_cb, &cbdata);
770 ErrPrint("Failed to get applist\n");
772 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
776 EAPI int livebox_service_get_applist(const char *lbid, void (*cb)(const char *lbid, const char *appid, void *data), void *data)
785 return LB_STATUS_ERROR_INVALID;
789 return LB_STATUS_ERROR_IO;
791 ret = sqlite3_prepare_v2(handle, "SELECT appid FROM pkgmap WHERE (pkgid = ?) or (appid = ?)", -1, &stmt, NULL);
792 if (ret != SQLITE_OK) {
793 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
794 ret = LB_STATUS_ERROR_IO;
798 ret = sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT);
799 if (ret != SQLITE_OK) {
800 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
801 ret = LB_STATUS_ERROR_IO;
805 ret = sqlite3_bind_text(stmt, 2, lbid, -1, SQLITE_TRANSIENT);
806 if (ret != SQLITE_OK) {
807 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
808 ret = LB_STATUS_ERROR_IO;
812 if (sqlite3_step(stmt) != SQLITE_ROW) {
813 ret = LB_STATUS_ERROR_INVALID;
815 sqlite3_finalize(stmt);
819 tmp = (const char *)sqlite3_column_text(stmt, 0);
820 if (!tmp || !strlen(tmp)) {
821 ErrPrint("Invalid package name (%s)\n", lbid);
822 ret = LB_STATUS_ERROR_INVALID;
824 sqlite3_finalize(stmt);
830 ErrPrint("Error: %s\n", strerror(errno));
831 ret = LB_STATUS_ERROR_MEMORY;
833 sqlite3_finalize(stmt);
838 sqlite3_finalize(stmt);
840 ret = pkgmgr_get_applist(pkgid, lbid, cb, data);
848 EAPI char *livebox_service_mainappid(const char *lbid)
863 if (sqlite3_prepare_v2(handle, "SELECT appid, uiapp FROM pkgmap WHERE (pkgid = ?) or (appid = ? and prime = 1)", -1, &stmt, NULL) != SQLITE_OK) {
864 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
868 if (sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT) != SQLITE_OK) {
869 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
873 if (sqlite3_bind_text(stmt, 2, lbid, -1, SQLITE_TRANSIENT) != SQLITE_OK) {
874 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
878 if (sqlite3_step(stmt) != SQLITE_ROW) {
880 sqlite3_finalize(stmt);
884 tmp = (const char *)sqlite3_column_text(stmt, 0);
885 if (!tmp || !strlen(tmp)) {
886 ErrPrint("Invalid package name (%s)\n", lbid);
888 sqlite3_finalize(stmt);
892 pkgid = (const char *)sqlite3_column_text(stmt, 1);
893 if (!pkgid || !strlen(pkgid)) {
895 * This record has no uiapp.
896 * Try to find the main ui-app id.
898 ret = pkgmgr_get_mainapp(tmp);
902 ErrPrint("Error: %s\n", strerror(errno));
906 sqlite3_finalize(stmt);
913 EAPI int livebox_service_get_supported_size_types(const char *pkgid, int *cnt, int *types)
920 if (!types || !cnt || !pkgid)
921 return LB_STATUS_ERROR_INVALID;
925 return LB_STATUS_ERROR_IO;
927 ret = sqlite3_prepare_v2(handle, "SELECT size_type FROM box_size WHERE pkgid = ? ORDER BY size_type ASC", -1, &stmt, NULL);
928 if (ret != SQLITE_OK) {
929 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
930 ret = LB_STATUS_ERROR_IO;
934 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
935 if (ret != SQLITE_OK) {
936 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
938 sqlite3_finalize(stmt);
939 ret = LB_STATUS_ERROR_IO;
943 if (*cnt > NR_OF_SIZE_LIST)
944 *cnt = NR_OF_SIZE_LIST;
947 while (sqlite3_step(stmt) == SQLITE_ROW && ret < *cnt) {
948 size = sqlite3_column_int(stmt, 0);
955 sqlite3_finalize(stmt);
962 static inline char *cur_locale(void)
965 language = vconf_get_str(VCONFKEY_LANGSET);
982 language = strdup("en-us");
984 ErrPrint("Heap: %s\n", strerror(errno));
990 static inline char *get_default_name(const char *pkgid)
1001 ret = sqlite3_prepare_v2(handle, "SELECT name FROM client WHERE pkgid = ?", -1, &stmt, NULL);
1002 if (ret != SQLITE_OK) {
1003 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1008 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1009 if (ret != SQLITE_OK) {
1010 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1014 ret = sqlite3_step(stmt);
1015 if (ret == SQLITE_ROW) {
1018 tmp = (const char *)sqlite3_column_text(stmt, 0);
1019 if (tmp && strlen(tmp)) {
1022 ErrPrint("Heap: %s\n", strerror(errno));
1027 sqlite3_reset(stmt);
1028 sqlite3_finalize(stmt);
1033 static inline char *get_default_icon(const char *pkgid)
1044 ret = sqlite3_prepare_v2(handle, "SELECT icon FROM client WHERE pkgid = ?", -1, &stmt, NULL);
1045 if (ret != SQLITE_OK) {
1046 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1051 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1052 if (ret != SQLITE_OK) {
1053 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1057 ret = sqlite3_step(stmt);
1058 if (ret == SQLITE_ROW) {
1061 tmp = (const char *)sqlite3_column_text(stmt, 0);
1062 if (tmp && strlen(tmp)) {
1065 ErrPrint("Heap: %s\n", strerror(errno));
1070 sqlite3_reset(stmt);
1071 sqlite3_finalize(stmt);
1076 EAPI char *livebox_service_content(const char *pkgid)
1080 char *content = NULL;
1087 ret = sqlite3_prepare_v2(handle, "SELECT content FROM client WHERE pkgid = ?", -1, &stmt, NULL);
1088 if (ret != SQLITE_OK) {
1089 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1094 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1095 if (ret != SQLITE_OK) {
1096 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1100 ret = sqlite3_step(stmt);
1101 if (ret == SQLITE_ROW) {
1104 tmp = (const char *)sqlite3_column_text(stmt, 0);
1105 if (tmp && strlen(tmp)) {
1106 content = strdup(tmp);
1108 ErrPrint("Heap: %s\n", strerror(errno));
1113 sqlite3_reset(stmt);
1114 sqlite3_finalize(stmt);
1119 EAPI char *livebox_service_setup_appid(const char *lbid)
1130 ret = sqlite3_prepare_v2(handle, "SELECT setup FROM client WHERE pkgid = ?", -1, &stmt, NULL);
1131 if (ret != SQLITE_OK) {
1132 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1138 ret = sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT);
1139 if (ret != SQLITE_OK) {
1140 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1144 ret = sqlite3_step(stmt);
1145 if (ret == SQLITE_ROW) {
1148 tmp = (const char *)sqlite3_column_text(stmt, 0);
1149 if (!tmp || !strlen(tmp))
1152 appid = strdup(tmp);
1154 ErrPrint("Error: %s\n", strerror(errno));
1158 sqlite3_reset(stmt);
1159 sqlite3_finalize(stmt);
1164 EAPI int livebox_service_nodisplay(const char *pkgid)
1174 ret = sqlite3_prepare_v2(handle, "SELECT nodisplay FROM client WHERE pkgid = ?", -1, &stmt, NULL);
1175 if (ret != SQLITE_OK) {
1176 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1181 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1182 if (ret != SQLITE_OK) {
1183 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1188 ret = sqlite3_step(stmt);
1189 if (ret == SQLITE_ROW)
1190 ret = !!sqlite3_column_int(stmt, 0);
1195 sqlite3_reset(stmt);
1196 sqlite3_finalize(stmt);
1201 static inline char *get_lb_pkgname_by_appid(const char *appid)
1217 ret = sqlite3_prepare_v2(handle, "SELECT pkgid FROM pkgmap WHERE (appid = ? AND prime = 1) OR pkgid = ?", -1, &stmt, NULL);
1218 if (ret != SQLITE_OK) {
1219 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1224 ret = sqlite3_bind_text(stmt, 1, appid, -1, SQLITE_TRANSIENT);
1225 if (ret != SQLITE_OK) {
1226 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1230 ret = sqlite3_bind_text(stmt, 2, appid, -1, SQLITE_TRANSIENT);
1231 if (ret != SQLITE_OK) {
1232 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1236 if (sqlite3_step(stmt) != SQLITE_ROW) {
1237 ErrPrint("Error: %s (has no record? - %s)\n", sqlite3_errmsg(handle), appid);
1241 tmp = (char *)sqlite3_column_text(stmt, 0);
1242 if (tmp && strlen(tmp)) {
1243 pkgid = strdup(tmp);
1245 ErrPrint("Heap: %s\n", strerror(errno));
1249 sqlite3_reset(stmt);
1250 sqlite3_finalize(stmt);
1255 EAPI int livebox_service_need_frame(const char *pkgid, int size_type)
1264 ErrPrint("Unable to open a DB\n");
1268 ret = sqlite3_prepare_v2(handle, "SELECT need_frame FROM box_size WHERE pkgid = ? AND size_type = ?", -1, &stmt, NULL);
1269 if (ret != SQLITE_OK) {
1270 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1277 lbid = livebox_service_pkgname(pkgid);
1279 ErrPrint("Invalid appid (%s)\n", pkgid);
1284 ret = sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT);
1286 if (ret != SQLITE_OK) {
1287 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1292 ret = sqlite3_bind_int(stmt, 2, size_type);
1293 if (ret != SQLITE_OK) {
1294 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1299 ret = sqlite3_step(stmt);
1300 if (ret == SQLITE_ROW) {
1301 ret = !!sqlite3_column_int(stmt, 0);
1304 ErrPrint("There is no such result\n");
1307 sqlite3_reset(stmt);
1308 sqlite3_finalize(stmt);
1313 EAPI int livebox_service_touch_effect(const char *pkgid, int size_type)
1322 ErrPrint("Unable to open a DB\n");
1326 ret = sqlite3_prepare_v2(handle, "SELECT touch_effect FROM box_size WHERE pkgid = ? AND size_type = ?", -1, &stmt, NULL);
1327 if (ret != SQLITE_OK) {
1328 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1335 * This function will validate the "pkgid"
1336 * call the exported API in the exported API is not recomended
1339 lbid = livebox_service_pkgname(pkgid);
1341 ErrPrint("Invalid appid (%s)\n", pkgid);
1346 ret = sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT);
1348 if (ret != SQLITE_OK) {
1349 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1354 ret = sqlite3_bind_int(stmt, 2, size_type);
1355 if (ret != SQLITE_OK) {
1356 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1361 ret = sqlite3_step(stmt);
1362 if (ret == SQLITE_ROW) {
1363 ret = !!sqlite3_column_int(stmt, 0);
1365 ret = 1; /*!< Default true: In this case the DB is corrupted. */
1366 ErrPrint("There is no result\n");
1370 sqlite3_reset(stmt);
1371 sqlite3_finalize(stmt);
1376 EAPI int livebox_service_mouse_event(const char *pkgid)
1387 ret = sqlite3_prepare_v2(handle, "SELECT mouse_event FROM client WHERE pkgid = ?", -1, &stmt, NULL);
1388 if (ret != SQLITE_OK) {
1389 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1394 lbid = livebox_service_pkgname(pkgid);
1396 ErrPrint("Failed to get lbid: %s\n", pkgid);
1401 ret = sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT);
1403 if (ret != SQLITE_OK) {
1404 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1409 ret = sqlite3_step(stmt);
1410 if (ret == SQLITE_ROW) {
1411 ret = !!sqlite3_column_int(stmt, 0);
1413 ret = 0; /*!< Default is false, In this case the DB is corrupted */
1414 ErrPrint("There is no result.\n");
1418 sqlite3_reset(stmt);
1419 sqlite3_finalize(stmt);
1424 EAPI char *livebox_service_preview(const char *pkgid, int size_type)
1429 char *preview = NULL;
1435 ret = sqlite3_prepare_v2(handle, "SELECT preview FROM box_size WHERE pkgid = ? AND size_type = ?", -1, &stmt, NULL);
1436 if (ret != SQLITE_OK) {
1437 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1442 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1443 if (ret != SQLITE_OK) {
1444 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1448 ret = sqlite3_bind_int(stmt, 2, size_type);
1449 if (ret != SQLITE_OK) {
1450 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1454 ret = sqlite3_step(stmt);
1455 if (ret == SQLITE_ROW) {
1457 tmp = (const char *)sqlite3_column_text(stmt, 0);
1458 if (tmp && strlen(tmp)) {
1459 preview = strdup(tmp);
1461 ErrPrint("Heap: %s\n", strerror(errno));
1466 sqlite3_reset(stmt);
1467 sqlite3_finalize(stmt);
1472 EAPI char *livebox_service_i18n_icon(const char *pkgid, const char *lang)
1481 language = strdup(lang);
1483 ErrPrint("Heap: %s\n", strerror(errno));
1487 language = cur_locale();
1498 ret = sqlite3_prepare_v2(handle, "SELECT icon FROM i18n WHERE pkgid = ? AND lang = ?", -1, &stmt, NULL);
1499 if (ret != SQLITE_OK) {
1500 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1506 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1507 if (ret != SQLITE_OK) {
1508 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1512 ret = sqlite3_bind_text(stmt, 2, language, -1, SQLITE_TRANSIENT);
1513 if (ret != SQLITE_OK) {
1514 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1518 ret = sqlite3_step(stmt);
1519 if (ret == SQLITE_ROW) {
1521 tmp = (const char *)sqlite3_column_text(stmt, 0);
1522 if (!tmp || !strlen(tmp)) {
1523 icon = get_default_icon(pkgid);
1527 ErrPrint("Heap: %s\n", strerror(errno));
1530 icon = get_default_icon(pkgid);
1534 sqlite3_reset(stmt);
1535 sqlite3_finalize(stmt);
1541 EAPI char *livebox_service_i18n_name(const char *pkgid, const char *lang)
1550 language = strdup(lang);
1552 ErrPrint("Error: %s\n", strerror(errno));
1556 language = cur_locale();
1567 ret = sqlite3_prepare_v2(handle, "SELECT name FROM i18n WHERE pkgid = ? AND lang = ?", -1, &stmt, NULL);
1568 if (ret != SQLITE_OK) {
1569 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1575 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1576 if (ret != SQLITE_OK) {
1577 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1581 ret = sqlite3_bind_text(stmt, 2, language, -1, SQLITE_TRANSIENT);
1582 if (ret != SQLITE_OK) {
1583 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1587 ret = sqlite3_step(stmt);
1588 if (ret == SQLITE_ROW) {
1590 tmp = (const char *)sqlite3_column_text(stmt, 0);
1591 if (!tmp || !strlen(tmp)) {
1592 name = get_default_name(pkgid);
1596 ErrPrint("Heap: %s\n", strerror(errno));
1599 name = get_default_name(pkgid);
1603 sqlite3_reset(stmt);
1604 sqlite3_finalize(stmt);
1610 EAPI int livebox_service_get_supported_sizes(const char *pkgid, int *cnt, int *w, int *h)
1617 if (!w || !h || !cnt || !pkgid)
1618 return LB_STATUS_ERROR_INVALID;
1622 return LB_STATUS_ERROR_IO;
1624 ret = sqlite3_prepare_v2(handle, "SELECT size_type FROM box_size WHERE pkgid = ? ORDER BY size_type ASC", -1, &stmt, NULL);
1625 if (ret != SQLITE_OK) {
1626 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1627 ret = LB_STATUS_ERROR_IO;
1631 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1632 if (ret != SQLITE_OK) {
1633 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1634 sqlite3_reset(stmt);
1635 sqlite3_finalize(stmt);
1636 ret = LB_STATUS_ERROR_IO;
1640 if (*cnt > NR_OF_SIZE_LIST)
1641 *cnt = NR_OF_SIZE_LIST;
1644 while (sqlite3_step(stmt) == SQLITE_ROW && ret < *cnt) {
1645 size = sqlite3_column_int(stmt, 0);
1646 ret += (convert_size_from_type(size, w + ret, h + ret) == 0);
1650 sqlite3_reset(stmt);
1651 sqlite3_finalize(stmt);
1658 EAPI char *livebox_service_libexec(const char *pkgid)
1675 ret = sqlite3_prepare_v2(handle, "SELECT pkgmap.appid, provider.libexec FROM pkgmap, provider WHERE pkgmap.pkgid = ? AND provider.pkgid = ?", -1, &stmt, NULL);
1676 if (ret != SQLITE_OK) {
1677 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1681 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1682 if (ret != SQLITE_OK) {
1683 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1684 sqlite3_finalize(stmt);
1688 ret = sqlite3_bind_text(stmt, 2, pkgid, -1, SQLITE_TRANSIENT);
1689 if (ret != SQLITE_OK) {
1690 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1691 sqlite3_finalize(stmt);
1695 if (sqlite3_step(stmt) != SQLITE_ROW) {
1696 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1697 sqlite3_reset(stmt);
1698 sqlite3_finalize(stmt);
1700 libexec = util_conf_get_libexec(pkgid);
1701 DbgPrint("Fallback to conf checker: %s\n", libexec);
1705 appid = (char *)sqlite3_column_text(stmt, 0);
1706 if (!appid || !strlen(appid)) {
1707 ErrPrint("Invalid appid: %s\n", sqlite3_errmsg(handle));
1708 sqlite3_reset(stmt);
1709 sqlite3_finalize(stmt);
1713 path = (char *)sqlite3_column_text(stmt, 1);
1714 if (!path || !strlen(path)) {
1715 ErrPrint("Invalid libexec: %s\n", sqlite3_errmsg(handle));
1716 sqlite3_reset(stmt);
1717 sqlite3_finalize(stmt);
1721 libexec = strdup(path);
1723 ErrPrint("Heap: %s\n", strerror(errno));
1724 sqlite3_reset(stmt);
1725 sqlite3_finalize(stmt);
1729 DbgPrint("libexec: %s\n", libexec);
1731 sqlite3_reset(stmt);
1732 sqlite3_finalize(stmt);
1738 EAPI char *livebox_service_pkgname(const char *appid)
1741 pkgmgr_appinfo_h handle;
1748 lb_pkgname = get_lb_pkgname_by_appid(appid);
1754 * Try to get the package id using given appid
1756 ret = pkgmgr_appinfo_get_appinfo(appid, &handle);
1757 if (ret != PKGMGR_R_OK) {
1758 ErrPrint("Failed to get appinfo\n");
1762 ret = pkgmgr_appinfo_get_pkgname(handle, &new_appid);
1763 if (ret != PKGMGR_R_OK) {
1764 pkgmgr_appinfo_destroy_appinfo(handle);
1765 ErrPrint("Failed to get pkgname for (%s)\n", appid);
1769 lb_pkgname = get_lb_pkgname_by_appid(new_appid);
1770 pkgmgr_appinfo_destroy_appinfo(handle);
1772 if (!lb_pkgname && util_validate_livebox_package(appid) == 0)
1773 return strdup(appid);
1778 EAPI char *livebox_service_provider_name(const char *lbid)
1784 char *str = SAMSUNG_PREFIX;
1789 while (str[idx] && lbid[idx] && lbid[idx] == str[idx]) {
1791 if (seq < 2 && lbid[idx] == '.') {
1797 if (!str[idx] && lbid[idx]) {
1799 return strdup(lbid);
1800 } else if (seq < 2) {
1802 if (lbid[idx] == '.') {
1804 } else if (!lbid[idx]) {
1805 ErrPrint("Invalid lbid: %s\n", lbid);
1817 ret = strdup(lbid + stage);
1819 ErrPrint("Error: %s\n", strerror(errno));
1826 EAPI int livebox_service_is_enabled(const char *lbid)
1835 pkgname = livebox_service_appid(lbid);
1839 ret = ail_get_appinfo(pkgname, &ai);
1840 if (ret != AIL_ERROR_OK) {
1845 if (ail_appinfo_get_bool(ai, AIL_PROP_X_SLP_ENABLED_BOOL, &enabled) != AIL_ERROR_OK)
1848 ail_destroy_appinfo(ai);
1850 return enabled == true;
1854 EAPI int livebox_service_is_primary(const char *lbid)
1867 ret = sqlite3_prepare_v2(handle, "SELECT prime FROM pkgmap WHERE pkgid = ?", -1, &stmt, NULL);
1868 if (ret != SQLITE_OK) {
1869 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1874 ret = sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT);
1875 if (ret != SQLITE_OK) {
1876 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1880 ret = sqlite3_step(stmt);
1881 if (ret != SQLITE_ROW) {
1882 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1886 ret = sqlite3_column_int(stmt, 0);
1889 sqlite3_reset(stmt);
1890 sqlite3_finalize(stmt);
1896 * appid == Package ID
1897 * pkgid == Livebox ID
1899 EAPI char *livebox_service_appid(const char *pkgname)
1905 int is_prime __attribute__((__unused__));
1916 ret = sqlite3_prepare_v2(handle, "SELECT appid, prime FROM pkgmap WHERE pkgid = ? OR appid = ?", -1, &stmt, NULL);
1917 if (ret != SQLITE_OK) {
1918 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1922 ret = sqlite3_bind_text(stmt, 1, pkgname, -1, SQLITE_TRANSIENT);
1923 if (ret != SQLITE_OK) {
1924 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1925 sqlite3_reset(stmt);
1926 sqlite3_finalize(stmt);
1930 ret = sqlite3_bind_text(stmt, 2, pkgname, -1, SQLITE_TRANSIENT);
1931 if (ret != SQLITE_OK) {
1932 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1933 sqlite3_reset(stmt);
1934 sqlite3_finalize(stmt);
1938 ret = sqlite3_step(stmt);
1939 if (ret != SQLITE_ROW) {
1940 pkgmgr_appinfo_h pkg_handle;
1943 ErrPrint("Has no record?: %s\n", sqlite3_errmsg(handle));
1944 sqlite3_reset(stmt);
1945 sqlite3_finalize(stmt);
1947 ret = pkgmgr_appinfo_get_appinfo(pkgname, &pkg_handle);
1948 if (ret != PKGMGR_R_OK) {
1949 ErrPrint("Failed to get appinfo: %s\n", pkgname);
1953 ret = pkgmgr_appinfo_get_pkgname(pkg_handle, &new_appid);
1954 if (ret != PKGMGR_R_OK) {
1955 ErrPrint("Failed to get pkgname for (%s)\n", appid);
1956 pkgmgr_appinfo_destroy_appinfo(pkg_handle);
1960 appid = strdup(new_appid);
1962 ErrPrint("Heap: %s\n", strerror(errno));
1964 pkgmgr_appinfo_destroy_appinfo(pkg_handle);
1968 tmp = (char *)sqlite3_column_text(stmt, 0);
1969 if (!tmp || !strlen(tmp)) {
1970 ErrPrint("APPID is NIL\n");
1971 sqlite3_reset(stmt);
1972 sqlite3_finalize(stmt);
1976 appid = strdup(tmp);
1978 ErrPrint("Heap: %s\n", strerror(errno));
1979 sqlite3_reset(stmt);
1980 sqlite3_finalize(stmt);
1984 is_prime = sqlite3_column_int(stmt, 1);
1986 sqlite3_reset(stmt);
1987 sqlite3_finalize(stmt);
1993 EAPI char *livebox_service_lb_script_path(const char *pkgid)
2010 ret = sqlite3_prepare_v2(handle, "SELECT pkgmap.appid, provider.box_src FROM provider, pkgmap WHERE pkgmap.pkgid = ? AND provider.pkgid = ?", -1, &stmt, NULL);
2011 if (ret != SQLITE_OK) {
2012 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2016 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
2017 if (ret != SQLITE_OK) {
2018 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2019 sqlite3_finalize(stmt);
2023 ret = sqlite3_bind_text(stmt, 2, pkgid, -1, SQLITE_TRANSIENT);
2024 if (ret != SQLITE_OK) {
2025 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2026 sqlite3_finalize(stmt);
2030 ret = sqlite3_step(stmt);
2031 if (ret != SQLITE_ROW) {
2032 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2033 sqlite3_reset(stmt);
2034 sqlite3_finalize(stmt);
2038 appid = (char *)sqlite3_column_text(stmt, 0);
2039 if (!appid || !strlen(appid)) {
2040 ErrPrint("Invalid appid : %s\n", sqlite3_errmsg(handle));
2041 sqlite3_reset(stmt);
2042 sqlite3_finalize(stmt);
2046 lb_src = (char *)sqlite3_column_text(stmt, 1);
2047 if (!lb_src || !strlen(lb_src)) {
2048 ErrPrint("No records for lb src : %s\n", sqlite3_errmsg(handle));
2049 sqlite3_reset(stmt);
2050 sqlite3_finalize(stmt);
2054 path = strdup(lb_src);
2056 ErrPrint("Heap: %s\n", strerror(errno));
2057 sqlite3_reset(stmt);
2058 sqlite3_finalize(stmt);
2062 DbgPrint("LB Src: %s\n", path);
2063 sqlite3_reset(stmt);
2064 sqlite3_finalize(stmt);
2070 EAPI char *livebox_service_lb_script_group(const char *pkgid)
2086 ret = sqlite3_prepare_v2(handle, "SELECT box_group FROM provider WHERE pkgid = ?", -1, &stmt, NULL);
2087 if (ret != SQLITE_OK) {
2088 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2092 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
2093 if (ret != SQLITE_OK) {
2094 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2095 sqlite3_finalize(stmt);
2099 ret = sqlite3_step(stmt);
2100 if (ret != SQLITE_ROW) {
2101 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2102 sqlite3_reset(stmt);
2103 sqlite3_finalize(stmt);
2107 tmp = (char *)sqlite3_column_text(stmt, 0);
2108 if (tmp && strlen(tmp)) {
2109 group = strdup(tmp);
2111 ErrPrint("Heap: %s\n", strerror(errno));
2114 sqlite3_reset(stmt);
2115 sqlite3_finalize(stmt);
2121 EAPI char *livebox_service_pd_script_path(const char *pkgid)
2138 ret = sqlite3_prepare_v2(handle, "SELECT pkgmap.appid, provider.pd_src FROM provider, pkgmap WHERE provider.pkgid = ? AND pkgmap.pkgid = ?", -1, &stmt, NULL);
2139 if (ret != SQLITE_OK) {
2140 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2144 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
2145 if (ret != SQLITE_OK) {
2146 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2147 sqlite3_finalize(stmt);
2151 ret = sqlite3_bind_text(stmt, 2, pkgid, -1, SQLITE_TRANSIENT);
2152 if (ret != SQLITE_OK) {
2153 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2154 sqlite3_finalize(stmt);
2158 ret = sqlite3_step(stmt);
2159 if (ret != SQLITE_ROW) {
2160 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2161 sqlite3_reset(stmt);
2162 sqlite3_finalize(stmt);
2166 appid = (char *)sqlite3_column_text(stmt, 0);
2167 if (!appid || !strlen(appid)) {
2168 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2169 sqlite3_reset(stmt);
2170 sqlite3_finalize(stmt);
2174 pd_src = (char *)sqlite3_column_text(stmt, 1);
2175 if (!pd_src || !strlen(pd_src)) {
2176 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2177 sqlite3_reset(stmt);
2178 sqlite3_finalize(stmt);
2182 path = strdup(pd_src);
2184 ErrPrint("Heap: %s\n", strerror(errno));
2185 sqlite3_reset(stmt);
2186 sqlite3_finalize(stmt);
2190 DbgPrint("PD Src: %s\n", path);
2191 sqlite3_reset(stmt);
2192 sqlite3_finalize(stmt);
2198 EAPI char *livebox_service_pd_script_group(const char *pkgid)
2214 ret = sqlite3_prepare_v2(handle, "SELECT pd_group FROM provider WHERE pkgid = ?", -1, &stmt, NULL);
2215 if (ret != SQLITE_OK) {
2216 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2220 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
2221 if (ret != SQLITE_OK) {
2222 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2223 sqlite3_finalize(stmt);
2227 ret = sqlite3_step(stmt);
2228 if (ret != SQLITE_ROW) {
2229 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2230 sqlite3_reset(stmt);
2231 sqlite3_finalize(stmt);
2235 tmp = (char *)sqlite3_column_text(stmt, 0);
2236 if (tmp && strlen(tmp)) {
2237 group = strdup(tmp);
2239 ErrPrint("Heap: %s\n", strerror(errno));
2241 sqlite3_reset(stmt);
2242 sqlite3_finalize(stmt);
2248 EAPI int livebox_service_enumerate_cluster_list(int (*cb)(const char *cluster, void *data), void *data)
2252 const char *cluster;
2257 return LB_STATUS_ERROR_INVALID;
2261 return LB_STATUS_ERROR_IO;
2264 ret = sqlite3_prepare_v2(handle, "SELECT DISTINCT cluster FROM groupinfo", -1, &stmt, NULL);
2265 if (ret != SQLITE_OK) {
2266 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2267 cnt = LB_STATUS_ERROR_IO;
2271 while (sqlite3_step(stmt) == SQLITE_ROW) {
2272 cluster = (const char *)sqlite3_column_text(stmt, 0);
2273 if (!cluster || !strlen(cluster))
2276 if (cb(cluster, data) < 0)
2282 sqlite3_reset(stmt);
2283 sqlite3_finalize(stmt);
2289 EAPI int livebox_service_enumerate_category_list(const char *cluster, int (*cb)(const char *cluster, const char *category, void *data), void *data)
2293 const char *category;
2297 if (!cluster || !cb)
2298 return LB_STATUS_ERROR_INVALID;
2302 return LB_STATUS_ERROR_IO;
2304 ret = sqlite3_prepare_v2(handle, "SELECT DISTINCT category FROM groupinfo WHERE cluster = ?", -1, &stmt, NULL);
2305 if (ret != SQLITE_OK) {
2306 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2307 cnt = LB_STATUS_ERROR_IO;
2312 while (sqlite3_step(stmt) == SQLITE_ROW) {
2313 category = (const char *)sqlite3_column_text(stmt, 0);
2314 if (!category || !strlen(category))
2317 if (cb(cluster, category, data) < 0)
2323 sqlite3_reset(stmt);
2324 sqlite3_finalize(stmt);
2330 EAPI int livebox_service_init(void)
2332 if (s_info.handle) {
2333 DbgPrint("Already initialized\n");
2334 s_info.init_count++;
2338 s_info.handle = open_db();
2339 if (s_info.handle) {
2340 s_info.init_count++;
2344 return LB_STATUS_ERROR_IO;
2347 EAPI int livebox_service_fini(void)
2349 if (!s_info.handle || s_info.init_count <= 0) {
2350 ErrPrint("Service is not initialized\n");
2351 return LB_STATUS_ERROR_IO;
2354 s_info.init_count--;
2355 if (s_info.init_count > 0) {
2356 DbgPrint("Init count %d\n", s_info.init_count);
2360 db_util_close(s_info.handle);
2361 s_info.handle = NULL;
2365 EAPI int livebox_service_get_size(int type, int *width, int *height)
2376 return convert_size_from_type(type, width, height);
2379 EAPI int livebox_service_size_type(int width, int height)
2383 if (update_resolution() < 0)
2384 ErrPrint("Failed to update the size list\n");
2386 for (idx = 0; idx < NR_OF_SIZE_LIST; idx++) {
2387 if (SIZE_LIST[idx].w == width && SIZE_LIST[idx].h == height)
2393 return LB_SIZE_TYPE_1x1;
2395 return LB_SIZE_TYPE_2x1;
2397 return LB_SIZE_TYPE_2x2;
2399 return LB_SIZE_TYPE_4x1;
2401 return LB_SIZE_TYPE_4x2;
2403 return LB_SIZE_TYPE_4x3;
2405 return LB_SIZE_TYPE_4x4;
2407 return LB_SIZE_TYPE_4x5;
2409 return LB_SIZE_TYPE_4x6;
2411 return LB_SIZE_TYPE_EASY_1x1;
2413 return LB_SIZE_TYPE_EASY_3x1;
2415 return LB_SIZE_TYPE_EASY_3x3;
2417 return LB_SIZE_TYPE_0x0;
2422 return LB_SIZE_TYPE_UNKNOWN;