4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
7 * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
35 #include <pkgmgr-info.h>
36 #include <iniparser.h>
37 /* For multi-user support */
38 #include <tzplatform_config.h>
40 #include "package-manager.h"
41 #include "pkgmgr-internal.h"
42 #include "pkgmgr-debug.h"
43 #include "comm_client.h"
44 #include "comm_config.h"
46 /* API export macro */
48 #define API __attribute__ ((visibility("default")))
51 #define PKG_TMP_PATH tzplatform_mkpath(TZ_USER_APP, "tmp")
53 #define BINSH_NAME "/bin/sh"
56 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
57 #define REGULAR_USER 5000
59 static inline uid_t _getuid(void)
63 if (uid < REGULAR_USER)
69 static int _get_request_id()
71 static int internal_req_id = 1;
73 return internal_req_id++;
76 typedef struct _req_cb_info {
79 pkgmgr_handler event_cb;
80 pkgmgr_app_handler app_event_cb;
82 struct _req_cb_info *next;
85 typedef struct _listen_cb_info {
87 pkgmgr_handler event_cb;
88 pkgmgr_app_handler app_event_cb;
90 struct _listen_cb_info *next;
93 typedef struct _pkgmgr_client_t {
103 listen_cb_info *lhead;
111 typedef struct _iter_data {
112 pkgmgr_iter_fn iter_fn;
116 static int __xsystem(const char *argv[])
123 perror("fork failed");
127 execvp(argv[0], (char *const *)argv);
133 if (waitpid(pid, &status, 0) == -1) {
134 perror("waitpid failed");
137 if (WIFSIGNALED(status)) {
141 if (!WIFEXITED(status)) {
142 /* shouldn't happen */
143 perror("should not happen");
146 return WEXITSTATUS(status);
149 static void __error_to_string(int errnumber, char **errstr)
154 case PKGCMD_ERR_PACKAGE_NOT_FOUND:
155 *errstr = PKGCMD_ERR_PACKAGE_NOT_FOUND_STR;
157 case PKGCMD_ERR_PACKAGE_INVALID:
158 *errstr = PKGCMD_ERR_PACKAGE_INVALID_STR;
160 case PKGCMD_ERR_PACKAGE_LOWER_VERSION:
161 *errstr = PKGCMD_ERR_PACKAGE_LOWER_VERSION_STR;
163 case PKGCMD_ERR_PACKAGE_EXECUTABLE_NOT_FOUND:
164 *errstr = PKGCMD_ERR_PACKAGE_EXECUTABLE_NOT_FOUND_STR;
166 case PKGCMD_ERR_MANIFEST_INVALID:
167 *errstr = PKGCMD_ERR_MANIFEST_INVALID_STR;
169 case PKGCMD_ERR_CONFIG_NOT_FOUND:
170 *errstr = PKGCMD_ERR_CONFIG_NOT_FOUND_STR;
172 case PKGCMD_ERR_CONFIG_INVALID:
173 *errstr = PKGCMD_ERR_CONFIG_INVALID_STR;
175 case PKGCMD_ERR_SIGNATURE_NOT_FOUND:
176 *errstr = PKGCMD_ERR_SIGNATURE_NOT_FOUND_STR;
178 case PKGCMD_ERR_SIGNATURE_INVALID:
179 *errstr = PKGCMD_ERR_SIGNATURE_INVALID_STR;
181 case PKGCMD_ERR_SIGNATURE_VERIFICATION_FAILED:
182 *errstr = PKGCMD_ERR_SIGNATURE_VERIFICATION_FAILED_STR;
184 case PKGCMD_ERR_ROOT_CERTIFICATE_NOT_FOUND:
185 *errstr = PKGCMD_ERR_ROOT_CERTIFICATE_NOT_FOUND_STR;
187 case PKGCMD_ERR_CERTIFICATE_INVALID:
188 *errstr = PKGCMD_ERR_CERTIFICATE_INVALID_STR;
190 case PKGCMD_ERR_CERTIFICATE_CHAIN_VERIFICATION_FAILED:
191 *errstr = PKGCMD_ERR_CERTIFICATE_CHAIN_VERIFICATION_FAILED_STR;
193 case PKGCMD_ERR_CERTIFICATE_EXPIRED:
194 *errstr = PKGCMD_ERR_CERTIFICATE_EXPIRED_STR;
196 case PKGCMD_ERR_INVALID_PRIVILEGE:
197 *errstr = PKGCMD_ERR_INVALID_PRIVILEGE_STR;
199 case PKGCMD_ERR_MENU_ICON_NOT_FOUND:
200 *errstr = PKGCMD_ERR_MENU_ICON_NOT_FOUND_STR;
202 case PKGCMD_ERR_FATAL_ERROR:
203 *errstr = PKGCMD_ERR_FATAL_ERROR_STR;
205 case PKGCMD_ERR_OUT_OF_STORAGE:
206 *errstr = PKGCMD_ERR_OUT_OF_STORAGE_STR;
208 case PKGCMD_ERR_OUT_OF_MEMORY:
209 *errstr = PKGCMD_ERR_OUT_OF_MEMORY_STR;
211 case PKGCMD_ERR_ARGUMENT_INVALID:
212 *errstr = PKGCMD_ERR_ARGUMENT_INVALID_STR;
215 *errstr = PKGCMD_ERR_UNKNOWN_STR;
220 static void __add_op_cbinfo(pkgmgr_client_t *pc, int request_id,
221 const char *req_key, pkgmgr_handler event_cb, void *new_event_cb,
224 req_cb_info *cb_info;
225 req_cb_info *current;
228 cb_info = (req_cb_info *) calloc(1, sizeof(req_cb_info));
229 if (cb_info == NULL) {
230 DBG("calloc failed");
233 cb_info->request_id = request_id;
234 cb_info->req_key = strdup(req_key);
235 cb_info->event_cb = event_cb;
236 cb_info->data = data;
237 cb_info->next = NULL;
238 cb_info->app_event_cb = NULL;
239 pc->new_event_cb = new_event_cb;
241 if (pc->info.request.rhead == NULL)
242 pc->info.request.rhead = cb_info;
244 current = prev = pc->info.request.rhead;
247 current = current->next;
250 prev->next = cb_info;
254 static void __add_op_app_cbinfo(pkgmgr_client_t *pc, int request_id,
255 const char *req_key, pkgmgr_app_handler app_event_cb, void *data)
257 req_cb_info *cb_info;
258 req_cb_info *current;
261 cb_info = (req_cb_info *) calloc(1, sizeof(req_cb_info));
262 if (cb_info == NULL) {
263 DBG("calloc failed");
266 cb_info->request_id = request_id;
267 cb_info->req_key = strdup(req_key);
268 cb_info->event_cb = NULL;
269 cb_info->app_event_cb = app_event_cb;
270 cb_info->data = data;
271 cb_info->next = NULL;
272 pc->new_event_cb = NULL;
274 if (pc->info.request.rhead == NULL)
275 pc->info.request.rhead = cb_info;
277 current = prev = pc->info.request.rhead;
280 current = current->next;
283 prev->next = cb_info;
287 static req_cb_info *__find_op_cbinfo(pkgmgr_client_t *pc, const char *req_key)
291 tmp = pc->info.request.rhead;
298 DBG("tmp->req_key %s, req_key %s", tmp->req_key, req_key);
301 if (strncmp(tmp->req_key, req_key, strlen(tmp->req_key)) == 0)
308 static int __remove_stat_cbinfo(pkgmgr_client_t *pc)
310 listen_cb_info *info = pc->info.listening.lhead;
311 listen_cb_info *next = NULL;
313 while (info != NULL) {
319 pc->info.listening.lhead = NULL;
323 static void __add_app_stat_cbinfo(pkgmgr_client_t *pc, int request_id,
324 pkgmgr_app_handler event_cb, void *data)
326 listen_cb_info *cb_info;
327 listen_cb_info *current;
328 listen_cb_info *prev;
330 cb_info = (listen_cb_info *) calloc(1, sizeof(listen_cb_info));
331 if (cb_info == NULL) {
332 DBG("calloc failed");
335 cb_info->request_id = request_id;
336 cb_info->app_event_cb = event_cb;
337 cb_info->data = data;
338 cb_info->next = NULL;
340 if (pc->info.listening.lhead == NULL)
341 pc->info.listening.lhead = cb_info;
343 current = prev = pc->info.listening.lhead;
346 current = current->next;
349 prev->next = cb_info;
353 static void __add_stat_cbinfo(pkgmgr_client_t *pc, int request_id,
354 pkgmgr_handler event_cb, void *data)
356 listen_cb_info *cb_info;
357 listen_cb_info *current;
358 listen_cb_info *prev;
360 cb_info = (listen_cb_info *) calloc(1, sizeof(listen_cb_info));
361 if (cb_info == NULL) {
362 DBG("calloc failed");
365 cb_info->request_id = request_id;
366 cb_info->event_cb = event_cb;
367 cb_info->data = data;
368 cb_info->next = NULL;
370 /* TODO - check the order of callback - FIFO or LIFO => Should be changed to LIFO */
371 if (pc->info.listening.lhead == NULL)
372 pc->info.listening.lhead = cb_info;
374 current = prev = pc->info.listening.lhead;
377 current = current->next;
380 prev->next = cb_info;
384 static void __operation_callback(void *cb_data, uid_t target_uid,
385 const char *req_id, const char *pkg_type,
386 const char *pkgid, const char *appid,
387 const char *key, const char *val)
390 req_cb_info *cb_info;
392 pc = (pkgmgr_client_t *) cb_data;
394 /* find callback info */
395 cb_info = __find_op_cbinfo(pc, req_id);
396 if (cb_info == NULL) {
397 ERR("cannot find cb_info for req_id:%s", req_id);
402 if (appid != NULL && strlen(appid) != 0 && cb_info->app_event_cb) {
403 /* run app callback */
404 if (pc->new_event_cb)
405 cb_info->app_event_cb(target_uid, cb_info->request_id,
406 pkg_type, pkgid, appid, key, val, pc,
409 cb_info->app_event_cb(target_uid, cb_info->request_id,
410 pkg_type, pkgid, appid, key, val, NULL,
412 } else if (cb_info->event_cb) {
413 /* run pkg callback */
414 if (pc->new_event_cb)
415 cb_info->event_cb(target_uid, cb_info->request_id,
416 pkg_type, pkgid, key, val, pc,
419 cb_info->event_cb(target_uid, cb_info->request_id,
420 pkg_type, pkgid, key, val, NULL,
427 static void __status_callback(void *cb_data, uid_t target_uid,
428 const char *req_id, const char *pkg_type,
429 const char *pkgid, const char *appid,
430 const char *key, const char *val)
435 pc = (pkgmgr_client_t *) cb_data;
437 tmp = pc->info.listening.lhead;
439 if (appid != NULL && strlen(appid) != 0) {
440 /* run app callback */
441 if (tmp->app_event_cb && tmp->app_event_cb(
442 target_uid, tmp->request_id, pkg_type, pkgid,
443 appid, key, val, NULL, tmp->data) != 0)
446 /* run pkg callback */
447 if (tmp->event_cb && tmp->event_cb(
448 target_uid, tmp->request_id, pkg_type, pkgid,
449 key, val, NULL, tmp->data) != 0)
458 static inline int __read_proc(const char *path, char *buf, int size)
463 if (buf == NULL || path == NULL)
466 fd = open(path, O_RDONLY);
470 ret = read(fd, buf, size - 1);
482 char *__proc_get_cmdline_bypid(int pid)
484 char buf[PKG_STRING_LEN_MAX] = {'\0', };
487 snprintf(buf, sizeof(buf), "/proc/%d/cmdline", pid);
488 ret = __read_proc(buf, buf, sizeof(buf));
492 /* support app launched by shell script*/
493 if (strncmp(buf, BINSH_NAME, BINSH_SIZE) == 0)
494 return strdup(&buf[BINSH_SIZE + 1]);
499 static inline int __pkgmgr_read_proc(const char *path, char *buf, int size)
504 if (buf == NULL || path == NULL)
507 fd = open(path, O_RDONLY);
511 ret = read(fd, buf, size - 1);
523 static int __sync_process(const char *req_key)
526 char info_file[PKG_STRING_LEN_MAX] = {'\0', };
530 char buf[PKG_STRING_LEN_MAX] = {0, };
532 snprintf(info_file, PKG_STRING_LEN_MAX, "%s/%s", PKG_SIZE_INFO_PATH, req_key);
536 if (access(info_file, F_OK) == 0) {
537 fp = fopen(info_file, "r");
539 DBG("file is not generated yet.... wait\n");
540 usleep(100 * 1000); /* 100ms sleep*/
544 if (fgets(buf, PKG_STRING_LEN_MAX, fp) == NULL) {
545 ERR("failed to read info file");
551 DBG("info_file file is generated, result = %s. \n", buf);
556 DBG("file is not generated yet.... wait\n");
557 usleep(100 * 1000); /* 100ms sleep*/
559 if (check_cnt > 6000) { /* 60s * 10 time over*/
560 ERR("wait time over!!\n");
565 ret = remove(info_file);
567 ERR("file is can not remove[%s, %d]\n", info_file, ret);
572 static int __get_size_process(pkgmgr_client *pc, const char *pkgid, uid_t uid,
573 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
577 int ret = PKGMGR_R_ECOMM;
578 char *req_key = NULL;
579 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
581 if (pc == NULL || pkgid == NULL) {
582 ERR("invalid parameter");
583 return PKGMGR_R_EINVAL;
586 if (mpc->ctype != PC_REQUEST) {
587 ERR("mpc->ctype is not PC_REQUEST");
588 return PKGMGR_R_EINVAL;
591 ret = comm_client_request(mpc->info.request.cc, "getsize",
592 g_variant_new("(usi)", uid, pkgid, get_type), &result);
593 if (ret != PKGMGR_R_OK) {
594 ERR("request failed: %d", ret);
598 g_variant_get(result, "(i&s)", &ret, &req_key);
599 if (req_key == NULL) {
600 g_variant_unref(result);
601 return PKGMGR_R_ECOMM;
603 if (ret != PKGMGR_R_OK) {
604 g_variant_unref(result);
608 ret = __sync_process(req_key);
610 ERR("get size failed, ret=%d\n", ret);
612 g_variant_unref(result);
617 static int __move_pkg_process(pkgmgr_client *pc, const char *pkgid,
618 const char *pkg_type, uid_t uid, pkgmgr_move_type move_type,
619 pkgmgr_handler event_cb, void *data)
623 ret = pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type, event_cb, data, uid);
625 ERR("move request failed");
632 static int __check_app_process(pkgmgr_request_service_type service_type,
633 pkgmgr_client *pc, const char *pkgid, uid_t uid, void *data)
636 int ret = PKGMGR_R_ECOMM;
637 pkgmgrinfo_pkginfo_h handle;
639 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
641 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST\n");
643 if (uid != GLOBAL_USER)
644 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
646 ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle);
647 retvm_if(ret < 0, PKGMGR_R_ERROR, "pkgmgrinfo_pkginfo_get_pkginfo failed");
649 if (service_type == PM_REQUEST_KILL_APP)
650 ret = comm_client_request(mpc->info.request.cc, "kill",
651 g_variant_new("(us)", uid, pkgid), &result);
652 else if (service_type == PM_REQUEST_CHECK_APP)
653 ret = comm_client_request(mpc->info.request.cc, "check",
654 g_variant_new("(us)", uid, pkgid), &result);
655 if (ret != PKGMGR_R_OK) {
656 ERR("request failed: %d", ret);
660 g_variant_get(result, "(i)", &ret);
661 g_variant_unref(result);
662 if (ret != PKGMGR_R_OK) {
663 ERR("request failed, ret=%d", ret);
668 pid = __sync_process(pkgid);
671 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
677 static int __request_size_info(pkgmgr_client *pc, uid_t uid)
680 int ret = PKGMGR_R_ECOMM;
681 char *req_key = NULL;
682 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
685 ERR("invalid parameter");
686 return PKGMGR_R_EINVAL;
689 if (mpc->ctype != PC_REQUEST) {
690 ERR("mpc->ctype is not PC_REQUEST");
691 return PKGMGR_R_EINVAL;
694 ret = comm_client_request(mpc->info.request.cc, "getsize",
695 g_variant_new("(usi)", uid, "size_info",
698 if (ret != PKGMGR_R_OK) {
699 ERR("request failed: %d", ret);
703 g_variant_get(result, "(i&s)", &ret, &req_key);
704 if (req_key == NULL) {
705 g_variant_unref(result);
706 return PKGMGR_R_ECOMM;
709 g_variant_unref(result);
714 static int __change_op_cb_for_getsize(pkgmgr_client *pc)
718 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
719 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
721 /* free listening head */
722 req_cb_info *tmp = NULL;
723 req_cb_info *prev = NULL;
724 for (tmp = mpc->info.request.rhead; tmp;) {
730 /* free dbus connection */
731 ret = comm_client_free(mpc->info.request.cc);
732 retvm_if(ret < 0, PKGMGR_R_ERROR, "comm_client_free() failed - %d", ret);
734 /* Manage pc for seperated event */
735 mpc->ctype = PC_REQUEST;
736 mpc->status_type = PKGMGR_CLIENT_STATUS_GET_SIZE;
739 mpc->info.request.cc = comm_client_new(PC_REQUEST);
740 retvm_if(mpc->info.request.cc == NULL, PKGMGR_R_ERROR, "client creation failed");
742 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_GET_SIZE, mpc->info.request.cc, __operation_callback, pc);
743 retvm_if(ret < 0, PKGMGR_R_ERROR, "set_status_callback() failed - %d", ret);
748 static int __change_op_cb_for_enable_disable(pkgmgr_client *pc, bool is_disable)
752 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
753 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
755 /* free listening head */
756 req_cb_info *tmp = NULL;
757 req_cb_info *prev = NULL;
758 for (tmp = mpc->info.request.rhead; tmp;) {
764 /* free dbus connection */
765 ret = comm_client_free(mpc->info.request.cc);
766 retvm_if(ret < 0, PKGMGR_R_ERROR, "comm_client_free() failed - %d", ret);
768 /* Manage pc for seperated event */
769 mpc->ctype = PC_REQUEST;
771 mpc->status_type = PKGMGR_CLIENT_STATUS_DISABLE_APP;
773 mpc->status_type = PKGMGR_CLIENT_STATUS_ENABLE_APP;
776 mpc->info.request.cc = comm_client_new(PC_REQUEST);
777 retvm_if(mpc->info.request.cc == NULL, PKGMGR_R_ERROR, "client creation failed");
780 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_DISABLE_APP, mpc->info.request.cc, __operation_callback, pc);
782 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ENABLE_APP, mpc->info.request.cc, __operation_callback, pc);
783 retvm_if(ret < 0, PKGMGR_R_ERROR, "set_status_callback() failed - %d", ret);
788 static int __get_pkg_size_info_cb(uid_t target_uid, int req_id, const char *req_type,
789 const char *pkgid, const char *key,
790 const char *value, const void *pc, void *user_data)
793 DBG("target_uid: %u, reqid: %d, req type: %s, pkgid: %s, unused key: %s, size info: %s",
794 target_uid, req_id, req_type, pkgid, key, value);
796 pkg_size_info_t *size_info = (pkg_size_info_t *)malloc(sizeof(pkg_size_info_t));
797 retvm_if(size_info == NULL, -1, "The memory is insufficient.");
799 char *save_ptr = NULL;
800 char *token = strtok_r((char *)value, ":", &save_ptr);
801 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
802 size_info->data_size = atoll(token);
803 token = strtok_r(NULL, ":", &save_ptr);
804 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
805 size_info->cache_size = atoll(token);
806 token = strtok_r(NULL, ":", &save_ptr);
807 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
808 size_info->app_size = atoll(token);
809 token = strtok_r(NULL, ":", &save_ptr);
810 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
811 size_info->ext_data_size = atoll(token);
812 token = strtok_r(NULL, ":", &save_ptr);
813 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
814 size_info->ext_cache_size = atoll(token);
815 token = strtok_r(NULL, ":", &save_ptr);
816 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
817 size_info->ext_app_size = atoll(token);
819 DBG("data: %lld, cache: %lld, app: %lld, ext_data: %lld, ext_cache: %lld, ext_app: %lld",
820 size_info->data_size, size_info->cache_size, size_info->app_size,
821 size_info->ext_data_size, size_info->ext_cache_size, size_info->ext_app_size);
823 pkgmgr_client_t *pmc = (pkgmgr_client_t *)pc;
824 tryvm_if(pmc == NULL, ret = -1, "pkgmgr_client instance is null.");
826 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0) { /* total package size info */
827 pkgmgr_total_pkg_size_info_receive_cb callback = (pkgmgr_total_pkg_size_info_receive_cb)(pmc->new_event_cb);
828 callback((pkgmgr_client *)pc, size_info, user_data);
830 pkgmgr_pkg_size_info_receive_cb callback = (pkgmgr_pkg_size_info_receive_cb)(pmc->new_event_cb);
831 callback((pkgmgr_client *)pc, pkgid, size_info, user_data);
843 API pkgmgr_client *pkgmgr_client_new(client_type ctype)
845 pkgmgr_client_t *pc = NULL;
848 retvm_if(ctype == PC_BROADCAST, NULL, "broadcast type is not supported");
849 retvm_if(ctype != PC_REQUEST && ctype != PC_LISTENING, NULL, "ctype is not client_type");
851 /* Allocate memory for ADT:pkgmgr_client */
852 pc = calloc(1, sizeof(pkgmgr_client_t));
853 retvm_if(pc == NULL, NULL, "No memory");
857 pc->status_type = PKGMGR_CLIENT_STATUS_ALL;
860 if (pc->ctype == PC_REQUEST) {
861 pc->info.request.cc = comm_client_new(PC_REQUEST);
862 trym_if(pc->info.request.cc == NULL, "client creation failed");
864 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ALL, pc->info.request.cc, __operation_callback, pc);
865 trym_if(ret < 0L, "comm_client_set_status_callback() failed - %d", ret);
866 } else if (pc->ctype == PC_LISTENING) {
867 pc->info.listening.cc = comm_client_new(PC_LISTENING);
868 trym_if(pc->info.listening.cc == NULL, "client creation failed");
870 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ALL, pc->info.listening.cc, __status_callback, pc);
871 trym_if(ret < 0L, "comm_client_set_status_callback() failed - %d", ret);
874 return (pkgmgr_client *)pc;
882 API int pkgmgr_client_free(pkgmgr_client *pc)
885 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
886 retvm_if(mpc == NULL, PKGMGR_R_EINVAL, "Invalid argument");
888 if (mpc->ctype == PC_REQUEST) {
891 for (tmp = mpc->info.request.rhead; tmp;) {
897 ret = comm_client_free(mpc->info.request.cc);
898 tryvm_if(ret < 0, ret = PKGMGR_R_ERROR, "comm_client_free() failed");
899 } else if (mpc->ctype == PC_LISTENING) {
901 listen_cb_info *prev;
902 for (tmp = mpc->info.listening.lhead; tmp;) {
908 ret = comm_client_free(mpc->info.listening.cc);
909 tryvm_if(ret < 0, ret = PKGMGR_R_ERROR, "comm_client_free() failed");
910 } else if (mpc->ctype == PC_BROADCAST) {
913 ERR("Invalid client type\n");
914 return PKGMGR_R_EINVAL;
919 mpc->tep_path = NULL;
931 return PKGMGR_R_ERROR;
934 static char *__get_type_from_path(const char *pkg_path)
937 char mimetype[255] = { '\0', };
938 char extlist[256] = { '\0', };
941 ret = _get_mime_from_file(pkg_path, mimetype, sizeof(mimetype));
943 ERR("_get_mime_from_file() failed - error code[%d]\n", ret);
947 ret = _get_mime_extension(mimetype, extlist, sizeof(extlist));
949 ERR("_get_mime_extension() failed - error code[%d]\n", ret);
953 if (strlen(extlist) == 0)
956 if (strchr(extlist, ','))
957 extlist[strlen(extlist) - strlen(strchr(extlist, ','))] = '\0';
959 pkg_type = strchr(extlist, '.') + 1;
960 return strdup(pkg_type);
963 static int __change_op_cb_for_enable_disable_splash_screen(pkgmgr_client *pc,
967 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
972 ERR("package mananger client pc is NULL");
973 return PKGMGR_R_EINVAL;
976 for (tmp = mpc->info.request.rhead; tmp;) {
982 ret = comm_client_free(mpc->info.request.cc);
984 ERR("comm_client_free() failed - %d", ret);
985 return PKGMGR_R_ERROR;
988 mpc->ctype = PC_REQUEST;
990 mpc->status_type = PKGMGR_CLIENT_STATUS_ENABLE_APP_SPLASH_SCREEN;
992 mpc->status_type = PKGMGR_CLIENT_STATUS_DISABLE_APP_SPLASH_SCREEN;
994 mpc->info.request.cc = comm_client_new(PC_REQUEST);
995 if (mpc->info.request.cc == NULL) {
996 ERR("client creation failed");
997 return PKGMGR_R_ENOMEM;
1001 ret = comm_client_set_status_callback(
1002 COMM_STATUS_BROADCAST_ENABLE_APP_SPLASH_SCREEN,
1003 mpc->info.request.cc, __operation_callback, pc);
1005 ret = comm_client_set_status_callback(
1006 COMM_STATUS_BROADCAST_DISABLE_APP_SPLASH_SCREEN,
1007 mpc->info.request.cc, __operation_callback, pc);
1010 ERR("set_status_callback() failed - %d", ret);
1011 return PKGMGR_R_ERROR;
1017 API int pkgmgr_client_set_tep_path(pkgmgr_client *pc, char *tep_path, bool tep_move)
1019 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1020 retvm_if(tep_path == NULL, PKGMGR_R_EINVAL, "tep path is NULL");
1021 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1024 free(mpc->tep_path);
1026 mpc->tep_path = strdup(tep_path);
1027 mpc->tep_move = tep_move;
1032 API int pkgmgr_client_usr_install(pkgmgr_client *pc, const char *pkg_type,
1033 const char *descriptor_path, const char *pkg_path,
1034 const char *optional_data, pkgmgr_mode mode,
1035 pkgmgr_handler event_cb, void *data, uid_t uid)
1038 int ret = PKGMGR_R_ECOMM;
1039 char *req_key = NULL;
1040 GVariantBuilder *builder = NULL;
1041 GVariant *args = NULL;
1043 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1046 if (pc == NULL || pkg_path == NULL) {
1047 ERR("invalid parameter");
1048 return PKGMGR_R_EINVAL;
1051 if (mpc->ctype != PC_REQUEST) {
1052 ERR("mpc->ctype is not PC_REQUEST");
1053 return PKGMGR_R_EINVAL;
1056 if (access(pkg_path, F_OK) != 0) {
1057 ERR("failed to access: %s", pkg_path);
1058 return PKGMGR_R_EINVAL;
1061 if (mpc->tep_path != NULL && access(mpc->tep_path, F_OK) != 0) {
1062 ERR("failed to access: %s", mpc->tep_path);
1063 return PKGMGR_R_EINVAL;
1066 /* TODO: check pkg's type on server-side */
1067 if (pkg_type == NULL)
1068 pkgtype = __get_type_from_path(pkg_path);
1070 pkgtype = strdup(pkg_type);
1072 /* build arguments */
1073 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1074 if (mpc->tep_path) {
1075 g_variant_builder_add(builder, "s", "-e");
1076 g_variant_builder_add(builder, "s", mpc->tep_path);
1077 g_variant_builder_add(builder, "s", "-M");
1078 /* TODO: revise tep_move */
1079 g_variant_builder_add(builder, "s",
1080 mpc->tep_move ? "tep_move" : "tep_copy");
1083 args = g_variant_new("as", builder);
1084 g_variant_builder_unref(builder);
1086 ret = comm_client_request(mpc->info.request.cc, "install",
1087 g_variant_new("(uss@as)", uid, pkgtype, pkg_path, args),
1089 if (ret != PKGMGR_R_OK) {
1090 ERR("request failed: %d", ret);
1094 g_variant_get(result, "(i&s)", &ret, &req_key);
1095 if (req_key == NULL) {
1096 g_variant_unref(result);
1097 return PKGMGR_R_ECOMM;
1099 if (ret != PKGMGR_R_OK) {
1100 g_variant_unref(result);
1104 req_id = _get_request_id();
1105 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1107 g_variant_unref(result);
1112 API int pkgmgr_client_install(pkgmgr_client *pc, const char *pkg_type,
1113 const char *descriptor_path, const char *pkg_path,
1114 const char *optional_data, pkgmgr_mode mode,
1115 pkgmgr_handler event_cb, void *data)
1117 return pkgmgr_client_usr_install(pc, pkg_type, descriptor_path,
1118 pkg_path, optional_data, mode, event_cb, data,
1122 API int pkgmgr_client_reinstall(pkgmgr_client *pc, const char *pkg_type,
1123 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
1124 pkgmgr_handler event_cb, void *data)
1126 return pkgmgr_client_usr_reinstall(pc, pkg_type, pkgid, optional_data,
1127 mode, event_cb, data, _getuid());
1130 API int pkgmgr_client_usr_reinstall(pkgmgr_client *pc, const char *pkg_type,
1131 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
1132 pkgmgr_handler event_cb, void *data, uid_t uid)
1135 int ret = PKGMGR_R_ECOMM;
1136 char *req_key = NULL;
1138 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1140 pkgmgrinfo_pkginfo_h handle;
1142 if (pc == NULL || pkgid == NULL) {
1143 ERR("invalid parameter");
1144 return PKGMGR_R_EINVAL;
1147 if (mpc->ctype != PC_REQUEST) {
1148 ERR("mpc->ctype is not PC_REQUEST");
1149 return PKGMGR_R_EINVAL;
1152 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
1154 return PKGMGR_R_EINVAL;
1156 ret = pkgmgrinfo_pkginfo_get_type(handle, &pkgtype);
1158 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1159 return PKGMGR_R_ERROR;
1162 ret = comm_client_request(mpc->info.request.cc, "reinstall",
1163 g_variant_new("(uss)", uid, pkgtype, pkgid), &result);
1164 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1165 if (ret != PKGMGR_R_OK) {
1166 ERR("request failed: %d", ret);
1170 g_variant_get(result, "(i&s)", &ret, &req_key);
1171 if (req_key == NULL) {
1172 g_variant_unref(result);
1173 return PKGMGR_R_ECOMM;
1175 if (ret != PKGMGR_R_OK) {
1176 g_variant_unref(result);
1180 req_id = _get_request_id();
1181 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1183 g_variant_unref(result);
1188 API int pkgmgr_client_usr_mount_install(pkgmgr_client *pc, const char *pkg_type,
1189 const char *descriptor_path, const char *pkg_path,
1190 const char *optional_data, pkgmgr_mode mode,
1191 pkgmgr_handler event_cb, void *data, uid_t uid)
1194 int ret = PKGMGR_R_ECOMM;
1195 char *req_key = NULL;
1196 GVariantBuilder *builder = NULL;
1197 GVariant *args = NULL;
1199 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1202 if (pc == NULL || pkg_path == NULL) {
1203 ERR("invalid parameter");
1204 return PKGMGR_R_EINVAL;
1207 if (mpc->ctype != PC_REQUEST) {
1208 ERR("mpc->ctype is not PC_REQUEST");
1209 return PKGMGR_R_EINVAL;
1212 if (access(pkg_path, F_OK) != 0) {
1213 ERR("failed to access: %s", pkg_path);
1214 return PKGMGR_R_EINVAL;
1217 if (mpc->tep_path != NULL && access(mpc->tep_path, F_OK) != 0) {
1218 ERR("failed to access: %s", mpc->tep_path);
1219 return PKGMGR_R_EINVAL;
1222 /* TODO: check pkg's type on server-side */
1223 if (pkg_type == NULL)
1224 pkgtype = __get_type_from_path(pkg_path);
1226 pkgtype = strdup(pkg_type);
1228 /* build arguments */
1229 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1230 if (mpc->tep_path) {
1231 g_variant_builder_add(builder, "s", "-e");
1232 g_variant_builder_add(builder, "s", mpc->tep_path);
1233 g_variant_builder_add(builder, "s", "-M");
1234 /* TODO: revise tep_move */
1235 g_variant_builder_add(builder, "s",
1236 mpc->tep_move ? "tep_move" : "tep_copy");
1239 args = g_variant_new("as", builder);
1240 g_variant_builder_unref(builder);
1242 ret = comm_client_request(mpc->info.request.cc, "mount_install",
1243 g_variant_new("(uss@as)", uid, pkgtype, pkg_path, args),
1245 if (ret != PKGMGR_R_OK) {
1246 ERR("request failed: %d", ret);
1250 g_variant_get(result, "(i&s)", &ret, &req_key);
1251 if (req_key == NULL) {
1252 g_variant_unref(result);
1253 return PKGMGR_R_ECOMM;
1255 if (ret != PKGMGR_R_OK) {
1256 g_variant_unref(result);
1260 req_id = _get_request_id();
1261 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1263 g_variant_unref(result);
1268 API int pkgmgr_client_mount_install(pkgmgr_client *pc, const char *pkg_type,
1269 const char *descriptor_path, const char *pkg_path,
1270 const char *optional_data, pkgmgr_mode mode,
1271 pkgmgr_handler event_cb, void *data)
1273 return pkgmgr_client_usr_mount_install(pc, pkg_type, descriptor_path,
1274 pkg_path, optional_data, mode, event_cb, data,
1278 API int pkgmgr_client_uninstall(pkgmgr_client *pc, const char *pkg_type,
1279 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
1282 return pkgmgr_client_usr_uninstall(pc, pkg_type, pkgid, mode, event_cb,
1286 API int pkgmgr_client_usr_uninstall(pkgmgr_client *pc, const char *pkg_type,
1287 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
1288 void *data, uid_t uid)
1291 int ret = PKGMGR_R_ECOMM;
1292 char *req_key = NULL;
1294 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1296 pkgmgrinfo_pkginfo_h handle;
1298 if (pc == NULL || pkgid == NULL) {
1299 ERR("invalid parameter");
1300 return PKGMGR_R_EINVAL;
1303 if (mpc->ctype != PC_REQUEST) {
1304 ERR("mpc->ctype is not PC_REQUEST");
1305 return PKGMGR_R_EINVAL;
1308 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
1310 return PKGMGR_R_EINVAL;
1312 ret = pkgmgrinfo_pkginfo_get_type(handle, &pkgtype);
1314 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1315 return PKGMGR_R_ERROR;
1318 ret = comm_client_request(mpc->info.request.cc, "uninstall",
1319 g_variant_new("(uss)", uid, pkgtype, pkgid), &result);
1320 if (ret != PKGMGR_R_OK) {
1321 ERR("request failed: %d", ret);
1322 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1326 g_variant_get(result, "(i&s)", &ret, &req_key);
1327 if (req_key == NULL) {
1328 g_variant_unref(result);
1329 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1330 return PKGMGR_R_ECOMM;
1332 if (ret != PKGMGR_R_OK) {
1333 g_variant_unref(result);
1334 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1338 req_id = _get_request_id();
1339 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1341 g_variant_unref(result);
1342 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1347 API int pkgmgr_client_move(pkgmgr_client *pc, const char *pkg_type,
1348 const char *pkgid, pkgmgr_move_type move_type,
1349 pkgmgr_handler event_cb, void *data)
1351 return pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type,
1352 event_cb, data, _getuid());
1354 API int pkgmgr_client_usr_move(pkgmgr_client *pc, const char *pkg_type,
1355 const char *pkgid, pkgmgr_move_type move_type,
1356 pkgmgr_handler event_cb, void *data, uid_t uid)
1359 int ret = PKGMGR_R_ECOMM;
1361 char *req_key = NULL;
1362 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1364 if (pc == NULL || pkg_type == NULL || pkgid == NULL) {
1365 ERR("invalid parameter");
1366 return PKGMGR_R_EINVAL;
1369 if ((move_type < PM_MOVE_TO_INTERNAL) || (move_type > PM_MOVE_TO_SDCARD))
1370 return PKGMGR_R_EINVAL;
1372 if (mpc->ctype != PC_REQUEST) {
1373 ERR("mpc->ctype is not PC_REQUEST");
1374 return PKGMGR_R_EINVAL;
1377 ret = comm_client_request(mpc->info.request.cc, "move",
1378 g_variant_new("(ussi)", uid, pkg_type, pkgid, move_type), &result);
1379 if (ret != PKGMGR_R_OK) {
1380 ERR("request failed: %d", ret);
1384 g_variant_get(result, "(i&s)", &ret, &req_key);
1385 if (req_key == NULL) {
1386 g_variant_unref(result);
1387 return PKGMGR_R_ECOMM;
1389 if (ret != PKGMGR_R_OK) {
1390 g_variant_unref(result);
1394 req_id = _get_request_id();
1395 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1396 g_variant_unref(result);
1401 API int pkgmgr_client_usr_activate(pkgmgr_client *pc, const char *pkg_type,
1402 const char *pkgid, uid_t uid)
1405 int ret = PKGMGR_R_ECOMM;
1406 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1408 if (pc == NULL || pkgid == NULL || pkg_type == NULL) {
1409 ERR("invalid parameter");
1410 return PKGMGR_R_EINVAL;
1413 ret = comm_client_request(mpc->info.request.cc, "enable_pkg",
1414 g_variant_new("(uss)", uid, pkg_type, pkgid), &result);
1415 if (ret != PKGMGR_R_OK) {
1416 ERR("request failed: %d", ret);
1420 g_variant_get(result, "(i)", &ret);
1421 g_variant_unref(result);
1426 API int pkgmgr_client_activate(pkgmgr_client *pc, const char *pkg_type,
1429 return pkgmgr_client_usr_activate(pc, pkg_type, pkgid, _getuid());
1432 API int pkgmgr_client_usr_deactivate(pkgmgr_client *pc, const char *pkg_type,
1433 const char *pkgid, uid_t uid)
1436 int ret = PKGMGR_R_ECOMM;
1437 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1439 if (pc == NULL || pkgid == NULL || pkg_type == NULL) {
1440 ERR("invalid parameter");
1441 return PKGMGR_R_EINVAL;
1444 ret = comm_client_request(mpc->info.request.cc, "disable_pkg",
1445 g_variant_new("(uss)", uid, pkg_type, pkgid), &result);
1446 if (ret != PKGMGR_R_OK) {
1447 ERR("request failed: %d", ret);
1451 g_variant_get(result, "(i)", &ret);
1452 g_variant_unref(result);
1457 API int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type,
1460 return pkgmgr_client_usr_deactivate(pc, pkg_type, pkgid, _getuid());
1463 API int pkgmgr_client_usr_activate_app(pkgmgr_client *pc, const char *appid,
1464 pkgmgr_app_handler app_event_cb, uid_t uid)
1467 int ret = PKGMGR_R_ECOMM;
1469 char *req_key = NULL;
1470 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1472 if (pc == NULL || appid == NULL) {
1473 ERR("invalid parameter");
1474 return PKGMGR_R_EINVAL;
1477 if (__change_op_cb_for_enable_disable(mpc, false) < 0) {
1478 ERR("__change_op_cb_for_enable_disable failed");
1479 return PKGMGR_R_ESYSTEM;
1482 ret = comm_client_request(mpc->info.request.cc, "enable_app",
1483 g_variant_new("(us)", uid, appid), &result);
1484 if (ret != PKGMGR_R_OK) {
1485 ERR("request failed: %d", ret);
1489 g_variant_get(result, "(i&s)", &ret, &req_key);
1490 if (req_key == NULL) {
1491 g_variant_unref(result);
1492 return PKGMGR_R_ECOMM;
1494 if (ret != PKGMGR_R_OK) {
1495 g_variant_unref(result);
1499 req_id = _get_request_id();
1500 __add_op_app_cbinfo(pc, req_id, req_key, app_event_cb, NULL);
1501 g_variant_unref(result);
1505 API int pkgmgr_client_activate_app(pkgmgr_client *pc, const char *appid, pkgmgr_app_handler app_event_cb)
1507 return pkgmgr_client_usr_activate_app(pc, appid, app_event_cb, _getuid());
1510 API int pkgmgr_client_activate_global_app_for_uid(pkgmgr_client *pc,
1511 const char *appid, pkgmgr_app_handler app_event_cb, uid_t uid)
1514 int ret = PKGMGR_R_ECOMM;
1516 char *req_key = NULL;
1517 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1519 if (pc == NULL || appid == NULL) {
1520 ERR("invalid parameter");
1521 return PKGMGR_R_EINVAL;
1524 if (__change_op_cb_for_enable_disable(mpc, false) < 0) {
1525 ERR("__change_op_cb_for_enable_disable failed");
1526 return PKGMGR_R_ESYSTEM;
1529 ret = comm_client_request(mpc->info.request.cc, "enable_global_app_for_uid",
1530 g_variant_new("(us)", uid, appid), &result);
1531 if (ret != PKGMGR_R_OK) {
1532 ERR("request failed: %d", ret);
1536 g_variant_get(result, "(i&s)", &ret, &req_key);
1537 if (req_key == NULL) {
1538 g_variant_unref(result);
1539 return PKGMGR_R_ECOMM;
1541 if (ret != PKGMGR_R_OK) {
1542 g_variant_unref(result);
1546 req_id = _get_request_id();
1547 __add_op_app_cbinfo(pc, req_id, req_key, app_event_cb, NULL);
1552 API int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid,
1553 pkgmgr_app_handler app_event_cb, uid_t uid)
1556 int ret = PKGMGR_R_ECOMM;
1557 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1559 char *req_key = NULL;
1561 if (pc == NULL || appid == NULL) {
1562 ERR("invalid parameter");
1563 return PKGMGR_R_EINVAL;
1567 if (__change_op_cb_for_enable_disable(mpc, true) < 0) {
1568 ERR("__change_op_cb_for_enable_disable failed");
1569 return PKGMGR_R_ESYSTEM;
1572 ret = comm_client_request(mpc->info.request.cc, "disable_app",
1573 g_variant_new("(us)", uid, appid), &result);
1574 if (ret != PKGMGR_R_OK) {
1575 ERR("request failed: %d", ret);
1579 g_variant_get(result, "(i&s)", &ret, &req_key);
1580 if (req_key == NULL) {
1581 g_variant_unref(result);
1582 return PKGMGR_R_ECOMM;
1584 if (ret != PKGMGR_R_OK) {
1585 g_variant_unref(result);
1589 req_id = _get_request_id();
1590 __add_op_app_cbinfo(pc, req_id, req_key, app_event_cb, NULL);
1592 g_variant_unref(result);
1596 API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid, pkgmgr_app_handler app_event_cb)
1598 return pkgmgr_client_usr_deactivate_app(pc, appid, app_event_cb, _getuid());
1601 API int pkgmgr_client_deactivate_global_app_for_uid(pkgmgr_client *pc,
1602 const char *appid, pkgmgr_app_handler app_event_cb, uid_t uid)
1605 int ret = PKGMGR_R_ECOMM;
1607 char *req_key = NULL;
1608 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1610 if (pc == NULL || appid == NULL) {
1611 ERR("invalid parameter");
1612 return PKGMGR_R_EINVAL;
1615 if (__change_op_cb_for_enable_disable(mpc, true) < 0) {
1616 ERR("__change_op_cb_for_enable_disable failed");
1617 return PKGMGR_R_ESYSTEM;
1620 ret = comm_client_request(mpc->info.request.cc, "disable_global_app_for_uid",
1621 g_variant_new("(us)", uid, appid), &result);
1622 if (ret != PKGMGR_R_OK) {
1623 ERR("request failed: %d", ret);
1627 g_variant_get(result, "(i&s)", &ret, &req_key);
1628 if (req_key == NULL) {
1629 g_variant_unref(result);
1630 return PKGMGR_R_ECOMM;
1632 if (ret != PKGMGR_R_OK) {
1633 g_variant_unref(result);
1637 req_id = _get_request_id();
1638 __add_op_app_cbinfo(pc, req_id, req_key, app_event_cb, NULL);
1642 API int pkgmgr_client_usr_clear_user_data(pkgmgr_client *pc,
1643 const char *pkg_type, const char *appid, pkgmgr_mode mode,
1647 int ret = PKGMGR_R_ECOMM;
1648 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1650 if (pc == NULL || pkg_type == NULL || appid == NULL) {
1651 ERR("invalid parameter");
1652 return PKGMGR_R_EINVAL;
1655 if (mpc->ctype != PC_REQUEST) {
1656 ERR("mpc->ctype is not PC_REQUEST");
1657 return PKGMGR_R_EINVAL;
1660 ret = comm_client_request(mpc->info.request.cc, "cleardata",
1661 g_variant_new("(uss)", uid, pkg_type, appid), &result);
1662 if (ret == PKGMGR_R_OK) {
1663 ERR("request failed: %d", ret);
1667 g_variant_get(result, "(i)", &ret);
1668 g_variant_unref(result);
1673 API int pkgmgr_client_clear_user_data(pkgmgr_client *pc, const char *pkg_type,
1674 const char *appid, pkgmgr_mode mode)
1676 return pkgmgr_client_usr_clear_user_data(pc, pkg_type, appid, mode,
1680 API int pkgmgr_client_set_status_type(pkgmgr_client *pc, int status_type)
1684 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1685 retvm_if(status_type == PKGMGR_CLIENT_STATUS_ALL, PKGMGR_R_OK, "status_type is PKGMGR_CLIENT_STATUS_ALL");
1686 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1688 /* free listening head */
1689 listen_cb_info *tmp = NULL;
1690 listen_cb_info *prev = NULL;
1691 for (tmp = mpc->info.listening.lhead; tmp;) {
1697 /* free dbus connection */
1698 ret = comm_client_free(mpc->info.listening.cc);
1699 retvm_if(ret < 0, PKGMGR_R_ERROR, "comm_client_free() failed - %d", ret);
1701 /* Manage pc for seperated event */
1702 mpc->ctype = PC_LISTENING;
1703 mpc->status_type = status_type;
1705 mpc->info.listening.cc = comm_client_new(PC_LISTENING);
1706 retvm_if(mpc->info.listening.cc == NULL, PKGMGR_R_EINVAL, "client creation failed");
1708 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_INSTALL) == PKGMGR_CLIENT_STATUS_INSTALL) {
1709 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_INSTALL, mpc->info.listening.cc, __status_callback, pc);
1710 retvm_if(ret < 0, PKGMGR_R_ECOMM, "PKGMGR_CLIENT_STATUS_INSTALL failed - %d", ret);
1713 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_UNINSTALL) == PKGMGR_CLIENT_STATUS_UNINSTALL) {
1714 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_UNINSTALL, mpc->info.listening.cc, __status_callback, pc);
1715 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_UNINSTALL failed - %d", ret);
1718 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_MOVE) == PKGMGR_CLIENT_STATUS_MOVE) {
1719 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_MOVE, mpc->info.listening.cc, __status_callback, pc);
1720 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_MOVE failed - %d", ret);
1723 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_INSTALL_PROGRESS) == PKGMGR_CLIENT_STATUS_INSTALL_PROGRESS) {
1724 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_INSTALL_PROGRESS, mpc->info.listening.cc, __status_callback, pc);
1725 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_INSTALL_PROGRESS failed - %d", ret);
1728 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_UPGRADE) == PKGMGR_CLIENT_STATUS_UPGRADE) {
1729 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_UPGRADE, mpc->info.listening.cc, __status_callback, pc);
1730 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_UPGRADE failed - %d", ret);
1733 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_ENABLE_APP) == PKGMGR_CLIENT_STATUS_ENABLE_APP) {
1734 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ENABLE_APP, mpc->info.listening.cc, __status_callback, pc);
1735 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_ENABLE_APP failed - %d", ret);
1738 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_DISABLE_APP) == PKGMGR_CLIENT_STATUS_DISABLE_APP) {
1739 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_DISABLE_APP, mpc->info.listening.cc, __status_callback, pc);
1740 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_DISABLE_APP failed - %d", ret);
1743 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_ENABLE_APP_SPLASH_SCREEN) == PKGMGR_CLIENT_STATUS_ENABLE_APP_SPLASH_SCREEN) {
1744 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ENABLE_APP_SPLASH_SCREEN, mpc->info.listening.cc, __status_callback, pc);
1745 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_ENABLE_APP_SPLASH_SCREEN failed - %d", ret);
1748 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_DISABLE_APP_SPLASH_SCREEN) == PKGMGR_CLIENT_STATUS_DISABLE_APP_SPLASH_SCREEN) {
1749 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_DISABLE_APP_SPLASH_SCREEN, mpc->info.listening.cc, __status_callback, pc);
1750 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_DISABLE_APP_SPLASH_SCREEN failed - %d", ret);
1756 API int pkgmgr_client_listen_status(pkgmgr_client *pc, pkgmgr_handler event_cb,
1760 /* Check for NULL value of pc */
1761 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1762 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1764 /* 0. check input */
1765 retvm_if(mpc->ctype != PC_LISTENING, PKGMGR_R_EINVAL, "ctype is not PC_LISTENING");
1766 retvm_if(event_cb == NULL, PKGMGR_R_EINVAL, "event_cb is NULL");
1769 req_id = _get_request_id();
1771 /* 2. add callback info to pkgmgr_client */
1772 __add_stat_cbinfo(mpc, req_id, event_cb, data);
1776 API int pkgmgr_client_listen_app_status(pkgmgr_client *pc, pkgmgr_app_handler event_cb,
1780 /* Check for NULL value of pc */
1781 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1782 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1784 /* 0. check input */
1785 retvm_if(mpc->ctype != PC_LISTENING, PKGMGR_R_EINVAL, "ctype is not PC_LISTENING");
1786 retvm_if(event_cb == NULL, PKGMGR_R_EINVAL, "event_cb is NULL");
1789 req_id = _get_request_id();
1791 /* 2. add app callback info to pkgmgr_client */
1792 __add_app_stat_cbinfo(mpc, req_id, event_cb, data);
1796 API int pkgmgr_client_remove_listen_status(pkgmgr_client *pc)
1800 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1801 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1803 ret = __remove_stat_cbinfo(mpc);
1805 ERR("failed to remove status callback");
1806 return PKGMGR_R_ERROR;
1812 API int pkgmgr_client_broadcast_status(pkgmgr_client *pc, const char *pkg_type,
1813 const char *pkgid, const char *key,
1816 /* client cannot broadcast signal */
1820 API int pkgmgr_client_request_service(pkgmgr_request_service_type service_type, int service_mode,
1821 pkgmgr_client *pc, const char *pkg_type, const char *pkgid,
1822 const char *custom_info, pkgmgr_handler event_cb, void *data)
1824 return pkgmgr_client_usr_request_service(service_type, service_mode, pc, pkg_type, pkgid, _getuid(), custom_info, event_cb, data);
1827 API int pkgmgr_client_usr_request_service(pkgmgr_request_service_type service_type, int service_mode,
1828 pkgmgr_client *pc, const char *pkg_type, const char *pkgid, uid_t uid,
1829 const char *custom_info, pkgmgr_handler event_cb, void *data)
1833 /* Check for NULL value of service type */
1834 retvm_if(service_type > PM_REQUEST_MAX, PKGMGR_R_EINVAL, "service type is not defined\n");
1835 retvm_if(service_type < 0, PKGMGR_R_EINVAL, "service type is error\n");
1837 switch (service_type) {
1838 case PM_REQUEST_MOVE:
1839 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1840 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1841 tryvm_if((service_mode < PM_MOVE_TO_INTERNAL) || (service_mode > PM_MOVE_TO_SDCARD), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1843 ret = __move_pkg_process(pc, pkgid, pkg_type, uid, (pkgmgr_move_type)service_mode, event_cb, data);
1846 case PM_REQUEST_GET_SIZE:
1847 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1848 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1849 tryvm_if((service_mode < PM_GET_TOTAL_SIZE) || (service_mode >= PM_GET_MAX), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1851 ret = __get_size_process(pc, pkgid, uid, (pkgmgr_getsize_type)service_mode, event_cb, data);
1854 case PM_REQUEST_KILL_APP:
1855 case PM_REQUEST_CHECK_APP:
1856 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1857 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1859 ret = __check_app_process(service_type, pc, pkgid, uid, data);
1861 ERR("__check_app_process fail \n");
1868 ERR("Wrong Request\n");
1879 API int pkgmgr_client_usr_request_size_info(uid_t uid)
1882 pkgmgr_client *pc = NULL;
1884 pc = pkgmgr_client_new(PC_REQUEST);
1885 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "request pc is null\n");
1887 ret = __request_size_info(pc, uid);
1889 ERR("__request_size_info fail \n");
1891 pkgmgr_client_free(pc);
1895 API int pkgmgr_client_request_size_info(void) /* get all package size (data, total) */
1897 return pkgmgr_client_usr_request_size_info(_getuid());
1900 API int pkgmgr_client_usr_clear_cache_dir(const char *pkgid, uid_t uid)
1903 int ret = PKGMGR_R_ECOMM;
1904 pkgmgr_client_t *pc;
1906 if (pkgid == NULL) {
1907 ERR("invalid parameter");
1908 return PKGMGR_R_EINVAL;
1911 pc = pkgmgr_client_new(PC_REQUEST);
1913 ERR("out of memory");
1914 return PKGMGR_R_ESYSTEM;
1917 ret = comm_client_request(pc->info.request.cc, "clearcache",
1918 g_variant_new("(us)", uid, pkgid), &result);
1919 if (ret != PKGMGR_R_OK) {
1920 ERR("request failed: %d", ret);
1924 g_variant_get(result, "(i)", &ret);
1925 g_variant_unref(result);
1930 API int pkgmgr_client_clear_cache_dir(const char *pkgid)
1932 return pkgmgr_client_usr_clear_cache_dir(pkgid, _getuid());
1935 API int pkgmgr_client_clear_usr_all_cache_dir(uid_t uid)
1937 return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, uid);
1940 API int pkgmgr_client_clear_all_cache_dir(void)
1942 return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, _getuid());
1945 API int pkgmgr_client_get_size(pkgmgr_client *pc, const char *pkgid,
1946 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
1949 return pkgmgr_client_usr_get_size(pc, pkgid, get_type, event_cb, data,
1953 API int pkgmgr_client_usr_get_size(pkgmgr_client *pc, const char *pkgid,
1954 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
1955 void *data, uid_t uid)
1958 int ret = PKGMGR_R_ECOMM;
1959 char *req_key = NULL;
1961 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1963 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
1964 ERR("invalid parameter");
1965 return PKGMGR_R_EINVAL;
1968 if (mpc->ctype != PC_REQUEST) {
1969 ERR("mpc->ctype is not PC_REQUEST");
1970 return PKGMGR_R_EINVAL;
1974 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
1975 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
1977 get_type = PM_GET_PKG_SIZE_INFO;
1979 ret = comm_client_request(mpc->info.request.cc, "getsize",
1980 g_variant_new("(usi)", uid, pkgid, get_type), &result);
1981 if (ret != PKGMGR_R_OK) {
1982 ERR("request failed: %d", ret);
1986 g_variant_get(result, "(i&s)", &ret, &req_key);
1987 if (req_key == NULL) {
1988 g_variant_unref(result);
1989 return PKGMGR_R_ECOMM;
1991 if (ret != PKGMGR_R_OK) {
1992 g_variant_unref(result);
1996 req_id = _get_request_id();
1997 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1999 g_variant_unref(result);
2004 API int pkgmgr_client_usr_get_package_size_info(pkgmgr_client *pc,
2005 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
2006 void *user_data, uid_t uid)
2009 int ret = PKGMGR_R_ECOMM;
2010 char *req_key = NULL;
2013 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2015 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
2016 ERR("invalid parameter");
2017 return PKGMGR_R_EINVAL;
2020 if (mpc->ctype != PC_REQUEST) {
2021 ERR("mpc->ctype is not PC_REQUEST");
2022 return PKGMGR_R_EINVAL;
2026 if (__change_op_cb_for_getsize(mpc) < 0) {
2027 ERR("__change_op_cb_for_getsize failed");
2028 return PKGMGR_R_ESYSTEM;
2031 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
2032 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
2034 get_type = PM_GET_PKG_SIZE_INFO;
2036 ret = comm_client_request(mpc->info.request.cc, "getsize",
2037 g_variant_new("(usi)", uid, pkgid, get_type), &result);
2038 if (ret != PKGMGR_R_OK) {
2039 ERR("request failed: %d", ret);
2043 g_variant_get(result, "(i&s)", &ret, &req_key);
2044 if (req_key == NULL) {
2045 g_variant_unref(result);
2046 return PKGMGR_R_ECOMM;
2048 if (ret != PKGMGR_R_OK) {
2049 g_variant_unref(result);
2053 req_id = _get_request_id();
2054 __add_op_cbinfo(mpc, req_id, req_key, __get_pkg_size_info_cb, event_cb,
2057 g_variant_unref(result);
2062 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)
2064 return pkgmgr_client_usr_get_package_size_info(pc, pkgid, event_cb, user_data, _getuid());
2067 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)
2068 { /* total package size info */
2069 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL, (pkgmgr_pkg_size_info_receive_cb)event_cb, user_data, uid);
2072 API int pkgmgr_client_get_total_package_size_info(pkgmgr_client *pc, pkgmgr_total_pkg_size_info_receive_cb event_cb, void *user_data)
2074 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL, (pkgmgr_pkg_size_info_receive_cb)event_cb, user_data, _getuid());
2077 API int pkgmgr_client_generate_license_request(pkgmgr_client *pc,
2078 const char *resp_data, char **req_data, char **license_url)
2084 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2086 if (pc == NULL || resp_data == NULL || req_data == NULL ||
2087 license_url == NULL) {
2088 ERR("invalid parameter");
2089 return PKGMGR_R_EINVAL;
2092 if (mpc->ctype != PC_REQUEST) {
2093 ERR("mpc->ctype is not PC_REQUEST");
2094 return PKGMGR_R_EINVAL;
2097 ret = comm_client_request(mpc->info.request.cc,
2098 "generate_license_request",
2099 g_variant_new("(s)", resp_data), &result);
2100 if (ret != PKGMGR_R_OK) {
2101 ERR("request failed: %d", ret);
2105 g_variant_get(result, "(i&s&s)", &ret, &data, &url);
2106 if (ret != PKGMGR_R_OK) {
2107 ERR("generate_license_request failed: %d", ret);
2108 g_variant_unref(result);
2112 *req_data = strdup(data);
2113 *license_url = strdup(url);
2115 g_variant_unref(result);
2120 API int pkgmgr_client_register_license(pkgmgr_client *pc, const char *resp_data)
2124 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2126 if (pc == NULL || resp_data == NULL) {
2127 ERR("invalid parameter");
2128 return PKGMGR_R_EINVAL;
2131 if (mpc->ctype != PC_REQUEST) {
2132 ERR("mpc->ctype is not PC_REQUEST");
2133 return PKGMGR_R_EINVAL;
2136 ret = comm_client_request(mpc->info.request.cc,
2137 "register_license", g_variant_new("(s)", resp_data),
2139 if (ret != PKGMGR_R_OK) {
2140 ERR("request failed: %d", ret);
2144 g_variant_get(result, "(i)", &ret);
2145 g_variant_unref(result);
2146 if (ret != PKGMGR_R_OK) {
2147 ERR("register license failed: %d", ret);
2154 API int pkgmgr_client_decrypt_package(pkgmgr_client *pc,
2155 const char *drm_file_path, const char *decrypted_file_path)
2159 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2161 if (pc == NULL || drm_file_path == NULL ||
2162 decrypted_file_path == NULL) {
2163 ERR("invalid parameter");
2164 return PKGMGR_R_EINVAL;
2167 if (mpc->ctype != PC_REQUEST) {
2168 ERR("mpc->ctype is not PC_REQUEST");
2169 return PKGMGR_R_EINVAL;
2172 ret = comm_client_request(mpc->info.request.cc,
2174 g_variant_new("(ss)", drm_file_path,
2175 decrypted_file_path),
2177 if (ret != PKGMGR_R_OK) {
2178 ERR("request failed: %d", ret);
2182 g_variant_get(result, "(i)", &ret);
2183 g_variant_unref(result);
2184 if (ret != PKGMGR_R_OK) {
2185 ERR("decrypt_package failed: %d", ret);
2192 API int pkgmgr_client_enable_splash_screen(pkgmgr_client *pc, const char *appid)
2194 return pkgmgr_client_usr_enable_splash_screen(pc, appid, _getuid());
2197 API int pkgmgr_client_usr_enable_splash_screen(pkgmgr_client *pc,
2198 const char *appid, uid_t uid)
2202 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2204 if (pc == NULL || appid == NULL) {
2205 ERR("Invalid parameter");
2206 return PKGMGR_R_EINVAL;
2209 ret = __change_op_cb_for_enable_disable_splash_screen(mpc, true);
2211 ERR("__change_op_cb_for_enable_disable_splash_screen failed");
2212 return PKGMGR_R_ESYSTEM;
2215 ret = comm_client_request(mpc->info.request.cc,
2216 "enable_app_splash_screen",
2217 g_variant_new("(us)", uid, appid), &result);
2218 if (ret != PKGMGR_R_OK) {
2219 ERR("request failed: %d", ret);
2223 g_variant_get(result, "(i)", &ret);
2224 if (ret != PKGMGR_R_OK) {
2225 g_variant_unref(result);
2229 g_variant_unref(result);
2234 API int pkgmgr_client_disable_splash_screen(pkgmgr_client *pc,
2237 return pkgmgr_client_usr_disable_splash_screen(pc, appid,
2241 API int pkgmgr_client_usr_disable_splash_screen(pkgmgr_client *pc,
2242 const char *appid, uid_t uid)
2246 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2248 if (pc == NULL || appid == NULL) {
2249 ERR("Invalid parameter");
2250 return PKGMGR_R_EINVAL;
2253 ret = __change_op_cb_for_enable_disable_splash_screen(mpc, false);
2255 ERR("__change_op_cb_for_enable_disable_splash_screen failed");
2259 ret = comm_client_request(mpc->info.request.cc,
2260 "disable_app_splash_screen",
2261 g_variant_new("(us)", uid, appid), &result);
2262 if (ret != PKGMGR_R_OK) {
2263 ERR("request failed: %d", ret);
2267 g_variant_get(result, "(i)", &ret);
2268 if (ret != PKGMGR_R_OK) {
2269 g_variant_unref(result);
2273 g_variant_unref(result);
2278 static int __set_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int mode, uid_t uid)
2281 int ret = PKGMGR_R_ECOMM;
2282 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2284 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
2285 ERR("invalid parameter");
2286 return PKGMGR_R_EINVAL;
2289 ret = comm_client_request(mpc->info.request.cc, "set_restriction_mode",
2290 g_variant_new("(usi)", uid, pkgid, mode), &result);
2291 if (ret != PKGMGR_R_OK) {
2292 ERR("request failed: %d", ret);
2296 g_variant_get(result, "(i)", &ret);
2297 g_variant_unref(result);
2302 API int pkgmgr_client_usr_set_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int mode, uid_t uid)
2304 return __set_pkg_restriction_mode(pc, pkgid, mode, uid);
2307 API int pkgmgr_client_set_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int mode)
2309 return pkgmgr_client_usr_set_pkg_restriction_mode(pc, pkgid, mode, _getuid());
2312 static int __unset_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int mode, uid_t uid)
2315 int ret = PKGMGR_R_ECOMM;
2316 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2318 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
2319 ERR("invalid parameter");
2320 return PKGMGR_R_EINVAL;
2323 ret = comm_client_request(mpc->info.request.cc,
2324 "unset_restriction_mode",
2325 g_variant_new("(usi)", uid, pkgid, mode), &result);
2326 if (ret != PKGMGR_R_OK) {
2327 ERR("request failed: %d", ret);
2331 g_variant_get(result, "(i)", &ret);
2332 g_variant_unref(result);
2338 API int pkgmgr_client_usr_unset_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int mode, uid_t uid)
2340 return __unset_pkg_restriction_mode(pc, pkgid, mode, uid);
2343 API int pkgmgr_client_unset_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int mode)
2345 return pkgmgr_client_usr_unset_pkg_restriction_mode(pc, pkgid, mode, _getuid());
2348 static int __get_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int *mode, uid_t uid)
2351 int ret = PKGMGR_R_ECOMM;
2353 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2355 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0) {
2356 ERR("invalid parameter");
2357 return PKGMGR_R_EINVAL;
2360 ret = comm_client_request(mpc->info.request.cc,
2361 "get_restriction_mode",
2362 g_variant_new("(us)", uid, pkgid), &result);
2363 if (ret != PKGMGR_R_OK) {
2364 ERR("request failed: %d", ret);
2368 g_variant_get(result, "(ii)", &m, &ret);
2369 g_variant_unref(result);
2370 if (ret != PKGMGR_R_OK)
2378 API int pkgmgr_client_usr_get_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int *mode, uid_t uid)
2380 return __get_pkg_restriction_mode(pc, pkgid, mode, uid);
2383 API int pkgmgr_client_get_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int *mode)
2385 return pkgmgr_client_usr_get_pkg_restriction_mode(pc, pkgid, mode, _getuid());
2388 API int pkgmgr_client_usr_set_restriction_mode(pkgmgr_client *pc, int mode,
2392 int ret = PKGMGR_R_ECOMM;
2393 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2396 ERR("invalid parameter");
2397 return PKGMGR_R_EINVAL;
2400 ret = comm_client_request(mpc->info.request.cc, "set_restriction_mode",
2401 g_variant_new("(usi)", uid, "", mode), &result);
2402 if (ret != PKGMGR_R_OK) {
2403 ERR("request failed: %d", ret);
2407 g_variant_get(result, "(i)", &ret);
2408 g_variant_unref(result);
2413 API int pkgmgr_client_set_restriction_mode(pkgmgr_client *pc, int mode)
2415 return pkgmgr_client_usr_set_restriction_mode(pc, mode, _getuid());
2418 API int pkgmgr_client_usr_unset_restriction_mode(pkgmgr_client *pc, int mode,
2422 int ret = PKGMGR_R_ECOMM;
2423 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2426 ERR("invalid parameter");
2427 return PKGMGR_R_EINVAL;
2430 ret = comm_client_request(mpc->info.request.cc,
2431 "unset_restriction_mode",
2432 g_variant_new("(usi)", uid, "", mode), &result);
2433 if (ret != PKGMGR_R_OK) {
2434 ERR("request failed: %d", ret);
2438 g_variant_get(result, "(i)", &ret);
2439 g_variant_unref(result);
2444 API int pkgmgr_client_unset_restriction_mode(pkgmgr_client *pc, int mode)
2446 return pkgmgr_client_usr_unset_restriction_mode(pc, mode, _getuid());
2449 API int pkgmgr_client_usr_get_restriction_mode(pkgmgr_client *pc,
2450 int *mode, uid_t uid)
2453 int ret = PKGMGR_R_ECOMM;
2455 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2458 ERR("invalid parameter");
2459 return PKGMGR_R_EINVAL;
2462 ret = comm_client_request(mpc->info.request.cc,
2463 "get_restriction_mode",
2464 g_variant_new("(us)", uid, ""), &result);
2465 if (ret != PKGMGR_R_OK) {
2466 ERR("request failed: %d", ret);
2470 g_variant_get(result, "(ii)", &m, &ret);
2471 g_variant_unref(result);
2472 if (ret != PKGMGR_R_OK)
2480 API int pkgmgr_client_get_restriction_mode(pkgmgr_client *pc,
2483 return pkgmgr_client_usr_get_restriction_mode(pc, mode, _getuid());