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>
27 #include <com-core_packet.h>
31 #include <package-manager.h>
32 #include <pkgmgr-info.h>
34 #include <vconf-keys.h>
36 #include <unicode/uloc.h>
37 #include <tzplatform_config.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
48 #define SERVICE_SOCKET tzplatform_mkpath(TZ_USER_SHARE,"live_magazine/.service.socket")
50 static struct supported_size_list SIZE_LIST[NR_OF_SIZE_LIST] = {
51 { 175, 175 }, /*!< 1x1 */
52 { 354, 175 }, /*!< 2x1 */
53 { 354, 354 }, /*!< 2x2 */
54 { 712, 175 }, /*!< 4x1 */
55 { 712, 354 }, /*!< 4x2 */
56 { 712, 533 }, /*!< 4x3 */
57 { 712, 712 }, /*!< 4x4 */
58 { 712, 891 }, /*!< 4x5 */
59 { 712, 1070 }, /*!< 4x6 */
60 { 224, 215 }, /*!< 21x21 */
61 { 680, 215 }, /*!< 23x21 */
62 { 680, 653 }, /*!< 23x23 */
63 { 720, 1280 }, /*!< 0x0 */
66 struct pkglist_handle {
68 PKGLIST_TYPE_LB_LIST = 0x00beef00,
69 PKGLIST_TYPE_UNKNOWN = 0x00dead00
75 static struct service_info s_info = {
77 .conf_file = RESOLUTION_FILE,
91 static sqlite3 *open_db(void)
98 ret = db_util_open_with_options(tzplatform_mkpath(TZ_SYS_DB,".livebox.db"), &handle, SQLITE_OPEN_READONLY, NULL);
99 if (ret != SQLITE_OK) {
100 ErrPrint("Failed to open a DB\n");
104 handle = s_info.handle;
110 static inline __attribute__((always_inline)) void close_db(sqlite3 *handle)
112 if (!s_info.handle) {
113 db_util_close(handle);
117 static int convert_size_from_type(enum livebox_size_type type, int *width, int *height)
122 case LB_SIZE_TYPE_1x1: /*!< 175x175 */
125 case LB_SIZE_TYPE_2x1: /*!< 354x175 */
128 case LB_SIZE_TYPE_2x2: /*!< 354x354 */
131 case LB_SIZE_TYPE_4x1: /*!< 712x175 */
134 case LB_SIZE_TYPE_4x2: /*!< 712x354 */
137 case LB_SIZE_TYPE_4x3: /*!< 712x533 */
140 case LB_SIZE_TYPE_4x4: /*!< 712x712 */
143 case LB_SIZE_TYPE_4x5: /*!< 712x891 */
146 case LB_SIZE_TYPE_4x6: /*!< 712x1070 */
149 case LB_SIZE_TYPE_EASY_1x1: /*< 224x215 */
152 case LB_SIZE_TYPE_EASY_3x1: /*!< 680x215 */
155 case LB_SIZE_TYPE_EASY_3x3: /*!< 680x653 */
158 case LB_SIZE_TYPE_0x0: /*!< 720x1280 */
162 return LB_STATUS_ERROR_INVALID;
165 if (util_update_resolution(&s_info, SIZE_LIST) < 0) {
166 ErrPrint("Failed to update resolution\n");
169 *width = SIZE_LIST[idx].w;
170 *height = SIZE_LIST[idx].h;
171 return LB_STATUS_SUCCESS;
174 EAPI int livebox_service_change_period(const char *pkgname, const char *id, double period)
176 struct packet *packet;
177 struct packet *result;
181 if (!pkgname || !id || period < 0.0f) {
182 ErrPrint("Invalid argument\n");
183 return LB_STATUS_ERROR_INVALID;
186 uri = util_id_to_uri(id);
188 return LB_STATUS_ERROR_MEMORY;
191 packet = packet_create("service_change_period", "ssd", pkgname, uri, period);
194 ErrPrint("Failed to create a packet for period changing\n");
195 return LB_STATUS_ERROR_FAULT;
198 result = com_core_packet_oneshot_send(SERVICE_SOCKET, packet, DEFAULT_TIMEOUT);
199 packet_unref(packet);
202 if (packet_get(result, "i", &ret) != 1) {
203 ErrPrint("Failed to parse a result packet\n");
204 ret = LB_STATUS_ERROR_INVALID;
206 packet_unref(result);
208 ErrPrint("Failed to get result packet\n");
209 ret = LB_STATUS_ERROR_FAULT;
215 EAPI int livebox_service_trigger_update_with_content(const char *pkgname, const char *id, const char *cluster, const char *category, const char *content, int force)
217 struct packet *packet;
218 struct packet *result;
223 ErrPrint("Invalid argument\n");
224 return LB_STATUS_ERROR_INVALID;
227 if (!force && access("/tmp/.live.paused", R_OK) == 0) {
228 DbgPrint("Provider is paused\n");
229 return LB_STATUS_ERROR_CANCEL;
233 uri = util_id_to_uri(id);
235 return LB_STATUS_ERROR_MEMORY;
242 cluster = "user,created";
246 category = "default";
249 packet = packet_create("service_update", "sssssi", pkgname, uri, cluster, category, content, force);
252 * "free" function accepts NULL
256 ErrPrint("Failed to create a packet for service_update\n");
257 return LB_STATUS_ERROR_FAULT;
260 result = com_core_packet_oneshot_send(SERVICE_SOCKET, packet, DEFAULT_TIMEOUT);
261 packet_unref(packet);
264 if (packet_get(result, "i", &ret) != 1) {
265 ErrPrint("Failed to parse a result packet\n");
266 ret = LB_STATUS_ERROR_INVALID;
269 packet_unref(result);
271 ErrPrint("Failed to get result packet\n");
272 ret = LB_STATUS_ERROR_FAULT;
278 EAPI int livebox_service_trigger_update(const char *pkgname, const char *id, const char *cluster, const char *category, int force)
280 return livebox_service_trigger_update_with_content(pkgname, id, cluster, category, NULL, force);
284 * pkgid == Package Id (not the livebox id)
286 EAPI struct pkglist_handle *livebox_service_pkglist_create(const char *pkgid, struct pkglist_handle *handle)
291 if (handle->type != PKGLIST_TYPE_LB_LIST) {
292 ErrPrint("Invalid handle\n");
297 ErrPrint("pkgid should be NULL\n");
301 sqlite3_reset(handle->stmt);
305 handle = calloc(1, sizeof(*handle));
307 ErrPrint("Heap: %s\n", strerror(errno));
311 handle->type = PKGLIST_TYPE_LB_LIST;
313 handle->handle = open_db();
314 if (!handle->handle) {
320 ret = sqlite3_prepare_v2(handle->handle, "SELECT appid, pkgid, prime FROM pkgmap", -1, &handle->stmt, NULL);
321 if (ret != SQLITE_OK) {
322 ErrPrint("Error: %s\n", sqlite3_errmsg(handle->handle));
323 close_db(handle->handle);
328 ret = sqlite3_prepare_v2(handle->handle, "SELECT appid, pkgid, prime FROM pkgmap WHERE appid = ?", -1, &handle->stmt, NULL);
329 if (ret != SQLITE_OK) {
330 ErrPrint("Error: %s\n", sqlite3_errmsg(handle->handle));
331 close_db(handle->handle);
336 ret = sqlite3_bind_text(handle->stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
337 if (ret != SQLITE_OK) {
338 ErrPrint("Error: %s\n", sqlite3_errmsg(handle->handle));
339 sqlite3_finalize(handle->stmt);
340 close_db(handle->handle);
349 EAPI int livebox_service_get_pkglist_item(struct pkglist_handle *handle, char **appid, char **pkgname, int *is_prime)
353 char *_pkgname = NULL;
355 if (!handle || handle->type != PKGLIST_TYPE_LB_LIST) {
356 return LB_STATUS_ERROR_INVALID;
359 if (sqlite3_step(handle->stmt) != SQLITE_ROW) {
360 return LB_STATUS_ERROR_NOT_EXIST;
364 tmp = (const char *)sqlite3_column_text(handle->stmt, 0);
365 if (tmp && strlen(tmp)) {
366 _appid = strdup(tmp);
368 ErrPrint("Heap: %s\n", strerror(errno));
369 return LB_STATUS_ERROR_MEMORY;
375 tmp = (const char *)sqlite3_column_text(handle->stmt, 1);
376 if (tmp && strlen(tmp)) {
377 _pkgname = strdup(tmp);
379 ErrPrint("Heap: %s\n", strerror(errno));
381 return LB_STATUS_ERROR_MEMORY;
387 *is_prime = sqlite3_column_int(handle->stmt, 2);
398 return LB_STATUS_SUCCESS;
401 EAPI int livebox_service_pkglist_destroy(struct pkglist_handle *handle)
403 if (!handle || handle->type != PKGLIST_TYPE_LB_LIST) {
404 return LB_STATUS_ERROR_INVALID;
407 handle->type = PKGLIST_TYPE_UNKNOWN;
408 sqlite3_reset(handle->stmt);
409 sqlite3_finalize(handle->stmt);
410 close_db(handle->handle);
412 return LB_STATUS_SUCCESS;
415 EAPI int livebox_service_get_pkglist(int (*cb)(const char *appid, const char *pkgname, int is_prime, void *data), void *data)
425 return LB_STATUS_ERROR_INVALID;
430 return LB_STATUS_ERROR_IO;
433 ret = sqlite3_prepare_v2(handle, "SELECT appid, pkgid, prime FROM pkgmap", -1, &stmt, NULL);
434 if (ret != SQLITE_OK) {
435 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
436 ret = LB_STATUS_ERROR_IO;
441 while (sqlite3_step(stmt) == SQLITE_ROW) {
442 appid = (char *)sqlite3_column_text(stmt, 0);
443 if (!appid || !strlen(appid)) {
444 ErrPrint("APPID is not valid\n");
448 pkgid = (char *)sqlite3_column_text(stmt, 1);
449 if (!pkgid || !strlen(pkgid)) {
450 ErrPrint("pkgid is not valid\n");
454 is_prime = sqlite3_column_int(stmt, 2);
458 if (cb(appid, pkgid, is_prime, data) < 0) {
459 DbgPrint("Callback stopped package crawling\n");
465 sqlite3_finalize(stmt);
472 EAPI int livebox_service_get_pkglist_by_pkgid(const char *pkgid, int (*cb)(const char *lbid, int is_prime, void *data), void *data)
481 return LB_STATUS_ERROR_INVALID;
486 return LB_STATUS_ERROR_IO;
489 ret = sqlite3_prepare_v2(handle, "SELECT pkgid, prime FROM pkgmap WHERE appid = ?", -1, &stmt, NULL);
490 if (ret != SQLITE_OK) {
491 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
492 ret = LB_STATUS_ERROR_IO;
496 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
497 if (ret != SQLITE_OK) {
498 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
500 sqlite3_finalize(stmt);
501 ret = LB_STATUS_ERROR_IO;
506 while (sqlite3_step(stmt) == SQLITE_ROW) {
507 lbid = (const char *)sqlite3_column_text(stmt, 0);
508 if (!lbid || !strlen(lbid)) {
509 ErrPrint("LBID is not valid\n");
513 is_prime = sqlite3_column_int(stmt, 1);
517 if (cb(lbid, is_prime, data) < 0) {
518 DbgPrint("Callback stopped package crawling\n");
524 sqlite3_finalize(stmt);
531 EAPI int livebox_service_get_pkglist_by_category(const char *category, int (*cb)(const char *lbid, void *data), void *data)
538 if (!cb || !category) {
539 return LB_STATUS_ERROR_INVALID;
544 return LB_STATUS_ERROR_IO;
547 ret = sqlite3_prepare_v2(handle, "SELECT pkgid FROM pkgmap WHERE category = ?", -1, &stmt, NULL);
548 if (ret != SQLITE_OK) {
549 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
550 ret = LB_STATUS_ERROR_IO;
554 ret = sqlite3_bind_text(stmt, 1, category, -1, SQLITE_TRANSIENT);
555 if (ret != SQLITE_OK) {
556 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
558 sqlite3_finalize(stmt);
559 ret = LB_STATUS_ERROR_IO;
564 while (sqlite3_step(stmt) == SQLITE_ROW) {
565 lbid = (const char *)sqlite3_column_text(stmt, 0);
566 if (!lbid || !strlen(lbid)) {
567 ErrPrint("LBID is not valid\n");
573 if (cb(lbid, data) < 0) {
574 DbgPrint("Callback stopped package crawling\n");
580 sqlite3_finalize(stmt);
587 struct pkgmgr_cbdata {
589 void (*cb)(const char *lbid, const char *appid, void *data);
593 static int pkgmgr_cb(const pkgmgrinfo_appinfo_h handle, void *user_data)
595 struct pkgmgr_cbdata *cbdata = (struct pkgmgr_cbdata *)user_data;
599 ret = pkgmgrinfo_appinfo_get_appid(handle, &appid);
601 ErrPrint("Unable to get appid\n");
603 cbdata->cb(cbdata->lbid, appid, cbdata->cbdata);
609 static inline char *pkgmgr_get_mainapp(const char *pkgid)
611 pkgmgrinfo_pkginfo_h handle;
614 if (pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle) != PMINFO_R_OK) {
615 ErrPrint("Unable to get mainapp: %s\n", pkgid);
619 if (pkgmgrinfo_pkginfo_get_mainappid(handle, &ret) == PMINFO_R_OK) {
622 ErrPrint("Failed to get mainappid\n");
623 ret = NULL; /* I cannot believe the pkgmgrinfo_pkginfo_get_mainappid. it maybe able to touch my "ret" even though it fails */
627 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
631 static inline int pkgmgr_get_applist(const char *pkgid, const char *lbid, void (*cb)(const char *lbid, const char *appid, void *data), void *data)
633 struct pkgmgr_cbdata cbdata;
634 pkgmgrinfo_pkginfo_h handle;
637 ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle);
639 ErrPrint("Unable to get pkginfo: %s\n", pkgid);
645 cbdata.cbdata = data;
647 ret = pkgmgrinfo_appinfo_get_list(handle, PM_UI_APP, pkgmgr_cb, &cbdata);
649 ErrPrint("Failed to get applist\n");
652 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
656 EAPI int livebox_service_get_applist(const char *lbid, void (*cb)(const char *lbid, const char *appid, void *data), void *data)
665 return LB_STATUS_ERROR_INVALID;
670 return LB_STATUS_ERROR_IO;
673 ret = sqlite3_prepare_v2(handle, "SELECT appid FROM pkgmap WHERE (pkgid = ?) or (appid = ?)", -1, &stmt, NULL);
674 if (ret != SQLITE_OK) {
675 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
676 ret = LB_STATUS_ERROR_IO;
680 ret = sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT);
681 if (ret != SQLITE_OK) {
682 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
683 ret = LB_STATUS_ERROR_IO;
687 ret = sqlite3_bind_text(stmt, 2, lbid, -1, SQLITE_TRANSIENT);
688 if (ret != SQLITE_OK) {
689 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
690 ret = LB_STATUS_ERROR_IO;
694 if (sqlite3_step(stmt) != SQLITE_ROW) {
695 ret = LB_STATUS_ERROR_INVALID;
697 sqlite3_finalize(stmt);
701 tmp = (const char *)sqlite3_column_text(stmt, 0);
702 if (!tmp || !strlen(tmp)) {
703 ErrPrint("Invalid package name (%s)\n", lbid);
704 ret = LB_STATUS_ERROR_INVALID;
706 sqlite3_finalize(stmt);
712 ErrPrint("Error: %s\n", strerror(errno));
713 ret = LB_STATUS_ERROR_MEMORY;
715 sqlite3_finalize(stmt);
720 sqlite3_finalize(stmt);
722 ret = pkgmgr_get_applist(pkgid, lbid, cb, data);
726 case PMINFO_R_EINVAL:
727 ret = LB_STATUS_ERROR_INVALID;
730 ret = LB_STATUS_SUCCESS;
734 ret = LB_STATUS_ERROR_FAULT;
743 EAPI char *livebox_service_mainappid(const char *lbid)
760 if (sqlite3_prepare_v2(handle, "SELECT appid, uiapp FROM pkgmap WHERE (pkgid = ?) or (appid = ? and prime = 1)", -1, &stmt, NULL) != SQLITE_OK) {
761 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
765 if (sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT) != SQLITE_OK) {
766 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
770 if (sqlite3_bind_text(stmt, 2, lbid, -1, SQLITE_TRANSIENT) != SQLITE_OK) {
771 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
775 if (sqlite3_step(stmt) != SQLITE_ROW) {
777 sqlite3_finalize(stmt);
781 tmp = (const char *)sqlite3_column_text(stmt, 0);
782 if (!tmp || !strlen(tmp)) {
783 ErrPrint("Invalid package name (%s)\n", lbid);
785 sqlite3_finalize(stmt);
789 pkgid = (const char *)sqlite3_column_text(stmt, 1);
790 if (!pkgid || !strlen(pkgid)) {
792 * This record has no uiapp.
793 * Try to find the main ui-app id.
795 ret = pkgmgr_get_mainapp(tmp);
799 ErrPrint("Error: %s\n", strerror(errno));
804 sqlite3_finalize(stmt);
811 EAPI int livebox_service_get_supported_size_types(const char *pkgid, int *cnt, int *types)
818 if (!types || !cnt || !pkgid) {
819 return LB_STATUS_ERROR_INVALID;
824 return LB_STATUS_ERROR_IO;
827 ret = sqlite3_prepare_v2(handle, "SELECT size_type FROM box_size WHERE pkgid = ? ORDER BY size_type ASC", -1, &stmt, NULL);
828 if (ret != SQLITE_OK) {
829 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
830 ret = LB_STATUS_ERROR_IO;
834 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
835 if (ret != SQLITE_OK) {
836 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
838 sqlite3_finalize(stmt);
839 ret = LB_STATUS_ERROR_IO;
843 if (*cnt > NR_OF_SIZE_LIST) {
844 *cnt = NR_OF_SIZE_LIST;
848 while (sqlite3_step(stmt) == SQLITE_ROW && ret < *cnt) {
849 size = sqlite3_column_int(stmt, 0);
856 sqlite3_finalize(stmt);
857 ret = LB_STATUS_SUCCESS;
863 static char *cur_locale(void)
866 language = vconf_get_str(VCONFKEY_LANGSET);
884 language = strdup("en-us");
886 ErrPrint("Heap: %s\n", strerror(errno));
893 static char *get_default_name(const char *pkgid)
905 ret = sqlite3_prepare_v2(handle, "SELECT name FROM client WHERE pkgid = ?", -1, &stmt, NULL);
906 if (ret != SQLITE_OK) {
907 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
912 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
913 if (ret != SQLITE_OK) {
914 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
918 ret = sqlite3_step(stmt);
919 if (ret == SQLITE_ROW) {
922 tmp = (const char *)sqlite3_column_text(stmt, 0);
923 if (tmp && strlen(tmp)) {
926 ErrPrint("Heap: %s\n", strerror(errno));
933 sqlite3_finalize(stmt);
938 static char *get_default_icon(const char *pkgid)
950 ret = sqlite3_prepare_v2(handle, "SELECT icon FROM client WHERE pkgid = ?", -1, &stmt, NULL);
951 if (ret != SQLITE_OK) {
952 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
957 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
958 if (ret != SQLITE_OK) {
959 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
963 ret = sqlite3_step(stmt);
964 if (ret == SQLITE_ROW) {
967 tmp = (const char *)sqlite3_column_text(stmt, 0);
968 if (tmp && strlen(tmp)) {
971 ErrPrint("Heap: %s\n", strerror(errno));
978 sqlite3_finalize(stmt);
983 EAPI char *livebox_service_content(const char *pkgid)
987 char *content = NULL;
995 ret = sqlite3_prepare_v2(handle, "SELECT content FROM client WHERE pkgid = ?", -1, &stmt, NULL);
996 if (ret != SQLITE_OK) {
997 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1002 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1003 if (ret != SQLITE_OK) {
1004 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1008 ret = sqlite3_step(stmt);
1009 if (ret == SQLITE_ROW) {
1012 tmp = (const char *)sqlite3_column_text(stmt, 0);
1013 if (tmp && strlen(tmp)) {
1014 content = strdup(tmp);
1016 ErrPrint("Heap: %s\n", strerror(errno));
1022 sqlite3_reset(stmt);
1023 sqlite3_finalize(stmt);
1028 EAPI char *livebox_service_setup_appid(const char *lbid)
1044 ret = sqlite3_prepare_v2(handle, "SELECT setup FROM client WHERE pkgid = ?", -1, &stmt, NULL);
1045 if (ret != SQLITE_OK) {
1046 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1052 ret = sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT);
1053 if (ret != SQLITE_OK) {
1054 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1058 ret = sqlite3_step(stmt);
1059 if (ret == SQLITE_ROW) {
1062 tmp = (const char *)sqlite3_column_text(stmt, 0);
1063 if (!tmp || !strlen(tmp)) {
1067 appid = strdup(tmp);
1069 ErrPrint("Error: %s\n", strerror(errno));
1074 sqlite3_reset(stmt);
1075 sqlite3_finalize(stmt);
1080 EAPI int livebox_service_nodisplay(const char *pkgid)
1095 ret = sqlite3_prepare_v2(handle, "SELECT nodisplay FROM client WHERE pkgid = ?", -1, &stmt, NULL);
1096 if (ret != SQLITE_OK) {
1097 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1102 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1103 if (ret != SQLITE_OK) {
1104 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1109 ret = sqlite3_step(stmt);
1110 if (ret == SQLITE_ROW) {
1111 ret = !!sqlite3_column_int(stmt, 0);
1117 sqlite3_reset(stmt);
1118 sqlite3_finalize(stmt);
1123 static char *get_lb_pkgname_by_appid(const char *appid)
1141 ret = sqlite3_prepare_v2(handle, "SELECT pkgid FROM pkgmap WHERE (appid = ? AND prime = 1) OR (uiapp = ? AND prime = 1) OR pkgid = ?", -1, &stmt, NULL);
1142 if (ret != SQLITE_OK) {
1143 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1148 ret = sqlite3_bind_text(stmt, 1, appid, -1, SQLITE_TRANSIENT);
1149 if (ret != SQLITE_OK) {
1150 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1154 ret = sqlite3_bind_text(stmt, 2, appid, -1, SQLITE_TRANSIENT);
1155 if (ret != SQLITE_OK) {
1156 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1160 ret = sqlite3_bind_text(stmt, 3, appid, -1, SQLITE_TRANSIENT);
1161 if (ret != SQLITE_OK) {
1162 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1166 if (sqlite3_step(stmt) != SQLITE_ROW) {
1167 ErrPrint("Error: %s (has no record? - %s)\n", sqlite3_errmsg(handle), appid);
1171 tmp = (char *)sqlite3_column_text(stmt, 0);
1172 if (tmp && strlen(tmp)) {
1173 pkgid = strdup(tmp);
1175 ErrPrint("Heap: %s\n", strerror(errno));
1180 sqlite3_reset(stmt);
1181 sqlite3_finalize(stmt);
1186 EAPI int livebox_service_need_frame(const char *pkgid, int size_type)
1195 ErrPrint("Unable to open a DB\n");
1199 ret = sqlite3_prepare_v2(handle, "SELECT need_frame FROM box_size WHERE pkgid = ? AND size_type = ?", -1, &stmt, NULL);
1200 if (ret != SQLITE_OK) {
1201 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1208 lbid = livebox_service_pkgname(pkgid);
1210 ErrPrint("Invalid appid (%s)\n", pkgid);
1215 ret = sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT);
1217 if (ret != SQLITE_OK) {
1218 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1223 ret = sqlite3_bind_int(stmt, 2, size_type);
1224 if (ret != SQLITE_OK) {
1225 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1230 ret = sqlite3_step(stmt);
1231 if (ret == SQLITE_ROW) {
1232 ret = !!sqlite3_column_int(stmt, 0);
1235 ErrPrint("There is no such result\n");
1238 sqlite3_reset(stmt);
1239 sqlite3_finalize(stmt);
1244 EAPI int livebox_service_touch_effect(const char *pkgid, int size_type)
1253 ErrPrint("Unable to open a DB\n");
1257 ret = sqlite3_prepare_v2(handle, "SELECT touch_effect FROM box_size WHERE pkgid = ? AND size_type = ?", -1, &stmt, NULL);
1258 if (ret != SQLITE_OK) {
1259 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1266 * This function will validate the "pkgid"
1267 * call the exported API in the exported API is not recomended
1270 lbid = livebox_service_pkgname(pkgid);
1272 ErrPrint("Invalid appid (%s)\n", pkgid);
1277 ret = sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT);
1279 if (ret != SQLITE_OK) {
1280 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1285 ret = sqlite3_bind_int(stmt, 2, size_type);
1286 if (ret != SQLITE_OK) {
1287 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1292 ret = sqlite3_step(stmt);
1293 if (ret == SQLITE_ROW) {
1294 ret = !!sqlite3_column_int(stmt, 0);
1296 ret = 1; /*!< Default true: In this case the DB is corrupted. */
1297 ErrPrint("There is no result\n");
1301 sqlite3_reset(stmt);
1302 sqlite3_finalize(stmt);
1307 EAPI int livebox_service_mouse_event(const char *pkgid, int size_type)
1319 ret = sqlite3_prepare_v2(handle, "SELECT mouse_event FROM box_size WHERE pkgid = ? AND size_type = ?", -1, &stmt, NULL);
1320 if (ret != SQLITE_OK) {
1321 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1326 lbid = livebox_service_pkgname(pkgid);
1328 ErrPrint("Failed to get lbid: %s\n", pkgid);
1333 ret = sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT);
1335 if (ret != SQLITE_OK) {
1336 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1341 ret = sqlite3_bind_int(stmt, 2, size_type);
1342 if (ret != SQLITE_OK) {
1343 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1348 ret = sqlite3_step(stmt);
1349 if (ret == SQLITE_ROW) {
1350 ret = !!sqlite3_column_int(stmt, 0);
1352 ret = 0; /*!< Default is false, In this case the DB is corrupted */
1353 ErrPrint("There is no result.\n");
1357 sqlite3_reset(stmt);
1358 sqlite3_finalize(stmt);
1363 static inline int update_lang_info(void)
1368 syslang = vconf_get_str(VCONFKEY_LANGSET);
1370 ErrPrint("Failed to get vconf-lang\n");
1374 if (s_info.syslang && !strcmp(s_info.syslang, syslang)) {
1375 DbgPrint("Syslang is not changed: %s\n", syslang);
1380 free(s_info.syslang);
1381 s_info.syslang = syslang;
1384 uloc_setDefault((const char *)s_info.syslang, &err);
1385 if (!U_SUCCESS(err)) {
1386 ErrPrint("Failed to set default lang: %s\n", u_errorName(err));
1387 free(s_info.syslang);
1388 s_info.syslang = NULL;
1392 s_info.iso3lang = uloc_getISO3Language(uloc_getDefault());
1393 if (!s_info.iso3lang || !strlen(s_info.iso3lang)) {
1394 ErrPrint("Failed to get iso3lang\n");
1395 free(s_info.syslang);
1396 s_info.syslang = NULL;
1401 s_info.country_len = uloc_getCountry(uloc_getDefault(), s_info.country, ULOC_COUNTRY_CAPACITY, &err);
1402 if (!U_SUCCESS(err) || s_info.country_len <= 0) {
1403 ErrPrint("Failed to get locale: %s, %s, %d (%s)\n", u_errorName(err), s_info.iso3lang, s_info.country_len, s_info.country);
1404 free(s_info.syslang);
1405 s_info.syslang = NULL;
1412 EAPI char *livebox_service_preview(const char *pkgid, int size_type)
1417 char *preview = NULL;
1429 ret = sqlite3_prepare_v2(handle, "SELECT preview FROM box_size WHERE pkgid = ? AND size_type = ?", -1, &stmt, NULL);
1430 if (ret != SQLITE_OK) {
1431 ErrPrint("Error: %s, %s\n", sqlite3_errmsg(handle), pkgid);
1436 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1437 if (ret != SQLITE_OK) {
1438 ErrPrint("Error: %s, %s\n", sqlite3_errmsg(handle), pkgid);
1442 ret = sqlite3_bind_int(stmt, 2, size_type);
1443 if (ret != SQLITE_OK) {
1444 ErrPrint("Error: %s, %s\n", sqlite3_errmsg(handle), pkgid);
1448 ret = sqlite3_step(stmt);
1449 if (ret != SQLITE_ROW) {
1450 ErrPrint("Error: %s, %s\n", sqlite3_errmsg(handle), pkgid);
1454 tmp = (const char *)sqlite3_column_text(stmt, 0);
1455 if (!tmp || !(tmp_len = strlen(tmp))) {
1456 ErrPrint("Failed to get data (%s)\n", pkgid);
1460 if (update_lang_info() != 0) {
1461 preview = strdup(tmp);
1463 ErrPrint("Heap: %s\n", strerror(errno));
1468 buf_len = tmp_len + strlen(s_info.iso3lang) + s_info.country_len + 3; /* '/' '-' '/' */
1469 preview = malloc(buf_len + 1);
1471 ErrPrint("Heap: %s\n", strerror(errno));
1475 for (i = tmp_len; i >= 0 && tmp[i] != '/'; i--);
1478 strncpy(preview, tmp, i);
1479 printed = snprintf(preview + i, buf_len - i, "%s-%s/%s", s_info.iso3lang, s_info.country, tmp + i);
1480 if (preview[i + printed] != '\0') {
1481 ErrPrint("Path is truncated\n");
1482 preview[i + printed] = '\0';
1485 if (access(preview, R_OK) != 0) {
1486 DbgPrint("Access failed: %s, %s\n", preview, strerror(errno));
1489 preview = strdup(tmp);
1491 ErrPrint("Heap: %s\n", strerror(errno));
1496 sqlite3_reset(stmt);
1497 sqlite3_finalize(stmt);
1502 EAPI char *livebox_service_i18n_icon(const char *pkgid, const char *lang)
1515 language = strdup(lang);
1517 ErrPrint("Heap: %s\n", strerror(errno));
1521 language = cur_locale();
1533 ret = sqlite3_prepare_v2(handle, "SELECT icon FROM i18n WHERE pkgid = ? AND lang = ?", -1, &stmt, NULL);
1534 if (ret != SQLITE_OK) {
1535 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1541 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1542 if (ret != SQLITE_OK) {
1543 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1547 ret = sqlite3_bind_text(stmt, 2, language, -1, SQLITE_TRANSIENT);
1548 if (ret != SQLITE_OK) {
1549 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1553 ret = sqlite3_step(stmt);
1554 if (ret == SQLITE_ROW) {
1556 tmp = (const char *)sqlite3_column_text(stmt, 0);
1557 if (!tmp || !strlen(tmp)) {
1558 icon = get_default_icon(pkgid);
1562 ErrPrint("Heap: %s\n", strerror(errno));
1566 icon = get_default_icon(pkgid);
1570 sqlite3_reset(stmt);
1571 sqlite3_finalize(stmt);
1577 EAPI char *livebox_service_i18n_name(const char *pkgid, const char *lang)
1590 language = strdup(lang);
1592 ErrPrint("Error: %s\n", strerror(errno));
1596 language = cur_locale();
1608 ret = sqlite3_prepare_v2(handle, "SELECT name FROM i18n WHERE pkgid = ? AND lang = ?", -1, &stmt, NULL);
1609 if (ret != SQLITE_OK) {
1610 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1616 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1617 if (ret != SQLITE_OK) {
1618 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1622 ret = sqlite3_bind_text(stmt, 2, language, -1, SQLITE_TRANSIENT);
1623 if (ret != SQLITE_OK) {
1624 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1628 ret = sqlite3_step(stmt);
1629 if (ret == SQLITE_ROW) {
1631 tmp = (const char *)sqlite3_column_text(stmt, 0);
1632 if (!tmp || !strlen(tmp)) {
1633 name = get_default_name(pkgid);
1637 ErrPrint("Heap: %s\n", strerror(errno));
1641 name = get_default_name(pkgid);
1645 sqlite3_reset(stmt);
1646 sqlite3_finalize(stmt);
1652 EAPI int livebox_service_get_supported_sizes(const char *pkgid, int *cnt, int *w, int *h)
1659 if (!w || !h || !cnt || !pkgid) {
1660 return LB_STATUS_ERROR_INVALID;
1665 return LB_STATUS_ERROR_IO;
1668 ret = sqlite3_prepare_v2(handle, "SELECT size_type FROM box_size WHERE pkgid = ? ORDER BY size_type ASC", -1, &stmt, NULL);
1669 if (ret != SQLITE_OK) {
1670 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1671 ret = LB_STATUS_ERROR_IO;
1675 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1676 if (ret != SQLITE_OK) {
1677 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1678 sqlite3_reset(stmt);
1679 sqlite3_finalize(stmt);
1680 ret = LB_STATUS_ERROR_IO;
1684 if (*cnt > NR_OF_SIZE_LIST) {
1685 *cnt = NR_OF_SIZE_LIST;
1689 while (sqlite3_step(stmt) == SQLITE_ROW && ret < *cnt) {
1690 size = sqlite3_column_int(stmt, 0);
1691 ret += (convert_size_from_type(size, w + ret, h + ret) == 0);
1695 sqlite3_reset(stmt);
1696 sqlite3_finalize(stmt);
1703 EAPI char *livebox_service_abi(const char *lbid)
1712 ErrPrint("Invalid argument\n");
1722 ret = sqlite3_prepare_v2(handle, "SELECT abi FROM provider WHERE pkgid = ?", -1, &stmt, NULL);
1723 if (ret != SQLITE_OK) {
1724 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1728 ret = sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT);
1729 if (ret != SQLITE_OK) {
1730 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1731 sqlite3_finalize(stmt);
1735 ret = sqlite3_step(stmt);
1736 if (ret != SQLITE_ROW) {
1737 ErrPrint("Error: %s (%d)\n", sqlite3_errmsg(handle), ret);
1738 sqlite3_reset(stmt);
1739 sqlite3_finalize(stmt);
1743 tmp = (char *)sqlite3_column_text(stmt, 0);
1744 if (!tmp || !strlen(tmp)) {
1745 ErrPrint("Invalid abi: %s\n", sqlite3_errmsg(handle));
1746 sqlite3_reset(stmt);
1747 sqlite3_finalize(stmt);
1753 ErrPrint("strdup: %s\n", strerror(errno));
1754 sqlite3_reset(stmt);
1755 sqlite3_finalize(stmt);
1759 DbgPrint("abi: %s\n", abi);
1761 sqlite3_reset(stmt);
1762 sqlite3_finalize(stmt);
1768 EAPI char *livebox_service_pkgname_by_libexec(const char *libexec)
1779 ErrPrint("Invalid argument\n");
1789 len = strlen(libexec) + 3;
1791 _libexec = malloc(len);
1793 ErrPrint("Heap: %s\n", strerror(errno));
1798 snprintf(_libexec, len - 1, "%%%s", libexec);
1800 ret = sqlite3_prepare_v2(handle, "SELECT pkgid FROM provider WHERE libexec like ?", -1, &stmt, NULL);
1801 if (ret != SQLITE_OK) {
1802 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1806 ret = sqlite3_bind_text(stmt, 1, _libexec, -1, SQLITE_TRANSIENT);
1807 if (ret != SQLITE_OK) {
1808 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1809 sqlite3_finalize(stmt);
1813 if (sqlite3_step(stmt) != SQLITE_ROW) {
1814 ErrPrint("No records (%s) for (%s)\n", sqlite3_errmsg(handle), libexec);
1815 sqlite3_reset(stmt);
1816 sqlite3_finalize(stmt);
1820 tmp = (char *)sqlite3_column_text(stmt, 0);
1821 if (!tmp || !strlen(tmp)) {
1822 ErrPrint("Invalid pkgid: %s\n", sqlite3_errmsg(handle));
1823 sqlite3_reset(stmt);
1824 sqlite3_finalize(stmt);
1828 pkgid = strdup(tmp);
1830 ErrPrint("Heap: %s\n", strerror(errno));
1833 DbgPrint("pkgid: %s\n", pkgid);
1835 sqlite3_reset(stmt);
1836 sqlite3_finalize(stmt);
1843 EAPI char *livebox_service_libexec(const char *pkgid)
1853 ErrPrint("Invalid argument\n");
1863 ret = sqlite3_prepare_v2(handle, "SELECT pkgmap.appid, provider.libexec FROM pkgmap, provider WHERE pkgmap.pkgid = ? AND provider.pkgid = ?", -1, &stmt, NULL);
1864 if (ret != SQLITE_OK) {
1865 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1869 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
1870 if (ret != SQLITE_OK) {
1871 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1872 sqlite3_finalize(stmt);
1876 ret = sqlite3_bind_text(stmt, 2, pkgid, -1, SQLITE_TRANSIENT);
1877 if (ret != SQLITE_OK) {
1878 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1879 sqlite3_finalize(stmt);
1883 if (sqlite3_step(stmt) != SQLITE_ROW) {
1884 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
1885 sqlite3_reset(stmt);
1886 sqlite3_finalize(stmt);
1888 libexec = util_conf_get_libexec(pkgid);
1889 DbgPrint("Fallback to conf checker: %s\n", libexec);
1893 appid = (char *)sqlite3_column_text(stmt, 0);
1894 if (!appid || !strlen(appid)) {
1895 ErrPrint("Invalid appid: %s\n", sqlite3_errmsg(handle));
1896 sqlite3_reset(stmt);
1897 sqlite3_finalize(stmt);
1901 path = (char *)sqlite3_column_text(stmt, 1);
1902 if (!path || !strlen(path)) {
1903 ErrPrint("Invalid libexec: %s\n", sqlite3_errmsg(handle));
1904 sqlite3_reset(stmt);
1905 sqlite3_finalize(stmt);
1909 libexec = strdup(path);
1911 ErrPrint("Heap: %s\n", strerror(errno));
1912 sqlite3_reset(stmt);
1913 sqlite3_finalize(stmt);
1917 DbgPrint("libexec: %s\n", libexec);
1919 sqlite3_reset(stmt);
1920 sqlite3_finalize(stmt);
1926 EAPI char *livebox_service_pkgname(const char *appid)
1929 pkgmgr_appinfo_h handle;
1937 lb_pkgname = get_lb_pkgname_by_appid(appid);
1944 * Try to get the package id using given appid
1946 ret = pkgmgr_appinfo_get_appinfo(appid, &handle);
1947 if (ret != PKGMGR_R_OK) {
1948 ErrPrint("Failed to get appinfo\n");
1952 ret = pkgmgr_appinfo_get_pkgname(handle, &new_appid);
1953 if (ret != PKGMGR_R_OK) {
1954 pkgmgr_appinfo_destroy_appinfo(handle);
1955 ErrPrint("Failed to get pkgname for (%s)\n", appid);
1959 lb_pkgname = get_lb_pkgname_by_appid(new_appid);
1960 pkgmgr_appinfo_destroy_appinfo(handle);
1962 if (!lb_pkgname && util_validate_livebox_package(appid) == 0) {
1963 return strdup(appid);
1969 EAPI char *livebox_service_provider_name(const char *lbid)
1975 char *str = SAMSUNG_PREFIX;
1981 while (str[idx] && lbid[idx] && lbid[idx] == str[idx]) {
1983 if (seq < 2 && lbid[idx] == '.') {
1989 if (!str[idx] && lbid[idx]) {
1991 return strdup(lbid);
1992 } else if (seq < 2) {
1994 if (lbid[idx] == '.') {
1996 } else if (!lbid[idx]) {
1997 ErrPrint("Invalid lbid: %s\n", lbid);
2009 ret = strdup(lbid + stage);
2011 ErrPrint("Error: %s\n", strerror(errno));
2018 EAPI int livebox_service_is_enabled(const char *lbid)
2027 pkgname = livebox_service_appid(lbid);
2031 ret = ail_get_appinfo(pkgname, &ai);
2032 if (ret != AIL_ERROR_OK) {
2037 if (ail_appinfo_get_bool(ai, AIL_PROP_X_SLP_ENABLED_BOOL, &enabled) != AIL_ERROR_OK)
2040 ail_destroy_appinfo(ai);
2042 return enabled == true;
2046 EAPI int livebox_service_is_primary(const char *lbid)
2061 ret = sqlite3_prepare_v2(handle, "SELECT prime FROM pkgmap WHERE pkgid = ?", -1, &stmt, NULL);
2062 if (ret != SQLITE_OK) {
2063 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2068 ret = sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT);
2069 if (ret != SQLITE_OK) {
2070 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2074 ret = sqlite3_step(stmt);
2075 if (ret != SQLITE_ROW) {
2076 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2080 ret = sqlite3_column_int(stmt, 0);
2083 sqlite3_reset(stmt);
2084 sqlite3_finalize(stmt);
2089 EAPI char *livebox_service_category(const char *lbid)
2092 char *category = NULL;
2107 ret = sqlite3_prepare_v2(handle, "SELECT category FROM pkgmap WHERE pkgid = ? OR appid = ?", -1, &stmt, NULL);
2108 if (ret != SQLITE_OK) {
2109 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2113 ret = sqlite3_bind_text(stmt, 1, lbid, -1, SQLITE_TRANSIENT);
2114 if (ret != SQLITE_OK) {
2115 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2116 sqlite3_reset(stmt);
2117 sqlite3_finalize(stmt);
2121 ret = sqlite3_bind_text(stmt, 2, lbid, -1, SQLITE_TRANSIENT);
2122 if (ret != SQLITE_OK) {
2123 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2124 sqlite3_reset(stmt);
2125 sqlite3_finalize(stmt);
2129 ret = sqlite3_step(stmt);
2130 if (ret != SQLITE_ROW) {
2131 ErrPrint("Has no record?: %s\n", sqlite3_errmsg(handle));
2132 sqlite3_reset(stmt);
2133 sqlite3_finalize(stmt);
2137 tmp = (char *)sqlite3_column_text(stmt, 0);
2138 if (!tmp || !strlen(tmp)) {
2139 ErrPrint("APPID is NIL\n");
2140 sqlite3_reset(stmt);
2141 sqlite3_finalize(stmt);
2145 category = strdup(tmp);
2147 ErrPrint("Heap: %s\n", strerror(errno));
2148 sqlite3_reset(stmt);
2149 sqlite3_finalize(stmt);
2153 sqlite3_reset(stmt);
2154 sqlite3_finalize(stmt);
2160 EAPI char *livebox_service_appid(const char *pkgname)
2166 int is_prime __attribute__((__unused__));
2179 ret = sqlite3_prepare_v2(handle, "SELECT appid, prime FROM pkgmap WHERE pkgid = ? OR appid = ?", -1, &stmt, NULL);
2180 if (ret != SQLITE_OK) {
2181 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2185 ret = sqlite3_bind_text(stmt, 1, pkgname, -1, SQLITE_TRANSIENT);
2186 if (ret != SQLITE_OK) {
2187 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2188 sqlite3_reset(stmt);
2189 sqlite3_finalize(stmt);
2193 ret = sqlite3_bind_text(stmt, 2, pkgname, -1, SQLITE_TRANSIENT);
2194 if (ret != SQLITE_OK) {
2195 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2196 sqlite3_reset(stmt);
2197 sqlite3_finalize(stmt);
2201 ret = sqlite3_step(stmt);
2202 if (ret != SQLITE_ROW) {
2203 pkgmgr_appinfo_h pkg_handle;
2206 ErrPrint("Has no record?: %s\n", sqlite3_errmsg(handle));
2207 sqlite3_reset(stmt);
2208 sqlite3_finalize(stmt);
2210 ret = pkgmgr_appinfo_get_appinfo(pkgname, &pkg_handle);
2211 if (ret != PKGMGR_R_OK) {
2212 ErrPrint("Failed to get appinfo: %s\n", pkgname);
2216 ret = pkgmgr_appinfo_get_pkgname(pkg_handle, &new_appid);
2217 if (ret != PKGMGR_R_OK) {
2218 ErrPrint("Failed to get pkgname for (%s)\n", appid);
2219 pkgmgr_appinfo_destroy_appinfo(pkg_handle);
2223 appid = strdup(new_appid);
2225 ErrPrint("Heap: %s\n", strerror(errno));
2228 pkgmgr_appinfo_destroy_appinfo(pkg_handle);
2232 tmp = (char *)sqlite3_column_text(stmt, 0);
2233 if (!tmp || !strlen(tmp)) {
2234 ErrPrint("APPID is NIL\n");
2235 sqlite3_reset(stmt);
2236 sqlite3_finalize(stmt);
2240 appid = strdup(tmp);
2242 ErrPrint("Heap: %s\n", strerror(errno));
2243 sqlite3_reset(stmt);
2244 sqlite3_finalize(stmt);
2248 is_prime = sqlite3_column_int(stmt, 1);
2250 sqlite3_reset(stmt);
2251 sqlite3_finalize(stmt);
2257 EAPI char *livebox_service_lb_script_path(const char *pkgid)
2276 ret = sqlite3_prepare_v2(handle, "SELECT pkgmap.appid, provider.box_src FROM provider, pkgmap WHERE pkgmap.pkgid = ? AND provider.pkgid = ?", -1, &stmt, NULL);
2277 if (ret != SQLITE_OK) {
2278 ErrPrint("Error: %s, pkgid(%s), ret(%d)\n", sqlite3_errmsg(handle), pkgid, ret);
2282 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
2283 if (ret != SQLITE_OK) {
2284 ErrPrint("Error: %s, pkgid(%s), ret(%d)\n", sqlite3_errmsg(handle), pkgid, ret);
2285 sqlite3_finalize(stmt);
2289 ret = sqlite3_bind_text(stmt, 2, pkgid, -1, SQLITE_TRANSIENT);
2290 if (ret != SQLITE_OK) {
2291 ErrPrint("Error: %s, pkgid(%s), ret(%d)\n", sqlite3_errmsg(handle), pkgid, ret);
2292 sqlite3_finalize(stmt);
2296 ret = sqlite3_step(stmt);
2297 if (ret != SQLITE_ROW) {
2298 ErrPrint("Error: %s, pkgid(%s), ret(%d)\n", sqlite3_errmsg(handle), pkgid, ret);
2299 sqlite3_reset(stmt);
2300 sqlite3_finalize(stmt);
2304 appid = (char *)sqlite3_column_text(stmt, 0);
2305 if (!appid || !strlen(appid)) {
2306 ErrPrint("Invalid appid : %s, pkgid(%s)\n", sqlite3_errmsg(handle), pkgid);
2307 sqlite3_reset(stmt);
2308 sqlite3_finalize(stmt);
2312 lb_src = (char *)sqlite3_column_text(stmt, 1);
2313 if (!lb_src || !strlen(lb_src)) {
2314 ErrPrint("No records for lb src : %s, pkgid(%s), appid(%s)\n", sqlite3_errmsg(handle), pkgid, appid);
2315 sqlite3_reset(stmt);
2316 sqlite3_finalize(stmt);
2320 path = strdup(lb_src);
2322 ErrPrint("Heap: %s\n", strerror(errno));
2323 sqlite3_reset(stmt);
2324 sqlite3_finalize(stmt);
2328 DbgPrint("LB Src: %s\n", path);
2329 sqlite3_reset(stmt);
2330 sqlite3_finalize(stmt);
2336 EAPI char *livebox_service_lb_script_group(const char *pkgid)
2354 ret = sqlite3_prepare_v2(handle, "SELECT box_group FROM provider WHERE pkgid = ?", -1, &stmt, NULL);
2355 if (ret != SQLITE_OK) {
2356 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2360 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
2361 if (ret != SQLITE_OK) {
2362 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2363 sqlite3_finalize(stmt);
2367 ret = sqlite3_step(stmt);
2368 if (ret != SQLITE_ROW) {
2369 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2370 sqlite3_reset(stmt);
2371 sqlite3_finalize(stmt);
2375 tmp = (char *)sqlite3_column_text(stmt, 0);
2376 if (tmp && strlen(tmp)) {
2377 group = strdup(tmp);
2379 ErrPrint("Heap: %s\n", strerror(errno));
2383 sqlite3_reset(stmt);
2384 sqlite3_finalize(stmt);
2390 EAPI char *livebox_service_pd_script_path(const char *pkgid)
2409 ret = sqlite3_prepare_v2(handle, "SELECT pkgmap.appid, provider.pd_src FROM provider, pkgmap WHERE provider.pkgid = ? AND pkgmap.pkgid = ?", -1, &stmt, NULL);
2410 if (ret != SQLITE_OK) {
2411 ErrPrint("Error: %s pkgid(%s) ret(%d)\n", sqlite3_errmsg(handle), pkgid, ret);
2415 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
2416 if (ret != SQLITE_OK) {
2417 ErrPrint("Error: %s pkgid(%s) ret(%d)\n", sqlite3_errmsg(handle), pkgid, ret);
2418 sqlite3_finalize(stmt);
2422 ret = sqlite3_bind_text(stmt, 2, pkgid, -1, SQLITE_TRANSIENT);
2423 if (ret != SQLITE_OK) {
2424 ErrPrint("Error: %s pkgid(%s) ret(%d)\n", sqlite3_errmsg(handle), pkgid, ret);
2425 sqlite3_finalize(stmt);
2429 ret = sqlite3_step(stmt);
2430 if (ret != SQLITE_ROW) {
2431 ErrPrint("Error: %s pkgid(%s) ret(%d)\n", sqlite3_errmsg(handle), pkgid, ret);
2432 sqlite3_reset(stmt);
2433 sqlite3_finalize(stmt);
2437 appid = (char *)sqlite3_column_text(stmt, 0);
2438 if (!appid || !strlen(appid)) {
2439 ErrPrint("Error: %s pkgid(%s)\n", sqlite3_errmsg(handle), pkgid);
2440 sqlite3_reset(stmt);
2441 sqlite3_finalize(stmt);
2445 pd_src = (char *)sqlite3_column_text(stmt, 1);
2446 if (!pd_src || !strlen(pd_src)) {
2447 ErrPrint("Error: %s pkgid(%s) appid(%s)\n", sqlite3_errmsg(handle), pkgid, appid);
2448 sqlite3_reset(stmt);
2449 sqlite3_finalize(stmt);
2453 path = strdup(pd_src);
2455 ErrPrint("Heap: %s\n", strerror(errno));
2456 sqlite3_reset(stmt);
2457 sqlite3_finalize(stmt);
2461 DbgPrint("PD Src: %s\n", path);
2462 sqlite3_reset(stmt);
2463 sqlite3_finalize(stmt);
2469 EAPI char *livebox_service_pd_script_group(const char *pkgid)
2487 ret = sqlite3_prepare_v2(handle, "SELECT pd_group FROM provider WHERE pkgid = ?", -1, &stmt, NULL);
2488 if (ret != SQLITE_OK) {
2489 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2493 ret = sqlite3_bind_text(stmt, 1, pkgid, -1, SQLITE_TRANSIENT);
2494 if (ret != SQLITE_OK) {
2495 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2496 sqlite3_finalize(stmt);
2500 ret = sqlite3_step(stmt);
2501 if (ret != SQLITE_ROW) {
2502 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2503 sqlite3_reset(stmt);
2504 sqlite3_finalize(stmt);
2508 tmp = (char *)sqlite3_column_text(stmt, 0);
2509 if (tmp && strlen(tmp)) {
2510 group = strdup(tmp);
2512 ErrPrint("Heap: %s\n", strerror(errno));
2515 sqlite3_reset(stmt);
2516 sqlite3_finalize(stmt);
2522 EAPI int livebox_service_enumerate_cluster_list(int (*cb)(const char *cluster, void *data), void *data)
2526 const char *cluster;
2531 return LB_STATUS_ERROR_INVALID;
2536 return LB_STATUS_ERROR_IO;
2540 ret = sqlite3_prepare_v2(handle, "SELECT DISTINCT cluster FROM groupinfo", -1, &stmt, NULL);
2541 if (ret != SQLITE_OK) {
2542 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2543 cnt = LB_STATUS_ERROR_IO;
2547 while (sqlite3_step(stmt) == SQLITE_ROW) {
2548 cluster = (const char *)sqlite3_column_text(stmt, 0);
2549 if (!cluster || !strlen(cluster)) {
2553 if (cb(cluster, data) < 0) {
2560 sqlite3_reset(stmt);
2561 sqlite3_finalize(stmt);
2567 EAPI int livebox_service_enumerate_category_list(const char *cluster, int (*cb)(const char *cluster, const char *category, void *data), void *data)
2571 const char *category;
2575 if (!cluster || !cb) {
2576 return LB_STATUS_ERROR_INVALID;
2581 return LB_STATUS_ERROR_IO;
2584 ret = sqlite3_prepare_v2(handle, "SELECT DISTINCT category FROM groupinfo WHERE cluster = ?", -1, &stmt, NULL);
2585 if (ret != SQLITE_OK) {
2586 ErrPrint("Error: %s\n", sqlite3_errmsg(handle));
2587 cnt = LB_STATUS_ERROR_IO;
2592 while (sqlite3_step(stmt) == SQLITE_ROW) {
2593 category = (const char *)sqlite3_column_text(stmt, 0);
2594 if (!category || !strlen(category)) {
2598 if (cb(cluster, category, data) < 0) {
2605 sqlite3_reset(stmt);
2606 sqlite3_finalize(stmt);
2612 EAPI int livebox_service_init(void)
2614 if (s_info.handle) {
2615 DbgPrint("Already initialized\n");
2616 s_info.init_count++;
2620 s_info.handle = open_db();
2621 if (s_info.handle) {
2622 s_info.init_count++;
2626 return LB_STATUS_ERROR_IO;
2629 EAPI int livebox_service_fini(void)
2631 if (!s_info.handle || s_info.init_count <= 0) {
2632 ErrPrint("Service is not initialized\n");
2633 return LB_STATUS_ERROR_IO;
2636 s_info.init_count--;
2637 if (s_info.init_count > 0) {
2638 DbgPrint("Init count %d\n", s_info.init_count);
2642 db_util_close(s_info.handle);
2643 s_info.handle = NULL;
2647 EAPI int livebox_service_get_size(int type, int *width, int *height)
2660 return convert_size_from_type(type, width, height);
2663 EAPI int livebox_service_size_type(int width, int height)
2667 if (util_update_resolution(&s_info, SIZE_LIST) < 0) {
2668 ErrPrint("Failed to update the size list\n");
2671 for (idx = 0; idx < NR_OF_SIZE_LIST; idx++) {
2672 if (SIZE_LIST[idx].w == width && SIZE_LIST[idx].h == height) {
2679 return LB_SIZE_TYPE_1x1;
2681 return LB_SIZE_TYPE_2x1;
2683 return LB_SIZE_TYPE_2x2;
2685 return LB_SIZE_TYPE_4x1;
2687 return LB_SIZE_TYPE_4x2;
2689 return LB_SIZE_TYPE_4x3;
2691 return LB_SIZE_TYPE_4x4;
2693 return LB_SIZE_TYPE_4x5;
2695 return LB_SIZE_TYPE_4x6;
2697 return LB_SIZE_TYPE_EASY_1x1;
2699 return LB_SIZE_TYPE_EASY_3x1;
2701 return LB_SIZE_TYPE_EASY_3x3;
2703 return LB_SIZE_TYPE_0x0;
2708 return LB_SIZE_TYPE_UNKNOWN;