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 gboolean __free_cb_info_at_main_thread(gpointer user_data)
156 struct cb_info *cb_info = (struct cb_info *)user_data;
157 g_list_free(cb_info->sid_list);
158 free(cb_info->req_key);
161 return G_SOURCE_REMOVE;
164 static void __free_cb_info(struct cb_info *cb_info)
166 g_idle_add(__free_cb_info_at_main_thread, cb_info);
169 static int __get_size_process(pkgmgr_client *pc, const char *pkgid, uid_t uid,
170 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
174 int ret = PKGMGR_R_ECOMM;
175 long long size_info = 0;
176 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
178 if (pc == NULL || pkgid == NULL) {
179 ERR("invalid parameter");
180 return PKGMGR_R_EINVAL;
183 if (client->pc_type != PC_REQUEST) {
184 ERR("client->pc_type is not PC_REQUEST");
185 return PKGMGR_R_EINVAL;
188 ret = pkgmgr_client_connection_send_request(client, "getsize_sync",
189 g_variant_new("(usi)", uid, pkgid, get_type), &result);
190 if (ret != PKGMGR_R_OK) {
191 ERR("request failed: %d", ret);
195 g_variant_get(result, "(ix)", &ret, &size_info);
196 if (ret != PKGMGR_R_OK) {
197 ERR("request result failed: %d", ret);
198 g_variant_unref(result);
203 ERR("invalid size_info=(%lld)", size_info);
206 ret = (int)size_info;
207 DBG("size_info(%lld), return size(%d)", size_info, ret);
210 g_variant_unref(result);
215 static int __move_pkg_process(pkgmgr_client *pc, const char *pkgid,
216 const char *pkg_type, uid_t uid, pkgmgr_move_type move_type,
217 pkgmgr_handler event_cb, void *data)
221 ret = pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type, event_cb, data, uid);
223 ERR("move request failed");
230 static int __check_app_process(pkgmgr_request_service_type service_type,
231 pkgmgr_client *pc, const char *pkgid, uid_t uid, void *data)
234 int ret = PKGMGR_R_ECOMM;
235 pkgmgrinfo_pkginfo_h handle;
237 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
239 retvm_if(client->pc_type != PC_REQUEST, PKGMGR_R_EINVAL, "client->pc_type is not PC_REQUEST\n");
241 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
242 if (ret != PMINFO_R_OK) {
243 ERR("pkgmgrinfo_pkginfo_get_pkginfo failed");
244 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
245 return PKGMGR_R_ERROR;
248 if (service_type == PM_REQUEST_KILL_APP) {
249 ret = pkgmgr_client_connection_send_request(client, "kill",
250 g_variant_new("(us)", uid, pkgid), &result);
251 } else if (service_type == PM_REQUEST_CHECK_APP) {
252 ret = pkgmgr_client_connection_send_request(client, "check",
253 g_variant_new("(us)", uid, pkgid), &result);
255 ERR("unexpected service type: %d", service_type);
256 ret = PKGMGR_R_ERROR;
259 if (ret != PKGMGR_R_OK) {
260 ERR("request failed: %d", ret);
264 g_variant_get(result, "(ii)", &ret, &pid);
265 g_variant_unref(result);
266 if (ret != PKGMGR_R_OK) {
267 ERR("request failed, ret=%d", ret);
273 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
279 static int __request_size_info(pkgmgr_client *pc, uid_t uid)
282 int ret = PKGMGR_R_ECOMM;
283 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
286 ERR("invalid parameter");
287 return PKGMGR_R_EINVAL;
290 if (client->pc_type != PC_REQUEST) {
291 ERR("client->pc_type is not PC_REQUEST");
292 return PKGMGR_R_EINVAL;
295 ret = pkgmgr_client_connection_send_request(client, "getsize",
296 g_variant_new("(usi)", uid, "size_info",
297 PM_GET_SIZE_INFO), &result);
298 if (ret != PKGMGR_R_OK) {
299 ERR("request failed: %d", ret);
303 /* just free result here because it cannot return result(reqkey) */
304 g_variant_unref(result);
309 API pkgmgr_client *pkgmgr_client_new(pkgmgr_client_type pc_type)
311 struct pkgmgr_client_t *client;
313 if (pc_type == PC_BROADCAST) {
314 ERR("broadcast type is not supported");
318 if (pc_type != PC_REQUEST && pc_type != PC_LISTENING) {
319 ERR("invalid parameter");
323 client = calloc(1, sizeof(struct pkgmgr_client_t));
324 if (client == NULL) {
325 ERR("out of memory");
329 client->pc_type = pc_type;
330 client->status_type = PKGMGR_CLIENT_STATUS_ALL;
332 if (pkgmgr_client_connection_connect(client) != PKGMGR_R_OK) {
337 return (pkgmgr_client *)client;
340 API int pkgmgr_client_free(pkgmgr_client *pc)
342 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
345 ERR("invalid argument");
346 return PKGMGR_R_EINVAL;
349 pkgmgr_client_remove_listen_status(client);
350 pkgmgr_client_connection_disconnect(client);
351 if (client->tep_path)
352 free(client->tep_path);
358 struct manifest_and_type type_map[] = {
359 { "res/wgt/config.xml", "wgt" },
360 { "config.xml", "wgt" },
361 { "tizen-manifest.xml", "tpk" },
365 static char *__get_type_from_path(const char *pkg_path)
367 const char *type = NULL;
371 uf = unzOpen(pkg_path);
373 ERR("failed to open zip file %s", pkg_path);
377 for (i = 0; type_map[i].manifest != NULL; i++) {
378 if (unzLocateFile(uf, type_map[i].manifest, 0) == UNZ_OK) {
379 DBG("pkgtype of %s: [%s]", pkg_path, type_map[i].type);
380 type = type_map[i].type;
386 return type ? strdup(type) : NULL;
389 API int pkgmgr_client_set_tep_path(pkgmgr_client *pc, const char *tep_path,
392 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *) pc;
394 if (pc == NULL || tep_path == NULL) {
395 ERR("invalied parameter");
396 return PKGMGR_R_EINVAL;
399 if (client->tep_path)
400 free(client->tep_path);
402 client->tep_path = strdup(tep_path);
403 client->tep_move = tep_move;
408 API int pkgmgr_client_usr_install(pkgmgr_client *pc, const char *pkg_type,
409 const char *descriptor_path, const char *pkg_path,
410 const char *optional_data, pkgmgr_mode mode,
411 pkgmgr_handler event_cb, void *data, uid_t uid)
414 int ret = PKGMGR_R_ECOMM;
415 char *req_key = NULL;
416 GVariantBuilder *builder = NULL;
417 GVariant *args = NULL;
418 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
419 struct cb_info *cb_info;
421 if (pc == NULL || pkg_path == NULL) {
422 ERR("invalid parameter");
423 return PKGMGR_R_EINVAL;
426 if (client->pc_type != PC_REQUEST) {
427 ERR("client type is not PC_REQUEST");
428 return PKGMGR_R_EINVAL;
431 if (access(pkg_path, F_OK) != 0) {
432 ERR("failed to access: %s", pkg_path);
433 return PKGMGR_R_EINVAL;
436 if (client->tep_path != NULL && access(client->tep_path, F_OK) != 0) {
437 ERR("failed to access: %s", client->tep_path);
438 return PKGMGR_R_EINVAL;
441 /* build arguments */
442 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
443 if (client->tep_path) {
444 g_variant_builder_add(builder, "s", "-e");
445 g_variant_builder_add(builder, "s", client->tep_path);
446 g_variant_builder_add(builder, "s", "-M");
447 /* TODO: revise tep_move */
448 g_variant_builder_add(builder, "s",
449 client->tep_move ? "tep_move" : "tep_copy");
451 if (client->debug_mode)
452 g_variant_builder_add(builder, "s", "-G");
453 if (client->skip_optimization)
454 g_variant_builder_add(builder, "s", "-S");
456 args = g_variant_new("as", builder);
457 g_variant_builder_unref(builder);
459 ret = pkgmgr_client_connection_send_request(client, "install",
460 g_variant_new("(uss@as)", uid, pkg_type ? pkg_type : "",
463 if (ret != PKGMGR_R_OK) {
464 ERR("request failed: %d", ret);
468 g_variant_get(result, "(i&s)", &ret, &req_key);
469 if (req_key == NULL) {
470 g_variant_unref(result);
471 return PKGMGR_R_ECOMM;
473 if (ret != PKGMGR_R_OK) {
474 g_variant_unref(result);
478 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
479 if (cb_info == NULL) {
480 g_variant_unref(result);
481 return PKGMGR_R_ENOMEM;
483 g_variant_unref(result);
484 ret = pkgmgr_client_connection_set_callback(client, cb_info);
485 if (ret != PKGMGR_R_OK) {
486 __free_cb_info(cb_info);
489 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
491 return cb_info->req_id;
494 API int pkgmgr_client_install(pkgmgr_client *pc, const char *pkg_type,
495 const char *descriptor_path, const char *pkg_path,
496 const char *optional_data, pkgmgr_mode mode,
497 pkgmgr_handler event_cb, void *data)
499 return pkgmgr_client_usr_install(pc, pkg_type, descriptor_path,
500 pkg_path, optional_data, mode, event_cb, data,
504 API int pkgmgr_client_reinstall(pkgmgr_client *pc, const char *pkg_type,
505 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
506 pkgmgr_handler event_cb, void *data)
508 return pkgmgr_client_usr_reinstall(pc, pkg_type, pkgid, optional_data,
509 mode, event_cb, data, _getuid());
512 API int pkgmgr_client_usr_reinstall(pkgmgr_client *pc, const char *pkg_type,
513 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
514 pkgmgr_handler event_cb, void *data, uid_t uid)
517 int ret = PKGMGR_R_ECOMM;
518 char *req_key = NULL;
519 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
520 struct cb_info *cb_info;
522 if (pc == NULL || pkgid == NULL) {
523 ERR("invalid parameter");
524 return PKGMGR_R_EINVAL;
527 if (client->pc_type != PC_REQUEST) {
528 ERR("client->pc_type is not PC_REQUEST");
529 return PKGMGR_R_EINVAL;
532 ret = pkgmgr_client_connection_send_request(client, "reinstall",
533 g_variant_new("(us)", uid, pkgid), &result);
534 if (ret != PKGMGR_R_OK) {
535 ERR("request failed: %d", ret);
539 g_variant_get(result, "(i&s)", &ret, &req_key);
540 if (req_key == NULL) {
541 g_variant_unref(result);
542 return PKGMGR_R_ECOMM;
544 if (ret != PKGMGR_R_OK) {
545 g_variant_unref(result);
549 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
550 if (cb_info == NULL) {
551 g_variant_unref(result);
552 return PKGMGR_R_ENOMEM;
554 g_variant_unref(result);
555 ret = pkgmgr_client_connection_set_callback(client, cb_info);
556 if (ret != PKGMGR_R_OK) {
557 __free_cb_info(cb_info);
560 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
562 return cb_info->req_id;
565 API int pkgmgr_client_usr_mount_install(pkgmgr_client *pc, const char *pkg_type,
566 const char *descriptor_path, const char *pkg_path,
567 const char *optional_data, pkgmgr_mode mode,
568 pkgmgr_handler event_cb, void *data, uid_t uid)
571 int ret = PKGMGR_R_ECOMM;
572 char *req_key = NULL;
573 GVariantBuilder *builder = NULL;
574 GVariant *args = NULL;
575 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
576 struct cb_info *cb_info;
578 if (pc == NULL || pkg_path == NULL) {
579 ERR("invalid parameter");
580 return PKGMGR_R_EINVAL;
583 if (client->pc_type != PC_REQUEST) {
584 ERR("client->pc_type is not PC_REQUEST");
585 return PKGMGR_R_EINVAL;
588 if (access(pkg_path, F_OK) != 0) {
589 ERR("failed to access: %s", pkg_path);
590 return PKGMGR_R_EINVAL;
593 if (client->tep_path != NULL && access(client->tep_path, F_OK) != 0) {
594 ERR("failed to access: %s", client->tep_path);
595 return PKGMGR_R_EINVAL;
598 /* build arguments */
599 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
600 if (client->tep_path) {
601 g_variant_builder_add(builder, "s", "-e");
602 g_variant_builder_add(builder, "s", client->tep_path);
603 g_variant_builder_add(builder, "s", "-M");
604 /* TODO: revise tep_move */
605 g_variant_builder_add(builder, "s",
606 client->tep_move ? "tep_move" : "tep_copy");
609 args = g_variant_new("as", builder);
610 g_variant_builder_unref(builder);
612 ret = pkgmgr_client_connection_send_request(client, "mount_install",
613 g_variant_new("(uss@as)", uid, pkg_type ? pkg_type : "",
616 if (ret != PKGMGR_R_OK) {
617 ERR("request failed: %d", ret);
621 g_variant_get(result, "(i&s)", &ret, &req_key);
622 if (req_key == NULL) {
623 g_variant_unref(result);
624 return PKGMGR_R_ECOMM;
626 if (ret != PKGMGR_R_OK) {
627 g_variant_unref(result);
631 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
632 if (cb_info == NULL) {
633 g_variant_unref(result);
634 return PKGMGR_R_ENOMEM;
636 g_variant_unref(result);
637 ret = pkgmgr_client_connection_set_callback(client, cb_info);
638 if (ret != PKGMGR_R_OK) {
639 __free_cb_info(cb_info);
642 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
644 return cb_info->req_id;
647 API int pkgmgr_client_mount_install(pkgmgr_client *pc, const char *pkg_type,
648 const char *descriptor_path, const char *pkg_path,
649 const char *optional_data, pkgmgr_mode mode,
650 pkgmgr_handler event_cb, void *data)
652 return pkgmgr_client_usr_mount_install(pc, pkg_type, descriptor_path,
653 pkg_path, optional_data, mode, event_cb, data,
657 API int pkgmgr_client_uninstall(pkgmgr_client *pc, const char *pkg_type,
658 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
661 return pkgmgr_client_usr_uninstall(pc, pkg_type, pkgid, mode, event_cb,
665 API int pkgmgr_client_usr_uninstall(pkgmgr_client *pc, const char *pkg_type,
666 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
667 void *data, uid_t uid)
670 int ret = PKGMGR_R_ECOMM;
671 char *req_key = NULL;
672 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
673 struct cb_info *cb_info;
675 if (pc == NULL || pkgid == NULL) {
676 ERR("invalid parameter");
677 return PKGMGR_R_EINVAL;
680 if (client->pc_type != PC_REQUEST) {
681 ERR("client->pc_type is not PC_REQUEST");
682 return PKGMGR_R_EINVAL;
685 ret = pkgmgr_client_connection_send_request(client, "uninstall",
686 g_variant_new("(us)", uid, pkgid), &result);
687 if (ret != PKGMGR_R_OK) {
688 ERR("request failed: %d", ret);
692 g_variant_get(result, "(i&s)", &ret, &req_key);
693 if (req_key == NULL) {
694 g_variant_unref(result);
695 return PKGMGR_R_ECOMM;
697 if (ret != PKGMGR_R_OK) {
698 g_variant_unref(result);
702 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
703 if (cb_info == NULL) {
704 g_variant_unref(result);
705 return PKGMGR_R_ENOMEM;
707 g_variant_unref(result);
708 ret = pkgmgr_client_connection_set_callback(client, cb_info);
709 if (ret != PKGMGR_R_OK) {
710 __free_cb_info(cb_info);
713 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
715 return cb_info->req_id;
718 API int pkgmgr_client_move(pkgmgr_client *pc, const char *pkg_type,
719 const char *pkgid, pkgmgr_move_type move_type,
720 pkgmgr_handler event_cb, void *data)
722 return pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type,
723 event_cb, data, _getuid());
725 API int pkgmgr_client_usr_move(pkgmgr_client *pc, const char *pkg_type,
726 const char *pkgid, pkgmgr_move_type move_type,
727 pkgmgr_handler event_cb, void *data, uid_t uid)
730 int ret = PKGMGR_R_ECOMM;
731 char *req_key = NULL;
732 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
733 struct cb_info *cb_info;
735 if (pc == NULL || pkgid == NULL) {
736 ERR("invalid parameter");
737 return PKGMGR_R_EINVAL;
740 if ((move_type < PM_MOVE_TO_INTERNAL) ||
741 (move_type > PM_MOVE_TO_EXTENDED))
742 return PKGMGR_R_EINVAL;
744 if (client->pc_type != PC_REQUEST) {
745 ERR("client->pc_type is not PC_REQUEST");
746 return PKGMGR_R_EINVAL;
749 ret = pkgmgr_client_connection_send_request(client, "move",
750 g_variant_new("(usi)", uid, pkgid, move_type), &result);
751 if (ret != PKGMGR_R_OK) {
752 ERR("request failed: %d", ret);
756 g_variant_get(result, "(i&s)", &ret, &req_key);
757 if (req_key == NULL) {
758 g_variant_unref(result);
759 return PKGMGR_R_ECOMM;
761 if (ret != PKGMGR_R_OK) {
762 g_variant_unref(result);
766 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
767 if (cb_info == NULL) {
768 g_variant_unref(result);
769 return PKGMGR_R_ERROR;
771 g_variant_unref(result);
772 ret = pkgmgr_client_connection_set_callback(client, cb_info);
773 if (ret != PKGMGR_R_OK) {
774 __free_cb_info(cb_info);
777 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
779 return cb_info->req_id;
782 API int pkgmgr_client_usr_register_pkg_update_info(pkgmgr_client *pc,
783 pkg_update_info_t *update_info, uid_t uid)
786 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
789 if (pc == NULL || update_info == NULL || update_info->pkgid == NULL) {
790 ERR("invalid parameter");
791 return PKGMGR_R_EINVAL;
794 if (client->pc_type != PC_REQUEST) {
795 ERR("client->pc_type is not PC_REQUEST");
796 return PKGMGR_R_EINVAL;
799 ret = pkgmgr_client_connection_send_request(client, "register_pkg_update_info",
800 g_variant_new("(ussi)", uid, update_info->pkgid, update_info->version,
801 update_info->type), &result);
802 if (ret != PKGMGR_R_OK) {
803 ERR("request failed: %d", ret);
807 g_variant_get(result, "(i)", &ret);
808 if (ret != PKGMGR_R_OK) {
809 g_variant_unref(result);
812 g_variant_unref(result);
817 API int pkgmgr_client_register_pkg_update_info(pkgmgr_client *pc,
818 pkg_update_info_t *update_info)
820 return pkgmgr_client_usr_register_pkg_update_info(pc, update_info,
824 API int pkgmgr_client_usr_unregister_pkg_update_info(pkgmgr_client *pc,
825 const char *pkgid, uid_t uid)
828 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
831 if (pc == NULL || pkgid == NULL) {
832 ERR("invalid parameter");
833 return PKGMGR_R_EINVAL;
836 if (client->pc_type != PC_REQUEST) {
837 ERR("client->pc_type is not PC_REQUEST");
838 return PKGMGR_R_EINVAL;
841 ret = pkgmgr_client_connection_send_request(client,
842 "unregister_pkg_update_info",
843 g_variant_new("(us)", uid, pkgid), &result);
844 if (ret != PKGMGR_R_OK) {
845 ERR("request failed: %d", ret);
849 g_variant_get(result, "(i)", &ret);
850 if (ret != PKGMGR_R_OK) {
851 g_variant_unref(result);
854 g_variant_unref(result);
859 API int pkgmgr_client_unregister_pkg_update_info(pkgmgr_client *pc,
862 return pkgmgr_client_usr_unregister_pkg_update_info(pc, pkgid, _getuid());
865 API int pkgmgr_client_usr_unregister_all_pkg_update_info(pkgmgr_client *pc,
869 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
873 ERR("invalid parameter");
874 return PKGMGR_R_EINVAL;
877 if (client->pc_type != PC_REQUEST) {
878 ERR("client->pc_type is not PC_REQUEST");
879 return PKGMGR_R_EINVAL;
882 ret = pkgmgr_client_connection_send_request(client,
883 "unregister_all_pkg_update_info",
884 g_variant_new("(u)", uid), &result);
885 if (ret != PKGMGR_R_OK) {
886 ERR("request failed: %d", ret);
890 g_variant_get(result, "(i)", &ret);
891 if (ret != PKGMGR_R_OK) {
892 g_variant_unref(result);
895 g_variant_unref(result);
900 API int pkgmgr_client_unregister_all_pkg_update_info(pkgmgr_client *pc)
902 return pkgmgr_client_usr_unregister_all_pkg_update_info(pc, _getuid());
905 API int pkgmgr_client_usr_activate(pkgmgr_client *pc, const char *pkg_type,
906 const char *pkgid, uid_t uid)
909 int ret = PKGMGR_R_ECOMM;
910 GVariantBuilder *builder;
911 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
913 if (pc == NULL || pkgid == NULL) {
914 ERR("invalid parameter");
915 return PKGMGR_R_EINVAL;
918 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
919 g_variant_builder_add(builder, "s", pkgid);
921 ret = pkgmgr_client_connection_send_request(client, "enable_pkgs",
922 g_variant_new("(uas)", uid, builder), &result);
923 g_variant_builder_unref(builder);
924 if (ret != PKGMGR_R_OK) {
925 ERR("request failed: %d", ret);
929 g_variant_get(result, "(is)", &ret, NULL);
930 g_variant_unref(result);
935 API int pkgmgr_client_activate(pkgmgr_client *pc, const char *pkg_type,
938 return pkgmgr_client_usr_activate(pc, pkg_type, pkgid, _getuid());
941 API int pkgmgr_client_usr_activate_packages(pkgmgr_client *pc,
942 const char *pkg_type, const char **pkgids, int n_pkgs,
943 pkgmgr_handler event_cb, void *data, uid_t uid)
946 GVariantBuilder *builder;
947 int ret = PKGMGR_R_ECOMM;
948 char *req_key = NULL;
949 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
950 struct cb_info *cb_info;
953 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
954 ERR("invalid parameter");
955 return PKGMGR_R_EINVAL;
958 if (client->pc_type != PC_REQUEST) {
959 ERR("client type is not PC_REQUEST");
960 return PKGMGR_R_EINVAL;
963 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
964 for (i = 0; i < n_pkgs; i++)
965 g_variant_builder_add(builder, "s", pkgids[i]);
967 ret = pkgmgr_client_connection_send_request(client, "enable_pkgs",
968 g_variant_new("(uas)", uid, builder), &result);
969 g_variant_builder_unref(builder);
970 if (ret != PKGMGR_R_OK) {
971 ERR("request failed: %d", ret);
975 g_variant_get(result, "(i&s)", &ret, &req_key);
976 if (req_key == NULL) {
977 g_variant_unref(result);
978 return PKGMGR_R_ECOMM;
980 if (ret != PKGMGR_R_OK) {
981 g_variant_unref(result);
985 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
986 if (cb_info == NULL) {
987 g_variant_unref(result);
988 return PKGMGR_R_ERROR;
990 g_variant_unref(result);
991 ret = pkgmgr_client_connection_set_callback(client, cb_info);
992 if (ret != PKGMGR_R_OK) {
993 __free_cb_info(cb_info);
996 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
998 return cb_info->req_id;
1001 API int pkgmgr_client_activate_packages(pkgmgr_client *pc,
1002 const char *pkg_type, const char **pkgids, int n_pkgs,
1003 pkgmgr_handler event_cb, void *data)
1005 return pkgmgr_client_usr_activate_packages(pc, pkg_type,
1006 pkgids, n_pkgs, event_cb, data, _getuid());
1009 API int pkgmgr_client_usr_deactivate(pkgmgr_client *pc, const char *pkg_type,
1010 const char *pkgid, uid_t uid)
1013 GVariantBuilder *builder;
1014 int ret = PKGMGR_R_ECOMM;
1015 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1017 if (pc == NULL || pkgid == NULL) {
1018 ERR("invalid parameter");
1019 return PKGMGR_R_EINVAL;
1022 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1023 g_variant_builder_add(builder, "s", pkgid);
1025 ret = pkgmgr_client_connection_send_request(client, "disable_pkgs",
1026 g_variant_new("(uas)", uid, builder), &result);
1027 g_variant_builder_unref(builder);
1028 if (ret != PKGMGR_R_OK) {
1029 ERR("request failed: %d", ret);
1033 g_variant_get(result, "(is)", &ret, NULL);
1034 g_variant_unref(result);
1039 API int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type,
1042 return pkgmgr_client_usr_deactivate(pc, pkg_type, pkgid, _getuid());
1045 API int pkgmgr_client_usr_deactivate_packages(pkgmgr_client *pc,
1046 const char *pkg_type, const char **pkgids, int n_pkgs,
1047 pkgmgr_handler event_cb, void *data, uid_t uid)
1050 GVariantBuilder *builder;
1051 int ret = PKGMGR_R_ECOMM;
1052 char *req_key = NULL;
1053 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1054 struct cb_info *cb_info;
1057 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
1058 ERR("invalid parameter");
1059 return PKGMGR_R_EINVAL;
1062 if (client->pc_type != PC_REQUEST) {
1063 ERR("client type is not PC_REQUEST");
1064 return PKGMGR_R_EINVAL;
1067 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1068 for (i = 0; i < n_pkgs; i++)
1069 g_variant_builder_add(builder, "s", pkgids[i]);
1071 ret = pkgmgr_client_connection_send_request(client, "disable_pkgs",
1072 g_variant_new("(uas)", uid, builder), &result);
1073 g_variant_builder_unref(builder);
1074 if (ret != PKGMGR_R_OK) {
1075 ERR("request failed: %d", ret);
1079 g_variant_get(result, "(i&s)", &ret, &req_key);
1080 if (req_key == NULL) {
1081 g_variant_unref(result);
1082 return PKGMGR_R_ECOMM;
1084 if (ret != PKGMGR_R_OK) {
1085 g_variant_unref(result);
1089 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1090 if (cb_info == NULL) {
1091 g_variant_unref(result);
1092 return PKGMGR_R_ERROR;
1094 g_variant_unref(result);
1095 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1096 if (ret != PKGMGR_R_OK) {
1097 __free_cb_info(cb_info);
1100 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1102 return cb_info->req_id;
1105 API int pkgmgr_client_deactivate_packages(pkgmgr_client *pc,
1106 const char *pkg_type, const char **pkgids, int n_pkgs,
1107 pkgmgr_handler event_cb, void *data)
1109 return pkgmgr_client_usr_deactivate_packages(pc, pkg_type,
1110 pkgids, n_pkgs, event_cb, data, _getuid());
1113 API int pkgmgr_client_usr_activate_app(pkgmgr_client *pc, const char *appid,
1114 pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1117 int ret = PKGMGR_R_ECOMM;
1118 char *req_key = NULL;
1119 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1120 struct cb_info *cb_info;
1122 if (pc == NULL || appid == NULL) {
1123 ERR("invalid parameter");
1124 return PKGMGR_R_EINVAL;
1127 ret = pkgmgr_client_connection_send_request(client, "enable_app",
1128 g_variant_new("(us)", uid, appid), &result);
1129 if (ret != PKGMGR_R_OK) {
1130 ERR("request failed: %d", ret);
1134 g_variant_get(result, "(i&s)", &ret, &req_key);
1135 if (req_key == NULL) {
1136 g_variant_unref(result);
1137 return PKGMGR_R_ECOMM;
1139 if (ret != PKGMGR_R_OK) {
1140 g_variant_unref(result);
1144 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1146 if (cb_info == NULL) {
1147 g_variant_unref(result);
1148 return PKGMGR_R_ENOMEM;
1150 g_variant_unref(result);
1151 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1152 if (ret != PKGMGR_R_OK) {
1153 __free_cb_info(cb_info);
1156 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1158 return cb_info->req_id;
1161 API int pkgmgr_client_activate_app(pkgmgr_client *pc, const char *appid,
1162 pkgmgr_app_handler app_event_cb, void *data)
1164 return pkgmgr_client_usr_activate_app(pc, appid, app_event_cb,
1168 API int pkgmgr_client_usr_activate_apps(pkgmgr_client *pc, const char **appids,
1169 int n_apps, pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1172 GVariantBuilder *builder;
1173 int ret = PKGMGR_R_ECOMM;
1174 char *req_key = NULL;
1175 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1176 struct cb_info *cb_info;
1179 if (pc == NULL || appids == NULL || n_apps < 1) {
1180 ERR("invalid parameter");
1181 return PKGMGR_R_EINVAL;
1184 if (client->pc_type != PC_REQUEST) {
1185 ERR("client type is not PC_REQUEST");
1186 return PKGMGR_R_EINVAL;
1189 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1190 for (i = 0; i < n_apps; i++)
1191 g_variant_builder_add(builder, "s", appids[i]);
1193 ret = pkgmgr_client_connection_send_request(client, "enable_apps",
1194 g_variant_new("(uas)", uid, builder), &result);
1195 g_variant_builder_unref(builder);
1196 if (ret != PKGMGR_R_OK) {
1197 ERR("request failed: %d", ret);
1201 g_variant_get(result, "(i&s)", &ret, &req_key);
1202 if (req_key == NULL) {
1203 g_variant_unref(result);
1204 return PKGMGR_R_ECOMM;
1206 if (ret != PKGMGR_R_OK) {
1207 g_variant_unref(result);
1211 cb_info = __create_app_event_cb_info(client, app_event_cb, data, req_key);
1212 if (cb_info == NULL) {
1213 g_variant_unref(result);
1214 return PKGMGR_R_ERROR;
1216 g_variant_unref(result);
1217 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1218 if (ret != PKGMGR_R_OK) {
1219 __free_cb_info(cb_info);
1222 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1224 return cb_info->req_id;
1227 API int pkgmgr_client_activate_apps(pkgmgr_client *pc, const char **appids,
1228 int n_apps, pkgmgr_app_handler app_event_cb, void *data)
1230 return pkgmgr_client_usr_activate_apps(pc, appids, n_apps,
1231 app_event_cb, data, _getuid());
1234 API int pkgmgr_client_activate_global_app_for_uid(pkgmgr_client *pc,
1235 const char *appid, pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1238 int ret = PKGMGR_R_ECOMM;
1239 char *req_key = NULL;
1240 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1241 struct cb_info *cb_info;
1243 if (pc == NULL || appid == NULL) {
1244 ERR("invalid parameter");
1245 return PKGMGR_R_EINVAL;
1248 ret = pkgmgr_client_connection_send_request(client,
1249 "enable_global_app_for_uid",
1250 g_variant_new("(us)", uid, appid), &result);
1251 if (ret != PKGMGR_R_OK) {
1252 ERR("request failed: %d", ret);
1256 g_variant_get(result, "(i&s)", &ret, &req_key);
1257 if (req_key == NULL) {
1258 g_variant_unref(result);
1259 return PKGMGR_R_ECOMM;
1261 if (ret != PKGMGR_R_OK) {
1262 g_variant_unref(result);
1266 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1268 if (cb_info == NULL) {
1269 g_variant_unref(result);
1270 return PKGMGR_R_ENOMEM;
1272 g_variant_unref(result);
1273 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1274 if (ret != PKGMGR_R_OK) {
1275 __free_cb_info(cb_info);
1278 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1280 return cb_info->req_id;
1283 API int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid,
1284 pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1287 int ret = PKGMGR_R_ECOMM;
1288 char *req_key = NULL;
1289 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1290 struct cb_info *cb_info;
1292 if (pc == NULL || appid == NULL) {
1293 ERR("invalid parameter");
1294 return PKGMGR_R_EINVAL;
1297 ret = pkgmgr_client_connection_send_request(client, "disable_app",
1298 g_variant_new("(us)", uid, appid), &result);
1299 if (ret != PKGMGR_R_OK) {
1300 ERR("request failed: %d", ret);
1304 g_variant_get(result, "(i&s)", &ret, &req_key);
1305 if (req_key == NULL) {
1306 g_variant_unref(result);
1307 return PKGMGR_R_ECOMM;
1309 if (ret != PKGMGR_R_OK) {
1310 g_variant_unref(result);
1314 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1316 if (cb_info == NULL) {
1317 g_variant_unref(result);
1318 return PKGMGR_R_ENOMEM;
1320 g_variant_unref(result);
1321 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1322 if (ret != PKGMGR_R_OK) {
1323 __free_cb_info(cb_info);
1326 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1328 return cb_info->req_id;
1331 API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid,
1332 pkgmgr_app_handler app_event_cb, void *data)
1334 return pkgmgr_client_usr_deactivate_app(pc, appid, app_event_cb, data,
1338 API int pkgmgr_client_usr_deactivate_apps(pkgmgr_client *pc,
1339 const char **appids, int n_apps,
1340 pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1343 GVariantBuilder *builder;
1344 int ret = PKGMGR_R_ECOMM;
1345 char *req_key = NULL;
1346 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1347 struct cb_info *cb_info;
1350 if (pc == NULL || appids == NULL || n_apps < 1) {
1351 ERR("invalid parameter");
1352 return PKGMGR_R_EINVAL;
1355 if (client->pc_type != PC_REQUEST) {
1356 ERR("client type is not PC_REQUEST");
1357 return PKGMGR_R_EINVAL;
1360 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1361 for (i = 0; i < n_apps; i++)
1362 g_variant_builder_add(builder, "s", appids[i]);
1364 ret = pkgmgr_client_connection_send_request(client, "disable_apps",
1365 g_variant_new("(uas)", uid, builder), &result);
1366 g_variant_builder_unref(builder);
1367 if (ret != PKGMGR_R_OK) {
1368 ERR("request failed: %d", ret);
1372 g_variant_get(result, "(i&s)", &ret, &req_key);
1373 if (req_key == NULL) {
1374 g_variant_unref(result);
1375 return PKGMGR_R_ECOMM;
1377 if (ret != PKGMGR_R_OK) {
1378 g_variant_unref(result);
1382 cb_info = __create_app_event_cb_info(client, app_event_cb, data, req_key);
1383 if (cb_info == NULL) {
1384 g_variant_unref(result);
1385 return PKGMGR_R_ERROR;
1387 g_variant_unref(result);
1388 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1389 if (ret != PKGMGR_R_OK) {
1390 __free_cb_info(cb_info);
1393 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1395 return cb_info->req_id;
1398 API int pkgmgr_client_deactivate_apps(pkgmgr_client *pc, const char **appids,
1399 int n_apps, pkgmgr_app_handler app_event_cb, void *data)
1401 return pkgmgr_client_usr_deactivate_apps(pc, appids, n_apps,
1402 app_event_cb, data, _getuid());
1405 API int pkgmgr_client_deactivate_global_app_for_uid(pkgmgr_client *pc,
1406 const char *appid, pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1409 int ret = PKGMGR_R_ECOMM;
1410 char *req_key = NULL;
1411 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1412 struct cb_info *cb_info;
1414 if (pc == NULL || appid == NULL) {
1415 ERR("invalid parameter");
1416 return PKGMGR_R_EINVAL;
1419 ret = pkgmgr_client_connection_send_request(client,
1420 "disable_global_app_for_uid",
1421 g_variant_new("(us)", uid, appid), &result);
1422 if (ret != PKGMGR_R_OK) {
1423 ERR("request failed: %d", ret);
1427 g_variant_get(result, "(i&s)", &ret, &req_key);
1428 if (req_key == NULL) {
1429 g_variant_unref(result);
1430 return PKGMGR_R_ECOMM;
1432 if (ret != PKGMGR_R_OK) {
1433 g_variant_unref(result);
1437 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1439 if (cb_info == NULL) {
1440 g_variant_unref(result);
1441 return PKGMGR_R_ENOMEM;
1443 g_variant_unref(result);
1444 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1445 if (ret != PKGMGR_R_OK) {
1446 __free_cb_info(cb_info);
1449 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1451 return cb_info->req_id;
1454 API int pkgmgr_client_usr_clear_user_data(pkgmgr_client *pc,
1455 const char *pkg_type, const char *appid, pkgmgr_mode mode,
1460 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1462 if (pc == NULL || appid == NULL || uid == GLOBAL_USER) {
1463 ERR("invalid parameter");
1464 return PKGMGR_R_EINVAL;
1467 if (client->pc_type != PC_REQUEST) {
1468 ERR("client->pc_type is not PC_REQUEST");
1469 return PKGMGR_R_EINVAL;
1472 ret = pkgmgr_client_connection_send_request(client, "cleardata",
1473 g_variant_new("(us)", uid, appid), &result);
1474 if (ret != PKGMGR_R_OK) {
1475 ERR("request failed: %d", ret);
1479 g_variant_get(result, "(i)", &ret);
1480 g_variant_unref(result);
1485 API int pkgmgr_client_clear_user_data(pkgmgr_client *pc, const char *pkg_type,
1486 const char *appid, pkgmgr_mode mode)
1488 return pkgmgr_client_usr_clear_user_data(pc, pkg_type, appid, mode,
1492 API int pkgmgr_client_set_status_type(pkgmgr_client *pc, int status_type)
1494 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1497 ERR("invalid parameter");
1498 return PKGMGR_R_EINVAL;
1501 client->status_type = status_type;
1506 API int pkgmgr_client_listen_status(pkgmgr_client *pc, pkgmgr_handler event_cb,
1510 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1511 struct cb_info *cb_info;
1513 if (pc == NULL || event_cb == NULL) {
1514 ERR("invalid parameter");
1515 return PKGMGR_R_EINVAL;
1518 if (client->pc_type != PC_LISTENING) {
1519 ERR("client->pc_type is not PC_LISTENING");
1520 return PKGMGR_R_EINVAL;
1523 cb_info = __create_event_cb_info(client, event_cb, data, NULL);
1524 if (cb_info == NULL)
1525 return PKGMGR_R_ENOMEM;
1526 cb_info->status_type = client->status_type;
1527 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1528 if (ret != PKGMGR_R_OK) {
1529 __free_cb_info(cb_info);
1532 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1534 return cb_info->req_id;
1537 API int pkgmgr_client_listen_app_status(pkgmgr_client *pc,
1538 pkgmgr_app_handler app_event_cb, void *data)
1541 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1542 struct cb_info *cb_info;
1544 if (pc == NULL || app_event_cb == NULL) {
1545 ERR("invalid parameter");
1546 return PKGMGR_R_EINVAL;
1549 if (client->pc_type != PC_LISTENING) {
1550 ERR("client->pc_type is not PC_LISTENING");
1551 return PKGMGR_R_EINVAL;
1554 cb_info = __create_app_event_cb_info(client, app_event_cb, data, NULL);
1555 if (cb_info == NULL)
1556 return PKGMGR_R_ENOMEM;
1557 cb_info->status_type = client->status_type;
1558 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1559 if (ret != PKGMGR_R_OK) {
1560 __free_cb_info(cb_info);
1563 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1565 return cb_info->req_id;
1568 API int pkgmgr_client_remove_listen_status(pkgmgr_client *pc)
1570 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1573 struct cb_info *cb_info;
1576 ERR("invalid parameter");
1577 return PKGMGR_R_EINVAL;
1580 /* unset all callback */
1581 tmp = client->cb_info_list;
1582 while (tmp != NULL) {
1584 cb_info = (struct cb_info *)tmp->data;
1585 pkgmgr_client_connection_unset_callback(pc, cb_info);
1586 client->cb_info_list = g_list_delete_link(client->cb_info_list,
1588 __free_cb_info(cb_info);
1595 API int pkgmgr_client_broadcast_status(pkgmgr_client *pc, const char *pkg_type,
1596 const char *pkgid, const char *key, const char *val)
1598 /* client cannot broadcast signal */
1602 /* TODO: deprecate(or remove) */
1603 API int pkgmgr_client_request_service(pkgmgr_request_service_type service_type,
1604 int service_mode, pkgmgr_client *pc, const char *pkg_type,
1605 const char *pkgid, const char *custom_info,
1606 pkgmgr_handler event_cb, void *data)
1608 return pkgmgr_client_usr_request_service(service_type, service_mode,
1609 pc, pkg_type, pkgid, _getuid(), custom_info, event_cb,
1613 API int pkgmgr_client_usr_request_service(
1614 pkgmgr_request_service_type service_type, int service_mode,
1615 pkgmgr_client *pc, const char *pkg_type, const char *pkgid,
1616 uid_t uid, const char *custom_info, pkgmgr_handler event_cb,
1621 /* Check for NULL value of service type */
1622 retvm_if(service_type > PM_REQUEST_MAX, PKGMGR_R_EINVAL, "service type is not defined\n");
1623 retvm_if(service_type < 0, PKGMGR_R_EINVAL, "service type is error\n");
1625 switch (service_type) {
1626 case PM_REQUEST_MOVE:
1627 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1628 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1629 tryvm_if((service_mode < PM_MOVE_TO_INTERNAL) || (service_mode > PM_MOVE_TO_EXTENDED), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1631 ret = __move_pkg_process(pc, pkgid, pkg_type, uid, (pkgmgr_move_type)service_mode, event_cb, data);
1634 case PM_REQUEST_GET_SIZE:
1635 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1636 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1637 tryvm_if((service_mode < PM_GET_TOTAL_SIZE) || (service_mode >= PM_GET_MAX), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1639 ret = __get_size_process(pc, pkgid, uid, (pkgmgr_getsize_type)service_mode, event_cb, data);
1642 case PM_REQUEST_KILL_APP:
1643 case PM_REQUEST_CHECK_APP:
1644 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1645 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1647 ret = __check_app_process(service_type, pc, pkgid, uid, data);
1649 ERR("__check_app_process fail \n");
1656 ERR("Wrong Request\n");
1666 API int pkgmgr_client_usr_clear_cache_dir(const char *pkgid, uid_t uid)
1670 struct pkgmgr_client_t *client;
1672 if (pkgid == NULL || uid == GLOBAL_USER) {
1673 ERR("invalid parameter");
1674 return PKGMGR_R_EINVAL;
1677 client = pkgmgr_client_new(PC_REQUEST);
1678 if (client == NULL) {
1679 ERR("out of memory");
1680 return PKGMGR_R_ENOMEM;
1683 ret = pkgmgr_client_connection_send_request(client, "clearcache",
1684 g_variant_new("(us)", uid, pkgid), &result);
1685 if (ret != PKGMGR_R_OK) {
1686 ERR("request failed: %d", ret);
1687 pkgmgr_client_free(client);
1691 g_variant_get(result, "(i)", &ret);
1692 g_variant_unref(result);
1693 pkgmgr_client_free(client);
1698 API int pkgmgr_client_clear_cache_dir(const char *pkgid)
1700 return pkgmgr_client_usr_clear_cache_dir(pkgid, _getuid());
1703 API int pkgmgr_client_clear_usr_all_cache_dir(uid_t uid)
1705 return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, uid);
1708 API int pkgmgr_client_clear_all_cache_dir(void)
1710 return pkgmgr_client_usr_clear_cache_dir(
1711 PKG_CLEAR_ALL_CACHE, _getuid());
1714 API int pkgmgr_client_get_size(pkgmgr_client *pc, const char *pkgid,
1715 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
1718 return pkgmgr_client_usr_get_size(pc, pkgid, get_type, event_cb, data,
1722 /* TODO: deprecate(or remove) */
1723 API int pkgmgr_client_usr_get_size(pkgmgr_client *pc, const char *pkgid,
1724 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
1725 void *data, uid_t uid)
1728 int ret = PKGMGR_R_ECOMM;
1729 char *req_key = NULL;
1730 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1731 struct cb_info *cb_info;
1733 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
1734 ERR("invalid parameter");
1735 return PKGMGR_R_EINVAL;
1738 if (client->pc_type != PC_REQUEST) {
1739 ERR("client->pc_type is not PC_REQUEST");
1740 return PKGMGR_R_EINVAL;
1744 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
1745 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
1747 get_type = PM_GET_PKG_SIZE_INFO;
1749 ret = pkgmgr_client_connection_send_request(client, "getsize",
1750 g_variant_new("(usi)", uid, pkgid, get_type), &result);
1751 if (ret != PKGMGR_R_OK) {
1752 ERR("request failed: %d", ret);
1756 g_variant_get(result, "(i&s)", &ret, &req_key);
1757 if (req_key == NULL) {
1758 g_variant_unref(result);
1759 return PKGMGR_R_ECOMM;
1761 if (ret != PKGMGR_R_OK) {
1762 g_variant_unref(result);
1766 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1767 if (cb_info == NULL) {
1768 g_variant_unref(result);
1769 return PKGMGR_R_ENOMEM;
1771 g_variant_unref(result);
1772 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1773 if (ret != PKGMGR_R_OK) {
1774 __free_cb_info(cb_info);
1777 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1782 API int pkgmgr_client_usr_get_package_size_info(pkgmgr_client *pc,
1783 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
1784 void *user_data, uid_t uid)
1787 int ret = PKGMGR_R_ECOMM;
1788 char *req_key = NULL;
1790 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1791 struct cb_info *cb_info;
1793 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
1794 ERR("invalid parameter");
1795 return PKGMGR_R_EINVAL;
1798 if (client->pc_type != PC_REQUEST) {
1799 ERR("client->pc_type is not PC_REQUEST");
1800 return PKGMGR_R_EINVAL;
1803 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
1804 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
1806 get_type = PM_GET_PKG_SIZE_INFO;
1808 ret = pkgmgr_client_connection_send_request(client, "getsize",
1809 g_variant_new("(usi)", uid, pkgid, get_type), &result);
1810 if (ret != PKGMGR_R_OK) {
1811 ERR("request failed: %d", ret);
1815 g_variant_get(result, "(i&s)", &ret, &req_key);
1816 if (req_key == NULL) {
1817 g_variant_unref(result);
1818 return PKGMGR_R_ECOMM;
1820 if (ret != PKGMGR_R_OK) {
1821 g_variant_unref(result);
1825 cb_info = __create_size_info_cb_info(client, event_cb, user_data,
1827 if (cb_info == NULL) {
1828 g_variant_unref(result);
1829 return PKGMGR_R_ENOMEM;
1831 g_variant_unref(result);
1832 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1833 if (ret != PKGMGR_R_OK) {
1834 __free_cb_info(cb_info);
1837 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1842 API int pkgmgr_client_get_package_size_info(pkgmgr_client *pc,
1843 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
1846 return pkgmgr_client_usr_get_package_size_info(pc, pkgid, event_cb,
1847 user_data, _getuid());
1850 API int pkgmgr_client_usr_get_total_package_size_info(pkgmgr_client *pc,
1851 pkgmgr_total_pkg_size_info_receive_cb event_cb,
1852 void *user_data, uid_t uid)
1853 { /* total package size info */
1854 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL,
1855 (pkgmgr_pkg_size_info_receive_cb)event_cb,
1859 API int pkgmgr_client_get_total_package_size_info(pkgmgr_client *pc,
1860 pkgmgr_total_pkg_size_info_receive_cb event_cb, void *user_data)
1862 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL,
1863 (pkgmgr_pkg_size_info_receive_cb)event_cb,
1864 user_data, _getuid());
1867 API int pkgmgr_client_generate_license_request(pkgmgr_client *pc,
1868 const char *resp_data, char **req_data, char **license_url)
1874 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1876 if (pc == NULL || resp_data == NULL || req_data == NULL ||
1877 license_url == NULL) {
1878 ERR("invalid parameter");
1879 return PKGMGR_R_EINVAL;
1882 if (client->pc_type != PC_REQUEST) {
1883 ERR("client->pc_type is not PC_REQUEST");
1884 return PKGMGR_R_EINVAL;
1887 ret = pkgmgr_client_connection_send_request(client,
1888 "generate_license_request",
1889 g_variant_new("(s)", resp_data), &result);
1890 if (ret != PKGMGR_R_OK) {
1891 ERR("request failed: %d", ret);
1895 g_variant_get(result, "(i&s&s)", &ret, &data, &url);
1896 if (ret != PKGMGR_R_OK) {
1897 ERR("generate_license_request failed: %d", ret);
1898 g_variant_unref(result);
1902 *req_data = strdup(data);
1903 *license_url = strdup(url);
1905 g_variant_unref(result);
1910 API int pkgmgr_client_register_license(pkgmgr_client *pc, const char *resp_data)
1914 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1916 if (pc == NULL || resp_data == NULL) {
1917 ERR("invalid parameter");
1918 return PKGMGR_R_EINVAL;
1921 if (client->pc_type != PC_REQUEST) {
1922 ERR("client->pc_type is not PC_REQUEST");
1923 return PKGMGR_R_EINVAL;
1926 ret = pkgmgr_client_connection_send_request(client, "register_license",
1927 g_variant_new("(s)", resp_data), &result);
1928 if (ret != PKGMGR_R_OK) {
1929 ERR("request failed: %d", ret);
1933 g_variant_get(result, "(i)", &ret);
1934 g_variant_unref(result);
1935 if (ret != PKGMGR_R_OK)
1936 ERR("register license failed: %d", ret);
1941 API int pkgmgr_client_decrypt_package(pkgmgr_client *pc,
1942 const char *drm_file_path, const char *decrypted_file_path)
1946 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1948 if (pc == NULL || drm_file_path == NULL ||
1949 decrypted_file_path == NULL) {
1950 ERR("invalid parameter");
1951 return PKGMGR_R_EINVAL;
1954 if (client->pc_type != PC_REQUEST) {
1955 ERR("client->pc_type is not PC_REQUEST");
1956 return PKGMGR_R_EINVAL;
1959 ret = pkgmgr_client_connection_send_request(client, "decrypt_package",
1960 g_variant_new("(ss)", drm_file_path,
1961 decrypted_file_path), &result);
1962 if (ret != PKGMGR_R_OK) {
1963 ERR("request failed: %d", ret);
1967 g_variant_get(result, "(i)", &ret);
1968 g_variant_unref(result);
1969 if (ret != PKGMGR_R_OK)
1970 ERR("decrypt_package failed: %d", ret);
1975 API int pkgmgr_client_enable_splash_screen(pkgmgr_client *pc, const char *appid)
1977 return pkgmgr_client_usr_enable_splash_screen(pc, appid, _getuid());
1980 API int pkgmgr_client_usr_enable_splash_screen(pkgmgr_client *pc,
1981 const char *appid, uid_t uid)
1985 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1987 if (pc == NULL || appid == NULL) {
1988 ERR("Invalid parameter");
1989 return PKGMGR_R_EINVAL;
1992 ret = pkgmgr_client_connection_send_request(client,
1993 "enable_app_splash_screen",
1994 g_variant_new("(us)", uid, appid), &result);
1995 if (ret != PKGMGR_R_OK) {
1996 ERR("request failed: %d", ret);
2000 g_variant_get(result, "(i)", &ret);
2001 g_variant_unref(result);
2002 if (ret != PKGMGR_R_OK)
2003 ERR("enable splash screen failed: %d", ret);
2008 API int pkgmgr_client_disable_splash_screen(pkgmgr_client *pc,
2011 return pkgmgr_client_usr_disable_splash_screen(pc, appid,
2015 API int pkgmgr_client_usr_disable_splash_screen(pkgmgr_client *pc,
2016 const char *appid, uid_t uid)
2020 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2022 if (pc == NULL || appid == NULL) {
2023 ERR("Invalid parameter");
2024 return PKGMGR_R_EINVAL;
2027 ret = pkgmgr_client_connection_send_request(client,
2028 "disable_app_splash_screen",
2029 g_variant_new("(us)", uid, appid), &result);
2030 if (ret != PKGMGR_R_OK) {
2031 ERR("request failed: %d", ret);
2035 g_variant_get(result, "(i)", &ret);
2036 g_variant_unref(result);
2037 if (ret != PKGMGR_R_OK)
2038 ERR("disable splash screen failed: %d", ret);
2043 static int __set_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
2044 int mode, uid_t uid)
2047 int ret = PKGMGR_R_ECOMM;
2048 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2050 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
2051 ERR("invalid parameter");
2052 return PKGMGR_R_EINVAL;
2055 ret = pkgmgr_client_connection_send_request(client,
2056 "set_restriction_mode",
2057 g_variant_new("(usi)", uid, pkgid, mode), &result);
2058 if (ret != PKGMGR_R_OK) {
2059 ERR("request failed: %d", ret);
2063 g_variant_get(result, "(i)", &ret);
2064 g_variant_unref(result);
2069 API int pkgmgr_client_usr_set_pkg_restriction_mode(pkgmgr_client *pc,
2070 const char *pkgid, int mode, uid_t uid)
2072 return __set_pkg_restriction_mode(pc, pkgid, mode, uid);
2075 API int pkgmgr_client_set_pkg_restriction_mode(pkgmgr_client *pc,
2076 const char *pkgid, int mode)
2078 return pkgmgr_client_usr_set_pkg_restriction_mode(pc, pkgid, mode,
2082 static int __unset_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
2083 int mode, uid_t uid)
2086 int ret = PKGMGR_R_ECOMM;
2087 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2089 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
2090 ERR("invalid parameter");
2091 return PKGMGR_R_EINVAL;
2094 ret = pkgmgr_client_connection_send_request(client,
2095 "unset_restriction_mode",
2096 g_variant_new("(usi)", uid, pkgid, mode), &result);
2097 if (ret != PKGMGR_R_OK) {
2098 ERR("request failed: %d", ret);
2102 g_variant_get(result, "(i)", &ret);
2103 g_variant_unref(result);
2109 API int pkgmgr_client_usr_unset_pkg_restriction_mode(pkgmgr_client *pc,
2110 const char *pkgid, int mode, uid_t uid)
2112 return __unset_pkg_restriction_mode(pc, pkgid, mode, uid);
2115 API int pkgmgr_client_unset_pkg_restriction_mode(pkgmgr_client *pc,
2116 const char *pkgid, int mode)
2118 return pkgmgr_client_usr_unset_pkg_restriction_mode(pc, pkgid, mode,
2122 static int __get_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
2123 int *mode, uid_t uid)
2126 int ret = PKGMGR_R_ECOMM;
2128 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2130 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0) {
2131 ERR("invalid parameter");
2132 return PKGMGR_R_EINVAL;
2135 ret = pkgmgr_client_connection_send_request(client,
2136 "get_restriction_mode",
2137 g_variant_new("(us)", uid, pkgid), &result);
2138 if (ret != PKGMGR_R_OK) {
2139 ERR("request failed: %d", ret);
2143 g_variant_get(result, "(ii)", &m, &ret);
2144 g_variant_unref(result);
2145 if (ret != PKGMGR_R_OK)
2153 API int pkgmgr_client_usr_get_pkg_restriction_mode(pkgmgr_client *pc,
2154 const char *pkgid, int *mode, uid_t uid)
2156 return __get_pkg_restriction_mode(pc, pkgid, mode, uid);
2159 API int pkgmgr_client_get_pkg_restriction_mode(pkgmgr_client *pc,
2160 const char *pkgid, int *mode)
2162 return pkgmgr_client_usr_get_pkg_restriction_mode(pc, pkgid, mode,
2166 API int pkgmgr_client_usr_set_restriction_mode(pkgmgr_client *pc, int mode,
2170 int ret = PKGMGR_R_ECOMM;
2171 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2174 ERR("invalid parameter");
2175 return PKGMGR_R_EINVAL;
2178 ret = pkgmgr_client_connection_send_request(client,
2179 "set_restriction_mode",
2180 g_variant_new("(usi)", uid, "", mode), &result);
2181 if (ret != PKGMGR_R_OK) {
2182 ERR("request failed: %d", ret);
2186 g_variant_get(result, "(i)", &ret);
2187 g_variant_unref(result);
2192 API int pkgmgr_client_set_restriction_mode(pkgmgr_client *pc, int mode)
2194 return pkgmgr_client_usr_set_restriction_mode(pc, mode, _getuid());
2197 API int pkgmgr_client_usr_unset_restriction_mode(pkgmgr_client *pc, int mode,
2201 int ret = PKGMGR_R_ECOMM;
2202 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2205 ERR("invalid parameter");
2206 return PKGMGR_R_EINVAL;
2209 ret = pkgmgr_client_connection_send_request(client,
2210 "unset_restriction_mode",
2211 g_variant_new("(usi)", uid, "", mode), &result);
2212 if (ret != PKGMGR_R_OK) {
2213 ERR("request failed: %d", ret);
2217 g_variant_get(result, "(i)", &ret);
2218 g_variant_unref(result);
2223 API int pkgmgr_client_unset_restriction_mode(pkgmgr_client *pc, int mode)
2225 return pkgmgr_client_usr_unset_restriction_mode(pc, mode, _getuid());
2228 API int pkgmgr_client_usr_get_restriction_mode(pkgmgr_client *pc,
2229 int *mode, uid_t uid)
2232 int ret = PKGMGR_R_ECOMM;
2234 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2237 ERR("invalid parameter");
2238 return PKGMGR_R_EINVAL;
2241 ret = pkgmgr_client_connection_send_request(client,
2242 "get_restriction_mode",
2243 g_variant_new("(us)", uid, ""), &result);
2244 if (ret != PKGMGR_R_OK) {
2245 ERR("request failed: %d", ret);
2249 g_variant_get(result, "(ii)", &m, &ret);
2250 g_variant_unref(result);
2251 if (ret != PKGMGR_R_OK)
2259 API int pkgmgr_client_get_restriction_mode(pkgmgr_client *pc, int *mode)
2261 return pkgmgr_client_usr_get_restriction_mode(pc, mode, _getuid());
2264 API pkgmgr_info *pkgmgr_client_check_pkginfo_from_file(const char *pkg_path)
2267 pkg_plugin_set *plugin_set;
2268 package_manager_pkg_detail_info_t *info;
2271 if (pkg_path == NULL) {
2272 ERR("invalid parameter");
2276 pkg_type = __get_type_from_path(pkg_path);
2277 if (pkg_type == NULL) {
2278 ERR("cannot get pkg type");
2282 plugin_set = _package_manager_load_library(pkg_type);
2283 if (plugin_set == NULL) {
2284 ERR("failed to load library for %s", pkg_type);
2289 info = calloc(1, sizeof(package_manager_pkg_detail_info_t));
2291 ERR("out of memory");
2296 ret = plugin_set->get_pkg_detail_info_from_package(pkg_path, info);
2298 ERR("get_pkg_detail_info_from_package failed");
2306 return (pkgmgr_info *)info;
2309 API int pkgmgr_client_free_pkginfo(pkgmgr_info *info)
2311 package_manager_pkg_detail_info_t *pkg_info =
2312 (package_manager_pkg_detail_info_t *)info;
2315 ERR("invalid parameter");
2316 return PKGMGR_R_EINVAL;
2319 g_list_free_full(pkg_info->privilege_list, free);
2320 free(pkg_info->icon_buf);
2326 API int pkgmgr_client_usr_set_app_label(pkgmgr_client *pc, char *appid,
2327 char *label, uid_t uid)
2331 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2333 if (pc == NULL || appid == NULL || label == NULL) {
2334 ERR("Invalid parameter");
2335 return PKGMGR_R_EINVAL;
2338 ret = pkgmgr_client_connection_send_request(client,
2340 g_variant_new("(uss)", uid, appid, label), &result);
2341 if (ret != PKGMGR_R_OK) {
2342 ERR("Request failed: %d", ret);
2346 g_variant_get(result, "(i)", &ret);
2347 g_variant_unref(result);
2352 API int pkgmgr_client_set_app_label(pkgmgr_client *pc, char *appid, char *label)
2354 return pkgmgr_client_usr_set_app_label(pc, appid, label, _getuid());
2357 API int pkgmgr_client_usr_set_app_icon(pkgmgr_client *pc, char *appid,
2358 char *icon_path, uid_t uid)
2362 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2364 if (pc == NULL || appid == NULL || icon_path == NULL) {
2365 ERR("Invalid parameter");
2366 return PKGMGR_R_EINVAL;
2369 if (access(icon_path, F_OK) != 0) {
2370 ERR("failed to access: %s", icon_path);
2371 return PKGMGR_R_EINVAL;
2374 ret = pkgmgr_client_connection_send_request(client,
2376 g_variant_new("(uss)", uid, appid, icon_path), &result);
2377 if (ret != PKGMGR_R_OK) {
2378 ERR("Request failed: %d", ret);
2382 g_variant_get(result, "(i)", &ret);
2383 g_variant_unref(result);
2388 API int pkgmgr_client_set_app_icon(pkgmgr_client *pc, char *appid, char *icon_path)
2390 return pkgmgr_client_usr_set_app_icon(pc, appid, icon_path, _getuid());
2393 API int pkgmgr_client_set_debug_mode(pkgmgr_client *pc, bool debug_mode)
2395 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2398 ERR("invalid parameter");
2399 return PKGMGR_R_EINVAL;
2402 client->debug_mode = debug_mode;
2407 API int pkgmgr_client_set_skip_optimization(pkgmgr_client *pc, bool skip_optimization)
2409 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2412 ERR("invalid parameter");
2413 return PKGMGR_R_EINVAL;
2416 client->skip_optimization = skip_optimization;
2421 API int pkgmgr_client_usr_migrate_external_image(pkgmgr_client *pc,
2422 const char *pkgid, uid_t uid)
2425 int ret = PKGMGR_R_ECOMM;
2426 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2429 ERR("invalid parameter");
2430 return PKGMGR_R_EINVAL;
2433 ret = pkgmgr_client_connection_send_request(client,
2434 "migrate_external_image",
2435 g_variant_new("(us)", uid, pkgid), &result);
2436 if (ret != PKGMGR_R_OK) {
2437 ERR("request failed: %d", ret);
2441 g_variant_get(result, "(i)", &ret);
2442 g_variant_unref(result);