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 "package-manager-types.h"
44 #include "pkgmgr_client_debug.h"
45 #include "pkgmgr_client_internal.h"
47 /* API export macro */
49 #define API __attribute__ ((visibility("default")))
52 #define BINSH_NAME "/bin/sh"
55 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
56 #define REGULAR_USER 5000
58 static GList *jobs_to_free;
59 static pthread_mutex_t __mutex = PTHREAD_MUTEX_INITIALIZER;
61 static inline uid_t _getuid(void)
65 if (uid < REGULAR_USER)
71 static int _get_internal_request_id()
73 static int internal_req_id = 1;
75 return internal_req_id++;
78 static char *_generate_request_id(void)
84 gettimeofday(&tv, NULL);
85 curtime = tv.tv_sec * 1000000 + tv.tv_usec;
87 snprintf(buf, sizeof(buf), "%d_%ld", getpid(), curtime);
92 static struct cb_info *__create_event_cb_info(struct pkgmgr_client_t *client,
93 pkgmgr_handler event_cb, void *data, const char *req_key)
95 struct cb_info *cb_info;
97 cb_info = calloc(1, sizeof(struct cb_info));
98 if (cb_info == NULL) {
102 cb_info->client = client;
103 cb_info->event_cb = event_cb;
104 cb_info->data = data;
105 cb_info->req_id = _get_internal_request_id();
106 if (req_key != NULL) {
107 cb_info->req_key = strdup(req_key);
108 if (cb_info->req_key == NULL) {
109 ERR("out of memory");
118 static struct cb_info *__create_app_event_cb_info(
119 struct pkgmgr_client_t *client, pkgmgr_app_handler app_event_cb,
120 void *data, const char *req_key)
122 struct cb_info *cb_info;
124 cb_info = calloc(1, sizeof(struct cb_info));
125 if (cb_info == NULL) {
126 ERR("out of memory");
129 cb_info->client = client;
130 cb_info->app_event_cb = app_event_cb;
131 cb_info->data = data;
132 cb_info->req_id = _get_internal_request_id();
133 if (req_key != NULL) {
134 cb_info->req_key = strdup(req_key);
135 if (cb_info->req_key == NULL) {
136 ERR("out of memory");
145 static struct cb_info *__create_res_event_cb_info(
146 struct pkgmgr_client_t *client,
147 pkgmgr_res_handler res_event_cb,
148 void *data, const char *req_key)
150 struct cb_info *cb_info;
152 cb_info = calloc(1, sizeof(struct cb_info));
153 if (cb_info == NULL) {
154 ERR("out of memory");
158 cb_info->client = client;
159 cb_info->res_event_cb = res_event_cb;
160 cb_info->data = data;
161 cb_info->req_id = _get_internal_request_id();
165 cb_info->req_key = strdup(req_key);
166 if (cb_info->req_key == NULL) {
167 ERR("out of memory");
175 static struct cb_info *__create_size_info_cb_info(
176 struct pkgmgr_client_t *client,
177 pkgmgr_pkg_size_info_receive_cb size_info_cb,
178 void *data, const char *req_key)
180 struct cb_info *cb_info;
182 cb_info = calloc(1, sizeof(struct cb_info));
183 if (cb_info == NULL) {
184 ERR("out of memory");
187 cb_info->client = client;
188 cb_info->size_info_cb = size_info_cb;
189 cb_info->data = data;
190 cb_info->req_id = _get_internal_request_id();
191 if (req_key != NULL) {
192 cb_info->req_key = strdup(req_key);
193 if (cb_info->req_key == NULL) {
194 ERR("out of memory");
203 static int __jobs_to_free_add(gpointer data)
205 pthread_mutex_lock(&__mutex);
206 if (g_list_find(jobs_to_free, data)) {
207 pthread_mutex_unlock(&__mutex);
211 jobs_to_free = g_list_append(jobs_to_free, data);
212 pthread_mutex_unlock(&__mutex);
216 static void __jobs_to_free_remove(gpointer data)
218 pthread_mutex_lock(&__mutex);
219 jobs_to_free = g_list_remove(jobs_to_free, data);
220 pthread_mutex_unlock(&__mutex);
223 static void __do_free_cb_info(gpointer data)
225 struct cb_info *cb_info = (struct cb_info *)data;
227 g_list_free(cb_info->sid_list);
228 free(cb_info->req_key);
232 static void __free_cb_info_cb(gpointer data)
234 g_idle_remove_by_data(data);
235 __do_free_cb_info(data);
238 __attribute__((destructor)) static void __free_cb_info_at_destructor(void)
240 pthread_mutex_lock(&__mutex);
241 g_list_free_full(jobs_to_free, __free_cb_info_cb);
242 pthread_mutex_unlock(&__mutex);
245 static gboolean __free_cb_info_at_idle(gpointer data)
247 __jobs_to_free_remove(data);
248 __do_free_cb_info(data);
250 return G_SOURCE_REMOVE;
253 static void __free_cb_info(struct cb_info *cb_info)
255 if (__jobs_to_free_add(cb_info) < 0)
258 g_idle_add(__free_cb_info_at_idle, cb_info);
261 static int __get_size_process(pkgmgr_client *pc, const char *pkgid, uid_t uid,
262 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
266 int ret = PKGMGR_R_ECOMM;
267 long long size_info = 0;
268 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
270 if (pc == NULL || pkgid == NULL) {
271 ERR("invalid parameter");
272 return PKGMGR_R_EINVAL;
275 if (client->pc_type != PC_REQUEST) {
276 ERR("client->pc_type is not PC_REQUEST");
277 return PKGMGR_R_EINVAL;
280 ret = pkgmgr_client_connection_send_request(client, "getsize_sync",
281 g_variant_new("(usi)", uid, pkgid, get_type), &result);
282 if (ret != PKGMGR_R_OK) {
283 ERR("request failed: %d", ret);
287 g_variant_get(result, "(ix)", &ret, &size_info);
288 if (ret != PKGMGR_R_OK) {
289 ERR("request result failed: %d", ret);
290 g_variant_unref(result);
295 ERR("invalid size_info=(%lld)", size_info);
298 ret = (int)size_info;
299 DBG("size_info(%lld), return size(%d)", size_info, ret);
302 g_variant_unref(result);
307 static int __move_pkg_process(pkgmgr_client *pc, const char *pkgid,
308 const char *pkg_type, uid_t uid, pkgmgr_move_type move_type,
309 pkgmgr_handler event_cb, void *data)
313 ret = pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type, event_cb, data, uid);
315 ERR("move request failed");
322 static int __check_app_process(pkgmgr_request_service_type service_type,
323 pkgmgr_client *pc, const char *pkgid, uid_t uid, void *data)
326 int ret = PKGMGR_R_ECOMM;
327 pkgmgrinfo_pkginfo_h handle;
329 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
331 retvm_if(client->pc_type != PC_REQUEST, PKGMGR_R_EINVAL, "client->pc_type is not PC_REQUEST\n");
333 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
334 if (ret != PMINFO_R_OK) {
335 ERR("pkgmgrinfo_pkginfo_get_pkginfo failed");
336 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
337 return PKGMGR_R_ERROR;
340 if (service_type == PM_REQUEST_KILL_APP) {
341 ret = pkgmgr_client_connection_send_request(client, "kill",
342 g_variant_new("(us)", uid, pkgid), &result);
343 } else if (service_type == PM_REQUEST_CHECK_APP) {
344 ret = pkgmgr_client_connection_send_request(client, "check",
345 g_variant_new("(us)", uid, pkgid), &result);
347 ERR("unexpected service type: %d", service_type);
348 ret = PKGMGR_R_ERROR;
351 if (ret != PKGMGR_R_OK) {
352 ERR("request failed: %d", ret);
353 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
357 g_variant_get(result, "(ii)", &ret, &pid);
358 g_variant_unref(result);
359 if (ret != PKGMGR_R_OK) {
360 ERR("request failed, ret=%d", ret);
361 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
367 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
373 API pkgmgr_client *pkgmgr_client_new(pkgmgr_client_type pc_type)
375 struct pkgmgr_client_t *client;
377 if (pc_type == PC_BROADCAST) {
378 ERR("broadcast type is not supported");
382 if (pc_type != PC_REQUEST && pc_type != PC_LISTENING) {
383 ERR("invalid parameter");
387 client = calloc(1, sizeof(struct pkgmgr_client_t));
388 if (client == NULL) {
389 ERR("out of memory");
393 client->pc_type = pc_type;
394 client->status_type = PKGMGR_CLIENT_STATUS_ALL;
396 if (pkgmgr_client_connection_connect(client) != PKGMGR_R_OK) {
401 return (pkgmgr_client *)client;
404 API int pkgmgr_client_free(pkgmgr_client *pc)
406 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
409 ERR("invalid argument");
410 return PKGMGR_R_EINVAL;
413 pkgmgr_client_remove_listen_status(client);
414 pkgmgr_client_connection_disconnect(client);
415 if (client->tep_path)
416 free(client->tep_path);
417 if (client->res_copy_builder)
418 g_variant_builder_unref(client->res_copy_builder);
419 if (client->res_remove_builder)
420 g_variant_builder_unref(client->res_remove_builder);
421 if (client->res_create_dir_builder)
422 g_variant_builder_unref(client->res_create_dir_builder);
428 struct manifest_and_type type_map[] = {
429 { "res/wgt/config.xml", "wgt" },
430 { "config.xml", "wgt" },
431 { "tizen-manifest.xml", "tpk" },
435 static char *__get_type_from_path(const char *pkg_path)
437 const char *type = NULL;
441 uf = unzOpen(pkg_path);
443 ERR("failed to open zip file %s", pkg_path);
447 for (i = 0; type_map[i].manifest != NULL; i++) {
448 if (unzLocateFile(uf, type_map[i].manifest, 0) == UNZ_OK) {
449 DBG("pkgtype of %s: [%s]", pkg_path, type_map[i].type);
450 type = type_map[i].type;
456 return type ? strdup(type) : NULL;
459 API int pkgmgr_client_set_tep_path(pkgmgr_client *pc, const char *tep_path,
462 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *) pc;
464 if (pc == NULL || tep_path == NULL) {
465 ERR("invalied parameter");
466 return PKGMGR_R_EINVAL;
469 if (client->tep_path)
470 free(client->tep_path);
472 client->tep_path = strdup(tep_path);
473 client->tep_move = tep_move;
478 API int pkgmgr_client_usr_install_packages(pkgmgr_client *pc,
479 const char **pkg_paths, int n_pkgs, pkgmgr_handler event_cb,
480 void *data, uid_t uid)
483 GVariantBuilder *pkgs_builder;
485 GVariantBuilder *args_builder;
488 char *req_key = NULL;
489 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
490 struct cb_info *cb_info;
492 char *request_id = NULL;
494 if (pc == NULL || pkg_paths == NULL || n_pkgs < 1) {
495 ERR("invalid parameter");
496 return PKGMGR_R_EINVAL;
499 if (client->pc_type != PC_REQUEST) {
500 ERR("client type is not PC_REQUEST");
501 return PKGMGR_R_EINVAL;
504 for (i = 0; i < n_pkgs; i++) {
505 if (access(pkg_paths[i], F_OK) != 0) {
506 ERR("failed to access: %s", pkg_paths[i]);
507 return PKGMGR_R_EINVAL;
511 pkgs_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
512 for (i = 0; i < n_pkgs; i++)
513 g_variant_builder_add(pkgs_builder, "s", pkg_paths[i]);
514 pkgs = g_variant_new("as", pkgs_builder);
515 g_variant_builder_unref(pkgs_builder);
517 args_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
518 if (client->debug_mode)
519 g_variant_builder_add(args_builder, "s", "-G");
520 if (client->skip_optimization)
521 g_variant_builder_add(args_builder, "s", "-S");
522 args = g_variant_new("as", args_builder);
523 g_variant_builder_unref(args_builder);
525 request_id = _generate_request_id();
526 ret = pkgmgr_client_connection_send_request(client, "install_pkgs",
527 g_variant_new("(u@as@ass)", uid, pkgs, args,
531 if (ret != PKGMGR_R_OK) {
532 ERR("request failed: %d", ret);
536 g_variant_get(result, "(i&s)", &ret, &req_key);
537 if (req_key == NULL) {
538 g_variant_unref(result);
539 return PKGMGR_R_ECOMM;
541 if (ret != PKGMGR_R_OK) {
542 g_variant_unref(result);
546 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
547 if (cb_info == NULL) {
548 g_variant_unref(result);
549 return PKGMGR_R_ERROR;
551 g_variant_unref(result);
552 ret = pkgmgr_client_connection_set_callback(client, cb_info);
553 if (ret != PKGMGR_R_OK) {
554 __free_cb_info(cb_info);
557 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
559 return cb_info->req_id;
562 API int pkgmgr_client_install_packages(pkgmgr_client *pc,
563 const char **pkg_paths, int n_pkgs, pkgmgr_handler event_cb,
566 return pkgmgr_client_usr_install_packages(pc, pkg_paths, n_pkgs,
567 event_cb, data, _getuid());
570 API int pkgmgr_client_usr_install(pkgmgr_client *pc, const char *pkg_type,
571 const char *descriptor_path, const char *pkg_path,
572 const char *optional_data, pkgmgr_mode mode,
573 pkgmgr_handler event_cb, void *data, uid_t uid)
576 int ret = PKGMGR_R_ECOMM;
577 char *req_key = NULL;
578 GVariantBuilder *builder = NULL;
579 GVariant *args = NULL;
580 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
581 struct cb_info *cb_info;
582 char *request_id = NULL;
584 if (pc == NULL || pkg_path == NULL) {
585 ERR("invalid parameter");
586 return PKGMGR_R_EINVAL;
589 if (client->pc_type != PC_REQUEST) {
590 ERR("client type is not PC_REQUEST");
591 return PKGMGR_R_EINVAL;
594 if (access(pkg_path, F_OK) != 0) {
595 ERR("failed to access: %s", pkg_path);
596 return PKGMGR_R_EINVAL;
599 if (client->tep_path != NULL && access(client->tep_path, F_OK) != 0) {
600 ERR("failed to access: %s", client->tep_path);
601 return PKGMGR_R_EINVAL;
604 /* build arguments */
605 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
606 if (client->tep_path) {
607 g_variant_builder_add(builder, "s", "-e");
608 g_variant_builder_add(builder, "s", client->tep_path);
609 g_variant_builder_add(builder, "s", "-M");
610 /* TODO: revise tep_move */
611 g_variant_builder_add(builder, "s",
612 client->tep_move ? "tep_move" : "tep_copy");
614 if (client->debug_mode)
615 g_variant_builder_add(builder, "s", "-G");
616 if (client->skip_optimization)
617 g_variant_builder_add(builder, "s", "-S");
619 args = g_variant_new("as", builder);
620 g_variant_builder_unref(builder);
622 request_id = _generate_request_id();
623 ret = pkgmgr_client_connection_send_request(client, "install",
624 g_variant_new("(uss@ass)", uid, pkg_type ? pkg_type : "",
625 pkg_path, args, request_id),
628 if (ret != PKGMGR_R_OK) {
629 ERR("request failed: %d", ret);
633 g_variant_get(result, "(i&s)", &ret, &req_key);
634 if (req_key == NULL) {
635 g_variant_unref(result);
636 return PKGMGR_R_ECOMM;
638 if (ret != PKGMGR_R_OK) {
639 g_variant_unref(result);
643 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
644 if (cb_info == NULL) {
645 g_variant_unref(result);
646 return PKGMGR_R_ENOMEM;
648 g_variant_unref(result);
649 ret = pkgmgr_client_connection_set_callback(client, cb_info);
650 if (ret != PKGMGR_R_OK) {
651 __free_cb_info(cb_info);
654 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
655 return cb_info->req_id;
658 API int pkgmgr_client_install(pkgmgr_client *pc, const char *pkg_type,
659 const char *descriptor_path, const char *pkg_path,
660 const char *optional_data, pkgmgr_mode mode,
661 pkgmgr_handler event_cb, void *data)
663 return pkgmgr_client_usr_install(pc, pkg_type, descriptor_path,
664 pkg_path, optional_data, mode, event_cb, data,
668 API int pkgmgr_client_reinstall(pkgmgr_client *pc, const char *pkg_type,
669 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
670 pkgmgr_handler event_cb, void *data)
672 return pkgmgr_client_usr_reinstall(pc, pkg_type, pkgid, optional_data,
673 mode, event_cb, data, _getuid());
676 API int pkgmgr_client_usr_reinstall(pkgmgr_client *pc, const char *pkg_type,
677 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
678 pkgmgr_handler event_cb, void *data, uid_t uid)
681 int ret = PKGMGR_R_ECOMM;
682 char *req_key = NULL;
683 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
684 struct cb_info *cb_info;
686 if (pc == NULL || pkgid == NULL) {
687 ERR("invalid parameter");
688 return PKGMGR_R_EINVAL;
691 if (client->pc_type != PC_REQUEST) {
692 ERR("client->pc_type is not PC_REQUEST");
693 return PKGMGR_R_EINVAL;
696 ret = pkgmgr_client_connection_send_request(client, "reinstall",
697 g_variant_new("(us)", uid, pkgid), &result);
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;
708 if (ret != PKGMGR_R_OK) {
709 g_variant_unref(result);
713 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
714 if (cb_info == NULL) {
715 g_variant_unref(result);
716 return PKGMGR_R_ENOMEM;
718 g_variant_unref(result);
719 ret = pkgmgr_client_connection_set_callback(client, cb_info);
720 if (ret != PKGMGR_R_OK) {
721 __free_cb_info(cb_info);
724 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
726 return cb_info->req_id;
729 API int pkgmgr_client_usr_mount_install_packages(pkgmgr_client *pc,
730 const char **pkg_paths, int n_pkgs, pkgmgr_handler event_cb,
731 void *data, uid_t uid)
734 GVariantBuilder *pkgs_builder;
736 int ret = PKGMGR_R_ECOMM;
737 char *req_key = NULL;
738 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
739 struct cb_info *cb_info;
741 char *request_id = NULL;
743 if (pc == NULL || pkg_paths == NULL || n_pkgs < 1) {
744 ERR("invalid parameter");
745 return PKGMGR_R_EINVAL;
748 if (client->pc_type != PC_REQUEST) {
749 ERR("client->pc_type is not PC_REQUEST");
750 return PKGMGR_R_EINVAL;
753 for (i = 0; i < n_pkgs; i++) {
754 if (access(pkg_paths[i], F_OK) != 0) {
755 ERR("failed to access: %s", pkg_paths[i]);
756 return PKGMGR_R_EINVAL;
760 pkgs_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
761 for (i = 0; i < n_pkgs; i++)
762 g_variant_builder_add(pkgs_builder, "s", pkg_paths[i]);
763 pkgs = g_variant_new("as", pkgs_builder);
764 g_variant_builder_unref(pkgs_builder);
766 request_id = _generate_request_id();
767 ret = pkgmgr_client_connection_send_request(client,
768 "mount_install_pkgs",
769 g_variant_new("(u@ass)", uid, pkgs, request_id),
772 if (ret != PKGMGR_R_OK) {
773 ERR("request failed: %d", ret);
777 g_variant_get(result, "(i&s)", &ret, &req_key);
778 if (req_key == NULL) {
779 g_variant_unref(result);
780 return PKGMGR_R_ECOMM;
782 if (ret != PKGMGR_R_OK) {
783 g_variant_unref(result);
787 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
788 if (cb_info == NULL) {
789 g_variant_unref(result);
790 return PKGMGR_R_ENOMEM;
792 g_variant_unref(result);
793 ret = pkgmgr_client_connection_set_callback(client, cb_info);
794 if (ret != PKGMGR_R_OK) {
795 __free_cb_info(cb_info);
798 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
800 return cb_info->req_id;
803 API int pkgmgr_client_mount_install_packages(pkgmgr_client *pc,
804 const char **pkg_paths, int n_pkgs, pkgmgr_handler event_cb,
807 return pkgmgr_client_usr_mount_install_packages(pc, pkg_paths, n_pkgs,
808 event_cb, data, _getuid());
811 API int pkgmgr_client_usr_mount_install(pkgmgr_client *pc, const char *pkg_type,
812 const char *descriptor_path, const char *pkg_path,
813 const char *optional_data, pkgmgr_mode mode,
814 pkgmgr_handler event_cb, void *data, uid_t uid)
817 int ret = PKGMGR_R_ECOMM;
818 char *req_key = NULL;
819 GVariantBuilder *builder = NULL;
820 GVariant *args = NULL;
821 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
822 struct cb_info *cb_info;
823 char *request_id = NULL;
825 if (pc == NULL || pkg_path == NULL) {
826 ERR("invalid parameter");
827 return PKGMGR_R_EINVAL;
830 if (client->pc_type != PC_REQUEST) {
831 ERR("client->pc_type is not PC_REQUEST");
832 return PKGMGR_R_EINVAL;
835 if (access(pkg_path, F_OK) != 0) {
836 ERR("failed to access: %s", pkg_path);
837 return PKGMGR_R_EINVAL;
840 if (client->tep_path != NULL && access(client->tep_path, F_OK) != 0) {
841 ERR("failed to access: %s", client->tep_path);
842 return PKGMGR_R_EINVAL;
845 /* build arguments */
846 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
847 if (client->tep_path) {
848 g_variant_builder_add(builder, "s", "-e");
849 g_variant_builder_add(builder, "s", client->tep_path);
850 g_variant_builder_add(builder, "s", "-M");
851 /* TODO: revise tep_move */
852 g_variant_builder_add(builder, "s",
853 client->tep_move ? "tep_move" : "tep_copy");
856 args = g_variant_new("as", builder);
857 g_variant_builder_unref(builder);
859 request_id = _generate_request_id();
860 ret = pkgmgr_client_connection_send_request(client, "mount_install",
861 g_variant_new("(uss@ass)", uid,
862 pkg_type ? pkg_type : "", pkg_path,
866 if (ret != PKGMGR_R_OK) {
867 ERR("request failed: %d", ret);
871 g_variant_get(result, "(i&s)", &ret, &req_key);
872 if (req_key == NULL) {
873 g_variant_unref(result);
874 return PKGMGR_R_ECOMM;
876 if (ret != PKGMGR_R_OK) {
877 g_variant_unref(result);
881 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
882 if (cb_info == NULL) {
883 g_variant_unref(result);
884 return PKGMGR_R_ENOMEM;
886 g_variant_unref(result);
887 ret = pkgmgr_client_connection_set_callback(client, cb_info);
888 if (ret != PKGMGR_R_OK) {
889 __free_cb_info(cb_info);
892 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
894 return cb_info->req_id;
897 API int pkgmgr_client_mount_install(pkgmgr_client *pc, const char *pkg_type,
898 const char *descriptor_path, const char *pkg_path,
899 const char *optional_data, pkgmgr_mode mode,
900 pkgmgr_handler event_cb, void *data)
902 return pkgmgr_client_usr_mount_install(pc, pkg_type, descriptor_path,
903 pkg_path, optional_data, mode, event_cb, data,
907 API int pkgmgr_client_usr_uninstall_packages(pkgmgr_client *pc,
908 const char **pkgids, int n_pkgs, pkgmgr_handler event_cb,
909 void *data, uid_t uid)
912 GVariantBuilder *pkgs_builder;
914 int ret = PKGMGR_R_ECOMM;
915 char *req_key = NULL;
916 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
917 struct cb_info *cb_info;
920 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
921 ERR("invalid parameter");
922 return PKGMGR_R_EINVAL;
925 if (client->pc_type != PC_REQUEST) {
926 ERR("client->pc_type is not PC_REQUEST");
927 return PKGMGR_R_EINVAL;
930 pkgs_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
931 for (i = 0; i < n_pkgs; i++)
932 g_variant_builder_add(pkgs_builder, "s", pkgids[i]);
933 pkgs = g_variant_new("as", pkgs_builder);
934 g_variant_builder_unref(pkgs_builder);
936 ret = pkgmgr_client_connection_send_request(client, "uninstall_pkgs",
937 g_variant_new("(u@as)", uid, pkgs), &result);
938 if (ret != PKGMGR_R_OK) {
939 ERR("request failed: %d", ret);
943 g_variant_get(result, "(i&s)", &ret, &req_key);
944 if (req_key == NULL) {
945 g_variant_unref(result);
946 return PKGMGR_R_ECOMM;
948 if (ret != PKGMGR_R_OK) {
949 g_variant_unref(result);
953 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
954 if (cb_info == NULL) {
955 g_variant_unref(result);
956 return PKGMGR_R_ENOMEM;
958 g_variant_unref(result);
959 ret = pkgmgr_client_connection_set_callback(client, cb_info);
960 if (ret != PKGMGR_R_OK) {
961 __free_cb_info(cb_info);
964 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
966 return cb_info->req_id;
969 API int pkgmgr_client_uninstall_packages(pkgmgr_client *pc,
970 const char **pkgids, int n_pkgs, pkgmgr_handler event_cb,
973 return pkgmgr_client_usr_uninstall_packages(pc, pkgids, n_pkgs,
974 event_cb, data, _getuid());
977 API int pkgmgr_client_uninstall(pkgmgr_client *pc, const char *pkg_type,
978 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
981 return pkgmgr_client_usr_uninstall(pc, pkg_type, pkgid, mode, event_cb,
985 API int pkgmgr_client_usr_uninstall(pkgmgr_client *pc, const char *pkg_type,
986 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
987 void *data, uid_t uid)
990 int ret = PKGMGR_R_ECOMM;
991 char *req_key = NULL;
992 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
993 struct cb_info *cb_info;
995 if (pc == NULL || pkgid == NULL) {
996 ERR("invalid parameter");
997 return PKGMGR_R_EINVAL;
1000 if (client->pc_type != PC_REQUEST) {
1001 ERR("client->pc_type is not PC_REQUEST");
1002 return PKGMGR_R_EINVAL;
1005 ret = pkgmgr_client_connection_send_request(client, "uninstall",
1006 g_variant_new("(us)", uid, pkgid), &result);
1007 if (ret != PKGMGR_R_OK) {
1008 ERR("request failed: %d", ret);
1012 g_variant_get(result, "(i&s)", &ret, &req_key);
1013 if (req_key == NULL) {
1014 g_variant_unref(result);
1015 return PKGMGR_R_ECOMM;
1017 if (ret != PKGMGR_R_OK) {
1018 g_variant_unref(result);
1022 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1023 if (cb_info == NULL) {
1024 g_variant_unref(result);
1025 return PKGMGR_R_ENOMEM;
1027 g_variant_unref(result);
1028 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1029 if (ret != PKGMGR_R_OK) {
1030 __free_cb_info(cb_info);
1033 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1035 return cb_info->req_id;
1038 API int pkgmgr_client_move(pkgmgr_client *pc, const char *pkg_type,
1039 const char *pkgid, pkgmgr_move_type move_type,
1040 pkgmgr_handler event_cb, void *data)
1042 return pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type,
1043 event_cb, data, _getuid());
1045 API int pkgmgr_client_usr_move(pkgmgr_client *pc, const char *pkg_type,
1046 const char *pkgid, pkgmgr_move_type move_type,
1047 pkgmgr_handler event_cb, void *data, uid_t uid)
1050 int ret = PKGMGR_R_ECOMM;
1051 char *req_key = NULL;
1052 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1053 struct cb_info *cb_info;
1055 if (pc == NULL || pkgid == NULL) {
1056 ERR("invalid parameter");
1057 return PKGMGR_R_EINVAL;
1060 if ((move_type < PM_MOVE_TO_INTERNAL) ||
1061 (move_type > PM_MOVE_TO_EXTENDED))
1062 return PKGMGR_R_EINVAL;
1064 if (client->pc_type != PC_REQUEST) {
1065 ERR("client->pc_type is not PC_REQUEST");
1066 return PKGMGR_R_EINVAL;
1069 ret = pkgmgr_client_connection_send_request(client, "move",
1070 g_variant_new("(usi)", uid, pkgid, move_type), &result);
1071 if (ret != PKGMGR_R_OK) {
1072 ERR("request failed: %d", ret);
1076 g_variant_get(result, "(i&s)", &ret, &req_key);
1077 if (req_key == NULL) {
1078 g_variant_unref(result);
1079 return PKGMGR_R_ECOMM;
1081 if (ret != PKGMGR_R_OK) {
1082 g_variant_unref(result);
1086 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1087 if (cb_info == NULL) {
1088 g_variant_unref(result);
1089 return PKGMGR_R_ERROR;
1091 g_variant_unref(result);
1092 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1093 if (ret != PKGMGR_R_OK) {
1094 __free_cb_info(cb_info);
1097 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1099 return cb_info->req_id;
1102 API int pkgmgr_client_usr_register_pkg_update_info(pkgmgr_client *pc,
1103 pkg_update_info_t *update_info, uid_t uid)
1106 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1109 if (pc == NULL || update_info == NULL || update_info->pkgid == NULL) {
1110 ERR("invalid parameter");
1111 return PKGMGR_R_EINVAL;
1114 if (client->pc_type != PC_REQUEST) {
1115 ERR("client->pc_type is not PC_REQUEST");
1116 return PKGMGR_R_EINVAL;
1119 ret = pkgmgr_client_connection_send_request(client, "register_pkg_update_info",
1120 g_variant_new("(ussi)", uid, update_info->pkgid, update_info->version,
1121 update_info->type), &result);
1122 if (ret != PKGMGR_R_OK) {
1123 ERR("request failed: %d", ret);
1127 g_variant_get(result, "(i)", &ret);
1128 if (ret != PKGMGR_R_OK) {
1129 g_variant_unref(result);
1132 g_variant_unref(result);
1137 API int pkgmgr_client_register_pkg_update_info(pkgmgr_client *pc,
1138 pkg_update_info_t *update_info)
1140 return pkgmgr_client_usr_register_pkg_update_info(pc, update_info,
1144 API int pkgmgr_client_usr_unregister_pkg_update_info(pkgmgr_client *pc,
1145 const char *pkgid, uid_t uid)
1148 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1151 if (pc == NULL || pkgid == NULL) {
1152 ERR("invalid parameter");
1153 return PKGMGR_R_EINVAL;
1156 if (client->pc_type != PC_REQUEST) {
1157 ERR("client->pc_type is not PC_REQUEST");
1158 return PKGMGR_R_EINVAL;
1161 ret = pkgmgr_client_connection_send_request(client,
1162 "unregister_pkg_update_info",
1163 g_variant_new("(us)", uid, pkgid), &result);
1164 if (ret != PKGMGR_R_OK) {
1165 ERR("request failed: %d", ret);
1169 g_variant_get(result, "(i)", &ret);
1170 if (ret != PKGMGR_R_OK) {
1171 g_variant_unref(result);
1174 g_variant_unref(result);
1179 API int pkgmgr_client_unregister_pkg_update_info(pkgmgr_client *pc,
1182 return pkgmgr_client_usr_unregister_pkg_update_info(pc, pkgid, _getuid());
1185 API int pkgmgr_client_usr_unregister_all_pkg_update_info(pkgmgr_client *pc,
1189 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1193 ERR("invalid parameter");
1194 return PKGMGR_R_EINVAL;
1197 if (client->pc_type != PC_REQUEST) {
1198 ERR("client->pc_type is not PC_REQUEST");
1199 return PKGMGR_R_EINVAL;
1202 ret = pkgmgr_client_connection_send_request(client,
1203 "unregister_all_pkg_update_info",
1204 g_variant_new("(u)", uid), &result);
1205 if (ret != PKGMGR_R_OK) {
1206 ERR("request failed: %d", ret);
1210 g_variant_get(result, "(i)", &ret);
1211 if (ret != PKGMGR_R_OK) {
1212 g_variant_unref(result);
1215 g_variant_unref(result);
1220 API int pkgmgr_client_unregister_all_pkg_update_info(pkgmgr_client *pc)
1222 return pkgmgr_client_usr_unregister_all_pkg_update_info(pc, _getuid());
1225 API int pkgmgr_client_usr_activate(pkgmgr_client *pc, const char *pkg_type,
1226 const char *pkgid, uid_t uid)
1229 int ret = PKGMGR_R_ECOMM;
1230 GVariantBuilder *builder;
1231 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1233 if (pc == NULL || pkgid == NULL) {
1234 ERR("invalid parameter");
1235 return PKGMGR_R_EINVAL;
1238 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1239 g_variant_builder_add(builder, "s", pkgid);
1241 ret = pkgmgr_client_connection_send_request(client, "enable_pkgs",
1242 g_variant_new("(uas)", uid, builder), &result);
1243 g_variant_builder_unref(builder);
1244 if (ret != PKGMGR_R_OK) {
1245 ERR("request failed: %d", ret);
1249 g_variant_get(result, "(is)", &ret, NULL);
1250 g_variant_unref(result);
1255 API int pkgmgr_client_activate(pkgmgr_client *pc, const char *pkg_type,
1258 return pkgmgr_client_usr_activate(pc, pkg_type, pkgid, _getuid());
1261 API int pkgmgr_client_usr_activate_packages(pkgmgr_client *pc,
1262 const char *pkg_type, const char **pkgids, int n_pkgs,
1263 pkgmgr_handler event_cb, void *data, uid_t uid)
1266 GVariantBuilder *builder;
1267 int ret = PKGMGR_R_ECOMM;
1268 char *req_key = NULL;
1269 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1270 struct cb_info *cb_info;
1273 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
1274 ERR("invalid parameter");
1275 return PKGMGR_R_EINVAL;
1278 if (client->pc_type != PC_REQUEST) {
1279 ERR("client type is not PC_REQUEST");
1280 return PKGMGR_R_EINVAL;
1283 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1284 for (i = 0; i < n_pkgs; i++)
1285 g_variant_builder_add(builder, "s", pkgids[i]);
1287 ret = pkgmgr_client_connection_send_request(client, "enable_pkgs",
1288 g_variant_new("(uas)", uid, builder), &result);
1289 g_variant_builder_unref(builder);
1290 if (ret != PKGMGR_R_OK) {
1291 ERR("request failed: %d", ret);
1295 g_variant_get(result, "(i&s)", &ret, &req_key);
1296 if (req_key == NULL) {
1297 g_variant_unref(result);
1298 return PKGMGR_R_ECOMM;
1300 if (ret != PKGMGR_R_OK) {
1301 g_variant_unref(result);
1305 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1306 if (cb_info == NULL) {
1307 g_variant_unref(result);
1308 return PKGMGR_R_ERROR;
1310 g_variant_unref(result);
1311 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1312 if (ret != PKGMGR_R_OK) {
1313 __free_cb_info(cb_info);
1316 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1318 return cb_info->req_id;
1321 API int pkgmgr_client_activate_packages(pkgmgr_client *pc,
1322 const char *pkg_type, const char **pkgids, int n_pkgs,
1323 pkgmgr_handler event_cb, void *data)
1325 return pkgmgr_client_usr_activate_packages(pc, pkg_type,
1326 pkgids, n_pkgs, event_cb, data, _getuid());
1329 API int pkgmgr_client_usr_deactivate(pkgmgr_client *pc, const char *pkg_type,
1330 const char *pkgid, uid_t uid)
1333 GVariantBuilder *builder;
1334 int ret = PKGMGR_R_ECOMM;
1335 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1337 if (pc == NULL || pkgid == NULL) {
1338 ERR("invalid parameter");
1339 return PKGMGR_R_EINVAL;
1342 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1343 g_variant_builder_add(builder, "s", pkgid);
1345 ret = pkgmgr_client_connection_send_request(client, "disable_pkgs",
1346 g_variant_new("(uas)", uid, builder), &result);
1347 g_variant_builder_unref(builder);
1348 if (ret != PKGMGR_R_OK) {
1349 ERR("request failed: %d", ret);
1353 g_variant_get(result, "(is)", &ret, NULL);
1354 g_variant_unref(result);
1359 API int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type,
1362 return pkgmgr_client_usr_deactivate(pc, pkg_type, pkgid, _getuid());
1365 API int pkgmgr_client_usr_deactivate_packages(pkgmgr_client *pc,
1366 const char *pkg_type, const char **pkgids, int n_pkgs,
1367 pkgmgr_handler event_cb, void *data, uid_t uid)
1370 GVariantBuilder *builder;
1371 int ret = PKGMGR_R_ECOMM;
1372 char *req_key = NULL;
1373 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1374 struct cb_info *cb_info;
1377 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
1378 ERR("invalid parameter");
1379 return PKGMGR_R_EINVAL;
1382 if (client->pc_type != PC_REQUEST) {
1383 ERR("client type is not PC_REQUEST");
1384 return PKGMGR_R_EINVAL;
1387 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1388 for (i = 0; i < n_pkgs; i++)
1389 g_variant_builder_add(builder, "s", pkgids[i]);
1391 ret = pkgmgr_client_connection_send_request(client, "disable_pkgs",
1392 g_variant_new("(uas)", uid, builder), &result);
1393 g_variant_builder_unref(builder);
1394 if (ret != PKGMGR_R_OK) {
1395 ERR("request failed: %d", ret);
1399 g_variant_get(result, "(i&s)", &ret, &req_key);
1400 if (req_key == NULL) {
1401 g_variant_unref(result);
1402 return PKGMGR_R_ECOMM;
1404 if (ret != PKGMGR_R_OK) {
1405 g_variant_unref(result);
1409 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1410 if (cb_info == NULL) {
1411 g_variant_unref(result);
1412 return PKGMGR_R_ERROR;
1414 g_variant_unref(result);
1415 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1416 if (ret != PKGMGR_R_OK) {
1417 __free_cb_info(cb_info);
1420 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1422 return cb_info->req_id;
1425 API int pkgmgr_client_deactivate_packages(pkgmgr_client *pc,
1426 const char *pkg_type, const char **pkgids, int n_pkgs,
1427 pkgmgr_handler event_cb, void *data)
1429 return pkgmgr_client_usr_deactivate_packages(pc, pkg_type,
1430 pkgids, n_pkgs, event_cb, data, _getuid());
1433 API int pkgmgr_client_usr_activate_app(pkgmgr_client *pc, const char *appid,
1434 pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1437 int ret = PKGMGR_R_ECOMM;
1438 char *req_key = NULL;
1439 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1440 struct cb_info *cb_info;
1442 if (pc == NULL || appid == NULL) {
1443 ERR("invalid parameter");
1444 return PKGMGR_R_EINVAL;
1447 ret = pkgmgr_client_connection_send_request(client, "enable_app",
1448 g_variant_new("(us)", uid, appid), &result);
1449 if (ret != PKGMGR_R_OK) {
1450 ERR("request failed: %d", ret);
1454 g_variant_get(result, "(i&s)", &ret, &req_key);
1455 if (req_key == NULL) {
1456 g_variant_unref(result);
1457 return PKGMGR_R_ECOMM;
1459 if (ret != PKGMGR_R_OK) {
1460 g_variant_unref(result);
1464 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1466 if (cb_info == NULL) {
1467 g_variant_unref(result);
1468 return PKGMGR_R_ENOMEM;
1470 g_variant_unref(result);
1471 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1472 if (ret != PKGMGR_R_OK) {
1473 __free_cb_info(cb_info);
1476 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1478 return cb_info->req_id;
1481 API int pkgmgr_client_activate_app(pkgmgr_client *pc, const char *appid,
1482 pkgmgr_app_handler app_event_cb, void *data)
1484 return pkgmgr_client_usr_activate_app(pc, appid, app_event_cb,
1488 API int pkgmgr_client_usr_activate_apps(pkgmgr_client *pc, const char **appids,
1489 int n_apps, pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1492 GVariantBuilder *builder;
1493 int ret = PKGMGR_R_ECOMM;
1494 char *req_key = NULL;
1495 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1496 struct cb_info *cb_info;
1499 if (pc == NULL || appids == NULL || n_apps < 1) {
1500 ERR("invalid parameter");
1501 return PKGMGR_R_EINVAL;
1504 if (client->pc_type != PC_REQUEST) {
1505 ERR("client type is not PC_REQUEST");
1506 return PKGMGR_R_EINVAL;
1509 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1510 for (i = 0; i < n_apps; i++)
1511 g_variant_builder_add(builder, "s", appids[i]);
1513 ret = pkgmgr_client_connection_send_request(client, "enable_apps",
1514 g_variant_new("(uas)", uid, builder), &result);
1515 g_variant_builder_unref(builder);
1516 if (ret != PKGMGR_R_OK) {
1517 ERR("request failed: %d", ret);
1521 g_variant_get(result, "(i&s)", &ret, &req_key);
1522 if (req_key == NULL) {
1523 g_variant_unref(result);
1524 return PKGMGR_R_ECOMM;
1526 if (ret != PKGMGR_R_OK) {
1527 g_variant_unref(result);
1531 cb_info = __create_app_event_cb_info(client, app_event_cb, data, req_key);
1532 if (cb_info == NULL) {
1533 g_variant_unref(result);
1534 return PKGMGR_R_ERROR;
1536 g_variant_unref(result);
1537 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1538 if (ret != PKGMGR_R_OK) {
1539 __free_cb_info(cb_info);
1542 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1544 return cb_info->req_id;
1547 API int pkgmgr_client_activate_apps(pkgmgr_client *pc, const char **appids,
1548 int n_apps, pkgmgr_app_handler app_event_cb, void *data)
1550 return pkgmgr_client_usr_activate_apps(pc, appids, n_apps,
1551 app_event_cb, data, _getuid());
1554 API int pkgmgr_client_activate_global_app_for_uid(pkgmgr_client *pc,
1555 const char *appid, pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1558 int ret = PKGMGR_R_ECOMM;
1559 char *req_key = NULL;
1560 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1561 struct cb_info *cb_info;
1563 if (pc == NULL || appid == NULL) {
1564 ERR("invalid parameter");
1565 return PKGMGR_R_EINVAL;
1568 ret = pkgmgr_client_connection_send_request(client,
1569 "enable_global_app_for_uid",
1570 g_variant_new("(us)", uid, appid), &result);
1571 if (ret != PKGMGR_R_OK) {
1572 ERR("request failed: %d", ret);
1576 g_variant_get(result, "(i&s)", &ret, &req_key);
1577 if (req_key == NULL) {
1578 g_variant_unref(result);
1579 return PKGMGR_R_ECOMM;
1581 if (ret != PKGMGR_R_OK) {
1582 g_variant_unref(result);
1586 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1588 if (cb_info == NULL) {
1589 g_variant_unref(result);
1590 return PKGMGR_R_ENOMEM;
1592 g_variant_unref(result);
1593 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1594 if (ret != PKGMGR_R_OK) {
1595 __free_cb_info(cb_info);
1598 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1600 return cb_info->req_id;
1603 API int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid,
1604 pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1607 int ret = PKGMGR_R_ECOMM;
1608 char *req_key = NULL;
1609 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1610 struct cb_info *cb_info;
1612 if (pc == NULL || appid == NULL) {
1613 ERR("invalid parameter");
1614 return PKGMGR_R_EINVAL;
1617 ret = pkgmgr_client_connection_send_request(client, "disable_app",
1618 g_variant_new("(us)", uid, appid), &result);
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,
1636 if (cb_info == NULL) {
1637 g_variant_unref(result);
1638 return PKGMGR_R_ENOMEM;
1640 g_variant_unref(result);
1641 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1642 if (ret != PKGMGR_R_OK) {
1643 __free_cb_info(cb_info);
1646 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1648 return cb_info->req_id;
1651 API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid,
1652 pkgmgr_app_handler app_event_cb, void *data)
1654 return pkgmgr_client_usr_deactivate_app(pc, appid, app_event_cb, data,
1658 API int pkgmgr_client_usr_deactivate_apps(pkgmgr_client *pc,
1659 const char **appids, int n_apps,
1660 pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1663 GVariantBuilder *builder;
1664 int ret = PKGMGR_R_ECOMM;
1665 char *req_key = NULL;
1666 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1667 struct cb_info *cb_info;
1670 if (pc == NULL || appids == NULL || n_apps < 1) {
1671 ERR("invalid parameter");
1672 return PKGMGR_R_EINVAL;
1675 if (client->pc_type != PC_REQUEST) {
1676 ERR("client type is not PC_REQUEST");
1677 return PKGMGR_R_EINVAL;
1680 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1681 for (i = 0; i < n_apps; i++)
1682 g_variant_builder_add(builder, "s", appids[i]);
1684 ret = pkgmgr_client_connection_send_request(client, "disable_apps",
1685 g_variant_new("(uas)", uid, builder), &result);
1686 g_variant_builder_unref(builder);
1687 if (ret != PKGMGR_R_OK) {
1688 ERR("request failed: %d", ret);
1692 g_variant_get(result, "(i&s)", &ret, &req_key);
1693 if (req_key == NULL) {
1694 g_variant_unref(result);
1695 return PKGMGR_R_ECOMM;
1697 if (ret != PKGMGR_R_OK) {
1698 g_variant_unref(result);
1702 cb_info = __create_app_event_cb_info(client, app_event_cb, data, req_key);
1703 if (cb_info == NULL) {
1704 g_variant_unref(result);
1705 return PKGMGR_R_ERROR;
1707 g_variant_unref(result);
1708 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1709 if (ret != PKGMGR_R_OK) {
1710 __free_cb_info(cb_info);
1713 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1715 return cb_info->req_id;
1718 API int pkgmgr_client_deactivate_apps(pkgmgr_client *pc, const char **appids,
1719 int n_apps, pkgmgr_app_handler app_event_cb, void *data)
1721 return pkgmgr_client_usr_deactivate_apps(pc, appids, n_apps,
1722 app_event_cb, data, _getuid());
1725 API int pkgmgr_client_deactivate_global_app_for_uid(pkgmgr_client *pc,
1726 const char *appid, pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1729 int ret = PKGMGR_R_ECOMM;
1730 char *req_key = NULL;
1731 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1732 struct cb_info *cb_info;
1734 if (pc == NULL || appid == NULL) {
1735 ERR("invalid parameter");
1736 return PKGMGR_R_EINVAL;
1739 ret = pkgmgr_client_connection_send_request(client,
1740 "disable_global_app_for_uid",
1741 g_variant_new("(us)", uid, appid), &result);
1742 if (ret != PKGMGR_R_OK) {
1743 ERR("request failed: %d", ret);
1747 g_variant_get(result, "(i&s)", &ret, &req_key);
1748 if (req_key == NULL) {
1749 g_variant_unref(result);
1750 return PKGMGR_R_ECOMM;
1752 if (ret != PKGMGR_R_OK) {
1753 g_variant_unref(result);
1757 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1759 if (cb_info == NULL) {
1760 g_variant_unref(result);
1761 return PKGMGR_R_ENOMEM;
1763 g_variant_unref(result);
1764 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1765 if (ret != PKGMGR_R_OK) {
1766 __free_cb_info(cb_info);
1769 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1771 return cb_info->req_id;
1774 API int pkgmgr_client_usr_clear_user_data(pkgmgr_client *pc,
1775 const char *pkg_type, const char *pkgid, pkgmgr_mode mode,
1780 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1782 if (pc == NULL || pkgid == NULL || uid == GLOBAL_USER) {
1783 ERR("invalid parameter");
1784 return PKGMGR_R_EINVAL;
1787 if (client->pc_type != PC_REQUEST) {
1788 ERR("client->pc_type is not PC_REQUEST");
1789 return PKGMGR_R_EINVAL;
1792 ret = pkgmgr_client_connection_send_request(client, "cleardata",
1793 g_variant_new("(us)", uid, pkgid), &result);
1794 if (ret != PKGMGR_R_OK) {
1795 ERR("request failed: %d", ret);
1799 g_variant_get(result, "(i)", &ret);
1800 g_variant_unref(result);
1805 API int pkgmgr_client_clear_user_data(pkgmgr_client *pc, const char *pkg_type,
1806 const char *pkgid, pkgmgr_mode mode)
1808 return pkgmgr_client_usr_clear_user_data(pc, pkg_type, pkgid, mode,
1812 API int pkgmgr_client_usr_clear_user_data_with_path(pkgmgr_client *pc,
1813 const char *pkg_type, const char *pkgid, const char *file_path,
1814 pkgmgr_mode mode, uid_t uid)
1818 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1820 if (!pc || !pkgid || !file_path || uid == GLOBAL_USER) {
1821 ERR("invalid parameter");
1822 return PKGMGR_R_EINVAL;
1825 if (client->pc_type != PC_REQUEST) {
1826 ERR("client->pc_type is not PC_REQUEST");
1827 return PKGMGR_R_EINVAL;
1830 ret = pkgmgr_client_connection_send_request(client, "cleardata_with_path",
1831 g_variant_new("(uss)", uid, pkgid, file_path), &result);
1832 if (ret != PKGMGR_R_OK) {
1833 ERR("request failed: %d", ret);
1837 g_variant_get(result, "(i)", &ret);
1838 g_variant_unref(result);
1843 API int pkgmgr_client_clear_user_data_with_path(pkgmgr_client *pc, const char *pkg_type,
1844 const char *pkgid, const char *file_path, pkgmgr_mode mode)
1846 return pkgmgr_client_usr_clear_user_data_with_path(pc, pkg_type, pkgid,
1847 file_path, mode, _getuid());
1850 API int pkgmgr_client_set_status_type(pkgmgr_client *pc, int status_type)
1852 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1855 ERR("invalid parameter");
1856 return PKGMGR_R_EINVAL;
1859 client->status_type = status_type;
1864 API int pkgmgr_client_listen_status(pkgmgr_client *pc, pkgmgr_handler event_cb,
1868 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1869 struct cb_info *cb_info;
1871 if (pc == NULL || event_cb == NULL) {
1872 ERR("invalid parameter");
1873 return PKGMGR_R_EINVAL;
1876 if (client->pc_type != PC_LISTENING) {
1877 ERR("client->pc_type is not PC_LISTENING");
1878 return PKGMGR_R_EINVAL;
1881 cb_info = __create_event_cb_info(client, event_cb, data, NULL);
1882 if (cb_info == NULL)
1883 return PKGMGR_R_ENOMEM;
1884 cb_info->status_type = client->status_type;
1885 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1886 if (ret != PKGMGR_R_OK) {
1887 __free_cb_info(cb_info);
1890 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1892 return cb_info->req_id;
1895 API int pkgmgr_client_listen_app_status(pkgmgr_client *pc,
1896 pkgmgr_app_handler app_event_cb, void *data)
1899 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1900 struct cb_info *cb_info;
1902 if (pc == NULL || app_event_cb == NULL) {
1903 ERR("invalid parameter");
1904 return PKGMGR_R_EINVAL;
1907 if (client->pc_type != PC_LISTENING) {
1908 ERR("client->pc_type is not PC_LISTENING");
1909 return PKGMGR_R_EINVAL;
1912 cb_info = __create_app_event_cb_info(client, app_event_cb, data, NULL);
1913 if (cb_info == NULL)
1914 return PKGMGR_R_ENOMEM;
1915 cb_info->status_type = client->status_type;
1916 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1917 if (ret != PKGMGR_R_OK) {
1918 __free_cb_info(cb_info);
1921 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1923 return cb_info->req_id;
1926 API int pkgmgr_client_listen_res_status(pkgmgr_client *pc,
1927 pkgmgr_res_handler event_cb, void *data)
1930 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1931 struct cb_info *cb_info;
1933 if (pc == NULL || event_cb == NULL) {
1934 ERR("invalid parameter");
1935 return PKGMGR_R_EINVAL;
1938 if (client->pc_type != PC_LISTENING) {
1939 ERR("client->pc_type is not PC_LISTENING");
1940 return PKGMGR_R_EINVAL;
1943 cb_info = __create_res_event_cb_info(client, event_cb, data, NULL);
1944 if (cb_info == NULL)
1945 return PKGMGR_R_ENOMEM;
1946 cb_info->status_type = client->status_type;
1947 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1948 if (ret != PKGMGR_R_OK) {
1949 __free_cb_info(cb_info);
1952 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1954 return cb_info->req_id;
1957 API int pkgmgr_client_remove_listen_status(pkgmgr_client *pc)
1959 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1962 struct cb_info *cb_info;
1965 ERR("invalid parameter");
1966 return PKGMGR_R_EINVAL;
1969 /* unset all callback */
1970 tmp = client->cb_info_list;
1971 while (tmp != NULL) {
1973 cb_info = (struct cb_info *)tmp->data;
1974 pkgmgr_client_connection_unset_callback(pc, cb_info);
1975 client->cb_info_list = g_list_delete_link(client->cb_info_list,
1977 __free_cb_info(cb_info);
1984 API int pkgmgr_client_broadcast_status(pkgmgr_client *pc, const char *pkg_type,
1985 const char *pkgid, const char *key, const char *val)
1987 /* client cannot broadcast signal */
1991 /* TODO: deprecate(or remove) */
1992 API int pkgmgr_client_request_service(pkgmgr_request_service_type service_type,
1993 int service_mode, pkgmgr_client *pc, const char *pkg_type,
1994 const char *pkgid, const char *custom_info,
1995 pkgmgr_handler event_cb, void *data)
1997 return pkgmgr_client_usr_request_service(service_type, service_mode,
1998 pc, pkg_type, pkgid, _getuid(), custom_info, event_cb,
2002 API int pkgmgr_client_usr_request_service(
2003 pkgmgr_request_service_type service_type, int service_mode,
2004 pkgmgr_client *pc, const char *pkg_type, const char *pkgid,
2005 uid_t uid, const char *custom_info, pkgmgr_handler event_cb,
2010 /* Check for NULL value of service type */
2011 retvm_if(service_type > PM_REQUEST_MAX, PKGMGR_R_EINVAL, "service type is not defined\n");
2012 retvm_if(service_type < 0, PKGMGR_R_EINVAL, "service type is error\n");
2014 switch (service_type) {
2015 case PM_REQUEST_MOVE:
2016 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
2017 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
2018 tryvm_if((service_mode < PM_MOVE_TO_INTERNAL) || (service_mode > PM_MOVE_TO_EXTENDED), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
2020 ret = __move_pkg_process(pc, pkgid, pkg_type, uid, (pkgmgr_move_type)service_mode, event_cb, data);
2023 case PM_REQUEST_GET_SIZE:
2024 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
2025 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
2026 tryvm_if((service_mode < PM_GET_TOTAL_SIZE) || (service_mode >= PM_GET_MAX), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
2028 ret = __get_size_process(pc, pkgid, uid, (pkgmgr_getsize_type)service_mode, event_cb, data);
2031 case PM_REQUEST_KILL_APP:
2032 case PM_REQUEST_CHECK_APP:
2033 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
2034 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
2036 ret = __check_app_process(service_type, pc, pkgid, uid, data);
2038 ERR("__check_app_process fail \n");
2045 ERR("Wrong Request\n");
2055 API int pkgmgr_client_usr_clear_cache_dir(const char *pkgid, uid_t uid)
2059 struct pkgmgr_client_t *client;
2061 if (pkgid == NULL || uid == GLOBAL_USER) {
2062 ERR("invalid parameter");
2063 return PKGMGR_R_EINVAL;
2066 client = pkgmgr_client_new(PC_REQUEST);
2067 if (client == NULL) {
2068 ERR("out of memory");
2069 return PKGMGR_R_ENOMEM;
2072 ret = pkgmgr_client_connection_send_request(client, "clearcache",
2073 g_variant_new("(us)", uid, pkgid), &result);
2074 if (ret != PKGMGR_R_OK) {
2075 ERR("request failed: %d", ret);
2076 pkgmgr_client_free(client);
2080 g_variant_get(result, "(i)", &ret);
2081 g_variant_unref(result);
2082 pkgmgr_client_free(client);
2087 API int pkgmgr_client_clear_cache_dir(const char *pkgid)
2089 return pkgmgr_client_usr_clear_cache_dir(pkgid, _getuid());
2092 API int pkgmgr_client_clear_usr_all_cache_dir(uid_t uid)
2094 return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, uid);
2097 API int pkgmgr_client_clear_all_cache_dir(void)
2099 return pkgmgr_client_usr_clear_cache_dir(
2100 PKG_CLEAR_ALL_CACHE, _getuid());
2103 API int pkgmgr_client_get_size(pkgmgr_client *pc, const char *pkgid,
2104 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
2107 return pkgmgr_client_usr_get_size(pc, pkgid, get_type, event_cb, data,
2111 /* TODO: deprecate(or remove) */
2112 API int pkgmgr_client_usr_get_size(pkgmgr_client *pc, const char *pkgid,
2113 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
2114 void *data, uid_t uid)
2117 int ret = PKGMGR_R_ECOMM;
2118 char *req_key = NULL;
2119 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2120 struct cb_info *cb_info;
2122 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
2123 ERR("invalid parameter");
2124 return PKGMGR_R_EINVAL;
2127 if (client->pc_type != PC_REQUEST) {
2128 ERR("client->pc_type is not PC_REQUEST");
2129 return PKGMGR_R_EINVAL;
2133 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
2134 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
2136 get_type = PM_GET_PKG_SIZE_INFO;
2138 ret = pkgmgr_client_connection_send_request(client, "getsize",
2139 g_variant_new("(usi)", uid, pkgid, get_type), &result);
2140 if (ret != PKGMGR_R_OK) {
2141 ERR("request failed: %d", ret);
2145 g_variant_get(result, "(i&s)", &ret, &req_key);
2146 if (req_key == NULL) {
2147 g_variant_unref(result);
2148 return PKGMGR_R_ECOMM;
2150 if (ret != PKGMGR_R_OK) {
2151 g_variant_unref(result);
2155 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
2156 if (cb_info == NULL) {
2157 g_variant_unref(result);
2158 return PKGMGR_R_ENOMEM;
2160 g_variant_unref(result);
2161 ret = pkgmgr_client_connection_set_callback(client, cb_info);
2162 if (ret != PKGMGR_R_OK) {
2163 __free_cb_info(cb_info);
2166 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
2171 API int pkgmgr_client_usr_get_package_size_info(pkgmgr_client *pc,
2172 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
2173 void *user_data, uid_t uid)
2176 int ret = PKGMGR_R_ECOMM;
2177 char *req_key = NULL;
2179 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2180 struct cb_info *cb_info;
2182 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
2183 ERR("invalid parameter");
2184 return PKGMGR_R_EINVAL;
2187 if (client->pc_type != PC_REQUEST) {
2188 ERR("client->pc_type is not PC_REQUEST");
2189 return PKGMGR_R_EINVAL;
2192 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
2193 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
2195 get_type = PM_GET_PKG_SIZE_INFO;
2197 ret = pkgmgr_client_connection_send_request(client, "getsize",
2198 g_variant_new("(usi)", uid, pkgid, get_type), &result);
2199 if (ret != PKGMGR_R_OK) {
2200 ERR("request failed: %d", ret);
2204 g_variant_get(result, "(i&s)", &ret, &req_key);
2205 if (req_key == NULL) {
2206 g_variant_unref(result);
2207 return PKGMGR_R_ECOMM;
2209 if (ret != PKGMGR_R_OK) {
2210 g_variant_unref(result);
2214 cb_info = __create_size_info_cb_info(client, event_cb, user_data,
2216 if (cb_info == NULL) {
2217 g_variant_unref(result);
2218 return PKGMGR_R_ENOMEM;
2220 g_variant_unref(result);
2221 ret = pkgmgr_client_connection_set_callback(client, cb_info);
2222 if (ret != PKGMGR_R_OK) {
2223 __free_cb_info(cb_info);
2226 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
2231 API int pkgmgr_client_get_package_size_info(pkgmgr_client *pc,
2232 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
2235 return pkgmgr_client_usr_get_package_size_info(pc, pkgid, event_cb,
2236 user_data, _getuid());
2239 API int pkgmgr_client_usr_get_total_package_size_info(pkgmgr_client *pc,
2240 pkgmgr_total_pkg_size_info_receive_cb event_cb,
2241 void *user_data, uid_t uid)
2242 { /* total package size info */
2243 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL,
2244 (pkgmgr_pkg_size_info_receive_cb)event_cb,
2248 API int pkgmgr_client_get_total_package_size_info(pkgmgr_client *pc,
2249 pkgmgr_total_pkg_size_info_receive_cb event_cb, void *user_data)
2251 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL,
2252 (pkgmgr_pkg_size_info_receive_cb)event_cb,
2253 user_data, _getuid());
2256 API int pkgmgr_client_generate_license_request(pkgmgr_client *pc,
2257 const char *resp_data, char **req_data, char **license_url)
2263 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2265 if (pc == NULL || resp_data == NULL || req_data == NULL ||
2266 license_url == NULL) {
2267 ERR("invalid parameter");
2268 return PKGMGR_R_EINVAL;
2271 if (client->pc_type != PC_REQUEST) {
2272 ERR("client->pc_type is not PC_REQUEST");
2273 return PKGMGR_R_EINVAL;
2276 ret = pkgmgr_client_connection_send_request(client,
2277 "generate_license_request",
2278 g_variant_new("(s)", resp_data), &result);
2279 if (ret != PKGMGR_R_OK) {
2280 ERR("request failed: %d", ret);
2284 g_variant_get(result, "(i&s&s)", &ret, &data, &url);
2285 if (ret != PKGMGR_R_OK) {
2286 ERR("generate_license_request failed: %d", ret);
2287 g_variant_unref(result);
2291 *req_data = strdup(data);
2292 *license_url = strdup(url);
2294 g_variant_unref(result);
2299 API int pkgmgr_client_register_license(pkgmgr_client *pc, const char *resp_data)
2303 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2305 if (pc == NULL || resp_data == NULL) {
2306 ERR("invalid parameter");
2307 return PKGMGR_R_EINVAL;
2310 if (client->pc_type != PC_REQUEST) {
2311 ERR("client->pc_type is not PC_REQUEST");
2312 return PKGMGR_R_EINVAL;
2315 ret = pkgmgr_client_connection_send_request(client, "register_license",
2316 g_variant_new("(s)", resp_data), &result);
2317 if (ret != PKGMGR_R_OK) {
2318 ERR("request failed: %d", ret);
2322 g_variant_get(result, "(i)", &ret);
2323 g_variant_unref(result);
2324 if (ret != PKGMGR_R_OK)
2325 ERR("register license failed: %d", ret);
2330 API int pkgmgr_client_decrypt_package(pkgmgr_client *pc,
2331 const char *drm_file_path, const char *decrypted_file_path)
2335 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2337 if (pc == NULL || drm_file_path == NULL ||
2338 decrypted_file_path == NULL) {
2339 ERR("invalid parameter");
2340 return PKGMGR_R_EINVAL;
2343 if (client->pc_type != PC_REQUEST) {
2344 ERR("client->pc_type is not PC_REQUEST");
2345 return PKGMGR_R_EINVAL;
2348 ret = pkgmgr_client_connection_send_request(client, "decrypt_package",
2349 g_variant_new("(ss)", drm_file_path,
2350 decrypted_file_path), &result);
2351 if (ret != PKGMGR_R_OK) {
2352 ERR("request failed: %d", ret);
2356 g_variant_get(result, "(i)", &ret);
2357 g_variant_unref(result);
2358 if (ret != PKGMGR_R_OK)
2359 ERR("decrypt_package failed: %d", ret);
2364 API int pkgmgr_client_enable_splash_screen(pkgmgr_client *pc, const char *appid)
2366 return pkgmgr_client_usr_enable_splash_screen(pc, appid, _getuid());
2369 API int pkgmgr_client_usr_enable_splash_screen(pkgmgr_client *pc,
2370 const char *appid, uid_t uid)
2374 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2376 if (pc == NULL || appid == NULL) {
2377 ERR("Invalid parameter");
2378 return PKGMGR_R_EINVAL;
2381 ret = pkgmgr_client_connection_send_request(client,
2382 "enable_app_splash_screen",
2383 g_variant_new("(us)", uid, appid), &result);
2384 if (ret != PKGMGR_R_OK) {
2385 ERR("request failed: %d", ret);
2389 g_variant_get(result, "(i)", &ret);
2390 g_variant_unref(result);
2391 if (ret != PKGMGR_R_OK)
2392 ERR("enable splash screen failed: %d", ret);
2397 API int pkgmgr_client_disable_splash_screen(pkgmgr_client *pc,
2400 return pkgmgr_client_usr_disable_splash_screen(pc, appid,
2404 API int pkgmgr_client_usr_disable_splash_screen(pkgmgr_client *pc,
2405 const char *appid, uid_t uid)
2409 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2411 if (pc == NULL || appid == NULL) {
2412 ERR("Invalid parameter");
2413 return PKGMGR_R_EINVAL;
2416 ret = pkgmgr_client_connection_send_request(client,
2417 "disable_app_splash_screen",
2418 g_variant_new("(us)", uid, appid), &result);
2419 if (ret != PKGMGR_R_OK) {
2420 ERR("request failed: %d", ret);
2424 g_variant_get(result, "(i)", &ret);
2425 g_variant_unref(result);
2426 if (ret != PKGMGR_R_OK)
2427 ERR("disable splash screen failed: %d", ret);
2432 static int __set_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
2433 int mode, uid_t uid)
2436 int ret = PKGMGR_R_ECOMM;
2437 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2439 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
2440 ERR("invalid parameter");
2441 return PKGMGR_R_EINVAL;
2444 ret = pkgmgr_client_connection_send_request(client,
2445 "set_restriction_mode",
2446 g_variant_new("(usi)", uid, pkgid, mode), &result);
2447 if (ret != PKGMGR_R_OK) {
2448 ERR("request failed: %d", ret);
2452 g_variant_get(result, "(i)", &ret);
2453 g_variant_unref(result);
2458 API int pkgmgr_client_usr_set_pkg_restriction_mode(pkgmgr_client *pc,
2459 const char *pkgid, int mode, uid_t uid)
2461 return __set_pkg_restriction_mode(pc, pkgid, mode, uid);
2464 API int pkgmgr_client_set_pkg_restriction_mode(pkgmgr_client *pc,
2465 const char *pkgid, int mode)
2467 return pkgmgr_client_usr_set_pkg_restriction_mode(pc, pkgid, mode,
2471 static int __unset_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
2472 int mode, uid_t uid)
2475 int ret = PKGMGR_R_ECOMM;
2476 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2478 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
2479 ERR("invalid parameter");
2480 return PKGMGR_R_EINVAL;
2483 ret = pkgmgr_client_connection_send_request(client,
2484 "unset_restriction_mode",
2485 g_variant_new("(usi)", uid, pkgid, mode), &result);
2486 if (ret != PKGMGR_R_OK) {
2487 ERR("request failed: %d", ret);
2491 g_variant_get(result, "(i)", &ret);
2492 g_variant_unref(result);
2498 API int pkgmgr_client_usr_unset_pkg_restriction_mode(pkgmgr_client *pc,
2499 const char *pkgid, int mode, uid_t uid)
2501 return __unset_pkg_restriction_mode(pc, pkgid, mode, uid);
2504 API int pkgmgr_client_unset_pkg_restriction_mode(pkgmgr_client *pc,
2505 const char *pkgid, int mode)
2507 return pkgmgr_client_usr_unset_pkg_restriction_mode(pc, pkgid, mode,
2511 static int __get_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
2512 int *mode, uid_t uid)
2515 int ret = PKGMGR_R_ECOMM;
2517 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2519 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0) {
2520 ERR("invalid parameter");
2521 return PKGMGR_R_EINVAL;
2524 ret = pkgmgr_client_connection_send_request(client,
2525 "get_restriction_mode",
2526 g_variant_new("(us)", uid, pkgid), &result);
2527 if (ret != PKGMGR_R_OK) {
2528 ERR("request failed: %d", ret);
2532 g_variant_get(result, "(ii)", &m, &ret);
2533 g_variant_unref(result);
2534 if (ret != PKGMGR_R_OK)
2542 API int pkgmgr_client_usr_get_pkg_restriction_mode(pkgmgr_client *pc,
2543 const char *pkgid, int *mode, uid_t uid)
2545 return __get_pkg_restriction_mode(pc, pkgid, mode, uid);
2548 API int pkgmgr_client_get_pkg_restriction_mode(pkgmgr_client *pc,
2549 const char *pkgid, int *mode)
2551 return pkgmgr_client_usr_get_pkg_restriction_mode(pc, pkgid, mode,
2555 API int pkgmgr_client_usr_set_restriction_mode(pkgmgr_client *pc, int mode,
2559 int ret = PKGMGR_R_ECOMM;
2560 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2563 ERR("invalid parameter");
2564 return PKGMGR_R_EINVAL;
2567 ret = pkgmgr_client_connection_send_request(client,
2568 "set_restriction_mode",
2569 g_variant_new("(usi)", uid, "", mode), &result);
2570 if (ret != PKGMGR_R_OK) {
2571 ERR("request failed: %d", ret);
2575 g_variant_get(result, "(i)", &ret);
2576 g_variant_unref(result);
2581 API int pkgmgr_client_set_restriction_mode(pkgmgr_client *pc, int mode)
2583 return pkgmgr_client_usr_set_restriction_mode(pc, mode, _getuid());
2586 API int pkgmgr_client_usr_unset_restriction_mode(pkgmgr_client *pc, int mode,
2590 int ret = PKGMGR_R_ECOMM;
2591 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2594 ERR("invalid parameter");
2595 return PKGMGR_R_EINVAL;
2598 ret = pkgmgr_client_connection_send_request(client,
2599 "unset_restriction_mode",
2600 g_variant_new("(usi)", uid, "", mode), &result);
2601 if (ret != PKGMGR_R_OK) {
2602 ERR("request failed: %d", ret);
2606 g_variant_get(result, "(i)", &ret);
2607 g_variant_unref(result);
2612 API int pkgmgr_client_unset_restriction_mode(pkgmgr_client *pc, int mode)
2614 return pkgmgr_client_usr_unset_restriction_mode(pc, mode, _getuid());
2617 API int pkgmgr_client_usr_get_restriction_mode(pkgmgr_client *pc,
2618 int *mode, uid_t uid)
2621 int ret = PKGMGR_R_ECOMM;
2623 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2626 ERR("invalid parameter");
2627 return PKGMGR_R_EINVAL;
2630 ret = pkgmgr_client_connection_send_request(client,
2631 "get_restriction_mode",
2632 g_variant_new("(us)", uid, ""), &result);
2633 if (ret != PKGMGR_R_OK) {
2634 ERR("request failed: %d", ret);
2638 g_variant_get(result, "(ii)", &m, &ret);
2639 g_variant_unref(result);
2640 if (ret != PKGMGR_R_OK)
2648 API int pkgmgr_client_get_restriction_mode(pkgmgr_client *pc, int *mode)
2650 return pkgmgr_client_usr_get_restriction_mode(pc, mode, _getuid());
2653 API pkgmgr_info *pkgmgr_client_check_pkginfo_from_file(const char *pkg_path)
2656 pkg_plugin_set *plugin_set;
2657 package_manager_pkg_detail_info_t *info;
2660 if (pkg_path == NULL) {
2661 ERR("invalid parameter");
2665 pkg_type = __get_type_from_path(pkg_path);
2666 if (pkg_type == NULL) {
2667 ERR("cannot get pkg type");
2671 plugin_set = _package_manager_load_library(pkg_type);
2672 if (plugin_set == NULL) {
2673 ERR("failed to load library for %s", pkg_type);
2678 info = calloc(1, sizeof(package_manager_pkg_detail_info_t));
2680 ERR("out of memory");
2685 ret = plugin_set->get_pkg_detail_info_from_package(pkg_path, info);
2687 ERR("get_pkg_detail_info_from_package failed");
2695 return (pkgmgr_info *)info;
2698 API int pkgmgr_client_free_pkginfo(pkgmgr_info *info)
2700 package_manager_pkg_detail_info_t *pkg_info =
2701 (package_manager_pkg_detail_info_t *)info;
2704 ERR("invalid parameter");
2705 return PKGMGR_R_EINVAL;
2708 g_list_free_full(pkg_info->privilege_list, free);
2709 free(pkg_info->icon_buf);
2715 API int pkgmgr_client_usr_set_app_label(pkgmgr_client *pc, char *appid,
2716 char *label, uid_t uid)
2720 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2722 if (pc == NULL || appid == NULL || label == NULL) {
2723 ERR("Invalid parameter");
2724 return PKGMGR_R_EINVAL;
2727 ret = pkgmgr_client_connection_send_request(client,
2729 g_variant_new("(uss)", uid, appid, label), &result);
2730 if (ret != PKGMGR_R_OK) {
2731 ERR("Request failed: %d", ret);
2735 g_variant_get(result, "(i)", &ret);
2736 g_variant_unref(result);
2741 API int pkgmgr_client_set_app_label(pkgmgr_client *pc, char *appid, char *label)
2743 return pkgmgr_client_usr_set_app_label(pc, appid, label, _getuid());
2746 API int pkgmgr_client_usr_set_app_icon(pkgmgr_client *pc, char *appid,
2747 char *icon_path, uid_t uid)
2751 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2753 if (pc == NULL || appid == NULL || icon_path == NULL) {
2754 ERR("Invalid parameter");
2755 return PKGMGR_R_EINVAL;
2758 if (access(icon_path, F_OK) != 0) {
2759 ERR("failed to access: %s", icon_path);
2760 return PKGMGR_R_EINVAL;
2763 ret = pkgmgr_client_connection_send_request(client,
2765 g_variant_new("(uss)", uid, appid, icon_path), &result);
2766 if (ret != PKGMGR_R_OK) {
2767 ERR("Request failed: %d", ret);
2771 g_variant_get(result, "(i)", &ret);
2772 g_variant_unref(result);
2777 API int pkgmgr_client_set_app_icon(pkgmgr_client *pc, char *appid, char *icon_path)
2779 return pkgmgr_client_usr_set_app_icon(pc, appid, icon_path, _getuid());
2782 API int pkgmgr_client_set_debug_mode(pkgmgr_client *pc, bool debug_mode)
2784 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2787 ERR("invalid parameter");
2788 return PKGMGR_R_EINVAL;
2791 client->debug_mode = debug_mode;
2796 API int pkgmgr_client_set_skip_optimization(pkgmgr_client *pc, bool skip_optimization)
2798 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2801 ERR("invalid parameter");
2802 return PKGMGR_R_EINVAL;
2805 client->skip_optimization = skip_optimization;
2810 API int pkgmgr_client_usr_migrate_external_image(pkgmgr_client *pc,
2811 const char *pkgid, uid_t uid)
2814 int ret = PKGMGR_R_ECOMM;
2815 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2818 ERR("invalid parameter");
2819 return PKGMGR_R_EINVAL;
2822 ret = pkgmgr_client_connection_send_request(client,
2823 "migrate_external_image",
2824 g_variant_new("(us)", uid, pkgid), &result);
2825 if (ret != PKGMGR_R_OK) {
2826 ERR("request failed: %d", ret);
2830 g_variant_get(result, "(i)", &ret);
2831 g_variant_unref(result);
2836 API int pkgmgr_client_add_res_copy_path(pkgmgr_client *pc,
2837 const char *src_path, const char *dest_path)
2839 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2841 if (pc == NULL || src_path == NULL) {
2842 ERR("invalid parameter");
2843 return PKGMGR_R_EINVAL;
2846 if (client->res_copy_builder == NULL) {
2847 client->res_copy_builder =
2848 g_variant_builder_new(G_VARIANT_TYPE("a(ss)"));
2849 if (client->res_copy_builder == NULL) {
2850 ERR("out of memory");
2851 return PKGMGR_R_ENOMEM;
2855 g_variant_builder_add(client->res_copy_builder, "(ss)",
2856 src_path, dest_path ? dest_path : "");
2861 API int pkgmgr_client_res_copy(pkgmgr_client *pc,
2862 pkgmgr_res_handler event_cb, void *user_data)
2866 char *req_key = NULL;
2867 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2868 struct cb_info *cb_info;
2870 if (pc == NULL || event_cb == NULL) {
2871 ERR("invalid parameter");
2872 return PKGMGR_R_EINVAL;
2875 ret = pkgmgr_client_connection_send_request(client,
2877 g_variant_new("(a(ss))",
2878 client->res_copy_builder), &result);
2879 if (ret != PKGMGR_R_OK) {
2880 ERR("request failed: %d", ret);
2884 g_variant_get(result, "(i&s)", &ret, &req_key);
2885 if (req_key == NULL) {
2886 g_variant_unref(result);
2887 return PKGMGR_R_ECOMM;
2889 if (ret != PKGMGR_R_OK) {
2890 g_variant_unref(result);
2894 cb_info = __create_res_event_cb_info(client,
2895 event_cb, user_data, req_key);
2896 g_variant_unref(result);
2897 if (cb_info == NULL)
2898 return PKGMGR_R_ENOMEM;
2900 ret = pkgmgr_client_connection_set_callback(client, cb_info);
2901 if (ret != PKGMGR_R_OK) {
2902 __free_cb_info(cb_info);
2905 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
2907 return cb_info->req_id;
2910 API int pkgmgr_client_add_res_create_dir_path(pkgmgr_client *pc,
2911 const char *dir_path)
2913 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2915 if (pc == NULL || dir_path == NULL) {
2916 ERR("invalid parameter");
2917 return PKGMGR_R_EINVAL;
2920 if (client->res_create_dir_builder == NULL) {
2921 client->res_create_dir_builder =
2922 g_variant_builder_new(G_VARIANT_TYPE("as"));
2923 if (client->res_create_dir_builder == NULL) {
2924 ERR("out of memory");
2925 return PKGMGR_R_ENOMEM;
2929 g_variant_builder_add(client->res_create_dir_builder, "s", dir_path);
2934 API int pkgmgr_client_res_create_dir(pkgmgr_client *pc,
2935 pkgmgr_res_handler event_cb, void *user_data)
2939 char *req_key = NULL;
2940 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2941 struct cb_info *cb_info;
2943 if (pc == NULL || event_cb == NULL) {
2944 ERR("invalid parameter");
2945 return PKGMGR_R_EINVAL;
2948 ret = pkgmgr_client_connection_send_request(client,
2950 g_variant_new("(as)",
2951 client->res_create_dir_builder), &result);
2952 if (ret != PKGMGR_R_OK) {
2953 ERR("request failed: %d", ret);
2957 g_variant_get(result, "(i&s)", &ret, &req_key);
2958 if (req_key == NULL) {
2959 g_variant_unref(result);
2960 return PKGMGR_R_ECOMM;
2962 if (ret != PKGMGR_R_OK) {
2963 g_variant_unref(result);
2967 cb_info = __create_res_event_cb_info(client,
2968 event_cb, user_data, req_key);
2969 g_variant_unref(result);
2970 if (cb_info == NULL)
2971 return PKGMGR_R_ENOMEM;
2973 ret = pkgmgr_client_connection_set_callback(client, cb_info);
2974 if (ret != PKGMGR_R_OK) {
2975 __free_cb_info(cb_info);
2978 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
2980 return cb_info->req_id;
2983 API int pkgmgr_client_add_res_remove_path(pkgmgr_client *pc,
2984 const char *res_path)
2986 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2988 if (pc == NULL || res_path == NULL) {
2989 ERR("invalid parameter");
2990 return PKGMGR_R_EINVAL;
2993 if (client->res_remove_builder == NULL) {
2994 client->res_remove_builder =
2995 g_variant_builder_new(G_VARIANT_TYPE("as"));
2996 if (client->res_remove_builder == NULL) {
2997 ERR("out of memory");
2998 return PKGMGR_R_ENOMEM;
3002 g_variant_builder_add(client->res_remove_builder, "s", res_path);
3007 API int pkgmgr_client_res_remove(pkgmgr_client *pc,
3008 pkgmgr_res_handler event_cb, void *user_data)
3012 char *req_key = NULL;
3013 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
3014 struct cb_info *cb_info;
3016 if (pc == NULL || event_cb == NULL) {
3017 ERR("invalid parameter");
3018 return PKGMGR_R_EINVAL;
3021 ret = pkgmgr_client_connection_send_request(client,
3023 g_variant_new("(as)",
3024 client->res_remove_builder), &result);
3025 if (ret != PKGMGR_R_OK) {
3026 ERR("request failed: %d", ret);
3030 g_variant_get(result, "(i&s)", &ret, &req_key);
3031 if (req_key == NULL) {
3032 g_variant_unref(result);
3033 return PKGMGR_R_ECOMM;
3035 if (ret != PKGMGR_R_OK) {
3036 g_variant_unref(result);
3040 cb_info = __create_res_event_cb_info(client,
3041 event_cb, user_data, req_key);
3042 g_variant_unref(result);
3043 if (cb_info == NULL)
3044 return PKGMGR_R_ENOMEM;
3046 ret = pkgmgr_client_connection_set_callback(client, cb_info);
3047 if (ret != PKGMGR_R_OK) {
3048 __free_cb_info(cb_info);
3051 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
3053 return cb_info->req_id;
3056 API int pkgmgr_client_res_uninstall(pkgmgr_client *pc, const char *pkgid)
3058 return pkgmgr_client_res_usr_uninstall(pc, pkgid, _getuid());
3061 API int pkgmgr_client_res_usr_uninstall(pkgmgr_client *pc, const char *pkgid,
3065 int ret = PKGMGR_R_ECOMM;
3066 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
3068 if (pc == NULL || pkgid == NULL) {
3069 ERR("invalid parameter");
3070 return PKGMGR_R_EINVAL;
3073 ret = pkgmgr_client_connection_send_request(client,
3075 g_variant_new("(us)", uid, pkgid), &result);
3076 if (ret != PKGMGR_R_OK) {
3077 ERR("request failed: %d", ret);
3081 g_variant_get(result, "(i)", &ret);
3082 g_variant_unref(result);
3087 API pkgmgr_res_event_info *pkgmgr_res_event_info_new()
3089 pkgmgr_res_event_info_t *info;
3091 info = calloc(1, sizeof(pkgmgr_res_event_info_t));
3093 ERR("out of memory");
3097 return (pkgmgr_res_event_info *)info;
3100 static void __free_path_states(gpointer data)
3102 res_event_path_state_t *path_state = (res_event_path_state_t *)data;
3104 if (path_state == NULL)
3106 if (path_state->path)
3107 free(path_state->path);
3111 API int pkgmgr_res_event_info_free(pkgmgr_res_event_info *info)
3113 pkgmgr_res_event_info_t *event_info =
3114 (pkgmgr_res_event_info_t *)info;
3116 if (event_info == NULL) {
3117 ERR("invalid argument");
3118 return PKGMGR_R_EINVAL;
3121 if (event_info->path_states)
3122 g_list_free_full(event_info->path_states, __free_path_states);
3128 API int pkgmgr_res_event_info_set_error_code(pkgmgr_res_event_info *handle, int error_code)
3130 pkgmgr_res_event_info_t *info = handle;
3132 ERR("invalid parameter");
3133 return PKGMGR_R_EINVAL;
3136 info->error_code = error_code;
3140 API int pkgmgr_res_event_info_get_error_code(pkgmgr_res_event_info *handle, int *error_code)
3142 pkgmgr_res_event_info_t *info = handle;
3143 if (info == NULL || error_code == NULL) {
3144 ERR("invalid parameter");
3145 return PKGMGR_R_EINVAL;
3148 *error_code = info->error_code;
3152 API int pkgmgr_res_event_info_add_path_state(pkgmgr_res_event_info *handle,
3153 const char *path, pkgmgr_res_event_path_state state)
3155 pkgmgr_res_event_info_t *info = handle;
3156 res_event_path_state_t *path_state;
3158 if (info == NULL || path == NULL) {
3159 ERR("invalid parameter");
3160 return PKGMGR_R_EINVAL;
3163 path_state = calloc(1, sizeof(res_event_path_state_t));
3164 if (path_state == NULL) {
3165 ERR("out of memory");
3166 return PKGMGR_R_ENOMEM;
3169 path_state->path = strdup(path);
3170 if (path_state->path == NULL) {
3171 ERR("out of memory");
3173 return PKGMGR_R_ENOMEM;
3175 path_state->state = state;
3177 info->path_states = g_list_prepend(info->path_states , path_state);
3181 API int pkgmgr_res_event_info_foreach_path(pkgmgr_res_event_info *handle,
3182 pkgmgr_res_event_path_cb callback, void *user_data)
3184 pkgmgr_res_event_info_t *info = handle;
3186 res_event_path_state_t *path_state;
3189 ERR("invalid parameter");
3190 return PKGMGR_R_EINVAL;
3193 for (list = info->path_states; list != NULL; list = list->next) {
3194 path_state = (res_event_path_state_t *)list->data;
3195 if (callback(path_state->path, path_state->state,