4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
7 * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
35 #include <pkgmgr-info.h>
36 #include <iniparser.h>
37 /* For multi-user support */
38 #include <tzplatform_config.h>
40 #include "package-manager.h"
41 #include "pkgmgr-internal.h"
42 #include "pkgmgr-debug.h"
43 #include "comm_client.h"
44 #include "comm_config.h"
46 /* API export macro */
48 #define API __attribute__ ((visibility("default")))
51 #define PKG_TMP_PATH tzplatform_mkpath(TZ_USER_APP, "tmp")
53 #define BINSH_NAME "/bin/sh"
56 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
57 #define REGULAR_USER 5000
59 static inline uid_t _getuid(void)
63 if (uid < REGULAR_USER)
69 static int _get_request_id()
71 static int internal_req_id = 1;
73 return internal_req_id++;
76 typedef struct _req_cb_info {
79 pkgmgr_handler event_cb;
80 pkgmgr_app_handler app_event_cb;
82 struct _req_cb_info *next;
85 typedef struct _listen_cb_info {
87 pkgmgr_handler event_cb;
88 pkgmgr_app_handler app_event_cb;
90 struct _listen_cb_info *next;
93 typedef struct _pkgmgr_client_t {
103 listen_cb_info *lhead;
111 typedef struct _iter_data {
112 pkgmgr_iter_fn iter_fn;
116 static int __xsystem(const char *argv[])
123 perror("fork failed");
127 execvp(argv[0], (char *const *)argv);
133 if (waitpid(pid, &status, 0) == -1) {
134 perror("waitpid failed");
137 if (WIFSIGNALED(status)) {
141 if (!WIFEXITED(status)) {
142 /* shouldn't happen */
143 perror("should not happen");
146 return WEXITSTATUS(status);
149 static void __error_to_string(int errnumber, char **errstr)
154 case PKGCMD_ERR_PACKAGE_NOT_FOUND:
155 *errstr = PKGCMD_ERR_PACKAGE_NOT_FOUND_STR;
157 case PKGCMD_ERR_PACKAGE_INVALID:
158 *errstr = PKGCMD_ERR_PACKAGE_INVALID_STR;
160 case PKGCMD_ERR_PACKAGE_LOWER_VERSION:
161 *errstr = PKGCMD_ERR_PACKAGE_LOWER_VERSION_STR;
163 case PKGCMD_ERR_PACKAGE_EXECUTABLE_NOT_FOUND:
164 *errstr = PKGCMD_ERR_PACKAGE_EXECUTABLE_NOT_FOUND_STR;
166 case PKGCMD_ERR_MANIFEST_INVALID:
167 *errstr = PKGCMD_ERR_MANIFEST_INVALID_STR;
169 case PKGCMD_ERR_CONFIG_NOT_FOUND:
170 *errstr = PKGCMD_ERR_CONFIG_NOT_FOUND_STR;
172 case PKGCMD_ERR_CONFIG_INVALID:
173 *errstr = PKGCMD_ERR_CONFIG_INVALID_STR;
175 case PKGCMD_ERR_SIGNATURE_NOT_FOUND:
176 *errstr = PKGCMD_ERR_SIGNATURE_NOT_FOUND_STR;
178 case PKGCMD_ERR_SIGNATURE_INVALID:
179 *errstr = PKGCMD_ERR_SIGNATURE_INVALID_STR;
181 case PKGCMD_ERR_SIGNATURE_VERIFICATION_FAILED:
182 *errstr = PKGCMD_ERR_SIGNATURE_VERIFICATION_FAILED_STR;
184 case PKGCMD_ERR_ROOT_CERTIFICATE_NOT_FOUND:
185 *errstr = PKGCMD_ERR_ROOT_CERTIFICATE_NOT_FOUND_STR;
187 case PKGCMD_ERR_CERTIFICATE_INVALID:
188 *errstr = PKGCMD_ERR_CERTIFICATE_INVALID_STR;
190 case PKGCMD_ERR_CERTIFICATE_CHAIN_VERIFICATION_FAILED:
191 *errstr = PKGCMD_ERR_CERTIFICATE_CHAIN_VERIFICATION_FAILED_STR;
193 case PKGCMD_ERR_CERTIFICATE_EXPIRED:
194 *errstr = PKGCMD_ERR_CERTIFICATE_EXPIRED_STR;
196 case PKGCMD_ERR_INVALID_PRIVILEGE:
197 *errstr = PKGCMD_ERR_INVALID_PRIVILEGE_STR;
199 case PKGCMD_ERR_MENU_ICON_NOT_FOUND:
200 *errstr = PKGCMD_ERR_MENU_ICON_NOT_FOUND_STR;
202 case PKGCMD_ERR_FATAL_ERROR:
203 *errstr = PKGCMD_ERR_FATAL_ERROR_STR;
205 case PKGCMD_ERR_OUT_OF_STORAGE:
206 *errstr = PKGCMD_ERR_OUT_OF_STORAGE_STR;
208 case PKGCMD_ERR_OUT_OF_MEMORY:
209 *errstr = PKGCMD_ERR_OUT_OF_MEMORY_STR;
211 case PKGCMD_ERR_ARGUMENT_INVALID:
212 *errstr = PKGCMD_ERR_ARGUMENT_INVALID_STR;
215 *errstr = PKGCMD_ERR_UNKNOWN_STR;
220 static void __add_op_cbinfo(pkgmgr_client_t *pc, int request_id,
221 const char *req_key, pkgmgr_handler event_cb, void *new_event_cb,
224 req_cb_info *cb_info;
225 req_cb_info *current;
228 cb_info = (req_cb_info *) calloc(1, sizeof(req_cb_info));
229 if (cb_info == NULL) {
230 DBG("calloc failed");
233 cb_info->request_id = request_id;
234 cb_info->req_key = strdup(req_key);
235 cb_info->event_cb = event_cb;
236 cb_info->data = data;
237 cb_info->next = NULL;
238 cb_info->app_event_cb = NULL;
239 pc->new_event_cb = new_event_cb;
241 if (pc->info.request.rhead == NULL)
242 pc->info.request.rhead = cb_info;
244 current = prev = pc->info.request.rhead;
247 current = current->next;
250 prev->next = cb_info;
254 static void __add_op_app_cbinfo(pkgmgr_client_t *pc, int request_id,
255 const char *req_key, pkgmgr_app_handler app_event_cb, void *data)
257 req_cb_info *cb_info;
258 req_cb_info *current;
261 cb_info = (req_cb_info *) calloc(1, sizeof(req_cb_info));
262 if (cb_info == NULL) {
263 DBG("calloc failed");
266 cb_info->request_id = request_id;
267 cb_info->req_key = strdup(req_key);
268 cb_info->event_cb = NULL;
269 cb_info->app_event_cb = app_event_cb;
270 cb_info->data = data;
271 cb_info->next = NULL;
272 pc->new_event_cb = NULL;
274 if (pc->info.request.rhead == NULL)
275 pc->info.request.rhead = cb_info;
277 current = prev = pc->info.request.rhead;
280 current = current->next;
283 prev->next = cb_info;
287 static req_cb_info *__find_op_cbinfo(pkgmgr_client_t *pc, const char *req_key)
291 tmp = pc->info.request.rhead;
298 DBG("tmp->req_key %s, req_key %s", tmp->req_key, req_key);
301 if (strncmp(tmp->req_key, req_key, strlen(tmp->req_key)) == 0)
308 static int __remove_stat_cbinfo(pkgmgr_client_t *pc)
310 listen_cb_info *info = pc->info.listening.lhead;
311 listen_cb_info *next = NULL;
313 while (info != NULL) {
319 pc->info.listening.lhead = NULL;
323 static void __add_app_stat_cbinfo(pkgmgr_client_t *pc, int request_id,
324 pkgmgr_app_handler event_cb, void *data)
326 listen_cb_info *cb_info;
327 listen_cb_info *current;
328 listen_cb_info *prev;
330 cb_info = (listen_cb_info *) calloc(1, sizeof(listen_cb_info));
331 if (cb_info == NULL) {
332 DBG("calloc failed");
335 cb_info->request_id = request_id;
336 cb_info->app_event_cb = event_cb;
337 cb_info->data = data;
338 cb_info->next = NULL;
340 if (pc->info.listening.lhead == NULL)
341 pc->info.listening.lhead = cb_info;
343 current = prev = pc->info.listening.lhead;
346 current = current->next;
349 prev->next = cb_info;
353 static void __add_stat_cbinfo(pkgmgr_client_t *pc, int request_id,
354 pkgmgr_handler event_cb, void *data)
356 listen_cb_info *cb_info;
357 listen_cb_info *current;
358 listen_cb_info *prev;
360 cb_info = (listen_cb_info *) calloc(1, sizeof(listen_cb_info));
361 if (cb_info == NULL) {
362 DBG("calloc failed");
365 cb_info->request_id = request_id;
366 cb_info->event_cb = event_cb;
367 cb_info->data = data;
368 cb_info->next = NULL;
370 /* TODO - check the order of callback - FIFO or LIFO => Should be changed to LIFO */
371 if (pc->info.listening.lhead == NULL)
372 pc->info.listening.lhead = cb_info;
374 current = prev = pc->info.listening.lhead;
377 current = current->next;
380 prev->next = cb_info;
384 static void __operation_callback(void *cb_data, uid_t target_uid,
385 const char *req_id, const char *pkg_type,
386 const char *pkgid, const char *appid,
387 const char *key, const char *val)
390 req_cb_info *cb_info;
392 pc = (pkgmgr_client_t *) cb_data;
394 /* find callback info */
395 cb_info = __find_op_cbinfo(pc, req_id);
396 if (cb_info == NULL) {
397 ERR("cannot find cb_info for req_id:%s", req_id);
402 if (appid != NULL && strlen(appid) != 0 && cb_info->app_event_cb) {
403 /* run app callback */
404 if (pc->new_event_cb)
405 cb_info->app_event_cb(target_uid, cb_info->request_id,
406 pkg_type, pkgid, appid, key, val, pc,
409 cb_info->app_event_cb(target_uid, cb_info->request_id,
410 pkg_type, pkgid, appid, key, val, NULL,
412 } else if (cb_info->event_cb) {
413 /* run pkg callback */
414 if (pc->new_event_cb)
415 cb_info->event_cb(target_uid, cb_info->request_id,
416 pkg_type, pkgid, key, val, pc,
419 cb_info->event_cb(target_uid, cb_info->request_id,
420 pkg_type, pkgid, key, val, NULL,
427 static void __status_callback(void *cb_data, uid_t target_uid,
428 const char *req_id, const char *pkg_type,
429 const char *pkgid, const char *appid,
430 const char *key, const char *val)
435 pc = (pkgmgr_client_t *) cb_data;
437 tmp = pc->info.listening.lhead;
439 if (appid != NULL && strlen(appid) != 0) {
440 /* run app callback */
441 if (tmp->app_event_cb && tmp->app_event_cb(
442 target_uid, tmp->request_id, pkg_type, pkgid,
443 appid, key, val, NULL, tmp->data) != 0)
446 /* run pkg callback */
447 if (tmp->event_cb && tmp->event_cb(
448 target_uid, tmp->request_id, pkg_type, pkgid,
449 key, val, NULL, tmp->data) != 0)
458 static inline int __read_proc(const char *path, char *buf, int size)
463 if (buf == NULL || path == NULL)
466 fd = open(path, O_RDONLY);
470 ret = read(fd, buf, size - 1);
482 char *__proc_get_cmdline_bypid(int pid)
484 char buf[PKG_STRING_LEN_MAX] = {'\0', };
487 snprintf(buf, sizeof(buf), "/proc/%d/cmdline", pid);
488 ret = __read_proc(buf, buf, sizeof(buf));
492 /* support app launched by shell script*/
493 if (strncmp(buf, BINSH_NAME, BINSH_SIZE) == 0)
494 return strdup(&buf[BINSH_SIZE + 1]);
499 static inline int __pkgmgr_read_proc(const char *path, char *buf, int size)
504 if (buf == NULL || path == NULL)
507 fd = open(path, O_RDONLY);
511 ret = read(fd, buf, size - 1);
523 static int __sync_process(const char *req_key)
526 char info_file[PKG_STRING_LEN_MAX] = {'\0', };
530 char buf[PKG_STRING_LEN_MAX] = {0, };
532 snprintf(info_file, PKG_STRING_LEN_MAX, "%s/%s", PKG_SIZE_INFO_PATH, req_key);
537 if (access(info_file, F_OK) == 0) {
538 fp = fopen(info_file, "r");
540 DBG("file is not generated yet.... wait\n");
541 usleep(100 * 1000); /* 100ms sleep*/
545 if (fgets(buf, PKG_STRING_LEN_MAX, fp) == NULL) {
546 ERR("failed to read info file");
552 DBG("info_file file is generated, result = %s. \n", buf);
557 DBG("file is not generated yet.... wait\n");
558 usleep(100 * 1000); /* 100ms sleep*/
560 if (check_cnt > 6000) { /* 60s * 10 time over*/
561 ERR("wait time over!!\n");
566 ret = remove(info_file);
568 ERR("file is can not remove[%s, %d]\n", info_file, ret);
573 static int __csc_process(const char *csc_path, char *result_path)
580 char *pkgtype = NULL;
582 char buf[PKG_STRING_LEN_MAX] = {0,};
583 char type_buf[1024] = { 0 };
584 char des_buf[1024] = { 0 };
585 dictionary *csc = NULL;
588 csc = iniparser_load(csc_path);
589 retvm_if(csc == NULL, PKGMGR_R_EINVAL, "cannot open parse file [%s]", csc_path);
591 file = fopen(result_path, "w");
592 tryvm_if(file == NULL, ret = PKGMGR_R_EINVAL, "cannot open result file [%s]", result_path);
594 count = iniparser_getint(csc, "csc packages:count", -1);
595 tryvm_if(count == 0, ret = PKGMGR_R_ERROR, "csc [%s] dont have packages", csc_path);
597 snprintf(buf, PKG_STRING_LEN_MAX, "[result]\n");
598 fwrite(buf, 1, strlen(buf), file);
599 snprintf(buf, PKG_STRING_LEN_MAX, "count = %d\n", count);
600 fwrite(buf, 1, strlen(buf), file);
602 for(cnt = 1 ; cnt <= count ; cnt++)
604 snprintf(type_buf, PKG_STRING_LEN_MAX - 1, "csc packages:type_%03d", cnt);
605 snprintf(des_buf, PKG_STRING_LEN_MAX - 1, "csc packages:description_%03d", cnt);
607 pkgtype = iniparser_getstring(csc, type_buf, NULL);
608 des = iniparser_getstring(csc, des_buf, NULL);
611 if (pkgtype == NULL) {
613 snprintf(buf, PKG_STRING_LEN_MAX, "%s = Fail to get pkgtype\n", type_buf);
614 fwrite(buf, 1, strlen(buf), file);
616 } else if (des == NULL) {
618 snprintf(buf, PKG_STRING_LEN_MAX, "%s = Fail to get description\n", des_buf);
619 fwrite(buf, 1, strlen(buf), file);
623 snprintf(buf, PKG_STRING_LEN_MAX, "type_%03d = %s\n", cnt, pkgtype);
624 fwrite(buf, 1, strlen(buf), file);
625 snprintf(buf, PKG_STRING_LEN_MAX, "description_%03d = %s\n", cnt, des);
626 fwrite(buf, 1, strlen(buf), file);
628 if (strcmp(pkgtype, "tpk") == 0) {
629 const char *ospinstaller_argv[] = { "/usr/bin/osp-installer", "-c", des, NULL };
630 ret = __xsystem(ospinstaller_argv);
631 } else if (strcmp(pkgtype, "wgt")== 0) {
632 const char *wrtinstaller_argv[] = { "/usr/bin/wrt-installer", "-c", des, NULL };
633 ret = __xsystem(wrtinstaller_argv);
641 __error_to_string(ret, &errstr);
642 snprintf(buf, PKG_STRING_LEN_MAX, "result_%03d = fail[%s]\n", cnt, errstr);
645 snprintf(buf, PKG_STRING_LEN_MAX, "result_%03d = success\n", cnt);
647 fwrite(buf, 1, strlen(buf), file);
651 iniparser_freedict(csc);
661 static int __get_size_process(pkgmgr_client * pc, const char *pkgid, uid_t uid,
662 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
666 int ret = PKGMGR_R_ECOMM;
667 char *req_key = NULL;
668 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
670 if (pc == NULL || pkgid == NULL) {
671 ERR("invalid parameter");
672 return PKGMGR_R_EINVAL;
675 if (mpc->ctype != PC_REQUEST) {
676 ERR("mpc->ctype is not PC_REQUEST");
677 return PKGMGR_R_EINVAL;
680 ret = comm_client_request(mpc->info.request.cc, "getsize",
681 g_variant_new("(usi)", uid, pkgid, get_type), &result);
682 if (ret != PKGMGR_R_OK) {
683 ERR("request failed: %d", ret);
687 g_variant_get(result, "(i&s)", &ret, &req_key);
688 if (req_key == NULL) {
689 g_variant_unref(result);
690 return PKGMGR_R_ECOMM;
692 if (ret != PKGMGR_R_OK) {
693 g_variant_unref(result);
697 ret = __sync_process(req_key);
699 ERR("get size failed, ret=%d\n", ret);
701 g_variant_unref(result);
706 static int __move_pkg_process(pkgmgr_client *pc, const char *pkgid,
707 const char *pkg_type, uid_t uid, pkgmgr_move_type move_type,
708 pkgmgr_handler event_cb, void *data)
712 ret = pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type, event_cb, data, uid);
714 ERR("move request failed");
721 static int __check_app_process(pkgmgr_request_service_type service_type,
722 pkgmgr_client *pc, const char *pkgid, uid_t uid, void *data)
725 int ret = PKGMGR_R_ECOMM;
726 pkgmgrinfo_pkginfo_h handle;
728 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
730 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST\n");
732 if (uid != GLOBAL_USER)
733 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
735 ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle);
736 retvm_if(ret < 0, PKGMGR_R_ERROR, "pkgmgrinfo_pkginfo_get_pkginfo failed");
738 if (service_type == PM_REQUEST_KILL_APP)
739 ret = comm_client_request(mpc->info.request.cc, "kill",
740 g_variant_new("(us)", uid, pkgid), &result);
741 else if (service_type == PM_REQUEST_CHECK_APP)
742 ret = comm_client_request(mpc->info.request.cc, "check",
743 g_variant_new("(us)", uid, pkgid), &result);
744 if (ret != PKGMGR_R_OK) {
745 ERR("request failed: %d", ret);
749 g_variant_get(result, "(i)", &ret);
750 g_variant_unref(result);
751 if (ret != PKGMGR_R_OK) {
752 ERR("request failed, ret=%d", ret);
757 pid = __sync_process(pkgid);
760 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
766 static int __request_size_info(pkgmgr_client *pc, uid_t uid)
769 int ret = PKGMGR_R_ECOMM;
770 char *req_key = NULL;
771 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
774 ERR("invalid parameter");
775 return PKGMGR_R_EINVAL;
778 if (mpc->ctype != PC_REQUEST) {
779 ERR("mpc->ctype is not PC_REQUEST");
780 return PKGMGR_R_EINVAL;
783 ret = comm_client_request(mpc->info.request.cc, "getsize",
784 g_variant_new("(usi)", uid, "size_info",
787 if (ret != PKGMGR_R_OK) {
788 ERR("request failed: %d", ret);
792 g_variant_get(result, "(i&s)", &ret, &req_key);
793 if (req_key == NULL) {
794 g_variant_unref(result);
795 return PKGMGR_R_ECOMM;
798 g_variant_unref(result);
803 static int __change_op_cb_for_getsize(pkgmgr_client *pc)
807 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
808 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
810 /* free listening head */
811 req_cb_info *tmp = NULL;
812 req_cb_info *prev = NULL;
813 for (tmp = mpc->info.request.rhead; tmp;) {
819 /* free dbus connection */
820 ret = comm_client_free(mpc->info.request.cc);
821 retvm_if(ret < 0, PKGMGR_R_ERROR, "comm_client_free() failed - %d", ret);
823 /* Manage pc for seperated event */
824 mpc->ctype = PC_REQUEST;
825 mpc->status_type = PKGMGR_CLIENT_STATUS_GET_SIZE;
828 mpc->info.request.cc = comm_client_new();
829 retvm_if(mpc->info.request.cc == NULL, PKGMGR_R_ERROR, "client creation failed");
831 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_GET_SIZE, mpc->info.request.cc, __operation_callback, pc);
832 retvm_if(ret < 0, PKGMGR_R_ERROR, "set_status_callback() failed - %d", ret);
837 static int __change_op_cb_for_enable_disable(pkgmgr_client *pc, bool is_disable)
841 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
842 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
844 /* free listening head */
845 req_cb_info *tmp = NULL;
846 req_cb_info *prev = NULL;
847 for (tmp = mpc->info.request.rhead; tmp;) {
853 /* free dbus connection */
854 ret = comm_client_free(mpc->info.request.cc);
855 retvm_if(ret < 0, PKGMGR_R_ERROR, "comm_client_free() failed - %d", ret);
857 /* Manage pc for seperated event */
858 mpc->ctype = PC_REQUEST;
860 mpc->status_type = PKGMGR_CLIENT_STATUS_DISABLE_APP;
862 mpc->status_type = PKGMGR_CLIENT_STATUS_ENABLE_APP;
865 mpc->info.request.cc = comm_client_new();
866 retvm_if(mpc->info.request.cc == NULL, PKGMGR_R_ERROR, "client creation failed");
869 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_DISABLE_APP, mpc->info.request.cc, __operation_callback, pc);
871 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ENABLE_APP, mpc->info.request.cc, __operation_callback, pc);
872 retvm_if(ret < 0, PKGMGR_R_ERROR, "set_status_callback() failed - %d", ret);
877 static int __get_pkg_size_info_cb(uid_t target_uid, int req_id, const char *req_type,
878 const char *pkgid, const char *key,
879 const char *value, const void *pc, void *user_data)
882 DBG("target_uid: %u, reqid: %d, req type: %s, pkgid: %s, unused key: %s, size info: %s",
883 target_uid, req_id, req_type, pkgid, key, value);
885 pkg_size_info_t *size_info = (pkg_size_info_t *)malloc(sizeof(pkg_size_info_t));
886 retvm_if(size_info == NULL, -1, "The memory is insufficient.");
888 char *save_ptr = NULL;
889 char *token = strtok_r((char*)value, ":", &save_ptr);
890 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
891 size_info->data_size = atoll(token);
892 token = strtok_r(NULL, ":", &save_ptr);
893 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
894 size_info->cache_size = atoll(token);
895 token = strtok_r(NULL, ":", &save_ptr);
896 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
897 size_info->app_size = atoll(token);
898 token = strtok_r(NULL, ":", &save_ptr);
899 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
900 size_info->ext_data_size = atoll(token);
901 token = strtok_r(NULL, ":", &save_ptr);
902 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
903 size_info->ext_cache_size = atoll(token);
904 token = strtok_r(NULL, ":", &save_ptr);
905 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
906 size_info->ext_app_size = atoll(token);
908 DBG("data: %lld, cache: %lld, app: %lld, ext_data: %lld, ext_cache: %lld, ext_app: %lld",
909 size_info->data_size, size_info->cache_size, size_info->app_size,
910 size_info->ext_data_size, size_info->ext_cache_size, size_info->ext_app_size);
912 pkgmgr_client_t *pmc = (pkgmgr_client_t *)pc;
913 tryvm_if(pmc == NULL, ret = -1, "pkgmgr_client instance is null.");
915 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
916 { // total package size info
917 pkgmgr_total_pkg_size_info_receive_cb callback = (pkgmgr_total_pkg_size_info_receive_cb)(pmc->new_event_cb);
918 callback((pkgmgr_client *)pc, size_info, user_data);
922 pkgmgr_pkg_size_info_receive_cb callback = (pkgmgr_pkg_size_info_receive_cb)(pmc->new_event_cb);
923 callback((pkgmgr_client *)pc, pkgid, size_info, user_data);
935 API pkgmgr_client *pkgmgr_client_new(client_type ctype)
937 pkgmgr_client_t *pc = NULL;
940 retvm_if(ctype == PC_BROADCAST, NULL, "broadcast type is not supported");
941 retvm_if(ctype != PC_REQUEST && ctype != PC_LISTENING, NULL, "ctype is not client_type");
943 /* Allocate memory for ADT:pkgmgr_client */
944 pc = calloc(1, sizeof(pkgmgr_client_t));
945 retvm_if(pc == NULL, NULL, "No memory");
949 pc->status_type = PKGMGR_CLIENT_STATUS_ALL;
952 if (pc->ctype == PC_REQUEST) {
953 pc->info.request.cc = comm_client_new();
954 trym_if(pc->info.request.cc == NULL, "client creation failed");
956 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ALL, pc->info.request.cc, __operation_callback, pc);
957 trym_if(ret < 0L, "comm_client_set_status_callback() failed - %d", ret);
958 } else if (pc->ctype == PC_LISTENING) {
959 pc->info.listening.cc = comm_client_new();
960 trym_if(pc->info.listening.cc == NULL, "client creation failed");
962 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ALL, pc->info.listening.cc, __status_callback, pc);
963 trym_if(ret < 0L, "comm_client_set_status_callback() failed - %d", ret);
966 return (pkgmgr_client *) pc;
974 API int pkgmgr_client_free(pkgmgr_client *pc)
977 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
978 retvm_if(mpc == NULL, PKGMGR_R_EINVAL, "Invalid argument");
980 if (mpc->ctype == PC_REQUEST) {
983 for (tmp = mpc->info.request.rhead; tmp;) {
989 ret = comm_client_free(mpc->info.request.cc);
990 tryvm_if(ret < 0, ret = PKGMGR_R_ERROR, "comm_client_free() failed");
991 } else if (mpc->ctype == PC_LISTENING) {
993 listen_cb_info *prev;
994 for (tmp = mpc->info.listening.lhead; tmp;) {
1000 ret = comm_client_free(mpc->info.listening.cc);
1001 tryvm_if(ret < 0, ret = PKGMGR_R_ERROR, "comm_client_free() failed");
1002 } else if (mpc->ctype == PC_BROADCAST) {
1005 ERR("Invalid client type\n");
1006 return PKGMGR_R_EINVAL;
1009 if (mpc->tep_path) {
1010 free(mpc->tep_path);
1011 mpc->tep_path = NULL;
1014 if (mpc->tep_move) {
1015 free(mpc->tep_move);
1016 mpc->tep_move = NULL;
1028 return PKGMGR_R_ERROR;
1031 static char *__get_type_from_path(const char *pkg_path)
1034 char mimetype[255] = { '\0', };
1035 char extlist[256] = { '\0', };
1038 ret = _get_mime_from_file(pkg_path, mimetype, sizeof(mimetype));
1040 ERR("_get_mime_from_file() failed - error code[%d]\n", ret);
1044 ret = _get_mime_extension(mimetype, extlist, sizeof(extlist));
1046 ERR("_get_mime_extension() failed - error code[%d]\n", ret);
1050 if (strlen(extlist) == 0)
1053 if (strchr(extlist, ','))
1054 extlist[strlen(extlist) - strlen(strchr(extlist, ','))] = '\0';
1056 pkg_type = strchr(extlist, '.') + 1;
1057 return strdup(pkg_type);
1060 static int __change_op_cb_for_enable_disable_splash_screen(pkgmgr_client *pc,
1064 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1069 ERR("package mananger client pc is NULL");
1070 return PKGMGR_R_EINVAL;
1073 for (tmp = mpc->info.request.rhead; tmp;) {
1079 ret = comm_client_free(mpc->info.request.cc);
1081 ERR("comm_client_free() failed - %d", ret);
1082 return PKGMGR_R_ERROR;
1085 mpc->ctype = PC_REQUEST;
1087 mpc->status_type = PKGMGR_CLIENT_STATUS_ENABLE_APP_SPLASH_SCREEN;
1089 mpc->status_type = PKGMGR_CLIENT_STATUS_DISABLE_APP_SPLASH_SCREEN;
1091 mpc->info.request.cc = comm_client_new();
1092 if (mpc->info.request.cc == NULL) {
1093 ERR("client creation failed");
1094 return PKGMGR_R_ENOMEM;
1098 ret = comm_client_set_status_callback(
1099 COMM_STATUS_BROADCAST_ENABLE_APP_SPLASH_SCREEN,
1100 mpc->info.request.cc, __operation_callback, pc);
1102 ret = comm_client_set_status_callback(
1103 COMM_STATUS_BROADCAST_DISABLE_APP_SPLASH_SCREEN,
1104 mpc->info.request.cc, __operation_callback, pc);
1107 ERR("set_status_callback() failed - %d", ret);
1108 return PKGMGR_R_ERROR;
1114 API int pkgmgr_client_set_tep_path(pkgmgr_client *pc, char *tep_path, char *tep_move)
1116 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1117 retvm_if(tep_path == NULL, PKGMGR_R_EINVAL, "tep path is NULL");
1118 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1120 mpc->tep_path = strdup(tep_path);
1121 mpc->tep_move = strdup(tep_move);
1126 API int pkgmgr_client_usr_install(pkgmgr_client *pc, const char *pkg_type,
1127 const char *descriptor_path, const char *pkg_path,
1128 const char *optional_data, pkgmgr_mode mode,
1129 pkgmgr_handler event_cb, void *data, uid_t uid)
1132 int ret = PKGMGR_R_ECOMM;
1133 char *req_key = NULL;
1134 GVariantBuilder *builder = NULL;
1135 GVariant *args = NULL;
1137 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1140 if (pc == NULL || pkg_path == NULL) {
1141 ERR("invalid parameter");
1142 return PKGMGR_R_EINVAL;
1145 if (mpc->ctype != PC_REQUEST) {
1146 ERR("mpc->ctype is not PC_REQUEST");
1147 return PKGMGR_R_EINVAL;
1150 if (access(pkg_path, F_OK) != 0) {
1151 ERR("failed to access: %s", pkg_path);
1152 return PKGMGR_R_EINVAL;
1155 if (mpc->tep_path != NULL && access(mpc->tep_path, F_OK) != 0) {
1156 ERR("failed to access: %s", mpc->tep_path);
1157 return PKGMGR_R_EINVAL;
1160 /* TODO: check pkg's type on server-side */
1161 if (pkg_type == NULL)
1162 pkgtype = __get_type_from_path(pkg_path);
1164 pkgtype = strdup(pkg_type);
1166 /* build arguments */
1167 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1168 if (mpc->tep_path) {
1169 g_variant_builder_add(builder, "s", "-e");
1170 g_variant_builder_add(builder, "s", mpc->tep_path);
1171 g_variant_builder_add(builder, "s", "-M");
1172 g_variant_builder_add(builder, "s", mpc->tep_move);
1175 args = g_variant_new("as", builder);
1176 g_variant_builder_unref(builder);
1178 ret = comm_client_request(mpc->info.request.cc, "install",
1179 g_variant_new("(uss@as)", uid, pkgtype, pkg_path, args),
1181 if (ret != PKGMGR_R_OK) {
1182 ERR("request failed: %d", ret);
1186 g_variant_get(result, "(i&s)", &ret, &req_key);
1187 if (req_key == NULL) {
1188 g_variant_unref(result);
1189 return PKGMGR_R_ECOMM;
1191 if (ret != PKGMGR_R_OK) {
1192 g_variant_unref(result);
1196 req_id = _get_request_id();
1197 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1199 g_variant_unref(result);
1204 API int pkgmgr_client_install(pkgmgr_client *pc, const char *pkg_type,
1205 const char *descriptor_path, const char *pkg_path,
1206 const char *optional_data, pkgmgr_mode mode,
1207 pkgmgr_handler event_cb, void *data)
1209 return pkgmgr_client_usr_install(pc, pkg_type, descriptor_path,
1210 pkg_path, optional_data, mode, event_cb,data,
1214 API int pkgmgr_client_reinstall(pkgmgr_client *pc, const char *pkg_type,
1215 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
1216 pkgmgr_handler event_cb, void *data)
1218 return pkgmgr_client_usr_reinstall(pc, pkg_type, pkgid, optional_data,
1219 mode, event_cb, data, _getuid());
1222 API int pkgmgr_client_usr_reinstall(pkgmgr_client * pc, const char *pkg_type,
1223 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
1224 pkgmgr_handler event_cb, void *data, uid_t uid)
1227 int ret = PKGMGR_R_ECOMM;
1228 char *req_key = NULL;
1230 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1232 pkgmgrinfo_pkginfo_h handle;
1234 if (pc == NULL || pkgid == NULL) {
1235 ERR("invalid parameter");
1236 return PKGMGR_R_EINVAL;
1239 if (mpc->ctype != PC_REQUEST) {
1240 ERR("mpc->ctype is not PC_REQUEST");
1241 return PKGMGR_R_EINVAL;
1244 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
1246 return PKGMGR_R_EINVAL;
1248 ret = pkgmgrinfo_pkginfo_get_type(handle, &pkgtype);
1250 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1251 return PKGMGR_R_ERROR;
1254 ret = comm_client_request(mpc->info.request.cc, "reinstall",
1255 g_variant_new("(uss)", uid, pkgtype, pkgid), &result);
1256 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1257 if (ret != PKGMGR_R_OK) {
1258 ERR("request failed: %d", ret);
1262 g_variant_get(result, "(i&s)", &ret, &req_key);
1263 if (req_key == NULL) {
1264 g_variant_unref(result);
1265 return PKGMGR_R_ECOMM;
1267 if (ret != PKGMGR_R_OK) {
1268 g_variant_unref(result);
1272 req_id = _get_request_id();
1273 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1275 g_variant_unref(result);
1280 API int pkgmgr_client_usr_mount_install(pkgmgr_client *pc, const char *pkg_type,
1281 const char *descriptor_path, const char *pkg_path,
1282 const char *optional_data, pkgmgr_mode mode,
1283 pkgmgr_handler event_cb, void *data, uid_t uid)
1286 int ret = PKGMGR_R_ECOMM;
1287 char *req_key = NULL;
1288 GVariantBuilder *builder = NULL;
1289 GVariant *args = NULL;
1291 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1294 if (pc == NULL || pkg_path == NULL) {
1295 ERR("invalid parameter");
1296 return PKGMGR_R_EINVAL;
1299 if (mpc->ctype != PC_REQUEST) {
1300 ERR("mpc->ctype is not PC_REQUEST");
1301 return PKGMGR_R_EINVAL;
1304 if (access(pkg_path, F_OK) != 0) {
1305 ERR("failed to access: %s", pkg_path);
1306 return PKGMGR_R_EINVAL;
1309 if (mpc->tep_path != NULL && access(mpc->tep_path, F_OK) != 0) {
1310 ERR("failed to access: %s", mpc->tep_path);
1311 return PKGMGR_R_EINVAL;
1314 /* TODO: check pkg's type on server-side */
1315 if (pkg_type == NULL)
1316 pkgtype = __get_type_from_path(pkg_path);
1318 pkgtype = strdup(pkg_type);
1320 /* build arguments */
1321 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1322 if (mpc->tep_path) {
1323 g_variant_builder_add(builder, "s", "-e");
1324 g_variant_builder_add(builder, "s", mpc->tep_path);
1325 g_variant_builder_add(builder, "s", "-M");
1326 g_variant_builder_add(builder, "s", mpc->tep_move);
1329 args = g_variant_new("as", builder);
1330 g_variant_builder_unref(builder);
1332 ret = comm_client_request(mpc->info.request.cc, "mount_install",
1333 g_variant_new("(uss@as)", uid, pkgtype, pkg_path, args),
1335 if (ret != PKGMGR_R_OK) {
1336 ERR("request failed: %d", ret);
1340 g_variant_get(result, "(i&s)", &ret, &req_key);
1341 if (req_key == NULL) {
1342 g_variant_unref(result);
1343 return PKGMGR_R_ECOMM;
1345 if (ret != PKGMGR_R_OK) {
1346 g_variant_unref(result);
1350 req_id = _get_request_id();
1351 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1353 g_variant_unref(result);
1358 API int pkgmgr_client_mount_install(pkgmgr_client *pc, const char *pkg_type,
1359 const char *descriptor_path, const char *pkg_path,
1360 const char *optional_data, pkgmgr_mode mode,
1361 pkgmgr_handler event_cb, void *data)
1363 return pkgmgr_client_usr_mount_install(pc, pkg_type, descriptor_path,
1364 pkg_path, optional_data, mode, event_cb,data,
1368 API int pkgmgr_client_uninstall(pkgmgr_client *pc, const char *pkg_type,
1369 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
1372 return pkgmgr_client_usr_uninstall(pc, pkg_type,pkgid, mode, event_cb,
1376 API int pkgmgr_client_usr_uninstall(pkgmgr_client *pc, const char *pkg_type,
1377 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
1378 void *data, uid_t uid)
1381 int ret = PKGMGR_R_ECOMM;
1382 char *req_key = NULL;
1384 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1386 pkgmgrinfo_pkginfo_h handle;
1388 if (pc == NULL || pkgid == NULL) {
1389 ERR("invalid parameter");
1390 return PKGMGR_R_EINVAL;
1393 if (mpc->ctype != PC_REQUEST) {
1394 ERR("mpc->ctype is not PC_REQUEST");
1395 return PKGMGR_R_EINVAL;
1398 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
1400 return PKGMGR_R_EINVAL;
1402 ret = pkgmgrinfo_pkginfo_get_type(handle, &pkgtype);
1404 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1405 return PKGMGR_R_ERROR;
1408 ret = comm_client_request(mpc->info.request.cc, "uninstall",
1409 g_variant_new("(uss)", uid, pkgtype, pkgid), &result);
1410 if (ret != PKGMGR_R_OK) {
1411 ERR("request failed: %d", ret);
1412 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1416 g_variant_get(result, "(i&s)", &ret, &req_key);
1417 if (req_key == NULL) {
1418 g_variant_unref(result);
1419 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1420 return PKGMGR_R_ECOMM;
1422 if (ret != PKGMGR_R_OK) {
1423 g_variant_unref(result);
1424 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1428 req_id = _get_request_id();
1429 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1431 g_variant_unref(result);
1432 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1437 API int pkgmgr_client_move(pkgmgr_client *pc, const char *pkg_type,
1438 const char *pkgid, pkgmgr_move_type move_type,
1439 pkgmgr_handler event_cb, void *data)
1441 return pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type,
1442 event_cb, data, _getuid());
1444 API int pkgmgr_client_usr_move(pkgmgr_client *pc, const char *pkg_type,
1445 const char *pkgid, pkgmgr_move_type move_type,
1446 pkgmgr_handler event_cb, void *data, uid_t uid)
1449 int ret = PKGMGR_R_ECOMM;
1451 char *req_key = NULL;
1452 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1454 if (pc == NULL || pkg_type == NULL || pkgid == NULL) {
1455 ERR("invalid parameter");
1456 return PKGMGR_R_EINVAL;
1459 if ((move_type < PM_MOVE_TO_INTERNAL) || (move_type > PM_MOVE_TO_SDCARD))
1460 return PKGMGR_R_EINVAL;
1462 if (mpc->ctype != PC_REQUEST) {
1463 ERR("mpc->ctype is not PC_REQUEST");
1464 return PKGMGR_R_EINVAL;
1467 ret = comm_client_request(mpc->info.request.cc, "move",
1468 g_variant_new("(ussi)", uid, pkg_type, pkgid, move_type), &result);
1469 if (ret != PKGMGR_R_OK) {
1470 ERR("request failed: %d", ret);
1474 g_variant_get(result, "(i&s)", &ret, &req_key);
1475 if (req_key == NULL) {
1476 g_variant_unref(result);
1477 return PKGMGR_R_ECOMM;
1479 if (ret != PKGMGR_R_OK) {
1480 g_variant_unref(result);
1484 req_id = _get_request_id();
1485 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1486 g_variant_unref(result);
1491 API int pkgmgr_client_usr_activate(pkgmgr_client *pc, const char *pkg_type,
1492 const char *pkgid, uid_t uid)
1495 int ret = PKGMGR_R_ECOMM;
1496 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1498 if (pc == NULL || pkgid == NULL || pkg_type == NULL) {
1499 ERR("invalid parameter");
1500 return PKGMGR_R_EINVAL;
1503 ret = comm_client_request(mpc->info.request.cc, "enable_pkg",
1504 g_variant_new("(uss)", uid, pkg_type, pkgid), &result);
1505 if (ret != PKGMGR_R_OK) {
1506 ERR("request failed: %d", ret);
1510 g_variant_get(result, "(i)", &ret);
1511 g_variant_unref(result);
1516 API int pkgmgr_client_activate(pkgmgr_client *pc, const char *pkg_type,
1519 return pkgmgr_client_usr_activate(pc, pkg_type, pkgid, _getuid());
1522 API int pkgmgr_client_usr_deactivate(pkgmgr_client *pc, const char *pkg_type,
1523 const char *pkgid, uid_t uid)
1526 int ret = PKGMGR_R_ECOMM;
1527 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1529 if (pc == NULL || pkgid == NULL || pkg_type == NULL) {
1530 ERR("invalid parameter");
1531 return PKGMGR_R_EINVAL;
1534 ret = comm_client_request(mpc->info.request.cc, "disable_pkg",
1535 g_variant_new("(uss)", uid, pkg_type, pkgid), &result);
1536 if (ret != PKGMGR_R_OK) {
1537 ERR("request failed: %d", ret);
1541 g_variant_get(result, "(i)", &ret);
1542 g_variant_unref(result);
1547 API int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type,
1550 return pkgmgr_client_usr_deactivate(pc, pkg_type, pkgid, _getuid());
1553 /* TODO: deprecate? */
1554 API int pkgmgr_client_usr_activate_appv(pkgmgr_client *pc, const char *appid,
1555 char *const argv[], uid_t uid)
1557 return pkgmgr_client_usr_activate_app(pc, appid, NULL, uid);
1560 API int pkgmgr_client_activate_appv(pkgmgr_client *pc, const char *appid,
1563 return pkgmgr_client_usr_activate_app(pc, appid, NULL, _getuid());
1566 API int pkgmgr_client_usr_activate_app(pkgmgr_client *pc, const char *appid,
1567 pkgmgr_app_handler app_event_cb, uid_t uid)
1570 int ret = PKGMGR_R_ECOMM;
1572 char *req_key = NULL;
1573 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1575 if (pc == NULL || appid == NULL) {
1576 ERR("invalid parameter");
1577 return PKGMGR_R_EINVAL;
1580 if (__change_op_cb_for_enable_disable(mpc, false) < 0) {
1581 ERR("__change_op_cb_for_enable_disable failed");
1582 return PKGMGR_R_ESYSTEM;
1585 ret = comm_client_request(mpc->info.request.cc, "enable_app",
1586 g_variant_new("(us)", uid, appid), &result);
1587 if (ret != PKGMGR_R_OK) {
1588 ERR("request failed: %d", ret);
1592 g_variant_get(result, "(i&s)", &ret, &req_key);
1593 if (req_key == NULL) {
1594 g_variant_unref(result);
1595 return PKGMGR_R_ECOMM;
1597 if (ret != PKGMGR_R_OK) {
1598 g_variant_unref(result);
1602 req_id = _get_request_id();
1603 __add_op_app_cbinfo(pc, req_id, req_key, app_event_cb, NULL);
1604 g_variant_unref(result);
1608 API int pkgmgr_client_activate_app(pkgmgr_client * pc, const char *appid, pkgmgr_app_handler app_event_cb)
1610 return pkgmgr_client_usr_activate_app(pc, appid, app_event_cb, _getuid());
1613 API int pkgmgr_client_activate_global_app_for_uid(pkgmgr_client *pc,
1614 const char *appid, pkgmgr_app_handler app_event_cb, uid_t uid)
1617 int ret = PKGMGR_R_ECOMM;
1619 char *req_key = NULL;
1620 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1622 if (pc == NULL || appid == NULL) {
1623 ERR("invalid parameter");
1624 return PKGMGR_R_EINVAL;
1627 if (__change_op_cb_for_enable_disable(mpc, false) < 0) {
1628 ERR("__change_op_cb_for_enable_disable failed");
1629 return PKGMGR_R_ESYSTEM;
1632 ret = comm_client_request(mpc->info.request.cc, "enable_global_app_for_uid",
1633 g_variant_new("(us)", uid, appid), &result);
1634 if (ret != PKGMGR_R_OK) {
1635 ERR("request failed: %d", ret);
1639 g_variant_get(result, "(i&s)", &ret, &req_key);
1640 if (req_key == NULL) {
1641 g_variant_unref(result);
1642 return PKGMGR_R_ECOMM;
1644 if (ret != PKGMGR_R_OK) {
1645 g_variant_unref(result);
1649 req_id = _get_request_id();
1650 __add_op_app_cbinfo(pc, req_id, req_key, app_event_cb, NULL);
1655 API int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid,
1656 pkgmgr_app_handler app_event_cb, uid_t uid)
1659 int ret = PKGMGR_R_ECOMM;
1660 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1662 char *req_key = NULL;
1664 if (pc == NULL || appid == NULL) {
1665 ERR("invalid parameter");
1666 return PKGMGR_R_EINVAL;
1670 if (__change_op_cb_for_enable_disable(mpc, true) < 0) {
1671 ERR("__change_op_cb_for_enable_disable failed");
1672 return PKGMGR_R_ESYSTEM;
1675 ret = comm_client_request(mpc->info.request.cc, "disable_app",
1676 g_variant_new("(us)", uid, appid), &result);
1677 if (ret != PKGMGR_R_OK) {
1678 ERR("request failed: %d", ret);
1682 g_variant_get(result, "(i&s)", &ret, &req_key);
1683 if (req_key == NULL) {
1684 g_variant_unref(result);
1685 return PKGMGR_R_ECOMM;
1687 if (ret != PKGMGR_R_OK) {
1688 g_variant_unref(result);
1692 req_id = _get_request_id();
1693 __add_op_app_cbinfo(pc, req_id, req_key, app_event_cb, NULL);
1695 g_variant_unref(result);
1699 API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid, pkgmgr_app_handler app_event_cb)
1701 return pkgmgr_client_usr_deactivate_app(pc, appid, app_event_cb, _getuid());
1704 API int pkgmgr_client_deactivate_global_app_for_uid(pkgmgr_client *pc,
1705 const char *appid, pkgmgr_app_handler app_event_cb, uid_t uid)
1708 int ret = PKGMGR_R_ECOMM;
1710 char *req_key = NULL;
1711 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1713 if (pc == NULL || appid == NULL) {
1714 ERR("invalid parameter");
1715 return PKGMGR_R_EINVAL;
1718 if (__change_op_cb_for_enable_disable(mpc, true) < 0) {
1719 ERR("__change_op_cb_for_enable_disable failed");
1720 return PKGMGR_R_ESYSTEM;
1723 ret = comm_client_request(mpc->info.request.cc, "disable_global_app_for_uid",
1724 g_variant_new("(us)", uid, appid), &result);
1725 if (ret != PKGMGR_R_OK) {
1726 ERR("request failed: %d", ret);
1730 g_variant_get(result, "(i&s)", &ret, &req_key);
1731 if (req_key == NULL) {
1732 g_variant_unref(result);
1733 return PKGMGR_R_ECOMM;
1735 if (ret != PKGMGR_R_OK) {
1736 g_variant_unref(result);
1740 req_id = _get_request_id();
1741 __add_op_app_cbinfo(pc, req_id, req_key, app_event_cb, NULL);
1745 API int pkgmgr_client_usr_clear_user_data(pkgmgr_client *pc,
1746 const char *pkg_type, const char *appid, pkgmgr_mode mode,
1750 int ret = PKGMGR_R_ECOMM;
1751 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1753 if (pc == NULL || pkg_type == NULL || appid == NULL) {
1754 ERR("invalid parameter");
1755 return PKGMGR_R_EINVAL;
1758 if (mpc->ctype != PC_REQUEST) {
1759 ERR("mpc->ctype is not PC_REQUEST");
1760 return PKGMGR_R_EINVAL;
1763 ret = comm_client_request(mpc->info.request.cc, "cleardata",
1764 g_variant_new("(uss)", uid, pkg_type, appid), &result);
1765 if (ret == PKGMGR_R_OK) {
1766 ERR("request failed: %d", ret);
1770 g_variant_get(result, "(i)", &ret);
1771 g_variant_unref(result);
1776 API int pkgmgr_client_clear_user_data(pkgmgr_client *pc, const char *pkg_type,
1777 const char *appid, pkgmgr_mode mode)
1779 return pkgmgr_client_usr_clear_user_data(pc, pkg_type, appid, mode,
1783 API int pkgmgr_client_set_status_type(pkgmgr_client *pc, int status_type)
1787 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1788 retvm_if(status_type == PKGMGR_CLIENT_STATUS_ALL, PKGMGR_R_OK, "status_type is PKGMGR_CLIENT_STATUS_ALL");
1789 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1791 /* free listening head */
1792 listen_cb_info *tmp = NULL;
1793 listen_cb_info *prev = NULL;
1794 for (tmp = mpc->info.listening.lhead; tmp;) {
1800 /* free dbus connection */
1801 ret = comm_client_free(mpc->info.listening.cc);
1802 retvm_if(ret < 0, PKGMGR_R_ERROR, "comm_client_free() failed - %d", ret);
1804 /* Manage pc for seperated event */
1805 mpc->ctype = PC_LISTENING;
1806 mpc->status_type = status_type;
1808 mpc->info.listening.cc = comm_client_new();
1809 retvm_if(mpc->info.listening.cc == NULL, PKGMGR_R_EINVAL, "client creation failed");
1811 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_INSTALL) == PKGMGR_CLIENT_STATUS_INSTALL) {
1812 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_INSTALL, mpc->info.listening.cc, __status_callback, pc);
1813 retvm_if(ret < 0, PKGMGR_R_ECOMM, "PKGMGR_CLIENT_STATUS_INSTALL failed - %d", ret);
1816 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_UNINSTALL) == PKGMGR_CLIENT_STATUS_UNINSTALL) {
1817 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_UNINSTALL, mpc->info.listening.cc, __status_callback, pc);
1818 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_UNINSTALL failed - %d", ret);
1821 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_MOVE) == PKGMGR_CLIENT_STATUS_MOVE) {
1822 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_MOVE, mpc->info.listening.cc, __status_callback, pc);
1823 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_MOVE failed - %d", ret);
1826 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_INSTALL_PROGRESS) == PKGMGR_CLIENT_STATUS_INSTALL_PROGRESS) {
1827 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_INSTALL_PROGRESS, mpc->info.listening.cc, __status_callback, pc);
1828 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_INSTALL_PROGRESS failed - %d", ret);
1831 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_UPGRADE) == PKGMGR_CLIENT_STATUS_UPGRADE) {
1832 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_UPGRADE, mpc->info.listening.cc, __status_callback, pc);
1833 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_UPGRADE failed - %d", ret);
1836 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_ENABLE_APP) == PKGMGR_CLIENT_STATUS_ENABLE_APP) {
1837 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ENABLE_APP, mpc->info.listening.cc, __status_callback, pc);
1838 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_ENABLE_APP failed - %d", ret);
1841 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_DISABLE_APP) == PKGMGR_CLIENT_STATUS_DISABLE_APP) {
1842 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_DISABLE_APP, mpc->info.listening.cc, __status_callback, pc);
1843 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_DISABLE_APP failed - %d", ret);
1846 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_ENABLE_APP_SPLASH_SCREEN) == PKGMGR_CLIENT_STATUS_ENABLE_APP_SPLASH_SCREEN) {
1847 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ENABLE_APP_SPLASH_SCREEN, mpc->info.listening.cc, __status_callback, pc);
1848 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_ENABLE_APP_SPLASH_SCREEN failed - %d", ret);
1851 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_DISABLE_APP_SPLASH_SCREEN) == PKGMGR_CLIENT_STATUS_DISABLE_APP_SPLASH_SCREEN) {
1852 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_DISABLE_APP_SPLASH_SCREEN, mpc->info.listening.cc, __status_callback, pc);
1853 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_DISABLE_APP_SPLASH_SCREEN failed - %d", ret);
1859 API int pkgmgr_client_listen_status(pkgmgr_client *pc, pkgmgr_handler event_cb,
1863 /* Check for NULL value of pc */
1864 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1865 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1867 /* 0. check input */
1868 retvm_if(mpc->ctype != PC_LISTENING, PKGMGR_R_EINVAL, "ctype is not PC_LISTENING");
1869 retvm_if(event_cb == NULL, PKGMGR_R_EINVAL, "event_cb is NULL");
1872 req_id = _get_request_id();
1874 /* 2. add callback info to pkgmgr_client */
1875 __add_stat_cbinfo(mpc, req_id, event_cb, data);
1879 API int pkgmgr_client_listen_app_status(pkgmgr_client *pc, pkgmgr_app_handler event_cb,
1883 /* Check for NULL value of pc */
1884 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1885 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1887 /* 0. check input */
1888 retvm_if(mpc->ctype != PC_LISTENING, PKGMGR_R_EINVAL, "ctype is not PC_LISTENING");
1889 retvm_if(event_cb == NULL, PKGMGR_R_EINVAL, "event_cb is NULL");
1892 req_id = _get_request_id();
1894 /* 2. add app callback info to pkgmgr_client */
1895 __add_app_stat_cbinfo(mpc, req_id, event_cb, data);
1899 API int pkgmgr_client_remove_listen_status(pkgmgr_client *pc)
1903 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1904 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1906 ret = __remove_stat_cbinfo(mpc);
1908 ERR("failed to remove status callback");
1909 return PKGMGR_R_ERROR;
1915 API int pkgmgr_client_broadcast_status(pkgmgr_client *pc, const char *pkg_type,
1916 const char *pkgid, const char *key,
1919 /* client cannot broadcast signal */
1923 API int pkgmgr_client_request_service(pkgmgr_request_service_type service_type, int service_mode,
1924 pkgmgr_client * pc, const char *pkg_type, const char *pkgid,
1925 const char *custom_info, pkgmgr_handler event_cb, void *data)
1927 return pkgmgr_client_usr_request_service(service_type, service_mode, pc, pkg_type, pkgid, _getuid(), custom_info, event_cb, data);
1930 API int pkgmgr_client_usr_request_service(pkgmgr_request_service_type service_type, int service_mode,
1931 pkgmgr_client * pc, const char *pkg_type, const char *pkgid, uid_t uid,
1932 const char *custom_info, pkgmgr_handler event_cb, void *data)
1936 /* Check for NULL value of service type */
1937 retvm_if(service_type > PM_REQUEST_MAX, PKGMGR_R_EINVAL, "service type is not defined\n");
1938 retvm_if(service_type < 0, PKGMGR_R_EINVAL, "service type is error\n");
1940 switch (service_type) {
1941 case PM_REQUEST_CSC:
1942 tryvm_if(custom_info == NULL, ret = PKGMGR_R_EINVAL, "custom_info is NULL\n");
1943 tryvm_if(strlen(custom_info) >= PKG_STRING_LEN_MAX, ret = PKGMGR_R_EINVAL, "custom_info over PKG_STRING_LEN_MAX");
1944 tryvm_if(data == NULL, ret = PKGMGR_R_EINVAL, "data is NULL\n");
1946 ret = __csc_process(custom_info, (char *)data);
1948 ERR("__csc_process fail \n");
1954 case PM_REQUEST_MOVE:
1955 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1956 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1957 tryvm_if((service_mode < PM_MOVE_TO_INTERNAL) || (service_mode > PM_MOVE_TO_SDCARD), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1959 ret = __move_pkg_process(pc, pkgid, pkg_type, uid, (pkgmgr_move_type)service_mode, event_cb, data);
1962 case PM_REQUEST_GET_SIZE:
1963 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1964 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1965 tryvm_if((service_mode < PM_GET_TOTAL_SIZE) || (service_mode >= PM_GET_MAX), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1967 ret = __get_size_process(pc, pkgid, uid, (pkgmgr_getsize_type)service_mode, event_cb, data);
1970 case PM_REQUEST_KILL_APP:
1971 case PM_REQUEST_CHECK_APP:
1972 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1973 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1975 ret = __check_app_process(service_type, pc, pkgid, uid, data);
1977 ERR("__check_app_process fail \n");
1984 ERR("Wrong Request\n");
1995 API int pkgmgr_client_usr_request_size_info(uid_t uid)
1998 pkgmgr_client *pc = NULL;
2000 pc = pkgmgr_client_new(PC_REQUEST);
2001 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "request pc is null\n");
2003 ret = __request_size_info(pc, uid);
2005 ERR("__request_size_info fail \n");
2008 pkgmgr_client_free(pc);
2012 API int pkgmgr_client_request_size_info(void) // get all package size (data, total)
2014 return pkgmgr_client_usr_request_size_info(_getuid());
2017 API int pkgmgr_client_usr_clear_cache_dir(const char *pkgid, uid_t uid)
2020 int ret = PKGMGR_R_ECOMM;
2021 pkgmgr_client_t *pc;
2023 if (pkgid == NULL) {
2024 ERR("invalid parameter");
2025 return PKGMGR_R_EINVAL;
2028 pc = pkgmgr_client_new(PC_REQUEST);
2030 ERR("out of memory");
2031 return PKGMGR_R_ESYSTEM;
2034 ret = comm_client_request(pc->info.request.cc, "clearcache",
2035 g_variant_new("(us)", uid, pkgid), &result);
2036 if (ret != PKGMGR_R_OK) {
2037 ERR("request failed: %d", ret);
2041 g_variant_get(result, "(i)", &ret);
2042 g_variant_unref(result);
2047 API int pkgmgr_client_clear_cache_dir(const char *pkgid)
2049 return pkgmgr_client_usr_clear_cache_dir(pkgid, _getuid());
2052 API int pkgmgr_client_clear_usr_all_cache_dir(uid_t uid)
2054 return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, uid);
2057 API int pkgmgr_client_clear_all_cache_dir(void)
2059 return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, _getuid());
2062 API int pkgmgr_client_get_size(pkgmgr_client * pc, const char *pkgid,
2063 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
2066 return pkgmgr_client_usr_get_size(pc, pkgid, get_type, event_cb, data,
2070 API int pkgmgr_client_usr_get_size(pkgmgr_client * pc, const char *pkgid,
2071 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
2072 void *data, uid_t uid)
2075 int ret = PKGMGR_R_ECOMM;
2076 char *req_key = NULL;
2078 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2080 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
2081 ERR("invalid parameter");
2082 return PKGMGR_R_EINVAL;
2085 if (mpc->ctype != PC_REQUEST) {
2086 ERR("mpc->ctype is not PC_REQUEST");
2087 return PKGMGR_R_EINVAL;
2091 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
2092 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
2094 get_type = PM_GET_PKG_SIZE_INFO;
2096 ret = comm_client_request(mpc->info.request.cc, "getsize",
2097 g_variant_new("(usi)", uid, pkgid, get_type), &result);
2098 if (ret != PKGMGR_R_OK) {
2099 ERR("request failed: %d", ret);
2103 g_variant_get(result, "(i&s)", &ret, &req_key);
2104 if (req_key == NULL) {
2105 g_variant_unref(result);
2106 return PKGMGR_R_ECOMM;
2108 if (ret != PKGMGR_R_OK) {
2109 g_variant_unref(result);
2113 req_id = _get_request_id();
2114 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
2116 g_variant_unref(result);
2121 API int pkgmgr_client_usr_get_package_size_info(pkgmgr_client *pc,
2122 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
2123 void *user_data, uid_t uid)
2126 int ret = PKGMGR_R_ECOMM;
2127 char *req_key = NULL;
2130 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2132 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
2133 ERR("invalid parameter");
2134 return PKGMGR_R_EINVAL;
2137 if (mpc->ctype != PC_REQUEST) {
2138 ERR("mpc->ctype is not PC_REQUEST");
2139 return PKGMGR_R_EINVAL;
2143 if (__change_op_cb_for_getsize(mpc) < 0) {
2144 ERR("__change_op_cb_for_getsize failed");
2145 return PKGMGR_R_ESYSTEM;
2148 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
2149 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
2151 get_type = PM_GET_PKG_SIZE_INFO;
2153 ret = comm_client_request(mpc->info.request.cc, "getsize",
2154 g_variant_new("(usi)", uid, pkgid, get_type), &result);
2155 if (ret != PKGMGR_R_OK) {
2156 ERR("request failed: %d", ret);
2160 g_variant_get(result, "(i&s)", &ret, &req_key);
2161 if (req_key == NULL) {
2162 g_variant_unref(result);
2163 return PKGMGR_R_ECOMM;
2165 if (ret != PKGMGR_R_OK) {
2166 g_variant_unref(result);
2170 req_id = _get_request_id();
2171 __add_op_cbinfo(mpc, req_id, req_key, __get_pkg_size_info_cb, event_cb,
2174 g_variant_unref(result);
2179 API int pkgmgr_client_get_package_size_info(pkgmgr_client *pc, const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb, void *user_data)
2181 return pkgmgr_client_usr_get_package_size_info(pc, pkgid, event_cb, user_data, _getuid());
2184 API int pkgmgr_client_usr_get_total_package_size_info(pkgmgr_client *pc, pkgmgr_total_pkg_size_info_receive_cb event_cb, void *user_data, uid_t uid)
2185 { // total package size info
2186 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL, (pkgmgr_pkg_size_info_receive_cb)event_cb, user_data, uid);
2189 API int pkgmgr_client_get_total_package_size_info(pkgmgr_client *pc, pkgmgr_total_pkg_size_info_receive_cb event_cb, void *user_data)
2191 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL, (pkgmgr_pkg_size_info_receive_cb)event_cb, user_data, _getuid());
2194 API int pkgmgr_client_generate_license_request(pkgmgr_client *pc,
2195 const char *resp_data, char **req_data, char **license_url)
2201 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2203 if (pc == NULL || resp_data == NULL || req_data == NULL ||
2204 license_url == NULL) {
2205 ERR("invalid parameter");
2206 return PKGMGR_R_EINVAL;
2209 if (mpc->ctype != PC_REQUEST) {
2210 ERR("mpc->ctype is not PC_REQUEST");
2211 return PKGMGR_R_EINVAL;
2214 ret = comm_client_request(mpc->info.request.cc,
2215 "generate_license_request",
2216 g_variant_new("(s)", resp_data), &result);
2217 if (ret != PKGMGR_R_OK) {
2218 ERR("request failed: %d", ret);
2222 g_variant_get(result, "(i&s&s)", &ret, &data, &url);
2223 if (ret != PKGMGR_R_OK) {
2224 ERR("generate_license_request failed: %d", ret);
2225 g_variant_unref(result);
2229 *req_data = strdup(data);
2230 *license_url = strdup(url);
2232 g_variant_unref(result);
2237 API int pkgmgr_client_register_license(pkgmgr_client *pc, const char *resp_data)
2241 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2243 if (pc == NULL || resp_data == NULL) {
2244 ERR("invalid parameter");
2245 return PKGMGR_R_EINVAL;
2248 if (mpc->ctype != PC_REQUEST) {
2249 ERR("mpc->ctype is not PC_REQUEST");
2250 return PKGMGR_R_EINVAL;
2253 ret = comm_client_request(mpc->info.request.cc,
2254 "register_license", g_variant_new("(s)", resp_data),
2256 if (ret != PKGMGR_R_OK) {
2257 ERR("request failed: %d", ret);
2261 g_variant_get(result, "(i)", &ret);
2262 g_variant_unref(result);
2263 if (ret != PKGMGR_R_OK) {
2264 ERR("register license failed: %d", ret);
2271 API int pkgmgr_client_decrypt_package(pkgmgr_client *pc,
2272 const char *drm_file_path, const char *decrypted_file_path)
2276 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2278 if (pc == NULL || drm_file_path == NULL ||
2279 decrypted_file_path == NULL) {
2280 ERR("invalid parameter");
2281 return PKGMGR_R_EINVAL;
2284 if (mpc->ctype != PC_REQUEST) {
2285 ERR("mpc->ctype is not PC_REQUEST");
2286 return PKGMGR_R_EINVAL;
2289 ret = comm_client_request(mpc->info.request.cc,
2291 g_variant_new("(ss)", drm_file_path,
2292 decrypted_file_path),
2294 if (ret != PKGMGR_R_OK) {
2295 ERR("request failed: %d", ret);
2299 g_variant_get(result, "(i)", &ret);
2300 g_variant_unref(result);
2301 if (ret != PKGMGR_R_OK) {
2302 ERR("decrypt_package failed: %d", ret);
2309 API int pkgmgr_client_enable_splash_screen(pkgmgr_client *pc, const char *appid)
2311 return pkgmgr_client_usr_enable_splash_screen(pc, appid, _getuid());
2314 API int pkgmgr_client_usr_enable_splash_screen(pkgmgr_client *pc,
2315 const char *appid, uid_t uid)
2319 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2321 if (pc == NULL || appid == NULL) {
2322 ERR("Invalid parameter");
2323 return PKGMGR_R_EINVAL;
2326 ret = __change_op_cb_for_enable_disable_splash_screen(mpc, true);
2328 ERR("__change_op_cb_for_enable_disable_splash_screen failed");
2329 return PKGMGR_R_ESYSTEM;
2332 ret = comm_client_request(mpc->info.request.cc,
2333 "enable_app_splash_screen",
2334 g_variant_new("(us)", uid, appid), &result);
2335 if (ret != PKGMGR_R_OK) {
2336 ERR("request failed: %d", ret);
2340 g_variant_get(result, "(i)", &ret);
2341 if (ret != PKGMGR_R_OK) {
2342 g_variant_unref(result);
2346 g_variant_unref(result);
2351 API int pkgmgr_client_disable_splash_screen(pkgmgr_client *pc,
2354 return pkgmgr_client_usr_disable_splash_screen(pc, appid,
2358 API int pkgmgr_client_usr_disable_splash_screen(pkgmgr_client *pc,
2359 const char *appid, uid_t uid)
2363 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2365 if (pc == NULL || appid == NULL) {
2366 ERR("Invalid parameter");
2367 return PKGMGR_R_EINVAL;
2370 ret = __change_op_cb_for_enable_disable_splash_screen(mpc, false);
2372 ERR("__change_op_cb_for_enable_disable_splash_screen failed");
2376 ret = comm_client_request(mpc->info.request.cc,
2377 "disable_app_splash_screen",
2378 g_variant_new("(us)", uid, appid), &result);
2379 if (ret != PKGMGR_R_OK) {
2380 ERR("request failed: %d", ret);
2384 g_variant_get(result, "(i)", &ret);
2385 if (ret != PKGMGR_R_OK) {
2386 g_variant_unref(result);
2390 g_variant_unref(result);
2395 static int __set_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int mode, uid_t uid)
2398 int ret = PKGMGR_R_ECOMM;
2399 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2401 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
2402 ERR("invalid parameter");
2403 return PKGMGR_R_EINVAL;
2406 ret = comm_client_request(mpc->info.request.cc, "set_restriction_mode",
2407 g_variant_new("(usi)", uid, pkgid, mode), &result);
2408 if (ret != PKGMGR_R_OK) {
2409 ERR("request failed: %d", ret);
2413 g_variant_get(result, "(i)", &ret);
2414 g_variant_unref(result);
2419 API int pkgmgr_client_usr_set_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int mode, uid_t uid)
2421 return __set_pkg_restriction_mode(pc, pkgid, mode, uid);
2424 API int pkgmgr_client_set_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int mode)
2426 return pkgmgr_client_usr_set_pkg_restriction_mode(pc, pkgid, mode, _getuid());
2429 static int __unset_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int mode, uid_t uid)
2432 int ret = PKGMGR_R_ECOMM;
2433 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2435 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
2436 ERR("invalid parameter");
2437 return PKGMGR_R_EINVAL;
2440 ret = comm_client_request(mpc->info.request.cc,
2441 "unset_restriction_mode",
2442 g_variant_new("(usi)", uid, pkgid, mode), &result);
2443 if (ret != PKGMGR_R_OK) {
2444 ERR("request failed: %d", ret);
2448 g_variant_get(result, "(i)", &ret);
2449 g_variant_unref(result);
2455 API int pkgmgr_client_usr_unset_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int mode, uid_t uid)
2457 return __unset_pkg_restriction_mode(pc, pkgid, mode, uid);
2460 API int pkgmgr_client_unset_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int mode)
2462 return pkgmgr_client_usr_unset_pkg_restriction_mode(pc, pkgid, mode, _getuid());
2465 static int __get_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int *mode, uid_t uid)
2468 int ret = PKGMGR_R_ECOMM;
2470 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2472 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0) {
2473 ERR("invalid parameter");
2474 return PKGMGR_R_EINVAL;
2477 ret = comm_client_request(mpc->info.request.cc,
2478 "get_restriction_mode",
2479 g_variant_new("(us)", uid, pkgid), &result);
2480 if (ret != PKGMGR_R_OK) {
2481 ERR("request failed: %d", ret);
2485 g_variant_get(result, "(ii)", &m, &ret);
2486 g_variant_unref(result);
2487 if (ret != PKGMGR_R_OK)
2495 API int pkgmgr_client_usr_get_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int *mode, uid_t uid)
2497 return __get_pkg_restriction_mode(pc, pkgid, mode, uid);
2500 API int pkgmgr_client_get_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int *mode)
2502 return pkgmgr_client_usr_get_pkg_restriction_mode(pc, pkgid, mode, _getuid());
2505 API int pkgmgr_client_usr_set_restriction_mode(pkgmgr_client *pc, int mode,
2509 int ret = PKGMGR_R_ECOMM;
2510 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2513 ERR("invalid parameter");
2514 return PKGMGR_R_EINVAL;
2517 ret = comm_client_request(mpc->info.request.cc, "set_restriction_mode",
2518 g_variant_new("(usi)", uid, "", mode), &result);
2519 if (ret != PKGMGR_R_OK) {
2520 ERR("request failed: %d", ret);
2524 g_variant_get(result, "(i)", &ret);
2525 g_variant_unref(result);
2530 API int pkgmgr_client_set_restriction_mode(pkgmgr_client *pc, int mode)
2532 return pkgmgr_client_usr_set_restriction_mode(pc, mode, _getuid());
2535 API int pkgmgr_client_usr_unset_restriction_mode(pkgmgr_client *pc, int mode,
2539 int ret = PKGMGR_R_ECOMM;
2540 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2543 ERR("invalid parameter");
2544 return PKGMGR_R_EINVAL;
2547 ret = comm_client_request(mpc->info.request.cc,
2548 "unset_restriction_mode",
2549 g_variant_new("(usi)", uid, "", mode), &result);
2550 if (ret != PKGMGR_R_OK) {
2551 ERR("request failed: %d", ret);
2555 g_variant_get(result, "(i)", &ret);
2556 g_variant_unref(result);
2561 API int pkgmgr_client_unset_restriction_mode(pkgmgr_client *pc, int mode)
2563 return pkgmgr_client_usr_unset_restriction_mode(pc, mode, _getuid());
2566 API int pkgmgr_client_usr_get_restriction_mode(pkgmgr_client *pc,
2567 int *mode, uid_t uid)
2570 int ret = PKGMGR_R_ECOMM;
2572 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2575 ERR("invalid parameter");
2576 return PKGMGR_R_EINVAL;
2579 ret = comm_client_request(mpc->info.request.cc,
2580 "get_restriction_mode",
2581 g_variant_new("(us)", uid, ""), &result);
2582 if (ret != PKGMGR_R_OK) {
2583 ERR("request failed: %d", ret);
2587 g_variant_get(result, "(ii)", &m, &ret);
2588 g_variant_unref(result);
2589 if (ret != PKGMGR_R_OK)
2597 API int pkgmgr_client_get_restriction_mode(pkgmgr_client *pc,
2600 return pkgmgr_client_usr_get_restriction_mode(pc, mode, _getuid());