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 "pkgmgr-api.h"
44 #include "comm_client.h"
46 #define PKG_TMP_PATH tzplatform_mkpath(TZ_USER_APP, "tmp")
48 #define BINSH_NAME "/bin/sh"
51 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
52 #define REGULAR_USER 5000
54 static inline uid_t _getuid(void)
58 if (uid < REGULAR_USER)
64 static int _get_request_id()
66 static int internal_req_id = 1;
68 return internal_req_id++;
71 typedef struct _req_cb_info {
74 pkgmgr_handler event_cb;
75 pkgmgr_app_handler app_event_cb;
77 struct _req_cb_info *next;
80 typedef struct _listen_cb_info {
82 pkgmgr_handler event_cb;
83 pkgmgr_app_handler app_event_cb;
85 struct _listen_cb_info *next;
88 typedef struct _pkgmgr_client_t {
98 listen_cb_info *lhead;
106 typedef struct _iter_data {
107 pkgmgr_iter_fn iter_fn;
111 static int __xsystem(const char *argv[])
118 perror("fork failed");
122 execvp(argv[0], (char *const *)argv);
128 if (waitpid(pid, &status, 0) == -1) {
129 perror("waitpid failed");
132 if (WIFSIGNALED(status)) {
136 if (!WIFEXITED(status)) {
137 /* shouldn't happen */
138 perror("should not happen");
141 return WEXITSTATUS(status);
144 static void __error_to_string(int errnumber, char **errstr)
149 case PKGCMD_ERR_PACKAGE_NOT_FOUND:
150 *errstr = PKGCMD_ERR_PACKAGE_NOT_FOUND_STR;
152 case PKGCMD_ERR_PACKAGE_INVALID:
153 *errstr = PKGCMD_ERR_PACKAGE_INVALID_STR;
155 case PKGCMD_ERR_PACKAGE_LOWER_VERSION:
156 *errstr = PKGCMD_ERR_PACKAGE_LOWER_VERSION_STR;
158 case PKGCMD_ERR_PACKAGE_EXECUTABLE_NOT_FOUND:
159 *errstr = PKGCMD_ERR_PACKAGE_EXECUTABLE_NOT_FOUND_STR;
161 case PKGCMD_ERR_MANIFEST_INVALID:
162 *errstr = PKGCMD_ERR_MANIFEST_INVALID_STR;
164 case PKGCMD_ERR_CONFIG_NOT_FOUND:
165 *errstr = PKGCMD_ERR_CONFIG_NOT_FOUND_STR;
167 case PKGCMD_ERR_CONFIG_INVALID:
168 *errstr = PKGCMD_ERR_CONFIG_INVALID_STR;
170 case PKGCMD_ERR_SIGNATURE_NOT_FOUND:
171 *errstr = PKGCMD_ERR_SIGNATURE_NOT_FOUND_STR;
173 case PKGCMD_ERR_SIGNATURE_INVALID:
174 *errstr = PKGCMD_ERR_SIGNATURE_INVALID_STR;
176 case PKGCMD_ERR_SIGNATURE_VERIFICATION_FAILED:
177 *errstr = PKGCMD_ERR_SIGNATURE_VERIFICATION_FAILED_STR;
179 case PKGCMD_ERR_ROOT_CERTIFICATE_NOT_FOUND:
180 *errstr = PKGCMD_ERR_ROOT_CERTIFICATE_NOT_FOUND_STR;
182 case PKGCMD_ERR_CERTIFICATE_INVALID:
183 *errstr = PKGCMD_ERR_CERTIFICATE_INVALID_STR;
185 case PKGCMD_ERR_CERTIFICATE_CHAIN_VERIFICATION_FAILED:
186 *errstr = PKGCMD_ERR_CERTIFICATE_CHAIN_VERIFICATION_FAILED_STR;
188 case PKGCMD_ERR_CERTIFICATE_EXPIRED:
189 *errstr = PKGCMD_ERR_CERTIFICATE_EXPIRED_STR;
191 case PKGCMD_ERR_INVALID_PRIVILEGE:
192 *errstr = PKGCMD_ERR_INVALID_PRIVILEGE_STR;
194 case PKGCMD_ERR_MENU_ICON_NOT_FOUND:
195 *errstr = PKGCMD_ERR_MENU_ICON_NOT_FOUND_STR;
197 case PKGCMD_ERR_FATAL_ERROR:
198 *errstr = PKGCMD_ERR_FATAL_ERROR_STR;
200 case PKGCMD_ERR_OUT_OF_STORAGE:
201 *errstr = PKGCMD_ERR_OUT_OF_STORAGE_STR;
203 case PKGCMD_ERR_OUT_OF_MEMORY:
204 *errstr = PKGCMD_ERR_OUT_OF_MEMORY_STR;
206 case PKGCMD_ERR_ARGUMENT_INVALID:
207 *errstr = PKGCMD_ERR_ARGUMENT_INVALID_STR;
210 *errstr = PKGCMD_ERR_UNKNOWN_STR;
215 static void __add_op_cbinfo(pkgmgr_client_t * pc, int request_id,
216 const char *req_key, pkgmgr_handler event_cb, void *new_event_cb,
219 req_cb_info *cb_info;
220 req_cb_info *current;
223 cb_info = (req_cb_info *) calloc(1, sizeof(req_cb_info));
224 if (cb_info == NULL) {
225 DBG("calloc failed");
228 cb_info->request_id = request_id;
229 cb_info->req_key = strdup(req_key);
230 cb_info->event_cb = event_cb;
231 cb_info->data = data;
232 cb_info->next = NULL;
233 cb_info->app_event_cb = NULL;
234 pc->new_event_cb = new_event_cb;
236 if (pc->info.request.rhead == NULL)
237 pc->info.request.rhead = cb_info;
239 current = prev = pc->info.request.rhead;
242 current = current->next;
245 prev->next = cb_info;
249 static void __add_op_app_cbinfo(pkgmgr_client_t * pc, int request_id,
250 const char *req_key, pkgmgr_app_handler app_event_cb, void *data)
252 req_cb_info *cb_info;
253 req_cb_info *current;
256 cb_info = (req_cb_info *) calloc(1, sizeof(req_cb_info));
257 if (cb_info == NULL) {
258 DBG("calloc failed");
261 cb_info->request_id = request_id;
262 cb_info->req_key = strdup(req_key);
263 cb_info->event_cb = NULL;
264 cb_info->app_event_cb = app_event_cb;
265 cb_info->data = data;
266 cb_info->next = NULL;
267 pc->new_event_cb = NULL;
269 if (pc->info.request.rhead == NULL)
270 pc->info.request.rhead = cb_info;
272 current = prev = pc->info.request.rhead;
275 current = current->next;
278 prev->next = cb_info;
282 static req_cb_info *__find_op_cbinfo(pkgmgr_client_t *pc, const char *req_key)
286 tmp = pc->info.request.rhead;
293 DBG("tmp->req_key %s, req_key %s", tmp->req_key, req_key);
296 if (strncmp(tmp->req_key, req_key, strlen(tmp->req_key)) == 0)
303 static int __remove_stat_cbinfo(pkgmgr_client_t *pc)
305 listen_cb_info *info = pc->info.listening.lhead;
306 listen_cb_info *next = NULL;
308 while (info != NULL) {
314 pc->info.listening.lhead = NULL;
318 static void __add_app_stat_cbinfo(pkgmgr_client_t *pc, int request_id,
319 pkgmgr_app_handler event_cb, void *data)
321 listen_cb_info *cb_info;
322 listen_cb_info *current;
323 listen_cb_info *prev;
325 cb_info = (listen_cb_info *) calloc(1, sizeof(listen_cb_info));
326 if (cb_info == NULL) {
327 DBG("calloc failed");
330 cb_info->request_id = request_id;
331 cb_info->app_event_cb = event_cb;
332 cb_info->data = data;
333 cb_info->next = NULL;
335 if (pc->info.listening.lhead == NULL)
336 pc->info.listening.lhead = cb_info;
338 current = prev = pc->info.listening.lhead;
341 current = current->next;
344 prev->next = cb_info;
348 static void __add_stat_cbinfo(pkgmgr_client_t *pc, int request_id,
349 pkgmgr_handler event_cb, void *data)
351 listen_cb_info *cb_info;
352 listen_cb_info *current;
353 listen_cb_info *prev;
355 cb_info = (listen_cb_info *) calloc(1, sizeof(listen_cb_info));
356 if (cb_info == NULL) {
357 DBG("calloc failed");
360 cb_info->request_id = request_id;
361 cb_info->event_cb = event_cb;
362 cb_info->data = data;
363 cb_info->next = NULL;
365 /* TODO - check the order of callback - FIFO or LIFO => Should be changed to LIFO */
366 if (pc->info.listening.lhead == NULL)
367 pc->info.listening.lhead = cb_info;
369 current = prev = pc->info.listening.lhead;
372 current = current->next;
375 prev->next = cb_info;
379 static void __operation_callback(void *cb_data, uid_t target_uid,
380 const char *req_id, const char *pkg_type,
381 const char *pkgid, const char *appid,
382 const char *key, const char *val)
385 req_cb_info *cb_info;
387 pc = (pkgmgr_client_t *) cb_data;
389 /* find callback info */
390 cb_info = __find_op_cbinfo(pc, req_id);
391 if (cb_info == NULL) {
392 ERR("cannot fint cb_info for req_id:%s", req_id);
397 if (appid != NULL && strlen(appid) != 0) {
398 /* run app callback */
399 if (pc->new_event_cb)
400 cb_info->app_event_cb(target_uid, cb_info->request_id,
401 pkg_type, pkgid, appid, key, val, pc,
404 cb_info->app_event_cb(target_uid, cb_info->request_id,
405 pkg_type, pkgid, appid, key, val, NULL,
408 /* run pkg callback */
409 if (pc->new_event_cb)
410 cb_info->event_cb(target_uid, cb_info->request_id,
411 pkg_type, pkgid, key, val, pc,
414 cb_info->event_cb(target_uid, cb_info->request_id,
415 pkg_type, pkgid, key, val, NULL,
422 static void __status_callback(void *cb_data, uid_t target_uid,
423 const char *req_id, const char *pkg_type,
424 const char *pkgid, const char *appid,
425 const char *key, const char *val)
430 pc = (pkgmgr_client_t *) cb_data;
432 tmp = pc->info.listening.lhead;
434 if (appid != NULL && strlen(appid) != 0) {
435 /* run app callback */
436 if (tmp->app_event_cb && tmp->app_event_cb(
437 target_uid, tmp->request_id, pkg_type, pkgid,
438 appid, key, val, NULL, tmp->data) != 0)
441 /* run pkg callback */
442 if (tmp->event_cb && tmp->event_cb(
443 target_uid, tmp->request_id, pkg_type, pkgid,
444 key, val, NULL, tmp->data) != 0)
453 static inline int __read_proc(const char *path, char *buf, int size)
458 if (buf == NULL || path == NULL)
461 fd = open(path, O_RDONLY);
465 ret = read(fd, buf, size - 1);
477 char *__proc_get_cmdline_bypid(int pid)
479 char buf[PKG_STRING_LEN_MAX] = {'\0', };
482 snprintf(buf, sizeof(buf), "/proc/%d/cmdline", pid);
483 ret = __read_proc(buf, buf, sizeof(buf));
487 /* support app launched by shell script*/
488 if (strncmp(buf, BINSH_NAME, BINSH_SIZE) == 0)
489 return strdup(&buf[BINSH_SIZE + 1]);
494 static inline int __pkgmgr_read_proc(const char *path, char *buf, int size)
499 if (buf == NULL || path == NULL)
502 fd = open(path, O_RDONLY);
506 ret = read(fd, buf, size - 1);
518 static inline int __pkgmgr_find_pid_by_cmdline(const char *dname,
519 const char *cmdline, const char *apppath)
523 if (strncmp(cmdline, apppath, PKG_STRING_LEN_MAX-1) == 0) {
525 if (pid != getpgid(pid))
532 static int __sync_process(const char *req_key)
535 char info_file[PKG_STRING_LEN_MAX] = {'\0', };
539 char buf[PKG_STRING_LEN_MAX] = {0, };
541 snprintf(info_file, PKG_STRING_LEN_MAX, "%s/%s", PKG_SIZE_INFO_PATH, req_key);
546 if (access(info_file, F_OK) == 0) {
547 fp = fopen(info_file, "r");
549 DBG("file is not generated yet.... wait\n");
550 usleep(100 * 1000); /* 100ms sleep*/
554 if (fgets(buf, PKG_STRING_LEN_MAX, fp) == NULL) {
555 ERR("failed to read info file");
561 DBG("info_file file is generated, result = %s. \n", buf);
566 DBG("file is not generated yet.... wait\n");
567 usleep(100 * 1000); /* 100ms sleep*/
569 if (check_cnt > 6000) { /* 60s * 10 time over*/
570 ERR("wait time over!!\n");
575 ret = remove(info_file);
577 ERR("file is can not remove[%s, %d]\n", info_file, ret);
582 static int __csc_process(const char *csc_path, char *result_path)
589 char *pkgtype = NULL;
591 char buf[PKG_STRING_LEN_MAX] = {0,};
592 char type_buf[1024] = { 0 };
593 char des_buf[1024] = { 0 };
594 dictionary *csc = NULL;
597 csc = iniparser_load(csc_path);
598 retvm_if(csc == NULL, PKGMGR_R_EINVAL, "cannot open parse file [%s]", csc_path);
600 file = fopen(result_path, "w");
601 tryvm_if(file == NULL, ret = PKGMGR_R_EINVAL, "cannot open result file [%s]", result_path);
603 count = iniparser_getint(csc, "csc packages:count", -1);
604 tryvm_if(count == 0, ret = PKGMGR_R_ERROR, "csc [%s] dont have packages", csc_path);
606 snprintf(buf, PKG_STRING_LEN_MAX, "[result]\n");
607 fwrite(buf, 1, strlen(buf), file);
608 snprintf(buf, PKG_STRING_LEN_MAX, "count = %d\n", count);
609 fwrite(buf, 1, strlen(buf), file);
611 for(cnt = 1 ; cnt <= count ; cnt++)
613 snprintf(type_buf, PKG_STRING_LEN_MAX - 1, "csc packages:type_%03d", cnt);
614 snprintf(des_buf, PKG_STRING_LEN_MAX - 1, "csc packages:description_%03d", cnt);
616 pkgtype = iniparser_getstring(csc, type_buf, NULL);
617 des = iniparser_getstring(csc, des_buf, NULL);
620 if (pkgtype == NULL) {
622 snprintf(buf, PKG_STRING_LEN_MAX, "%s = Fail to get pkgtype\n", type_buf);
623 fwrite(buf, 1, strlen(buf), file);
625 } else if (des == NULL) {
627 snprintf(buf, PKG_STRING_LEN_MAX, "%s = Fail to get description\n", des_buf);
628 fwrite(buf, 1, strlen(buf), file);
632 snprintf(buf, PKG_STRING_LEN_MAX, "type_%03d = %s\n", cnt, pkgtype);
633 fwrite(buf, 1, strlen(buf), file);
634 snprintf(buf, PKG_STRING_LEN_MAX, "description_%03d = %s\n", cnt, des);
635 fwrite(buf, 1, strlen(buf), file);
637 if (strcmp(pkgtype, "tpk") == 0) {
638 const char *ospinstaller_argv[] = { "/usr/bin/osp-installer", "-c", des, NULL };
639 ret = __xsystem(ospinstaller_argv);
640 } else if (strcmp(pkgtype, "wgt")== 0) {
641 const char *wrtinstaller_argv[] = { "/usr/bin/wrt-installer", "-c", des, NULL };
642 ret = __xsystem(wrtinstaller_argv);
650 __error_to_string(ret, &errstr);
651 snprintf(buf, PKG_STRING_LEN_MAX, "result_%03d = fail[%s]\n", cnt, errstr);
654 snprintf(buf, PKG_STRING_LEN_MAX, "result_%03d = success\n", cnt);
656 fwrite(buf, 1, strlen(buf), file);
660 iniparser_freedict(csc);
670 static int __get_size_process(pkgmgr_client * pc, const char *pkgid, uid_t uid,
671 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
675 int ret = PKGMGR_R_ECOMM;
676 char *req_key = NULL;
677 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
679 if (pc == NULL || pkgid == NULL) {
680 ERR("invalid parameter");
681 return PKGMGR_R_EINVAL;
684 if (mpc->ctype != PC_REQUEST) {
685 ERR("mpc->ctype is not PC_REQUEST");
686 return PKGMGR_R_EINVAL;
688 result = comm_client_request(mpc->info.request.cc, "getsize",
689 g_variant_new("(usi)", uid, pkgid, get_type));
691 return PKGMGR_R_ECOMM;
693 g_variant_get(result, "(i&s)", &ret, &req_key);
694 if (req_key == NULL) {
695 g_variant_unref(result);
696 return PKGMGR_R_ECOMM;
698 if (ret != PKGMGR_R_OK) {
699 g_variant_unref(result);
703 ret = __sync_process(req_key);
705 ERR("get size failed, ret=%d\n", ret);
707 g_variant_unref(result);
712 static int __move_pkg_process(pkgmgr_client *pc, const char *pkgid,
713 const char *pkg_type, uid_t uid, pkgmgr_move_type move_type,
714 pkgmgr_handler event_cb, void *data)
718 ret = pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type, 0, uid);
720 ERR("move request failed");
725 ret = __sync_process(pkgid);
727 ERR("move pkg failed, ret=%d\n", ret);
732 static int __check_app_process(pkgmgr_request_service_type service_type,
733 pkgmgr_client *pc, const char *pkgid, uid_t uid, void *data)
735 GVariant *result = NULL;
736 int ret = PKGMGR_R_ECOMM;
737 pkgmgrinfo_pkginfo_h handle;
739 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
741 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST\n");
743 if (uid != GLOBAL_USER)
744 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
746 ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle);
747 retvm_if(ret < 0, PKGMGR_R_ERROR, "pkgmgrinfo_pkginfo_get_pkginfo failed");
749 if (service_type == PM_REQUEST_KILL_APP)
750 result = comm_client_request(mpc->info.request.cc, "kill",
751 g_variant_new("(us)", uid, pkgid));
752 else if (service_type == PM_REQUEST_CHECK_APP)
753 result = comm_client_request(mpc->info.request.cc, "check",
754 g_variant_new("(us)", uid, pkgid));
757 return PKGMGR_R_ECOMM;
758 g_variant_get(result, "(i)", &ret);
759 g_variant_unref(result);
760 if (ret != PKGMGR_R_OK) {
761 ERR("request failed, ret=%d", ret);
766 pid = __sync_process(pkgid);
769 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
775 static int __request_size_info(pkgmgr_client *pc, uid_t uid)
778 int ret = PKGMGR_R_ECOMM;
779 char *req_key = NULL;
780 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
783 ERR("invalid parameter");
784 return PKGMGR_R_EINVAL;
787 if (mpc->ctype != PC_REQUEST) {
788 ERR("mpc->ctype is not PC_REQUEST");
789 return PKGMGR_R_EINVAL;
792 result = comm_client_request(mpc->info.request.cc, "getsize",
793 g_variant_new("(usi)", uid, "size_info", PM_GET_SIZE_INFO));
795 return PKGMGR_R_ECOMM;
797 g_variant_get(result, "(i&s)", &ret, &req_key);
798 if (req_key == NULL) {
799 g_variant_unref(result);
800 return PKGMGR_R_ECOMM;
803 g_variant_unref(result);
808 static int __change_op_cb_for_getsize(pkgmgr_client *pc)
812 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
813 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
815 /* free listening head */
816 req_cb_info *tmp = NULL;
817 req_cb_info *prev = NULL;
818 for (tmp = mpc->info.request.rhead; tmp;) {
824 /* free dbus connection */
825 ret = comm_client_free(mpc->info.request.cc);
826 retvm_if(ret < 0, PKGMGR_R_ERROR, "comm_client_free() failed - %d", ret);
828 /* Manage pc for seperated event */
829 mpc->ctype = PC_REQUEST;
830 mpc->status_type = PKGMGR_CLIENT_STATUS_GET_SIZE;
833 mpc->info.request.cc = comm_client_new();
834 retvm_if(mpc->info.request.cc == NULL, PKGMGR_R_ERROR, "client creation failed");
836 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_GET_SIZE, mpc->info.request.cc, __operation_callback, pc);
837 retvm_if(ret < 0, PKGMGR_R_ERROR, "set_status_callback() failed - %d", ret);
842 static int __change_op_cb_for_enable_disable(pkgmgr_client *pc, bool is_disable)
846 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
847 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
849 /* free listening head */
850 req_cb_info *tmp = NULL;
851 req_cb_info *prev = NULL;
852 for (tmp = mpc->info.request.rhead; tmp;) {
858 /* free dbus connection */
859 ret = comm_client_free(mpc->info.request.cc);
860 retvm_if(ret < 0, PKGMGR_R_ERROR, "comm_client_free() failed - %d", ret);
862 /* Manage pc for seperated event */
863 mpc->ctype = PC_REQUEST;
865 mpc->status_type = PKGMGR_CLIENT_STATUS_DISABLE_APP;
867 mpc->status_type = PKGMGR_CLIENT_STATUS_ENABLE_APP;
870 mpc->info.request.cc = comm_client_new();
871 retvm_if(mpc->info.request.cc == NULL, PKGMGR_R_ERROR, "client creation failed");
874 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_DISABLE_APP, mpc->info.request.cc, __operation_callback, pc);
876 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ENABLE_APP, mpc->info.request.cc, __operation_callback, pc);
877 retvm_if(ret < 0, PKGMGR_R_ERROR, "set_status_callback() failed - %d", ret);
882 static int __get_pkg_size_info_cb(uid_t target_uid, int req_id, const char *req_type,
883 const char *pkgid, const char *key,
884 const char *value, const void *pc, void *user_data)
887 DBG("target_uid: %u, reqid: %d, req type: %s, pkgid: %s, unused key: %s, size info: %s",
888 target_uid, req_id, req_type, pkgid, key, value);
890 pkg_size_info_t *size_info = (pkg_size_info_t *)malloc(sizeof(pkg_size_info_t));
891 retvm_if(size_info == NULL, -1, "The memory is insufficient.");
893 char *save_ptr = NULL;
894 char *token = strtok_r((char*)value, ":", &save_ptr);
895 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
896 size_info->data_size = atoll(token);
897 token = strtok_r(NULL, ":", &save_ptr);
898 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
899 size_info->cache_size = atoll(token);
900 token = strtok_r(NULL, ":", &save_ptr);
901 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
902 size_info->app_size = atoll(token);
903 token = strtok_r(NULL, ":", &save_ptr);
904 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
905 size_info->ext_data_size = atoll(token);
906 token = strtok_r(NULL, ":", &save_ptr);
907 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
908 size_info->ext_cache_size = atoll(token);
909 token = strtok_r(NULL, ":", &save_ptr);
910 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
911 size_info->ext_app_size = atoll(token);
913 DBG("data: %lld, cache: %lld, app: %lld, ext_data: %lld, ext_cache: %lld, ext_app: %lld",
914 size_info->data_size, size_info->cache_size, size_info->app_size,
915 size_info->ext_data_size, size_info->ext_cache_size, size_info->ext_app_size);
917 pkgmgr_client_t *pmc = (pkgmgr_client_t *)pc;
918 tryvm_if(pmc == NULL, ret = -1, "pkgmgr_client instance is null.");
920 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
921 { // total package size info
922 pkgmgr_total_pkg_size_info_receive_cb callback = (pkgmgr_total_pkg_size_info_receive_cb)(pmc->new_event_cb);
923 callback((pkgmgr_client *)pc, size_info, user_data);
927 pkgmgr_pkg_size_info_receive_cb callback = (pkgmgr_pkg_size_info_receive_cb)(pmc->new_event_cb);
928 callback((pkgmgr_client *)pc, pkgid, size_info, user_data);
940 API pkgmgr_client *pkgmgr_client_new(client_type ctype)
942 pkgmgr_client_t *pc = NULL;
945 retvm_if(ctype == PC_BROADCAST, NULL, "broadcast type is not supported");
946 retvm_if(ctype != PC_REQUEST && ctype != PC_LISTENING, NULL, "ctype is not client_type");
948 /* Allocate memory for ADT:pkgmgr_client */
949 pc = calloc(1, sizeof(pkgmgr_client_t));
950 retvm_if(pc == NULL, NULL, "No memory");
954 pc->status_type = PKGMGR_CLIENT_STATUS_ALL;
957 if (pc->ctype == PC_REQUEST) {
958 pc->info.request.cc = comm_client_new();
959 trym_if(pc->info.request.cc == NULL, "client creation failed");
961 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ALL, pc->info.request.cc, __operation_callback, pc);
962 trym_if(ret < 0L, "comm_client_set_status_callback() failed - %d", ret);
963 } else if (pc->ctype == PC_LISTENING) {
964 pc->info.listening.cc = comm_client_new();
965 trym_if(pc->info.listening.cc == NULL, "client creation failed");
967 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ALL, pc->info.listening.cc, __status_callback, pc);
968 trym_if(ret < 0L, "comm_client_set_status_callback() failed - %d", ret);
971 return (pkgmgr_client *) pc;
979 API int pkgmgr_client_free(pkgmgr_client *pc)
982 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
983 retvm_if(mpc == NULL, PKGMGR_R_EINVAL, "Invalid argument");
985 if (mpc->ctype == PC_REQUEST) {
988 for (tmp = mpc->info.request.rhead; tmp;) {
994 ret = comm_client_free(mpc->info.request.cc);
995 tryvm_if(ret < 0, ret = PKGMGR_R_ERROR, "comm_client_free() failed");
996 } else if (mpc->ctype == PC_LISTENING) {
998 listen_cb_info *prev;
999 for (tmp = mpc->info.listening.lhead; tmp;) {
1005 ret = comm_client_free(mpc->info.listening.cc);
1006 tryvm_if(ret < 0, ret = PKGMGR_R_ERROR, "comm_client_free() failed");
1007 } else if (mpc->ctype == PC_BROADCAST) {
1010 ERR("Invalid client type\n");
1011 return PKGMGR_R_EINVAL;
1014 if (mpc->tep_path) {
1015 free(mpc->tep_path);
1016 mpc->tep_path = NULL;
1019 if (mpc->tep_move) {
1020 free(mpc->tep_move);
1021 mpc->tep_move = NULL;
1033 return PKGMGR_R_ERROR;
1036 static char *__get_type_from_path(const char *pkg_path)
1039 char mimetype[255] = { '\0', };
1040 char extlist[256] = { '\0', };
1043 ret = _get_mime_from_file(pkg_path, mimetype, sizeof(mimetype));
1045 ERR("_get_mime_from_file() failed - error code[%d]\n", ret);
1049 ret = _get_mime_extension(mimetype, extlist, sizeof(extlist));
1051 ERR("_get_mime_extension() failed - error code[%d]\n", ret);
1055 if (strlen(extlist) == 0)
1058 if (strchr(extlist, ','))
1059 extlist[strlen(extlist) - strlen(strchr(extlist, ','))] = '\0';
1061 pkg_type = strchr(extlist, '.') + 1;
1062 return strdup(pkg_type);
1065 API int pkgmgr_client_set_tep_path(pkgmgr_client *pc, char *tep_path, char *tep_move)
1067 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1068 retvm_if(tep_path == NULL, PKGMGR_R_EINVAL, "tep path is NULL");
1069 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1071 mpc->tep_path = strdup(tep_path);
1072 mpc->tep_move = strdup(tep_move);
1077 API int pkgmgr_client_usr_install(pkgmgr_client *pc, const char *pkg_type,
1078 const char *descriptor_path, const char *pkg_path,
1079 const char *optional_data, pkgmgr_mode mode,
1080 pkgmgr_handler event_cb, void *data, uid_t uid)
1083 int ret = PKGMGR_R_ECOMM;
1084 char *req_key = NULL;
1085 GVariantBuilder *builder = NULL;
1086 GVariant *args = NULL;
1088 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1091 if (pc == NULL || pkg_path == NULL) {
1092 ERR("invalid parameter");
1093 return PKGMGR_R_EINVAL;
1096 if (mpc->ctype != PC_REQUEST) {
1097 ERR("mpc->ctype is not PC_REQUEST");
1098 return PKGMGR_R_EINVAL;
1101 if (access(pkg_path, F_OK) != 0) {
1102 ERR("failed to access: %s", pkg_path);
1103 return PKGMGR_R_EINVAL;
1106 if (mpc->tep_path != NULL && access(mpc->tep_path, F_OK) != 0) {
1107 ERR("failed to access: %s", mpc->tep_path);
1108 return PKGMGR_R_EINVAL;
1111 /* TODO: check pkg's type on server-side */
1112 if (pkg_type == NULL)
1113 pkgtype = __get_type_from_path(pkg_path);
1115 pkgtype = strdup(pkg_type);
1117 /* build arguments */
1118 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1119 if (mpc->tep_path) {
1120 g_variant_builder_add(builder, "s", "-e");
1121 g_variant_builder_add(builder, "s", mpc->tep_path);
1122 g_variant_builder_add(builder, "s", "-M");
1123 g_variant_builder_add(builder, "s", mpc->tep_move);
1126 args = g_variant_new("as", builder);
1127 g_variant_builder_unref(builder);
1129 result = comm_client_request(mpc->info.request.cc, "install",
1130 g_variant_new("(uss@as)", uid, pkgtype, pkg_path, args));
1133 return PKGMGR_R_ECOMM;
1134 g_variant_get(result, "(i&s)", &ret, &req_key);
1135 if (req_key == NULL) {
1136 g_variant_unref(result);
1137 return PKGMGR_R_ECOMM;
1139 if (ret != PKGMGR_R_OK) {
1140 g_variant_unref(result);
1144 req_id = _get_request_id();
1145 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1147 g_variant_unref(result);
1152 API int pkgmgr_client_install(pkgmgr_client *pc, const char *pkg_type,
1153 const char *descriptor_path, const char *pkg_path,
1154 const char *optional_data, pkgmgr_mode mode,
1155 pkgmgr_handler event_cb, void *data)
1157 return pkgmgr_client_usr_install(pc, pkg_type, descriptor_path,
1158 pkg_path, optional_data, mode, event_cb,data,
1162 API int pkgmgr_client_reinstall(pkgmgr_client *pc, const char *pkg_type,
1163 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
1164 pkgmgr_handler event_cb, void *data)
1166 return pkgmgr_client_usr_reinstall(pc, pkg_type, pkgid, optional_data,
1167 mode, event_cb, data, _getuid());
1170 API int pkgmgr_client_usr_reinstall(pkgmgr_client * pc, const char *pkg_type,
1171 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
1172 pkgmgr_handler event_cb, void *data, uid_t uid)
1175 int ret = PKGMGR_R_ECOMM;
1176 char *req_key = NULL;
1178 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1180 pkgmgrinfo_pkginfo_h handle;
1182 if (pc == NULL || pkgid == NULL) {
1183 ERR("invalid parameter");
1184 return PKGMGR_R_EINVAL;
1187 if (mpc->ctype != PC_REQUEST) {
1188 ERR("mpc->ctype is not PC_REQUEST");
1189 return PKGMGR_R_EINVAL;
1192 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
1194 return PKGMGR_R_EINVAL;
1196 ret = pkgmgrinfo_pkginfo_get_type(handle, &pkgtype);
1198 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1199 return PKGMGR_R_ERROR;
1202 result = comm_client_request(mpc->info.request.cc, "reinstall",
1203 g_variant_new("(uss)", uid, pkgtype, pkgid));
1204 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1206 return PKGMGR_R_ECOMM;
1207 g_variant_get(result, "(i&s)", &ret, &req_key);
1208 if (req_key == NULL) {
1209 g_variant_unref(result);
1210 return PKGMGR_R_ECOMM;
1212 if (ret != PKGMGR_R_OK) {
1213 g_variant_unref(result);
1217 req_id = _get_request_id();
1218 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1220 g_variant_unref(result);
1225 API int pkgmgr_client_uninstall(pkgmgr_client *pc, const char *pkg_type,
1226 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
1229 return pkgmgr_client_usr_uninstall(pc, pkg_type,pkgid, mode, event_cb,
1233 API int pkgmgr_client_usr_uninstall(pkgmgr_client *pc, const char *pkg_type,
1234 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
1235 void *data, uid_t uid)
1238 int ret = PKGMGR_R_ECOMM;
1239 char *req_key = NULL;
1241 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1243 pkgmgrinfo_pkginfo_h handle;
1245 if (pc == NULL || pkgid == NULL) {
1246 ERR("invalid parameter");
1247 return PKGMGR_R_EINVAL;
1250 if (mpc->ctype != PC_REQUEST) {
1251 ERR("mpc->ctype is not PC_REQUEST");
1252 return PKGMGR_R_EINVAL;
1255 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
1257 return PKGMGR_R_EINVAL;
1259 ret = pkgmgrinfo_pkginfo_get_type(handle, &pkgtype);
1261 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1262 return PKGMGR_R_ERROR;
1265 /* TODO: check removable ? */
1267 result = comm_client_request(mpc->info.request.cc, "uninstall",
1268 g_variant_new("(uss)", uid, pkgtype, pkgid));
1269 if (result == NULL) {
1270 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1271 return PKGMGR_R_ECOMM;
1273 g_variant_get(result, "(i&s)", &ret, &req_key);
1274 if (req_key == NULL) {
1275 g_variant_unref(result);
1276 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1277 return PKGMGR_R_ECOMM;
1279 if (ret != PKGMGR_R_OK) {
1280 g_variant_unref(result);
1281 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1285 req_id = _get_request_id();
1286 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1288 g_variant_unref(result);
1289 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1294 API int pkgmgr_client_move(pkgmgr_client *pc, const char *pkg_type,
1295 const char *pkgid, pkgmgr_move_type move_type, pkgmgr_mode mode)
1297 return pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type, mode,
1300 API int pkgmgr_client_usr_move(pkgmgr_client *pc, const char *pkg_type,
1301 const char *pkgid, pkgmgr_move_type move_type,
1302 pkgmgr_mode mode, uid_t uid)
1305 int ret = PKGMGR_R_ECOMM;
1306 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1308 if (pc == NULL || pkg_type == NULL || pkgid == NULL) {
1309 ERR("invalid parameter");
1310 return PKGMGR_R_EINVAL;
1313 if ((move_type < PM_MOVE_TO_INTERNAL) || (move_type > PM_MOVE_TO_SDCARD))
1314 return PKGMGR_R_EINVAL;
1316 if (mpc->ctype != PC_REQUEST) {
1317 ERR("mpc->ctype is not PC_REQUEST");
1318 return PKGMGR_R_EINVAL;
1321 result = comm_client_request(mpc->info.request.cc, "move",
1322 g_variant_new("(uss)", uid, pkg_type, pkgid));
1324 return PKGMGR_R_ECOMM;
1325 g_variant_get(result, "(i)", &ret);
1326 g_variant_unref(result);
1331 API int pkgmgr_client_usr_activate(pkgmgr_client *pc, const char *pkg_type,
1332 const char *pkgid, uid_t uid)
1335 int ret = PKGMGR_R_ECOMM;
1336 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1338 if (pc == NULL || pkgid == NULL || pkg_type == NULL) {
1339 ERR("invalid parameter");
1340 return PKGMGR_R_EINVAL;
1343 result = comm_client_request(mpc->info.request.cc, "enable_pkg",
1344 g_variant_new("(uss)", uid, pkg_type, pkgid));
1346 return PKGMGR_R_ECOMM;
1347 g_variant_get(result, "(i)", &ret);
1348 g_variant_unref(result);
1353 API int pkgmgr_client_activate(pkgmgr_client *pc, const char *pkg_type,
1356 return pkgmgr_client_usr_activate(pc, pkg_type, pkgid, _getuid());
1359 API int pkgmgr_client_usr_deactivate(pkgmgr_client *pc, const char *pkg_type,
1360 const char *pkgid, uid_t uid)
1363 int ret = PKGMGR_R_ECOMM;
1364 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1366 if (pc == NULL || pkgid == NULL || pkg_type == NULL) {
1367 ERR("invalid parameter");
1368 return PKGMGR_R_EINVAL;
1371 result = comm_client_request(mpc->info.request.cc, "disable_pkg",
1372 g_variant_new("(uss)", uid, pkg_type, pkgid));
1374 return PKGMGR_R_ECOMM;
1375 g_variant_get(result, "(i)", &ret);
1376 g_variant_unref(result);
1381 API int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type,
1384 return pkgmgr_client_usr_deactivate(pc, pkg_type, pkgid, _getuid());
1387 /* TODO: deprecate? */
1388 API int pkgmgr_client_usr_activate_appv(pkgmgr_client *pc, const char *appid,
1389 char *const argv[], uid_t uid)
1391 return pkgmgr_client_usr_activate_app(pc, appid, NULL, uid);
1394 API int pkgmgr_client_activate_appv(pkgmgr_client *pc, const char *appid,
1397 return pkgmgr_client_usr_activate_app(pc, appid, NULL, _getuid());
1400 API int pkgmgr_client_usr_activate_app(pkgmgr_client *pc, const char *appid,
1401 pkgmgr_app_handler app_event_cb, uid_t uid)
1404 int ret = PKGMGR_R_ECOMM;
1406 char *req_key = NULL;
1407 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1409 if (pc == NULL || appid == NULL) {
1410 ERR("invalid parameter");
1411 return PKGMGR_R_EINVAL;
1414 if (__change_op_cb_for_enable_disable(mpc, false) < 0) {
1415 ERR("__change_op_cb_for_enable_disable failed");
1416 return PKGMGR_R_ESYSTEM;
1419 result = comm_client_request(mpc->info.request.cc, "enable_app",
1420 g_variant_new("(us)", uid, appid));
1422 return PKGMGR_R_ECOMM;
1423 g_variant_get(result, "(i&s)", &ret, &req_key);
1424 if (req_key == NULL) {
1425 g_variant_unref(result);
1426 return PKGMGR_R_ECOMM;
1428 if (ret != PKGMGR_R_OK) {
1429 g_variant_unref(result);
1433 req_id = _get_request_id();
1434 __add_op_app_cbinfo(pc, req_id, req_key, app_event_cb, NULL);
1435 g_variant_unref(result);
1439 API int pkgmgr_client_activate_app(pkgmgr_client * pc, const char *appid, pkgmgr_app_handler app_event_cb)
1441 return pkgmgr_client_usr_activate_app(pc, appid, app_event_cb, _getuid());
1444 API int pkgmgr_client_activate_global_app_for_uid(pkgmgr_client *pc,
1445 const char *appid, pkgmgr_app_handler app_event_cb, uid_t uid)
1448 int ret = PKGMGR_R_ECOMM;
1450 char *req_key = NULL;
1451 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1453 if (pc == NULL || appid == NULL) {
1454 ERR("invalid parameter");
1455 return PKGMGR_R_EINVAL;
1458 if (__change_op_cb_for_enable_disable(mpc, false) < 0) {
1459 ERR("__change_op_cb_for_enable_disable failed");
1460 return PKGMGR_R_ESYSTEM;
1463 result = comm_client_request(mpc->info.request.cc, "enable_global_app_for_uid",
1464 g_variant_new("(us)", uid, appid));
1466 return PKGMGR_R_ECOMM;
1467 g_variant_get(result, "(i&s)", &ret, &req_key);
1468 if (req_key == NULL) {
1469 g_variant_unref(result);
1470 return PKGMGR_R_ECOMM;
1472 if (ret != PKGMGR_R_OK) {
1473 g_variant_unref(result);
1477 req_id = _get_request_id();
1478 __add_op_app_cbinfo(pc, req_id, req_key, app_event_cb, NULL);
1483 API int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid,
1484 pkgmgr_app_handler app_event_cb, uid_t uid)
1487 int ret = PKGMGR_R_ECOMM;
1488 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1490 char *req_key = NULL;
1492 if (pc == NULL || appid == NULL) {
1493 ERR("invalid parameter");
1494 return PKGMGR_R_EINVAL;
1498 if (__change_op_cb_for_enable_disable(mpc, true) < 0) {
1499 ERR("__change_op_cb_for_enable_disable failed");
1500 return PKGMGR_R_ESYSTEM;
1503 result = comm_client_request(mpc->info.request.cc, "disable_app",
1504 g_variant_new("(us)", uid, appid));
1507 return PKGMGR_R_ECOMM;
1508 g_variant_get(result, "(i&s)", &ret, &req_key);
1509 if (req_key == NULL) {
1510 g_variant_unref(result);
1511 return PKGMGR_R_ECOMM;
1513 if (ret != PKGMGR_R_OK) {
1514 g_variant_unref(result);
1518 req_id = _get_request_id();
1519 __add_op_app_cbinfo(pc, req_id, req_key, app_event_cb, NULL);
1521 g_variant_unref(result);
1525 API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid, pkgmgr_app_handler app_event_cb)
1527 return pkgmgr_client_usr_deactivate_app(pc, appid, app_event_cb, _getuid());
1530 API int pkgmgr_client_deactivate_global_app_for_uid(pkgmgr_client *pc,
1531 const char *appid, pkgmgr_app_handler app_event_cb, uid_t uid)
1534 int ret = PKGMGR_R_ECOMM;
1536 char *req_key = NULL;
1537 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1539 if (pc == NULL || appid == NULL) {
1540 ERR("invalid parameter");
1541 return PKGMGR_R_EINVAL;
1544 if (__change_op_cb_for_enable_disable(mpc, true) < 0) {
1545 ERR("__change_op_cb_for_enable_disable failed");
1546 return PKGMGR_R_ESYSTEM;
1549 result = comm_client_request(mpc->info.request.cc, "disable_global_app_for_uid",
1550 g_variant_new("(us)", uid, appid));
1553 return PKGMGR_R_ECOMM;
1554 g_variant_get(result, "(i&s)", &ret, &req_key);
1555 if (req_key == NULL) {
1556 g_variant_unref(result);
1557 return PKGMGR_R_ECOMM;
1559 if (ret != PKGMGR_R_OK) {
1560 g_variant_unref(result);
1564 req_id = _get_request_id();
1565 __add_op_app_cbinfo(pc, req_id, req_key, app_event_cb, NULL);
1569 API int pkgmgr_client_usr_clear_user_data(pkgmgr_client *pc,
1570 const char *pkg_type, const char *appid, pkgmgr_mode mode,
1574 int ret = PKGMGR_R_ECOMM;
1575 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1577 if (pc == NULL || pkg_type == NULL || appid == NULL) {
1578 ERR("invalid parameter");
1579 return PKGMGR_R_EINVAL;
1582 if (mpc->ctype != PC_REQUEST) {
1583 ERR("mpc->ctype is not PC_REQUEST");
1584 return PKGMGR_R_EINVAL;
1587 result = comm_client_request(mpc->info.request.cc, "cleardata",
1588 g_variant_new("(uss)", uid, pkg_type, appid));
1590 return PKGMGR_R_ECOMM;
1592 g_variant_get(result, "(i)", &ret);
1593 g_variant_unref(result);
1598 API int pkgmgr_client_clear_user_data(pkgmgr_client *pc, const char *pkg_type,
1599 const char *appid, pkgmgr_mode mode)
1601 return pkgmgr_client_usr_clear_user_data(pc, pkg_type, appid, mode,
1605 API int pkgmgr_client_set_status_type(pkgmgr_client *pc, int status_type)
1609 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1610 retvm_if(status_type == PKGMGR_CLIENT_STATUS_ALL, PKGMGR_R_OK, "status_type is PKGMGR_CLIENT_STATUS_ALL");
1611 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1613 /* free listening head */
1614 listen_cb_info *tmp = NULL;
1615 listen_cb_info *prev = NULL;
1616 for (tmp = mpc->info.listening.lhead; tmp;) {
1622 /* free dbus connection */
1623 ret = comm_client_free(mpc->info.listening.cc);
1624 retvm_if(ret < 0, PKGMGR_R_ERROR, "comm_client_free() failed - %d", ret);
1626 /* Manage pc for seperated event */
1627 mpc->ctype = PC_LISTENING;
1628 mpc->status_type = status_type;
1630 mpc->info.listening.cc = comm_client_new();
1631 retvm_if(mpc->info.listening.cc == NULL, PKGMGR_R_EINVAL, "client creation failed");
1633 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_INSTALL) == PKGMGR_CLIENT_STATUS_INSTALL) {
1634 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_INSTALL, mpc->info.listening.cc, __status_callback, pc);
1635 retvm_if(ret < 0, PKGMGR_R_ECOMM, "PKGMGR_CLIENT_STATUS_INSTALL failed - %d", ret);
1638 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_UNINSTALL) == PKGMGR_CLIENT_STATUS_UNINSTALL) {
1639 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_UNINSTALL, mpc->info.listening.cc, __status_callback, pc);
1640 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_UNINSTALL failed - %d", ret);
1643 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_MOVE) == PKGMGR_CLIENT_STATUS_MOVE) {
1644 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_MOVE, mpc->info.listening.cc, __status_callback, pc);
1645 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_MOVE failed - %d", ret);
1648 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_INSTALL_PROGRESS) == PKGMGR_CLIENT_STATUS_INSTALL_PROGRESS) {
1649 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_INSTALL_PROGRESS, mpc->info.listening.cc, __status_callback, pc);
1650 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_INSTALL_PROGRESS failed - %d", ret);
1653 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_UPGRADE) == PKGMGR_CLIENT_STATUS_UPGRADE) {
1654 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_UPGRADE, mpc->info.listening.cc, __status_callback, pc);
1655 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_UPGRADE failed - %d", ret);
1658 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_ENABLE_APP) == PKGMGR_CLIENT_STATUS_ENABLE_APP) {
1659 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ENABLE_APP, mpc->info.listening.cc, __status_callback, pc);
1660 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_ENABLE_APP failed - %d", ret);
1663 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_DISABLE_APP) == PKGMGR_CLIENT_STATUS_DISABLE_APP) {
1664 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_DISABLE_APP, mpc->info.listening.cc, __status_callback, pc);
1665 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_DISABLE_APP failed - %d", ret);
1671 API int pkgmgr_client_listen_status(pkgmgr_client *pc, pkgmgr_handler event_cb,
1675 /* Check for NULL value of pc */
1676 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1677 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1679 /* 0. check input */
1680 retvm_if(mpc->ctype != PC_LISTENING, PKGMGR_R_EINVAL, "ctype is not PC_LISTENING");
1681 retvm_if(event_cb == NULL, PKGMGR_R_EINVAL, "event_cb is NULL");
1684 req_id = _get_request_id();
1686 /* 2. add callback info to pkgmgr_client */
1687 __add_stat_cbinfo(mpc, req_id, event_cb, data);
1691 API int pkgmgr_client_listen_app_status(pkgmgr_client *pc, pkgmgr_app_handler event_cb,
1695 /* Check for NULL value of pc */
1696 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1697 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1699 /* 0. check input */
1700 retvm_if(mpc->ctype != PC_LISTENING, PKGMGR_R_EINVAL, "ctype is not PC_LISTENING");
1701 retvm_if(event_cb == NULL, PKGMGR_R_EINVAL, "event_cb is NULL");
1704 req_id = _get_request_id();
1706 /* 2. add app callback info to pkgmgr_client */
1707 __add_app_stat_cbinfo(mpc, req_id, event_cb, data);
1711 API int pkgmgr_client_remove_listen_status(pkgmgr_client *pc)
1715 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1716 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1718 ret = __remove_stat_cbinfo(mpc);
1720 ERR("failed to remove status callback");
1721 return PKGMGR_R_ERROR;
1727 API int pkgmgr_client_broadcast_status(pkgmgr_client *pc, const char *pkg_type,
1728 const char *pkgid, const char *key,
1731 /* client cannot broadcast signal */
1735 API int pkgmgr_client_request_service(pkgmgr_request_service_type service_type, int service_mode,
1736 pkgmgr_client * pc, const char *pkg_type, const char *pkgid,
1737 const char *custom_info, pkgmgr_handler event_cb, void *data)
1739 return pkgmgr_client_usr_request_service(service_type, service_mode, pc, pkg_type, pkgid, _getuid(), custom_info, event_cb, data);
1742 API int pkgmgr_client_usr_request_service(pkgmgr_request_service_type service_type, int service_mode,
1743 pkgmgr_client * pc, const char *pkg_type, const char *pkgid, uid_t uid,
1744 const char *custom_info, pkgmgr_handler event_cb, void *data)
1748 /* Check for NULL value of service type */
1749 retvm_if(service_type > PM_REQUEST_MAX, PKGMGR_R_EINVAL, "service type is not defined\n");
1750 retvm_if(service_type < 0, PKGMGR_R_EINVAL, "service type is error\n");
1752 switch (service_type) {
1753 case PM_REQUEST_CSC:
1754 tryvm_if(custom_info == NULL, ret = PKGMGR_R_EINVAL, "custom_info is NULL\n");
1755 tryvm_if(strlen(custom_info) >= PKG_STRING_LEN_MAX, ret = PKGMGR_R_EINVAL, "custom_info over PKG_STRING_LEN_MAX");
1756 tryvm_if(data == NULL, ret = PKGMGR_R_EINVAL, "data is NULL\n");
1758 ret = __csc_process(custom_info, (char *)data);
1760 ERR("__csc_process fail \n");
1766 case PM_REQUEST_MOVE:
1767 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1768 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1769 tryvm_if((service_mode < PM_MOVE_TO_INTERNAL) || (service_mode > PM_MOVE_TO_SDCARD), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1771 ret = __move_pkg_process(pc, pkgid, pkg_type, uid, (pkgmgr_move_type)service_mode, event_cb, data);
1774 case PM_REQUEST_GET_SIZE:
1775 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1776 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1777 tryvm_if((service_mode < PM_GET_TOTAL_SIZE) || (service_mode >= PM_GET_MAX), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1779 ret = __get_size_process(pc, pkgid, uid, (pkgmgr_getsize_type)service_mode, event_cb, data);
1782 case PM_REQUEST_KILL_APP:
1783 case PM_REQUEST_CHECK_APP:
1784 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1785 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1787 ret = __check_app_process(service_type, pc, pkgid, uid, data);
1789 ERR("__check_app_process fail \n");
1796 ERR("Wrong Request\n");
1807 API int pkgmgr_client_usr_request_size_info(uid_t uid)
1810 pkgmgr_client *pc = NULL;
1812 pc = pkgmgr_client_new(PC_REQUEST);
1813 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "request pc is null\n");
1815 ret = __request_size_info(pc, uid);
1817 ERR("__request_size_info fail \n");
1820 pkgmgr_client_free(pc);
1824 API int pkgmgr_client_request_size_info(void) // get all package size (data, total)
1826 return pkgmgr_client_usr_request_size_info(_getuid());
1829 API int pkgmgr_client_usr_clear_cache_dir(const char *pkgid, uid_t uid)
1832 int ret = PKGMGR_R_ECOMM;
1833 pkgmgr_client_t *pc;
1835 if (pkgid == NULL) {
1836 ERR("invalid parameter");
1837 return PKGMGR_R_EINVAL;
1840 pc = pkgmgr_client_new(PC_REQUEST);
1842 ERR("out of memory");
1843 return PKGMGR_R_ESYSTEM;
1846 result = comm_client_request(pc->info.request.cc, "clearcache",
1847 g_variant_new("(us)", uid, pkgid));
1849 return PKGMGR_R_ECOMM;
1850 g_variant_get(result, "(i)", &ret);
1851 g_variant_unref(result);
1856 API int pkgmgr_client_clear_cache_dir(const char *pkgid)
1858 return pkgmgr_client_usr_clear_cache_dir(pkgid, _getuid());
1861 API int pkgmgr_client_clear_usr_all_cache_dir(uid_t uid)
1863 return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, uid);
1866 API int pkgmgr_client_clear_all_cache_dir(void)
1868 return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, _getuid());
1871 API int pkgmgr_client_get_size(pkgmgr_client * pc, const char *pkgid,
1872 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
1875 return pkgmgr_client_usr_get_size(pc, pkgid, get_type, event_cb, data,
1879 API int pkgmgr_client_usr_get_size(pkgmgr_client * pc, const char *pkgid,
1880 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
1881 void *data, uid_t uid)
1884 int ret = PKGMGR_R_ECOMM;
1885 char *req_key = NULL;
1887 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1889 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
1890 ERR("invalid parameter");
1891 return PKGMGR_R_EINVAL;
1894 if (mpc->ctype != PC_REQUEST) {
1895 ERR("mpc->ctype is not PC_REQUEST");
1896 return PKGMGR_R_EINVAL;
1900 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
1901 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
1903 get_type = PM_GET_PKG_SIZE_INFO;
1904 result = comm_client_request(mpc->info.request.cc, "getsize",
1905 g_variant_new("(usi)", uid, pkgid, get_type));
1907 return PKGMGR_R_ECOMM;
1909 g_variant_get(result, "(i&s)", &ret, &req_key);
1910 if (req_key == NULL) {
1911 g_variant_unref(result);
1912 return PKGMGR_R_ECOMM;
1914 if (ret != PKGMGR_R_OK) {
1915 g_variant_unref(result);
1919 req_id = _get_request_id();
1920 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1922 g_variant_unref(result);
1927 API int pkgmgr_client_usr_get_package_size_info(pkgmgr_client *pc,
1928 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
1929 void *user_data, uid_t uid)
1932 int ret = PKGMGR_R_ECOMM;
1933 char *req_key = NULL;
1936 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1938 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
1939 ERR("invalid parameter");
1940 return PKGMGR_R_EINVAL;
1943 if (mpc->ctype != PC_REQUEST) {
1944 ERR("mpc->ctype is not PC_REQUEST");
1945 return PKGMGR_R_EINVAL;
1949 if (__change_op_cb_for_getsize(mpc) < 0) {
1950 ERR("__change_op_cb_for_getsize failed");
1951 return PKGMGR_R_ESYSTEM;
1954 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
1955 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
1957 get_type = PM_GET_PKG_SIZE_INFO;
1958 result = comm_client_request(mpc->info.request.cc, "getsize",
1959 g_variant_new("(usi)", uid, pkgid, get_type));
1961 return PKGMGR_R_ECOMM;
1963 g_variant_get(result, "(i&s)", &ret, &req_key);
1964 if (req_key == NULL) {
1965 g_variant_unref(result);
1966 return PKGMGR_R_ECOMM;
1968 if (ret != PKGMGR_R_OK) {
1969 g_variant_unref(result);
1973 req_id = _get_request_id();
1974 __add_op_cbinfo(mpc, req_id, req_key, __get_pkg_size_info_cb, event_cb,
1977 g_variant_unref(result);
1982 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)
1984 return pkgmgr_client_usr_get_package_size_info(pc, pkgid, event_cb, user_data, _getuid());
1987 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)
1988 { // total package size info
1989 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL, (pkgmgr_pkg_size_info_receive_cb)event_cb, user_data, uid);
1992 API int pkgmgr_client_get_total_package_size_info(pkgmgr_client *pc, pkgmgr_total_pkg_size_info_receive_cb event_cb, void *user_data)
1994 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL, (pkgmgr_pkg_size_info_receive_cb)event_cb, user_data, _getuid());
1997 API int pkgmgr_client_generate_license_request(pkgmgr_client *pc,
1998 const char *resp_data, char **req_data, char **license_url)
2004 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2006 if (pc == NULL || resp_data == NULL || req_data == NULL ||
2007 license_url == NULL) {
2008 ERR("invalid parameter");
2009 return PKGMGR_R_EINVAL;
2012 if (mpc->ctype != PC_REQUEST) {
2013 ERR("mpc->ctype is not PC_REQUEST");
2014 return PKGMGR_R_EINVAL;
2017 result = comm_client_request(mpc->info.request.cc,
2018 "generate_license_request",
2019 g_variant_new("(s)", resp_data));
2021 return PKGMGR_R_ECOMM;
2023 g_variant_get(result, "(i&s&s)", &ret, &data, &url);
2024 if (ret != PKGMGR_R_OK) {
2025 ERR("generate_license_request failed: %d", ret);
2026 g_variant_unref(result);
2030 *req_data = strdup(data);
2031 *license_url = strdup(url);
2033 g_variant_unref(result);
2038 API int pkgmgr_client_register_license(pkgmgr_client *pc, const char *resp_data)
2042 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2044 if (pc == NULL || resp_data == NULL) {
2045 ERR("invalid parameter");
2046 return PKGMGR_R_EINVAL;
2049 if (mpc->ctype != PC_REQUEST) {
2050 ERR("mpc->ctype is not PC_REQUEST");
2051 return PKGMGR_R_EINVAL;
2054 result = comm_client_request(mpc->info.request.cc,
2055 "register_license", g_variant_new("(s)", resp_data));
2057 return PKGMGR_R_ECOMM;
2059 g_variant_get(result, "(i)", &ret);
2060 g_variant_unref(result);
2061 if (ret != PKGMGR_R_OK) {
2062 ERR("register license failed: %d", ret);
2069 API int pkgmgr_client_decrypt_package(pkgmgr_client *pc,
2070 const char *drm_file_path, const char *decrypted_file_path)
2074 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2076 if (pc == NULL || drm_file_path == NULL ||
2077 decrypted_file_path == NULL) {
2078 ERR("invalid parameter");
2079 return PKGMGR_R_EINVAL;
2082 if (mpc->ctype != PC_REQUEST) {
2083 ERR("mpc->ctype is not PC_REQUEST");
2084 return PKGMGR_R_EINVAL;
2087 result = comm_client_request(mpc->info.request.cc,
2088 "decrypt_package", g_variant_new("(ss)",
2089 drm_file_path, decrypted_file_path));
2091 return PKGMGR_R_ECOMM;
2093 g_variant_get(result, "(i)", &ret);
2094 g_variant_unref(result);
2095 if (ret != PKGMGR_R_OK) {
2096 ERR("decrypt_package failed: %d", ret);
2103 API int pkgmgr_client_usr_add_blacklist(pkgmgr_client *pc, const char *pkgid,
2107 int ret = PKGMGR_R_ECOMM;
2108 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2110 if (pc == NULL || pkgid == NULL) {
2111 ERR("invalid parameter");
2112 return PKGMGR_R_EINVAL;
2115 result = comm_client_request(mpc->info.request.cc, "add_blacklist",
2116 g_variant_new("(us)", uid, pkgid));
2118 return PKGMGR_R_ECOMM;
2119 g_variant_get(result, "(i)", &ret);
2120 g_variant_unref(result);
2125 API int pkgmgr_client_add_blacklist(pkgmgr_client *pc, const char *pkgid)
2127 return pkgmgr_client_usr_add_blacklist(pc, pkgid, _getuid());
2130 API int pkgmgr_client_usr_remove_blacklist(pkgmgr_client *pc,
2131 const char *pkgid, uid_t uid)
2134 int ret = PKGMGR_R_ECOMM;
2135 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2137 if (pc == NULL || pkgid == NULL) {
2138 ERR("invalid parameter");
2139 return PKGMGR_R_EINVAL;
2142 result = comm_client_request(mpc->info.request.cc, "remove_blacklist",
2143 g_variant_new("(us)", uid, pkgid));
2145 return PKGMGR_R_ECOMM;
2146 g_variant_get(result, "(i)", &ret);
2147 g_variant_unref(result);
2152 API int pkgmgr_client_remove_blacklist(pkgmgr_client *pc,
2155 return pkgmgr_client_usr_remove_blacklist(pc, pkgid, _getuid());
2158 API int pkgmgr_client_usr_check_blacklist(pkgmgr_client *pc, const char *pkgid,
2159 bool *blacklist, uid_t uid)
2162 int ret = PKGMGR_R_ECOMM;
2164 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2166 if (pc == NULL || pkgid == NULL) {
2167 ERR("invalid parameter");
2168 return PKGMGR_R_EINVAL;
2171 result = comm_client_request(mpc->info.request.cc, "check_blacklist",
2172 g_variant_new("(us)", uid, pkgid));
2174 return PKGMGR_R_ECOMM;
2175 g_variant_get(result, "(ii)", &b, &ret);
2176 g_variant_unref(result);
2178 if (ret != PKGMGR_R_OK)
2189 API int pkgmgr_client_check_blacklist(pkgmgr_client *pc, const char *pkgid,
2192 return pkgmgr_client_usr_check_blacklist(pc, pkgid, blacklist,