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_copy_event_cb_info(
146 struct pkgmgr_client_t *client,
147 pkgmgr_res_copy_handler res_copy_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_copy_event_cb = res_copy_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_set_status_type(pkgmgr_client *pc, int status_type)
1814 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1817 ERR("invalid parameter");
1818 return PKGMGR_R_EINVAL;
1821 client->status_type = status_type;
1826 API int pkgmgr_client_listen_status(pkgmgr_client *pc, pkgmgr_handler event_cb,
1830 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1831 struct cb_info *cb_info;
1833 if (pc == NULL || event_cb == NULL) {
1834 ERR("invalid parameter");
1835 return PKGMGR_R_EINVAL;
1838 if (client->pc_type != PC_LISTENING) {
1839 ERR("client->pc_type is not PC_LISTENING");
1840 return PKGMGR_R_EINVAL;
1843 cb_info = __create_event_cb_info(client, event_cb, data, NULL);
1844 if (cb_info == NULL)
1845 return PKGMGR_R_ENOMEM;
1846 cb_info->status_type = client->status_type;
1847 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1848 if (ret != PKGMGR_R_OK) {
1849 __free_cb_info(cb_info);
1852 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1854 return cb_info->req_id;
1857 API int pkgmgr_client_listen_app_status(pkgmgr_client *pc,
1858 pkgmgr_app_handler app_event_cb, void *data)
1861 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1862 struct cb_info *cb_info;
1864 if (pc == NULL || app_event_cb == NULL) {
1865 ERR("invalid parameter");
1866 return PKGMGR_R_EINVAL;
1869 if (client->pc_type != PC_LISTENING) {
1870 ERR("client->pc_type is not PC_LISTENING");
1871 return PKGMGR_R_EINVAL;
1874 cb_info = __create_app_event_cb_info(client, app_event_cb, data, NULL);
1875 if (cb_info == NULL)
1876 return PKGMGR_R_ENOMEM;
1877 cb_info->status_type = client->status_type;
1878 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1879 if (ret != PKGMGR_R_OK) {
1880 __free_cb_info(cb_info);
1883 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1885 return cb_info->req_id;
1888 API int pkgmgr_client_listen_res_copy_status(pkgmgr_client *pc,
1889 pkgmgr_res_copy_handler event_cb, void *data)
1892 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1893 struct cb_info *cb_info;
1895 if (pc == NULL || event_cb == NULL) {
1896 ERR("invalid parameter");
1897 return PKGMGR_R_EINVAL;
1900 if (client->pc_type != PC_LISTENING) {
1901 ERR("client->pc_type is not PC_LISTENING");
1902 return PKGMGR_R_EINVAL;
1905 cb_info = __create_res_copy_event_cb_info(client, event_cb, data, NULL);
1906 if (cb_info == NULL)
1907 return PKGMGR_R_ENOMEM;
1908 cb_info->status_type = client->status_type;
1909 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1910 if (ret != PKGMGR_R_OK) {
1911 __free_cb_info(cb_info);
1914 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1916 return cb_info->req_id;
1919 API int pkgmgr_client_remove_listen_status(pkgmgr_client *pc)
1921 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1924 struct cb_info *cb_info;
1927 ERR("invalid parameter");
1928 return PKGMGR_R_EINVAL;
1931 /* unset all callback */
1932 tmp = client->cb_info_list;
1933 while (tmp != NULL) {
1935 cb_info = (struct cb_info *)tmp->data;
1936 pkgmgr_client_connection_unset_callback(pc, cb_info);
1937 client->cb_info_list = g_list_delete_link(client->cb_info_list,
1939 __free_cb_info(cb_info);
1946 API int pkgmgr_client_broadcast_status(pkgmgr_client *pc, const char *pkg_type,
1947 const char *pkgid, const char *key, const char *val)
1949 /* client cannot broadcast signal */
1953 /* TODO: deprecate(or remove) */
1954 API int pkgmgr_client_request_service(pkgmgr_request_service_type service_type,
1955 int service_mode, pkgmgr_client *pc, const char *pkg_type,
1956 const char *pkgid, const char *custom_info,
1957 pkgmgr_handler event_cb, void *data)
1959 return pkgmgr_client_usr_request_service(service_type, service_mode,
1960 pc, pkg_type, pkgid, _getuid(), custom_info, event_cb,
1964 API int pkgmgr_client_usr_request_service(
1965 pkgmgr_request_service_type service_type, int service_mode,
1966 pkgmgr_client *pc, const char *pkg_type, const char *pkgid,
1967 uid_t uid, const char *custom_info, pkgmgr_handler event_cb,
1972 /* Check for NULL value of service type */
1973 retvm_if(service_type > PM_REQUEST_MAX, PKGMGR_R_EINVAL, "service type is not defined\n");
1974 retvm_if(service_type < 0, PKGMGR_R_EINVAL, "service type is error\n");
1976 switch (service_type) {
1977 case PM_REQUEST_MOVE:
1978 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1979 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1980 tryvm_if((service_mode < PM_MOVE_TO_INTERNAL) || (service_mode > PM_MOVE_TO_EXTENDED), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1982 ret = __move_pkg_process(pc, pkgid, pkg_type, uid, (pkgmgr_move_type)service_mode, event_cb, data);
1985 case PM_REQUEST_GET_SIZE:
1986 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1987 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1988 tryvm_if((service_mode < PM_GET_TOTAL_SIZE) || (service_mode >= PM_GET_MAX), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1990 ret = __get_size_process(pc, pkgid, uid, (pkgmgr_getsize_type)service_mode, event_cb, data);
1993 case PM_REQUEST_KILL_APP:
1994 case PM_REQUEST_CHECK_APP:
1995 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1996 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1998 ret = __check_app_process(service_type, pc, pkgid, uid, data);
2000 ERR("__check_app_process fail \n");
2007 ERR("Wrong Request\n");
2017 API int pkgmgr_client_usr_clear_cache_dir(const char *pkgid, uid_t uid)
2021 struct pkgmgr_client_t *client;
2023 if (pkgid == NULL || uid == GLOBAL_USER) {
2024 ERR("invalid parameter");
2025 return PKGMGR_R_EINVAL;
2028 client = pkgmgr_client_new(PC_REQUEST);
2029 if (client == NULL) {
2030 ERR("out of memory");
2031 return PKGMGR_R_ENOMEM;
2034 ret = pkgmgr_client_connection_send_request(client, "clearcache",
2035 g_variant_new("(us)", uid, pkgid), &result);
2036 if (ret != PKGMGR_R_OK) {
2037 ERR("request failed: %d", ret);
2038 pkgmgr_client_free(client);
2042 g_variant_get(result, "(i)", &ret);
2043 g_variant_unref(result);
2044 pkgmgr_client_free(client);
2049 API int pkgmgr_client_clear_cache_dir(const char *pkgid)
2051 return pkgmgr_client_usr_clear_cache_dir(pkgid, _getuid());
2054 API int pkgmgr_client_clear_usr_all_cache_dir(uid_t uid)
2056 return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, uid);
2059 API int pkgmgr_client_clear_all_cache_dir(void)
2061 return pkgmgr_client_usr_clear_cache_dir(
2062 PKG_CLEAR_ALL_CACHE, _getuid());
2065 API int pkgmgr_client_get_size(pkgmgr_client *pc, const char *pkgid,
2066 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
2069 return pkgmgr_client_usr_get_size(pc, pkgid, get_type, event_cb, data,
2073 /* TODO: deprecate(or remove) */
2074 API int pkgmgr_client_usr_get_size(pkgmgr_client *pc, const char *pkgid,
2075 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
2076 void *data, uid_t uid)
2079 int ret = PKGMGR_R_ECOMM;
2080 char *req_key = NULL;
2081 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2082 struct cb_info *cb_info;
2084 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
2085 ERR("invalid parameter");
2086 return PKGMGR_R_EINVAL;
2089 if (client->pc_type != PC_REQUEST) {
2090 ERR("client->pc_type is not PC_REQUEST");
2091 return PKGMGR_R_EINVAL;
2095 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
2096 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
2098 get_type = PM_GET_PKG_SIZE_INFO;
2100 ret = pkgmgr_client_connection_send_request(client, "getsize",
2101 g_variant_new("(usi)", uid, pkgid, get_type), &result);
2102 if (ret != PKGMGR_R_OK) {
2103 ERR("request failed: %d", ret);
2107 g_variant_get(result, "(i&s)", &ret, &req_key);
2108 if (req_key == NULL) {
2109 g_variant_unref(result);
2110 return PKGMGR_R_ECOMM;
2112 if (ret != PKGMGR_R_OK) {
2113 g_variant_unref(result);
2117 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
2118 if (cb_info == NULL) {
2119 g_variant_unref(result);
2120 return PKGMGR_R_ENOMEM;
2122 g_variant_unref(result);
2123 ret = pkgmgr_client_connection_set_callback(client, cb_info);
2124 if (ret != PKGMGR_R_OK) {
2125 __free_cb_info(cb_info);
2128 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
2133 API int pkgmgr_client_usr_get_package_size_info(pkgmgr_client *pc,
2134 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
2135 void *user_data, uid_t uid)
2138 int ret = PKGMGR_R_ECOMM;
2139 char *req_key = NULL;
2141 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2142 struct cb_info *cb_info;
2144 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
2145 ERR("invalid parameter");
2146 return PKGMGR_R_EINVAL;
2149 if (client->pc_type != PC_REQUEST) {
2150 ERR("client->pc_type is not PC_REQUEST");
2151 return PKGMGR_R_EINVAL;
2154 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
2155 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
2157 get_type = PM_GET_PKG_SIZE_INFO;
2159 ret = pkgmgr_client_connection_send_request(client, "getsize",
2160 g_variant_new("(usi)", uid, pkgid, get_type), &result);
2161 if (ret != PKGMGR_R_OK) {
2162 ERR("request failed: %d", ret);
2166 g_variant_get(result, "(i&s)", &ret, &req_key);
2167 if (req_key == NULL) {
2168 g_variant_unref(result);
2169 return PKGMGR_R_ECOMM;
2171 if (ret != PKGMGR_R_OK) {
2172 g_variant_unref(result);
2176 cb_info = __create_size_info_cb_info(client, event_cb, user_data,
2178 if (cb_info == NULL) {
2179 g_variant_unref(result);
2180 return PKGMGR_R_ENOMEM;
2182 g_variant_unref(result);
2183 ret = pkgmgr_client_connection_set_callback(client, cb_info);
2184 if (ret != PKGMGR_R_OK) {
2185 __free_cb_info(cb_info);
2188 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
2193 API int pkgmgr_client_get_package_size_info(pkgmgr_client *pc,
2194 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
2197 return pkgmgr_client_usr_get_package_size_info(pc, pkgid, event_cb,
2198 user_data, _getuid());
2201 API int pkgmgr_client_usr_get_total_package_size_info(pkgmgr_client *pc,
2202 pkgmgr_total_pkg_size_info_receive_cb event_cb,
2203 void *user_data, uid_t uid)
2204 { /* total package size info */
2205 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL,
2206 (pkgmgr_pkg_size_info_receive_cb)event_cb,
2210 API int pkgmgr_client_get_total_package_size_info(pkgmgr_client *pc,
2211 pkgmgr_total_pkg_size_info_receive_cb event_cb, void *user_data)
2213 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL,
2214 (pkgmgr_pkg_size_info_receive_cb)event_cb,
2215 user_data, _getuid());
2218 API int pkgmgr_client_generate_license_request(pkgmgr_client *pc,
2219 const char *resp_data, char **req_data, char **license_url)
2225 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2227 if (pc == NULL || resp_data == NULL || req_data == NULL ||
2228 license_url == NULL) {
2229 ERR("invalid parameter");
2230 return PKGMGR_R_EINVAL;
2233 if (client->pc_type != PC_REQUEST) {
2234 ERR("client->pc_type is not PC_REQUEST");
2235 return PKGMGR_R_EINVAL;
2238 ret = pkgmgr_client_connection_send_request(client,
2239 "generate_license_request",
2240 g_variant_new("(s)", resp_data), &result);
2241 if (ret != PKGMGR_R_OK) {
2242 ERR("request failed: %d", ret);
2246 g_variant_get(result, "(i&s&s)", &ret, &data, &url);
2247 if (ret != PKGMGR_R_OK) {
2248 ERR("generate_license_request failed: %d", ret);
2249 g_variant_unref(result);
2253 *req_data = strdup(data);
2254 *license_url = strdup(url);
2256 g_variant_unref(result);
2261 API int pkgmgr_client_register_license(pkgmgr_client *pc, const char *resp_data)
2265 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2267 if (pc == NULL || resp_data == NULL) {
2268 ERR("invalid parameter");
2269 return PKGMGR_R_EINVAL;
2272 if (client->pc_type != PC_REQUEST) {
2273 ERR("client->pc_type is not PC_REQUEST");
2274 return PKGMGR_R_EINVAL;
2277 ret = pkgmgr_client_connection_send_request(client, "register_license",
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)", &ret);
2285 g_variant_unref(result);
2286 if (ret != PKGMGR_R_OK)
2287 ERR("register license failed: %d", ret);
2292 API int pkgmgr_client_decrypt_package(pkgmgr_client *pc,
2293 const char *drm_file_path, const char *decrypted_file_path)
2297 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2299 if (pc == NULL || drm_file_path == NULL ||
2300 decrypted_file_path == NULL) {
2301 ERR("invalid parameter");
2302 return PKGMGR_R_EINVAL;
2305 if (client->pc_type != PC_REQUEST) {
2306 ERR("client->pc_type is not PC_REQUEST");
2307 return PKGMGR_R_EINVAL;
2310 ret = pkgmgr_client_connection_send_request(client, "decrypt_package",
2311 g_variant_new("(ss)", drm_file_path,
2312 decrypted_file_path), &result);
2313 if (ret != PKGMGR_R_OK) {
2314 ERR("request failed: %d", ret);
2318 g_variant_get(result, "(i)", &ret);
2319 g_variant_unref(result);
2320 if (ret != PKGMGR_R_OK)
2321 ERR("decrypt_package failed: %d", ret);
2326 API int pkgmgr_client_enable_splash_screen(pkgmgr_client *pc, const char *appid)
2328 return pkgmgr_client_usr_enable_splash_screen(pc, appid, _getuid());
2331 API int pkgmgr_client_usr_enable_splash_screen(pkgmgr_client *pc,
2332 const char *appid, uid_t uid)
2336 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2338 if (pc == NULL || appid == NULL) {
2339 ERR("Invalid parameter");
2340 return PKGMGR_R_EINVAL;
2343 ret = pkgmgr_client_connection_send_request(client,
2344 "enable_app_splash_screen",
2345 g_variant_new("(us)", uid, appid), &result);
2346 if (ret != PKGMGR_R_OK) {
2347 ERR("request failed: %d", ret);
2351 g_variant_get(result, "(i)", &ret);
2352 g_variant_unref(result);
2353 if (ret != PKGMGR_R_OK)
2354 ERR("enable splash screen failed: %d", ret);
2359 API int pkgmgr_client_disable_splash_screen(pkgmgr_client *pc,
2362 return pkgmgr_client_usr_disable_splash_screen(pc, appid,
2366 API int pkgmgr_client_usr_disable_splash_screen(pkgmgr_client *pc,
2367 const char *appid, uid_t uid)
2371 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2373 if (pc == NULL || appid == NULL) {
2374 ERR("Invalid parameter");
2375 return PKGMGR_R_EINVAL;
2378 ret = pkgmgr_client_connection_send_request(client,
2379 "disable_app_splash_screen",
2380 g_variant_new("(us)", uid, appid), &result);
2381 if (ret != PKGMGR_R_OK) {
2382 ERR("request failed: %d", ret);
2386 g_variant_get(result, "(i)", &ret);
2387 g_variant_unref(result);
2388 if (ret != PKGMGR_R_OK)
2389 ERR("disable splash screen failed: %d", ret);
2394 static int __set_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
2395 int mode, uid_t uid)
2398 int ret = PKGMGR_R_ECOMM;
2399 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2401 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
2402 ERR("invalid parameter");
2403 return PKGMGR_R_EINVAL;
2406 ret = pkgmgr_client_connection_send_request(client,
2407 "set_restriction_mode",
2408 g_variant_new("(usi)", uid, pkgid, mode), &result);
2409 if (ret != PKGMGR_R_OK) {
2410 ERR("request failed: %d", ret);
2414 g_variant_get(result, "(i)", &ret);
2415 g_variant_unref(result);
2420 API int pkgmgr_client_usr_set_pkg_restriction_mode(pkgmgr_client *pc,
2421 const char *pkgid, int mode, uid_t uid)
2423 return __set_pkg_restriction_mode(pc, pkgid, mode, uid);
2426 API int pkgmgr_client_set_pkg_restriction_mode(pkgmgr_client *pc,
2427 const char *pkgid, int mode)
2429 return pkgmgr_client_usr_set_pkg_restriction_mode(pc, pkgid, mode,
2433 static int __unset_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
2434 int mode, uid_t uid)
2437 int ret = PKGMGR_R_ECOMM;
2438 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2440 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
2441 ERR("invalid parameter");
2442 return PKGMGR_R_EINVAL;
2445 ret = pkgmgr_client_connection_send_request(client,
2446 "unset_restriction_mode",
2447 g_variant_new("(usi)", uid, pkgid, mode), &result);
2448 if (ret != PKGMGR_R_OK) {
2449 ERR("request failed: %d", ret);
2453 g_variant_get(result, "(i)", &ret);
2454 g_variant_unref(result);
2460 API int pkgmgr_client_usr_unset_pkg_restriction_mode(pkgmgr_client *pc,
2461 const char *pkgid, int mode, uid_t uid)
2463 return __unset_pkg_restriction_mode(pc, pkgid, mode, uid);
2466 API int pkgmgr_client_unset_pkg_restriction_mode(pkgmgr_client *pc,
2467 const char *pkgid, int mode)
2469 return pkgmgr_client_usr_unset_pkg_restriction_mode(pc, pkgid, mode,
2473 static int __get_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
2474 int *mode, uid_t uid)
2477 int ret = PKGMGR_R_ECOMM;
2479 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2481 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0) {
2482 ERR("invalid parameter");
2483 return PKGMGR_R_EINVAL;
2486 ret = pkgmgr_client_connection_send_request(client,
2487 "get_restriction_mode",
2488 g_variant_new("(us)", uid, pkgid), &result);
2489 if (ret != PKGMGR_R_OK) {
2490 ERR("request failed: %d", ret);
2494 g_variant_get(result, "(ii)", &m, &ret);
2495 g_variant_unref(result);
2496 if (ret != PKGMGR_R_OK)
2504 API int pkgmgr_client_usr_get_pkg_restriction_mode(pkgmgr_client *pc,
2505 const char *pkgid, int *mode, uid_t uid)
2507 return __get_pkg_restriction_mode(pc, pkgid, mode, uid);
2510 API int pkgmgr_client_get_pkg_restriction_mode(pkgmgr_client *pc,
2511 const char *pkgid, int *mode)
2513 return pkgmgr_client_usr_get_pkg_restriction_mode(pc, pkgid, mode,
2517 API int pkgmgr_client_usr_set_restriction_mode(pkgmgr_client *pc, int mode,
2521 int ret = PKGMGR_R_ECOMM;
2522 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2525 ERR("invalid parameter");
2526 return PKGMGR_R_EINVAL;
2529 ret = pkgmgr_client_connection_send_request(client,
2530 "set_restriction_mode",
2531 g_variant_new("(usi)", uid, "", mode), &result);
2532 if (ret != PKGMGR_R_OK) {
2533 ERR("request failed: %d", ret);
2537 g_variant_get(result, "(i)", &ret);
2538 g_variant_unref(result);
2543 API int pkgmgr_client_set_restriction_mode(pkgmgr_client *pc, int mode)
2545 return pkgmgr_client_usr_set_restriction_mode(pc, mode, _getuid());
2548 API int pkgmgr_client_usr_unset_restriction_mode(pkgmgr_client *pc, int mode,
2552 int ret = PKGMGR_R_ECOMM;
2553 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2556 ERR("invalid parameter");
2557 return PKGMGR_R_EINVAL;
2560 ret = pkgmgr_client_connection_send_request(client,
2561 "unset_restriction_mode",
2562 g_variant_new("(usi)", uid, "", mode), &result);
2563 if (ret != PKGMGR_R_OK) {
2564 ERR("request failed: %d", ret);
2568 g_variant_get(result, "(i)", &ret);
2569 g_variant_unref(result);
2574 API int pkgmgr_client_unset_restriction_mode(pkgmgr_client *pc, int mode)
2576 return pkgmgr_client_usr_unset_restriction_mode(pc, mode, _getuid());
2579 API int pkgmgr_client_usr_get_restriction_mode(pkgmgr_client *pc,
2580 int *mode, uid_t uid)
2583 int ret = PKGMGR_R_ECOMM;
2585 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2588 ERR("invalid parameter");
2589 return PKGMGR_R_EINVAL;
2592 ret = pkgmgr_client_connection_send_request(client,
2593 "get_restriction_mode",
2594 g_variant_new("(us)", uid, ""), &result);
2595 if (ret != PKGMGR_R_OK) {
2596 ERR("request failed: %d", ret);
2600 g_variant_get(result, "(ii)", &m, &ret);
2601 g_variant_unref(result);
2602 if (ret != PKGMGR_R_OK)
2610 API int pkgmgr_client_get_restriction_mode(pkgmgr_client *pc, int *mode)
2612 return pkgmgr_client_usr_get_restriction_mode(pc, mode, _getuid());
2615 API pkgmgr_info *pkgmgr_client_check_pkginfo_from_file(const char *pkg_path)
2618 pkg_plugin_set *plugin_set;
2619 package_manager_pkg_detail_info_t *info;
2622 if (pkg_path == NULL) {
2623 ERR("invalid parameter");
2627 pkg_type = __get_type_from_path(pkg_path);
2628 if (pkg_type == NULL) {
2629 ERR("cannot get pkg type");
2633 plugin_set = _package_manager_load_library(pkg_type);
2634 if (plugin_set == NULL) {
2635 ERR("failed to load library for %s", pkg_type);
2640 info = calloc(1, sizeof(package_manager_pkg_detail_info_t));
2642 ERR("out of memory");
2647 ret = plugin_set->get_pkg_detail_info_from_package(pkg_path, info);
2649 ERR("get_pkg_detail_info_from_package failed");
2657 return (pkgmgr_info *)info;
2660 API int pkgmgr_client_free_pkginfo(pkgmgr_info *info)
2662 package_manager_pkg_detail_info_t *pkg_info =
2663 (package_manager_pkg_detail_info_t *)info;
2666 ERR("invalid parameter");
2667 return PKGMGR_R_EINVAL;
2670 g_list_free_full(pkg_info->privilege_list, free);
2671 free(pkg_info->icon_buf);
2677 API int pkgmgr_client_usr_set_app_label(pkgmgr_client *pc, char *appid,
2678 char *label, uid_t uid)
2682 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2684 if (pc == NULL || appid == NULL || label == NULL) {
2685 ERR("Invalid parameter");
2686 return PKGMGR_R_EINVAL;
2689 ret = pkgmgr_client_connection_send_request(client,
2691 g_variant_new("(uss)", uid, appid, label), &result);
2692 if (ret != PKGMGR_R_OK) {
2693 ERR("Request failed: %d", ret);
2697 g_variant_get(result, "(i)", &ret);
2698 g_variant_unref(result);
2703 API int pkgmgr_client_set_app_label(pkgmgr_client *pc, char *appid, char *label)
2705 return pkgmgr_client_usr_set_app_label(pc, appid, label, _getuid());
2708 API int pkgmgr_client_usr_set_app_icon(pkgmgr_client *pc, char *appid,
2709 char *icon_path, uid_t uid)
2713 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2715 if (pc == NULL || appid == NULL || icon_path == NULL) {
2716 ERR("Invalid parameter");
2717 return PKGMGR_R_EINVAL;
2720 if (access(icon_path, F_OK) != 0) {
2721 ERR("failed to access: %s", icon_path);
2722 return PKGMGR_R_EINVAL;
2725 ret = pkgmgr_client_connection_send_request(client,
2727 g_variant_new("(uss)", uid, appid, icon_path), &result);
2728 if (ret != PKGMGR_R_OK) {
2729 ERR("Request failed: %d", ret);
2733 g_variant_get(result, "(i)", &ret);
2734 g_variant_unref(result);
2739 API int pkgmgr_client_set_app_icon(pkgmgr_client *pc, char *appid, char *icon_path)
2741 return pkgmgr_client_usr_set_app_icon(pc, appid, icon_path, _getuid());
2744 API int pkgmgr_client_set_debug_mode(pkgmgr_client *pc, bool debug_mode)
2746 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2749 ERR("invalid parameter");
2750 return PKGMGR_R_EINVAL;
2753 client->debug_mode = debug_mode;
2758 API int pkgmgr_client_set_skip_optimization(pkgmgr_client *pc, bool skip_optimization)
2760 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2763 ERR("invalid parameter");
2764 return PKGMGR_R_EINVAL;
2767 client->skip_optimization = skip_optimization;
2772 API int pkgmgr_client_usr_migrate_external_image(pkgmgr_client *pc,
2773 const char *pkgid, uid_t uid)
2776 int ret = PKGMGR_R_ECOMM;
2777 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2780 ERR("invalid parameter");
2781 return PKGMGR_R_EINVAL;
2784 ret = pkgmgr_client_connection_send_request(client,
2785 "migrate_external_image",
2786 g_variant_new("(us)", uid, pkgid), &result);
2787 if (ret != PKGMGR_R_OK) {
2788 ERR("request failed: %d", ret);
2792 g_variant_get(result, "(i)", &ret);
2793 g_variant_unref(result);
2798 API int pkgmgr_client_add_res_copy_path(pkgmgr_client *pc,
2799 const char *src_path, const char *dest_path)
2801 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2803 if (pc == NULL || src_path == NULL) {
2804 ERR("invalid parameter");
2805 return PKGMGR_R_EINVAL;
2808 if (client->res_copy_builder == NULL) {
2809 client->res_copy_builder =
2810 g_variant_builder_new(G_VARIANT_TYPE("a(ss)"));
2811 if (client->res_copy_builder == NULL) {
2812 ERR("out of memory");
2813 return PKGMGR_R_ENOMEM;
2817 g_variant_builder_add(client->res_copy_builder, "(ss)",
2818 src_path, dest_path ? dest_path : "");
2823 API int pkgmgr_client_res_copy(pkgmgr_client *pc,
2824 pkgmgr_res_copy_handler event_cb, void *user_data)
2828 char *req_key = NULL;
2829 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2830 struct cb_info *cb_info;
2832 if (pc == NULL || event_cb == NULL) {
2833 ERR("invalid parameter");
2834 return PKGMGR_R_EINVAL;
2837 ret = pkgmgr_client_connection_send_request(client,
2839 g_variant_new("(a(ss))",
2840 client->res_copy_builder), &result);
2841 if (ret != PKGMGR_R_OK) {
2842 ERR("request failed: %d", ret);
2846 g_variant_get(result, "(i&s)", &ret, &req_key);
2847 if (req_key == NULL) {
2848 g_variant_unref(result);
2849 return PKGMGR_R_ECOMM;
2851 if (ret != PKGMGR_R_OK) {
2852 g_variant_unref(result);
2856 cb_info = __create_res_copy_event_cb_info(client,
2857 event_cb, user_data, req_key);
2858 g_variant_unref(result);
2859 if (cb_info == NULL)
2860 return PKGMGR_R_ENOMEM;
2862 ret = pkgmgr_client_connection_set_callback(client, cb_info);
2863 if (ret != PKGMGR_R_OK) {
2864 __free_cb_info(cb_info);
2867 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
2869 return cb_info->req_id;
2872 API int pkgmgr_client_add_res_create_dir_path(pkgmgr_client *pc,
2873 const char *dir_path)
2875 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2877 if (pc == NULL || dir_path == NULL) {
2878 ERR("invalid parameter");
2879 return PKGMGR_R_EINVAL;
2882 if (client->res_create_dir_builder == NULL) {
2883 client->res_create_dir_builder =
2884 g_variant_builder_new(G_VARIANT_TYPE("as"));
2885 if (client->res_create_dir_builder == NULL) {
2886 ERR("out of memory");
2887 return PKGMGR_R_ENOMEM;
2891 g_variant_builder_add(client->res_create_dir_builder, "s", dir_path);
2896 API int pkgmgr_client_res_create_dir(pkgmgr_client *pc,
2897 pkgmgr_res_copy_handler event_cb, void *user_data)
2901 char *req_key = NULL;
2902 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2903 struct cb_info *cb_info;
2905 if (pc == NULL || event_cb == NULL) {
2906 ERR("invalid parameter");
2907 return PKGMGR_R_EINVAL;
2910 ret = pkgmgr_client_connection_send_request(client,
2912 g_variant_new("(as)",
2913 client->res_create_dir_builder), &result);
2914 if (ret != PKGMGR_R_OK) {
2915 ERR("request failed: %d", ret);
2919 g_variant_get(result, "(i&s)", &ret, &req_key);
2920 if (req_key == NULL) {
2921 g_variant_unref(result);
2922 return PKGMGR_R_ECOMM;
2924 if (ret != PKGMGR_R_OK) {
2925 g_variant_unref(result);
2929 cb_info = __create_res_copy_event_cb_info(client,
2930 event_cb, user_data, req_key);
2931 g_variant_unref(result);
2932 if (cb_info == NULL)
2933 return PKGMGR_R_ENOMEM;
2935 ret = pkgmgr_client_connection_set_callback(client, cb_info);
2936 if (ret != PKGMGR_R_OK) {
2937 __free_cb_info(cb_info);
2940 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
2942 return cb_info->req_id;
2945 API int pkgmgr_client_add_res_remove_path(pkgmgr_client *pc,
2946 const char *res_path)
2948 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2950 if (pc == NULL || res_path == NULL) {
2951 ERR("invalid parameter");
2952 return PKGMGR_R_EINVAL;
2955 if (client->res_remove_builder == NULL) {
2956 client->res_remove_builder =
2957 g_variant_builder_new(G_VARIANT_TYPE("as"));
2958 if (client->res_remove_builder == NULL) {
2959 ERR("out of memory");
2960 return PKGMGR_R_ENOMEM;
2964 g_variant_builder_add(client->res_remove_builder, "s", res_path);
2969 API int pkgmgr_client_res_remove(pkgmgr_client *pc,
2970 pkgmgr_res_copy_handler event_cb, void *user_data)
2974 char *req_key = NULL;
2975 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2976 struct cb_info *cb_info;
2978 if (pc == NULL || event_cb == NULL) {
2979 ERR("invalid parameter");
2980 return PKGMGR_R_EINVAL;
2983 ret = pkgmgr_client_connection_send_request(client,
2985 g_variant_new("(as)",
2986 client->res_remove_builder), &result);
2987 if (ret != PKGMGR_R_OK) {
2988 ERR("request failed: %d", ret);
2992 g_variant_get(result, "(i&s)", &ret, &req_key);
2993 if (req_key == NULL) {
2994 g_variant_unref(result);
2995 return PKGMGR_R_ECOMM;
2997 if (ret != PKGMGR_R_OK) {
2998 g_variant_unref(result);
3002 cb_info = __create_res_copy_event_cb_info(client,
3003 event_cb, user_data, req_key);
3004 g_variant_unref(result);
3005 if (cb_info == NULL)
3006 return PKGMGR_R_ENOMEM;
3008 ret = pkgmgr_client_connection_set_callback(client, cb_info);
3009 if (ret != PKGMGR_R_OK) {
3010 __free_cb_info(cb_info);
3013 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
3015 return cb_info->req_id;
3018 API int pkgmgr_client_res_uninstall(pkgmgr_client *pc, const char *pkgid)
3020 return pkgmgr_client_res_usr_uninstall(pc, pkgid, _getuid());
3023 API int pkgmgr_client_res_usr_uninstall(pkgmgr_client *pc, const char *pkgid,
3027 int ret = PKGMGR_R_ECOMM;
3028 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
3030 if (pc == NULL || pkgid == NULL) {
3031 ERR("invalid parameter");
3032 return PKGMGR_R_EINVAL;
3035 ret = pkgmgr_client_connection_send_request(client,
3037 g_variant_new("(us)", uid, pkgid), &result);
3038 if (ret != PKGMGR_R_OK) {
3039 ERR("request failed: %d", ret);
3043 g_variant_get(result, "(i)", &ret);
3044 g_variant_unref(result);
3049 API pkgmgr_res_event_info *pkgmgr_res_event_info_new()
3051 pkgmgr_res_event_info_t *info;
3053 info = calloc(1, sizeof(pkgmgr_res_event_info_t));
3055 ERR("out of memory");
3059 return (pkgmgr_res_event_info *)info;
3062 API int pkgmgr_res_event_info_free(pkgmgr_res_event_info *info)
3064 pkgmgr_res_event_info_t *event_info =
3065 (pkgmgr_res_event_info_t *)info;
3067 if (event_info == NULL) {
3068 ERR("invalid argument");
3069 return PKGMGR_R_EINVAL;
3077 API int pkgmgr_res_event_info_set_error_code(pkgmgr_res_event_info *handle, int error_code)
3079 pkgmgr_res_event_info_t *info = handle;
3081 ERR("invalid parameter");
3082 return PKGMGR_R_EINVAL;
3085 info->error_code = error_code;
3089 API int pkgmgr_res_event_info_get_error_code(pkgmgr_res_event_info *handle, int *error_code)
3091 pkgmgr_res_event_info_t *info = handle;
3092 if (info == NULL || error_code == NULL) {
3093 ERR("invalid parameter");
3094 return PKGMGR_R_EINVAL;
3097 *error_code = info->error_code;