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.
37 #include <pkgmgr-info.h>
38 #include <iniparser.h>
39 /* For multi-user support */
40 #include <tzplatform_config.h>
42 #include "package-manager.h"
43 #include "pkgmgr_client_debug.h"
44 #include "pkgmgr_client_internal.h"
46 /* API export macro */
48 #define API __attribute__ ((visibility("default")))
51 #define BINSH_NAME "/bin/sh"
54 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
55 #define REGULAR_USER 5000
57 static GList *jobs_to_free;
58 static pthread_mutex_t __mutex = PTHREAD_MUTEX_INITIALIZER;
60 static inline uid_t _getuid(void)
64 if (uid < REGULAR_USER)
70 static int _get_request_id()
72 static int internal_req_id = 1;
74 return internal_req_id++;
77 static struct cb_info *__create_event_cb_info(struct pkgmgr_client_t *client,
78 pkgmgr_handler event_cb, void *data, const char *req_key)
80 struct cb_info *cb_info;
82 cb_info = calloc(1, sizeof(struct cb_info));
83 if (cb_info == NULL) {
87 cb_info->client = client;
88 cb_info->event_cb = event_cb;
90 cb_info->req_id = _get_request_id();
91 if (req_key != NULL) {
92 cb_info->req_key = strdup(req_key);
93 if (cb_info->req_key == NULL) {
103 static struct cb_info *__create_app_event_cb_info(
104 struct pkgmgr_client_t *client, pkgmgr_app_handler app_event_cb,
105 void *data, const char *req_key)
107 struct cb_info *cb_info;
109 cb_info = calloc(1, sizeof(struct cb_info));
110 if (cb_info == NULL) {
111 ERR("out of memory");
114 cb_info->client = client;
115 cb_info->app_event_cb = app_event_cb;
116 cb_info->data = data;
117 cb_info->req_id = _get_request_id();
118 if (req_key != NULL) {
119 cb_info->req_key = strdup(req_key);
120 if (cb_info->req_key == NULL) {
121 ERR("out of memory");
130 static struct cb_info *__create_size_info_cb_info(
131 struct pkgmgr_client_t *client,
132 pkgmgr_pkg_size_info_receive_cb size_info_cb,
133 void *data, const char *req_key)
135 struct cb_info *cb_info;
137 cb_info = calloc(1, sizeof(struct cb_info));
138 if (cb_info == NULL) {
139 ERR("out of memory");
142 cb_info->client = client;
143 cb_info->size_info_cb = size_info_cb;
144 cb_info->data = data;
145 cb_info->req_id = _get_request_id();
146 if (req_key != NULL) {
147 cb_info->req_key = strdup(req_key);
148 if (cb_info->req_key == NULL) {
149 ERR("out of memory");
158 static int __jobs_to_free_add(gpointer data)
160 pthread_mutex_lock(&__mutex);
161 if (g_list_find(jobs_to_free, data)) {
162 pthread_mutex_unlock(&__mutex);
166 jobs_to_free = g_list_append(jobs_to_free, data);
167 pthread_mutex_unlock(&__mutex);
171 static void __jobs_to_free_remove(gpointer data)
173 pthread_mutex_lock(&__mutex);
174 jobs_to_free = g_list_remove(jobs_to_free, data);
175 pthread_mutex_unlock(&__mutex);
178 static void __do_free_cb_info(gpointer data)
180 struct cb_info *cb_info = (struct cb_info *)data;
182 g_list_free(cb_info->sid_list);
183 free(cb_info->req_key);
187 static void __free_cb_info_cb(gpointer data)
189 g_idle_remove_by_data(data);
190 __do_free_cb_info(data);
193 __attribute__((destructor)) static void __free_cb_info_at_destructor(void)
195 pthread_mutex_lock(&__mutex);
196 g_list_free_full(jobs_to_free, __free_cb_info_cb);
197 pthread_mutex_unlock(&__mutex);
200 static gboolean __free_cb_info_at_idle(gpointer data)
202 __jobs_to_free_remove(data);
203 __do_free_cb_info(data);
205 return G_SOURCE_REMOVE;
208 static void __free_cb_info(struct cb_info *cb_info)
210 if (__jobs_to_free_add(cb_info) < 0)
213 g_idle_add(__free_cb_info_at_idle, cb_info);
216 static int __get_size_process(pkgmgr_client *pc, const char *pkgid, uid_t uid,
217 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
221 int ret = PKGMGR_R_ECOMM;
222 long long size_info = 0;
223 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
225 if (pc == NULL || pkgid == NULL) {
226 ERR("invalid parameter");
227 return PKGMGR_R_EINVAL;
230 if (client->pc_type != PC_REQUEST) {
231 ERR("client->pc_type is not PC_REQUEST");
232 return PKGMGR_R_EINVAL;
235 ret = pkgmgr_client_connection_send_request(client, "getsize_sync",
236 g_variant_new("(usi)", uid, pkgid, get_type), &result);
237 if (ret != PKGMGR_R_OK) {
238 ERR("request failed: %d", ret);
242 g_variant_get(result, "(ix)", &ret, &size_info);
243 if (ret != PKGMGR_R_OK) {
244 ERR("request result failed: %d", ret);
245 g_variant_unref(result);
250 ERR("invalid size_info=(%lld)", size_info);
253 ret = (int)size_info;
254 DBG("size_info(%lld), return size(%d)", size_info, ret);
257 g_variant_unref(result);
262 static int __move_pkg_process(pkgmgr_client *pc, const char *pkgid,
263 const char *pkg_type, uid_t uid, pkgmgr_move_type move_type,
264 pkgmgr_handler event_cb, void *data)
268 ret = pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type, event_cb, data, uid);
270 ERR("move request failed");
277 static int __check_app_process(pkgmgr_request_service_type service_type,
278 pkgmgr_client *pc, const char *pkgid, uid_t uid, void *data)
281 int ret = PKGMGR_R_ECOMM;
282 pkgmgrinfo_pkginfo_h handle;
284 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
286 retvm_if(client->pc_type != PC_REQUEST, PKGMGR_R_EINVAL, "client->pc_type is not PC_REQUEST\n");
288 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
289 if (ret != PMINFO_R_OK) {
290 ERR("pkgmgrinfo_pkginfo_get_pkginfo failed");
291 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
292 return PKGMGR_R_ERROR;
295 if (service_type == PM_REQUEST_KILL_APP) {
296 ret = pkgmgr_client_connection_send_request(client, "kill",
297 g_variant_new("(us)", uid, pkgid), &result);
298 } else if (service_type == PM_REQUEST_CHECK_APP) {
299 ret = pkgmgr_client_connection_send_request(client, "check",
300 g_variant_new("(us)", uid, pkgid), &result);
302 ERR("unexpected service type: %d", service_type);
303 ret = PKGMGR_R_ERROR;
306 if (ret != PKGMGR_R_OK) {
307 ERR("request failed: %d", ret);
311 g_variant_get(result, "(ii)", &ret, &pid);
312 g_variant_unref(result);
313 if (ret != PKGMGR_R_OK) {
314 ERR("request failed, ret=%d", ret);
320 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
326 API pkgmgr_client *pkgmgr_client_new(pkgmgr_client_type pc_type)
328 struct pkgmgr_client_t *client;
330 if (pc_type == PC_BROADCAST) {
331 ERR("broadcast type is not supported");
335 if (pc_type != PC_REQUEST && pc_type != PC_LISTENING) {
336 ERR("invalid parameter");
340 client = calloc(1, sizeof(struct pkgmgr_client_t));
341 if (client == NULL) {
342 ERR("out of memory");
346 client->pc_type = pc_type;
347 client->status_type = PKGMGR_CLIENT_STATUS_ALL;
349 if (pkgmgr_client_connection_connect(client) != PKGMGR_R_OK) {
354 return (pkgmgr_client *)client;
357 API int pkgmgr_client_free(pkgmgr_client *pc)
359 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
362 ERR("invalid argument");
363 return PKGMGR_R_EINVAL;
366 pkgmgr_client_remove_listen_status(client);
367 pkgmgr_client_connection_disconnect(client);
368 if (client->tep_path)
369 free(client->tep_path);
375 struct manifest_and_type type_map[] = {
376 { "res/wgt/config.xml", "wgt" },
377 { "config.xml", "wgt" },
378 { "tizen-manifest.xml", "tpk" },
382 static char *__get_type_from_path(const char *pkg_path)
384 const char *type = NULL;
388 uf = unzOpen(pkg_path);
390 ERR("failed to open zip file %s", pkg_path);
394 for (i = 0; type_map[i].manifest != NULL; i++) {
395 if (unzLocateFile(uf, type_map[i].manifest, 0) == UNZ_OK) {
396 DBG("pkgtype of %s: [%s]", pkg_path, type_map[i].type);
397 type = type_map[i].type;
403 return type ? strdup(type) : NULL;
406 API int pkgmgr_client_set_tep_path(pkgmgr_client *pc, const char *tep_path,
409 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *) pc;
411 if (pc == NULL || tep_path == NULL) {
412 ERR("invalied parameter");
413 return PKGMGR_R_EINVAL;
416 if (client->tep_path)
417 free(client->tep_path);
419 client->tep_path = strdup(tep_path);
420 client->tep_move = tep_move;
425 API int pkgmgr_client_usr_install_packages(pkgmgr_client *pc,
426 const char **pkg_paths, int n_pkgs, pkgmgr_handler event_cb,
427 void *data, uid_t uid)
430 GVariantBuilder *pkgs_builder;
432 GVariantBuilder *args_builder;
435 char *req_key = NULL;
436 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
437 struct cb_info *cb_info;
440 if (pc == NULL || pkg_paths == NULL || n_pkgs < 1) {
441 ERR("invalid parameter");
442 return PKGMGR_R_EINVAL;
445 if (client->pc_type != PC_REQUEST) {
446 ERR("client type is not PC_REQUEST");
447 return PKGMGR_R_EINVAL;
450 for (i = 0; i < n_pkgs; i++) {
451 if (access(pkg_paths[i], F_OK) != 0) {
452 ERR("failed to access: %s", pkg_paths[i]);
453 return PKGMGR_R_EINVAL;
457 pkgs_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
458 for (i = 0; i < n_pkgs; i++)
459 g_variant_builder_add(pkgs_builder, "s", pkg_paths[i]);
460 pkgs = g_variant_new("as", pkgs_builder);
461 g_variant_builder_unref(pkgs_builder);
463 args_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
464 if (client->debug_mode)
465 g_variant_builder_add(args_builder, "s", "-G");
466 if (client->skip_optimization)
467 g_variant_builder_add(args_builder, "s", "-S");
468 args = g_variant_new("as", args_builder);
469 g_variant_builder_unref(args_builder);
471 ret = pkgmgr_client_connection_send_request(client, "install_pkgs",
472 g_variant_new("(u@as@as)", uid, pkgs, args), &result);
473 if (ret != PKGMGR_R_OK) {
474 ERR("request failed: %d", ret);
478 g_variant_get(result, "(i&s)", &ret, &req_key);
479 if (req_key == NULL) {
480 g_variant_unref(result);
481 return PKGMGR_R_ECOMM;
483 if (ret != PKGMGR_R_OK) {
484 g_variant_unref(result);
488 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
489 if (cb_info == NULL) {
490 g_variant_unref(result);
491 return PKGMGR_R_ERROR;
493 g_variant_unref(result);
494 ret = pkgmgr_client_connection_set_callback(client, cb_info);
495 if (ret != PKGMGR_R_OK) {
496 __free_cb_info(cb_info);
499 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
501 return cb_info->req_id;
504 API int pkgmgr_client_install_packages(pkgmgr_client *pc,
505 const char **pkg_paths, int n_pkgs, pkgmgr_handler event_cb,
508 return pkgmgr_client_usr_install_packages(pc, pkg_paths, n_pkgs,
509 event_cb, data, _getuid());
512 API int pkgmgr_client_usr_install(pkgmgr_client *pc, const char *pkg_type,
513 const char *descriptor_path, const char *pkg_path,
514 const char *optional_data, pkgmgr_mode mode,
515 pkgmgr_handler event_cb, void *data, uid_t uid)
518 int ret = PKGMGR_R_ECOMM;
519 char *req_key = NULL;
520 GVariantBuilder *builder = NULL;
521 GVariant *args = NULL;
522 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
523 struct cb_info *cb_info;
525 if (pc == NULL || pkg_path == NULL) {
526 ERR("invalid parameter");
527 return PKGMGR_R_EINVAL;
530 if (client->pc_type != PC_REQUEST) {
531 ERR("client type is not PC_REQUEST");
532 return PKGMGR_R_EINVAL;
535 if (access(pkg_path, F_OK) != 0) {
536 ERR("failed to access: %s", pkg_path);
537 return PKGMGR_R_EINVAL;
540 if (client->tep_path != NULL && access(client->tep_path, F_OK) != 0) {
541 ERR("failed to access: %s", client->tep_path);
542 return PKGMGR_R_EINVAL;
545 /* build arguments */
546 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
547 if (client->tep_path) {
548 g_variant_builder_add(builder, "s", "-e");
549 g_variant_builder_add(builder, "s", client->tep_path);
550 g_variant_builder_add(builder, "s", "-M");
551 /* TODO: revise tep_move */
552 g_variant_builder_add(builder, "s",
553 client->tep_move ? "tep_move" : "tep_copy");
555 if (client->debug_mode)
556 g_variant_builder_add(builder, "s", "-G");
557 if (client->skip_optimization)
558 g_variant_builder_add(builder, "s", "-S");
560 args = g_variant_new("as", builder);
561 g_variant_builder_unref(builder);
563 ret = pkgmgr_client_connection_send_request(client, "install",
564 g_variant_new("(uss@as)", uid, pkg_type ? pkg_type : "",
567 if (ret != PKGMGR_R_OK) {
568 ERR("request failed: %d", ret);
572 g_variant_get(result, "(i&s)", &ret, &req_key);
573 if (req_key == NULL) {
574 g_variant_unref(result);
575 return PKGMGR_R_ECOMM;
577 if (ret != PKGMGR_R_OK) {
578 g_variant_unref(result);
582 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
583 if (cb_info == NULL) {
584 g_variant_unref(result);
585 return PKGMGR_R_ENOMEM;
587 g_variant_unref(result);
588 ret = pkgmgr_client_connection_set_callback(client, cb_info);
589 if (ret != PKGMGR_R_OK) {
590 __free_cb_info(cb_info);
593 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
595 return cb_info->req_id;
598 API int pkgmgr_client_install(pkgmgr_client *pc, const char *pkg_type,
599 const char *descriptor_path, const char *pkg_path,
600 const char *optional_data, pkgmgr_mode mode,
601 pkgmgr_handler event_cb, void *data)
603 return pkgmgr_client_usr_install(pc, pkg_type, descriptor_path,
604 pkg_path, optional_data, mode, event_cb, data,
608 API int pkgmgr_client_reinstall(pkgmgr_client *pc, const char *pkg_type,
609 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
610 pkgmgr_handler event_cb, void *data)
612 return pkgmgr_client_usr_reinstall(pc, pkg_type, pkgid, optional_data,
613 mode, event_cb, data, _getuid());
616 API int pkgmgr_client_usr_reinstall(pkgmgr_client *pc, const char *pkg_type,
617 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
618 pkgmgr_handler event_cb, void *data, uid_t uid)
621 int ret = PKGMGR_R_ECOMM;
622 char *req_key = NULL;
623 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
624 struct cb_info *cb_info;
626 if (pc == NULL || pkgid == NULL) {
627 ERR("invalid parameter");
628 return PKGMGR_R_EINVAL;
631 if (client->pc_type != PC_REQUEST) {
632 ERR("client->pc_type is not PC_REQUEST");
633 return PKGMGR_R_EINVAL;
636 ret = pkgmgr_client_connection_send_request(client, "reinstall",
637 g_variant_new("(us)", uid, pkgid), &result);
638 if (ret != PKGMGR_R_OK) {
639 ERR("request failed: %d", ret);
643 g_variant_get(result, "(i&s)", &ret, &req_key);
644 if (req_key == NULL) {
645 g_variant_unref(result);
646 return PKGMGR_R_ECOMM;
648 if (ret != PKGMGR_R_OK) {
649 g_variant_unref(result);
653 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
654 if (cb_info == NULL) {
655 g_variant_unref(result);
656 return PKGMGR_R_ENOMEM;
658 g_variant_unref(result);
659 ret = pkgmgr_client_connection_set_callback(client, cb_info);
660 if (ret != PKGMGR_R_OK) {
661 __free_cb_info(cb_info);
664 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
666 return cb_info->req_id;
669 API int pkgmgr_client_usr_mount_install_packages(pkgmgr_client *pc,
670 const char **pkg_paths, int n_pkgs, pkgmgr_handler event_cb,
671 void *data, uid_t uid)
674 GVariantBuilder *pkgs_builder;
676 int ret = PKGMGR_R_ECOMM;
677 char *req_key = NULL;
678 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
679 struct cb_info *cb_info;
682 if (pc == NULL || pkg_paths == NULL || n_pkgs < 1) {
683 ERR("invalid parameter");
684 return PKGMGR_R_EINVAL;
687 if (client->pc_type != PC_REQUEST) {
688 ERR("client->pc_type is not PC_REQUEST");
689 return PKGMGR_R_EINVAL;
692 for (i = 0; i < n_pkgs; i++) {
693 if (access(pkg_paths[i], F_OK) != 0) {
694 ERR("failed to access: %s", pkg_paths[i]);
695 return PKGMGR_R_EINVAL;
699 pkgs_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
700 for (i = 0; i < n_pkgs; i++)
701 g_variant_builder_add(pkgs_builder, "s", pkg_paths[i]);
702 pkgs = g_variant_new("as", pkgs_builder);
703 g_variant_builder_unref(pkgs_builder);
705 ret = pkgmgr_client_connection_send_request(client,
706 "mount_install_pkgs",
707 g_variant_new("(u@as)", uid, pkgs), &result);
708 if (ret != PKGMGR_R_OK) {
709 ERR("request failed: %d", ret);
713 g_variant_get(result, "(i&s)", &ret, &req_key);
714 if (req_key == NULL) {
715 g_variant_unref(result);
716 return PKGMGR_R_ECOMM;
718 if (ret != PKGMGR_R_OK) {
719 g_variant_unref(result);
723 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
724 if (cb_info == NULL) {
725 g_variant_unref(result);
726 return PKGMGR_R_ENOMEM;
728 g_variant_unref(result);
729 ret = pkgmgr_client_connection_set_callback(client, cb_info);
730 if (ret != PKGMGR_R_OK) {
731 __free_cb_info(cb_info);
734 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
736 return cb_info->req_id;
739 API int pkgmgr_client_mount_install_packages(pkgmgr_client *pc,
740 const char **pkg_paths, int n_pkgs, pkgmgr_handler event_cb,
743 return pkgmgr_client_usr_mount_install_packages(pc, pkg_paths, n_pkgs,
744 event_cb, data, _getuid());
747 API int pkgmgr_client_usr_mount_install(pkgmgr_client *pc, const char *pkg_type,
748 const char *descriptor_path, const char *pkg_path,
749 const char *optional_data, pkgmgr_mode mode,
750 pkgmgr_handler event_cb, void *data, uid_t uid)
753 int ret = PKGMGR_R_ECOMM;
754 char *req_key = NULL;
755 GVariantBuilder *builder = NULL;
756 GVariant *args = NULL;
757 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
758 struct cb_info *cb_info;
760 if (pc == NULL || pkg_path == NULL) {
761 ERR("invalid parameter");
762 return PKGMGR_R_EINVAL;
765 if (client->pc_type != PC_REQUEST) {
766 ERR("client->pc_type is not PC_REQUEST");
767 return PKGMGR_R_EINVAL;
770 if (access(pkg_path, F_OK) != 0) {
771 ERR("failed to access: %s", pkg_path);
772 return PKGMGR_R_EINVAL;
775 if (client->tep_path != NULL && access(client->tep_path, F_OK) != 0) {
776 ERR("failed to access: %s", client->tep_path);
777 return PKGMGR_R_EINVAL;
780 /* build arguments */
781 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
782 if (client->tep_path) {
783 g_variant_builder_add(builder, "s", "-e");
784 g_variant_builder_add(builder, "s", client->tep_path);
785 g_variant_builder_add(builder, "s", "-M");
786 /* TODO: revise tep_move */
787 g_variant_builder_add(builder, "s",
788 client->tep_move ? "tep_move" : "tep_copy");
791 args = g_variant_new("as", builder);
792 g_variant_builder_unref(builder);
794 ret = pkgmgr_client_connection_send_request(client, "mount_install",
795 g_variant_new("(uss@as)", uid, pkg_type ? pkg_type : "",
798 if (ret != PKGMGR_R_OK) {
799 ERR("request failed: %d", ret);
803 g_variant_get(result, "(i&s)", &ret, &req_key);
804 if (req_key == NULL) {
805 g_variant_unref(result);
806 return PKGMGR_R_ECOMM;
808 if (ret != PKGMGR_R_OK) {
809 g_variant_unref(result);
813 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
814 if (cb_info == NULL) {
815 g_variant_unref(result);
816 return PKGMGR_R_ENOMEM;
818 g_variant_unref(result);
819 ret = pkgmgr_client_connection_set_callback(client, cb_info);
820 if (ret != PKGMGR_R_OK) {
821 __free_cb_info(cb_info);
824 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
826 return cb_info->req_id;
829 API int pkgmgr_client_mount_install(pkgmgr_client *pc, const char *pkg_type,
830 const char *descriptor_path, const char *pkg_path,
831 const char *optional_data, pkgmgr_mode mode,
832 pkgmgr_handler event_cb, void *data)
834 return pkgmgr_client_usr_mount_install(pc, pkg_type, descriptor_path,
835 pkg_path, optional_data, mode, event_cb, data,
839 API int pkgmgr_client_usr_uninstall_packages(pkgmgr_client *pc,
840 const char **pkgids, int n_pkgs, pkgmgr_handler event_cb,
841 void *data, uid_t uid)
844 GVariantBuilder *pkgs_builder;
846 int ret = PKGMGR_R_ECOMM;
847 char *req_key = NULL;
848 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
849 struct cb_info *cb_info;
852 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
853 ERR("invalid parameter");
854 return PKGMGR_R_EINVAL;
857 if (client->pc_type != PC_REQUEST) {
858 ERR("client->pc_type is not PC_REQUEST");
859 return PKGMGR_R_EINVAL;
862 pkgs_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
863 for (i = 0; i < n_pkgs; i++)
864 g_variant_builder_add(pkgs_builder, "s", pkgids[i]);
865 pkgs = g_variant_new("as", pkgs_builder);
866 g_variant_builder_unref(pkgs_builder);
868 ret = pkgmgr_client_connection_send_request(client, "uninstall_pkgs",
869 g_variant_new("(u@as)", uid, pkgs), &result);
870 if (ret != PKGMGR_R_OK) {
871 ERR("request failed: %d", ret);
875 g_variant_get(result, "(i&s)", &ret, &req_key);
876 if (req_key == NULL) {
877 g_variant_unref(result);
878 return PKGMGR_R_ECOMM;
880 if (ret != PKGMGR_R_OK) {
881 g_variant_unref(result);
885 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
886 if (cb_info == NULL) {
887 g_variant_unref(result);
888 return PKGMGR_R_ENOMEM;
890 g_variant_unref(result);
891 ret = pkgmgr_client_connection_set_callback(client, cb_info);
892 if (ret != PKGMGR_R_OK) {
893 __free_cb_info(cb_info);
896 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
898 return cb_info->req_id;
901 API int pkgmgr_client_uninstall_packages(pkgmgr_client *pc,
902 const char **pkgids, int n_pkgs, pkgmgr_handler event_cb,
905 return pkgmgr_client_usr_uninstall_packages(pc, pkgids, n_pkgs,
906 event_cb, data, _getuid());
909 API int pkgmgr_client_uninstall(pkgmgr_client *pc, const char *pkg_type,
910 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
913 return pkgmgr_client_usr_uninstall(pc, pkg_type, pkgid, mode, event_cb,
917 API int pkgmgr_client_usr_uninstall(pkgmgr_client *pc, const char *pkg_type,
918 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
919 void *data, uid_t uid)
922 int ret = PKGMGR_R_ECOMM;
923 char *req_key = NULL;
924 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
925 struct cb_info *cb_info;
927 if (pc == NULL || pkgid == NULL) {
928 ERR("invalid parameter");
929 return PKGMGR_R_EINVAL;
932 if (client->pc_type != PC_REQUEST) {
933 ERR("client->pc_type is not PC_REQUEST");
934 return PKGMGR_R_EINVAL;
937 ret = pkgmgr_client_connection_send_request(client, "uninstall",
938 g_variant_new("(us)", uid, pkgid), &result);
939 if (ret != PKGMGR_R_OK) {
940 ERR("request failed: %d", ret);
944 g_variant_get(result, "(i&s)", &ret, &req_key);
945 if (req_key == NULL) {
946 g_variant_unref(result);
947 return PKGMGR_R_ECOMM;
949 if (ret != PKGMGR_R_OK) {
950 g_variant_unref(result);
954 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
955 if (cb_info == NULL) {
956 g_variant_unref(result);
957 return PKGMGR_R_ENOMEM;
959 g_variant_unref(result);
960 ret = pkgmgr_client_connection_set_callback(client, cb_info);
961 if (ret != PKGMGR_R_OK) {
962 __free_cb_info(cb_info);
965 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
967 return cb_info->req_id;
970 API int pkgmgr_client_move(pkgmgr_client *pc, const char *pkg_type,
971 const char *pkgid, pkgmgr_move_type move_type,
972 pkgmgr_handler event_cb, void *data)
974 return pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type,
975 event_cb, data, _getuid());
977 API int pkgmgr_client_usr_move(pkgmgr_client *pc, const char *pkg_type,
978 const char *pkgid, pkgmgr_move_type move_type,
979 pkgmgr_handler event_cb, void *data, uid_t uid)
982 int ret = PKGMGR_R_ECOMM;
983 char *req_key = NULL;
984 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
985 struct cb_info *cb_info;
987 if (pc == NULL || pkgid == NULL) {
988 ERR("invalid parameter");
989 return PKGMGR_R_EINVAL;
992 if ((move_type < PM_MOVE_TO_INTERNAL) ||
993 (move_type > PM_MOVE_TO_EXTENDED))
994 return PKGMGR_R_EINVAL;
996 if (client->pc_type != PC_REQUEST) {
997 ERR("client->pc_type is not PC_REQUEST");
998 return PKGMGR_R_EINVAL;
1001 ret = pkgmgr_client_connection_send_request(client, "move",
1002 g_variant_new("(usi)", uid, pkgid, move_type), &result);
1003 if (ret != PKGMGR_R_OK) {
1004 ERR("request failed: %d", ret);
1008 g_variant_get(result, "(i&s)", &ret, &req_key);
1009 if (req_key == NULL) {
1010 g_variant_unref(result);
1011 return PKGMGR_R_ECOMM;
1013 if (ret != PKGMGR_R_OK) {
1014 g_variant_unref(result);
1018 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1019 if (cb_info == NULL) {
1020 g_variant_unref(result);
1021 return PKGMGR_R_ERROR;
1023 g_variant_unref(result);
1024 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1025 if (ret != PKGMGR_R_OK) {
1026 __free_cb_info(cb_info);
1029 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1031 return cb_info->req_id;
1034 API int pkgmgr_client_usr_register_pkg_update_info(pkgmgr_client *pc,
1035 pkg_update_info_t *update_info, uid_t uid)
1038 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1041 if (pc == NULL || update_info == NULL || update_info->pkgid == NULL) {
1042 ERR("invalid parameter");
1043 return PKGMGR_R_EINVAL;
1046 if (client->pc_type != PC_REQUEST) {
1047 ERR("client->pc_type is not PC_REQUEST");
1048 return PKGMGR_R_EINVAL;
1051 ret = pkgmgr_client_connection_send_request(client, "register_pkg_update_info",
1052 g_variant_new("(ussi)", uid, update_info->pkgid, update_info->version,
1053 update_info->type), &result);
1054 if (ret != PKGMGR_R_OK) {
1055 ERR("request failed: %d", ret);
1059 g_variant_get(result, "(i)", &ret);
1060 if (ret != PKGMGR_R_OK) {
1061 g_variant_unref(result);
1064 g_variant_unref(result);
1069 API int pkgmgr_client_register_pkg_update_info(pkgmgr_client *pc,
1070 pkg_update_info_t *update_info)
1072 return pkgmgr_client_usr_register_pkg_update_info(pc, update_info,
1076 API int pkgmgr_client_usr_unregister_pkg_update_info(pkgmgr_client *pc,
1077 const char *pkgid, uid_t uid)
1080 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1083 if (pc == NULL || pkgid == NULL) {
1084 ERR("invalid parameter");
1085 return PKGMGR_R_EINVAL;
1088 if (client->pc_type != PC_REQUEST) {
1089 ERR("client->pc_type is not PC_REQUEST");
1090 return PKGMGR_R_EINVAL;
1093 ret = pkgmgr_client_connection_send_request(client,
1094 "unregister_pkg_update_info",
1095 g_variant_new("(us)", uid, pkgid), &result);
1096 if (ret != PKGMGR_R_OK) {
1097 ERR("request failed: %d", ret);
1101 g_variant_get(result, "(i)", &ret);
1102 if (ret != PKGMGR_R_OK) {
1103 g_variant_unref(result);
1106 g_variant_unref(result);
1111 API int pkgmgr_client_unregister_pkg_update_info(pkgmgr_client *pc,
1114 return pkgmgr_client_usr_unregister_pkg_update_info(pc, pkgid, _getuid());
1117 API int pkgmgr_client_usr_unregister_all_pkg_update_info(pkgmgr_client *pc,
1121 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1125 ERR("invalid parameter");
1126 return PKGMGR_R_EINVAL;
1129 if (client->pc_type != PC_REQUEST) {
1130 ERR("client->pc_type is not PC_REQUEST");
1131 return PKGMGR_R_EINVAL;
1134 ret = pkgmgr_client_connection_send_request(client,
1135 "unregister_all_pkg_update_info",
1136 g_variant_new("(u)", uid), &result);
1137 if (ret != PKGMGR_R_OK) {
1138 ERR("request failed: %d", ret);
1142 g_variant_get(result, "(i)", &ret);
1143 if (ret != PKGMGR_R_OK) {
1144 g_variant_unref(result);
1147 g_variant_unref(result);
1152 API int pkgmgr_client_unregister_all_pkg_update_info(pkgmgr_client *pc)
1154 return pkgmgr_client_usr_unregister_all_pkg_update_info(pc, _getuid());
1157 API int pkgmgr_client_usr_activate(pkgmgr_client *pc, const char *pkg_type,
1158 const char *pkgid, uid_t uid)
1161 int ret = PKGMGR_R_ECOMM;
1162 GVariantBuilder *builder;
1163 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1165 if (pc == NULL || pkgid == NULL) {
1166 ERR("invalid parameter");
1167 return PKGMGR_R_EINVAL;
1170 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1171 g_variant_builder_add(builder, "s", pkgid);
1173 ret = pkgmgr_client_connection_send_request(client, "enable_pkgs",
1174 g_variant_new("(uas)", uid, builder), &result);
1175 g_variant_builder_unref(builder);
1176 if (ret != PKGMGR_R_OK) {
1177 ERR("request failed: %d", ret);
1181 g_variant_get(result, "(is)", &ret, NULL);
1182 g_variant_unref(result);
1187 API int pkgmgr_client_activate(pkgmgr_client *pc, const char *pkg_type,
1190 return pkgmgr_client_usr_activate(pc, pkg_type, pkgid, _getuid());
1193 API int pkgmgr_client_usr_activate_packages(pkgmgr_client *pc,
1194 const char *pkg_type, const char **pkgids, int n_pkgs,
1195 pkgmgr_handler event_cb, void *data, uid_t uid)
1198 GVariantBuilder *builder;
1199 int ret = PKGMGR_R_ECOMM;
1200 char *req_key = NULL;
1201 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1202 struct cb_info *cb_info;
1205 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
1206 ERR("invalid parameter");
1207 return PKGMGR_R_EINVAL;
1210 if (client->pc_type != PC_REQUEST) {
1211 ERR("client type is not PC_REQUEST");
1212 return PKGMGR_R_EINVAL;
1215 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1216 for (i = 0; i < n_pkgs; i++)
1217 g_variant_builder_add(builder, "s", pkgids[i]);
1219 ret = pkgmgr_client_connection_send_request(client, "enable_pkgs",
1220 g_variant_new("(uas)", uid, builder), &result);
1221 g_variant_builder_unref(builder);
1222 if (ret != PKGMGR_R_OK) {
1223 ERR("request failed: %d", ret);
1227 g_variant_get(result, "(i&s)", &ret, &req_key);
1228 if (req_key == NULL) {
1229 g_variant_unref(result);
1230 return PKGMGR_R_ECOMM;
1232 if (ret != PKGMGR_R_OK) {
1233 g_variant_unref(result);
1237 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1238 if (cb_info == NULL) {
1239 g_variant_unref(result);
1240 return PKGMGR_R_ERROR;
1242 g_variant_unref(result);
1243 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1244 if (ret != PKGMGR_R_OK) {
1245 __free_cb_info(cb_info);
1248 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1250 return cb_info->req_id;
1253 API int pkgmgr_client_activate_packages(pkgmgr_client *pc,
1254 const char *pkg_type, const char **pkgids, int n_pkgs,
1255 pkgmgr_handler event_cb, void *data)
1257 return pkgmgr_client_usr_activate_packages(pc, pkg_type,
1258 pkgids, n_pkgs, event_cb, data, _getuid());
1261 API int pkgmgr_client_usr_deactivate(pkgmgr_client *pc, const char *pkg_type,
1262 const char *pkgid, uid_t uid)
1265 GVariantBuilder *builder;
1266 int ret = PKGMGR_R_ECOMM;
1267 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1269 if (pc == NULL || pkgid == NULL) {
1270 ERR("invalid parameter");
1271 return PKGMGR_R_EINVAL;
1274 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1275 g_variant_builder_add(builder, "s", pkgid);
1277 ret = pkgmgr_client_connection_send_request(client, "disable_pkgs",
1278 g_variant_new("(uas)", uid, builder), &result);
1279 g_variant_builder_unref(builder);
1280 if (ret != PKGMGR_R_OK) {
1281 ERR("request failed: %d", ret);
1285 g_variant_get(result, "(is)", &ret, NULL);
1286 g_variant_unref(result);
1291 API int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type,
1294 return pkgmgr_client_usr_deactivate(pc, pkg_type, pkgid, _getuid());
1297 API int pkgmgr_client_usr_deactivate_packages(pkgmgr_client *pc,
1298 const char *pkg_type, const char **pkgids, int n_pkgs,
1299 pkgmgr_handler event_cb, void *data, uid_t uid)
1302 GVariantBuilder *builder;
1303 int ret = PKGMGR_R_ECOMM;
1304 char *req_key = NULL;
1305 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1306 struct cb_info *cb_info;
1309 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
1310 ERR("invalid parameter");
1311 return PKGMGR_R_EINVAL;
1314 if (client->pc_type != PC_REQUEST) {
1315 ERR("client type is not PC_REQUEST");
1316 return PKGMGR_R_EINVAL;
1319 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1320 for (i = 0; i < n_pkgs; i++)
1321 g_variant_builder_add(builder, "s", pkgids[i]);
1323 ret = pkgmgr_client_connection_send_request(client, "disable_pkgs",
1324 g_variant_new("(uas)", uid, builder), &result);
1325 g_variant_builder_unref(builder);
1326 if (ret != PKGMGR_R_OK) {
1327 ERR("request failed: %d", ret);
1331 g_variant_get(result, "(i&s)", &ret, &req_key);
1332 if (req_key == NULL) {
1333 g_variant_unref(result);
1334 return PKGMGR_R_ECOMM;
1336 if (ret != PKGMGR_R_OK) {
1337 g_variant_unref(result);
1341 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1342 if (cb_info == NULL) {
1343 g_variant_unref(result);
1344 return PKGMGR_R_ERROR;
1346 g_variant_unref(result);
1347 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1348 if (ret != PKGMGR_R_OK) {
1349 __free_cb_info(cb_info);
1352 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1354 return cb_info->req_id;
1357 API int pkgmgr_client_deactivate_packages(pkgmgr_client *pc,
1358 const char *pkg_type, const char **pkgids, int n_pkgs,
1359 pkgmgr_handler event_cb, void *data)
1361 return pkgmgr_client_usr_deactivate_packages(pc, pkg_type,
1362 pkgids, n_pkgs, event_cb, data, _getuid());
1365 API int pkgmgr_client_usr_activate_app(pkgmgr_client *pc, const char *appid,
1366 pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1369 int ret = PKGMGR_R_ECOMM;
1370 char *req_key = NULL;
1371 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1372 struct cb_info *cb_info;
1374 if (pc == NULL || appid == NULL) {
1375 ERR("invalid parameter");
1376 return PKGMGR_R_EINVAL;
1379 ret = pkgmgr_client_connection_send_request(client, "enable_app",
1380 g_variant_new("(us)", uid, appid), &result);
1381 if (ret != PKGMGR_R_OK) {
1382 ERR("request failed: %d", ret);
1386 g_variant_get(result, "(i&s)", &ret, &req_key);
1387 if (req_key == NULL) {
1388 g_variant_unref(result);
1389 return PKGMGR_R_ECOMM;
1391 if (ret != PKGMGR_R_OK) {
1392 g_variant_unref(result);
1396 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1398 if (cb_info == NULL) {
1399 g_variant_unref(result);
1400 return PKGMGR_R_ENOMEM;
1402 g_variant_unref(result);
1403 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1404 if (ret != PKGMGR_R_OK) {
1405 __free_cb_info(cb_info);
1408 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1410 return cb_info->req_id;
1413 API int pkgmgr_client_activate_app(pkgmgr_client *pc, const char *appid,
1414 pkgmgr_app_handler app_event_cb, void *data)
1416 return pkgmgr_client_usr_activate_app(pc, appid, app_event_cb,
1420 API int pkgmgr_client_usr_activate_apps(pkgmgr_client *pc, const char **appids,
1421 int n_apps, pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1424 GVariantBuilder *builder;
1425 int ret = PKGMGR_R_ECOMM;
1426 char *req_key = NULL;
1427 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1428 struct cb_info *cb_info;
1431 if (pc == NULL || appids == NULL || n_apps < 1) {
1432 ERR("invalid parameter");
1433 return PKGMGR_R_EINVAL;
1436 if (client->pc_type != PC_REQUEST) {
1437 ERR("client type is not PC_REQUEST");
1438 return PKGMGR_R_EINVAL;
1441 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1442 for (i = 0; i < n_apps; i++)
1443 g_variant_builder_add(builder, "s", appids[i]);
1445 ret = pkgmgr_client_connection_send_request(client, "enable_apps",
1446 g_variant_new("(uas)", uid, builder), &result);
1447 g_variant_builder_unref(builder);
1448 if (ret != PKGMGR_R_OK) {
1449 ERR("request failed: %d", ret);
1453 g_variant_get(result, "(i&s)", &ret, &req_key);
1454 if (req_key == NULL) {
1455 g_variant_unref(result);
1456 return PKGMGR_R_ECOMM;
1458 if (ret != PKGMGR_R_OK) {
1459 g_variant_unref(result);
1463 cb_info = __create_app_event_cb_info(client, app_event_cb, data, req_key);
1464 if (cb_info == NULL) {
1465 g_variant_unref(result);
1466 return PKGMGR_R_ERROR;
1468 g_variant_unref(result);
1469 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1470 if (ret != PKGMGR_R_OK) {
1471 __free_cb_info(cb_info);
1474 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1476 return cb_info->req_id;
1479 API int pkgmgr_client_activate_apps(pkgmgr_client *pc, const char **appids,
1480 int n_apps, pkgmgr_app_handler app_event_cb, void *data)
1482 return pkgmgr_client_usr_activate_apps(pc, appids, n_apps,
1483 app_event_cb, data, _getuid());
1486 API int pkgmgr_client_activate_global_app_for_uid(pkgmgr_client *pc,
1487 const char *appid, pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1490 int ret = PKGMGR_R_ECOMM;
1491 char *req_key = NULL;
1492 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1493 struct cb_info *cb_info;
1495 if (pc == NULL || appid == NULL) {
1496 ERR("invalid parameter");
1497 return PKGMGR_R_EINVAL;
1500 ret = pkgmgr_client_connection_send_request(client,
1501 "enable_global_app_for_uid",
1502 g_variant_new("(us)", uid, appid), &result);
1503 if (ret != PKGMGR_R_OK) {
1504 ERR("request failed: %d", ret);
1508 g_variant_get(result, "(i&s)", &ret, &req_key);
1509 if (req_key == NULL) {
1510 g_variant_unref(result);
1511 return PKGMGR_R_ECOMM;
1513 if (ret != PKGMGR_R_OK) {
1514 g_variant_unref(result);
1518 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1520 if (cb_info == NULL) {
1521 g_variant_unref(result);
1522 return PKGMGR_R_ENOMEM;
1524 g_variant_unref(result);
1525 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1526 if (ret != PKGMGR_R_OK) {
1527 __free_cb_info(cb_info);
1530 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1532 return cb_info->req_id;
1535 API int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid,
1536 pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1539 int ret = PKGMGR_R_ECOMM;
1540 char *req_key = NULL;
1541 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1542 struct cb_info *cb_info;
1544 if (pc == NULL || appid == NULL) {
1545 ERR("invalid parameter");
1546 return PKGMGR_R_EINVAL;
1549 ret = pkgmgr_client_connection_send_request(client, "disable_app",
1550 g_variant_new("(us)", uid, appid), &result);
1551 if (ret != PKGMGR_R_OK) {
1552 ERR("request failed: %d", ret);
1556 g_variant_get(result, "(i&s)", &ret, &req_key);
1557 if (req_key == NULL) {
1558 g_variant_unref(result);
1559 return PKGMGR_R_ECOMM;
1561 if (ret != PKGMGR_R_OK) {
1562 g_variant_unref(result);
1566 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1568 if (cb_info == NULL) {
1569 g_variant_unref(result);
1570 return PKGMGR_R_ENOMEM;
1572 g_variant_unref(result);
1573 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1574 if (ret != PKGMGR_R_OK) {
1575 __free_cb_info(cb_info);
1578 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1580 return cb_info->req_id;
1583 API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid,
1584 pkgmgr_app_handler app_event_cb, void *data)
1586 return pkgmgr_client_usr_deactivate_app(pc, appid, app_event_cb, data,
1590 API int pkgmgr_client_usr_deactivate_apps(pkgmgr_client *pc,
1591 const char **appids, int n_apps,
1592 pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1595 GVariantBuilder *builder;
1596 int ret = PKGMGR_R_ECOMM;
1597 char *req_key = NULL;
1598 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1599 struct cb_info *cb_info;
1602 if (pc == NULL || appids == NULL || n_apps < 1) {
1603 ERR("invalid parameter");
1604 return PKGMGR_R_EINVAL;
1607 if (client->pc_type != PC_REQUEST) {
1608 ERR("client type is not PC_REQUEST");
1609 return PKGMGR_R_EINVAL;
1612 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1613 for (i = 0; i < n_apps; i++)
1614 g_variant_builder_add(builder, "s", appids[i]);
1616 ret = pkgmgr_client_connection_send_request(client, "disable_apps",
1617 g_variant_new("(uas)", uid, builder), &result);
1618 g_variant_builder_unref(builder);
1619 if (ret != PKGMGR_R_OK) {
1620 ERR("request failed: %d", ret);
1624 g_variant_get(result, "(i&s)", &ret, &req_key);
1625 if (req_key == NULL) {
1626 g_variant_unref(result);
1627 return PKGMGR_R_ECOMM;
1629 if (ret != PKGMGR_R_OK) {
1630 g_variant_unref(result);
1634 cb_info = __create_app_event_cb_info(client, app_event_cb, data, req_key);
1635 if (cb_info == NULL) {
1636 g_variant_unref(result);
1637 return PKGMGR_R_ERROR;
1639 g_variant_unref(result);
1640 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1641 if (ret != PKGMGR_R_OK) {
1642 __free_cb_info(cb_info);
1645 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1647 return cb_info->req_id;
1650 API int pkgmgr_client_deactivate_apps(pkgmgr_client *pc, const char **appids,
1651 int n_apps, pkgmgr_app_handler app_event_cb, void *data)
1653 return pkgmgr_client_usr_deactivate_apps(pc, appids, n_apps,
1654 app_event_cb, data, _getuid());
1657 API int pkgmgr_client_deactivate_global_app_for_uid(pkgmgr_client *pc,
1658 const char *appid, pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1661 int ret = PKGMGR_R_ECOMM;
1662 char *req_key = NULL;
1663 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1664 struct cb_info *cb_info;
1666 if (pc == NULL || appid == NULL) {
1667 ERR("invalid parameter");
1668 return PKGMGR_R_EINVAL;
1671 ret = pkgmgr_client_connection_send_request(client,
1672 "disable_global_app_for_uid",
1673 g_variant_new("(us)", uid, appid), &result);
1674 if (ret != PKGMGR_R_OK) {
1675 ERR("request failed: %d", ret);
1679 g_variant_get(result, "(i&s)", &ret, &req_key);
1680 if (req_key == NULL) {
1681 g_variant_unref(result);
1682 return PKGMGR_R_ECOMM;
1684 if (ret != PKGMGR_R_OK) {
1685 g_variant_unref(result);
1689 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1691 if (cb_info == NULL) {
1692 g_variant_unref(result);
1693 return PKGMGR_R_ENOMEM;
1695 g_variant_unref(result);
1696 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1697 if (ret != PKGMGR_R_OK) {
1698 __free_cb_info(cb_info);
1701 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1703 return cb_info->req_id;
1706 API int pkgmgr_client_usr_clear_user_data(pkgmgr_client *pc,
1707 const char *pkg_type, const char *appid, pkgmgr_mode mode,
1712 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1714 if (pc == NULL || appid == NULL || uid == GLOBAL_USER) {
1715 ERR("invalid parameter");
1716 return PKGMGR_R_EINVAL;
1719 if (client->pc_type != PC_REQUEST) {
1720 ERR("client->pc_type is not PC_REQUEST");
1721 return PKGMGR_R_EINVAL;
1724 ret = pkgmgr_client_connection_send_request(client, "cleardata",
1725 g_variant_new("(us)", uid, appid), &result);
1726 if (ret != PKGMGR_R_OK) {
1727 ERR("request failed: %d", ret);
1731 g_variant_get(result, "(i)", &ret);
1732 g_variant_unref(result);
1737 API int pkgmgr_client_clear_user_data(pkgmgr_client *pc, const char *pkg_type,
1738 const char *appid, pkgmgr_mode mode)
1740 return pkgmgr_client_usr_clear_user_data(pc, pkg_type, appid, mode,
1744 API int pkgmgr_client_set_status_type(pkgmgr_client *pc, int status_type)
1746 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1749 ERR("invalid parameter");
1750 return PKGMGR_R_EINVAL;
1753 client->status_type = status_type;
1758 API int pkgmgr_client_listen_status(pkgmgr_client *pc, pkgmgr_handler event_cb,
1762 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1763 struct cb_info *cb_info;
1765 if (pc == NULL || event_cb == NULL) {
1766 ERR("invalid parameter");
1767 return PKGMGR_R_EINVAL;
1770 if (client->pc_type != PC_LISTENING) {
1771 ERR("client->pc_type is not PC_LISTENING");
1772 return PKGMGR_R_EINVAL;
1775 cb_info = __create_event_cb_info(client, event_cb, data, NULL);
1776 if (cb_info == NULL)
1777 return PKGMGR_R_ENOMEM;
1778 cb_info->status_type = client->status_type;
1779 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1780 if (ret != PKGMGR_R_OK) {
1781 __free_cb_info(cb_info);
1784 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1786 return cb_info->req_id;
1789 API int pkgmgr_client_listen_app_status(pkgmgr_client *pc,
1790 pkgmgr_app_handler app_event_cb, void *data)
1793 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1794 struct cb_info *cb_info;
1796 if (pc == NULL || app_event_cb == NULL) {
1797 ERR("invalid parameter");
1798 return PKGMGR_R_EINVAL;
1801 if (client->pc_type != PC_LISTENING) {
1802 ERR("client->pc_type is not PC_LISTENING");
1803 return PKGMGR_R_EINVAL;
1806 cb_info = __create_app_event_cb_info(client, app_event_cb, data, NULL);
1807 if (cb_info == NULL)
1808 return PKGMGR_R_ENOMEM;
1809 cb_info->status_type = client->status_type;
1810 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1811 if (ret != PKGMGR_R_OK) {
1812 __free_cb_info(cb_info);
1815 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1817 return cb_info->req_id;
1820 API int pkgmgr_client_remove_listen_status(pkgmgr_client *pc)
1822 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1825 struct cb_info *cb_info;
1828 ERR("invalid parameter");
1829 return PKGMGR_R_EINVAL;
1832 /* unset all callback */
1833 tmp = client->cb_info_list;
1834 while (tmp != NULL) {
1836 cb_info = (struct cb_info *)tmp->data;
1837 pkgmgr_client_connection_unset_callback(pc, cb_info);
1838 client->cb_info_list = g_list_delete_link(client->cb_info_list,
1840 __free_cb_info(cb_info);
1847 API int pkgmgr_client_broadcast_status(pkgmgr_client *pc, const char *pkg_type,
1848 const char *pkgid, const char *key, const char *val)
1850 /* client cannot broadcast signal */
1854 /* TODO: deprecate(or remove) */
1855 API int pkgmgr_client_request_service(pkgmgr_request_service_type service_type,
1856 int service_mode, pkgmgr_client *pc, const char *pkg_type,
1857 const char *pkgid, const char *custom_info,
1858 pkgmgr_handler event_cb, void *data)
1860 return pkgmgr_client_usr_request_service(service_type, service_mode,
1861 pc, pkg_type, pkgid, _getuid(), custom_info, event_cb,
1865 API int pkgmgr_client_usr_request_service(
1866 pkgmgr_request_service_type service_type, int service_mode,
1867 pkgmgr_client *pc, const char *pkg_type, const char *pkgid,
1868 uid_t uid, const char *custom_info, pkgmgr_handler event_cb,
1873 /* Check for NULL value of service type */
1874 retvm_if(service_type > PM_REQUEST_MAX, PKGMGR_R_EINVAL, "service type is not defined\n");
1875 retvm_if(service_type < 0, PKGMGR_R_EINVAL, "service type is error\n");
1877 switch (service_type) {
1878 case PM_REQUEST_MOVE:
1879 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1880 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1881 tryvm_if((service_mode < PM_MOVE_TO_INTERNAL) || (service_mode > PM_MOVE_TO_EXTENDED), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1883 ret = __move_pkg_process(pc, pkgid, pkg_type, uid, (pkgmgr_move_type)service_mode, event_cb, data);
1886 case PM_REQUEST_GET_SIZE:
1887 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1888 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1889 tryvm_if((service_mode < PM_GET_TOTAL_SIZE) || (service_mode >= PM_GET_MAX), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1891 ret = __get_size_process(pc, pkgid, uid, (pkgmgr_getsize_type)service_mode, event_cb, data);
1894 case PM_REQUEST_KILL_APP:
1895 case PM_REQUEST_CHECK_APP:
1896 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1897 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1899 ret = __check_app_process(service_type, pc, pkgid, uid, data);
1901 ERR("__check_app_process fail \n");
1908 ERR("Wrong Request\n");
1918 API int pkgmgr_client_usr_clear_cache_dir(const char *pkgid, uid_t uid)
1922 struct pkgmgr_client_t *client;
1924 if (pkgid == NULL || uid == GLOBAL_USER) {
1925 ERR("invalid parameter");
1926 return PKGMGR_R_EINVAL;
1929 client = pkgmgr_client_new(PC_REQUEST);
1930 if (client == NULL) {
1931 ERR("out of memory");
1932 return PKGMGR_R_ENOMEM;
1935 ret = pkgmgr_client_connection_send_request(client, "clearcache",
1936 g_variant_new("(us)", uid, pkgid), &result);
1937 if (ret != PKGMGR_R_OK) {
1938 ERR("request failed: %d", ret);
1939 pkgmgr_client_free(client);
1943 g_variant_get(result, "(i)", &ret);
1944 g_variant_unref(result);
1945 pkgmgr_client_free(client);
1950 API int pkgmgr_client_clear_cache_dir(const char *pkgid)
1952 return pkgmgr_client_usr_clear_cache_dir(pkgid, _getuid());
1955 API int pkgmgr_client_clear_usr_all_cache_dir(uid_t uid)
1957 return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, uid);
1960 API int pkgmgr_client_clear_all_cache_dir(void)
1962 return pkgmgr_client_usr_clear_cache_dir(
1963 PKG_CLEAR_ALL_CACHE, _getuid());
1966 API int pkgmgr_client_get_size(pkgmgr_client *pc, const char *pkgid,
1967 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
1970 return pkgmgr_client_usr_get_size(pc, pkgid, get_type, event_cb, data,
1974 /* TODO: deprecate(or remove) */
1975 API int pkgmgr_client_usr_get_size(pkgmgr_client *pc, const char *pkgid,
1976 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
1977 void *data, uid_t uid)
1980 int ret = PKGMGR_R_ECOMM;
1981 char *req_key = NULL;
1982 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1983 struct cb_info *cb_info;
1985 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
1986 ERR("invalid parameter");
1987 return PKGMGR_R_EINVAL;
1990 if (client->pc_type != PC_REQUEST) {
1991 ERR("client->pc_type is not PC_REQUEST");
1992 return PKGMGR_R_EINVAL;
1996 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
1997 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
1999 get_type = PM_GET_PKG_SIZE_INFO;
2001 ret = pkgmgr_client_connection_send_request(client, "getsize",
2002 g_variant_new("(usi)", uid, pkgid, get_type), &result);
2003 if (ret != PKGMGR_R_OK) {
2004 ERR("request failed: %d", ret);
2008 g_variant_get(result, "(i&s)", &ret, &req_key);
2009 if (req_key == NULL) {
2010 g_variant_unref(result);
2011 return PKGMGR_R_ECOMM;
2013 if (ret != PKGMGR_R_OK) {
2014 g_variant_unref(result);
2018 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
2019 if (cb_info == NULL) {
2020 g_variant_unref(result);
2021 return PKGMGR_R_ENOMEM;
2023 g_variant_unref(result);
2024 ret = pkgmgr_client_connection_set_callback(client, cb_info);
2025 if (ret != PKGMGR_R_OK) {
2026 __free_cb_info(cb_info);
2029 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
2034 API int pkgmgr_client_usr_get_package_size_info(pkgmgr_client *pc,
2035 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
2036 void *user_data, uid_t uid)
2039 int ret = PKGMGR_R_ECOMM;
2040 char *req_key = NULL;
2042 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2043 struct cb_info *cb_info;
2045 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
2046 ERR("invalid parameter");
2047 return PKGMGR_R_EINVAL;
2050 if (client->pc_type != PC_REQUEST) {
2051 ERR("client->pc_type is not PC_REQUEST");
2052 return PKGMGR_R_EINVAL;
2055 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
2056 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
2058 get_type = PM_GET_PKG_SIZE_INFO;
2060 ret = pkgmgr_client_connection_send_request(client, "getsize",
2061 g_variant_new("(usi)", uid, pkgid, get_type), &result);
2062 if (ret != PKGMGR_R_OK) {
2063 ERR("request failed: %d", ret);
2067 g_variant_get(result, "(i&s)", &ret, &req_key);
2068 if (req_key == NULL) {
2069 g_variant_unref(result);
2070 return PKGMGR_R_ECOMM;
2072 if (ret != PKGMGR_R_OK) {
2073 g_variant_unref(result);
2077 cb_info = __create_size_info_cb_info(client, event_cb, user_data,
2079 if (cb_info == NULL) {
2080 g_variant_unref(result);
2081 return PKGMGR_R_ENOMEM;
2083 g_variant_unref(result);
2084 ret = pkgmgr_client_connection_set_callback(client, cb_info);
2085 if (ret != PKGMGR_R_OK) {
2086 __free_cb_info(cb_info);
2089 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
2094 API int pkgmgr_client_get_package_size_info(pkgmgr_client *pc,
2095 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
2098 return pkgmgr_client_usr_get_package_size_info(pc, pkgid, event_cb,
2099 user_data, _getuid());
2102 API int pkgmgr_client_usr_get_total_package_size_info(pkgmgr_client *pc,
2103 pkgmgr_total_pkg_size_info_receive_cb event_cb,
2104 void *user_data, uid_t uid)
2105 { /* total package size info */
2106 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL,
2107 (pkgmgr_pkg_size_info_receive_cb)event_cb,
2111 API int pkgmgr_client_get_total_package_size_info(pkgmgr_client *pc,
2112 pkgmgr_total_pkg_size_info_receive_cb event_cb, void *user_data)
2114 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL,
2115 (pkgmgr_pkg_size_info_receive_cb)event_cb,
2116 user_data, _getuid());
2119 API int pkgmgr_client_generate_license_request(pkgmgr_client *pc,
2120 const char *resp_data, char **req_data, char **license_url)
2126 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2128 if (pc == NULL || resp_data == NULL || req_data == NULL ||
2129 license_url == NULL) {
2130 ERR("invalid parameter");
2131 return PKGMGR_R_EINVAL;
2134 if (client->pc_type != PC_REQUEST) {
2135 ERR("client->pc_type is not PC_REQUEST");
2136 return PKGMGR_R_EINVAL;
2139 ret = pkgmgr_client_connection_send_request(client,
2140 "generate_license_request",
2141 g_variant_new("(s)", resp_data), &result);
2142 if (ret != PKGMGR_R_OK) {
2143 ERR("request failed: %d", ret);
2147 g_variant_get(result, "(i&s&s)", &ret, &data, &url);
2148 if (ret != PKGMGR_R_OK) {
2149 ERR("generate_license_request failed: %d", ret);
2150 g_variant_unref(result);
2154 *req_data = strdup(data);
2155 *license_url = strdup(url);
2157 g_variant_unref(result);
2162 API int pkgmgr_client_register_license(pkgmgr_client *pc, const char *resp_data)
2166 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2168 if (pc == NULL || resp_data == NULL) {
2169 ERR("invalid parameter");
2170 return PKGMGR_R_EINVAL;
2173 if (client->pc_type != PC_REQUEST) {
2174 ERR("client->pc_type is not PC_REQUEST");
2175 return PKGMGR_R_EINVAL;
2178 ret = pkgmgr_client_connection_send_request(client, "register_license",
2179 g_variant_new("(s)", resp_data), &result);
2180 if (ret != PKGMGR_R_OK) {
2181 ERR("request failed: %d", ret);
2185 g_variant_get(result, "(i)", &ret);
2186 g_variant_unref(result);
2187 if (ret != PKGMGR_R_OK)
2188 ERR("register license failed: %d", ret);
2193 API int pkgmgr_client_decrypt_package(pkgmgr_client *pc,
2194 const char *drm_file_path, const char *decrypted_file_path)
2198 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2200 if (pc == NULL || drm_file_path == NULL ||
2201 decrypted_file_path == NULL) {
2202 ERR("invalid parameter");
2203 return PKGMGR_R_EINVAL;
2206 if (client->pc_type != PC_REQUEST) {
2207 ERR("client->pc_type is not PC_REQUEST");
2208 return PKGMGR_R_EINVAL;
2211 ret = pkgmgr_client_connection_send_request(client, "decrypt_package",
2212 g_variant_new("(ss)", drm_file_path,
2213 decrypted_file_path), &result);
2214 if (ret != PKGMGR_R_OK) {
2215 ERR("request failed: %d", ret);
2219 g_variant_get(result, "(i)", &ret);
2220 g_variant_unref(result);
2221 if (ret != PKGMGR_R_OK)
2222 ERR("decrypt_package failed: %d", ret);
2227 API int pkgmgr_client_enable_splash_screen(pkgmgr_client *pc, const char *appid)
2229 return pkgmgr_client_usr_enable_splash_screen(pc, appid, _getuid());
2232 API int pkgmgr_client_usr_enable_splash_screen(pkgmgr_client *pc,
2233 const char *appid, uid_t uid)
2237 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2239 if (pc == NULL || appid == NULL) {
2240 ERR("Invalid parameter");
2241 return PKGMGR_R_EINVAL;
2244 ret = pkgmgr_client_connection_send_request(client,
2245 "enable_app_splash_screen",
2246 g_variant_new("(us)", uid, appid), &result);
2247 if (ret != PKGMGR_R_OK) {
2248 ERR("request failed: %d", ret);
2252 g_variant_get(result, "(i)", &ret);
2253 g_variant_unref(result);
2254 if (ret != PKGMGR_R_OK)
2255 ERR("enable splash screen failed: %d", ret);
2260 API int pkgmgr_client_disable_splash_screen(pkgmgr_client *pc,
2263 return pkgmgr_client_usr_disable_splash_screen(pc, appid,
2267 API int pkgmgr_client_usr_disable_splash_screen(pkgmgr_client *pc,
2268 const char *appid, uid_t uid)
2272 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2274 if (pc == NULL || appid == NULL) {
2275 ERR("Invalid parameter");
2276 return PKGMGR_R_EINVAL;
2279 ret = pkgmgr_client_connection_send_request(client,
2280 "disable_app_splash_screen",
2281 g_variant_new("(us)", uid, appid), &result);
2282 if (ret != PKGMGR_R_OK) {
2283 ERR("request failed: %d", ret);
2287 g_variant_get(result, "(i)", &ret);
2288 g_variant_unref(result);
2289 if (ret != PKGMGR_R_OK)
2290 ERR("disable splash screen failed: %d", ret);
2295 static int __set_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
2296 int mode, uid_t uid)
2299 int ret = PKGMGR_R_ECOMM;
2300 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2302 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
2303 ERR("invalid parameter");
2304 return PKGMGR_R_EINVAL;
2307 ret = pkgmgr_client_connection_send_request(client,
2308 "set_restriction_mode",
2309 g_variant_new("(usi)", uid, pkgid, mode), &result);
2310 if (ret != PKGMGR_R_OK) {
2311 ERR("request failed: %d", ret);
2315 g_variant_get(result, "(i)", &ret);
2316 g_variant_unref(result);
2321 API int pkgmgr_client_usr_set_pkg_restriction_mode(pkgmgr_client *pc,
2322 const char *pkgid, int mode, uid_t uid)
2324 return __set_pkg_restriction_mode(pc, pkgid, mode, uid);
2327 API int pkgmgr_client_set_pkg_restriction_mode(pkgmgr_client *pc,
2328 const char *pkgid, int mode)
2330 return pkgmgr_client_usr_set_pkg_restriction_mode(pc, pkgid, mode,
2334 static int __unset_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
2335 int mode, uid_t uid)
2338 int ret = PKGMGR_R_ECOMM;
2339 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2341 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
2342 ERR("invalid parameter");
2343 return PKGMGR_R_EINVAL;
2346 ret = pkgmgr_client_connection_send_request(client,
2347 "unset_restriction_mode",
2348 g_variant_new("(usi)", uid, pkgid, mode), &result);
2349 if (ret != PKGMGR_R_OK) {
2350 ERR("request failed: %d", ret);
2354 g_variant_get(result, "(i)", &ret);
2355 g_variant_unref(result);
2361 API int pkgmgr_client_usr_unset_pkg_restriction_mode(pkgmgr_client *pc,
2362 const char *pkgid, int mode, uid_t uid)
2364 return __unset_pkg_restriction_mode(pc, pkgid, mode, uid);
2367 API int pkgmgr_client_unset_pkg_restriction_mode(pkgmgr_client *pc,
2368 const char *pkgid, int mode)
2370 return pkgmgr_client_usr_unset_pkg_restriction_mode(pc, pkgid, mode,
2374 static int __get_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
2375 int *mode, uid_t uid)
2378 int ret = PKGMGR_R_ECOMM;
2380 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2382 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0) {
2383 ERR("invalid parameter");
2384 return PKGMGR_R_EINVAL;
2387 ret = pkgmgr_client_connection_send_request(client,
2388 "get_restriction_mode",
2389 g_variant_new("(us)", uid, pkgid), &result);
2390 if (ret != PKGMGR_R_OK) {
2391 ERR("request failed: %d", ret);
2395 g_variant_get(result, "(ii)", &m, &ret);
2396 g_variant_unref(result);
2397 if (ret != PKGMGR_R_OK)
2405 API int pkgmgr_client_usr_get_pkg_restriction_mode(pkgmgr_client *pc,
2406 const char *pkgid, int *mode, uid_t uid)
2408 return __get_pkg_restriction_mode(pc, pkgid, mode, uid);
2411 API int pkgmgr_client_get_pkg_restriction_mode(pkgmgr_client *pc,
2412 const char *pkgid, int *mode)
2414 return pkgmgr_client_usr_get_pkg_restriction_mode(pc, pkgid, mode,
2418 API int pkgmgr_client_usr_set_restriction_mode(pkgmgr_client *pc, int mode,
2422 int ret = PKGMGR_R_ECOMM;
2423 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2426 ERR("invalid parameter");
2427 return PKGMGR_R_EINVAL;
2430 ret = pkgmgr_client_connection_send_request(client,
2431 "set_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_set_restriction_mode(pkgmgr_client *pc, int mode)
2446 return pkgmgr_client_usr_set_restriction_mode(pc, mode, _getuid());
2449 API int pkgmgr_client_usr_unset_restriction_mode(pkgmgr_client *pc, int mode,
2453 int ret = PKGMGR_R_ECOMM;
2454 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2457 ERR("invalid parameter");
2458 return PKGMGR_R_EINVAL;
2461 ret = pkgmgr_client_connection_send_request(client,
2462 "unset_restriction_mode",
2463 g_variant_new("(usi)", uid, "", mode), &result);
2464 if (ret != PKGMGR_R_OK) {
2465 ERR("request failed: %d", ret);
2469 g_variant_get(result, "(i)", &ret);
2470 g_variant_unref(result);
2475 API int pkgmgr_client_unset_restriction_mode(pkgmgr_client *pc, int mode)
2477 return pkgmgr_client_usr_unset_restriction_mode(pc, mode, _getuid());
2480 API int pkgmgr_client_usr_get_restriction_mode(pkgmgr_client *pc,
2481 int *mode, uid_t uid)
2484 int ret = PKGMGR_R_ECOMM;
2486 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2489 ERR("invalid parameter");
2490 return PKGMGR_R_EINVAL;
2493 ret = pkgmgr_client_connection_send_request(client,
2494 "get_restriction_mode",
2495 g_variant_new("(us)", uid, ""), &result);
2496 if (ret != PKGMGR_R_OK) {
2497 ERR("request failed: %d", ret);
2501 g_variant_get(result, "(ii)", &m, &ret);
2502 g_variant_unref(result);
2503 if (ret != PKGMGR_R_OK)
2511 API int pkgmgr_client_get_restriction_mode(pkgmgr_client *pc, int *mode)
2513 return pkgmgr_client_usr_get_restriction_mode(pc, mode, _getuid());
2516 API pkgmgr_info *pkgmgr_client_check_pkginfo_from_file(const char *pkg_path)
2519 pkg_plugin_set *plugin_set;
2520 package_manager_pkg_detail_info_t *info;
2523 if (pkg_path == NULL) {
2524 ERR("invalid parameter");
2528 pkg_type = __get_type_from_path(pkg_path);
2529 if (pkg_type == NULL) {
2530 ERR("cannot get pkg type");
2534 plugin_set = _package_manager_load_library(pkg_type);
2535 if (plugin_set == NULL) {
2536 ERR("failed to load library for %s", pkg_type);
2541 info = calloc(1, sizeof(package_manager_pkg_detail_info_t));
2543 ERR("out of memory");
2548 ret = plugin_set->get_pkg_detail_info_from_package(pkg_path, info);
2550 ERR("get_pkg_detail_info_from_package failed");
2558 return (pkgmgr_info *)info;
2561 API int pkgmgr_client_free_pkginfo(pkgmgr_info *info)
2563 package_manager_pkg_detail_info_t *pkg_info =
2564 (package_manager_pkg_detail_info_t *)info;
2567 ERR("invalid parameter");
2568 return PKGMGR_R_EINVAL;
2571 g_list_free_full(pkg_info->privilege_list, free);
2572 free(pkg_info->icon_buf);
2578 API int pkgmgr_client_usr_set_app_label(pkgmgr_client *pc, char *appid,
2579 char *label, uid_t uid)
2583 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2585 if (pc == NULL || appid == NULL || label == NULL) {
2586 ERR("Invalid parameter");
2587 return PKGMGR_R_EINVAL;
2590 ret = pkgmgr_client_connection_send_request(client,
2592 g_variant_new("(uss)", uid, appid, label), &result);
2593 if (ret != PKGMGR_R_OK) {
2594 ERR("Request failed: %d", ret);
2598 g_variant_get(result, "(i)", &ret);
2599 g_variant_unref(result);
2604 API int pkgmgr_client_set_app_label(pkgmgr_client *pc, char *appid, char *label)
2606 return pkgmgr_client_usr_set_app_label(pc, appid, label, _getuid());
2609 API int pkgmgr_client_usr_set_app_icon(pkgmgr_client *pc, char *appid,
2610 char *icon_path, uid_t uid)
2614 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2616 if (pc == NULL || appid == NULL || icon_path == NULL) {
2617 ERR("Invalid parameter");
2618 return PKGMGR_R_EINVAL;
2621 if (access(icon_path, F_OK) != 0) {
2622 ERR("failed to access: %s", icon_path);
2623 return PKGMGR_R_EINVAL;
2626 ret = pkgmgr_client_connection_send_request(client,
2628 g_variant_new("(uss)", uid, appid, icon_path), &result);
2629 if (ret != PKGMGR_R_OK) {
2630 ERR("Request failed: %d", ret);
2634 g_variant_get(result, "(i)", &ret);
2635 g_variant_unref(result);
2640 API int pkgmgr_client_set_app_icon(pkgmgr_client *pc, char *appid, char *icon_path)
2642 return pkgmgr_client_usr_set_app_icon(pc, appid, icon_path, _getuid());
2645 API int pkgmgr_client_set_debug_mode(pkgmgr_client *pc, bool debug_mode)
2647 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2650 ERR("invalid parameter");
2651 return PKGMGR_R_EINVAL;
2654 client->debug_mode = debug_mode;
2659 API int pkgmgr_client_set_skip_optimization(pkgmgr_client *pc, bool skip_optimization)
2661 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2664 ERR("invalid parameter");
2665 return PKGMGR_R_EINVAL;
2668 client->skip_optimization = skip_optimization;
2673 API int pkgmgr_client_usr_migrate_external_image(pkgmgr_client *pc,
2674 const char *pkgid, uid_t uid)
2677 int ret = PKGMGR_R_ECOMM;
2678 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2681 ERR("invalid parameter");
2682 return PKGMGR_R_EINVAL;
2685 ret = pkgmgr_client_connection_send_request(client,
2686 "migrate_external_image",
2687 g_variant_new("(us)", uid, pkgid), &result);
2688 if (ret != PKGMGR_R_OK) {
2689 ERR("request failed: %d", ret);
2693 g_variant_get(result, "(i)", &ret);
2694 g_variant_unref(result);