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)
53 static int _get_request_id()
55 static int internal_req_id = 1;
57 return internal_req_id++;
60 typedef struct _req_cb_info {
63 pkgmgr_handler event_cb;
64 pkgmgr_app_handler app_event_cb;
66 struct _req_cb_info *next;
69 typedef struct _listen_cb_info {
71 pkgmgr_handler event_cb;
72 pkgmgr_app_handler app_event_cb;
74 struct _listen_cb_info *next;
77 typedef struct _pkgmgr_client_t {
87 listen_cb_info *lhead;
95 typedef struct _iter_data {
96 pkgmgr_iter_fn iter_fn;
100 static int __xsystem(const char *argv[])
107 perror("fork failed");
111 execvp(argv[0], (char *const *)argv);
117 if (waitpid(pid, &status, 0) == -1) {
118 perror("waitpid failed");
121 if (WIFSIGNALED(status)) {
125 if (!WIFEXITED(status)) {
126 /* shouldn't happen */
127 perror("should not happen");
130 return WEXITSTATUS(status);
133 static void __error_to_string(int errnumber, char **errstr)
138 case PKGCMD_ERR_PACKAGE_NOT_FOUND:
139 *errstr = PKGCMD_ERR_PACKAGE_NOT_FOUND_STR;
141 case PKGCMD_ERR_PACKAGE_INVALID:
142 *errstr = PKGCMD_ERR_PACKAGE_INVALID_STR;
144 case PKGCMD_ERR_PACKAGE_LOWER_VERSION:
145 *errstr = PKGCMD_ERR_PACKAGE_LOWER_VERSION_STR;
147 case PKGCMD_ERR_PACKAGE_EXECUTABLE_NOT_FOUND:
148 *errstr = PKGCMD_ERR_PACKAGE_EXECUTABLE_NOT_FOUND_STR;
150 case PKGCMD_ERR_MANIFEST_INVALID:
151 *errstr = PKGCMD_ERR_MANIFEST_INVALID_STR;
153 case PKGCMD_ERR_CONFIG_NOT_FOUND:
154 *errstr = PKGCMD_ERR_CONFIG_NOT_FOUND_STR;
156 case PKGCMD_ERR_CONFIG_INVALID:
157 *errstr = PKGCMD_ERR_CONFIG_INVALID_STR;
159 case PKGCMD_ERR_SIGNATURE_NOT_FOUND:
160 *errstr = PKGCMD_ERR_SIGNATURE_NOT_FOUND_STR;
162 case PKGCMD_ERR_SIGNATURE_INVALID:
163 *errstr = PKGCMD_ERR_SIGNATURE_INVALID_STR;
165 case PKGCMD_ERR_SIGNATURE_VERIFICATION_FAILED:
166 *errstr = PKGCMD_ERR_SIGNATURE_VERIFICATION_FAILED_STR;
168 case PKGCMD_ERR_ROOT_CERTIFICATE_NOT_FOUND:
169 *errstr = PKGCMD_ERR_ROOT_CERTIFICATE_NOT_FOUND_STR;
171 case PKGCMD_ERR_CERTIFICATE_INVALID:
172 *errstr = PKGCMD_ERR_CERTIFICATE_INVALID_STR;
174 case PKGCMD_ERR_CERTIFICATE_CHAIN_VERIFICATION_FAILED:
175 *errstr = PKGCMD_ERR_CERTIFICATE_CHAIN_VERIFICATION_FAILED_STR;
177 case PKGCMD_ERR_CERTIFICATE_EXPIRED:
178 *errstr = PKGCMD_ERR_CERTIFICATE_EXPIRED_STR;
180 case PKGCMD_ERR_INVALID_PRIVILEGE:
181 *errstr = PKGCMD_ERR_INVALID_PRIVILEGE_STR;
183 case PKGCMD_ERR_MENU_ICON_NOT_FOUND:
184 *errstr = PKGCMD_ERR_MENU_ICON_NOT_FOUND_STR;
186 case PKGCMD_ERR_FATAL_ERROR:
187 *errstr = PKGCMD_ERR_FATAL_ERROR_STR;
189 case PKGCMD_ERR_OUT_OF_STORAGE:
190 *errstr = PKGCMD_ERR_OUT_OF_STORAGE_STR;
192 case PKGCMD_ERR_OUT_OF_MEMORY:
193 *errstr = PKGCMD_ERR_OUT_OF_MEMORY_STR;
195 case PKGCMD_ERR_ARGUMENT_INVALID:
196 *errstr = PKGCMD_ERR_ARGUMENT_INVALID_STR;
199 *errstr = PKGCMD_ERR_UNKNOWN_STR;
204 static void __add_op_cbinfo(pkgmgr_client_t * pc, int request_id,
205 const char *req_key, pkgmgr_handler event_cb, void *new_event_cb,
208 req_cb_info *cb_info;
209 req_cb_info *current;
212 cb_info = (req_cb_info *) calloc(1, sizeof(req_cb_info));
213 if (cb_info == NULL) {
214 DBG("calloc failed");
217 cb_info->request_id = request_id;
218 cb_info->req_key = strdup(req_key);
219 cb_info->event_cb = event_cb;
220 cb_info->data = data;
221 cb_info->next = NULL;
222 cb_info->app_event_cb = NULL;
223 pc->new_event_cb = new_event_cb;
225 if (pc->info.request.rhead == NULL)
226 pc->info.request.rhead = cb_info;
228 current = prev = pc->info.request.rhead;
231 current = current->next;
234 prev->next = cb_info;
238 static void __add_op_app_cbinfo(pkgmgr_client_t * pc, int request_id,
239 const char *req_key, pkgmgr_app_handler app_event_cb, void *data)
241 req_cb_info *cb_info;
242 req_cb_info *current;
245 cb_info = (req_cb_info *) calloc(1, sizeof(req_cb_info));
246 if (cb_info == NULL) {
247 DBG("calloc failed");
250 cb_info->request_id = request_id;
251 cb_info->req_key = strdup(req_key);
252 cb_info->event_cb = NULL;
253 cb_info->app_event_cb = app_event_cb;
254 cb_info->data = data;
255 cb_info->next = NULL;
256 pc->new_event_cb = NULL;
258 if (pc->info.request.rhead == NULL)
259 pc->info.request.rhead = cb_info;
261 current = prev = pc->info.request.rhead;
264 current = current->next;
267 prev->next = cb_info;
271 static req_cb_info *__find_op_cbinfo(pkgmgr_client_t *pc, const char *req_key)
275 tmp = pc->info.request.rhead;
282 DBG("tmp->req_key %s, req_key %s", tmp->req_key, req_key);
285 if (strncmp(tmp->req_key, req_key, strlen(tmp->req_key)) == 0)
292 static int __remove_stat_cbinfo(pkgmgr_client_t *pc)
294 listen_cb_info *info = pc->info.listening.lhead;
295 listen_cb_info *next = NULL;
297 while (info != NULL) {
303 pc->info.listening.lhead = NULL;
307 static void __add_app_stat_cbinfo(pkgmgr_client_t *pc, int request_id,
308 pkgmgr_app_handler event_cb, void *data)
310 listen_cb_info *cb_info;
311 listen_cb_info *current;
312 listen_cb_info *prev;
314 cb_info = (listen_cb_info *) calloc(1, sizeof(listen_cb_info));
315 if (cb_info == NULL) {
316 DBG("calloc failed");
319 cb_info->request_id = request_id;
320 cb_info->app_event_cb = event_cb;
321 cb_info->data = data;
322 cb_info->next = NULL;
324 if (pc->info.listening.lhead == NULL)
325 pc->info.listening.lhead = cb_info;
327 current = prev = pc->info.listening.lhead;
330 current = current->next;
333 prev->next = cb_info;
337 static void __add_stat_cbinfo(pkgmgr_client_t *pc, int request_id,
338 pkgmgr_handler event_cb, void *data)
340 listen_cb_info *cb_info;
341 listen_cb_info *current;
342 listen_cb_info *prev;
344 cb_info = (listen_cb_info *) calloc(1, sizeof(listen_cb_info));
345 if (cb_info == NULL) {
346 DBG("calloc failed");
349 cb_info->request_id = request_id;
350 cb_info->event_cb = event_cb;
351 cb_info->data = data;
352 cb_info->next = NULL;
354 /* TODO - check the order of callback - FIFO or LIFO => Should be changed to LIFO */
355 if (pc->info.listening.lhead == NULL)
356 pc->info.listening.lhead = cb_info;
358 current = prev = pc->info.listening.lhead;
361 current = current->next;
364 prev->next = cb_info;
368 static void __operation_callback(void *cb_data, uid_t target_uid,
369 const char *req_id, const char *pkg_type,
370 const char *pkgid, const char *appid,
371 const char *key, const char *val)
374 req_cb_info *cb_info;
376 pc = (pkgmgr_client_t *) cb_data;
378 /* find callback info */
379 cb_info = __find_op_cbinfo(pc, req_id);
380 if (cb_info == NULL) {
381 ERR("cannot fint cb_info for req_id:%s", req_id);
386 if (appid != NULL && strlen(appid) != 0) {
387 /* run app callback */
388 if (pc->new_event_cb)
389 cb_info->app_event_cb(target_uid, cb_info->request_id,
390 pkg_type, pkgid, appid, key, val, pc,
393 cb_info->app_event_cb(target_uid, cb_info->request_id,
394 pkg_type, pkgid, appid, key, val, NULL,
397 /* run pkg callback */
398 if (pc->new_event_cb)
399 cb_info->event_cb(target_uid, cb_info->request_id,
400 pkg_type, pkgid, key, val, pc,
403 cb_info->event_cb(target_uid, cb_info->request_id,
404 pkg_type, pkgid, key, val, NULL,
411 static void __status_callback(void *cb_data, uid_t target_uid,
412 const char *req_id, const char *pkg_type,
413 const char *pkgid, const char *appid,
414 const char *key, const char *val)
419 pc = (pkgmgr_client_t *) cb_data;
421 tmp = pc->info.listening.lhead;
423 if (appid != NULL && strlen(appid) != 0) {
424 /* run app callback */
425 if (tmp->app_event_cb && tmp->app_event_cb(
426 target_uid, tmp->request_id, pkg_type, pkgid,
427 appid, key, val, NULL, tmp->data) != 0)
430 /* run pkg callback */
431 if (tmp->event_cb && tmp->event_cb(
432 target_uid, tmp->request_id, pkg_type, pkgid,
433 key, val, NULL, tmp->data) != 0)
442 static inline int __read_proc(const char *path, char *buf, int size)
447 if (buf == NULL || path == NULL)
450 fd = open(path, O_RDONLY);
454 ret = read(fd, buf, size - 1);
466 char *__proc_get_cmdline_bypid(int pid)
468 char buf[PKG_STRING_LEN_MAX] = {'\0', };
471 snprintf(buf, sizeof(buf), "/proc/%d/cmdline", pid);
472 ret = __read_proc(buf, buf, sizeof(buf));
476 /* support app launched by shell script*/
477 if (strncmp(buf, BINSH_NAME, BINSH_SIZE) == 0)
478 return strdup(&buf[BINSH_SIZE + 1]);
483 static inline int __pkgmgr_read_proc(const char *path, char *buf, int size)
488 if (buf == NULL || path == NULL)
491 fd = open(path, O_RDONLY);
495 ret = read(fd, buf, size - 1);
507 static inline int __pkgmgr_find_pid_by_cmdline(const char *dname,
508 const char *cmdline, const char *apppath)
512 if (strncmp(cmdline, apppath, PKG_STRING_LEN_MAX-1) == 0) {
514 if (pid != getpgid(pid))
521 static int __sync_process(const char *req_key)
524 char info_file[PKG_STRING_LEN_MAX] = {'\0', };
528 char buf[PKG_STRING_LEN_MAX] = {0, };
530 snprintf(info_file, PKG_STRING_LEN_MAX, "%s/%s", PKG_SIZE_INFO_PATH, req_key);
535 if (access(info_file, F_OK) == 0) {
536 fp = fopen(info_file, "r");
538 DBG("file is not generated yet.... wait\n");
539 usleep(100 * 1000); /* 100ms sleep*/
543 if (fgets(buf, PKG_STRING_LEN_MAX, fp) == NULL) {
544 ERR("failed to read info file");
550 DBG("info_file file is generated, result = %s. \n", buf);
555 DBG("file is not generated yet.... wait\n");
556 usleep(100 * 1000); /* 100ms sleep*/
558 if (check_cnt > 6000) { /* 60s * 10 time over*/
559 ERR("wait time over!!\n");
564 ret = remove(info_file);
566 ERR("file is can not remove[%s, %d]\n", info_file, ret);
571 static int __csc_process(const char *csc_path, char *result_path)
578 char *pkgtype = NULL;
580 char buf[PKG_STRING_LEN_MAX] = {0,};
581 char type_buf[1024] = { 0 };
582 char des_buf[1024] = { 0 };
583 dictionary *csc = NULL;
586 csc = iniparser_load(csc_path);
587 retvm_if(csc == NULL, PKGMGR_R_EINVAL, "cannot open parse file [%s]", csc_path);
589 file = fopen(result_path, "w");
590 tryvm_if(file == NULL, ret = PKGMGR_R_EINVAL, "cannot open result file [%s]", result_path);
592 count = iniparser_getint(csc, "csc packages:count", -1);
593 tryvm_if(count == 0, ret = PKGMGR_R_ERROR, "csc [%s] dont have packages", csc_path);
595 snprintf(buf, PKG_STRING_LEN_MAX, "[result]\n");
596 fwrite(buf, 1, strlen(buf), file);
597 snprintf(buf, PKG_STRING_LEN_MAX, "count = %d\n", count);
598 fwrite(buf, 1, strlen(buf), file);
600 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);
643 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;
677 result = comm_client_request(mpc->info.request.cc, "getsize",
678 g_variant_new("(usi)", uid, pkgid, get_type));
680 return PKGMGR_R_ECOMM;
682 g_variant_get(result, "(i&s)", &ret, &req_key);
683 if (req_key == NULL) {
684 g_variant_unref(result);
685 return PKGMGR_R_ECOMM;
687 if (ret != PKGMGR_R_OK) {
688 g_variant_unref(result);
692 ret = __sync_process(req_key);
694 ERR("get size failed, ret=%d\n", ret);
696 g_variant_unref(result);
701 static int __move_pkg_process(pkgmgr_client *pc, const char *pkgid,
702 const char *pkg_type, uid_t uid, pkgmgr_move_type move_type,
703 pkgmgr_handler event_cb, void *data)
707 ret = pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type, 0, uid);
709 ERR("move request failed");
714 ret = __sync_process(pkgid);
716 ERR("move pkg failed, ret=%d\n", ret);
721 static int __check_app_process(pkgmgr_request_service_type service_type,
722 pkgmgr_client *pc, const char *pkgid, uid_t uid, void *data)
724 GVariant *result = NULL;
725 int ret = PKGMGR_R_ECOMM;
726 pkgmgrinfo_pkginfo_h handle;
728 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
730 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST\n");
732 if (uid != GLOBAL_USER)
733 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
735 ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle);
736 retvm_if(ret < 0, PKGMGR_R_ERROR, "pkgmgrinfo_pkginfo_get_pkginfo failed");
738 if (service_type == PM_REQUEST_KILL_APP)
739 result = comm_client_request(mpc->info.request.cc, "kill",
740 g_variant_new("(us)", uid, pkgid));
741 else if (service_type == PM_REQUEST_CHECK_APP)
742 result = comm_client_request(mpc->info.request.cc, "check",
743 g_variant_new("(us)", uid, pkgid));
746 return PKGMGR_R_ECOMM;
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 result = comm_client_request(mpc->info.request.cc, "getsize",
782 g_variant_new("(usi)", uid, "size_info", PM_GET_SIZE_INFO));
784 return PKGMGR_R_ECOMM;
786 g_variant_get(result, "(i&s)", &ret, &req_key);
787 if (req_key == NULL) {
788 g_variant_unref(result);
789 return PKGMGR_R_ECOMM;
792 g_variant_unref(result);
797 static int __change_op_cb_for_getsize(pkgmgr_client *pc)
801 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
802 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
804 /* free listening head */
805 req_cb_info *tmp = NULL;
806 req_cb_info *prev = NULL;
807 for (tmp = mpc->info.request.rhead; tmp;) {
813 /* free dbus connection */
814 ret = comm_client_free(mpc->info.request.cc);
815 retvm_if(ret < 0, PKGMGR_R_ERROR, "comm_client_free() failed - %d", ret);
817 /* Manage pc for seperated event */
818 mpc->ctype = PC_REQUEST;
819 mpc->status_type = PKGMGR_CLIENT_STATUS_GET_SIZE;
822 mpc->info.request.cc = comm_client_new();
823 retvm_if(mpc->info.request.cc == NULL, PKGMGR_R_ERROR, "client creation failed");
825 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_GET_SIZE, mpc->info.request.cc, __operation_callback, pc);
826 retvm_if(ret < 0, PKGMGR_R_ERROR, "set_status_callback() failed - %d", ret);
831 static int __change_op_cb_for_enable_disable(pkgmgr_client *pc, bool is_disable)
835 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
836 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
838 /* free listening head */
839 req_cb_info *tmp = NULL;
840 req_cb_info *prev = NULL;
841 for (tmp = mpc->info.request.rhead; tmp;) {
847 /* free dbus connection */
848 ret = comm_client_free(mpc->info.request.cc);
849 retvm_if(ret < 0, PKGMGR_R_ERROR, "comm_client_free() failed - %d", ret);
851 /* Manage pc for seperated event */
852 mpc->ctype = PC_REQUEST;
854 mpc->status_type = PKGMGR_CLIENT_STATUS_DISABLE_APP;
856 mpc->status_type = PKGMGR_CLIENT_STATUS_ENABLE_APP;
859 mpc->info.request.cc = comm_client_new();
860 retvm_if(mpc->info.request.cc == NULL, PKGMGR_R_ERROR, "client creation failed");
863 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_DISABLE_APP, mpc->info.request.cc, __operation_callback, pc);
865 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ENABLE_APP, mpc->info.request.cc, __operation_callback, pc);
866 retvm_if(ret < 0, PKGMGR_R_ERROR, "set_status_callback() failed - %d", ret);
871 static int __get_pkg_size_info_cb(uid_t target_uid, int req_id, const char *req_type,
872 const char *pkgid, const char *key,
873 const char *value, const void *pc, void *user_data)
876 DBG("target_uid: %u, reqid: %d, req type: %s, pkgid: %s, unused key: %s, size info: %s",
877 target_uid, req_id, req_type, pkgid, key, value);
879 pkg_size_info_t *size_info = (pkg_size_info_t *)malloc(sizeof(pkg_size_info_t));
880 retvm_if(size_info == NULL, -1, "The memory is insufficient.");
882 char *save_ptr = NULL;
883 char *token = strtok_r((char*)value, ":", &save_ptr);
884 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
885 size_info->data_size = atoll(token);
886 token = strtok_r(NULL, ":", &save_ptr);
887 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
888 size_info->cache_size = atoll(token);
889 token = strtok_r(NULL, ":", &save_ptr);
890 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
891 size_info->app_size = atoll(token);
892 token = strtok_r(NULL, ":", &save_ptr);
893 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
894 size_info->ext_data_size = atoll(token);
895 token = strtok_r(NULL, ":", &save_ptr);
896 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
897 size_info->ext_cache_size = atoll(token);
898 token = strtok_r(NULL, ":", &save_ptr);
899 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
900 size_info->ext_app_size = atoll(token);
902 DBG("data: %lld, cache: %lld, app: %lld, ext_data: %lld, ext_cache: %lld, ext_app: %lld",
903 size_info->data_size, size_info->cache_size, size_info->app_size,
904 size_info->ext_data_size, size_info->ext_cache_size, size_info->ext_app_size);
906 pkgmgr_client_t *pmc = (pkgmgr_client_t *)pc;
907 tryvm_if(pmc == NULL, ret = -1, "pkgmgr_client instance is null.");
909 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
910 { // total package size info
911 pkgmgr_total_pkg_size_info_receive_cb callback = (pkgmgr_total_pkg_size_info_receive_cb)(pmc->new_event_cb);
912 callback((pkgmgr_client *)pc, size_info, user_data);
916 pkgmgr_pkg_size_info_receive_cb callback = (pkgmgr_pkg_size_info_receive_cb)(pmc->new_event_cb);
917 callback((pkgmgr_client *)pc, pkgid, size_info, user_data);
929 API pkgmgr_client *pkgmgr_client_new(client_type ctype)
931 pkgmgr_client_t *pc = NULL;
934 retvm_if(ctype == PC_BROADCAST, NULL, "broadcast type is not supported");
935 retvm_if(ctype != PC_REQUEST && ctype != PC_LISTENING, NULL, "ctype is not client_type");
937 /* Allocate memory for ADT:pkgmgr_client */
938 pc = calloc(1, sizeof(pkgmgr_client_t));
939 retvm_if(pc == NULL, NULL, "No memory");
943 pc->status_type = PKGMGR_CLIENT_STATUS_ALL;
946 if (pc->ctype == PC_REQUEST) {
947 pc->info.request.cc = comm_client_new();
948 trym_if(pc->info.request.cc == NULL, "client creation failed");
950 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ALL, pc->info.request.cc, __operation_callback, pc);
951 trym_if(ret < 0L, "comm_client_set_status_callback() failed - %d", ret);
952 } else if (pc->ctype == PC_LISTENING) {
953 pc->info.listening.cc = comm_client_new();
954 trym_if(pc->info.listening.cc == NULL, "client creation failed");
956 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ALL, pc->info.listening.cc, __status_callback, pc);
957 trym_if(ret < 0L, "comm_client_set_status_callback() failed - %d", ret);
960 return (pkgmgr_client *) pc;
968 API int pkgmgr_client_free(pkgmgr_client *pc)
971 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
972 retvm_if(mpc == NULL, PKGMGR_R_EINVAL, "Invalid argument");
974 if (mpc->ctype == PC_REQUEST) {
977 for (tmp = mpc->info.request.rhead; tmp;) {
983 ret = comm_client_free(mpc->info.request.cc);
984 tryvm_if(ret < 0, ret = PKGMGR_R_ERROR, "comm_client_free() failed");
985 } else if (mpc->ctype == PC_LISTENING) {
987 listen_cb_info *prev;
988 for (tmp = mpc->info.listening.lhead; tmp;) {
994 ret = comm_client_free(mpc->info.listening.cc);
995 tryvm_if(ret < 0, ret = PKGMGR_R_ERROR, "comm_client_free() failed");
996 } else if (mpc->ctype == PC_BROADCAST) {
999 ERR("Invalid client type\n");
1000 return PKGMGR_R_EINVAL;
1003 if (mpc->tep_path) {
1004 free(mpc->tep_path);
1005 mpc->tep_path = NULL;
1008 if (mpc->tep_move) {
1009 free(mpc->tep_move);
1010 mpc->tep_move = NULL;
1022 return PKGMGR_R_ERROR;
1025 static char *__get_type_from_path(const char *pkg_path)
1028 char mimetype[255] = { '\0', };
1029 char extlist[256] = { '\0', };
1032 ret = _get_mime_from_file(pkg_path, mimetype, sizeof(mimetype));
1034 ERR("_get_mime_from_file() failed - error code[%d]\n", ret);
1038 ret = _get_mime_extension(mimetype, extlist, sizeof(extlist));
1040 ERR("_get_mime_extension() failed - error code[%d]\n", ret);
1044 if (strlen(extlist) == 0)
1047 if (strchr(extlist, ','))
1048 extlist[strlen(extlist) - strlen(strchr(extlist, ','))] = '\0';
1050 pkg_type = strchr(extlist, '.') + 1;
1051 return strdup(pkg_type);
1054 API int pkgmgr_client_set_tep_path(pkgmgr_client *pc, char *tep_path, char *tep_move)
1056 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1057 retvm_if(tep_path == NULL, PKGMGR_R_EINVAL, "tep path is NULL");
1058 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1060 mpc->tep_path = strdup(tep_path);
1061 mpc->tep_move = strdup(tep_move);
1066 API int pkgmgr_client_usr_install(pkgmgr_client *pc, const char *pkg_type,
1067 const char *descriptor_path, const char *pkg_path,
1068 const char *optional_data, pkgmgr_mode mode,
1069 pkgmgr_handler event_cb, void *data, uid_t uid)
1072 int ret = PKGMGR_R_ECOMM;
1073 char *req_key = NULL;
1074 GVariantBuilder *builder = NULL;
1075 GVariant *args = NULL;
1077 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1080 if (pc == NULL || pkg_path == NULL) {
1081 ERR("invalid parameter");
1082 return PKGMGR_R_EINVAL;
1085 if (mpc->ctype != PC_REQUEST) {
1086 ERR("mpc->ctype is not PC_REQUEST");
1087 return PKGMGR_R_EINVAL;
1090 if (access(pkg_path, F_OK) != 0) {
1091 ERR("failed to access: %s", pkg_path);
1092 return PKGMGR_R_EINVAL;
1095 if (mpc->tep_path != NULL && access(mpc->tep_path, F_OK) != 0) {
1096 ERR("failed to access: %s", mpc->tep_path);
1097 return PKGMGR_R_EINVAL;
1100 /* TODO: check pkg's type on server-side */
1101 if (pkg_type == NULL)
1102 pkgtype = __get_type_from_path(pkg_path);
1104 pkgtype = strdup(pkg_type);
1106 /* build arguments */
1107 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1108 if (mpc->tep_path) {
1109 g_variant_builder_add(builder, "s", "-e");
1110 g_variant_builder_add(builder, "s", mpc->tep_path);
1111 g_variant_builder_add(builder, "s", "-M");
1112 g_variant_builder_add(builder, "s", mpc->tep_move);
1115 args = g_variant_new("as", builder);
1116 g_variant_builder_unref(builder);
1118 result = comm_client_request(mpc->info.request.cc, "install",
1119 g_variant_new("(uss@as)", uid, pkgtype, pkg_path, args));
1122 return PKGMGR_R_ECOMM;
1123 g_variant_get(result, "(i&s)", &ret, &req_key);
1124 if (req_key == NULL) {
1125 g_variant_unref(result);
1126 return PKGMGR_R_ECOMM;
1128 if (ret != PKGMGR_R_OK) {
1129 g_variant_unref(result);
1133 req_id = _get_request_id();
1134 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1136 g_variant_unref(result);
1141 API int pkgmgr_client_install(pkgmgr_client *pc, const char *pkg_type,
1142 const char *descriptor_path, const char *pkg_path,
1143 const char *optional_data, pkgmgr_mode mode,
1144 pkgmgr_handler event_cb, void *data)
1146 return pkgmgr_client_usr_install(pc, pkg_type, descriptor_path,
1147 pkg_path, optional_data, mode, event_cb,data,
1151 API int pkgmgr_client_reinstall(pkgmgr_client *pc, const char *pkg_type,
1152 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
1153 pkgmgr_handler event_cb, void *data)
1155 return pkgmgr_client_usr_reinstall(pc, pkg_type, pkgid, optional_data,
1156 mode, event_cb, data,GLOBAL_USER);
1159 API int pkgmgr_client_usr_reinstall(pkgmgr_client * pc, const char *pkg_type,
1160 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
1161 pkgmgr_handler event_cb, void *data, uid_t uid)
1164 int ret = PKGMGR_R_ECOMM;
1165 char *req_key = NULL;
1167 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1169 pkgmgrinfo_pkginfo_h handle;
1171 if (pc == NULL || pkgid == NULL) {
1172 ERR("invalid parameter");
1173 return PKGMGR_R_EINVAL;
1176 if (mpc->ctype != PC_REQUEST) {
1177 ERR("mpc->ctype is not PC_REQUEST");
1178 return PKGMGR_R_EINVAL;
1181 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
1183 return PKGMGR_R_EINVAL;
1185 ret = pkgmgrinfo_pkginfo_get_type(handle, &pkgtype);
1187 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1188 return PKGMGR_R_ERROR;
1191 result = comm_client_request(mpc->info.request.cc, "reinstall",
1192 g_variant_new("(uss)", uid, pkgtype, pkgid));
1193 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1195 return PKGMGR_R_ECOMM;
1196 g_variant_get(result, "(i&s)", &ret, &req_key);
1197 if (req_key == NULL) {
1198 g_variant_unref(result);
1199 return PKGMGR_R_ECOMM;
1201 if (ret != PKGMGR_R_OK) {
1202 g_variant_unref(result);
1206 req_id = _get_request_id();
1207 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1209 g_variant_unref(result);
1214 API int pkgmgr_client_uninstall(pkgmgr_client *pc, const char *pkg_type,
1215 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
1218 return pkgmgr_client_usr_uninstall(pc, pkg_type,pkgid, mode, event_cb,
1222 API int pkgmgr_client_usr_uninstall(pkgmgr_client *pc, const char *pkg_type,
1223 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
1224 void *data, uid_t uid)
1227 int ret = PKGMGR_R_ECOMM;
1228 char *req_key = NULL;
1230 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1232 pkgmgrinfo_pkginfo_h handle;
1234 if (pc == NULL || pkgid == NULL) {
1235 ERR("invalid parameter");
1236 return PKGMGR_R_EINVAL;
1239 if (mpc->ctype != PC_REQUEST) {
1240 ERR("mpc->ctype is not PC_REQUEST");
1241 return PKGMGR_R_EINVAL;
1244 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
1246 return PKGMGR_R_EINVAL;
1248 ret = pkgmgrinfo_pkginfo_get_type(handle, &pkgtype);
1250 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1251 return PKGMGR_R_ERROR;
1254 /* TODO: check removable ? */
1256 result = comm_client_request(mpc->info.request.cc, "uninstall",
1257 g_variant_new("(uss)", uid, pkgtype, pkgid));
1258 if (result == NULL) {
1259 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1260 return PKGMGR_R_ECOMM;
1262 g_variant_get(result, "(i&s)", &ret, &req_key);
1263 if (req_key == NULL) {
1264 g_variant_unref(result);
1265 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1266 return PKGMGR_R_ECOMM;
1268 if (ret != PKGMGR_R_OK) {
1269 g_variant_unref(result);
1270 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1274 req_id = _get_request_id();
1275 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1277 g_variant_unref(result);
1278 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1283 API int pkgmgr_client_move(pkgmgr_client *pc, const char *pkg_type,
1284 const char *pkgid, pkgmgr_move_type move_type, pkgmgr_mode mode)
1286 return pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type, mode,
1289 API int pkgmgr_client_usr_move(pkgmgr_client *pc, const char *pkg_type,
1290 const char *pkgid, pkgmgr_move_type move_type,
1291 pkgmgr_mode mode, uid_t uid)
1294 int ret = PKGMGR_R_ECOMM;
1295 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1297 if (pc == NULL || pkg_type == NULL || pkgid == NULL) {
1298 ERR("invalid parameter");
1299 return PKGMGR_R_EINVAL;
1302 if ((move_type < PM_MOVE_TO_INTERNAL) || (move_type > PM_MOVE_TO_SDCARD))
1303 return PKGMGR_R_EINVAL;
1305 if (mpc->ctype != PC_REQUEST) {
1306 ERR("mpc->ctype is not PC_REQUEST");
1307 return PKGMGR_R_EINVAL;
1310 result = comm_client_request(mpc->info.request.cc, "move",
1311 g_variant_new("(uss)", uid, pkg_type, pkgid));
1313 return PKGMGR_R_ECOMM;
1314 g_variant_get(result, "(i)", &ret);
1315 g_variant_unref(result);
1320 API int pkgmgr_client_usr_activate(pkgmgr_client *pc, const char *pkg_type,
1321 const char *pkgid, uid_t uid)
1324 int ret = PKGMGR_R_ECOMM;
1325 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1327 if (pc == NULL || pkgid == NULL || pkg_type == NULL) {
1328 ERR("invalid parameter");
1329 return PKGMGR_R_EINVAL;
1332 result = comm_client_request(mpc->info.request.cc, "enable_pkg",
1333 g_variant_new("(uss)", uid, pkg_type, pkgid));
1335 return PKGMGR_R_ECOMM;
1336 g_variant_get(result, "(i)", &ret);
1337 g_variant_unref(result);
1342 API int pkgmgr_client_activate(pkgmgr_client *pc, const char *pkg_type,
1345 return pkgmgr_client_usr_activate(pc, pkg_type, pkgid, GLOBAL_USER);
1348 API int pkgmgr_client_usr_deactivate(pkgmgr_client *pc, const char *pkg_type,
1349 const char *pkgid, uid_t uid)
1352 int ret = PKGMGR_R_ECOMM;
1353 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1355 if (pc == NULL || pkgid == NULL || pkg_type == NULL) {
1356 ERR("invalid parameter");
1357 return PKGMGR_R_EINVAL;
1360 result = comm_client_request(mpc->info.request.cc, "disable_pkg",
1361 g_variant_new("(uss)", uid, pkg_type, pkgid));
1363 return PKGMGR_R_ECOMM;
1364 g_variant_get(result, "(i)", &ret);
1365 g_variant_unref(result);
1370 API int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type,
1373 return pkgmgr_client_usr_deactivate(pc, pkg_type, pkgid, GLOBAL_USER);
1376 /* TODO: deprecate? */
1377 API int pkgmgr_client_usr_activate_appv(pkgmgr_client *pc, const char *appid,
1378 char *const argv[], uid_t uid)
1380 return pkgmgr_client_usr_activate_app(pc, appid, NULL, uid);
1383 API int pkgmgr_client_activate_appv(pkgmgr_client *pc, const char *appid,
1386 return pkgmgr_client_usr_activate_app(pc, appid, NULL, GLOBAL_USER);
1389 API int pkgmgr_client_usr_activate_app(pkgmgr_client *pc, const char *appid,
1390 pkgmgr_app_handler app_event_cb, uid_t uid)
1393 int ret = PKGMGR_R_ECOMM;
1395 char *req_key = NULL;
1396 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1398 if (pc == NULL || appid == NULL) {
1399 ERR("invalid parameter");
1400 return PKGMGR_R_EINVAL;
1403 if (__change_op_cb_for_enable_disable(mpc, false) < 0) {
1404 ERR("__change_op_cb_for_enable_disable failed");
1405 return PKGMGR_R_ESYSTEM;
1408 result = comm_client_request(mpc->info.request.cc, "enable_app",
1409 g_variant_new("(us)", uid, appid));
1411 return PKGMGR_R_ECOMM;
1412 g_variant_get(result, "(i&s)", &ret, &req_key);
1413 if (req_key == NULL) {
1414 g_variant_unref(result);
1415 return PKGMGR_R_ECOMM;
1417 if (ret != PKGMGR_R_OK) {
1418 g_variant_unref(result);
1422 req_id = _get_request_id();
1423 __add_op_app_cbinfo(pc, req_id, req_key, app_event_cb, NULL);
1424 g_variant_unref(result);
1428 API int pkgmgr_client_activate_app(pkgmgr_client * pc, const char *appid, pkgmgr_app_handler app_event_cb)
1430 return pkgmgr_client_usr_activate_app(pc, appid, app_event_cb, GLOBAL_USER);
1433 API int pkgmgr_client_activate_global_app_for_uid(pkgmgr_client *pc,
1434 const char *appid, pkgmgr_app_handler app_event_cb, uid_t uid)
1437 int ret = PKGMGR_R_ECOMM;
1439 char *req_key = NULL;
1440 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1442 if (pc == NULL || appid == NULL) {
1443 ERR("invalid parameter");
1444 return PKGMGR_R_EINVAL;
1447 if (__change_op_cb_for_enable_disable(mpc, false) < 0) {
1448 ERR("__change_op_cb_for_enable_disable failed");
1449 return PKGMGR_R_ESYSTEM;
1452 result = comm_client_request(mpc->info.request.cc, "enable_global_app_for_uid",
1453 g_variant_new("(us)", uid, appid));
1455 return PKGMGR_R_ECOMM;
1456 g_variant_get(result, "(i&s)", &ret, &req_key);
1457 if (req_key == NULL) {
1458 g_variant_unref(result);
1459 return PKGMGR_R_ECOMM;
1461 if (ret != PKGMGR_R_OK) {
1462 g_variant_unref(result);
1466 req_id = _get_request_id();
1467 __add_op_app_cbinfo(pc, req_id, req_key, app_event_cb, NULL);
1472 API int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid,
1473 pkgmgr_app_handler app_event_cb, uid_t uid)
1476 int ret = PKGMGR_R_ECOMM;
1477 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1479 char *req_key = NULL;
1481 if (pc == NULL || appid == NULL) {
1482 ERR("invalid parameter");
1483 return PKGMGR_R_EINVAL;
1487 if (__change_op_cb_for_enable_disable(mpc, true) < 0) {
1488 ERR("__change_op_cb_for_enable_disable failed");
1489 return PKGMGR_R_ESYSTEM;
1492 result = comm_client_request(mpc->info.request.cc, "disable_app",
1493 g_variant_new("(us)", uid, appid));
1496 return PKGMGR_R_ECOMM;
1497 g_variant_get(result, "(i&s)", &ret, &req_key);
1498 if (req_key == NULL) {
1499 g_variant_unref(result);
1500 return PKGMGR_R_ECOMM;
1502 if (ret != PKGMGR_R_OK) {
1503 g_variant_unref(result);
1507 req_id = _get_request_id();
1508 __add_op_app_cbinfo(pc, req_id, req_key, app_event_cb, NULL);
1510 g_variant_unref(result);
1514 API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid, pkgmgr_app_handler app_event_cb)
1516 return pkgmgr_client_usr_deactivate_app(pc, appid, app_event_cb, GLOBAL_USER);
1519 API int pkgmgr_client_deactivate_global_app_for_uid(pkgmgr_client *pc,
1520 const char *appid, pkgmgr_app_handler app_event_cb, uid_t uid)
1523 int ret = PKGMGR_R_ECOMM;
1525 char *req_key = NULL;
1526 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1528 if (pc == NULL || appid == NULL) {
1529 ERR("invalid parameter");
1530 return PKGMGR_R_EINVAL;
1533 if (__change_op_cb_for_enable_disable(mpc, true) < 0) {
1534 ERR("__change_op_cb_for_enable_disable failed");
1535 return PKGMGR_R_ESYSTEM;
1538 result = comm_client_request(mpc->info.request.cc, "disable_global_app_for_uid",
1539 g_variant_new("(us)", uid, appid));
1542 return PKGMGR_R_ECOMM;
1543 g_variant_get(result, "(i&s)", &ret, &req_key);
1544 if (req_key == NULL) {
1545 g_variant_unref(result);
1546 return PKGMGR_R_ECOMM;
1548 if (ret != PKGMGR_R_OK) {
1549 g_variant_unref(result);
1553 req_id = _get_request_id();
1554 __add_op_app_cbinfo(pc, req_id, req_key, app_event_cb, NULL);
1558 API int pkgmgr_client_usr_clear_user_data(pkgmgr_client *pc,
1559 const char *pkg_type, const char *appid, pkgmgr_mode mode,
1563 int ret = PKGMGR_R_ECOMM;
1564 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1566 if (pc == NULL || pkg_type == NULL || appid == NULL) {
1567 ERR("invalid parameter");
1568 return PKGMGR_R_EINVAL;
1571 if (mpc->ctype != PC_REQUEST) {
1572 ERR("mpc->ctype is not PC_REQUEST");
1573 return PKGMGR_R_EINVAL;
1576 result = comm_client_request(mpc->info.request.cc, "cleardata",
1577 g_variant_new("(uss)", uid, pkg_type, appid));
1579 return PKGMGR_R_ECOMM;
1581 g_variant_get(result, "(i)", &ret);
1582 g_variant_unref(result);
1587 API int pkgmgr_client_clear_user_data(pkgmgr_client *pc, const char *pkg_type,
1588 const char *appid, pkgmgr_mode mode)
1590 return pkgmgr_client_usr_clear_user_data(pc, pkg_type, appid, mode,
1594 API int pkgmgr_client_set_status_type(pkgmgr_client *pc, int status_type)
1598 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1599 retvm_if(status_type == PKGMGR_CLIENT_STATUS_ALL, PKGMGR_R_OK, "status_type is PKGMGR_CLIENT_STATUS_ALL");
1600 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1602 /* free listening head */
1603 listen_cb_info *tmp = NULL;
1604 listen_cb_info *prev = NULL;
1605 for (tmp = mpc->info.listening.lhead; tmp;) {
1611 /* free dbus connection */
1612 ret = comm_client_free(mpc->info.listening.cc);
1613 retvm_if(ret < 0, PKGMGR_R_ERROR, "comm_client_free() failed - %d", ret);
1615 /* Manage pc for seperated event */
1616 mpc->ctype = PC_LISTENING;
1617 mpc->status_type = status_type;
1619 mpc->info.listening.cc = comm_client_new();
1620 retvm_if(mpc->info.listening.cc == NULL, PKGMGR_R_EINVAL, "client creation failed");
1622 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_INSTALL) == PKGMGR_CLIENT_STATUS_INSTALL) {
1623 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_INSTALL, mpc->info.listening.cc, __status_callback, pc);
1624 retvm_if(ret < 0, PKGMGR_R_ECOMM, "PKGMGR_CLIENT_STATUS_INSTALL failed - %d", ret);
1627 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_UNINSTALL) == PKGMGR_CLIENT_STATUS_UNINSTALL) {
1628 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_UNINSTALL, mpc->info.listening.cc, __status_callback, pc);
1629 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_UNINSTALL failed - %d", ret);
1632 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_MOVE) == PKGMGR_CLIENT_STATUS_MOVE) {
1633 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_MOVE, mpc->info.listening.cc, __status_callback, pc);
1634 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_MOVE failed - %d", ret);
1637 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_INSTALL_PROGRESS) == PKGMGR_CLIENT_STATUS_INSTALL_PROGRESS) {
1638 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_INSTALL_PROGRESS, mpc->info.listening.cc, __status_callback, pc);
1639 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_INSTALL_PROGRESS failed - %d", ret);
1642 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_UPGRADE) == PKGMGR_CLIENT_STATUS_UPGRADE) {
1643 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_UPGRADE, mpc->info.listening.cc, __status_callback, pc);
1644 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_UPGRADE failed - %d", ret);
1647 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_ENABLE_APP) == PKGMGR_CLIENT_STATUS_ENABLE_APP) {
1648 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ENABLE_APP, mpc->info.listening.cc, __status_callback, pc);
1649 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_ENABLE_APP failed - %d", ret);
1652 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_DISABLE_APP) == PKGMGR_CLIENT_STATUS_DISABLE_APP) {
1653 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_DISABLE_APP, mpc->info.listening.cc, __status_callback, pc);
1654 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_DISABLE_APP failed - %d", ret);
1660 API int pkgmgr_client_listen_status(pkgmgr_client *pc, pkgmgr_handler event_cb,
1664 /* Check for NULL value of pc */
1665 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1666 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1668 /* 0. check input */
1669 retvm_if(mpc->ctype != PC_LISTENING, PKGMGR_R_EINVAL, "ctype is not PC_LISTENING");
1670 retvm_if(event_cb == NULL, PKGMGR_R_EINVAL, "event_cb is NULL");
1673 req_id = _get_request_id();
1675 /* 2. add callback info to pkgmgr_client */
1676 __add_stat_cbinfo(mpc, req_id, event_cb, data);
1680 API int pkgmgr_client_listen_app_status(pkgmgr_client *pc, pkgmgr_app_handler event_cb,
1684 /* Check for NULL value of pc */
1685 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1686 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1688 /* 0. check input */
1689 retvm_if(mpc->ctype != PC_LISTENING, PKGMGR_R_EINVAL, "ctype is not PC_LISTENING");
1690 retvm_if(event_cb == NULL, PKGMGR_R_EINVAL, "event_cb is NULL");
1693 req_id = _get_request_id();
1695 /* 2. add app callback info to pkgmgr_client */
1696 __add_app_stat_cbinfo(mpc, req_id, event_cb, data);
1700 API int pkgmgr_client_remove_listen_status(pkgmgr_client *pc)
1704 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1705 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1707 ret = __remove_stat_cbinfo(mpc);
1709 ERR("failed to remove status callback");
1710 return PKGMGR_R_ERROR;
1716 API int pkgmgr_client_broadcast_status(pkgmgr_client *pc, const char *pkg_type,
1717 const char *pkgid, const char *key,
1720 /* client cannot broadcast signal */
1724 API int pkgmgr_client_request_service(pkgmgr_request_service_type service_type, int service_mode,
1725 pkgmgr_client * pc, const char *pkg_type, const char *pkgid,
1726 const char *custom_info, pkgmgr_handler event_cb, void *data)
1728 return pkgmgr_client_usr_request_service(service_type, service_mode, pc, pkg_type, pkgid, GLOBAL_USER, custom_info, event_cb, data);
1731 API int pkgmgr_client_usr_request_service(pkgmgr_request_service_type service_type, int service_mode,
1732 pkgmgr_client * pc, const char *pkg_type, const char *pkgid, uid_t uid,
1733 const char *custom_info, pkgmgr_handler event_cb, void *data)
1737 /* Check for NULL value of service type */
1738 retvm_if(service_type > PM_REQUEST_MAX, PKGMGR_R_EINVAL, "service type is not defined\n");
1739 retvm_if(service_type < 0, PKGMGR_R_EINVAL, "service type is error\n");
1741 switch (service_type) {
1742 case PM_REQUEST_CSC:
1743 tryvm_if(custom_info == NULL, ret = PKGMGR_R_EINVAL, "custom_info is NULL\n");
1744 tryvm_if(strlen(custom_info) >= PKG_STRING_LEN_MAX, ret = PKGMGR_R_EINVAL, "custom_info over PKG_STRING_LEN_MAX");
1745 tryvm_if(data == NULL, ret = PKGMGR_R_EINVAL, "data is NULL\n");
1747 ret = __csc_process(custom_info, (char *)data);
1749 ERR("__csc_process fail \n");
1755 case PM_REQUEST_MOVE:
1756 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1757 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1758 tryvm_if((service_mode < PM_MOVE_TO_INTERNAL) || (service_mode > PM_MOVE_TO_SDCARD), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1760 ret = __move_pkg_process(pc, pkgid, pkg_type, uid, (pkgmgr_move_type)service_mode, event_cb, data);
1763 case PM_REQUEST_GET_SIZE:
1764 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1765 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1766 tryvm_if((service_mode < PM_GET_TOTAL_SIZE) || (service_mode >= PM_GET_MAX), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1768 ret = __get_size_process(pc, pkgid, uid, (pkgmgr_getsize_type)service_mode, event_cb, data);
1771 case PM_REQUEST_KILL_APP:
1772 case PM_REQUEST_CHECK_APP:
1773 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1774 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1776 ret = __check_app_process(service_type, pc, pkgid, uid, data);
1778 ERR("__check_app_process fail \n");
1785 ERR("Wrong Request\n");
1796 API int pkgmgr_client_usr_request_size_info(uid_t uid)
1799 pkgmgr_client *pc = NULL;
1801 pc = pkgmgr_client_new(PC_REQUEST);
1802 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "request pc is null\n");
1804 ret = __request_size_info(pc, uid);
1806 ERR("__request_size_info fail \n");
1809 pkgmgr_client_free(pc);
1813 API int pkgmgr_client_request_size_info(void) // get all package size (data, total)
1815 return pkgmgr_client_usr_request_size_info(GLOBAL_USER);
1818 API int pkgmgr_client_usr_clear_cache_dir(const char *pkgid, uid_t uid)
1821 int ret = PKGMGR_R_ECOMM;
1822 pkgmgr_client_t *pc;
1824 if (pkgid == NULL) {
1825 ERR("invalid parameter");
1826 return PKGMGR_R_EINVAL;
1829 pc = pkgmgr_client_new(PC_REQUEST);
1831 ERR("out of memory");
1832 return PKGMGR_R_ESYSTEM;
1835 result = comm_client_request(pc->info.request.cc, "clearcache",
1836 g_variant_new("(us)", uid, pkgid));
1838 return PKGMGR_R_ECOMM;
1839 g_variant_get(result, "(i)", &ret);
1840 g_variant_unref(result);
1845 API int pkgmgr_client_clear_cache_dir(const char *pkgid)
1847 return pkgmgr_client_usr_clear_cache_dir(pkgid, GLOBAL_USER);
1850 API int pkgmgr_client_clear_usr_all_cache_dir(uid_t uid)
1852 return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, uid);
1855 API int pkgmgr_client_clear_all_cache_dir(void)
1857 return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, GLOBAL_USER);
1860 API int pkgmgr_client_get_size(pkgmgr_client * pc, const char *pkgid,
1861 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
1864 return pkgmgr_client_usr_get_size(pc, pkgid, get_type, event_cb, data,
1868 API int pkgmgr_client_usr_get_size(pkgmgr_client * pc, const char *pkgid,
1869 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
1870 void *data, uid_t uid)
1873 int ret = PKGMGR_R_ECOMM;
1874 char *req_key = NULL;
1876 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1878 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
1879 ERR("invalid parameter");
1880 return PKGMGR_R_EINVAL;
1883 if (mpc->ctype != PC_REQUEST) {
1884 ERR("mpc->ctype is not PC_REQUEST");
1885 return PKGMGR_R_EINVAL;
1889 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
1890 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
1892 get_type = PM_GET_PKG_SIZE_INFO;
1893 result = comm_client_request(mpc->info.request.cc, "getsize",
1894 g_variant_new("(usi)", uid, pkgid, get_type));
1896 return PKGMGR_R_ECOMM;
1898 g_variant_get(result, "(i&s)", &ret, &req_key);
1899 if (req_key == NULL) {
1900 g_variant_unref(result);
1901 return PKGMGR_R_ECOMM;
1903 if (ret != PKGMGR_R_OK) {
1904 g_variant_unref(result);
1908 req_id = _get_request_id();
1909 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1911 g_variant_unref(result);
1916 API int pkgmgr_client_usr_get_package_size_info(pkgmgr_client *pc,
1917 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
1918 void *user_data, uid_t uid)
1921 int ret = PKGMGR_R_ECOMM;
1922 char *req_key = NULL;
1925 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1927 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
1928 ERR("invalid parameter");
1929 return PKGMGR_R_EINVAL;
1932 if (mpc->ctype != PC_REQUEST) {
1933 ERR("mpc->ctype is not PC_REQUEST");
1934 return PKGMGR_R_EINVAL;
1938 if (__change_op_cb_for_getsize(mpc) < 0) {
1939 ERR("__change_op_cb_for_getsize failed");
1940 return PKGMGR_R_ESYSTEM;
1943 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
1944 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
1946 get_type = PM_GET_PKG_SIZE_INFO;
1947 result = comm_client_request(mpc->info.request.cc, "getsize",
1948 g_variant_new("(usi)", uid, pkgid, get_type));
1950 return PKGMGR_R_ECOMM;
1952 g_variant_get(result, "(i&s)", &ret, &req_key);
1953 if (req_key == NULL) {
1954 g_variant_unref(result);
1955 return PKGMGR_R_ECOMM;
1957 if (ret != PKGMGR_R_OK) {
1958 g_variant_unref(result);
1962 req_id = _get_request_id();
1963 __add_op_cbinfo(mpc, req_id, req_key, __get_pkg_size_info_cb, event_cb,
1966 g_variant_unref(result);
1971 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)
1973 return pkgmgr_client_usr_get_package_size_info(pc, pkgid, event_cb, user_data, GLOBAL_USER);
1976 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)
1977 { // total package size info
1978 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL, (pkgmgr_pkg_size_info_receive_cb)event_cb, user_data, uid);
1981 API int pkgmgr_client_get_total_package_size_info(pkgmgr_client *pc, pkgmgr_total_pkg_size_info_receive_cb event_cb, void *user_data)
1983 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL, (pkgmgr_pkg_size_info_receive_cb)event_cb, user_data, GLOBAL_USER);
1986 API int pkgmgr_client_generate_license_request(pkgmgr_client *pc,
1987 const char *resp_data, char **req_data, char **license_url)
1993 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1995 if (pc == NULL || resp_data == NULL || req_data == NULL ||
1996 license_url == NULL) {
1997 ERR("invalid parameter");
1998 return PKGMGR_R_EINVAL;
2001 if (mpc->ctype != PC_REQUEST) {
2002 ERR("mpc->ctype is not PC_REQUEST");
2003 return PKGMGR_R_EINVAL;
2006 result = comm_client_request(mpc->info.request.cc,
2007 "generate_license_request",
2008 g_variant_new("(s)", resp_data));
2010 return PKGMGR_R_ECOMM;
2012 g_variant_get(result, "(i&s&s)", &ret, &data, &url);
2013 if (ret != PKGMGR_R_OK) {
2014 ERR("generate_license_request failed: %d", ret);
2015 g_variant_unref(result);
2019 *req_data = strdup(data);
2020 *license_url = strdup(url);
2022 g_variant_unref(result);
2027 API int pkgmgr_client_register_license(pkgmgr_client *pc, const char *resp_data)
2031 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2033 if (pc == NULL || resp_data == NULL) {
2034 ERR("invalid parameter");
2035 return PKGMGR_R_EINVAL;
2038 if (mpc->ctype != PC_REQUEST) {
2039 ERR("mpc->ctype is not PC_REQUEST");
2040 return PKGMGR_R_EINVAL;
2043 result = comm_client_request(mpc->info.request.cc,
2044 "register_license", g_variant_new("(s)", resp_data));
2046 return PKGMGR_R_ECOMM;
2048 g_variant_get(result, "(i)", &ret);
2049 g_variant_unref(result);
2050 if (ret != PKGMGR_R_OK) {
2051 ERR("register license failed: %d", ret);
2058 API int pkgmgr_client_decrypt_package(pkgmgr_client *pc,
2059 const char *drm_file_path, const char *decrypted_file_path)
2063 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2065 if (pc == NULL || drm_file_path == NULL ||
2066 decrypted_file_path == NULL) {
2067 ERR("invalid parameter");
2068 return PKGMGR_R_EINVAL;
2071 if (mpc->ctype != PC_REQUEST) {
2072 ERR("mpc->ctype is not PC_REQUEST");
2073 return PKGMGR_R_EINVAL;
2076 result = comm_client_request(mpc->info.request.cc,
2077 "decrypt_package", g_variant_new("(ss)",
2078 drm_file_path, decrypted_file_path));
2080 return PKGMGR_R_ECOMM;
2082 g_variant_get(result, "(i)", &ret);
2083 g_variant_unref(result);
2084 if (ret != PKGMGR_R_OK) {
2085 ERR("decrypt_package failed: %d", ret);
2092 API int pkgmgr_client_usr_add_blacklist(pkgmgr_client *pc, const char *pkgid,
2096 int ret = PKGMGR_R_ECOMM;
2097 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2099 if (pc == NULL || pkgid == NULL) {
2100 ERR("invalid parameter");
2101 return PKGMGR_R_EINVAL;
2104 result = comm_client_request(mpc->info.request.cc, "add_blacklist",
2105 g_variant_new("(us)", uid, pkgid));
2107 return PKGMGR_R_ECOMM;
2108 g_variant_get(result, "(i)", &ret);
2109 g_variant_unref(result);
2114 API int pkgmgr_client_add_blacklist(pkgmgr_client *pc, const char *pkgid)
2116 return pkgmgr_client_usr_add_blacklist(pc, pkgid, GLOBAL_USER);
2119 API int pkgmgr_client_usr_remove_blacklist(pkgmgr_client *pc,
2120 const char *pkgid, uid_t uid)
2123 int ret = PKGMGR_R_ECOMM;
2124 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2126 if (pc == NULL || pkgid == NULL) {
2127 ERR("invalid parameter");
2128 return PKGMGR_R_EINVAL;
2131 result = comm_client_request(mpc->info.request.cc, "remove_blacklist",
2132 g_variant_new("(us)", uid, pkgid));
2134 return PKGMGR_R_ECOMM;
2135 g_variant_get(result, "(i)", &ret);
2136 g_variant_unref(result);
2141 API int pkgmgr_client_remove_blacklist(pkgmgr_client *pc,
2144 return pkgmgr_client_usr_remove_blacklist(pc, pkgid, GLOBAL_USER);
2147 API int pkgmgr_client_usr_check_blacklist(pkgmgr_client *pc, const char *pkgid,
2148 bool *blacklist, uid_t uid)
2151 int ret = PKGMGR_R_ECOMM;
2153 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2155 if (pc == NULL || pkgid == NULL) {
2156 ERR("invalid parameter");
2157 return PKGMGR_R_EINVAL;
2160 result = comm_client_request(mpc->info.request.cc, "check_blacklist",
2161 g_variant_new("(us)", uid, pkgid));
2163 return PKGMGR_R_ECOMM;
2164 g_variant_get(result, "(ii)", &b, &ret);
2165 g_variant_unref(result);
2167 if (ret != PKGMGR_R_OK)
2178 API int pkgmgr_client_check_blacklist(pkgmgr_client *pc, const char *pkgid,
2181 return pkgmgr_client_usr_check_blacklist(pc, pkgid, blacklist,