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.
36 #include <pkgmgr-info.h>
37 #include <iniparser.h>
38 /* For multi-user support */
39 #include <tzplatform_config.h>
41 #include "package-manager.h"
42 #include "pkgmgr_client_debug.h"
43 #include "pkgmgr_client_internal.h"
45 /* API export macro */
47 #define API __attribute__ ((visibility("default")))
50 #define BINSH_NAME "/bin/sh"
53 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
54 #define REGULAR_USER 5000
56 static inline uid_t _getuid(void)
60 if (uid < REGULAR_USER)
66 static int _get_request_id()
68 static int internal_req_id = 1;
70 return internal_req_id++;
73 static struct cb_info *__create_event_cb_info(struct pkgmgr_client_t *client,
74 pkgmgr_handler event_cb, void *data, const char *req_key)
76 struct cb_info *cb_info;
78 cb_info = calloc(1, sizeof(struct cb_info));
79 if (cb_info == NULL) {
83 cb_info->client = client;
84 cb_info->event_cb = event_cb;
86 cb_info->req_id = _get_request_id();
87 if (req_key != NULL) {
88 cb_info->req_key = strdup(req_key);
89 if (cb_info->req_key == NULL) {
99 static struct cb_info *__create_app_event_cb_info(
100 struct pkgmgr_client_t *client, pkgmgr_app_handler app_event_cb,
101 void *data, const char *req_key)
103 struct cb_info *cb_info;
105 cb_info = calloc(1, sizeof(struct cb_info));
106 if (cb_info == NULL) {
107 ERR("out of memory");
110 cb_info->client = client;
111 cb_info->app_event_cb = app_event_cb;
112 cb_info->data = data;
113 cb_info->req_id = _get_request_id();
114 if (req_key != NULL) {
115 cb_info->req_key = strdup(req_key);
116 if (cb_info->req_key == NULL) {
117 ERR("out of memory");
126 static struct cb_info *__create_size_info_cb_info(
127 struct pkgmgr_client_t *client,
128 pkgmgr_pkg_size_info_receive_cb size_info_cb,
129 void *data, const char *req_key)
131 struct cb_info *cb_info;
133 cb_info = calloc(1, sizeof(struct cb_info));
134 if (cb_info == NULL) {
135 ERR("out of memory");
138 cb_info->client = client;
139 cb_info->size_info_cb = size_info_cb;
140 cb_info->data = data;
141 cb_info->req_id = _get_request_id();
142 if (req_key != NULL) {
143 cb_info->req_key = strdup(req_key);
144 if (cb_info->req_key == NULL) {
145 ERR("out of memory");
154 static void __free_cb_info(struct cb_info *cb_info)
156 free(cb_info->req_key);
160 static int __get_size_process(pkgmgr_client *pc, const char *pkgid, uid_t uid,
161 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
165 int ret = PKGMGR_R_ECOMM;
166 long long size_info = 0;
167 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
169 if (pc == NULL || pkgid == NULL) {
170 ERR("invalid parameter");
171 return PKGMGR_R_EINVAL;
174 if (client->pc_type != PC_REQUEST) {
175 ERR("client->pc_type is not PC_REQUEST");
176 return PKGMGR_R_EINVAL;
179 ret = pkgmgr_client_connection_send_request(client, "getsize_sync",
180 g_variant_new("(usi)", uid, pkgid, get_type), &result);
181 if (ret != PKGMGR_R_OK) {
182 ERR("request failed: %d", ret);
186 g_variant_get(result, "(ix)", &ret, &size_info);
187 if (ret != PKGMGR_R_OK) {
188 ERR("request result failed: %d", ret);
189 g_variant_unref(result);
194 ERR("invalid size_info=(%lld)", size_info);
197 ret = (int)size_info;
198 DBG("size_info(%lld), return size(%d)", size_info, ret);
201 g_variant_unref(result);
206 static int __move_pkg_process(pkgmgr_client *pc, const char *pkgid,
207 const char *pkg_type, uid_t uid, pkgmgr_move_type move_type,
208 pkgmgr_handler event_cb, void *data)
212 ret = pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type, event_cb, data, uid);
214 ERR("move request failed");
221 static int __check_app_process(pkgmgr_request_service_type service_type,
222 pkgmgr_client *pc, const char *pkgid, uid_t uid, void *data)
225 int ret = PKGMGR_R_ECOMM;
226 pkgmgrinfo_pkginfo_h handle;
228 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
230 retvm_if(client->pc_type != PC_REQUEST, PKGMGR_R_EINVAL, "client->pc_type is not PC_REQUEST\n");
232 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
233 if (ret != PMINFO_R_OK) {
234 ERR("pkgmgrinfo_pkginfo_get_pkginfo failed");
235 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
236 return PKGMGR_R_ERROR;
239 if (service_type == PM_REQUEST_KILL_APP)
240 ret = pkgmgr_client_connection_send_request(client, "kill",
241 g_variant_new("(us)", uid, pkgid), &result);
242 else if (service_type == PM_REQUEST_CHECK_APP)
243 ret = pkgmgr_client_connection_send_request(client, "check",
244 g_variant_new("(us)", uid, pkgid), &result);
245 if (ret != PKGMGR_R_OK) {
246 ERR("request failed: %d", ret);
250 g_variant_get(result, "(ii)", &ret, &pid);
251 g_variant_unref(result);
252 if (ret != PKGMGR_R_OK) {
253 ERR("request failed, ret=%d", ret);
259 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
265 static int __request_size_info(pkgmgr_client *pc, uid_t uid)
268 int ret = PKGMGR_R_ECOMM;
269 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
272 ERR("invalid parameter");
273 return PKGMGR_R_EINVAL;
276 if (client->pc_type != PC_REQUEST) {
277 ERR("client->pc_type is not PC_REQUEST");
278 return PKGMGR_R_EINVAL;
281 ret = pkgmgr_client_connection_send_request(client, "getsize",
282 g_variant_new("(usi)", uid, "size_info",
283 PM_GET_SIZE_INFO), &result);
284 if (ret != PKGMGR_R_OK) {
285 ERR("request failed: %d", ret);
289 /* just free result here because it cannot return result(reqkey) */
290 g_variant_unref(result);
295 API pkgmgr_client *pkgmgr_client_new(pkgmgr_client_type pc_type)
297 struct pkgmgr_client_t *client;
299 if (pc_type == PC_BROADCAST) {
300 ERR("broadcast type is not supported");
304 if (pc_type != PC_REQUEST && pc_type != PC_LISTENING) {
305 ERR("invalid parameter");
309 client = calloc(1, sizeof(struct pkgmgr_client_t));
310 if (client == NULL) {
311 ERR("out of memory");
315 client->pc_type = pc_type;
316 client->status_type = PKGMGR_CLIENT_STATUS_ALL;
318 if (pkgmgr_client_connection_connect(client) != PKGMGR_R_OK) {
323 return (pkgmgr_client *)client;
326 API int pkgmgr_client_free(pkgmgr_client *pc)
328 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
331 ERR("invalid argument");
332 return PKGMGR_R_EINVAL;
335 pkgmgr_client_remove_listen_status(client);
336 pkgmgr_client_connection_disconnect(client);
337 if (client->tep_path)
338 free(client->tep_path);
344 struct manifest_and_type type_map[] = {
345 { "res/wgt/config.xml", "wgt" },
346 { "config.xml", "wgt" },
347 { "tizen-manifest.xml", "tpk" },
351 static char *__get_type_from_path(const char *pkg_path)
353 const char *type = NULL;
357 uf = unzOpen(pkg_path);
359 ERR("failed to open zip file %s", pkg_path);
363 for (i = 0; type_map[i].manifest != NULL; i++) {
364 if (unzLocateFile(uf, type_map[i].manifest, 0) == UNZ_OK) {
365 DBG("pkgtype of %s: [%s]", pkg_path, type_map[i].type);
366 type = type_map[i].type;
372 return type ? strdup(type) : NULL;
375 API int pkgmgr_client_set_tep_path(pkgmgr_client *pc, const char *tep_path,
378 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *) pc;
380 if (pc == NULL || tep_path == NULL) {
381 ERR("invalied parameter");
382 return PKGMGR_R_EINVAL;
385 if (client->tep_path)
386 free(client->tep_path);
388 client->tep_path = strdup(tep_path);
389 client->tep_move = tep_move;
394 API int pkgmgr_client_usr_install(pkgmgr_client *pc, const char *pkg_type,
395 const char *descriptor_path, const char *pkg_path,
396 const char *optional_data, pkgmgr_mode mode,
397 pkgmgr_handler event_cb, void *data, uid_t uid)
400 int ret = PKGMGR_R_ECOMM;
401 char *req_key = NULL;
402 GVariantBuilder *builder = NULL;
403 GVariant *args = NULL;
404 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
405 struct cb_info *cb_info;
407 if (pc == NULL || pkg_path == NULL) {
408 ERR("invalid parameter");
409 return PKGMGR_R_EINVAL;
412 if (client->pc_type != PC_REQUEST) {
413 ERR("client type is not PC_REQUEST");
414 return PKGMGR_R_EINVAL;
417 if (access(pkg_path, F_OK) != 0) {
418 ERR("failed to access: %s", pkg_path);
419 return PKGMGR_R_EINVAL;
422 if (client->tep_path != NULL && access(client->tep_path, F_OK) != 0) {
423 ERR("failed to access: %s", client->tep_path);
424 return PKGMGR_R_EINVAL;
427 /* build arguments */
428 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
429 if (client->tep_path) {
430 g_variant_builder_add(builder, "s", "-e");
431 g_variant_builder_add(builder, "s", client->tep_path);
432 g_variant_builder_add(builder, "s", "-M");
433 /* TODO: revise tep_move */
434 g_variant_builder_add(builder, "s",
435 client->tep_move ? "tep_move" : "tep_copy");
437 if (client->debug_mode)
438 g_variant_builder_add(builder, "s", "-G");
440 args = g_variant_new("as", builder);
441 g_variant_builder_unref(builder);
443 ret = pkgmgr_client_connection_send_request(client, "install",
444 g_variant_new("(uss@as)", uid, pkg_type ? pkg_type : "",
447 if (ret != PKGMGR_R_OK) {
448 ERR("request failed: %d", ret);
452 g_variant_get(result, "(i&s)", &ret, &req_key);
453 if (req_key == NULL) {
454 g_variant_unref(result);
455 return PKGMGR_R_ECOMM;
457 if (ret != PKGMGR_R_OK) {
458 g_variant_unref(result);
462 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
463 if (cb_info == NULL) {
464 g_variant_unref(result);
465 return PKGMGR_R_ENOMEM;
467 g_variant_unref(result);
468 ret = pkgmgr_client_connection_set_callback(client, cb_info);
469 if (ret != PKGMGR_R_OK) {
470 __free_cb_info(cb_info);
473 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
475 return cb_info->req_id;
478 API int pkgmgr_client_install(pkgmgr_client *pc, const char *pkg_type,
479 const char *descriptor_path, const char *pkg_path,
480 const char *optional_data, pkgmgr_mode mode,
481 pkgmgr_handler event_cb, void *data)
483 return pkgmgr_client_usr_install(pc, pkg_type, descriptor_path,
484 pkg_path, optional_data, mode, event_cb, data,
488 API int pkgmgr_client_reinstall(pkgmgr_client *pc, const char *pkg_type,
489 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
490 pkgmgr_handler event_cb, void *data)
492 return pkgmgr_client_usr_reinstall(pc, pkg_type, pkgid, optional_data,
493 mode, event_cb, data, _getuid());
496 API int pkgmgr_client_usr_reinstall(pkgmgr_client *pc, const char *pkg_type,
497 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
498 pkgmgr_handler event_cb, void *data, uid_t uid)
501 int ret = PKGMGR_R_ECOMM;
502 char *req_key = NULL;
503 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
504 struct cb_info *cb_info;
506 if (pc == NULL || pkgid == NULL) {
507 ERR("invalid parameter");
508 return PKGMGR_R_EINVAL;
511 if (client->pc_type != PC_REQUEST) {
512 ERR("client->pc_type is not PC_REQUEST");
513 return PKGMGR_R_EINVAL;
516 ret = pkgmgr_client_connection_send_request(client, "reinstall",
517 g_variant_new("(us)", uid, pkgid), &result);
518 if (ret != PKGMGR_R_OK) {
519 ERR("request failed: %d", ret);
523 g_variant_get(result, "(i&s)", &ret, &req_key);
524 if (req_key == NULL) {
525 g_variant_unref(result);
526 return PKGMGR_R_ECOMM;
528 if (ret != PKGMGR_R_OK) {
529 g_variant_unref(result);
533 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
534 if (cb_info == NULL) {
535 g_variant_unref(result);
536 return PKGMGR_R_ENOMEM;
538 g_variant_unref(result);
539 ret = pkgmgr_client_connection_set_callback(client, cb_info);
540 if (ret != PKGMGR_R_OK) {
541 __free_cb_info(cb_info);
544 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
546 return cb_info->req_id;
549 API int pkgmgr_client_usr_mount_install(pkgmgr_client *pc, const char *pkg_type,
550 const char *descriptor_path, const char *pkg_path,
551 const char *optional_data, pkgmgr_mode mode,
552 pkgmgr_handler event_cb, void *data, uid_t uid)
555 int ret = PKGMGR_R_ECOMM;
556 char *req_key = NULL;
557 GVariantBuilder *builder = NULL;
558 GVariant *args = NULL;
559 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
560 struct cb_info *cb_info;
562 if (pc == NULL || pkg_path == NULL) {
563 ERR("invalid parameter");
564 return PKGMGR_R_EINVAL;
567 if (client->pc_type != PC_REQUEST) {
568 ERR("client->pc_type is not PC_REQUEST");
569 return PKGMGR_R_EINVAL;
572 if (access(pkg_path, F_OK) != 0) {
573 ERR("failed to access: %s", pkg_path);
574 return PKGMGR_R_EINVAL;
577 if (client->tep_path != NULL && access(client->tep_path, F_OK) != 0) {
578 ERR("failed to access: %s", client->tep_path);
579 return PKGMGR_R_EINVAL;
582 /* build arguments */
583 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
584 if (client->tep_path) {
585 g_variant_builder_add(builder, "s", "-e");
586 g_variant_builder_add(builder, "s", client->tep_path);
587 g_variant_builder_add(builder, "s", "-M");
588 /* TODO: revise tep_move */
589 g_variant_builder_add(builder, "s",
590 client->tep_move ? "tep_move" : "tep_copy");
593 args = g_variant_new("as", builder);
594 g_variant_builder_unref(builder);
596 ret = pkgmgr_client_connection_send_request(client, "mount_install",
597 g_variant_new("(uss@as)", uid, pkg_type ? pkg_type : "",
600 if (ret != PKGMGR_R_OK) {
601 ERR("request failed: %d", ret);
605 g_variant_get(result, "(i&s)", &ret, &req_key);
606 if (req_key == NULL) {
607 g_variant_unref(result);
608 return PKGMGR_R_ECOMM;
610 if (ret != PKGMGR_R_OK) {
611 g_variant_unref(result);
615 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
616 if (cb_info == NULL) {
617 g_variant_unref(result);
618 return PKGMGR_R_ENOMEM;
620 g_variant_unref(result);
621 ret = pkgmgr_client_connection_set_callback(client, cb_info);
622 if (ret != PKGMGR_R_OK) {
623 __free_cb_info(cb_info);
626 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
628 return cb_info->req_id;
631 API int pkgmgr_client_mount_install(pkgmgr_client *pc, const char *pkg_type,
632 const char *descriptor_path, const char *pkg_path,
633 const char *optional_data, pkgmgr_mode mode,
634 pkgmgr_handler event_cb, void *data)
636 return pkgmgr_client_usr_mount_install(pc, pkg_type, descriptor_path,
637 pkg_path, optional_data, mode, event_cb, data,
641 API int pkgmgr_client_uninstall(pkgmgr_client *pc, const char *pkg_type,
642 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
645 return pkgmgr_client_usr_uninstall(pc, pkg_type, pkgid, mode, event_cb,
649 API int pkgmgr_client_usr_uninstall(pkgmgr_client *pc, const char *pkg_type,
650 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
651 void *data, uid_t uid)
654 int ret = PKGMGR_R_ECOMM;
655 char *req_key = NULL;
656 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
657 struct cb_info *cb_info;
659 if (pc == NULL || pkgid == NULL) {
660 ERR("invalid parameter");
661 return PKGMGR_R_EINVAL;
664 if (client->pc_type != PC_REQUEST) {
665 ERR("client->pc_type is not PC_REQUEST");
666 return PKGMGR_R_EINVAL;
669 ret = pkgmgr_client_connection_send_request(client, "uninstall",
670 g_variant_new("(us)", uid, pkgid), &result);
671 if (ret != PKGMGR_R_OK) {
672 ERR("request failed: %d", ret);
676 g_variant_get(result, "(i&s)", &ret, &req_key);
677 if (req_key == NULL) {
678 g_variant_unref(result);
679 return PKGMGR_R_ECOMM;
681 if (ret != PKGMGR_R_OK) {
682 g_variant_unref(result);
686 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
687 if (cb_info == NULL) {
688 g_variant_unref(result);
689 return PKGMGR_R_ENOMEM;
691 g_variant_unref(result);
692 ret = pkgmgr_client_connection_set_callback(client, cb_info);
693 if (ret != PKGMGR_R_OK) {
694 __free_cb_info(cb_info);
697 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
699 return cb_info->req_id;
702 API int pkgmgr_client_move(pkgmgr_client *pc, const char *pkg_type,
703 const char *pkgid, pkgmgr_move_type move_type,
704 pkgmgr_handler event_cb, void *data)
706 return pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type,
707 event_cb, data, _getuid());
709 API int pkgmgr_client_usr_move(pkgmgr_client *pc, const char *pkg_type,
710 const char *pkgid, pkgmgr_move_type move_type,
711 pkgmgr_handler event_cb, void *data, uid_t uid)
714 int ret = PKGMGR_R_ECOMM;
715 char *req_key = NULL;
716 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
717 struct cb_info *cb_info;
719 if (pc == NULL || pkgid == NULL) {
720 ERR("invalid parameter");
721 return PKGMGR_R_EINVAL;
724 if ((move_type < PM_MOVE_TO_INTERNAL) ||
725 (move_type > PM_MOVE_TO_EXTENDED))
726 return PKGMGR_R_EINVAL;
728 if (client->pc_type != PC_REQUEST) {
729 ERR("client->pc_type is not PC_REQUEST");
730 return PKGMGR_R_EINVAL;
733 ret = pkgmgr_client_connection_send_request(client, "move",
734 g_variant_new("(usi)", uid, pkgid, move_type), &result);
735 if (ret != PKGMGR_R_OK) {
736 ERR("request failed: %d", ret);
740 g_variant_get(result, "(i&s)", &ret, &req_key);
741 if (req_key == NULL) {
742 g_variant_unref(result);
743 return PKGMGR_R_ECOMM;
745 if (ret != PKGMGR_R_OK) {
746 g_variant_unref(result);
750 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
751 if (cb_info == NULL) {
752 g_variant_unref(result);
753 return PKGMGR_R_ERROR;
755 g_variant_unref(result);
756 ret = pkgmgr_client_connection_set_callback(client, cb_info);
757 if (ret != PKGMGR_R_OK) {
758 __free_cb_info(cb_info);
761 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
763 return cb_info->req_id;
766 API int pkgmgr_client_usr_register_pkg_update_info(pkgmgr_client *pc,
767 pkg_update_info_t *update_info, uid_t uid)
770 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
773 if (pc == NULL || update_info == NULL || update_info->pkgid == NULL) {
774 ERR("invalid parameter");
775 return PKGMGR_R_EINVAL;
778 if (client->pc_type != PC_REQUEST) {
779 ERR("client->pc_type is not PC_REQUEST");
780 return PKGMGR_R_EINVAL;
783 ret = pkgmgr_client_connection_send_request(client, "register_pkg_update_info",
784 g_variant_new("(ussi)", uid, update_info->pkgid, update_info->version,
785 update_info->type), &result);
786 if (ret != PKGMGR_R_OK) {
787 ERR("request failed: %d", ret);
791 g_variant_get(result, "(i)", &ret);
792 if (ret != PKGMGR_R_OK) {
793 g_variant_unref(result);
796 g_variant_unref(result);
801 API int pkgmgr_client_register_pkg_update_info(pkgmgr_client *pc,
802 pkg_update_info_t *update_info)
804 return pkgmgr_client_usr_register_pkg_update_info(pc, update_info,
808 API int pkgmgr_client_usr_unregister_pkg_update_info(pkgmgr_client *pc,
809 const char *pkgid, uid_t uid)
812 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
815 if (pc == NULL || pkgid == NULL) {
816 ERR("invalid parameter");
817 return PKGMGR_R_EINVAL;
820 if (client->pc_type != PC_REQUEST) {
821 ERR("client->pc_type is not PC_REQUEST");
822 return PKGMGR_R_EINVAL;
825 ret = pkgmgr_client_connection_send_request(client,
826 "unregister_pkg_update_info",
827 g_variant_new("(us)", uid, pkgid), &result);
828 if (ret != PKGMGR_R_OK) {
829 ERR("request failed: %d", ret);
833 g_variant_get(result, "(i)", &ret);
834 if (ret != PKGMGR_R_OK) {
835 g_variant_unref(result);
838 g_variant_unref(result);
843 API int pkgmgr_client_unregister_pkg_update_info(pkgmgr_client *pc,
846 return pkgmgr_client_usr_unregister_pkg_update_info(pc, pkgid, _getuid());
849 API int pkgmgr_client_usr_unregister_all_pkg_update_info(pkgmgr_client *pc,
853 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
857 ERR("invalid parameter");
858 return PKGMGR_R_EINVAL;
861 if (client->pc_type != PC_REQUEST) {
862 ERR("client->pc_type is not PC_REQUEST");
863 return PKGMGR_R_EINVAL;
866 ret = pkgmgr_client_connection_send_request(client,
867 "unregister_all_pkg_update_info",
868 g_variant_new("(u)", uid), &result);
869 if (ret != PKGMGR_R_OK) {
870 ERR("request failed: %d", ret);
874 g_variant_get(result, "(i)", &ret);
875 if (ret != PKGMGR_R_OK) {
876 g_variant_unref(result);
879 g_variant_unref(result);
884 API int pkgmgr_client_unregister_all_pkg_update_info(pkgmgr_client *pc)
886 return pkgmgr_client_usr_unregister_all_pkg_update_info(pc, _getuid());
889 API int pkgmgr_client_usr_activate(pkgmgr_client *pc, const char *pkg_type,
890 const char *pkgid, uid_t uid)
893 int ret = PKGMGR_R_ECOMM;
894 GVariantBuilder *builder;
895 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
897 if (pc == NULL || pkgid == NULL) {
898 ERR("invalid parameter");
899 return PKGMGR_R_EINVAL;
902 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
903 g_variant_builder_add(builder, "s", pkgid);
905 ret = pkgmgr_client_connection_send_request(client, "enable_pkgs",
906 g_variant_new("(uas)", uid, builder), &result);
907 g_variant_builder_unref(builder);
908 if (ret != PKGMGR_R_OK) {
909 ERR("request failed: %d", ret);
913 g_variant_get(result, "(is)", &ret, NULL);
914 g_variant_unref(result);
919 API int pkgmgr_client_activate(pkgmgr_client *pc, const char *pkg_type,
922 return pkgmgr_client_usr_activate(pc, pkg_type, pkgid, _getuid());
925 API int pkgmgr_client_usr_activate_packages(pkgmgr_client *pc,
926 const char *pkg_type, const char **pkgids, int n_pkgs,
927 pkgmgr_handler event_cb, void *data, uid_t uid)
930 GVariantBuilder *builder;
931 int ret = PKGMGR_R_ECOMM;
932 char *req_key = NULL;
933 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
934 struct cb_info *cb_info;
937 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
938 ERR("invalid parameter");
939 return PKGMGR_R_EINVAL;
942 if (client->pc_type != PC_REQUEST) {
943 ERR("client type is not PC_REQUEST");
944 return PKGMGR_R_EINVAL;
947 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
948 for (i = 0; i < n_pkgs; i++)
949 g_variant_builder_add(builder, "s", pkgids[i]);
951 ret = pkgmgr_client_connection_send_request(client, "enable_pkgs",
952 g_variant_new("(uas)", uid, builder), &result);
953 g_variant_builder_unref(builder);
954 if (ret != PKGMGR_R_OK) {
955 ERR("request failed: %d", ret);
959 g_variant_get(result, "(i&s)", &ret, &req_key);
960 if (req_key == NULL) {
961 g_variant_unref(result);
962 return PKGMGR_R_ECOMM;
964 if (ret != PKGMGR_R_OK) {
965 g_variant_unref(result);
969 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
970 if (cb_info == NULL) {
971 g_variant_unref(result);
972 return PKGMGR_R_ERROR;
974 g_variant_unref(result);
975 ret = pkgmgr_client_connection_set_callback(client, cb_info);
976 if (ret != PKGMGR_R_OK) {
977 __free_cb_info(cb_info);
980 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
982 return cb_info->req_id;
985 API int pkgmgr_client_activate_packages(pkgmgr_client *pc,
986 const char *pkg_type, const char **pkgids, int n_pkgs,
987 pkgmgr_handler event_cb, void *data)
989 return pkgmgr_client_usr_activate_packages(pc, pkg_type,
990 pkgids, n_pkgs, event_cb, data, _getuid());
993 API int pkgmgr_client_usr_deactivate(pkgmgr_client *pc, const char *pkg_type,
994 const char *pkgid, uid_t uid)
997 GVariantBuilder *builder;
998 int ret = PKGMGR_R_ECOMM;
999 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1001 if (pc == NULL || pkgid == NULL) {
1002 ERR("invalid parameter");
1003 return PKGMGR_R_EINVAL;
1006 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1007 g_variant_builder_add(builder, "s", pkgid);
1009 ret = pkgmgr_client_connection_send_request(client, "disable_pkgs",
1010 g_variant_new("(uas)", uid, builder), &result);
1011 g_variant_builder_unref(builder);
1012 if (ret != PKGMGR_R_OK) {
1013 ERR("request failed: %d", ret);
1017 g_variant_get(result, "(is)", &ret, NULL);
1018 g_variant_unref(result);
1023 API int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type,
1026 return pkgmgr_client_usr_deactivate(pc, pkg_type, pkgid, _getuid());
1029 API int pkgmgr_client_usr_deactivate_packages(pkgmgr_client *pc,
1030 const char *pkg_type, const char **pkgids, int n_pkgs,
1031 pkgmgr_handler event_cb, void *data, uid_t uid)
1034 GVariantBuilder *builder;
1035 int ret = PKGMGR_R_ECOMM;
1036 char *req_key = NULL;
1037 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1038 struct cb_info *cb_info;
1041 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
1042 ERR("invalid parameter");
1043 return PKGMGR_R_EINVAL;
1046 if (client->pc_type != PC_REQUEST) {
1047 ERR("client type is not PC_REQUEST");
1048 return PKGMGR_R_EINVAL;
1051 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1052 for (i = 0; i < n_pkgs; i++)
1053 g_variant_builder_add(builder, "s", pkgids[i]);
1055 ret = pkgmgr_client_connection_send_request(client, "disable_pkgs",
1056 g_variant_new("(uas)", uid, builder), &result);
1057 g_variant_builder_unref(builder);
1058 if (ret != PKGMGR_R_OK) {
1059 ERR("request failed: %d", ret);
1063 g_variant_get(result, "(i&s)", &ret, &req_key);
1064 if (req_key == NULL) {
1065 g_variant_unref(result);
1066 return PKGMGR_R_ECOMM;
1068 if (ret != PKGMGR_R_OK) {
1069 g_variant_unref(result);
1073 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1074 if (cb_info == NULL) {
1075 g_variant_unref(result);
1076 return PKGMGR_R_ERROR;
1078 g_variant_unref(result);
1079 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1080 if (ret != PKGMGR_R_OK) {
1081 __free_cb_info(cb_info);
1084 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1086 return cb_info->req_id;
1089 API int pkgmgr_client_deactivate_packages(pkgmgr_client *pc,
1090 const char *pkg_type, const char **pkgids, int n_pkgs,
1091 pkgmgr_handler event_cb, void *data)
1093 return pkgmgr_client_usr_deactivate_packages(pc, pkg_type,
1094 pkgids, n_pkgs, event_cb, data, _getuid());
1097 API int pkgmgr_client_usr_activate_app(pkgmgr_client *pc, const char *appid,
1098 pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1101 int ret = PKGMGR_R_ECOMM;
1102 char *req_key = NULL;
1103 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1104 struct cb_info *cb_info;
1106 if (pc == NULL || appid == NULL) {
1107 ERR("invalid parameter");
1108 return PKGMGR_R_EINVAL;
1111 ret = pkgmgr_client_connection_send_request(client, "enable_app",
1112 g_variant_new("(us)", uid, appid), &result);
1113 if (ret != PKGMGR_R_OK) {
1114 ERR("request failed: %d", ret);
1118 g_variant_get(result, "(i&s)", &ret, &req_key);
1119 if (req_key == NULL) {
1120 g_variant_unref(result);
1121 return PKGMGR_R_ECOMM;
1123 if (ret != PKGMGR_R_OK) {
1124 g_variant_unref(result);
1128 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1130 if (cb_info == NULL) {
1131 g_variant_unref(result);
1132 return PKGMGR_R_ENOMEM;
1134 g_variant_unref(result);
1135 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1136 if (ret != PKGMGR_R_OK) {
1137 __free_cb_info(cb_info);
1140 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1142 return cb_info->req_id;
1145 API int pkgmgr_client_activate_app(pkgmgr_client *pc, const char *appid,
1146 pkgmgr_app_handler app_event_cb, void *data)
1148 return pkgmgr_client_usr_activate_app(pc, appid, app_event_cb,
1152 API int pkgmgr_client_usr_activate_apps(pkgmgr_client *pc, const char **appids,
1153 int n_apps, pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1156 GVariantBuilder *builder;
1157 int ret = PKGMGR_R_ECOMM;
1158 char *req_key = NULL;
1159 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1160 struct cb_info *cb_info;
1163 if (pc == NULL || appids == NULL || n_apps < 1) {
1164 ERR("invalid parameter");
1165 return PKGMGR_R_EINVAL;
1168 if (client->pc_type != PC_REQUEST) {
1169 ERR("client type is not PC_REQUEST");
1170 return PKGMGR_R_EINVAL;
1173 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1174 for (i = 0; i < n_apps; i++)
1175 g_variant_builder_add(builder, "s", appids[i]);
1177 ret = pkgmgr_client_connection_send_request(client, "enable_apps",
1178 g_variant_new("(uas)", uid, builder), &result);
1179 g_variant_builder_unref(builder);
1180 if (ret != PKGMGR_R_OK) {
1181 ERR("request failed: %d", ret);
1185 g_variant_get(result, "(i&s)", &ret, &req_key);
1186 if (req_key == NULL) {
1187 g_variant_unref(result);
1188 return PKGMGR_R_ECOMM;
1190 if (ret != PKGMGR_R_OK) {
1191 g_variant_unref(result);
1195 cb_info = __create_app_event_cb_info(client, app_event_cb, data, req_key);
1196 if (cb_info == NULL) {
1197 g_variant_unref(result);
1198 return PKGMGR_R_ERROR;
1200 g_variant_unref(result);
1201 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1202 if (ret != PKGMGR_R_OK) {
1203 __free_cb_info(cb_info);
1206 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1208 return cb_info->req_id;
1211 API int pkgmgr_client_activate_apps(pkgmgr_client *pc, const char **appids,
1212 int n_apps, pkgmgr_app_handler app_event_cb, void *data)
1214 return pkgmgr_client_usr_activate_apps(pc, appids, n_apps,
1215 app_event_cb, data, _getuid());
1218 API int pkgmgr_client_activate_global_app_for_uid(pkgmgr_client *pc,
1219 const char *appid, pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1222 int ret = PKGMGR_R_ECOMM;
1223 char *req_key = NULL;
1224 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1225 struct cb_info *cb_info;
1227 if (pc == NULL || appid == NULL) {
1228 ERR("invalid parameter");
1229 return PKGMGR_R_EINVAL;
1232 ret = pkgmgr_client_connection_send_request(client,
1233 "enable_global_app_for_uid",
1234 g_variant_new("(us)", uid, appid), &result);
1235 if (ret != PKGMGR_R_OK) {
1236 ERR("request failed: %d", ret);
1240 g_variant_get(result, "(i&s)", &ret, &req_key);
1241 if (req_key == NULL) {
1242 g_variant_unref(result);
1243 return PKGMGR_R_ECOMM;
1245 if (ret != PKGMGR_R_OK) {
1246 g_variant_unref(result);
1250 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1252 if (cb_info == NULL) {
1253 g_variant_unref(result);
1254 return PKGMGR_R_ENOMEM;
1256 g_variant_unref(result);
1257 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1258 if (ret != PKGMGR_R_OK) {
1259 __free_cb_info(cb_info);
1262 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1264 return cb_info->req_id;
1267 API int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid,
1268 pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1271 int ret = PKGMGR_R_ECOMM;
1272 char *req_key = NULL;
1273 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1274 struct cb_info *cb_info;
1276 if (pc == NULL || appid == NULL) {
1277 ERR("invalid parameter");
1278 return PKGMGR_R_EINVAL;
1281 ret = pkgmgr_client_connection_send_request(client, "disable_app",
1282 g_variant_new("(us)", uid, appid), &result);
1283 if (ret != PKGMGR_R_OK) {
1284 ERR("request failed: %d", ret);
1288 g_variant_get(result, "(i&s)", &ret, &req_key);
1289 if (req_key == NULL) {
1290 g_variant_unref(result);
1291 return PKGMGR_R_ECOMM;
1293 if (ret != PKGMGR_R_OK) {
1294 g_variant_unref(result);
1298 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1300 if (cb_info == NULL) {
1301 g_variant_unref(result);
1302 return PKGMGR_R_ENOMEM;
1304 g_variant_unref(result);
1305 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1306 if (ret != PKGMGR_R_OK) {
1307 __free_cb_info(cb_info);
1310 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1312 return cb_info->req_id;
1315 API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid,
1316 pkgmgr_app_handler app_event_cb, void *data)
1318 return pkgmgr_client_usr_deactivate_app(pc, appid, app_event_cb, data,
1322 API int pkgmgr_client_usr_deactivate_apps(pkgmgr_client *pc,
1323 const char **appids, int n_apps,
1324 pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1327 GVariantBuilder *builder;
1328 int ret = PKGMGR_R_ECOMM;
1329 char *req_key = NULL;
1330 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1331 struct cb_info *cb_info;
1334 if (pc == NULL || appids == NULL || n_apps < 1) {
1335 ERR("invalid parameter");
1336 return PKGMGR_R_EINVAL;
1339 if (client->pc_type != PC_REQUEST) {
1340 ERR("client type is not PC_REQUEST");
1341 return PKGMGR_R_EINVAL;
1344 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1345 for (i = 0; i < n_apps; i++)
1346 g_variant_builder_add(builder, "s", appids[i]);
1348 ret = pkgmgr_client_connection_send_request(client, "disable_apps",
1349 g_variant_new("(uas)", uid, builder), &result);
1350 g_variant_builder_unref(builder);
1351 if (ret != PKGMGR_R_OK) {
1352 ERR("request failed: %d", ret);
1356 g_variant_get(result, "(i&s)", &ret, &req_key);
1357 if (req_key == NULL) {
1358 g_variant_unref(result);
1359 return PKGMGR_R_ECOMM;
1361 if (ret != PKGMGR_R_OK) {
1362 g_variant_unref(result);
1366 cb_info = __create_app_event_cb_info(client, app_event_cb, data, req_key);
1367 if (cb_info == NULL) {
1368 g_variant_unref(result);
1369 return PKGMGR_R_ERROR;
1371 g_variant_unref(result);
1372 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1373 if (ret != PKGMGR_R_OK) {
1374 __free_cb_info(cb_info);
1377 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1379 return cb_info->req_id;
1382 API int pkgmgr_client_deactivate_apps(pkgmgr_client *pc, const char **appids,
1383 int n_apps, pkgmgr_app_handler app_event_cb, void *data)
1385 return pkgmgr_client_usr_deactivate_apps(pc, appids, n_apps,
1386 app_event_cb, data, _getuid());
1389 API int pkgmgr_client_deactivate_global_app_for_uid(pkgmgr_client *pc,
1390 const char *appid, pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1393 int ret = PKGMGR_R_ECOMM;
1394 char *req_key = NULL;
1395 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1396 struct cb_info *cb_info;
1398 if (pc == NULL || appid == NULL) {
1399 ERR("invalid parameter");
1400 return PKGMGR_R_EINVAL;
1403 ret = pkgmgr_client_connection_send_request(client,
1404 "disable_global_app_for_uid",
1405 g_variant_new("(us)", uid, appid), &result);
1406 if (ret != PKGMGR_R_OK) {
1407 ERR("request failed: %d", ret);
1411 g_variant_get(result, "(i&s)", &ret, &req_key);
1412 if (req_key == NULL) {
1413 g_variant_unref(result);
1414 return PKGMGR_R_ECOMM;
1416 if (ret != PKGMGR_R_OK) {
1417 g_variant_unref(result);
1421 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1423 if (cb_info == NULL) {
1424 g_variant_unref(result);
1425 return PKGMGR_R_ENOMEM;
1427 g_variant_unref(result);
1428 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1429 if (ret != PKGMGR_R_OK) {
1430 __free_cb_info(cb_info);
1433 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1435 return cb_info->req_id;
1438 API int pkgmgr_client_usr_clear_user_data(pkgmgr_client *pc,
1439 const char *pkg_type, const char *appid, pkgmgr_mode mode,
1444 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1446 if (pc == NULL || appid == NULL || uid == GLOBAL_USER) {
1447 ERR("invalid parameter");
1448 return PKGMGR_R_EINVAL;
1451 if (client->pc_type != PC_REQUEST) {
1452 ERR("client->pc_type is not PC_REQUEST");
1453 return PKGMGR_R_EINVAL;
1456 ret = pkgmgr_client_connection_send_request(client, "cleardata",
1457 g_variant_new("(us)", uid, appid), &result);
1458 if (ret != PKGMGR_R_OK) {
1459 ERR("request failed: %d", ret);
1463 g_variant_get(result, "(i)", &ret);
1464 g_variant_unref(result);
1469 API int pkgmgr_client_clear_user_data(pkgmgr_client *pc, const char *pkg_type,
1470 const char *appid, pkgmgr_mode mode)
1472 return pkgmgr_client_usr_clear_user_data(pc, pkg_type, appid, mode,
1476 API int pkgmgr_client_set_status_type(pkgmgr_client *pc, int status_type)
1478 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1481 ERR("invalid parameter");
1482 return PKGMGR_R_EINVAL;
1485 client->status_type = status_type;
1490 API int pkgmgr_client_listen_status(pkgmgr_client *pc, pkgmgr_handler event_cb,
1494 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1495 struct cb_info *cb_info;
1497 if (pc == NULL || event_cb == NULL) {
1498 ERR("invalid parameter");
1499 return PKGMGR_R_EINVAL;
1502 if (client->pc_type != PC_LISTENING) {
1503 ERR("client->pc_type is not PC_LISTENING");
1504 return PKGMGR_R_EINVAL;
1507 cb_info = __create_event_cb_info(client, event_cb, data, NULL);
1508 if (cb_info == NULL)
1509 return PKGMGR_R_ENOMEM;
1510 cb_info->status_type = client->status_type;
1511 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1512 if (ret != PKGMGR_R_OK) {
1513 __free_cb_info(cb_info);
1516 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1518 return cb_info->req_id;
1521 API int pkgmgr_client_listen_app_status(pkgmgr_client *pc,
1522 pkgmgr_app_handler app_event_cb, void *data)
1525 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1526 struct cb_info *cb_info;
1528 if (pc == NULL || app_event_cb == NULL) {
1529 ERR("invalid parameter");
1530 return PKGMGR_R_EINVAL;
1533 if (client->pc_type != PC_LISTENING) {
1534 ERR("client->pc_type is not PC_LISTENING");
1535 return PKGMGR_R_EINVAL;
1538 cb_info = __create_app_event_cb_info(client, app_event_cb, data, NULL);
1539 if (cb_info == NULL)
1540 return PKGMGR_R_ENOMEM;
1541 cb_info->status_type = client->status_type;
1542 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1543 if (ret != PKGMGR_R_OK) {
1544 __free_cb_info(cb_info);
1547 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1549 return cb_info->req_id;
1552 API int pkgmgr_client_remove_listen_status(pkgmgr_client *pc)
1554 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1557 struct cb_info *cb_info;
1560 ERR("invalid parameter");
1561 return PKGMGR_R_EINVAL;
1564 /* unset all callback */
1565 tmp = client->cb_info_list;
1566 while (tmp != NULL) {
1568 cb_info = (struct cb_info *)tmp->data;
1569 pkgmgr_client_connection_unset_callback(pc, cb_info);
1570 client->cb_info_list = g_list_delete_link(client->cb_info_list,
1572 __free_cb_info(cb_info);
1579 API int pkgmgr_client_broadcast_status(pkgmgr_client *pc, const char *pkg_type,
1580 const char *pkgid, const char *key, const char *val)
1582 /* client cannot broadcast signal */
1586 /* TODO: deprecate(or remove) */
1587 API int pkgmgr_client_request_service(pkgmgr_request_service_type service_type,
1588 int service_mode, pkgmgr_client *pc, const char *pkg_type,
1589 const char *pkgid, const char *custom_info,
1590 pkgmgr_handler event_cb, void *data)
1592 return pkgmgr_client_usr_request_service(service_type, service_mode,
1593 pc, pkg_type, pkgid, _getuid(), custom_info, event_cb,
1597 API int pkgmgr_client_usr_request_service(
1598 pkgmgr_request_service_type service_type, int service_mode,
1599 pkgmgr_client *pc, const char *pkg_type, const char *pkgid,
1600 uid_t uid, const char *custom_info, pkgmgr_handler event_cb,
1605 /* Check for NULL value of service type */
1606 retvm_if(service_type > PM_REQUEST_MAX, PKGMGR_R_EINVAL, "service type is not defined\n");
1607 retvm_if(service_type < 0, PKGMGR_R_EINVAL, "service type is error\n");
1609 switch (service_type) {
1610 case PM_REQUEST_MOVE:
1611 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1612 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1613 tryvm_if((service_mode < PM_MOVE_TO_INTERNAL) || (service_mode > PM_MOVE_TO_EXTENDED), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1615 ret = __move_pkg_process(pc, pkgid, pkg_type, uid, (pkgmgr_move_type)service_mode, event_cb, data);
1618 case PM_REQUEST_GET_SIZE:
1619 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1620 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1621 tryvm_if((service_mode < PM_GET_TOTAL_SIZE) || (service_mode >= PM_GET_MAX), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1623 ret = __get_size_process(pc, pkgid, uid, (pkgmgr_getsize_type)service_mode, event_cb, data);
1626 case PM_REQUEST_KILL_APP:
1627 case PM_REQUEST_CHECK_APP:
1628 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1629 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1631 ret = __check_app_process(service_type, pc, pkgid, uid, data);
1633 ERR("__check_app_process fail \n");
1640 ERR("Wrong Request\n");
1651 API int pkgmgr_client_usr_request_size_info(uid_t uid)
1654 struct pkgmgr_client *client;
1656 client = pkgmgr_client_new(PC_REQUEST);
1657 if (client == NULL) {
1658 ERR("out of memory");
1659 return PKGMGR_R_ENOMEM;
1662 ret = __request_size_info(client, uid);
1664 ERR("__request_size_info fail");
1666 pkgmgr_client_free(client);
1670 API int pkgmgr_client_request_size_info(void)
1672 /* get all package size (data, total) */
1673 return pkgmgr_client_usr_request_size_info(_getuid());
1676 API int pkgmgr_client_usr_clear_cache_dir(const char *pkgid, uid_t uid)
1680 struct pkgmgr_client_t *client;
1682 if (pkgid == NULL || uid == GLOBAL_USER) {
1683 ERR("invalid parameter");
1684 return PKGMGR_R_EINVAL;
1687 client = pkgmgr_client_new(PC_REQUEST);
1688 if (client == NULL) {
1689 ERR("out of memory");
1690 return PKGMGR_R_ENOMEM;
1693 ret = pkgmgr_client_connection_send_request(client, "clearcache",
1694 g_variant_new("(us)", uid, pkgid), &result);
1695 if (ret != PKGMGR_R_OK) {
1696 ERR("request failed: %d", ret);
1700 g_variant_get(result, "(i)", &ret);
1701 g_variant_unref(result);
1706 API int pkgmgr_client_clear_cache_dir(const char *pkgid)
1708 return pkgmgr_client_usr_clear_cache_dir(pkgid, _getuid());
1711 API int pkgmgr_client_clear_usr_all_cache_dir(uid_t uid)
1713 return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, uid);
1716 API int pkgmgr_client_clear_all_cache_dir(void)
1718 return pkgmgr_client_usr_clear_cache_dir(
1719 PKG_CLEAR_ALL_CACHE, _getuid());
1722 API int pkgmgr_client_get_size(pkgmgr_client *pc, const char *pkgid,
1723 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
1726 return pkgmgr_client_usr_get_size(pc, pkgid, get_type, event_cb, data,
1730 /* TODO: deprecate(or remove) */
1731 API int pkgmgr_client_usr_get_size(pkgmgr_client *pc, const char *pkgid,
1732 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
1733 void *data, uid_t uid)
1736 int ret = PKGMGR_R_ECOMM;
1737 char *req_key = NULL;
1738 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1739 struct cb_info *cb_info;
1741 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
1742 ERR("invalid parameter");
1743 return PKGMGR_R_EINVAL;
1746 if (client->pc_type != PC_REQUEST) {
1747 ERR("client->pc_type is not PC_REQUEST");
1748 return PKGMGR_R_EINVAL;
1752 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
1753 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
1755 get_type = PM_GET_PKG_SIZE_INFO;
1757 ret = pkgmgr_client_connection_send_request(client, "getsize",
1758 g_variant_new("(usi)", uid, pkgid, get_type), &result);
1759 if (ret != PKGMGR_R_OK) {
1760 ERR("request failed: %d", ret);
1764 g_variant_get(result, "(i&s)", &ret, &req_key);
1765 if (req_key == NULL) {
1766 g_variant_unref(result);
1767 return PKGMGR_R_ECOMM;
1769 if (ret != PKGMGR_R_OK) {
1770 g_variant_unref(result);
1774 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1775 if (cb_info == NULL) {
1776 g_variant_unref(result);
1777 return PKGMGR_R_ENOMEM;
1779 g_variant_unref(result);
1780 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1781 if (ret != PKGMGR_R_OK) {
1782 __free_cb_info(cb_info);
1785 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1790 API int pkgmgr_client_usr_get_package_size_info(pkgmgr_client *pc,
1791 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
1792 void *user_data, uid_t uid)
1795 int ret = PKGMGR_R_ECOMM;
1796 char *req_key = NULL;
1798 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1799 struct cb_info *cb_info;
1801 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
1802 ERR("invalid parameter");
1803 return PKGMGR_R_EINVAL;
1806 if (client->pc_type != PC_REQUEST) {
1807 ERR("client->pc_type is not PC_REQUEST");
1808 return PKGMGR_R_EINVAL;
1811 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
1812 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
1814 get_type = PM_GET_PKG_SIZE_INFO;
1816 ret = pkgmgr_client_connection_send_request(client, "getsize",
1817 g_variant_new("(usi)", uid, pkgid, get_type), &result);
1818 if (ret != PKGMGR_R_OK) {
1819 ERR("request failed: %d", ret);
1823 g_variant_get(result, "(i&s)", &ret, &req_key);
1824 if (req_key == NULL) {
1825 g_variant_unref(result);
1826 return PKGMGR_R_ECOMM;
1828 if (ret != PKGMGR_R_OK) {
1829 g_variant_unref(result);
1833 cb_info = __create_size_info_cb_info(client, event_cb, user_data,
1835 if (cb_info == NULL) {
1836 g_variant_unref(result);
1837 return PKGMGR_R_ENOMEM;
1839 g_variant_unref(result);
1840 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1841 if (ret != PKGMGR_R_OK) {
1842 __free_cb_info(cb_info);
1845 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1850 API int pkgmgr_client_get_package_size_info(pkgmgr_client *pc,
1851 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
1854 return pkgmgr_client_usr_get_package_size_info(pc, pkgid, event_cb,
1855 user_data, _getuid());
1858 API int pkgmgr_client_usr_get_total_package_size_info(pkgmgr_client *pc,
1859 pkgmgr_total_pkg_size_info_receive_cb event_cb,
1860 void *user_data, uid_t uid)
1861 { /* total package size info */
1862 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL,
1863 (pkgmgr_pkg_size_info_receive_cb)event_cb,
1867 API int pkgmgr_client_get_total_package_size_info(pkgmgr_client *pc,
1868 pkgmgr_total_pkg_size_info_receive_cb event_cb, void *user_data)
1870 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL,
1871 (pkgmgr_pkg_size_info_receive_cb)event_cb,
1872 user_data, _getuid());
1875 API int pkgmgr_client_generate_license_request(pkgmgr_client *pc,
1876 const char *resp_data, char **req_data, char **license_url)
1882 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1884 if (pc == NULL || resp_data == NULL || req_data == NULL ||
1885 license_url == NULL) {
1886 ERR("invalid parameter");
1887 return PKGMGR_R_EINVAL;
1890 if (client->pc_type != PC_REQUEST) {
1891 ERR("client->pc_type is not PC_REQUEST");
1892 return PKGMGR_R_EINVAL;
1895 ret = pkgmgr_client_connection_send_request(client,
1896 "generate_license_request",
1897 g_variant_new("(s)", resp_data), &result);
1898 if (ret != PKGMGR_R_OK) {
1899 ERR("request failed: %d", ret);
1903 g_variant_get(result, "(i&s&s)", &ret, &data, &url);
1904 if (ret != PKGMGR_R_OK) {
1905 ERR("generate_license_request failed: %d", ret);
1906 g_variant_unref(result);
1910 *req_data = strdup(data);
1911 *license_url = strdup(url);
1913 g_variant_unref(result);
1918 API int pkgmgr_client_register_license(pkgmgr_client *pc, const char *resp_data)
1922 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1924 if (pc == NULL || resp_data == NULL) {
1925 ERR("invalid parameter");
1926 return PKGMGR_R_EINVAL;
1929 if (client->pc_type != PC_REQUEST) {
1930 ERR("client->pc_type is not PC_REQUEST");
1931 return PKGMGR_R_EINVAL;
1934 ret = pkgmgr_client_connection_send_request(client, "register_license",
1935 g_variant_new("(s)", resp_data), &result);
1936 if (ret != PKGMGR_R_OK) {
1937 ERR("request failed: %d", ret);
1941 g_variant_get(result, "(i)", &ret);
1942 g_variant_unref(result);
1943 if (ret != PKGMGR_R_OK)
1944 ERR("register license failed: %d", ret);
1949 API int pkgmgr_client_decrypt_package(pkgmgr_client *pc,
1950 const char *drm_file_path, const char *decrypted_file_path)
1954 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1956 if (pc == NULL || drm_file_path == NULL ||
1957 decrypted_file_path == NULL) {
1958 ERR("invalid parameter");
1959 return PKGMGR_R_EINVAL;
1962 if (client->pc_type != PC_REQUEST) {
1963 ERR("client->pc_type is not PC_REQUEST");
1964 return PKGMGR_R_EINVAL;
1967 ret = pkgmgr_client_connection_send_request(client, "decrypt_package",
1968 g_variant_new("(ss)", drm_file_path,
1969 decrypted_file_path), &result);
1970 if (ret != PKGMGR_R_OK) {
1971 ERR("request failed: %d", ret);
1975 g_variant_get(result, "(i)", &ret);
1976 g_variant_unref(result);
1977 if (ret != PKGMGR_R_OK)
1978 ERR("decrypt_package failed: %d", ret);
1983 API int pkgmgr_client_enable_splash_screen(pkgmgr_client *pc, const char *appid)
1985 return pkgmgr_client_usr_enable_splash_screen(pc, appid, _getuid());
1988 API int pkgmgr_client_usr_enable_splash_screen(pkgmgr_client *pc,
1989 const char *appid, uid_t uid)
1993 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1995 if (pc == NULL || appid == NULL) {
1996 ERR("Invalid parameter");
1997 return PKGMGR_R_EINVAL;
2000 ret = pkgmgr_client_connection_send_request(client,
2001 "enable_app_splash_screen",
2002 g_variant_new("(us)", uid, appid), &result);
2003 if (ret != PKGMGR_R_OK) {
2004 ERR("request failed: %d", ret);
2008 g_variant_get(result, "(i)", &ret);
2009 g_variant_unref(result);
2010 if (ret != PKGMGR_R_OK)
2011 ERR("enable splash screen failed: %d", ret);
2016 API int pkgmgr_client_disable_splash_screen(pkgmgr_client *pc,
2019 return pkgmgr_client_usr_disable_splash_screen(pc, appid,
2023 API int pkgmgr_client_usr_disable_splash_screen(pkgmgr_client *pc,
2024 const char *appid, uid_t uid)
2028 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2030 if (pc == NULL || appid == NULL) {
2031 ERR("Invalid parameter");
2032 return PKGMGR_R_EINVAL;
2035 ret = pkgmgr_client_connection_send_request(client,
2036 "disable_app_splash_screen",
2037 g_variant_new("(us)", uid, appid), &result);
2038 if (ret != PKGMGR_R_OK) {
2039 ERR("request failed: %d", ret);
2043 g_variant_get(result, "(i)", &ret);
2044 g_variant_unref(result);
2045 if (ret != PKGMGR_R_OK)
2046 ERR("disable splash screen failed: %d", ret);
2051 static int __set_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
2052 int mode, uid_t uid)
2055 int ret = PKGMGR_R_ECOMM;
2056 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2058 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
2059 ERR("invalid parameter");
2060 return PKGMGR_R_EINVAL;
2063 ret = pkgmgr_client_connection_send_request(client,
2064 "set_restriction_mode",
2065 g_variant_new("(usi)", uid, pkgid, mode), &result);
2066 if (ret != PKGMGR_R_OK) {
2067 ERR("request failed: %d", ret);
2071 g_variant_get(result, "(i)", &ret);
2072 g_variant_unref(result);
2077 API int pkgmgr_client_usr_set_pkg_restriction_mode(pkgmgr_client *pc,
2078 const char *pkgid, int mode, uid_t uid)
2080 return __set_pkg_restriction_mode(pc, pkgid, mode, uid);
2083 API int pkgmgr_client_set_pkg_restriction_mode(pkgmgr_client *pc,
2084 const char *pkgid, int mode)
2086 return pkgmgr_client_usr_set_pkg_restriction_mode(pc, pkgid, mode,
2090 static int __unset_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
2091 int mode, uid_t uid)
2094 int ret = PKGMGR_R_ECOMM;
2095 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2097 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
2098 ERR("invalid parameter");
2099 return PKGMGR_R_EINVAL;
2102 ret = pkgmgr_client_connection_send_request(client,
2103 "unset_restriction_mode",
2104 g_variant_new("(usi)", uid, pkgid, mode), &result);
2105 if (ret != PKGMGR_R_OK) {
2106 ERR("request failed: %d", ret);
2110 g_variant_get(result, "(i)", &ret);
2111 g_variant_unref(result);
2117 API int pkgmgr_client_usr_unset_pkg_restriction_mode(pkgmgr_client *pc,
2118 const char *pkgid, int mode, uid_t uid)
2120 return __unset_pkg_restriction_mode(pc, pkgid, mode, uid);
2123 API int pkgmgr_client_unset_pkg_restriction_mode(pkgmgr_client *pc,
2124 const char *pkgid, int mode)
2126 return pkgmgr_client_usr_unset_pkg_restriction_mode(pc, pkgid, mode,
2130 static int __get_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
2131 int *mode, uid_t uid)
2134 int ret = PKGMGR_R_ECOMM;
2136 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2138 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0) {
2139 ERR("invalid parameter");
2140 return PKGMGR_R_EINVAL;
2143 ret = pkgmgr_client_connection_send_request(client,
2144 "get_restriction_mode",
2145 g_variant_new("(us)", uid, pkgid), &result);
2146 if (ret != PKGMGR_R_OK) {
2147 ERR("request failed: %d", ret);
2151 g_variant_get(result, "(ii)", &m, &ret);
2152 g_variant_unref(result);
2153 if (ret != PKGMGR_R_OK)
2161 API int pkgmgr_client_usr_get_pkg_restriction_mode(pkgmgr_client *pc,
2162 const char *pkgid, int *mode, uid_t uid)
2164 return __get_pkg_restriction_mode(pc, pkgid, mode, uid);
2167 API int pkgmgr_client_get_pkg_restriction_mode(pkgmgr_client *pc,
2168 const char *pkgid, int *mode)
2170 return pkgmgr_client_usr_get_pkg_restriction_mode(pc, pkgid, mode,
2174 API int pkgmgr_client_usr_set_restriction_mode(pkgmgr_client *pc, int mode,
2178 int ret = PKGMGR_R_ECOMM;
2179 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2182 ERR("invalid parameter");
2183 return PKGMGR_R_EINVAL;
2186 ret = pkgmgr_client_connection_send_request(client,
2187 "set_restriction_mode",
2188 g_variant_new("(usi)", uid, "", mode), &result);
2189 if (ret != PKGMGR_R_OK) {
2190 ERR("request failed: %d", ret);
2194 g_variant_get(result, "(i)", &ret);
2195 g_variant_unref(result);
2200 API int pkgmgr_client_set_restriction_mode(pkgmgr_client *pc, int mode)
2202 return pkgmgr_client_usr_set_restriction_mode(pc, mode, _getuid());
2205 API int pkgmgr_client_usr_unset_restriction_mode(pkgmgr_client *pc, int mode,
2209 int ret = PKGMGR_R_ECOMM;
2210 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2213 ERR("invalid parameter");
2214 return PKGMGR_R_EINVAL;
2217 ret = pkgmgr_client_connection_send_request(client,
2218 "unset_restriction_mode",
2219 g_variant_new("(usi)", uid, "", mode), &result);
2220 if (ret != PKGMGR_R_OK) {
2221 ERR("request failed: %d", ret);
2225 g_variant_get(result, "(i)", &ret);
2226 g_variant_unref(result);
2231 API int pkgmgr_client_unset_restriction_mode(pkgmgr_client *pc, int mode)
2233 return pkgmgr_client_usr_unset_restriction_mode(pc, mode, _getuid());
2236 API int pkgmgr_client_usr_get_restriction_mode(pkgmgr_client *pc,
2237 int *mode, uid_t uid)
2240 int ret = PKGMGR_R_ECOMM;
2242 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2245 ERR("invalid parameter");
2246 return PKGMGR_R_EINVAL;
2249 ret = pkgmgr_client_connection_send_request(client,
2250 "get_restriction_mode",
2251 g_variant_new("(us)", uid, ""), &result);
2252 if (ret != PKGMGR_R_OK) {
2253 ERR("request failed: %d", ret);
2257 g_variant_get(result, "(ii)", &m, &ret);
2258 g_variant_unref(result);
2259 if (ret != PKGMGR_R_OK)
2267 API int pkgmgr_client_get_restriction_mode(pkgmgr_client *pc, int *mode)
2269 return pkgmgr_client_usr_get_restriction_mode(pc, mode, _getuid());
2272 API pkgmgr_info *pkgmgr_client_check_pkginfo_from_file(const char *pkg_path)
2275 pkg_plugin_set *plugin_set;
2276 package_manager_pkg_detail_info_t *info;
2279 if (pkg_path == NULL) {
2280 ERR("invalid parameter");
2284 pkg_type = __get_type_from_path(pkg_path);
2285 if (pkg_type == NULL) {
2286 ERR("cannot get pkg type");
2290 plugin_set = _package_manager_load_library(pkg_type);
2291 if (plugin_set == NULL) {
2292 ERR("failed to load library for %s", pkg_type);
2297 info = calloc(1, sizeof(package_manager_pkg_detail_info_t));
2299 ERR("out of memory");
2304 ret = plugin_set->get_pkg_detail_info_from_package(pkg_path, info);
2306 ERR("get_pkg_detail_info_from_package failed");
2314 return (pkgmgr_info *)info;
2317 API int pkgmgr_client_free_pkginfo(pkgmgr_info *info)
2319 package_manager_pkg_detail_info_t *pkg_info =
2320 (package_manager_pkg_detail_info_t *)info;
2323 ERR("invalid parameter");
2324 return PKGMGR_R_EINVAL;
2327 g_list_free_full(pkg_info->privilege_list, free);
2328 free(pkg_info->icon_buf);
2334 API int pkgmgr_client_usr_set_app_label(pkgmgr_client *pc, char *appid,
2335 char *label, uid_t uid)
2339 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2341 if (pc == NULL || appid == NULL || label == NULL) {
2342 ERR("Invalid parameter");
2343 return PKGMGR_R_EINVAL;
2346 ret = pkgmgr_client_connection_send_request(client,
2348 g_variant_new("(uss)", uid, appid, label), &result);
2349 if (ret != PKGMGR_R_OK) {
2350 ERR("Request failed: %d", ret);
2354 g_variant_get(result, "(i)", &ret);
2355 g_variant_unref(result);
2360 API int pkgmgr_client_set_app_label(pkgmgr_client *pc, char *appid, char *label)
2362 return pkgmgr_client_usr_set_app_label(pc, appid, label, _getuid());
2365 API int pkgmgr_client_usr_set_app_icon(pkgmgr_client *pc, char *appid,
2366 char *icon_path, uid_t uid)
2370 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2372 if (pc == NULL || appid == NULL || icon_path == NULL) {
2373 ERR("Invalid parameter");
2374 return PKGMGR_R_EINVAL;
2377 if (access(icon_path, F_OK) != 0) {
2378 ERR("failed to access: %s", icon_path);
2379 return PKGMGR_R_EINVAL;
2382 ret = pkgmgr_client_connection_send_request(client,
2384 g_variant_new("(uss)", uid, appid, icon_path), &result);
2385 if (ret != PKGMGR_R_OK) {
2386 ERR("Request failed: %d", ret);
2390 g_variant_get(result, "(i)", &ret);
2391 g_variant_unref(result);
2396 API int pkgmgr_client_set_app_icon(pkgmgr_client *pc, char *appid, char *icon_path)
2398 return pkgmgr_client_usr_set_app_icon(pc, appid, icon_path, _getuid());
2401 API int pkgmgr_client_set_debug_mode(pkgmgr_client *pc, bool debug_mode)
2403 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2406 ERR("invalid parameter");
2407 return PKGMGR_R_EINVAL;
2410 client->debug_mode = debug_mode;
2415 API int pkgmgr_client_usr_migrate_external_image(pkgmgr_client *pc,
2416 const char *pkgid, uid_t uid)
2419 int ret = PKGMGR_R_ECOMM;
2420 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2423 ERR("invalid parameter");
2424 return PKGMGR_R_EINVAL;
2427 ret = pkgmgr_client_connection_send_request(client,
2428 "migrate_external_image",
2429 g_variant_new("(us)", uid, pkgid), &result);
2430 if (ret != PKGMGR_R_OK) {
2431 ERR("request failed: %d", ret);
2435 g_variant_get(result, "(i)", &ret);
2436 g_variant_unref(result);