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>
38 #include <unicode/uloc.h>
43 #include "livebox-service.h"
44 #include "livebox-errno.h"
46 #define SAMSUNG_PREFIX "com.samsung."
47 #define EAPI __attribute__((visibility("default")))
48 #define DEFAULT_TIMEOUT 2.0
51 static struct supported_size_list {
54 } SIZE_LIST[NR_OF_SIZE_LIST] = {
55 { 175, 175 }, /*!< 1x1 */
56 { 354, 175 }, /*!< 2x1 */
57 { 354, 354 }, /*!< 2x2 */
58 { 712, 175 }, /*!< 4x1 */
59 { 712, 354 }, /*!< 4x2 */
60 { 712, 533 }, /*!< 4x3 */
61 { 712, 712 }, /*!< 4x4 */
62 { 712, 891 }, /*!< 4x5 */
63 { 712, 1070 }, /*!< 4x6 */
64 { 224, 215 }, /*!< 21x21 */
65 { 680, 215 }, /*!< 23x21 */
66 { 680, 653 }, /*!< 23x23 */
67 { 720, 1280 }, /*!< 0x0 */
70 struct pkglist_handle {
72 PKGLIST_TYPE_LB_LIST = 0x00beef00,
73 PKGLIST_TYPE_UNKNOWN = 0x00dead00
82 const char *conf_file;
87 char country[ULOC_COUNTRY_CAPACITY];
92 .dbfile = "/opt/dbspace/.livebox.db",
93 .conf_file = "/usr/share/data-provider-master/resolution.ini",
103 static inline int update_info(int width_type, int height_type, int width, int height)
107 if (width_type == 1 && height_type == 1) {
109 } else if (width_type == 2 && height_type == 1) {
111 } else if (width_type == 2 && height_type == 2) {
113 } else if (width_type == 4 && height_type == 1) {
115 } else if (width_type == 4 && height_type == 2) {
117 } else if (width_type == 4 && height_type == 3) {
119 } else if (width_type == 4 && height_type == 4) {
121 } else if (width_type == 4 && height_type == 5) {
123 } else if (width_type == 4 && height_type == 6) {
125 } else if (width_type == 21 && height_type == 21) {
127 } else if (width_type == 23 && height_type == 21) {
129 } else if (width_type == 23 && height_type == 23) {
131 } else if (width_type == 0 && height_type == 0) {
134 ErrPrint("Unknown size type: %dx%d (%dx%d)\n", width_type, height_type, width, height);
138 SIZE_LIST[idx].w = width;
139 SIZE_LIST[idx].h = height;
143 static inline int update_from_file(void)
151 char buffer[MAX_COLUMN];
165 fp = fopen(s_info.conf_file, "r");
167 ErrPrint("Open failed: %s\n", strerror(errno));
168 return LB_STATUS_ERROR_IO;
177 if (idx == MAX_COLUMN) {
178 ErrPrint("Buffer overflow. Too long line. LINE MUST BE SHOT THAN %d\n", MAX_COLUMN);
184 if (isspace(ch) || ch == EOF) {
200 if (sscanf(buffer, "%dx%d", &width_type, &height_type) != 2) {
201 ErrPrint("Invalid syntax: [%s]\n", buffer);
205 } else if (ch == '=') {
208 if (sscanf(buffer, "%dx%d", &width_type, &height_type) != 2) {
209 ErrPrint("Invalid syntax: [%s]\n", buffer);
213 } else if (ch == EOF) {
214 ErrPrint("Invalid Syntax\n");
226 if (isspace(ch) || ch == EOF) {
235 if (isspace(ch) || ch == EOF) {
239 if (sscanf(buffer, "%dx%d", &width, &height) != 2) {
240 ErrPrint("Invalid syntax: [%s]\n", buffer);
242 } else if (ch == EOF) {
243 updated += update_info(width_type, height_type, width, height);
250 updated += update_info(width_type, height_type, width, height);
255 if (ch == '\n' || ch == '\r' || ch == '\f') {
260 if (ch == '\n' || ch == '\r' || ch == '\f') {
265 ErrPrint("Unknown status. couldn't be reach to here\n");
270 if (fclose(fp) != 0) {
271 ErrPrint("fclose: %s\n", strerror(errno));
274 return NR_OF_SIZE_LIST - updated;
277 static int update_resolution(void)
289 if (s_info.res_resolved) {
290 return LB_STATUS_SUCCESS;
293 disp = XOpenDisplay(NULL);
295 ErrPrint("Failed to open a display\n");
296 return LB_STATUS_ERROR_FAULT;
299 root = XDefaultRootWindow(disp);
300 if (!XGetGeometry(disp, root, &dummy, &x, &y, &width, &height, &border, &depth)) {
302 return LB_STATUS_ERROR_FAULT;
305 if (update_from_file() == 0) {
306 DbgPrint("Resolution info is all updated by file\n");
309 for (i = 0; i < NR_OF_SIZE_LIST; i++) {
310 SIZE_LIST[i].w = (unsigned int)((double)SIZE_LIST[i].w * (double)width / 720.0f);
311 SIZE_LIST[i].h = (unsigned int)((double)SIZE_LIST[i].h * (double)width / 720.0f);
315 s_info.res_resolved = 1;
316 return LB_STATUS_SUCCESS;
319 static sqlite3 *open_db(void)
323 if (!s_info.handle) {
326 ret = db_util_open(s_info.dbfile, &handle, DB_UTIL_REGISTER_HOOK_METHOD);
327 if (ret != SQLITE_OK) {
328 ErrPrint("Failed to open a DB\n");
332 handle = s_info.handle;
338 static inline __attribute__((always_inline)) void close_db(sqlite3 *handle)
340 if (!s_info.handle) {
341 db_util_close(handle);
345 static inline int convert_size_from_type(enum livebox_size_type type, int *width, int *height)
350 case LB_SIZE_TYPE_1x1: /*!< 175x175 */
353 case LB_SIZE_TYPE_2x1: /*!< 354x175 */
356 case LB_SIZE_TYPE_2x2: /*!< 354x354 */
359 case LB_SIZE_TYPE_4x1: /*!< 712x175 */
362 case LB_SIZE_TYPE_4x2: /*!< 712x354 */
365 case LB_SIZE_TYPE_4x3: /*!< 712x533 */
368 case LB_SIZE_TYPE_4x4: /*!< 712x712 */
371 case LB_SIZE_TYPE_4x5: /*!< 712x891 */
374 case LB_SIZE_TYPE_4x6: /*!< 712x1070 */
377 case LB_SIZE_TYPE_EASY_1x1: /*< 224x215 */
380 case LB_SIZE_TYPE_EASY_3x1: /*!< 680x215 */
383 case LB_SIZE_TYPE_EASY_3x3: /*!< 680x653 */
386 case LB_SIZE_TYPE_0x0: /*!< 720x1280 */
390 return LB_STATUS_ERROR_INVALID;
393 if (update_resolution() < 0) {
394 ErrPrint("Failed to update resolution\n");
397 *width = SIZE_LIST[idx].w;
398 *height = SIZE_LIST[idx].h;
399 return LB_STATUS_SUCCESS;
402 EAPI int livebox_service_change_period(const char *pkgname, const char *id, double period)
404 struct packet *packet;
405 struct packet *result;
409 if (!pkgname || !id || period < 0.0f) {
410 ErrPrint("Invalid argument\n");
411 return LB_STATUS_ERROR_INVALID;
414 uri = util_id_to_uri(id);
416 return LB_STATUS_ERROR_MEMORY;
419 packet = packet_create("service_change_period", "ssd", pkgname, uri, period);
422 ErrPrint("Failed to create a packet for period changing\n");
423 return LB_STATUS_ERROR_FAULT;
426 result = com_core_packet_oneshot_send(SERVICE_SOCKET, packet, DEFAULT_TIMEOUT);
427 packet_unref(packet);
430 if (packet_get(result, "i", &ret) != 1) {
431 ErrPrint("Failed to parse a result packet\n");
432 ret = LB_STATUS_ERROR_INVALID;
434 packet_unref(result);
436 ErrPrint("Failed to get result packet\n");
437 ret = LB_STATUS_ERROR_FAULT;
443 EAPI int livebox_service_trigger_update(const char *pkgname, const char *id, const char *cluster, const char *category, int force)
445 struct packet *packet;
446 struct packet *result;
451 ErrPrint("Invalid argument\n");
452 return LB_STATUS_ERROR_INVALID;
455 if (!force && access("/tmp/.live.paused", R_OK) == 0) {
456 DbgPrint("Provider is paused\n");
457 return LB_STATUS_ERROR_CANCEL;
460 uri = util_id_to_uri(id);
462 return LB_STATUS_ERROR_MEMORY;
466 cluster = "user,created";
470 category = "default";
473 packet = packet_create("service_update", "ssss", pkgname, uri, cluster, category);
476 ErrPrint("Failed to create a packet for service_update\n");
477 return LB_STATUS_ERROR_FAULT;
480 result = com_core_packet_oneshot_send(SERVICE_SOCKET, packet, DEFAULT_TIMEOUT);
481 packet_unref(packet);
484 if (packet_get(result, "i", &ret) != 1) {
485 ErrPrint("Failed to parse a result packet\n");
486 ret = LB_STATUS_ERROR_INVALID;
489 packet_unref(result);
491 ErrPrint("Failed to get result packet\n");
492 ret = LB_STATUS_ERROR_FAULT;
499 * pkgid == Package Id (not the livebox id)
501 EAPI struct pkglist_handle *livebox_service_pkglist_create(const char *pkgid, struct pkglist_handle *handle)
506 if (handle->type != PKGLIST_TYPE_LB_LIST) {
507 ErrPrint("Invalid handle\n");
512 ErrPrint("pkgid should be NULL\n");
516 sqlite3_reset(handle->stmt);
520 handle = calloc(1, sizeof(*handle));
522 ErrPrint("Heap: %s\n", strerror(errno));
526 handle->type = PKGLIST_TYPE_LB_LIST;
528 handle->handle = open_db();
529 if (!handle->handle) {
535 ret = sqlite3_prepare_v2(handle->handle, "SELECT appid, pkgid, prime FROM pkgmap", -1, &handle->stmt, NULL);
536 if (ret != SQLITE_OK) {
537 ErrPrint("Error: %s\n", sqlite3_errmsg(handle->handle));
538 close_db(handle->handle);
543 ret = sqlite3_prepare_v2(handle->handle, "SELECT appid, pkgid, prime FROM pkgmap WHERE appid = ?", -1, &handle->stmt, NULL);
544 if (ret != SQLITE_OK) {
545 ErrPrint("Error: %s\n", sqlite3_errmsg(handle->handle));
546 close_db(handle->handle);
551 ret = sqlite3_bind_text(handle->stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
552 if (ret != SQLITE_OK) {
553 ErrPrint("Error: %s\n", sqlite3_errmsg(handle->handle));
554 sqlite3_finalize(handle->stmt);
555 close_db(handle->handle);
564 EAPI int livebox_service_get_pkglist_item(struct pkglist_handle *handle, char **appid, char **pkgname, int *is_prime)
568 char *_pkgname = NULL;
570 if (!handle || handle->type != PKGLIST_TYPE_LB_LIST) {
571 return LB_STATUS_ERROR_INVALID;
574 if (sqlite3_step(handle->stmt) != SQLITE_ROW) {
575 return LB_STATUS_ERROR_NOT_EXIST;
579 tmp = (const char *)sqlite3_column_text(handle->stmt, 0);
580 if (tmp && strlen(tmp)) {
581 _appid = strdup(tmp);
583 ErrPrint("Heap: %s\n", strerror(errno));
584 return LB_STATUS_ERROR_MEMORY;
590 tmp = (const char *)sqlite3_column_text(handle->stmt, 1);
591 if (tmp && strlen(tmp)) {
592 _pkgname = strdup(tmp);
594 ErrPrint("Heap: %s\n", strerror(errno));
596 return LB_STATUS_ERROR_MEMORY;
602 *is_prime = sqlite3_column_int(handle->stmt, 2);
613 return LB_STATUS_SUCCESS;
616 EAPI int livebox_service_pkglist_destroy(struct pkglist_handle *handle)
618 if (!handle || handle->type != PKGLIST_TYPE_LB_LIST) {
619 return LB_STATUS_ERROR_INVALID;
622 handle->type = PKGLIST_TYPE_UNKNOWN;
623 sqlite3_reset(handle->stmt);
624 sqlite3_finalize(handle->stmt);
625 close_db(handle->handle);
627 return LB_STATUS_SUCCESS;
630 EAPI int livebox_service_get_pkglist(int (*cb)(const char *appid, const char *pkgname, int is_prime, void *data), void *data)
640 return LB_STATUS_ERROR_INVALID;
645 return LB_STATUS_ERROR_IO;
648 ret = sqlite3_prepare_v2(handle, "SELECT appid, pkgid, prime FROM pkgmap", -1, &stmt, NULL);
649 if (ret != SQLITE_OK) {
650 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
651 ret = LB_STATUS_ERROR_IO;
656 while (sqlite3_step(stmt) == SQLITE_ROW) {
657 appid = (char *)sqlite3_column_text(stmt, 0);
658 if (!appid || !strlen(appid)) {
659 ErrPrint("APPID is not valid\n");
663 pkgid = (char *)sqlite3_column_text(stmt, 1);
664 if (!pkgid || !strlen(pkgid)) {
665 ErrPrint("pkgid is not valid\n");
669 is_prime = sqlite3_column_int(stmt, 2);
673 if (cb(appid, pkgid, is_prime, data) < 0) {
674 DbgPrint("Callback stopped package crawling\n");
680 sqlite3_finalize(stmt);
687 EAPI int livebox_service_get_pkglist_by_pkgid(const char *pkgid, int (*cb)(const char *lbid, int is_prime, void *data), void *data)
696 return LB_STATUS_ERROR_INVALID;
701 return LB_STATUS_ERROR_IO;
704 ret = sqlite3_prepare_v2(handle, "SELECT pkgid, prime FROM pkgmap WHERE appid = ?", -1, &stmt, NULL);
705 if (ret != SQLITE_OK) {
706 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
707 ret = LB_STATUS_ERROR_IO;
711 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
712 if (ret != SQLITE_OK) {
713 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
715 sqlite3_finalize(stmt);
716 ret = LB_STATUS_ERROR_IO;
721 while (sqlite3_step(stmt) == SQLITE_ROW) {
722 lbid = (const char *)sqlite3_column_text(stmt, 0);
723 if (!lbid || !strlen(lbid)) {
724 ErrPrint("LBID is not valid\n");
728 is_prime = sqlite3_column_int(stmt, 1);
732 if (cb(lbid, is_prime, data) < 0) {
733 DbgPrint("Callback stopped package crawling\n");
739 sqlite3_finalize(stmt);
746 struct pkgmgr_cbdata {
748 void (*cb)(const char *lbid, const char *appid, void *data);
752 static int pkgmgr_cb(const pkgmgrinfo_appinfo_h handle, void *user_data)
754 struct pkgmgr_cbdata *cbdata = (struct pkgmgr_cbdata *)user_data;
758 ret = pkgmgrinfo_appinfo_get_appid(handle, &appid);
760 ErrPrint("Unable to get appid\n");
762 cbdata->cb(cbdata->lbid, appid, cbdata->cbdata);
768 static inline char *pkgmgr_get_mainapp(const char *pkgid)
770 pkgmgrinfo_pkginfo_h handle;
773 if (pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle) != PMINFO_R_OK) {
774 ErrPrint("Unable to get mainapp: %s\n", pkgid);
778 if (pkgmgrinfo_pkginfo_get_mainappid(handle, &ret) == PMINFO_R_OK) {
781 ErrPrint("Failed to get mainappid\n");
782 ret = NULL; /* I cannot believe the pkgmgrinfo_pkginfo_get_mainappid. it maybe able to touch my "ret" even though it fails */
786 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
790 static inline int pkgmgr_get_applist(const char *pkgid, const char *lbid, void (*cb)(const char *lbid, const char *appid, void *data), void *data)
792 struct pkgmgr_cbdata cbdata;
793 pkgmgrinfo_pkginfo_h handle;
796 ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle);
798 ErrPrint("Unable to get pkginfo: %s\n", pkgid);
804 cbdata.cbdata = data;
806 ret = pkgmgrinfo_appinfo_get_list(handle, PM_UI_APP, pkgmgr_cb, &cbdata);
808 ErrPrint("Failed to get applist\n");
811 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
815 EAPI int livebox_service_get_applist(const char *lbid, void (*cb)(const char *lbid, const char *appid, void *data), void *data)
824 return LB_STATUS_ERROR_INVALID;
829 return LB_STATUS_ERROR_IO;
832 ret = sqlite3_prepare_v2(handle, "SELECT appid FROM pkgmap WHERE (pkgid = ?) or (appid = ?)", -1, &stmt, NULL);
833 if (ret != SQLITE_OK) {
834 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
835 ret = LB_STATUS_ERROR_IO;
839 ret = sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT);
840 if (ret != SQLITE_OK) {
841 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
842 ret = LB_STATUS_ERROR_IO;
846 ret = sqlite3_bind_text(stmt, 2, lbid, -1, SQLITE_TRANSIENT);
847 if (ret != SQLITE_OK) {
848 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
849 ret = LB_STATUS_ERROR_IO;
853 if (sqlite3_step(stmt) != SQLITE_ROW) {
854 ret = LB_STATUS_ERROR_INVALID;
856 sqlite3_finalize(stmt);
860 tmp = (const char *)sqlite3_column_text(stmt, 0);
861 if (!tmp || !strlen(tmp)) {
862 ErrPrint("Invalid package name (%s)\n", lbid);
863 ret = LB_STATUS_ERROR_INVALID;
865 sqlite3_finalize(stmt);
871 ErrPrint("Error: %s\n", strerror(errno));
872 ret = LB_STATUS_ERROR_MEMORY;
874 sqlite3_finalize(stmt);
879 sqlite3_finalize(stmt);
881 ret = pkgmgr_get_applist(pkgid, lbid, cb, data);
889 EAPI char *livebox_service_mainappid(const char *lbid)
906 if (sqlite3_prepare_v2(handle, "SELECT appid, uiapp FROM pkgmap WHERE (pkgid = ?) or (appid = ? and prime = 1)", -1, &stmt, NULL) != SQLITE_OK) {
907 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
911 if (sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT) != SQLITE_OK) {
912 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
916 if (sqlite3_bind_text(stmt, 2, lbid, -1, SQLITE_TRANSIENT) != SQLITE_OK) {
917 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
921 if (sqlite3_step(stmt) != SQLITE_ROW) {
923 sqlite3_finalize(stmt);
927 tmp = (const char *)sqlite3_column_text(stmt, 0);
928 if (!tmp || !strlen(tmp)) {
929 ErrPrint("Invalid package name (%s)\n", lbid);
931 sqlite3_finalize(stmt);
935 pkgid = (const char *)sqlite3_column_text(stmt, 1);
936 if (!pkgid || !strlen(pkgid)) {
938 * This record has no uiapp.
939 * Try to find the main ui-app id.
941 ret = pkgmgr_get_mainapp(tmp);
945 ErrPrint("Error: %s\n", strerror(errno));
950 sqlite3_finalize(stmt);
957 EAPI int livebox_service_get_supported_size_types(const char *pkgid, int *cnt, int *types)
964 if (!types || !cnt || !pkgid) {
965 return LB_STATUS_ERROR_INVALID;
970 return LB_STATUS_ERROR_IO;
973 ret = sqlite3_prepare_v2(handle, "SELECT size_type FROM box_size WHERE pkgid = ? ORDER BY size_type ASC", -1, &stmt, NULL);
974 if (ret != SQLITE_OK) {
975 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
976 ret = LB_STATUS_ERROR_IO;
980 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
981 if (ret != SQLITE_OK) {
982 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
984 sqlite3_finalize(stmt);
985 ret = LB_STATUS_ERROR_IO;
989 if (*cnt > NR_OF_SIZE_LIST) {
990 *cnt = NR_OF_SIZE_LIST;
994 while (sqlite3_step(stmt) == SQLITE_ROW && ret < *cnt) {
995 size = sqlite3_column_int(stmt, 0);
1001 sqlite3_reset(stmt);
1002 sqlite3_finalize(stmt);
1009 static inline char *cur_locale(void)
1012 language = vconf_get_str(VCONFKEY_LANGSET);
1030 language = strdup("en-us");
1032 ErrPrint("Heap: %s\n", strerror(errno));
1039 static inline char *get_default_name(const char *pkgid)
1051 ret = sqlite3_prepare_v2(handle, "SELECT name FROM client WHERE pkgid = ?", -1, &stmt, NULL);
1052 if (ret != SQLITE_OK) {
1053 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1058 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1059 if (ret != SQLITE_OK) {
1060 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1064 ret = sqlite3_step(stmt);
1065 if (ret == SQLITE_ROW) {
1068 tmp = (const char *)sqlite3_column_text(stmt, 0);
1069 if (tmp && strlen(tmp)) {
1072 ErrPrint("Heap: %s\n", strerror(errno));
1078 sqlite3_reset(stmt);
1079 sqlite3_finalize(stmt);
1084 static inline char *get_default_icon(const char *pkgid)
1096 ret = sqlite3_prepare_v2(handle, "SELECT icon FROM client WHERE pkgid = ?", -1, &stmt, NULL);
1097 if (ret != SQLITE_OK) {
1098 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1103 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1104 if (ret != SQLITE_OK) {
1105 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1109 ret = sqlite3_step(stmt);
1110 if (ret == SQLITE_ROW) {
1113 tmp = (const char *)sqlite3_column_text(stmt, 0);
1114 if (tmp && strlen(tmp)) {
1117 ErrPrint("Heap: %s\n", strerror(errno));
1123 sqlite3_reset(stmt);
1124 sqlite3_finalize(stmt);
1129 EAPI char *livebox_service_content(const char *pkgid)
1133 char *content = NULL;
1141 ret = sqlite3_prepare_v2(handle, "SELECT content FROM client WHERE pkgid = ?", -1, &stmt, NULL);
1142 if (ret != SQLITE_OK) {
1143 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1148 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1149 if (ret != SQLITE_OK) {
1150 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1154 ret = sqlite3_step(stmt);
1155 if (ret == SQLITE_ROW) {
1158 tmp = (const char *)sqlite3_column_text(stmt, 0);
1159 if (tmp && strlen(tmp)) {
1160 content = strdup(tmp);
1162 ErrPrint("Heap: %s\n", strerror(errno));
1168 sqlite3_reset(stmt);
1169 sqlite3_finalize(stmt);
1174 EAPI char *livebox_service_setup_appid(const char *lbid)
1186 ret = sqlite3_prepare_v2(handle, "SELECT setup FROM client WHERE pkgid = ?", -1, &stmt, NULL);
1187 if (ret != SQLITE_OK) {
1188 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1194 ret = sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT);
1195 if (ret != SQLITE_OK) {
1196 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1200 ret = sqlite3_step(stmt);
1201 if (ret == SQLITE_ROW) {
1204 tmp = (const char *)sqlite3_column_text(stmt, 0);
1205 if (!tmp || !strlen(tmp)) {
1209 appid = strdup(tmp);
1211 ErrPrint("Error: %s\n", strerror(errno));
1216 sqlite3_reset(stmt);
1217 sqlite3_finalize(stmt);
1222 EAPI int livebox_service_nodisplay(const char *pkgid)
1233 ret = sqlite3_prepare_v2(handle, "SELECT nodisplay FROM client WHERE pkgid = ?", -1, &stmt, NULL);
1234 if (ret != SQLITE_OK) {
1235 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1240 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1241 if (ret != SQLITE_OK) {
1242 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1247 ret = sqlite3_step(stmt);
1248 if (ret == SQLITE_ROW) {
1249 ret = !!sqlite3_column_int(stmt, 0);
1255 sqlite3_reset(stmt);
1256 sqlite3_finalize(stmt);
1261 static inline char *get_lb_pkgname_by_appid(const char *appid)
1279 ret = sqlite3_prepare_v2(handle, "SELECT pkgid FROM pkgmap WHERE (appid = ? AND prime = 1) OR pkgid = ?", -1, &stmt, NULL);
1280 if (ret != SQLITE_OK) {
1281 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1286 ret = sqlite3_bind_text(stmt, 1, appid, -1, SQLITE_TRANSIENT);
1287 if (ret != SQLITE_OK) {
1288 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1292 ret = sqlite3_bind_text(stmt, 2, appid, -1, SQLITE_TRANSIENT);
1293 if (ret != SQLITE_OK) {
1294 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1298 if (sqlite3_step(stmt) != SQLITE_ROW) {
1299 ErrPrint("Error: %s (has no record? - %s)\n", sqlite3_errmsg(handle), appid);
1303 tmp = (char *)sqlite3_column_text(stmt, 0);
1304 if (tmp && strlen(tmp)) {
1305 pkgid = strdup(tmp);
1307 ErrPrint("Heap: %s\n", strerror(errno));
1312 sqlite3_reset(stmt);
1313 sqlite3_finalize(stmt);
1318 EAPI int livebox_service_need_frame(const char *pkgid, int size_type)
1327 ErrPrint("Unable to open a DB\n");
1331 ret = sqlite3_prepare_v2(handle, "SELECT need_frame FROM box_size WHERE pkgid = ? AND size_type = ?", -1, &stmt, NULL);
1332 if (ret != SQLITE_OK) {
1333 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1340 lbid = livebox_service_pkgname(pkgid);
1342 ErrPrint("Invalid appid (%s)\n", pkgid);
1347 ret = sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT);
1349 if (ret != SQLITE_OK) {
1350 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1355 ret = sqlite3_bind_int(stmt, 2, size_type);
1356 if (ret != SQLITE_OK) {
1357 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1362 ret = sqlite3_step(stmt);
1363 if (ret == SQLITE_ROW) {
1364 ret = !!sqlite3_column_int(stmt, 0);
1367 ErrPrint("There is no such result\n");
1370 sqlite3_reset(stmt);
1371 sqlite3_finalize(stmt);
1376 EAPI int livebox_service_touch_effect(const char *pkgid, int size_type)
1385 ErrPrint("Unable to open a DB\n");
1389 ret = sqlite3_prepare_v2(handle, "SELECT touch_effect FROM box_size WHERE pkgid = ? AND size_type = ?", -1, &stmt, NULL);
1390 if (ret != SQLITE_OK) {
1391 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1398 * This function will validate the "pkgid"
1399 * call the exported API in the exported API is not recomended
1402 lbid = livebox_service_pkgname(pkgid);
1404 ErrPrint("Invalid appid (%s)\n", pkgid);
1409 ret = sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT);
1411 if (ret != SQLITE_OK) {
1412 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1417 ret = sqlite3_bind_int(stmt, 2, size_type);
1418 if (ret != SQLITE_OK) {
1419 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1424 ret = sqlite3_step(stmt);
1425 if (ret == SQLITE_ROW) {
1426 ret = !!sqlite3_column_int(stmt, 0);
1428 ret = 1; /*!< Default true: In this case the DB is corrupted. */
1429 ErrPrint("There is no result\n");
1433 sqlite3_reset(stmt);
1434 sqlite3_finalize(stmt);
1439 EAPI int livebox_service_mouse_event(const char *pkgid)
1451 ret = sqlite3_prepare_v2(handle, "SELECT mouse_event FROM client WHERE pkgid = ?", -1, &stmt, NULL);
1452 if (ret != SQLITE_OK) {
1453 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1458 lbid = livebox_service_pkgname(pkgid);
1460 ErrPrint("Failed to get lbid: %s\n", pkgid);
1465 ret = sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT);
1467 if (ret != SQLITE_OK) {
1468 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1473 ret = sqlite3_step(stmt);
1474 if (ret == SQLITE_ROW) {
1475 ret = !!sqlite3_column_int(stmt, 0);
1477 ret = 0; /*!< Default is false, In this case the DB is corrupted */
1478 ErrPrint("There is no result.\n");
1482 sqlite3_reset(stmt);
1483 sqlite3_finalize(stmt);
1488 static inline int update_lang_info(void)
1493 syslang = vconf_get_str(VCONFKEY_LANGSET);
1495 ErrPrint("Failed to get vconf-lang\n");
1499 if (s_info.syslang && !strcmp(s_info.syslang, syslang)) {
1500 DbgPrint("Syslang is not changed: %s\n", syslang);
1505 free(s_info.syslang);
1506 s_info.syslang = syslang;
1509 uloc_setDefault((const char *)s_info.syslang, &err);
1510 if (!U_SUCCESS(err)) {
1511 ErrPrint("Failed to set default lang: %s\n", u_errorName(err));
1512 free(s_info.syslang);
1513 s_info.syslang = NULL;
1517 s_info.iso3lang = uloc_getISO3Language(uloc_getDefault());
1518 if (!s_info.iso3lang || !strlen(s_info.iso3lang)) {
1519 ErrPrint("Failed to get iso3lang\n");
1520 free(s_info.syslang);
1521 s_info.syslang = NULL;
1526 s_info.country_len = uloc_getCountry(uloc_getDefault(), s_info.country, ULOC_COUNTRY_CAPACITY, &err);
1527 if (!U_SUCCESS(err) || s_info.country_len <= 0) {
1528 ErrPrint("Failed to get locale: %s, %s, %d (%s)\n", u_errorName(err), s_info.iso3lang, s_info.country_len, s_info.country);
1529 free(s_info.syslang);
1530 s_info.syslang = NULL;
1537 EAPI char *livebox_service_preview(const char *pkgid, int size_type)
1542 char *preview = NULL;
1554 ret = sqlite3_prepare_v2(handle, "SELECT preview FROM box_size WHERE pkgid = ? AND size_type = ?", -1, &stmt, NULL);
1555 if (ret != SQLITE_OK) {
1556 ErrPrint("Error: %s, %s\n", sqlite3_errmsg(handle), pkgid);
1561 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1562 if (ret != SQLITE_OK) {
1563 ErrPrint("Error: %s, %s\n", sqlite3_errmsg(handle), pkgid);
1567 ret = sqlite3_bind_int(stmt, 2, size_type);
1568 if (ret != SQLITE_OK) {
1569 ErrPrint("Error: %s, %s\n", sqlite3_errmsg(handle), pkgid);
1573 ret = sqlite3_step(stmt);
1574 if (ret != SQLITE_ROW) {
1575 ErrPrint("Error: %s, %s\n", sqlite3_errmsg(handle), pkgid);
1579 tmp = (const char *)sqlite3_column_text(stmt, 0);
1580 if (!tmp || !(tmp_len = strlen(tmp))) {
1581 ErrPrint("Failed to get data (%s)\n", pkgid);
1585 if (update_lang_info() != 0) {
1586 preview = strdup(tmp);
1588 ErrPrint("Heap: %s\n", strerror(errno));
1593 buf_len = tmp_len + strlen(s_info.iso3lang) + s_info.country_len + 3; /* '/' '-' '/' */
1594 preview = malloc(buf_len + 1);
1596 ErrPrint("Heap: %s\n", strerror(errno));
1600 for (i = tmp_len; i >= 0 && tmp[i] != '/'; i--);
1603 strncpy(preview, tmp, i);
1604 printed = snprintf(preview + i, buf_len - i, "%s-%s/%s", s_info.iso3lang, s_info.country, tmp + i);
1605 if (preview[i + printed] != '\0') {
1606 ErrPrint("Path is truncated\n");
1607 preview[i + printed] = '\0';
1610 if (access(preview, R_OK) != 0) {
1611 DbgPrint("Access failed: %s, %s\n", preview, strerror(errno));
1614 preview = strdup(tmp);
1616 ErrPrint("Heap: %s\n", strerror(errno));
1621 sqlite3_reset(stmt);
1622 sqlite3_finalize(stmt);
1627 EAPI char *livebox_service_i18n_icon(const char *pkgid, const char *lang)
1636 language = strdup(lang);
1638 ErrPrint("Heap: %s\n", strerror(errno));
1642 language = cur_locale();
1654 ret = sqlite3_prepare_v2(handle, "SELECT icon FROM i18n WHERE pkgid = ? AND lang = ?", -1, &stmt, NULL);
1655 if (ret != SQLITE_OK) {
1656 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1662 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1663 if (ret != SQLITE_OK) {
1664 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1668 ret = sqlite3_bind_text(stmt, 2, language, -1, SQLITE_TRANSIENT);
1669 if (ret != SQLITE_OK) {
1670 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1674 ret = sqlite3_step(stmt);
1675 if (ret == SQLITE_ROW) {
1677 tmp = (const char *)sqlite3_column_text(stmt, 0);
1678 if (!tmp || !strlen(tmp)) {
1679 icon = get_default_icon(pkgid);
1683 ErrPrint("Heap: %s\n", strerror(errno));
1687 icon = get_default_icon(pkgid);
1691 sqlite3_reset(stmt);
1692 sqlite3_finalize(stmt);
1698 EAPI char *livebox_service_i18n_name(const char *pkgid, const char *lang)
1707 language = strdup(lang);
1709 ErrPrint("Error: %s\n", strerror(errno));
1713 language = cur_locale();
1725 ret = sqlite3_prepare_v2(handle, "SELECT name FROM i18n WHERE pkgid = ? AND lang = ?", -1, &stmt, NULL);
1726 if (ret != SQLITE_OK) {
1727 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1733 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1734 if (ret != SQLITE_OK) {
1735 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1739 ret = sqlite3_bind_text(stmt, 2, language, -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) {
1748 tmp = (const char *)sqlite3_column_text(stmt, 0);
1749 if (!tmp || !strlen(tmp)) {
1750 name = get_default_name(pkgid);
1754 ErrPrint("Heap: %s\n", strerror(errno));
1758 name = get_default_name(pkgid);
1762 sqlite3_reset(stmt);
1763 sqlite3_finalize(stmt);
1769 EAPI int livebox_service_get_supported_sizes(const char *pkgid, int *cnt, int *w, int *h)
1776 if (!w || !h || !cnt || !pkgid) {
1777 return LB_STATUS_ERROR_INVALID;
1782 return LB_STATUS_ERROR_IO;
1785 ret = sqlite3_prepare_v2(handle, "SELECT size_type FROM box_size WHERE pkgid = ? ORDER BY size_type ASC", -1, &stmt, NULL);
1786 if (ret != SQLITE_OK) {
1787 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1788 ret = LB_STATUS_ERROR_IO;
1792 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1793 if (ret != SQLITE_OK) {
1794 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1795 sqlite3_reset(stmt);
1796 sqlite3_finalize(stmt);
1797 ret = LB_STATUS_ERROR_IO;
1801 if (*cnt > NR_OF_SIZE_LIST) {
1802 *cnt = NR_OF_SIZE_LIST;
1806 while (sqlite3_step(stmt) == SQLITE_ROW && ret < *cnt) {
1807 size = sqlite3_column_int(stmt, 0);
1808 ret += (convert_size_from_type(size, w + ret, h + ret) == 0);
1812 sqlite3_reset(stmt);
1813 sqlite3_finalize(stmt);
1820 EAPI char *livebox_service_libexec(const char *pkgid)
1839 ret = sqlite3_prepare_v2(handle, "SELECT pkgmap.appid, provider.libexec FROM pkgmap, provider WHERE pkgmap.pkgid = ? AND provider.pkgid = ?", -1, &stmt, NULL);
1840 if (ret != SQLITE_OK) {
1841 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1845 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1846 if (ret != SQLITE_OK) {
1847 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1848 sqlite3_finalize(stmt);
1852 ret = sqlite3_bind_text(stmt, 2, pkgid, -1, SQLITE_TRANSIENT);
1853 if (ret != SQLITE_OK) {
1854 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1855 sqlite3_finalize(stmt);
1859 if (sqlite3_step(stmt) != SQLITE_ROW) {
1860 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1861 sqlite3_reset(stmt);
1862 sqlite3_finalize(stmt);
1864 libexec = util_conf_get_libexec(pkgid);
1865 DbgPrint("Fallback to conf checker: %s\n", libexec);
1869 appid = (char *)sqlite3_column_text(stmt, 0);
1870 if (!appid || !strlen(appid)) {
1871 ErrPrint("Invalid appid: %s\n", sqlite3_errmsg(handle));
1872 sqlite3_reset(stmt);
1873 sqlite3_finalize(stmt);
1877 path = (char *)sqlite3_column_text(stmt, 1);
1878 if (!path || !strlen(path)) {
1879 ErrPrint("Invalid libexec: %s\n", sqlite3_errmsg(handle));
1880 sqlite3_reset(stmt);
1881 sqlite3_finalize(stmt);
1885 libexec = strdup(path);
1887 ErrPrint("Heap: %s\n", strerror(errno));
1888 sqlite3_reset(stmt);
1889 sqlite3_finalize(stmt);
1893 DbgPrint("libexec: %s\n", libexec);
1895 sqlite3_reset(stmt);
1896 sqlite3_finalize(stmt);
1902 EAPI char *livebox_service_pkgname(const char *appid)
1905 pkgmgr_appinfo_h handle;
1913 lb_pkgname = get_lb_pkgname_by_appid(appid);
1920 * Try to get the package id using given appid
1922 ret = pkgmgr_appinfo_get_appinfo(appid, &handle);
1923 if (ret != PKGMGR_R_OK) {
1924 ErrPrint("Failed to get appinfo\n");
1928 ret = pkgmgr_appinfo_get_pkgname(handle, &new_appid);
1929 if (ret != PKGMGR_R_OK) {
1930 pkgmgr_appinfo_destroy_appinfo(handle);
1931 ErrPrint("Failed to get pkgname for (%s)\n", appid);
1935 lb_pkgname = get_lb_pkgname_by_appid(new_appid);
1936 pkgmgr_appinfo_destroy_appinfo(handle);
1938 if (!lb_pkgname && util_validate_livebox_package(appid) == 0) {
1939 return strdup(appid);
1945 EAPI char *livebox_service_provider_name(const char *lbid)
1951 char *str = SAMSUNG_PREFIX;
1957 while (str[idx] && lbid[idx] && lbid[idx] == str[idx]) {
1959 if (seq < 2 && lbid[idx] == '.') {
1965 if (!str[idx] && lbid[idx]) {
1967 return strdup(lbid);
1968 } else if (seq < 2) {
1970 if (lbid[idx] == '.') {
1972 } else if (!lbid[idx]) {
1973 ErrPrint("Invalid lbid: %s\n", lbid);
1985 ret = strdup(lbid + stage);
1987 ErrPrint("Error: %s\n", strerror(errno));
1994 EAPI int livebox_service_is_enabled(const char *lbid)
2003 pkgname = livebox_service_appid(lbid);
2007 ret = ail_get_appinfo(pkgname, &ai);
2008 if (ret != AIL_ERROR_OK) {
2013 if (ail_appinfo_get_bool(ai, AIL_PROP_X_SLP_ENABLED_BOOL, &enabled) != AIL_ERROR_OK)
2016 ail_destroy_appinfo(ai);
2018 return enabled == true;
2022 EAPI int livebox_service_is_primary(const char *lbid)
2037 ret = sqlite3_prepare_v2(handle, "SELECT prime FROM pkgmap WHERE pkgid = ?", -1, &stmt, NULL);
2038 if (ret != SQLITE_OK) {
2039 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2044 ret = sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT);
2045 if (ret != SQLITE_OK) {
2046 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2050 ret = sqlite3_step(stmt);
2051 if (ret != SQLITE_ROW) {
2052 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2056 ret = sqlite3_column_int(stmt, 0);
2059 sqlite3_reset(stmt);
2060 sqlite3_finalize(stmt);
2066 * appid == Package ID
2067 * pkgid == Livebox ID
2069 EAPI char *livebox_service_appid(const char *pkgname)
2075 int is_prime __attribute__((__unused__));
2088 ret = sqlite3_prepare_v2(handle, "SELECT appid, prime FROM pkgmap WHERE pkgid = ? OR appid = ?", -1, &stmt, NULL);
2089 if (ret != SQLITE_OK) {
2090 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2094 ret = sqlite3_bind_text(stmt, 1, pkgname, -1, SQLITE_TRANSIENT);
2095 if (ret != SQLITE_OK) {
2096 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2097 sqlite3_reset(stmt);
2098 sqlite3_finalize(stmt);
2102 ret = sqlite3_bind_text(stmt, 2, pkgname, -1, SQLITE_TRANSIENT);
2103 if (ret != SQLITE_OK) {
2104 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2105 sqlite3_reset(stmt);
2106 sqlite3_finalize(stmt);
2110 ret = sqlite3_step(stmt);
2111 if (ret != SQLITE_ROW) {
2112 pkgmgr_appinfo_h pkg_handle;
2115 ErrPrint("Has no record?: %s\n", sqlite3_errmsg(handle));
2116 sqlite3_reset(stmt);
2117 sqlite3_finalize(stmt);
2119 ret = pkgmgr_appinfo_get_appinfo(pkgname, &pkg_handle);
2120 if (ret != PKGMGR_R_OK) {
2121 ErrPrint("Failed to get appinfo: %s\n", pkgname);
2125 ret = pkgmgr_appinfo_get_pkgname(pkg_handle, &new_appid);
2126 if (ret != PKGMGR_R_OK) {
2127 ErrPrint("Failed to get pkgname for (%s)\n", appid);
2128 pkgmgr_appinfo_destroy_appinfo(pkg_handle);
2132 appid = strdup(new_appid);
2134 ErrPrint("Heap: %s\n", strerror(errno));
2137 pkgmgr_appinfo_destroy_appinfo(pkg_handle);
2141 tmp = (char *)sqlite3_column_text(stmt, 0);
2142 if (!tmp || !strlen(tmp)) {
2143 ErrPrint("APPID is NIL\n");
2144 sqlite3_reset(stmt);
2145 sqlite3_finalize(stmt);
2149 appid = strdup(tmp);
2151 ErrPrint("Heap: %s\n", strerror(errno));
2152 sqlite3_reset(stmt);
2153 sqlite3_finalize(stmt);
2157 is_prime = sqlite3_column_int(stmt, 1);
2159 sqlite3_reset(stmt);
2160 sqlite3_finalize(stmt);
2166 EAPI char *livebox_service_lb_script_path(const char *pkgid)
2185 ret = sqlite3_prepare_v2(handle, "SELECT pkgmap.appid, provider.box_src FROM provider, pkgmap WHERE pkgmap.pkgid = ? AND provider.pkgid = ?", -1, &stmt, NULL);
2186 if (ret != SQLITE_OK) {
2187 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2191 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
2192 if (ret != SQLITE_OK) {
2193 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2194 sqlite3_finalize(stmt);
2198 ret = sqlite3_bind_text(stmt, 2, pkgid, -1, SQLITE_TRANSIENT);
2199 if (ret != SQLITE_OK) {
2200 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2201 sqlite3_finalize(stmt);
2205 ret = sqlite3_step(stmt);
2206 if (ret != SQLITE_ROW) {
2207 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2208 sqlite3_reset(stmt);
2209 sqlite3_finalize(stmt);
2213 appid = (char *)sqlite3_column_text(stmt, 0);
2214 if (!appid || !strlen(appid)) {
2215 ErrPrint("Invalid appid : %s\n", sqlite3_errmsg(handle));
2216 sqlite3_reset(stmt);
2217 sqlite3_finalize(stmt);
2221 lb_src = (char *)sqlite3_column_text(stmt, 1);
2222 if (!lb_src || !strlen(lb_src)) {
2223 ErrPrint("No records for lb src : %s\n", sqlite3_errmsg(handle));
2224 sqlite3_reset(stmt);
2225 sqlite3_finalize(stmt);
2229 path = strdup(lb_src);
2231 ErrPrint("Heap: %s\n", strerror(errno));
2232 sqlite3_reset(stmt);
2233 sqlite3_finalize(stmt);
2237 DbgPrint("LB Src: %s\n", path);
2238 sqlite3_reset(stmt);
2239 sqlite3_finalize(stmt);
2245 EAPI char *livebox_service_lb_script_group(const char *pkgid)
2263 ret = sqlite3_prepare_v2(handle, "SELECT box_group FROM provider WHERE pkgid = ?", -1, &stmt, NULL);
2264 if (ret != SQLITE_OK) {
2265 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2269 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
2270 if (ret != SQLITE_OK) {
2271 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2272 sqlite3_finalize(stmt);
2276 ret = sqlite3_step(stmt);
2277 if (ret != SQLITE_ROW) {
2278 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2279 sqlite3_reset(stmt);
2280 sqlite3_finalize(stmt);
2284 tmp = (char *)sqlite3_column_text(stmt, 0);
2285 if (tmp && strlen(tmp)) {
2286 group = strdup(tmp);
2288 ErrPrint("Heap: %s\n", strerror(errno));
2292 sqlite3_reset(stmt);
2293 sqlite3_finalize(stmt);
2299 EAPI char *livebox_service_pd_script_path(const char *pkgid)
2318 ret = sqlite3_prepare_v2(handle, "SELECT pkgmap.appid, provider.pd_src FROM provider, pkgmap WHERE provider.pkgid = ? AND pkgmap.pkgid = ?", -1, &stmt, NULL);
2319 if (ret != SQLITE_OK) {
2320 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2324 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
2325 if (ret != SQLITE_OK) {
2326 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2327 sqlite3_finalize(stmt);
2331 ret = sqlite3_bind_text(stmt, 2, pkgid, -1, SQLITE_TRANSIENT);
2332 if (ret != SQLITE_OK) {
2333 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2334 sqlite3_finalize(stmt);
2338 ret = sqlite3_step(stmt);
2339 if (ret != SQLITE_ROW) {
2340 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2341 sqlite3_reset(stmt);
2342 sqlite3_finalize(stmt);
2346 appid = (char *)sqlite3_column_text(stmt, 0);
2347 if (!appid || !strlen(appid)) {
2348 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2349 sqlite3_reset(stmt);
2350 sqlite3_finalize(stmt);
2354 pd_src = (char *)sqlite3_column_text(stmt, 1);
2355 if (!pd_src || !strlen(pd_src)) {
2356 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2357 sqlite3_reset(stmt);
2358 sqlite3_finalize(stmt);
2362 path = strdup(pd_src);
2364 ErrPrint("Heap: %s\n", strerror(errno));
2365 sqlite3_reset(stmt);
2366 sqlite3_finalize(stmt);
2370 DbgPrint("PD Src: %s\n", path);
2371 sqlite3_reset(stmt);
2372 sqlite3_finalize(stmt);
2378 EAPI char *livebox_service_pd_script_group(const char *pkgid)
2396 ret = sqlite3_prepare_v2(handle, "SELECT pd_group FROM provider WHERE pkgid = ?", -1, &stmt, NULL);
2397 if (ret != SQLITE_OK) {
2398 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2402 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
2403 if (ret != SQLITE_OK) {
2404 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2405 sqlite3_finalize(stmt);
2409 ret = sqlite3_step(stmt);
2410 if (ret != SQLITE_ROW) {
2411 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2412 sqlite3_reset(stmt);
2413 sqlite3_finalize(stmt);
2417 tmp = (char *)sqlite3_column_text(stmt, 0);
2418 if (tmp && strlen(tmp)) {
2419 group = strdup(tmp);
2421 ErrPrint("Heap: %s\n", strerror(errno));
2424 sqlite3_reset(stmt);
2425 sqlite3_finalize(stmt);
2431 EAPI int livebox_service_enumerate_cluster_list(int (*cb)(const char *cluster, void *data), void *data)
2435 const char *cluster;
2440 return LB_STATUS_ERROR_INVALID;
2445 return LB_STATUS_ERROR_IO;
2449 ret = sqlite3_prepare_v2(handle, "SELECT DISTINCT cluster FROM groupinfo", -1, &stmt, NULL);
2450 if (ret != SQLITE_OK) {
2451 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2452 cnt = LB_STATUS_ERROR_IO;
2456 while (sqlite3_step(stmt) == SQLITE_ROW) {
2457 cluster = (const char *)sqlite3_column_text(stmt, 0);
2458 if (!cluster || !strlen(cluster)) {
2462 if (cb(cluster, data) < 0) {
2469 sqlite3_reset(stmt);
2470 sqlite3_finalize(stmt);
2476 EAPI int livebox_service_enumerate_category_list(const char *cluster, int (*cb)(const char *cluster, const char *category, void *data), void *data)
2480 const char *category;
2484 if (!cluster || !cb) {
2485 return LB_STATUS_ERROR_INVALID;
2490 return LB_STATUS_ERROR_IO;
2493 ret = sqlite3_prepare_v2(handle, "SELECT DISTINCT category FROM groupinfo WHERE cluster = ?", -1, &stmt, NULL);
2494 if (ret != SQLITE_OK) {
2495 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2496 cnt = LB_STATUS_ERROR_IO;
2501 while (sqlite3_step(stmt) == SQLITE_ROW) {
2502 category = (const char *)sqlite3_column_text(stmt, 0);
2503 if (!category || !strlen(category)) {
2507 if (cb(cluster, category, data) < 0) {
2514 sqlite3_reset(stmt);
2515 sqlite3_finalize(stmt);
2521 EAPI int livebox_service_init(void)
2523 if (s_info.handle) {
2524 DbgPrint("Already initialized\n");
2525 s_info.init_count++;
2529 s_info.handle = open_db();
2530 if (s_info.handle) {
2531 s_info.init_count++;
2535 return LB_STATUS_ERROR_IO;
2538 EAPI int livebox_service_fini(void)
2540 if (!s_info.handle || s_info.init_count <= 0) {
2541 ErrPrint("Service is not initialized\n");
2542 return LB_STATUS_ERROR_IO;
2545 s_info.init_count--;
2546 if (s_info.init_count > 0) {
2547 DbgPrint("Init count %d\n", s_info.init_count);
2551 db_util_close(s_info.handle);
2552 s_info.handle = NULL;
2556 EAPI int livebox_service_get_size(int type, int *width, int *height)
2569 return convert_size_from_type(type, width, height);
2572 EAPI int livebox_service_size_type(int width, int height)
2576 if (update_resolution() < 0) {
2577 ErrPrint("Failed to update the size list\n");
2580 for (idx = 0; idx < NR_OF_SIZE_LIST; idx++) {
2581 if (SIZE_LIST[idx].w == width && SIZE_LIST[idx].h == height) {
2588 return LB_SIZE_TYPE_1x1;
2590 return LB_SIZE_TYPE_2x1;
2592 return LB_SIZE_TYPE_2x2;
2594 return LB_SIZE_TYPE_4x1;
2596 return LB_SIZE_TYPE_4x2;
2598 return LB_SIZE_TYPE_4x3;
2600 return LB_SIZE_TYPE_4x4;
2602 return LB_SIZE_TYPE_4x5;
2604 return LB_SIZE_TYPE_4x6;
2606 return LB_SIZE_TYPE_EASY_1x1;
2608 return LB_SIZE_TYPE_EASY_3x1;
2610 return LB_SIZE_TYPE_EASY_3x3;
2612 return LB_SIZE_TYPE_0x0;
2617 return LB_SIZE_TYPE_UNKNOWN;