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);
536 if (access(info_file, F_OK) == 0) {
537 fp = fopen(info_file, "r");
539 DBG("file is not generated yet.... wait\n");
540 usleep(100 * 1000); /* 100ms sleep*/
544 if (fgets(buf, PKG_STRING_LEN_MAX, fp) == NULL) {
545 ERR("failed to read info file");
551 DBG("info_file file is generated, result = %s. \n", buf);
556 DBG("file is not generated yet.... wait\n");
557 usleep(100 * 1000); /* 100ms sleep*/
559 if (check_cnt > 6000) { /* 60s * 10 time over*/
560 ERR("wait time over!!\n");
565 ret = remove(info_file);
567 ERR("file is can not remove[%s, %d]\n", info_file, ret);
572 static int __csc_process(const char *csc_path, char *result_path)
579 char *pkgtype = NULL;
581 char buf[PKG_STRING_LEN_MAX] = {0,};
582 char type_buf[1024] = { 0 };
583 char des_buf[1024] = { 0 };
584 dictionary *csc = NULL;
587 csc = iniparser_load(csc_path);
588 retvm_if(csc == NULL, PKGMGR_R_EINVAL, "cannot open parse file [%s]", csc_path);
590 file = fopen(result_path, "w");
591 tryvm_if(file == NULL, ret = PKGMGR_R_EINVAL, "cannot open result file [%s]", result_path);
593 count = iniparser_getint(csc, "csc packages:count", -1);
594 tryvm_if(count == 0, ret = PKGMGR_R_ERROR, "csc [%s] dont have packages", csc_path);
596 snprintf(buf, PKG_STRING_LEN_MAX, "[result]\n");
597 fwrite(buf, 1, strlen(buf), file);
598 snprintf(buf, PKG_STRING_LEN_MAX, "count = %d\n", count);
599 fwrite(buf, 1, strlen(buf), file);
601 for (cnt = 1 ; cnt <= count ; cnt++) {
602 snprintf(type_buf, PKG_STRING_LEN_MAX - 1, "csc packages:type_%03d", cnt);
603 snprintf(des_buf, PKG_STRING_LEN_MAX - 1, "csc packages:description_%03d", cnt);
605 pkgtype = iniparser_getstring(csc, type_buf, NULL);
606 des = iniparser_getstring(csc, des_buf, NULL);
609 if (pkgtype == NULL) {
611 snprintf(buf, PKG_STRING_LEN_MAX, "%s = Fail to get pkgtype\n", type_buf);
612 fwrite(buf, 1, strlen(buf), file);
614 } else if (des == NULL) {
616 snprintf(buf, PKG_STRING_LEN_MAX, "%s = Fail to get description\n", des_buf);
617 fwrite(buf, 1, strlen(buf), file);
621 snprintf(buf, PKG_STRING_LEN_MAX, "type_%03d = %s\n", cnt, pkgtype);
622 fwrite(buf, 1, strlen(buf), file);
623 snprintf(buf, PKG_STRING_LEN_MAX, "description_%03d = %s\n", cnt, des);
624 fwrite(buf, 1, strlen(buf), file);
626 if (strcmp(pkgtype, "tpk") == 0) {
627 const char *ospinstaller_argv[] = { "/usr/bin/osp-installer", "-c", des, NULL };
628 ret = __xsystem(ospinstaller_argv);
629 } else if (strcmp(pkgtype, "wgt") == 0) {
630 const char *wrtinstaller_argv[] = { "/usr/bin/wrt-installer", "-c", des, NULL };
631 ret = __xsystem(wrtinstaller_argv);
639 __error_to_string(ret, &errstr);
640 snprintf(buf, PKG_STRING_LEN_MAX, "result_%03d = fail[%s]\n", cnt, errstr);
642 snprintf(buf, PKG_STRING_LEN_MAX, "result_%03d = success\n", cnt);
645 fwrite(buf, 1, strlen(buf), file);
649 iniparser_freedict(csc);
659 static int __get_size_process(pkgmgr_client *pc, const char *pkgid, uid_t uid,
660 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
664 int ret = PKGMGR_R_ECOMM;
665 char *req_key = NULL;
666 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
668 if (pc == NULL || pkgid == NULL) {
669 ERR("invalid parameter");
670 return PKGMGR_R_EINVAL;
673 if (mpc->ctype != PC_REQUEST) {
674 ERR("mpc->ctype is not PC_REQUEST");
675 return PKGMGR_R_EINVAL;
678 ret = comm_client_request(mpc->info.request.cc, "getsize",
679 g_variant_new("(usi)", uid, pkgid, get_type), &result);
680 if (ret != PKGMGR_R_OK) {
681 ERR("request failed: %d", ret);
685 g_variant_get(result, "(i&s)", &ret, &req_key);
686 if (req_key == NULL) {
687 g_variant_unref(result);
688 return PKGMGR_R_ECOMM;
690 if (ret != PKGMGR_R_OK) {
691 g_variant_unref(result);
695 ret = __sync_process(req_key);
697 ERR("get size failed, ret=%d\n", ret);
699 g_variant_unref(result);
704 static int __move_pkg_process(pkgmgr_client *pc, const char *pkgid,
705 const char *pkg_type, uid_t uid, pkgmgr_move_type move_type,
706 pkgmgr_handler event_cb, void *data)
710 ret = pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type, event_cb, data, uid);
712 ERR("move request failed");
719 static int __check_app_process(pkgmgr_request_service_type service_type,
720 pkgmgr_client *pc, const char *pkgid, uid_t uid, void *data)
723 int ret = PKGMGR_R_ECOMM;
724 pkgmgrinfo_pkginfo_h handle;
726 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
728 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST\n");
730 if (uid != GLOBAL_USER)
731 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
733 ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle);
734 retvm_if(ret < 0, PKGMGR_R_ERROR, "pkgmgrinfo_pkginfo_get_pkginfo failed");
736 if (service_type == PM_REQUEST_KILL_APP)
737 ret = comm_client_request(mpc->info.request.cc, "kill",
738 g_variant_new("(us)", uid, pkgid), &result);
739 else if (service_type == PM_REQUEST_CHECK_APP)
740 ret = comm_client_request(mpc->info.request.cc, "check",
741 g_variant_new("(us)", uid, pkgid), &result);
742 if (ret != PKGMGR_R_OK) {
743 ERR("request failed: %d", ret);
747 g_variant_get(result, "(i)", &ret);
748 g_variant_unref(result);
749 if (ret != PKGMGR_R_OK) {
750 ERR("request failed, ret=%d", ret);
755 pid = __sync_process(pkgid);
758 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
764 static int __request_size_info(pkgmgr_client *pc, uid_t uid)
767 int ret = PKGMGR_R_ECOMM;
768 char *req_key = NULL;
769 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
772 ERR("invalid parameter");
773 return PKGMGR_R_EINVAL;
776 if (mpc->ctype != PC_REQUEST) {
777 ERR("mpc->ctype is not PC_REQUEST");
778 return PKGMGR_R_EINVAL;
781 ret = comm_client_request(mpc->info.request.cc, "getsize",
782 g_variant_new("(usi)", uid, "size_info",
785 if (ret != PKGMGR_R_OK) {
786 ERR("request failed: %d", ret);
790 g_variant_get(result, "(i&s)", &ret, &req_key);
791 if (req_key == NULL) {
792 g_variant_unref(result);
793 return PKGMGR_R_ECOMM;
796 g_variant_unref(result);
801 static int __change_op_cb_for_getsize(pkgmgr_client *pc)
805 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
806 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
808 /* free listening head */
809 req_cb_info *tmp = NULL;
810 req_cb_info *prev = NULL;
811 for (tmp = mpc->info.request.rhead; tmp;) {
817 /* free dbus connection */
818 ret = comm_client_free(mpc->info.request.cc);
819 retvm_if(ret < 0, PKGMGR_R_ERROR, "comm_client_free() failed - %d", ret);
821 /* Manage pc for seperated event */
822 mpc->ctype = PC_REQUEST;
823 mpc->status_type = PKGMGR_CLIENT_STATUS_GET_SIZE;
826 mpc->info.request.cc = comm_client_new(PC_REQUEST);
827 retvm_if(mpc->info.request.cc == NULL, PKGMGR_R_ERROR, "client creation failed");
829 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_GET_SIZE, mpc->info.request.cc, __operation_callback, pc);
830 retvm_if(ret < 0, PKGMGR_R_ERROR, "set_status_callback() failed - %d", ret);
835 static int __change_op_cb_for_enable_disable(pkgmgr_client *pc, bool is_disable)
839 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
840 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
842 /* free listening head */
843 req_cb_info *tmp = NULL;
844 req_cb_info *prev = NULL;
845 for (tmp = mpc->info.request.rhead; tmp;) {
851 /* free dbus connection */
852 ret = comm_client_free(mpc->info.request.cc);
853 retvm_if(ret < 0, PKGMGR_R_ERROR, "comm_client_free() failed - %d", ret);
855 /* Manage pc for seperated event */
856 mpc->ctype = PC_REQUEST;
858 mpc->status_type = PKGMGR_CLIENT_STATUS_DISABLE_APP;
860 mpc->status_type = PKGMGR_CLIENT_STATUS_ENABLE_APP;
863 mpc->info.request.cc = comm_client_new(PC_REQUEST);
864 retvm_if(mpc->info.request.cc == NULL, PKGMGR_R_ERROR, "client creation failed");
867 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_DISABLE_APP, mpc->info.request.cc, __operation_callback, pc);
869 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ENABLE_APP, mpc->info.request.cc, __operation_callback, pc);
870 retvm_if(ret < 0, PKGMGR_R_ERROR, "set_status_callback() failed - %d", ret);
875 static int __get_pkg_size_info_cb(uid_t target_uid, int req_id, const char *req_type,
876 const char *pkgid, const char *key,
877 const char *value, const void *pc, void *user_data)
880 DBG("target_uid: %u, reqid: %d, req type: %s, pkgid: %s, unused key: %s, size info: %s",
881 target_uid, req_id, req_type, pkgid, key, value);
883 pkg_size_info_t *size_info = (pkg_size_info_t *)malloc(sizeof(pkg_size_info_t));
884 retvm_if(size_info == NULL, -1, "The memory is insufficient.");
886 char *save_ptr = NULL;
887 char *token = strtok_r((char *)value, ":", &save_ptr);
888 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
889 size_info->data_size = atoll(token);
890 token = strtok_r(NULL, ":", &save_ptr);
891 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
892 size_info->cache_size = atoll(token);
893 token = strtok_r(NULL, ":", &save_ptr);
894 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
895 size_info->app_size = atoll(token);
896 token = strtok_r(NULL, ":", &save_ptr);
897 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
898 size_info->ext_data_size = atoll(token);
899 token = strtok_r(NULL, ":", &save_ptr);
900 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
901 size_info->ext_cache_size = atoll(token);
902 token = strtok_r(NULL, ":", &save_ptr);
903 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
904 size_info->ext_app_size = atoll(token);
906 DBG("data: %lld, cache: %lld, app: %lld, ext_data: %lld, ext_cache: %lld, ext_app: %lld",
907 size_info->data_size, size_info->cache_size, size_info->app_size,
908 size_info->ext_data_size, size_info->ext_cache_size, size_info->ext_app_size);
910 pkgmgr_client_t *pmc = (pkgmgr_client_t *)pc;
911 tryvm_if(pmc == NULL, ret = -1, "pkgmgr_client instance is null.");
913 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0) { /* total package size info */
914 pkgmgr_total_pkg_size_info_receive_cb callback = (pkgmgr_total_pkg_size_info_receive_cb)(pmc->new_event_cb);
915 callback((pkgmgr_client *)pc, size_info, user_data);
917 pkgmgr_pkg_size_info_receive_cb callback = (pkgmgr_pkg_size_info_receive_cb)(pmc->new_event_cb);
918 callback((pkgmgr_client *)pc, pkgid, size_info, user_data);
930 API pkgmgr_client *pkgmgr_client_new(client_type ctype)
932 pkgmgr_client_t *pc = NULL;
935 retvm_if(ctype == PC_BROADCAST, NULL, "broadcast type is not supported");
936 retvm_if(ctype != PC_REQUEST && ctype != PC_LISTENING, NULL, "ctype is not client_type");
938 /* Allocate memory for ADT:pkgmgr_client */
939 pc = calloc(1, sizeof(pkgmgr_client_t));
940 retvm_if(pc == NULL, NULL, "No memory");
944 pc->status_type = PKGMGR_CLIENT_STATUS_ALL;
947 if (pc->ctype == PC_REQUEST) {
948 pc->info.request.cc = comm_client_new(PC_REQUEST);
949 trym_if(pc->info.request.cc == NULL, "client creation failed");
951 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ALL, pc->info.request.cc, __operation_callback, pc);
952 trym_if(ret < 0L, "comm_client_set_status_callback() failed - %d", ret);
953 } else if (pc->ctype == PC_LISTENING) {
954 pc->info.listening.cc = comm_client_new(PC_LISTENING);
955 trym_if(pc->info.listening.cc == NULL, "client creation failed");
957 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ALL, pc->info.listening.cc, __status_callback, pc);
958 trym_if(ret < 0L, "comm_client_set_status_callback() failed - %d", ret);
961 return (pkgmgr_client *)pc;
969 API int pkgmgr_client_free(pkgmgr_client *pc)
972 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
973 retvm_if(mpc == NULL, PKGMGR_R_EINVAL, "Invalid argument");
975 if (mpc->ctype == PC_REQUEST) {
978 for (tmp = mpc->info.request.rhead; tmp;) {
984 ret = comm_client_free(mpc->info.request.cc);
985 tryvm_if(ret < 0, ret = PKGMGR_R_ERROR, "comm_client_free() failed");
986 } else if (mpc->ctype == PC_LISTENING) {
988 listen_cb_info *prev;
989 for (tmp = mpc->info.listening.lhead; tmp;) {
995 ret = comm_client_free(mpc->info.listening.cc);
996 tryvm_if(ret < 0, ret = PKGMGR_R_ERROR, "comm_client_free() failed");
997 } else if (mpc->ctype == PC_BROADCAST) {
1000 ERR("Invalid client type\n");
1001 return PKGMGR_R_EINVAL;
1004 if (mpc->tep_path) {
1005 free(mpc->tep_path);
1006 mpc->tep_path = NULL;
1018 return PKGMGR_R_ERROR;
1021 static char *__get_type_from_path(const char *pkg_path)
1024 char mimetype[255] = { '\0', };
1025 char extlist[256] = { '\0', };
1028 ret = _get_mime_from_file(pkg_path, mimetype, sizeof(mimetype));
1030 ERR("_get_mime_from_file() failed - error code[%d]\n", ret);
1034 ret = _get_mime_extension(mimetype, extlist, sizeof(extlist));
1036 ERR("_get_mime_extension() failed - error code[%d]\n", ret);
1040 if (strlen(extlist) == 0)
1043 if (strchr(extlist, ','))
1044 extlist[strlen(extlist) - strlen(strchr(extlist, ','))] = '\0';
1046 pkg_type = strchr(extlist, '.') + 1;
1047 return strdup(pkg_type);
1050 static int __change_op_cb_for_enable_disable_splash_screen(pkgmgr_client *pc,
1054 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1059 ERR("package mananger client pc is NULL");
1060 return PKGMGR_R_EINVAL;
1063 for (tmp = mpc->info.request.rhead; tmp;) {
1069 ret = comm_client_free(mpc->info.request.cc);
1071 ERR("comm_client_free() failed - %d", ret);
1072 return PKGMGR_R_ERROR;
1075 mpc->ctype = PC_REQUEST;
1077 mpc->status_type = PKGMGR_CLIENT_STATUS_ENABLE_APP_SPLASH_SCREEN;
1079 mpc->status_type = PKGMGR_CLIENT_STATUS_DISABLE_APP_SPLASH_SCREEN;
1081 mpc->info.request.cc = comm_client_new(PC_REQUEST);
1082 if (mpc->info.request.cc == NULL) {
1083 ERR("client creation failed");
1084 return PKGMGR_R_ENOMEM;
1088 ret = comm_client_set_status_callback(
1089 COMM_STATUS_BROADCAST_ENABLE_APP_SPLASH_SCREEN,
1090 mpc->info.request.cc, __operation_callback, pc);
1092 ret = comm_client_set_status_callback(
1093 COMM_STATUS_BROADCAST_DISABLE_APP_SPLASH_SCREEN,
1094 mpc->info.request.cc, __operation_callback, pc);
1097 ERR("set_status_callback() failed - %d", ret);
1098 return PKGMGR_R_ERROR;
1104 API int pkgmgr_client_set_tep_path(pkgmgr_client *pc, char *tep_path, bool tep_move)
1106 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1107 retvm_if(tep_path == NULL, PKGMGR_R_EINVAL, "tep path is NULL");
1108 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1111 free(mpc->tep_path);
1113 mpc->tep_path = strdup(tep_path);
1114 mpc->tep_move = tep_move;
1119 API int pkgmgr_client_usr_install(pkgmgr_client *pc, const char *pkg_type,
1120 const char *descriptor_path, const char *pkg_path,
1121 const char *optional_data, pkgmgr_mode mode,
1122 pkgmgr_handler event_cb, void *data, uid_t uid)
1125 int ret = PKGMGR_R_ECOMM;
1126 char *req_key = NULL;
1127 GVariantBuilder *builder = NULL;
1128 GVariant *args = NULL;
1130 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1133 if (pc == NULL || pkg_path == NULL) {
1134 ERR("invalid parameter");
1135 return PKGMGR_R_EINVAL;
1138 if (mpc->ctype != PC_REQUEST) {
1139 ERR("mpc->ctype is not PC_REQUEST");
1140 return PKGMGR_R_EINVAL;
1143 if (access(pkg_path, F_OK) != 0) {
1144 ERR("failed to access: %s", pkg_path);
1145 return PKGMGR_R_EINVAL;
1148 if (mpc->tep_path != NULL && access(mpc->tep_path, F_OK) != 0) {
1149 ERR("failed to access: %s", mpc->tep_path);
1150 return PKGMGR_R_EINVAL;
1153 /* TODO: check pkg's type on server-side */
1154 if (pkg_type == NULL)
1155 pkgtype = __get_type_from_path(pkg_path);
1157 pkgtype = strdup(pkg_type);
1159 /* build arguments */
1160 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1161 if (mpc->tep_path) {
1162 g_variant_builder_add(builder, "s", "-e");
1163 g_variant_builder_add(builder, "s", mpc->tep_path);
1164 g_variant_builder_add(builder, "s", "-M");
1165 /* TODO: revise tep_move */
1166 g_variant_builder_add(builder, "s",
1167 mpc->tep_move ? "tep_move" : "tep_copy");
1170 args = g_variant_new("as", builder);
1171 g_variant_builder_unref(builder);
1173 ret = comm_client_request(mpc->info.request.cc, "install",
1174 g_variant_new("(uss@as)", uid, pkgtype, pkg_path, args),
1176 if (ret != PKGMGR_R_OK) {
1177 ERR("request failed: %d", ret);
1181 g_variant_get(result, "(i&s)", &ret, &req_key);
1182 if (req_key == NULL) {
1183 g_variant_unref(result);
1184 return PKGMGR_R_ECOMM;
1186 if (ret != PKGMGR_R_OK) {
1187 g_variant_unref(result);
1191 req_id = _get_request_id();
1192 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1194 g_variant_unref(result);
1199 API int pkgmgr_client_install(pkgmgr_client *pc, const char *pkg_type,
1200 const char *descriptor_path, const char *pkg_path,
1201 const char *optional_data, pkgmgr_mode mode,
1202 pkgmgr_handler event_cb, void *data)
1204 return pkgmgr_client_usr_install(pc, pkg_type, descriptor_path,
1205 pkg_path, optional_data, mode, event_cb, data,
1209 API int pkgmgr_client_reinstall(pkgmgr_client *pc, const char *pkg_type,
1210 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
1211 pkgmgr_handler event_cb, void *data)
1213 return pkgmgr_client_usr_reinstall(pc, pkg_type, pkgid, optional_data,
1214 mode, event_cb, data, _getuid());
1217 API int pkgmgr_client_usr_reinstall(pkgmgr_client *pc, const char *pkg_type,
1218 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
1219 pkgmgr_handler event_cb, void *data, uid_t uid)
1222 int ret = PKGMGR_R_ECOMM;
1223 char *req_key = NULL;
1225 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1227 pkgmgrinfo_pkginfo_h handle;
1229 if (pc == NULL || pkgid == NULL) {
1230 ERR("invalid parameter");
1231 return PKGMGR_R_EINVAL;
1234 if (mpc->ctype != PC_REQUEST) {
1235 ERR("mpc->ctype is not PC_REQUEST");
1236 return PKGMGR_R_EINVAL;
1239 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
1241 return PKGMGR_R_EINVAL;
1243 ret = pkgmgrinfo_pkginfo_get_type(handle, &pkgtype);
1245 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1246 return PKGMGR_R_ERROR;
1249 ret = comm_client_request(mpc->info.request.cc, "reinstall",
1250 g_variant_new("(uss)", uid, pkgtype, pkgid), &result);
1251 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1252 if (ret != PKGMGR_R_OK) {
1253 ERR("request failed: %d", ret);
1257 g_variant_get(result, "(i&s)", &ret, &req_key);
1258 if (req_key == NULL) {
1259 g_variant_unref(result);
1260 return PKGMGR_R_ECOMM;
1262 if (ret != PKGMGR_R_OK) {
1263 g_variant_unref(result);
1267 req_id = _get_request_id();
1268 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1270 g_variant_unref(result);
1275 API int pkgmgr_client_usr_mount_install(pkgmgr_client *pc, const char *pkg_type,
1276 const char *descriptor_path, const char *pkg_path,
1277 const char *optional_data, pkgmgr_mode mode,
1278 pkgmgr_handler event_cb, void *data, uid_t uid)
1281 int ret = PKGMGR_R_ECOMM;
1282 char *req_key = NULL;
1283 GVariantBuilder *builder = NULL;
1284 GVariant *args = NULL;
1286 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1289 if (pc == NULL || pkg_path == NULL) {
1290 ERR("invalid parameter");
1291 return PKGMGR_R_EINVAL;
1294 if (mpc->ctype != PC_REQUEST) {
1295 ERR("mpc->ctype is not PC_REQUEST");
1296 return PKGMGR_R_EINVAL;
1299 if (access(pkg_path, F_OK) != 0) {
1300 ERR("failed to access: %s", pkg_path);
1301 return PKGMGR_R_EINVAL;
1304 if (mpc->tep_path != NULL && access(mpc->tep_path, F_OK) != 0) {
1305 ERR("failed to access: %s", mpc->tep_path);
1306 return PKGMGR_R_EINVAL;
1309 /* TODO: check pkg's type on server-side */
1310 if (pkg_type == NULL)
1311 pkgtype = __get_type_from_path(pkg_path);
1313 pkgtype = strdup(pkg_type);
1315 /* build arguments */
1316 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1317 if (mpc->tep_path) {
1318 g_variant_builder_add(builder, "s", "-e");
1319 g_variant_builder_add(builder, "s", mpc->tep_path);
1320 g_variant_builder_add(builder, "s", "-M");
1321 /* TODO: revise tep_move */
1322 g_variant_builder_add(builder, "s",
1323 mpc->tep_move ? "tep_move" : "tep_copy");
1326 args = g_variant_new("as", builder);
1327 g_variant_builder_unref(builder);
1329 ret = comm_client_request(mpc->info.request.cc, "mount_install",
1330 g_variant_new("(uss@as)", uid, pkgtype, pkg_path, args),
1332 if (ret != PKGMGR_R_OK) {
1333 ERR("request failed: %d", ret);
1337 g_variant_get(result, "(i&s)", &ret, &req_key);
1338 if (req_key == NULL) {
1339 g_variant_unref(result);
1340 return PKGMGR_R_ECOMM;
1342 if (ret != PKGMGR_R_OK) {
1343 g_variant_unref(result);
1347 req_id = _get_request_id();
1348 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1350 g_variant_unref(result);
1355 API int pkgmgr_client_mount_install(pkgmgr_client *pc, const char *pkg_type,
1356 const char *descriptor_path, const char *pkg_path,
1357 const char *optional_data, pkgmgr_mode mode,
1358 pkgmgr_handler event_cb, void *data)
1360 return pkgmgr_client_usr_mount_install(pc, pkg_type, descriptor_path,
1361 pkg_path, optional_data, mode, event_cb, data,
1365 API int pkgmgr_client_uninstall(pkgmgr_client *pc, const char *pkg_type,
1366 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
1369 return pkgmgr_client_usr_uninstall(pc, pkg_type, pkgid, mode, event_cb,
1373 API int pkgmgr_client_usr_uninstall(pkgmgr_client *pc, const char *pkg_type,
1374 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
1375 void *data, uid_t uid)
1378 int ret = PKGMGR_R_ECOMM;
1379 char *req_key = NULL;
1381 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1383 pkgmgrinfo_pkginfo_h handle;
1385 if (pc == NULL || pkgid == NULL) {
1386 ERR("invalid parameter");
1387 return PKGMGR_R_EINVAL;
1390 if (mpc->ctype != PC_REQUEST) {
1391 ERR("mpc->ctype is not PC_REQUEST");
1392 return PKGMGR_R_EINVAL;
1395 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
1397 return PKGMGR_R_EINVAL;
1399 ret = pkgmgrinfo_pkginfo_get_type(handle, &pkgtype);
1401 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1402 return PKGMGR_R_ERROR;
1405 ret = comm_client_request(mpc->info.request.cc, "uninstall",
1406 g_variant_new("(uss)", uid, pkgtype, pkgid), &result);
1407 if (ret != PKGMGR_R_OK) {
1408 ERR("request failed: %d", ret);
1409 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1413 g_variant_get(result, "(i&s)", &ret, &req_key);
1414 if (req_key == NULL) {
1415 g_variant_unref(result);
1416 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1417 return PKGMGR_R_ECOMM;
1419 if (ret != PKGMGR_R_OK) {
1420 g_variant_unref(result);
1421 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1425 req_id = _get_request_id();
1426 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1428 g_variant_unref(result);
1429 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1434 API int pkgmgr_client_move(pkgmgr_client *pc, const char *pkg_type,
1435 const char *pkgid, pkgmgr_move_type move_type,
1436 pkgmgr_handler event_cb, void *data)
1438 return pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type,
1439 event_cb, data, _getuid());
1441 API int pkgmgr_client_usr_move(pkgmgr_client *pc, const char *pkg_type,
1442 const char *pkgid, pkgmgr_move_type move_type,
1443 pkgmgr_handler event_cb, void *data, uid_t uid)
1446 int ret = PKGMGR_R_ECOMM;
1448 char *req_key = NULL;
1449 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1451 if (pc == NULL || pkg_type == NULL || pkgid == NULL) {
1452 ERR("invalid parameter");
1453 return PKGMGR_R_EINVAL;
1456 if ((move_type < PM_MOVE_TO_INTERNAL) || (move_type > PM_MOVE_TO_SDCARD))
1457 return PKGMGR_R_EINVAL;
1459 if (mpc->ctype != PC_REQUEST) {
1460 ERR("mpc->ctype is not PC_REQUEST");
1461 return PKGMGR_R_EINVAL;
1464 ret = comm_client_request(mpc->info.request.cc, "move",
1465 g_variant_new("(ussi)", uid, pkg_type, pkgid, move_type), &result);
1466 if (ret != PKGMGR_R_OK) {
1467 ERR("request failed: %d", ret);
1471 g_variant_get(result, "(i&s)", &ret, &req_key);
1472 if (req_key == NULL) {
1473 g_variant_unref(result);
1474 return PKGMGR_R_ECOMM;
1476 if (ret != PKGMGR_R_OK) {
1477 g_variant_unref(result);
1481 req_id = _get_request_id();
1482 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1483 g_variant_unref(result);
1488 API int pkgmgr_client_usr_activate(pkgmgr_client *pc, const char *pkg_type,
1489 const char *pkgid, uid_t uid)
1492 int ret = PKGMGR_R_ECOMM;
1493 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1495 if (pc == NULL || pkgid == NULL || pkg_type == NULL) {
1496 ERR("invalid parameter");
1497 return PKGMGR_R_EINVAL;
1500 ret = comm_client_request(mpc->info.request.cc, "enable_pkg",
1501 g_variant_new("(uss)", uid, pkg_type, pkgid), &result);
1502 if (ret != PKGMGR_R_OK) {
1503 ERR("request failed: %d", ret);
1507 g_variant_get(result, "(i)", &ret);
1508 g_variant_unref(result);
1513 API int pkgmgr_client_activate(pkgmgr_client *pc, const char *pkg_type,
1516 return pkgmgr_client_usr_activate(pc, pkg_type, pkgid, _getuid());
1519 API int pkgmgr_client_usr_deactivate(pkgmgr_client *pc, const char *pkg_type,
1520 const char *pkgid, uid_t uid)
1523 int ret = PKGMGR_R_ECOMM;
1524 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1526 if (pc == NULL || pkgid == NULL || pkg_type == NULL) {
1527 ERR("invalid parameter");
1528 return PKGMGR_R_EINVAL;
1531 ret = comm_client_request(mpc->info.request.cc, "disable_pkg",
1532 g_variant_new("(uss)", uid, pkg_type, pkgid), &result);
1533 if (ret != PKGMGR_R_OK) {
1534 ERR("request failed: %d", ret);
1538 g_variant_get(result, "(i)", &ret);
1539 g_variant_unref(result);
1544 API int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type,
1547 return pkgmgr_client_usr_deactivate(pc, pkg_type, pkgid, _getuid());
1550 /* TODO: deprecate? */
1551 API int pkgmgr_client_usr_activate_appv(pkgmgr_client *pc, const char *appid,
1552 char *const argv[], uid_t uid)
1554 return pkgmgr_client_usr_activate_app(pc, appid, NULL, uid);
1557 API int pkgmgr_client_activate_appv(pkgmgr_client *pc, const char *appid,
1560 return pkgmgr_client_usr_activate_app(pc, appid, NULL, _getuid());
1563 API int pkgmgr_client_usr_activate_app(pkgmgr_client *pc, const char *appid,
1564 pkgmgr_app_handler app_event_cb, uid_t uid)
1567 int ret = PKGMGR_R_ECOMM;
1569 char *req_key = NULL;
1570 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1572 if (pc == NULL || appid == NULL) {
1573 ERR("invalid parameter");
1574 return PKGMGR_R_EINVAL;
1577 if (__change_op_cb_for_enable_disable(mpc, false) < 0) {
1578 ERR("__change_op_cb_for_enable_disable failed");
1579 return PKGMGR_R_ESYSTEM;
1582 ret = comm_client_request(mpc->info.request.cc, "enable_app",
1583 g_variant_new("(us)", uid, appid), &result);
1584 if (ret != PKGMGR_R_OK) {
1585 ERR("request failed: %d", ret);
1589 g_variant_get(result, "(i&s)", &ret, &req_key);
1590 if (req_key == NULL) {
1591 g_variant_unref(result);
1592 return PKGMGR_R_ECOMM;
1594 if (ret != PKGMGR_R_OK) {
1595 g_variant_unref(result);
1599 req_id = _get_request_id();
1600 __add_op_app_cbinfo(pc, req_id, req_key, app_event_cb, NULL);
1601 g_variant_unref(result);
1605 API int pkgmgr_client_activate_app(pkgmgr_client *pc, const char *appid, pkgmgr_app_handler app_event_cb)
1607 return pkgmgr_client_usr_activate_app(pc, appid, app_event_cb, _getuid());
1610 API int pkgmgr_client_activate_global_app_for_uid(pkgmgr_client *pc,
1611 const char *appid, pkgmgr_app_handler app_event_cb, uid_t uid)
1614 int ret = PKGMGR_R_ECOMM;
1616 char *req_key = NULL;
1617 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1619 if (pc == NULL || appid == NULL) {
1620 ERR("invalid parameter");
1621 return PKGMGR_R_EINVAL;
1624 if (__change_op_cb_for_enable_disable(mpc, false) < 0) {
1625 ERR("__change_op_cb_for_enable_disable failed");
1626 return PKGMGR_R_ESYSTEM;
1629 ret = comm_client_request(mpc->info.request.cc, "enable_global_app_for_uid",
1630 g_variant_new("(us)", uid, appid), &result);
1631 if (ret != PKGMGR_R_OK) {
1632 ERR("request failed: %d", ret);
1636 g_variant_get(result, "(i&s)", &ret, &req_key);
1637 if (req_key == NULL) {
1638 g_variant_unref(result);
1639 return PKGMGR_R_ECOMM;
1641 if (ret != PKGMGR_R_OK) {
1642 g_variant_unref(result);
1646 req_id = _get_request_id();
1647 __add_op_app_cbinfo(pc, req_id, req_key, app_event_cb, NULL);
1652 API int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid,
1653 pkgmgr_app_handler app_event_cb, uid_t uid)
1656 int ret = PKGMGR_R_ECOMM;
1657 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1659 char *req_key = NULL;
1661 if (pc == NULL || appid == NULL) {
1662 ERR("invalid parameter");
1663 return PKGMGR_R_EINVAL;
1667 if (__change_op_cb_for_enable_disable(mpc, true) < 0) {
1668 ERR("__change_op_cb_for_enable_disable failed");
1669 return PKGMGR_R_ESYSTEM;
1672 ret = comm_client_request(mpc->info.request.cc, "disable_app",
1673 g_variant_new("(us)", uid, appid), &result);
1674 if (ret != PKGMGR_R_OK) {
1675 ERR("request failed: %d", ret);
1679 g_variant_get(result, "(i&s)", &ret, &req_key);
1680 if (req_key == NULL) {
1681 g_variant_unref(result);
1682 return PKGMGR_R_ECOMM;
1684 if (ret != PKGMGR_R_OK) {
1685 g_variant_unref(result);
1689 req_id = _get_request_id();
1690 __add_op_app_cbinfo(pc, req_id, req_key, app_event_cb, NULL);
1692 g_variant_unref(result);
1696 API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid, pkgmgr_app_handler app_event_cb)
1698 return pkgmgr_client_usr_deactivate_app(pc, appid, app_event_cb, _getuid());
1701 API int pkgmgr_client_deactivate_global_app_for_uid(pkgmgr_client *pc,
1702 const char *appid, pkgmgr_app_handler app_event_cb, uid_t uid)
1705 int ret = PKGMGR_R_ECOMM;
1707 char *req_key = NULL;
1708 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1710 if (pc == NULL || appid == NULL) {
1711 ERR("invalid parameter");
1712 return PKGMGR_R_EINVAL;
1715 if (__change_op_cb_for_enable_disable(mpc, true) < 0) {
1716 ERR("__change_op_cb_for_enable_disable failed");
1717 return PKGMGR_R_ESYSTEM;
1720 ret = comm_client_request(mpc->info.request.cc, "disable_global_app_for_uid",
1721 g_variant_new("(us)", uid, appid), &result);
1722 if (ret != PKGMGR_R_OK) {
1723 ERR("request failed: %d", ret);
1727 g_variant_get(result, "(i&s)", &ret, &req_key);
1728 if (req_key == NULL) {
1729 g_variant_unref(result);
1730 return PKGMGR_R_ECOMM;
1732 if (ret != PKGMGR_R_OK) {
1733 g_variant_unref(result);
1737 req_id = _get_request_id();
1738 __add_op_app_cbinfo(pc, req_id, req_key, app_event_cb, NULL);
1742 API int pkgmgr_client_usr_clear_user_data(pkgmgr_client *pc,
1743 const char *pkg_type, const char *appid, pkgmgr_mode mode,
1747 int ret = PKGMGR_R_ECOMM;
1748 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1750 if (pc == NULL || pkg_type == NULL || appid == NULL) {
1751 ERR("invalid parameter");
1752 return PKGMGR_R_EINVAL;
1755 if (mpc->ctype != PC_REQUEST) {
1756 ERR("mpc->ctype is not PC_REQUEST");
1757 return PKGMGR_R_EINVAL;
1760 ret = comm_client_request(mpc->info.request.cc, "cleardata",
1761 g_variant_new("(uss)", uid, pkg_type, appid), &result);
1762 if (ret == PKGMGR_R_OK) {
1763 ERR("request failed: %d", ret);
1767 g_variant_get(result, "(i)", &ret);
1768 g_variant_unref(result);
1773 API int pkgmgr_client_clear_user_data(pkgmgr_client *pc, const char *pkg_type,
1774 const char *appid, pkgmgr_mode mode)
1776 return pkgmgr_client_usr_clear_user_data(pc, pkg_type, appid, mode,
1780 API int pkgmgr_client_set_status_type(pkgmgr_client *pc, int status_type)
1784 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1785 retvm_if(status_type == PKGMGR_CLIENT_STATUS_ALL, PKGMGR_R_OK, "status_type is PKGMGR_CLIENT_STATUS_ALL");
1786 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1788 /* free listening head */
1789 listen_cb_info *tmp = NULL;
1790 listen_cb_info *prev = NULL;
1791 for (tmp = mpc->info.listening.lhead; tmp;) {
1797 /* free dbus connection */
1798 ret = comm_client_free(mpc->info.listening.cc);
1799 retvm_if(ret < 0, PKGMGR_R_ERROR, "comm_client_free() failed - %d", ret);
1801 /* Manage pc for seperated event */
1802 mpc->ctype = PC_LISTENING;
1803 mpc->status_type = status_type;
1805 mpc->info.listening.cc = comm_client_new(PC_LISTENING);
1806 retvm_if(mpc->info.listening.cc == NULL, PKGMGR_R_EINVAL, "client creation failed");
1808 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_INSTALL) == PKGMGR_CLIENT_STATUS_INSTALL) {
1809 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_INSTALL, mpc->info.listening.cc, __status_callback, pc);
1810 retvm_if(ret < 0, PKGMGR_R_ECOMM, "PKGMGR_CLIENT_STATUS_INSTALL failed - %d", ret);
1813 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_UNINSTALL) == PKGMGR_CLIENT_STATUS_UNINSTALL) {
1814 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_UNINSTALL, mpc->info.listening.cc, __status_callback, pc);
1815 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_UNINSTALL failed - %d", ret);
1818 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_MOVE) == PKGMGR_CLIENT_STATUS_MOVE) {
1819 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_MOVE, mpc->info.listening.cc, __status_callback, pc);
1820 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_MOVE failed - %d", ret);
1823 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_INSTALL_PROGRESS) == PKGMGR_CLIENT_STATUS_INSTALL_PROGRESS) {
1824 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_INSTALL_PROGRESS, mpc->info.listening.cc, __status_callback, pc);
1825 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_INSTALL_PROGRESS failed - %d", ret);
1828 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_UPGRADE) == PKGMGR_CLIENT_STATUS_UPGRADE) {
1829 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_UPGRADE, mpc->info.listening.cc, __status_callback, pc);
1830 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_UPGRADE failed - %d", ret);
1833 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_ENABLE_APP) == PKGMGR_CLIENT_STATUS_ENABLE_APP) {
1834 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ENABLE_APP, mpc->info.listening.cc, __status_callback, pc);
1835 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_ENABLE_APP failed - %d", ret);
1838 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_DISABLE_APP) == PKGMGR_CLIENT_STATUS_DISABLE_APP) {
1839 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_DISABLE_APP, mpc->info.listening.cc, __status_callback, pc);
1840 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_DISABLE_APP failed - %d", ret);
1843 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_ENABLE_APP_SPLASH_SCREEN) == PKGMGR_CLIENT_STATUS_ENABLE_APP_SPLASH_SCREEN) {
1844 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ENABLE_APP_SPLASH_SCREEN, mpc->info.listening.cc, __status_callback, pc);
1845 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_ENABLE_APP_SPLASH_SCREEN failed - %d", ret);
1848 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_DISABLE_APP_SPLASH_SCREEN) == PKGMGR_CLIENT_STATUS_DISABLE_APP_SPLASH_SCREEN) {
1849 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_DISABLE_APP_SPLASH_SCREEN, mpc->info.listening.cc, __status_callback, pc);
1850 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_DISABLE_APP_SPLASH_SCREEN failed - %d", ret);
1856 API int pkgmgr_client_listen_status(pkgmgr_client *pc, pkgmgr_handler event_cb,
1860 /* Check for NULL value of pc */
1861 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1862 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1864 /* 0. check input */
1865 retvm_if(mpc->ctype != PC_LISTENING, PKGMGR_R_EINVAL, "ctype is not PC_LISTENING");
1866 retvm_if(event_cb == NULL, PKGMGR_R_EINVAL, "event_cb is NULL");
1869 req_id = _get_request_id();
1871 /* 2. add callback info to pkgmgr_client */
1872 __add_stat_cbinfo(mpc, req_id, event_cb, data);
1876 API int pkgmgr_client_listen_app_status(pkgmgr_client *pc, pkgmgr_app_handler event_cb,
1880 /* Check for NULL value of pc */
1881 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1882 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1884 /* 0. check input */
1885 retvm_if(mpc->ctype != PC_LISTENING, PKGMGR_R_EINVAL, "ctype is not PC_LISTENING");
1886 retvm_if(event_cb == NULL, PKGMGR_R_EINVAL, "event_cb is NULL");
1889 req_id = _get_request_id();
1891 /* 2. add app callback info to pkgmgr_client */
1892 __add_app_stat_cbinfo(mpc, req_id, event_cb, data);
1896 API int pkgmgr_client_remove_listen_status(pkgmgr_client *pc)
1900 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1901 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1903 ret = __remove_stat_cbinfo(mpc);
1905 ERR("failed to remove status callback");
1906 return PKGMGR_R_ERROR;
1912 API int pkgmgr_client_broadcast_status(pkgmgr_client *pc, const char *pkg_type,
1913 const char *pkgid, const char *key,
1916 /* client cannot broadcast signal */
1920 API int pkgmgr_client_request_service(pkgmgr_request_service_type service_type, int service_mode,
1921 pkgmgr_client *pc, const char *pkg_type, const char *pkgid,
1922 const char *custom_info, pkgmgr_handler event_cb, void *data)
1924 return pkgmgr_client_usr_request_service(service_type, service_mode, pc, pkg_type, pkgid, _getuid(), custom_info, event_cb, data);
1927 API int pkgmgr_client_usr_request_service(pkgmgr_request_service_type service_type, int service_mode,
1928 pkgmgr_client *pc, const char *pkg_type, const char *pkgid, uid_t uid,
1929 const char *custom_info, pkgmgr_handler event_cb, void *data)
1933 /* Check for NULL value of service type */
1934 retvm_if(service_type > PM_REQUEST_MAX, PKGMGR_R_EINVAL, "service type is not defined\n");
1935 retvm_if(service_type < 0, PKGMGR_R_EINVAL, "service type is error\n");
1937 switch (service_type) {
1938 case PM_REQUEST_CSC:
1939 tryvm_if(custom_info == NULL, ret = PKGMGR_R_EINVAL, "custom_info is NULL\n");
1940 tryvm_if(strlen(custom_info) >= PKG_STRING_LEN_MAX, ret = PKGMGR_R_EINVAL, "custom_info over PKG_STRING_LEN_MAX");
1941 tryvm_if(data == NULL, ret = PKGMGR_R_EINVAL, "data is NULL\n");
1943 ret = __csc_process(custom_info, (char *)data);
1945 ERR("__csc_process fail \n");
1951 case PM_REQUEST_MOVE:
1952 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1953 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1954 tryvm_if((service_mode < PM_MOVE_TO_INTERNAL) || (service_mode > PM_MOVE_TO_SDCARD), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1956 ret = __move_pkg_process(pc, pkgid, pkg_type, uid, (pkgmgr_move_type)service_mode, event_cb, data);
1959 case PM_REQUEST_GET_SIZE:
1960 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1961 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1962 tryvm_if((service_mode < PM_GET_TOTAL_SIZE) || (service_mode >= PM_GET_MAX), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1964 ret = __get_size_process(pc, pkgid, uid, (pkgmgr_getsize_type)service_mode, event_cb, data);
1967 case PM_REQUEST_KILL_APP:
1968 case PM_REQUEST_CHECK_APP:
1969 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1970 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1972 ret = __check_app_process(service_type, pc, pkgid, uid, data);
1974 ERR("__check_app_process fail \n");
1981 ERR("Wrong Request\n");
1992 API int pkgmgr_client_usr_request_size_info(uid_t uid)
1995 pkgmgr_client *pc = NULL;
1997 pc = pkgmgr_client_new(PC_REQUEST);
1998 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "request pc is null\n");
2000 ret = __request_size_info(pc, uid);
2002 ERR("__request_size_info fail \n");
2004 pkgmgr_client_free(pc);
2008 API int pkgmgr_client_request_size_info(void) /* get all package size (data, total) */
2010 return pkgmgr_client_usr_request_size_info(_getuid());
2013 API int pkgmgr_client_usr_clear_cache_dir(const char *pkgid, uid_t uid)
2016 int ret = PKGMGR_R_ECOMM;
2017 pkgmgr_client_t *pc;
2019 if (pkgid == NULL) {
2020 ERR("invalid parameter");
2021 return PKGMGR_R_EINVAL;
2024 pc = pkgmgr_client_new(PC_REQUEST);
2026 ERR("out of memory");
2027 return PKGMGR_R_ESYSTEM;
2030 ret = comm_client_request(pc->info.request.cc, "clearcache",
2031 g_variant_new("(us)", uid, pkgid), &result);
2032 if (ret != PKGMGR_R_OK) {
2033 ERR("request failed: %d", ret);
2037 g_variant_get(result, "(i)", &ret);
2038 g_variant_unref(result);
2043 API int pkgmgr_client_clear_cache_dir(const char *pkgid)
2045 return pkgmgr_client_usr_clear_cache_dir(pkgid, _getuid());
2048 API int pkgmgr_client_clear_usr_all_cache_dir(uid_t uid)
2050 return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, uid);
2053 API int pkgmgr_client_clear_all_cache_dir(void)
2055 return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, _getuid());
2058 API int pkgmgr_client_get_size(pkgmgr_client *pc, const char *pkgid,
2059 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
2062 return pkgmgr_client_usr_get_size(pc, pkgid, get_type, event_cb, data,
2066 API int pkgmgr_client_usr_get_size(pkgmgr_client *pc, const char *pkgid,
2067 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
2068 void *data, uid_t uid)
2071 int ret = PKGMGR_R_ECOMM;
2072 char *req_key = NULL;
2074 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2076 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
2077 ERR("invalid parameter");
2078 return PKGMGR_R_EINVAL;
2081 if (mpc->ctype != PC_REQUEST) {
2082 ERR("mpc->ctype is not PC_REQUEST");
2083 return PKGMGR_R_EINVAL;
2087 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
2088 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
2090 get_type = PM_GET_PKG_SIZE_INFO;
2092 ret = comm_client_request(mpc->info.request.cc, "getsize",
2093 g_variant_new("(usi)", uid, pkgid, get_type), &result);
2094 if (ret != PKGMGR_R_OK) {
2095 ERR("request failed: %d", ret);
2099 g_variant_get(result, "(i&s)", &ret, &req_key);
2100 if (req_key == NULL) {
2101 g_variant_unref(result);
2102 return PKGMGR_R_ECOMM;
2104 if (ret != PKGMGR_R_OK) {
2105 g_variant_unref(result);
2109 req_id = _get_request_id();
2110 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
2112 g_variant_unref(result);
2117 API int pkgmgr_client_usr_get_package_size_info(pkgmgr_client *pc,
2118 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
2119 void *user_data, uid_t uid)
2122 int ret = PKGMGR_R_ECOMM;
2123 char *req_key = NULL;
2126 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2128 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
2129 ERR("invalid parameter");
2130 return PKGMGR_R_EINVAL;
2133 if (mpc->ctype != PC_REQUEST) {
2134 ERR("mpc->ctype is not PC_REQUEST");
2135 return PKGMGR_R_EINVAL;
2139 if (__change_op_cb_for_getsize(mpc) < 0) {
2140 ERR("__change_op_cb_for_getsize failed");
2141 return PKGMGR_R_ESYSTEM;
2144 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
2145 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
2147 get_type = PM_GET_PKG_SIZE_INFO;
2149 ret = comm_client_request(mpc->info.request.cc, "getsize",
2150 g_variant_new("(usi)", uid, pkgid, get_type), &result);
2151 if (ret != PKGMGR_R_OK) {
2152 ERR("request failed: %d", ret);
2156 g_variant_get(result, "(i&s)", &ret, &req_key);
2157 if (req_key == NULL) {
2158 g_variant_unref(result);
2159 return PKGMGR_R_ECOMM;
2161 if (ret != PKGMGR_R_OK) {
2162 g_variant_unref(result);
2166 req_id = _get_request_id();
2167 __add_op_cbinfo(mpc, req_id, req_key, __get_pkg_size_info_cb, event_cb,
2170 g_variant_unref(result);
2175 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)
2177 return pkgmgr_client_usr_get_package_size_info(pc, pkgid, event_cb, user_data, _getuid());
2180 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)
2181 { /* total package size info */
2182 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL, (pkgmgr_pkg_size_info_receive_cb)event_cb, user_data, uid);
2185 API int pkgmgr_client_get_total_package_size_info(pkgmgr_client *pc, pkgmgr_total_pkg_size_info_receive_cb event_cb, void *user_data)
2187 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL, (pkgmgr_pkg_size_info_receive_cb)event_cb, user_data, _getuid());
2190 API int pkgmgr_client_generate_license_request(pkgmgr_client *pc,
2191 const char *resp_data, char **req_data, char **license_url)
2197 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2199 if (pc == NULL || resp_data == NULL || req_data == NULL ||
2200 license_url == NULL) {
2201 ERR("invalid parameter");
2202 return PKGMGR_R_EINVAL;
2205 if (mpc->ctype != PC_REQUEST) {
2206 ERR("mpc->ctype is not PC_REQUEST");
2207 return PKGMGR_R_EINVAL;
2210 ret = comm_client_request(mpc->info.request.cc,
2211 "generate_license_request",
2212 g_variant_new("(s)", resp_data), &result);
2213 if (ret != PKGMGR_R_OK) {
2214 ERR("request failed: %d", ret);
2218 g_variant_get(result, "(i&s&s)", &ret, &data, &url);
2219 if (ret != PKGMGR_R_OK) {
2220 ERR("generate_license_request failed: %d", ret);
2221 g_variant_unref(result);
2225 *req_data = strdup(data);
2226 *license_url = strdup(url);
2228 g_variant_unref(result);
2233 API int pkgmgr_client_register_license(pkgmgr_client *pc, const char *resp_data)
2237 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2239 if (pc == NULL || resp_data == NULL) {
2240 ERR("invalid parameter");
2241 return PKGMGR_R_EINVAL;
2244 if (mpc->ctype != PC_REQUEST) {
2245 ERR("mpc->ctype is not PC_REQUEST");
2246 return PKGMGR_R_EINVAL;
2249 ret = comm_client_request(mpc->info.request.cc,
2250 "register_license", g_variant_new("(s)", resp_data),
2252 if (ret != PKGMGR_R_OK) {
2253 ERR("request failed: %d", ret);
2257 g_variant_get(result, "(i)", &ret);
2258 g_variant_unref(result);
2259 if (ret != PKGMGR_R_OK) {
2260 ERR("register license failed: %d", ret);
2267 API int pkgmgr_client_decrypt_package(pkgmgr_client *pc,
2268 const char *drm_file_path, const char *decrypted_file_path)
2272 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2274 if (pc == NULL || drm_file_path == NULL ||
2275 decrypted_file_path == NULL) {
2276 ERR("invalid parameter");
2277 return PKGMGR_R_EINVAL;
2280 if (mpc->ctype != PC_REQUEST) {
2281 ERR("mpc->ctype is not PC_REQUEST");
2282 return PKGMGR_R_EINVAL;
2285 ret = comm_client_request(mpc->info.request.cc,
2287 g_variant_new("(ss)", drm_file_path,
2288 decrypted_file_path),
2290 if (ret != PKGMGR_R_OK) {
2291 ERR("request failed: %d", ret);
2295 g_variant_get(result, "(i)", &ret);
2296 g_variant_unref(result);
2297 if (ret != PKGMGR_R_OK) {
2298 ERR("decrypt_package failed: %d", ret);
2305 API int pkgmgr_client_enable_splash_screen(pkgmgr_client *pc, const char *appid)
2307 return pkgmgr_client_usr_enable_splash_screen(pc, appid, _getuid());
2310 API int pkgmgr_client_usr_enable_splash_screen(pkgmgr_client *pc,
2311 const char *appid, uid_t uid)
2315 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2317 if (pc == NULL || appid == NULL) {
2318 ERR("Invalid parameter");
2319 return PKGMGR_R_EINVAL;
2322 ret = __change_op_cb_for_enable_disable_splash_screen(mpc, true);
2324 ERR("__change_op_cb_for_enable_disable_splash_screen failed");
2325 return PKGMGR_R_ESYSTEM;
2328 ret = comm_client_request(mpc->info.request.cc,
2329 "enable_app_splash_screen",
2330 g_variant_new("(us)", uid, appid), &result);
2331 if (ret != PKGMGR_R_OK) {
2332 ERR("request failed: %d", ret);
2336 g_variant_get(result, "(i)", &ret);
2337 if (ret != PKGMGR_R_OK) {
2338 g_variant_unref(result);
2342 g_variant_unref(result);
2347 API int pkgmgr_client_disable_splash_screen(pkgmgr_client *pc,
2350 return pkgmgr_client_usr_disable_splash_screen(pc, appid,
2354 API int pkgmgr_client_usr_disable_splash_screen(pkgmgr_client *pc,
2355 const char *appid, uid_t uid)
2359 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2361 if (pc == NULL || appid == NULL) {
2362 ERR("Invalid parameter");
2363 return PKGMGR_R_EINVAL;
2366 ret = __change_op_cb_for_enable_disable_splash_screen(mpc, false);
2368 ERR("__change_op_cb_for_enable_disable_splash_screen failed");
2372 ret = comm_client_request(mpc->info.request.cc,
2373 "disable_app_splash_screen",
2374 g_variant_new("(us)", uid, appid), &result);
2375 if (ret != PKGMGR_R_OK) {
2376 ERR("request failed: %d", ret);
2380 g_variant_get(result, "(i)", &ret);
2381 if (ret != PKGMGR_R_OK) {
2382 g_variant_unref(result);
2386 g_variant_unref(result);
2391 static int __set_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int mode, uid_t uid)
2394 int ret = PKGMGR_R_ECOMM;
2395 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2397 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
2398 ERR("invalid parameter");
2399 return PKGMGR_R_EINVAL;
2402 ret = comm_client_request(mpc->info.request.cc, "set_restriction_mode",
2403 g_variant_new("(usi)", uid, pkgid, mode), &result);
2404 if (ret != PKGMGR_R_OK) {
2405 ERR("request failed: %d", ret);
2409 g_variant_get(result, "(i)", &ret);
2410 g_variant_unref(result);
2415 API int pkgmgr_client_usr_set_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int mode, uid_t uid)
2417 return __set_pkg_restriction_mode(pc, pkgid, mode, uid);
2420 API int pkgmgr_client_set_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int mode)
2422 return pkgmgr_client_usr_set_pkg_restriction_mode(pc, pkgid, mode, _getuid());
2425 static int __unset_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int mode, uid_t uid)
2428 int ret = PKGMGR_R_ECOMM;
2429 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2431 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
2432 ERR("invalid parameter");
2433 return PKGMGR_R_EINVAL;
2436 ret = comm_client_request(mpc->info.request.cc,
2437 "unset_restriction_mode",
2438 g_variant_new("(usi)", uid, pkgid, mode), &result);
2439 if (ret != PKGMGR_R_OK) {
2440 ERR("request failed: %d", ret);
2444 g_variant_get(result, "(i)", &ret);
2445 g_variant_unref(result);
2451 API int pkgmgr_client_usr_unset_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int mode, uid_t uid)
2453 return __unset_pkg_restriction_mode(pc, pkgid, mode, uid);
2456 API int pkgmgr_client_unset_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int mode)
2458 return pkgmgr_client_usr_unset_pkg_restriction_mode(pc, pkgid, mode, _getuid());
2461 static int __get_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int *mode, uid_t uid)
2464 int ret = PKGMGR_R_ECOMM;
2466 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2468 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0) {
2469 ERR("invalid parameter");
2470 return PKGMGR_R_EINVAL;
2473 ret = comm_client_request(mpc->info.request.cc,
2474 "get_restriction_mode",
2475 g_variant_new("(us)", uid, pkgid), &result);
2476 if (ret != PKGMGR_R_OK) {
2477 ERR("request failed: %d", ret);
2481 g_variant_get(result, "(ii)", &m, &ret);
2482 g_variant_unref(result);
2483 if (ret != PKGMGR_R_OK)
2491 API int pkgmgr_client_usr_get_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int *mode, uid_t uid)
2493 return __get_pkg_restriction_mode(pc, pkgid, mode, uid);
2496 API int pkgmgr_client_get_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int *mode)
2498 return pkgmgr_client_usr_get_pkg_restriction_mode(pc, pkgid, mode, _getuid());
2501 API int pkgmgr_client_usr_set_restriction_mode(pkgmgr_client *pc, int mode,
2505 int ret = PKGMGR_R_ECOMM;
2506 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2509 ERR("invalid parameter");
2510 return PKGMGR_R_EINVAL;
2513 ret = comm_client_request(mpc->info.request.cc, "set_restriction_mode",
2514 g_variant_new("(usi)", uid, "", mode), &result);
2515 if (ret != PKGMGR_R_OK) {
2516 ERR("request failed: %d", ret);
2520 g_variant_get(result, "(i)", &ret);
2521 g_variant_unref(result);
2526 API int pkgmgr_client_set_restriction_mode(pkgmgr_client *pc, int mode)
2528 return pkgmgr_client_usr_set_restriction_mode(pc, mode, _getuid());
2531 API int pkgmgr_client_usr_unset_restriction_mode(pkgmgr_client *pc, int mode,
2535 int ret = PKGMGR_R_ECOMM;
2536 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2539 ERR("invalid parameter");
2540 return PKGMGR_R_EINVAL;
2543 ret = comm_client_request(mpc->info.request.cc,
2544 "unset_restriction_mode",
2545 g_variant_new("(usi)", uid, "", mode), &result);
2546 if (ret != PKGMGR_R_OK) {
2547 ERR("request failed: %d", ret);
2551 g_variant_get(result, "(i)", &ret);
2552 g_variant_unref(result);
2557 API int pkgmgr_client_unset_restriction_mode(pkgmgr_client *pc, int mode)
2559 return pkgmgr_client_usr_unset_restriction_mode(pc, mode, _getuid());
2562 API int pkgmgr_client_usr_get_restriction_mode(pkgmgr_client *pc,
2563 int *mode, uid_t uid)
2566 int ret = PKGMGR_R_ECOMM;
2568 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2571 ERR("invalid parameter");
2572 return PKGMGR_R_EINVAL;
2575 ret = comm_client_request(mpc->info.request.cc,
2576 "get_restriction_mode",
2577 g_variant_new("(us)", uid, ""), &result);
2578 if (ret != PKGMGR_R_OK) {
2579 ERR("request failed: %d", ret);
2583 g_variant_get(result, "(ii)", &m, &ret);
2584 g_variant_unref(result);
2585 if (ret != PKGMGR_R_OK)
2593 API int pkgmgr_client_get_restriction_mode(pkgmgr_client *pc,
2596 return pkgmgr_client_usr_get_restriction_mode(pc, mode, _getuid());