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 GList *jobs_to_free;
58 static inline uid_t _getuid(void)
62 if (uid < REGULAR_USER)
68 static int _get_request_id()
70 static int internal_req_id = 1;
72 return internal_req_id++;
75 static struct cb_info *__create_event_cb_info(struct pkgmgr_client_t *client,
76 pkgmgr_handler event_cb, void *data, const char *req_key)
78 struct cb_info *cb_info;
80 cb_info = calloc(1, sizeof(struct cb_info));
81 if (cb_info == NULL) {
85 cb_info->client = client;
86 cb_info->event_cb = event_cb;
88 cb_info->req_id = _get_request_id();
89 if (req_key != NULL) {
90 cb_info->req_key = strdup(req_key);
91 if (cb_info->req_key == NULL) {
101 static struct cb_info *__create_app_event_cb_info(
102 struct pkgmgr_client_t *client, pkgmgr_app_handler app_event_cb,
103 void *data, const char *req_key)
105 struct cb_info *cb_info;
107 cb_info = calloc(1, sizeof(struct cb_info));
108 if (cb_info == NULL) {
109 ERR("out of memory");
112 cb_info->client = client;
113 cb_info->app_event_cb = app_event_cb;
114 cb_info->data = data;
115 cb_info->req_id = _get_request_id();
116 if (req_key != NULL) {
117 cb_info->req_key = strdup(req_key);
118 if (cb_info->req_key == NULL) {
119 ERR("out of memory");
128 static struct cb_info *__create_size_info_cb_info(
129 struct pkgmgr_client_t *client,
130 pkgmgr_pkg_size_info_receive_cb size_info_cb,
131 void *data, const char *req_key)
133 struct cb_info *cb_info;
135 cb_info = calloc(1, sizeof(struct cb_info));
136 if (cb_info == NULL) {
137 ERR("out of memory");
140 cb_info->client = client;
141 cb_info->size_info_cb = size_info_cb;
142 cb_info->data = data;
143 cb_info->req_id = _get_request_id();
144 if (req_key != NULL) {
145 cb_info->req_key = strdup(req_key);
146 if (cb_info->req_key == NULL) {
147 ERR("out of memory");
156 static void __do_free_cb_info(gpointer data)
158 struct cb_info *cb_info = (struct cb_info *)data;
160 g_list_free(cb_info->sid_list);
161 free(cb_info->req_key);
165 static void __free_cb_info_cb(gpointer data)
167 g_idle_remove_by_data(data);
168 __do_free_cb_info(data);
171 __attribute__((destructor)) static void __free_cb_info_at_destructor(void)
173 g_list_free_full(jobs_to_free, __free_cb_info_cb);
176 static gboolean __free_cb_info_at_idle(gpointer data)
180 tmp = g_list_find(jobs_to_free, data);
181 jobs_to_free = g_list_delete_link(jobs_to_free, tmp);
182 __do_free_cb_info(data);
184 return G_SOURCE_REMOVE;
187 static void __free_cb_info(struct cb_info *cb_info)
189 g_idle_add(__free_cb_info_at_idle, cb_info);
190 jobs_to_free = g_list_append(jobs_to_free, cb_info);
193 static int __get_size_process(pkgmgr_client *pc, const char *pkgid, uid_t uid,
194 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
198 int ret = PKGMGR_R_ECOMM;
199 long long size_info = 0;
200 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
202 if (pc == NULL || pkgid == NULL) {
203 ERR("invalid parameter");
204 return PKGMGR_R_EINVAL;
207 if (client->pc_type != PC_REQUEST) {
208 ERR("client->pc_type is not PC_REQUEST");
209 return PKGMGR_R_EINVAL;
212 ret = pkgmgr_client_connection_send_request(client, "getsize_sync",
213 g_variant_new("(usi)", uid, pkgid, get_type), &result);
214 if (ret != PKGMGR_R_OK) {
215 ERR("request failed: %d", ret);
219 g_variant_get(result, "(ix)", &ret, &size_info);
220 if (ret != PKGMGR_R_OK) {
221 ERR("request result failed: %d", ret);
222 g_variant_unref(result);
227 ERR("invalid size_info=(%lld)", size_info);
230 ret = (int)size_info;
231 DBG("size_info(%lld), return size(%d)", size_info, ret);
234 g_variant_unref(result);
239 static int __move_pkg_process(pkgmgr_client *pc, const char *pkgid,
240 const char *pkg_type, uid_t uid, pkgmgr_move_type move_type,
241 pkgmgr_handler event_cb, void *data)
245 ret = pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type, event_cb, data, uid);
247 ERR("move request failed");
254 static int __check_app_process(pkgmgr_request_service_type service_type,
255 pkgmgr_client *pc, const char *pkgid, uid_t uid, void *data)
258 int ret = PKGMGR_R_ECOMM;
259 pkgmgrinfo_pkginfo_h handle;
261 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
263 retvm_if(client->pc_type != PC_REQUEST, PKGMGR_R_EINVAL, "client->pc_type is not PC_REQUEST\n");
265 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
266 if (ret != PMINFO_R_OK) {
267 ERR("pkgmgrinfo_pkginfo_get_pkginfo failed");
268 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
269 return PKGMGR_R_ERROR;
272 if (service_type == PM_REQUEST_KILL_APP) {
273 ret = pkgmgr_client_connection_send_request(client, "kill",
274 g_variant_new("(us)", uid, pkgid), &result);
275 } else if (service_type == PM_REQUEST_CHECK_APP) {
276 ret = pkgmgr_client_connection_send_request(client, "check",
277 g_variant_new("(us)", uid, pkgid), &result);
279 ERR("unexpected service type: %d", service_type);
280 ret = PKGMGR_R_ERROR;
283 if (ret != PKGMGR_R_OK) {
284 ERR("request failed: %d", ret);
288 g_variant_get(result, "(ii)", &ret, &pid);
289 g_variant_unref(result);
290 if (ret != PKGMGR_R_OK) {
291 ERR("request failed, ret=%d", ret);
297 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
303 API pkgmgr_client *pkgmgr_client_new(pkgmgr_client_type pc_type)
305 struct pkgmgr_client_t *client;
307 if (pc_type == PC_BROADCAST) {
308 ERR("broadcast type is not supported");
312 if (pc_type != PC_REQUEST && pc_type != PC_LISTENING) {
313 ERR("invalid parameter");
317 client = calloc(1, sizeof(struct pkgmgr_client_t));
318 if (client == NULL) {
319 ERR("out of memory");
323 client->pc_type = pc_type;
324 client->status_type = PKGMGR_CLIENT_STATUS_ALL;
326 if (pkgmgr_client_connection_connect(client) != PKGMGR_R_OK) {
331 return (pkgmgr_client *)client;
334 API int pkgmgr_client_free(pkgmgr_client *pc)
336 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
339 ERR("invalid argument");
340 return PKGMGR_R_EINVAL;
343 pkgmgr_client_remove_listen_status(client);
344 pkgmgr_client_connection_disconnect(client);
345 if (client->tep_path)
346 free(client->tep_path);
352 struct manifest_and_type type_map[] = {
353 { "res/wgt/config.xml", "wgt" },
354 { "config.xml", "wgt" },
355 { "tizen-manifest.xml", "tpk" },
359 static char *__get_type_from_path(const char *pkg_path)
361 const char *type = NULL;
365 uf = unzOpen(pkg_path);
367 ERR("failed to open zip file %s", pkg_path);
371 for (i = 0; type_map[i].manifest != NULL; i++) {
372 if (unzLocateFile(uf, type_map[i].manifest, 0) == UNZ_OK) {
373 DBG("pkgtype of %s: [%s]", pkg_path, type_map[i].type);
374 type = type_map[i].type;
380 return type ? strdup(type) : NULL;
383 API int pkgmgr_client_set_tep_path(pkgmgr_client *pc, const char *tep_path,
386 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *) pc;
388 if (pc == NULL || tep_path == NULL) {
389 ERR("invalied parameter");
390 return PKGMGR_R_EINVAL;
393 if (client->tep_path)
394 free(client->tep_path);
396 client->tep_path = strdup(tep_path);
397 client->tep_move = tep_move;
402 API int pkgmgr_client_usr_install_packages(pkgmgr_client *pc,
403 const char **pkg_paths, int n_pkgs, pkgmgr_handler event_cb,
404 void *data, uid_t uid)
407 GVariantBuilder *pkgs_builder;
409 GVariantBuilder *args_builder;
412 char *req_key = NULL;
413 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
414 struct cb_info *cb_info;
417 if (pc == NULL || pkg_paths == NULL || n_pkgs < 1) {
418 ERR("invalid parameter");
419 return PKGMGR_R_EINVAL;
422 if (client->pc_type != PC_REQUEST) {
423 ERR("client type is not PC_REQUEST");
424 return PKGMGR_R_EINVAL;
427 for (i = 0; i < n_pkgs; i++) {
428 if (access(pkg_paths[i], F_OK) != 0) {
429 ERR("failed to access: %s", pkg_paths[i]);
430 return PKGMGR_R_EINVAL;
434 pkgs_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
435 for (i = 0; i < n_pkgs; i++)
436 g_variant_builder_add(pkgs_builder, "s", pkg_paths[i]);
437 pkgs = g_variant_new("as", pkgs_builder);
438 g_variant_builder_unref(pkgs_builder);
440 args_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
441 if (client->debug_mode)
442 g_variant_builder_add(args_builder, "s", "-G");
443 if (client->skip_optimization)
444 g_variant_builder_add(args_builder, "s", "-S");
445 args = g_variant_new("as", args_builder);
446 g_variant_builder_unref(args_builder);
448 ret = pkgmgr_client_connection_send_request(client, "install_pkgs",
449 g_variant_new("(u@as@as)", uid, pkgs, args), &result);
450 if (ret != PKGMGR_R_OK) {
451 ERR("request failed: %d", ret);
455 g_variant_get(result, "(i&s)", &ret, &req_key);
456 if (req_key == NULL) {
457 g_variant_unref(result);
458 return PKGMGR_R_ECOMM;
460 if (ret != PKGMGR_R_OK) {
461 g_variant_unref(result);
465 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
466 if (cb_info == NULL) {
467 g_variant_unref(result);
468 return PKGMGR_R_ERROR;
470 g_variant_unref(result);
471 ret = pkgmgr_client_connection_set_callback(client, cb_info);
472 if (ret != PKGMGR_R_OK) {
473 __free_cb_info(cb_info);
476 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
478 return cb_info->req_id;
481 API int pkgmgr_client_install_packages(pkgmgr_client *pc,
482 const char **pkg_paths, int n_pkgs, pkgmgr_handler event_cb,
485 return pkgmgr_client_usr_install_packages(pc, pkg_paths, n_pkgs,
486 event_cb, data, _getuid());
489 API int pkgmgr_client_usr_install(pkgmgr_client *pc, const char *pkg_type,
490 const char *descriptor_path, const char *pkg_path,
491 const char *optional_data, pkgmgr_mode mode,
492 pkgmgr_handler event_cb, void *data, uid_t uid)
495 int ret = PKGMGR_R_ECOMM;
496 char *req_key = NULL;
497 GVariantBuilder *builder = NULL;
498 GVariant *args = NULL;
499 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
500 struct cb_info *cb_info;
502 if (pc == NULL || pkg_path == NULL) {
503 ERR("invalid parameter");
504 return PKGMGR_R_EINVAL;
507 if (client->pc_type != PC_REQUEST) {
508 ERR("client type is not PC_REQUEST");
509 return PKGMGR_R_EINVAL;
512 if (access(pkg_path, F_OK) != 0) {
513 ERR("failed to access: %s", pkg_path);
514 return PKGMGR_R_EINVAL;
517 if (client->tep_path != NULL && access(client->tep_path, F_OK) != 0) {
518 ERR("failed to access: %s", client->tep_path);
519 return PKGMGR_R_EINVAL;
522 /* build arguments */
523 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
524 if (client->tep_path) {
525 g_variant_builder_add(builder, "s", "-e");
526 g_variant_builder_add(builder, "s", client->tep_path);
527 g_variant_builder_add(builder, "s", "-M");
528 /* TODO: revise tep_move */
529 g_variant_builder_add(builder, "s",
530 client->tep_move ? "tep_move" : "tep_copy");
532 if (client->debug_mode)
533 g_variant_builder_add(builder, "s", "-G");
534 if (client->skip_optimization)
535 g_variant_builder_add(builder, "s", "-S");
537 args = g_variant_new("as", builder);
538 g_variant_builder_unref(builder);
540 ret = pkgmgr_client_connection_send_request(client, "install",
541 g_variant_new("(uss@as)", uid, pkg_type ? pkg_type : "",
544 if (ret != PKGMGR_R_OK) {
545 ERR("request failed: %d", ret);
549 g_variant_get(result, "(i&s)", &ret, &req_key);
550 if (req_key == NULL) {
551 g_variant_unref(result);
552 return PKGMGR_R_ECOMM;
554 if (ret != PKGMGR_R_OK) {
555 g_variant_unref(result);
559 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
560 if (cb_info == NULL) {
561 g_variant_unref(result);
562 return PKGMGR_R_ENOMEM;
564 g_variant_unref(result);
565 ret = pkgmgr_client_connection_set_callback(client, cb_info);
566 if (ret != PKGMGR_R_OK) {
567 __free_cb_info(cb_info);
570 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
572 return cb_info->req_id;
575 API int pkgmgr_client_install(pkgmgr_client *pc, const char *pkg_type,
576 const char *descriptor_path, const char *pkg_path,
577 const char *optional_data, pkgmgr_mode mode,
578 pkgmgr_handler event_cb, void *data)
580 return pkgmgr_client_usr_install(pc, pkg_type, descriptor_path,
581 pkg_path, optional_data, mode, event_cb, data,
585 API int pkgmgr_client_reinstall(pkgmgr_client *pc, const char *pkg_type,
586 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
587 pkgmgr_handler event_cb, void *data)
589 return pkgmgr_client_usr_reinstall(pc, pkg_type, pkgid, optional_data,
590 mode, event_cb, data, _getuid());
593 API int pkgmgr_client_usr_reinstall(pkgmgr_client *pc, const char *pkg_type,
594 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
595 pkgmgr_handler event_cb, void *data, uid_t uid)
598 int ret = PKGMGR_R_ECOMM;
599 char *req_key = NULL;
600 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
601 struct cb_info *cb_info;
603 if (pc == NULL || pkgid == NULL) {
604 ERR("invalid parameter");
605 return PKGMGR_R_EINVAL;
608 if (client->pc_type != PC_REQUEST) {
609 ERR("client->pc_type is not PC_REQUEST");
610 return PKGMGR_R_EINVAL;
613 ret = pkgmgr_client_connection_send_request(client, "reinstall",
614 g_variant_new("(us)", uid, pkgid), &result);
615 if (ret != PKGMGR_R_OK) {
616 ERR("request failed: %d", ret);
620 g_variant_get(result, "(i&s)", &ret, &req_key);
621 if (req_key == NULL) {
622 g_variant_unref(result);
623 return PKGMGR_R_ECOMM;
625 if (ret != PKGMGR_R_OK) {
626 g_variant_unref(result);
630 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
631 if (cb_info == NULL) {
632 g_variant_unref(result);
633 return PKGMGR_R_ENOMEM;
635 g_variant_unref(result);
636 ret = pkgmgr_client_connection_set_callback(client, cb_info);
637 if (ret != PKGMGR_R_OK) {
638 __free_cb_info(cb_info);
641 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
643 return cb_info->req_id;
646 API int pkgmgr_client_usr_mount_install_packages(pkgmgr_client *pc,
647 const char **pkg_paths, int n_pkgs, pkgmgr_handler event_cb,
648 void *data, uid_t uid)
651 GVariantBuilder *pkgs_builder;
653 int ret = PKGMGR_R_ECOMM;
654 char *req_key = NULL;
655 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
656 struct cb_info *cb_info;
659 if (pc == NULL || pkg_paths == NULL || n_pkgs < 1) {
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 for (i = 0; i < n_pkgs; i++) {
670 if (access(pkg_paths[i], F_OK) != 0) {
671 ERR("failed to access: %s", pkg_paths[i]);
672 return PKGMGR_R_EINVAL;
676 pkgs_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
677 for (i = 0; i < n_pkgs; i++)
678 g_variant_builder_add(pkgs_builder, "s", pkg_paths[i]);
679 pkgs = g_variant_new("as", pkgs_builder);
680 g_variant_builder_unref(pkgs_builder);
682 ret = pkgmgr_client_connection_send_request(client,
683 "mount_install_pkgs",
684 g_variant_new("(u@as)", uid, pkgs), &result);
685 if (ret != PKGMGR_R_OK) {
686 ERR("request failed: %d", ret);
690 g_variant_get(result, "(i&s)", &ret, &req_key);
691 if (req_key == NULL) {
692 g_variant_unref(result);
693 return PKGMGR_R_ECOMM;
695 if (ret != PKGMGR_R_OK) {
696 g_variant_unref(result);
700 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
701 if (cb_info == NULL) {
702 g_variant_unref(result);
703 return PKGMGR_R_ENOMEM;
705 g_variant_unref(result);
706 ret = pkgmgr_client_connection_set_callback(client, cb_info);
707 if (ret != PKGMGR_R_OK) {
708 __free_cb_info(cb_info);
711 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
713 return cb_info->req_id;
716 API int pkgmgr_client_mount_install_packages(pkgmgr_client *pc,
717 const char **pkg_paths, int n_pkgs, pkgmgr_handler event_cb,
720 return pkgmgr_client_usr_mount_install_packages(pc, pkg_paths, n_pkgs,
721 event_cb, data, _getuid());
724 API int pkgmgr_client_usr_mount_install(pkgmgr_client *pc, const char *pkg_type,
725 const char *descriptor_path, const char *pkg_path,
726 const char *optional_data, pkgmgr_mode mode,
727 pkgmgr_handler event_cb, void *data, uid_t uid)
730 int ret = PKGMGR_R_ECOMM;
731 char *req_key = NULL;
732 GVariantBuilder *builder = NULL;
733 GVariant *args = NULL;
734 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
735 struct cb_info *cb_info;
737 if (pc == NULL || pkg_path == NULL) {
738 ERR("invalid parameter");
739 return PKGMGR_R_EINVAL;
742 if (client->pc_type != PC_REQUEST) {
743 ERR("client->pc_type is not PC_REQUEST");
744 return PKGMGR_R_EINVAL;
747 if (access(pkg_path, F_OK) != 0) {
748 ERR("failed to access: %s", pkg_path);
749 return PKGMGR_R_EINVAL;
752 if (client->tep_path != NULL && access(client->tep_path, F_OK) != 0) {
753 ERR("failed to access: %s", client->tep_path);
754 return PKGMGR_R_EINVAL;
757 /* build arguments */
758 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
759 if (client->tep_path) {
760 g_variant_builder_add(builder, "s", "-e");
761 g_variant_builder_add(builder, "s", client->tep_path);
762 g_variant_builder_add(builder, "s", "-M");
763 /* TODO: revise tep_move */
764 g_variant_builder_add(builder, "s",
765 client->tep_move ? "tep_move" : "tep_copy");
768 args = g_variant_new("as", builder);
769 g_variant_builder_unref(builder);
771 ret = pkgmgr_client_connection_send_request(client, "mount_install",
772 g_variant_new("(uss@as)", uid, pkg_type ? pkg_type : "",
775 if (ret != PKGMGR_R_OK) {
776 ERR("request failed: %d", ret);
780 g_variant_get(result, "(i&s)", &ret, &req_key);
781 if (req_key == NULL) {
782 g_variant_unref(result);
783 return PKGMGR_R_ECOMM;
785 if (ret != PKGMGR_R_OK) {
786 g_variant_unref(result);
790 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
791 if (cb_info == NULL) {
792 g_variant_unref(result);
793 return PKGMGR_R_ENOMEM;
795 g_variant_unref(result);
796 ret = pkgmgr_client_connection_set_callback(client, cb_info);
797 if (ret != PKGMGR_R_OK) {
798 __free_cb_info(cb_info);
801 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
803 return cb_info->req_id;
806 API int pkgmgr_client_mount_install(pkgmgr_client *pc, const char *pkg_type,
807 const char *descriptor_path, const char *pkg_path,
808 const char *optional_data, pkgmgr_mode mode,
809 pkgmgr_handler event_cb, void *data)
811 return pkgmgr_client_usr_mount_install(pc, pkg_type, descriptor_path,
812 pkg_path, optional_data, mode, event_cb, data,
816 API int pkgmgr_client_usr_uninstall_packages(pkgmgr_client *pc,
817 const char **pkgids, int n_pkgs, pkgmgr_handler event_cb,
818 void *data, uid_t uid)
821 GVariantBuilder *pkgs_builder;
823 int ret = PKGMGR_R_ECOMM;
824 char *req_key = NULL;
825 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
826 struct cb_info *cb_info;
829 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
830 ERR("invalid parameter");
831 return PKGMGR_R_EINVAL;
834 if (client->pc_type != PC_REQUEST) {
835 ERR("client->pc_type is not PC_REQUEST");
836 return PKGMGR_R_EINVAL;
839 pkgs_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
840 for (i = 0; i < n_pkgs; i++)
841 g_variant_builder_add(pkgs_builder, "s", pkgids[i]);
842 pkgs = g_variant_new("as", pkgs_builder);
843 g_variant_builder_unref(pkgs_builder);
845 ret = pkgmgr_client_connection_send_request(client, "uninstall_pkgs",
846 g_variant_new("(u@as)", uid, pkgs), &result);
847 if (ret != PKGMGR_R_OK) {
848 ERR("request failed: %d", ret);
852 g_variant_get(result, "(i&s)", &ret, &req_key);
853 if (req_key == NULL) {
854 g_variant_unref(result);
855 return PKGMGR_R_ECOMM;
857 if (ret != PKGMGR_R_OK) {
858 g_variant_unref(result);
862 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
863 if (cb_info == NULL) {
864 g_variant_unref(result);
865 return PKGMGR_R_ENOMEM;
867 g_variant_unref(result);
868 ret = pkgmgr_client_connection_set_callback(client, cb_info);
869 if (ret != PKGMGR_R_OK) {
870 __free_cb_info(cb_info);
873 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
875 return cb_info->req_id;
878 API int pkgmgr_client_uninstall_packages(pkgmgr_client *pc,
879 const char **pkgids, int n_pkgs, pkgmgr_handler event_cb,
882 return pkgmgr_client_usr_uninstall_packages(pc, pkgids, n_pkgs,
883 event_cb, data, _getuid());
886 API int pkgmgr_client_uninstall(pkgmgr_client *pc, const char *pkg_type,
887 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
890 return pkgmgr_client_usr_uninstall(pc, pkg_type, pkgid, mode, event_cb,
894 API int pkgmgr_client_usr_uninstall(pkgmgr_client *pc, const char *pkg_type,
895 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
896 void *data, uid_t uid)
899 int ret = PKGMGR_R_ECOMM;
900 char *req_key = NULL;
901 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
902 struct cb_info *cb_info;
904 if (pc == NULL || pkgid == NULL) {
905 ERR("invalid parameter");
906 return PKGMGR_R_EINVAL;
909 if (client->pc_type != PC_REQUEST) {
910 ERR("client->pc_type is not PC_REQUEST");
911 return PKGMGR_R_EINVAL;
914 ret = pkgmgr_client_connection_send_request(client, "uninstall",
915 g_variant_new("(us)", uid, pkgid), &result);
916 if (ret != PKGMGR_R_OK) {
917 ERR("request failed: %d", ret);
921 g_variant_get(result, "(i&s)", &ret, &req_key);
922 if (req_key == NULL) {
923 g_variant_unref(result);
924 return PKGMGR_R_ECOMM;
926 if (ret != PKGMGR_R_OK) {
927 g_variant_unref(result);
931 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
932 if (cb_info == NULL) {
933 g_variant_unref(result);
934 return PKGMGR_R_ENOMEM;
936 g_variant_unref(result);
937 ret = pkgmgr_client_connection_set_callback(client, cb_info);
938 if (ret != PKGMGR_R_OK) {
939 __free_cb_info(cb_info);
942 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
944 return cb_info->req_id;
947 API int pkgmgr_client_move(pkgmgr_client *pc, const char *pkg_type,
948 const char *pkgid, pkgmgr_move_type move_type,
949 pkgmgr_handler event_cb, void *data)
951 return pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type,
952 event_cb, data, _getuid());
954 API int pkgmgr_client_usr_move(pkgmgr_client *pc, const char *pkg_type,
955 const char *pkgid, pkgmgr_move_type move_type,
956 pkgmgr_handler event_cb, void *data, uid_t uid)
959 int ret = PKGMGR_R_ECOMM;
960 char *req_key = NULL;
961 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
962 struct cb_info *cb_info;
964 if (pc == NULL || pkgid == NULL) {
965 ERR("invalid parameter");
966 return PKGMGR_R_EINVAL;
969 if ((move_type < PM_MOVE_TO_INTERNAL) ||
970 (move_type > PM_MOVE_TO_EXTENDED))
971 return PKGMGR_R_EINVAL;
973 if (client->pc_type != PC_REQUEST) {
974 ERR("client->pc_type is not PC_REQUEST");
975 return PKGMGR_R_EINVAL;
978 ret = pkgmgr_client_connection_send_request(client, "move",
979 g_variant_new("(usi)", uid, pkgid, move_type), &result);
980 if (ret != PKGMGR_R_OK) {
981 ERR("request failed: %d", ret);
985 g_variant_get(result, "(i&s)", &ret, &req_key);
986 if (req_key == NULL) {
987 g_variant_unref(result);
988 return PKGMGR_R_ECOMM;
990 if (ret != PKGMGR_R_OK) {
991 g_variant_unref(result);
995 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
996 if (cb_info == NULL) {
997 g_variant_unref(result);
998 return PKGMGR_R_ERROR;
1000 g_variant_unref(result);
1001 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1002 if (ret != PKGMGR_R_OK) {
1003 __free_cb_info(cb_info);
1006 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1008 return cb_info->req_id;
1011 API int pkgmgr_client_usr_register_pkg_update_info(pkgmgr_client *pc,
1012 pkg_update_info_t *update_info, uid_t uid)
1015 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1018 if (pc == NULL || update_info == NULL || update_info->pkgid == NULL) {
1019 ERR("invalid parameter");
1020 return PKGMGR_R_EINVAL;
1023 if (client->pc_type != PC_REQUEST) {
1024 ERR("client->pc_type is not PC_REQUEST");
1025 return PKGMGR_R_EINVAL;
1028 ret = pkgmgr_client_connection_send_request(client, "register_pkg_update_info",
1029 g_variant_new("(ussi)", uid, update_info->pkgid, update_info->version,
1030 update_info->type), &result);
1031 if (ret != PKGMGR_R_OK) {
1032 ERR("request failed: %d", ret);
1036 g_variant_get(result, "(i)", &ret);
1037 if (ret != PKGMGR_R_OK) {
1038 g_variant_unref(result);
1041 g_variant_unref(result);
1046 API int pkgmgr_client_register_pkg_update_info(pkgmgr_client *pc,
1047 pkg_update_info_t *update_info)
1049 return pkgmgr_client_usr_register_pkg_update_info(pc, update_info,
1053 API int pkgmgr_client_usr_unregister_pkg_update_info(pkgmgr_client *pc,
1054 const char *pkgid, uid_t uid)
1057 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1060 if (pc == NULL || pkgid == NULL) {
1061 ERR("invalid parameter");
1062 return PKGMGR_R_EINVAL;
1065 if (client->pc_type != PC_REQUEST) {
1066 ERR("client->pc_type is not PC_REQUEST");
1067 return PKGMGR_R_EINVAL;
1070 ret = pkgmgr_client_connection_send_request(client,
1071 "unregister_pkg_update_info",
1072 g_variant_new("(us)", uid, pkgid), &result);
1073 if (ret != PKGMGR_R_OK) {
1074 ERR("request failed: %d", ret);
1078 g_variant_get(result, "(i)", &ret);
1079 if (ret != PKGMGR_R_OK) {
1080 g_variant_unref(result);
1083 g_variant_unref(result);
1088 API int pkgmgr_client_unregister_pkg_update_info(pkgmgr_client *pc,
1091 return pkgmgr_client_usr_unregister_pkg_update_info(pc, pkgid, _getuid());
1094 API int pkgmgr_client_usr_unregister_all_pkg_update_info(pkgmgr_client *pc,
1098 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1102 ERR("invalid parameter");
1103 return PKGMGR_R_EINVAL;
1106 if (client->pc_type != PC_REQUEST) {
1107 ERR("client->pc_type is not PC_REQUEST");
1108 return PKGMGR_R_EINVAL;
1111 ret = pkgmgr_client_connection_send_request(client,
1112 "unregister_all_pkg_update_info",
1113 g_variant_new("(u)", uid), &result);
1114 if (ret != PKGMGR_R_OK) {
1115 ERR("request failed: %d", ret);
1119 g_variant_get(result, "(i)", &ret);
1120 if (ret != PKGMGR_R_OK) {
1121 g_variant_unref(result);
1124 g_variant_unref(result);
1129 API int pkgmgr_client_unregister_all_pkg_update_info(pkgmgr_client *pc)
1131 return pkgmgr_client_usr_unregister_all_pkg_update_info(pc, _getuid());
1134 API int pkgmgr_client_usr_activate(pkgmgr_client *pc, const char *pkg_type,
1135 const char *pkgid, uid_t uid)
1138 int ret = PKGMGR_R_ECOMM;
1139 GVariantBuilder *builder;
1140 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1142 if (pc == NULL || pkgid == NULL) {
1143 ERR("invalid parameter");
1144 return PKGMGR_R_EINVAL;
1147 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1148 g_variant_builder_add(builder, "s", pkgid);
1150 ret = pkgmgr_client_connection_send_request(client, "enable_pkgs",
1151 g_variant_new("(uas)", uid, builder), &result);
1152 g_variant_builder_unref(builder);
1153 if (ret != PKGMGR_R_OK) {
1154 ERR("request failed: %d", ret);
1158 g_variant_get(result, "(is)", &ret, NULL);
1159 g_variant_unref(result);
1164 API int pkgmgr_client_activate(pkgmgr_client *pc, const char *pkg_type,
1167 return pkgmgr_client_usr_activate(pc, pkg_type, pkgid, _getuid());
1170 API int pkgmgr_client_usr_activate_packages(pkgmgr_client *pc,
1171 const char *pkg_type, const char **pkgids, int n_pkgs,
1172 pkgmgr_handler event_cb, void *data, uid_t uid)
1175 GVariantBuilder *builder;
1176 int ret = PKGMGR_R_ECOMM;
1177 char *req_key = NULL;
1178 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1179 struct cb_info *cb_info;
1182 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
1183 ERR("invalid parameter");
1184 return PKGMGR_R_EINVAL;
1187 if (client->pc_type != PC_REQUEST) {
1188 ERR("client type is not PC_REQUEST");
1189 return PKGMGR_R_EINVAL;
1192 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1193 for (i = 0; i < n_pkgs; i++)
1194 g_variant_builder_add(builder, "s", pkgids[i]);
1196 ret = pkgmgr_client_connection_send_request(client, "enable_pkgs",
1197 g_variant_new("(uas)", uid, builder), &result);
1198 g_variant_builder_unref(builder);
1199 if (ret != PKGMGR_R_OK) {
1200 ERR("request failed: %d", ret);
1204 g_variant_get(result, "(i&s)", &ret, &req_key);
1205 if (req_key == NULL) {
1206 g_variant_unref(result);
1207 return PKGMGR_R_ECOMM;
1209 if (ret != PKGMGR_R_OK) {
1210 g_variant_unref(result);
1214 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1215 if (cb_info == NULL) {
1216 g_variant_unref(result);
1217 return PKGMGR_R_ERROR;
1219 g_variant_unref(result);
1220 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1221 if (ret != PKGMGR_R_OK) {
1222 __free_cb_info(cb_info);
1225 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1227 return cb_info->req_id;
1230 API int pkgmgr_client_activate_packages(pkgmgr_client *pc,
1231 const char *pkg_type, const char **pkgids, int n_pkgs,
1232 pkgmgr_handler event_cb, void *data)
1234 return pkgmgr_client_usr_activate_packages(pc, pkg_type,
1235 pkgids, n_pkgs, event_cb, data, _getuid());
1238 API int pkgmgr_client_usr_deactivate(pkgmgr_client *pc, const char *pkg_type,
1239 const char *pkgid, uid_t uid)
1242 GVariantBuilder *builder;
1243 int ret = PKGMGR_R_ECOMM;
1244 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1246 if (pc == NULL || pkgid == NULL) {
1247 ERR("invalid parameter");
1248 return PKGMGR_R_EINVAL;
1251 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1252 g_variant_builder_add(builder, "s", pkgid);
1254 ret = pkgmgr_client_connection_send_request(client, "disable_pkgs",
1255 g_variant_new("(uas)", uid, builder), &result);
1256 g_variant_builder_unref(builder);
1257 if (ret != PKGMGR_R_OK) {
1258 ERR("request failed: %d", ret);
1262 g_variant_get(result, "(is)", &ret, NULL);
1263 g_variant_unref(result);
1268 API int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type,
1271 return pkgmgr_client_usr_deactivate(pc, pkg_type, pkgid, _getuid());
1274 API int pkgmgr_client_usr_deactivate_packages(pkgmgr_client *pc,
1275 const char *pkg_type, const char **pkgids, int n_pkgs,
1276 pkgmgr_handler event_cb, void *data, uid_t uid)
1279 GVariantBuilder *builder;
1280 int ret = PKGMGR_R_ECOMM;
1281 char *req_key = NULL;
1282 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1283 struct cb_info *cb_info;
1286 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
1287 ERR("invalid parameter");
1288 return PKGMGR_R_EINVAL;
1291 if (client->pc_type != PC_REQUEST) {
1292 ERR("client type is not PC_REQUEST");
1293 return PKGMGR_R_EINVAL;
1296 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1297 for (i = 0; i < n_pkgs; i++)
1298 g_variant_builder_add(builder, "s", pkgids[i]);
1300 ret = pkgmgr_client_connection_send_request(client, "disable_pkgs",
1301 g_variant_new("(uas)", uid, builder), &result);
1302 g_variant_builder_unref(builder);
1303 if (ret != PKGMGR_R_OK) {
1304 ERR("request failed: %d", ret);
1308 g_variant_get(result, "(i&s)", &ret, &req_key);
1309 if (req_key == NULL) {
1310 g_variant_unref(result);
1311 return PKGMGR_R_ECOMM;
1313 if (ret != PKGMGR_R_OK) {
1314 g_variant_unref(result);
1318 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1319 if (cb_info == NULL) {
1320 g_variant_unref(result);
1321 return PKGMGR_R_ERROR;
1323 g_variant_unref(result);
1324 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1325 if (ret != PKGMGR_R_OK) {
1326 __free_cb_info(cb_info);
1329 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1331 return cb_info->req_id;
1334 API int pkgmgr_client_deactivate_packages(pkgmgr_client *pc,
1335 const char *pkg_type, const char **pkgids, int n_pkgs,
1336 pkgmgr_handler event_cb, void *data)
1338 return pkgmgr_client_usr_deactivate_packages(pc, pkg_type,
1339 pkgids, n_pkgs, event_cb, data, _getuid());
1342 API int pkgmgr_client_usr_activate_app(pkgmgr_client *pc, const char *appid,
1343 pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1346 int ret = PKGMGR_R_ECOMM;
1347 char *req_key = NULL;
1348 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1349 struct cb_info *cb_info;
1351 if (pc == NULL || appid == NULL) {
1352 ERR("invalid parameter");
1353 return PKGMGR_R_EINVAL;
1356 ret = pkgmgr_client_connection_send_request(client, "enable_app",
1357 g_variant_new("(us)", uid, appid), &result);
1358 if (ret != PKGMGR_R_OK) {
1359 ERR("request failed: %d", ret);
1363 g_variant_get(result, "(i&s)", &ret, &req_key);
1364 if (req_key == NULL) {
1365 g_variant_unref(result);
1366 return PKGMGR_R_ECOMM;
1368 if (ret != PKGMGR_R_OK) {
1369 g_variant_unref(result);
1373 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1375 if (cb_info == NULL) {
1376 g_variant_unref(result);
1377 return PKGMGR_R_ENOMEM;
1379 g_variant_unref(result);
1380 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1381 if (ret != PKGMGR_R_OK) {
1382 __free_cb_info(cb_info);
1385 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1387 return cb_info->req_id;
1390 API int pkgmgr_client_activate_app(pkgmgr_client *pc, const char *appid,
1391 pkgmgr_app_handler app_event_cb, void *data)
1393 return pkgmgr_client_usr_activate_app(pc, appid, app_event_cb,
1397 API int pkgmgr_client_usr_activate_apps(pkgmgr_client *pc, const char **appids,
1398 int n_apps, pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1401 GVariantBuilder *builder;
1402 int ret = PKGMGR_R_ECOMM;
1403 char *req_key = NULL;
1404 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1405 struct cb_info *cb_info;
1408 if (pc == NULL || appids == NULL || n_apps < 1) {
1409 ERR("invalid parameter");
1410 return PKGMGR_R_EINVAL;
1413 if (client->pc_type != PC_REQUEST) {
1414 ERR("client type is not PC_REQUEST");
1415 return PKGMGR_R_EINVAL;
1418 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1419 for (i = 0; i < n_apps; i++)
1420 g_variant_builder_add(builder, "s", appids[i]);
1422 ret = pkgmgr_client_connection_send_request(client, "enable_apps",
1423 g_variant_new("(uas)", uid, builder), &result);
1424 g_variant_builder_unref(builder);
1425 if (ret != PKGMGR_R_OK) {
1426 ERR("request failed: %d", ret);
1430 g_variant_get(result, "(i&s)", &ret, &req_key);
1431 if (req_key == NULL) {
1432 g_variant_unref(result);
1433 return PKGMGR_R_ECOMM;
1435 if (ret != PKGMGR_R_OK) {
1436 g_variant_unref(result);
1440 cb_info = __create_app_event_cb_info(client, app_event_cb, data, req_key);
1441 if (cb_info == NULL) {
1442 g_variant_unref(result);
1443 return PKGMGR_R_ERROR;
1445 g_variant_unref(result);
1446 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1447 if (ret != PKGMGR_R_OK) {
1448 __free_cb_info(cb_info);
1451 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1453 return cb_info->req_id;
1456 API int pkgmgr_client_activate_apps(pkgmgr_client *pc, const char **appids,
1457 int n_apps, pkgmgr_app_handler app_event_cb, void *data)
1459 return pkgmgr_client_usr_activate_apps(pc, appids, n_apps,
1460 app_event_cb, data, _getuid());
1463 API int pkgmgr_client_activate_global_app_for_uid(pkgmgr_client *pc,
1464 const char *appid, pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1467 int ret = PKGMGR_R_ECOMM;
1468 char *req_key = NULL;
1469 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1470 struct cb_info *cb_info;
1472 if (pc == NULL || appid == NULL) {
1473 ERR("invalid parameter");
1474 return PKGMGR_R_EINVAL;
1477 ret = pkgmgr_client_connection_send_request(client,
1478 "enable_global_app_for_uid",
1479 g_variant_new("(us)", uid, appid), &result);
1480 if (ret != PKGMGR_R_OK) {
1481 ERR("request failed: %d", ret);
1485 g_variant_get(result, "(i&s)", &ret, &req_key);
1486 if (req_key == NULL) {
1487 g_variant_unref(result);
1488 return PKGMGR_R_ECOMM;
1490 if (ret != PKGMGR_R_OK) {
1491 g_variant_unref(result);
1495 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1497 if (cb_info == NULL) {
1498 g_variant_unref(result);
1499 return PKGMGR_R_ENOMEM;
1501 g_variant_unref(result);
1502 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1503 if (ret != PKGMGR_R_OK) {
1504 __free_cb_info(cb_info);
1507 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1509 return cb_info->req_id;
1512 API int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid,
1513 pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1516 int ret = PKGMGR_R_ECOMM;
1517 char *req_key = NULL;
1518 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1519 struct cb_info *cb_info;
1521 if (pc == NULL || appid == NULL) {
1522 ERR("invalid parameter");
1523 return PKGMGR_R_EINVAL;
1526 ret = pkgmgr_client_connection_send_request(client, "disable_app",
1527 g_variant_new("(us)", uid, appid), &result);
1528 if (ret != PKGMGR_R_OK) {
1529 ERR("request failed: %d", ret);
1533 g_variant_get(result, "(i&s)", &ret, &req_key);
1534 if (req_key == NULL) {
1535 g_variant_unref(result);
1536 return PKGMGR_R_ECOMM;
1538 if (ret != PKGMGR_R_OK) {
1539 g_variant_unref(result);
1543 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1545 if (cb_info == NULL) {
1546 g_variant_unref(result);
1547 return PKGMGR_R_ENOMEM;
1549 g_variant_unref(result);
1550 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1551 if (ret != PKGMGR_R_OK) {
1552 __free_cb_info(cb_info);
1555 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1557 return cb_info->req_id;
1560 API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid,
1561 pkgmgr_app_handler app_event_cb, void *data)
1563 return pkgmgr_client_usr_deactivate_app(pc, appid, app_event_cb, data,
1567 API int pkgmgr_client_usr_deactivate_apps(pkgmgr_client *pc,
1568 const char **appids, int n_apps,
1569 pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1572 GVariantBuilder *builder;
1573 int ret = PKGMGR_R_ECOMM;
1574 char *req_key = NULL;
1575 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1576 struct cb_info *cb_info;
1579 if (pc == NULL || appids == NULL || n_apps < 1) {
1580 ERR("invalid parameter");
1581 return PKGMGR_R_EINVAL;
1584 if (client->pc_type != PC_REQUEST) {
1585 ERR("client type is not PC_REQUEST");
1586 return PKGMGR_R_EINVAL;
1589 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1590 for (i = 0; i < n_apps; i++)
1591 g_variant_builder_add(builder, "s", appids[i]);
1593 ret = pkgmgr_client_connection_send_request(client, "disable_apps",
1594 g_variant_new("(uas)", uid, builder), &result);
1595 g_variant_builder_unref(builder);
1596 if (ret != PKGMGR_R_OK) {
1597 ERR("request failed: %d", ret);
1601 g_variant_get(result, "(i&s)", &ret, &req_key);
1602 if (req_key == NULL) {
1603 g_variant_unref(result);
1604 return PKGMGR_R_ECOMM;
1606 if (ret != PKGMGR_R_OK) {
1607 g_variant_unref(result);
1611 cb_info = __create_app_event_cb_info(client, app_event_cb, data, req_key);
1612 if (cb_info == NULL) {
1613 g_variant_unref(result);
1614 return PKGMGR_R_ERROR;
1616 g_variant_unref(result);
1617 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1618 if (ret != PKGMGR_R_OK) {
1619 __free_cb_info(cb_info);
1622 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1624 return cb_info->req_id;
1627 API int pkgmgr_client_deactivate_apps(pkgmgr_client *pc, const char **appids,
1628 int n_apps, pkgmgr_app_handler app_event_cb, void *data)
1630 return pkgmgr_client_usr_deactivate_apps(pc, appids, n_apps,
1631 app_event_cb, data, _getuid());
1634 API int pkgmgr_client_deactivate_global_app_for_uid(pkgmgr_client *pc,
1635 const char *appid, pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1638 int ret = PKGMGR_R_ECOMM;
1639 char *req_key = NULL;
1640 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1641 struct cb_info *cb_info;
1643 if (pc == NULL || appid == NULL) {
1644 ERR("invalid parameter");
1645 return PKGMGR_R_EINVAL;
1648 ret = pkgmgr_client_connection_send_request(client,
1649 "disable_global_app_for_uid",
1650 g_variant_new("(us)", uid, appid), &result);
1651 if (ret != PKGMGR_R_OK) {
1652 ERR("request failed: %d", ret);
1656 g_variant_get(result, "(i&s)", &ret, &req_key);
1657 if (req_key == NULL) {
1658 g_variant_unref(result);
1659 return PKGMGR_R_ECOMM;
1661 if (ret != PKGMGR_R_OK) {
1662 g_variant_unref(result);
1666 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1668 if (cb_info == NULL) {
1669 g_variant_unref(result);
1670 return PKGMGR_R_ENOMEM;
1672 g_variant_unref(result);
1673 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1674 if (ret != PKGMGR_R_OK) {
1675 __free_cb_info(cb_info);
1678 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1680 return cb_info->req_id;
1683 API int pkgmgr_client_usr_clear_user_data(pkgmgr_client *pc,
1684 const char *pkg_type, const char *appid, pkgmgr_mode mode,
1689 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1691 if (pc == NULL || appid == NULL || uid == GLOBAL_USER) {
1692 ERR("invalid parameter");
1693 return PKGMGR_R_EINVAL;
1696 if (client->pc_type != PC_REQUEST) {
1697 ERR("client->pc_type is not PC_REQUEST");
1698 return PKGMGR_R_EINVAL;
1701 ret = pkgmgr_client_connection_send_request(client, "cleardata",
1702 g_variant_new("(us)", uid, appid), &result);
1703 if (ret != PKGMGR_R_OK) {
1704 ERR("request failed: %d", ret);
1708 g_variant_get(result, "(i)", &ret);
1709 g_variant_unref(result);
1714 API int pkgmgr_client_clear_user_data(pkgmgr_client *pc, const char *pkg_type,
1715 const char *appid, pkgmgr_mode mode)
1717 return pkgmgr_client_usr_clear_user_data(pc, pkg_type, appid, mode,
1721 API int pkgmgr_client_set_status_type(pkgmgr_client *pc, int status_type)
1723 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1726 ERR("invalid parameter");
1727 return PKGMGR_R_EINVAL;
1730 client->status_type = status_type;
1735 API int pkgmgr_client_listen_status(pkgmgr_client *pc, pkgmgr_handler event_cb,
1739 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1740 struct cb_info *cb_info;
1742 if (pc == NULL || event_cb == NULL) {
1743 ERR("invalid parameter");
1744 return PKGMGR_R_EINVAL;
1747 if (client->pc_type != PC_LISTENING) {
1748 ERR("client->pc_type is not PC_LISTENING");
1749 return PKGMGR_R_EINVAL;
1752 cb_info = __create_event_cb_info(client, event_cb, data, NULL);
1753 if (cb_info == NULL)
1754 return PKGMGR_R_ENOMEM;
1755 cb_info->status_type = client->status_type;
1756 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1757 if (ret != PKGMGR_R_OK) {
1758 __free_cb_info(cb_info);
1761 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1763 return cb_info->req_id;
1766 API int pkgmgr_client_listen_app_status(pkgmgr_client *pc,
1767 pkgmgr_app_handler app_event_cb, void *data)
1770 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1771 struct cb_info *cb_info;
1773 if (pc == NULL || app_event_cb == NULL) {
1774 ERR("invalid parameter");
1775 return PKGMGR_R_EINVAL;
1778 if (client->pc_type != PC_LISTENING) {
1779 ERR("client->pc_type is not PC_LISTENING");
1780 return PKGMGR_R_EINVAL;
1783 cb_info = __create_app_event_cb_info(client, app_event_cb, data, NULL);
1784 if (cb_info == NULL)
1785 return PKGMGR_R_ENOMEM;
1786 cb_info->status_type = client->status_type;
1787 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1788 if (ret != PKGMGR_R_OK) {
1789 __free_cb_info(cb_info);
1792 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1794 return cb_info->req_id;
1797 API int pkgmgr_client_remove_listen_status(pkgmgr_client *pc)
1799 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1802 struct cb_info *cb_info;
1805 ERR("invalid parameter");
1806 return PKGMGR_R_EINVAL;
1809 /* unset all callback */
1810 tmp = client->cb_info_list;
1811 while (tmp != NULL) {
1813 cb_info = (struct cb_info *)tmp->data;
1814 pkgmgr_client_connection_unset_callback(pc, cb_info);
1815 client->cb_info_list = g_list_delete_link(client->cb_info_list,
1817 __free_cb_info(cb_info);
1824 API int pkgmgr_client_broadcast_status(pkgmgr_client *pc, const char *pkg_type,
1825 const char *pkgid, const char *key, const char *val)
1827 /* client cannot broadcast signal */
1831 /* TODO: deprecate(or remove) */
1832 API int pkgmgr_client_request_service(pkgmgr_request_service_type service_type,
1833 int service_mode, pkgmgr_client *pc, const char *pkg_type,
1834 const char *pkgid, const char *custom_info,
1835 pkgmgr_handler event_cb, void *data)
1837 return pkgmgr_client_usr_request_service(service_type, service_mode,
1838 pc, pkg_type, pkgid, _getuid(), custom_info, event_cb,
1842 API int pkgmgr_client_usr_request_service(
1843 pkgmgr_request_service_type service_type, int service_mode,
1844 pkgmgr_client *pc, const char *pkg_type, const char *pkgid,
1845 uid_t uid, const char *custom_info, pkgmgr_handler event_cb,
1850 /* Check for NULL value of service type */
1851 retvm_if(service_type > PM_REQUEST_MAX, PKGMGR_R_EINVAL, "service type is not defined\n");
1852 retvm_if(service_type < 0, PKGMGR_R_EINVAL, "service type is error\n");
1854 switch (service_type) {
1855 case PM_REQUEST_MOVE:
1856 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1857 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1858 tryvm_if((service_mode < PM_MOVE_TO_INTERNAL) || (service_mode > PM_MOVE_TO_EXTENDED), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1860 ret = __move_pkg_process(pc, pkgid, pkg_type, uid, (pkgmgr_move_type)service_mode, event_cb, data);
1863 case PM_REQUEST_GET_SIZE:
1864 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1865 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1866 tryvm_if((service_mode < PM_GET_TOTAL_SIZE) || (service_mode >= PM_GET_MAX), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1868 ret = __get_size_process(pc, pkgid, uid, (pkgmgr_getsize_type)service_mode, event_cb, data);
1871 case PM_REQUEST_KILL_APP:
1872 case PM_REQUEST_CHECK_APP:
1873 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1874 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1876 ret = __check_app_process(service_type, pc, pkgid, uid, data);
1878 ERR("__check_app_process fail \n");
1885 ERR("Wrong Request\n");
1895 API int pkgmgr_client_usr_clear_cache_dir(const char *pkgid, uid_t uid)
1899 struct pkgmgr_client_t *client;
1901 if (pkgid == NULL || uid == GLOBAL_USER) {
1902 ERR("invalid parameter");
1903 return PKGMGR_R_EINVAL;
1906 client = pkgmgr_client_new(PC_REQUEST);
1907 if (client == NULL) {
1908 ERR("out of memory");
1909 return PKGMGR_R_ENOMEM;
1912 ret = pkgmgr_client_connection_send_request(client, "clearcache",
1913 g_variant_new("(us)", uid, pkgid), &result);
1914 if (ret != PKGMGR_R_OK) {
1915 ERR("request failed: %d", ret);
1916 pkgmgr_client_free(client);
1920 g_variant_get(result, "(i)", &ret);
1921 g_variant_unref(result);
1922 pkgmgr_client_free(client);
1927 API int pkgmgr_client_clear_cache_dir(const char *pkgid)
1929 return pkgmgr_client_usr_clear_cache_dir(pkgid, _getuid());
1932 API int pkgmgr_client_clear_usr_all_cache_dir(uid_t uid)
1934 return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, uid);
1937 API int pkgmgr_client_clear_all_cache_dir(void)
1939 return pkgmgr_client_usr_clear_cache_dir(
1940 PKG_CLEAR_ALL_CACHE, _getuid());
1943 API int pkgmgr_client_get_size(pkgmgr_client *pc, const char *pkgid,
1944 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
1947 return pkgmgr_client_usr_get_size(pc, pkgid, get_type, event_cb, data,
1951 /* TODO: deprecate(or remove) */
1952 API int pkgmgr_client_usr_get_size(pkgmgr_client *pc, const char *pkgid,
1953 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
1954 void *data, uid_t uid)
1957 int ret = PKGMGR_R_ECOMM;
1958 char *req_key = NULL;
1959 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1960 struct cb_info *cb_info;
1962 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
1963 ERR("invalid parameter");
1964 return PKGMGR_R_EINVAL;
1967 if (client->pc_type != PC_REQUEST) {
1968 ERR("client->pc_type is not PC_REQUEST");
1969 return PKGMGR_R_EINVAL;
1973 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
1974 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
1976 get_type = PM_GET_PKG_SIZE_INFO;
1978 ret = pkgmgr_client_connection_send_request(client, "getsize",
1979 g_variant_new("(usi)", uid, pkgid, get_type), &result);
1980 if (ret != PKGMGR_R_OK) {
1981 ERR("request failed: %d", ret);
1985 g_variant_get(result, "(i&s)", &ret, &req_key);
1986 if (req_key == NULL) {
1987 g_variant_unref(result);
1988 return PKGMGR_R_ECOMM;
1990 if (ret != PKGMGR_R_OK) {
1991 g_variant_unref(result);
1995 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1996 if (cb_info == NULL) {
1997 g_variant_unref(result);
1998 return PKGMGR_R_ENOMEM;
2000 g_variant_unref(result);
2001 ret = pkgmgr_client_connection_set_callback(client, cb_info);
2002 if (ret != PKGMGR_R_OK) {
2003 __free_cb_info(cb_info);
2006 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
2011 API int pkgmgr_client_usr_get_package_size_info(pkgmgr_client *pc,
2012 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
2013 void *user_data, uid_t uid)
2016 int ret = PKGMGR_R_ECOMM;
2017 char *req_key = NULL;
2019 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2020 struct cb_info *cb_info;
2022 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
2023 ERR("invalid parameter");
2024 return PKGMGR_R_EINVAL;
2027 if (client->pc_type != PC_REQUEST) {
2028 ERR("client->pc_type is not PC_REQUEST");
2029 return PKGMGR_R_EINVAL;
2032 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
2033 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
2035 get_type = PM_GET_PKG_SIZE_INFO;
2037 ret = pkgmgr_client_connection_send_request(client, "getsize",
2038 g_variant_new("(usi)", uid, pkgid, get_type), &result);
2039 if (ret != PKGMGR_R_OK) {
2040 ERR("request failed: %d", ret);
2044 g_variant_get(result, "(i&s)", &ret, &req_key);
2045 if (req_key == NULL) {
2046 g_variant_unref(result);
2047 return PKGMGR_R_ECOMM;
2049 if (ret != PKGMGR_R_OK) {
2050 g_variant_unref(result);
2054 cb_info = __create_size_info_cb_info(client, event_cb, user_data,
2056 if (cb_info == NULL) {
2057 g_variant_unref(result);
2058 return PKGMGR_R_ENOMEM;
2060 g_variant_unref(result);
2061 ret = pkgmgr_client_connection_set_callback(client, cb_info);
2062 if (ret != PKGMGR_R_OK) {
2063 __free_cb_info(cb_info);
2066 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
2071 API int pkgmgr_client_get_package_size_info(pkgmgr_client *pc,
2072 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
2075 return pkgmgr_client_usr_get_package_size_info(pc, pkgid, event_cb,
2076 user_data, _getuid());
2079 API int pkgmgr_client_usr_get_total_package_size_info(pkgmgr_client *pc,
2080 pkgmgr_total_pkg_size_info_receive_cb event_cb,
2081 void *user_data, uid_t uid)
2082 { /* total package size info */
2083 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL,
2084 (pkgmgr_pkg_size_info_receive_cb)event_cb,
2088 API int pkgmgr_client_get_total_package_size_info(pkgmgr_client *pc,
2089 pkgmgr_total_pkg_size_info_receive_cb event_cb, void *user_data)
2091 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL,
2092 (pkgmgr_pkg_size_info_receive_cb)event_cb,
2093 user_data, _getuid());
2096 API int pkgmgr_client_generate_license_request(pkgmgr_client *pc,
2097 const char *resp_data, char **req_data, char **license_url)
2103 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2105 if (pc == NULL || resp_data == NULL || req_data == NULL ||
2106 license_url == NULL) {
2107 ERR("invalid parameter");
2108 return PKGMGR_R_EINVAL;
2111 if (client->pc_type != PC_REQUEST) {
2112 ERR("client->pc_type is not PC_REQUEST");
2113 return PKGMGR_R_EINVAL;
2116 ret = pkgmgr_client_connection_send_request(client,
2117 "generate_license_request",
2118 g_variant_new("(s)", resp_data), &result);
2119 if (ret != PKGMGR_R_OK) {
2120 ERR("request failed: %d", ret);
2124 g_variant_get(result, "(i&s&s)", &ret, &data, &url);
2125 if (ret != PKGMGR_R_OK) {
2126 ERR("generate_license_request failed: %d", ret);
2127 g_variant_unref(result);
2131 *req_data = strdup(data);
2132 *license_url = strdup(url);
2134 g_variant_unref(result);
2139 API int pkgmgr_client_register_license(pkgmgr_client *pc, const char *resp_data)
2143 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2145 if (pc == NULL || resp_data == NULL) {
2146 ERR("invalid parameter");
2147 return PKGMGR_R_EINVAL;
2150 if (client->pc_type != PC_REQUEST) {
2151 ERR("client->pc_type is not PC_REQUEST");
2152 return PKGMGR_R_EINVAL;
2155 ret = pkgmgr_client_connection_send_request(client, "register_license",
2156 g_variant_new("(s)", resp_data), &result);
2157 if (ret != PKGMGR_R_OK) {
2158 ERR("request failed: %d", ret);
2162 g_variant_get(result, "(i)", &ret);
2163 g_variant_unref(result);
2164 if (ret != PKGMGR_R_OK)
2165 ERR("register license failed: %d", ret);
2170 API int pkgmgr_client_decrypt_package(pkgmgr_client *pc,
2171 const char *drm_file_path, const char *decrypted_file_path)
2175 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2177 if (pc == NULL || drm_file_path == NULL ||
2178 decrypted_file_path == NULL) {
2179 ERR("invalid parameter");
2180 return PKGMGR_R_EINVAL;
2183 if (client->pc_type != PC_REQUEST) {
2184 ERR("client->pc_type is not PC_REQUEST");
2185 return PKGMGR_R_EINVAL;
2188 ret = pkgmgr_client_connection_send_request(client, "decrypt_package",
2189 g_variant_new("(ss)", drm_file_path,
2190 decrypted_file_path), &result);
2191 if (ret != PKGMGR_R_OK) {
2192 ERR("request failed: %d", ret);
2196 g_variant_get(result, "(i)", &ret);
2197 g_variant_unref(result);
2198 if (ret != PKGMGR_R_OK)
2199 ERR("decrypt_package failed: %d", ret);
2204 API int pkgmgr_client_enable_splash_screen(pkgmgr_client *pc, const char *appid)
2206 return pkgmgr_client_usr_enable_splash_screen(pc, appid, _getuid());
2209 API int pkgmgr_client_usr_enable_splash_screen(pkgmgr_client *pc,
2210 const char *appid, uid_t uid)
2214 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2216 if (pc == NULL || appid == NULL) {
2217 ERR("Invalid parameter");
2218 return PKGMGR_R_EINVAL;
2221 ret = pkgmgr_client_connection_send_request(client,
2222 "enable_app_splash_screen",
2223 g_variant_new("(us)", uid, appid), &result);
2224 if (ret != PKGMGR_R_OK) {
2225 ERR("request failed: %d", ret);
2229 g_variant_get(result, "(i)", &ret);
2230 g_variant_unref(result);
2231 if (ret != PKGMGR_R_OK)
2232 ERR("enable splash screen failed: %d", ret);
2237 API int pkgmgr_client_disable_splash_screen(pkgmgr_client *pc,
2240 return pkgmgr_client_usr_disable_splash_screen(pc, appid,
2244 API int pkgmgr_client_usr_disable_splash_screen(pkgmgr_client *pc,
2245 const char *appid, uid_t uid)
2249 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2251 if (pc == NULL || appid == NULL) {
2252 ERR("Invalid parameter");
2253 return PKGMGR_R_EINVAL;
2256 ret = pkgmgr_client_connection_send_request(client,
2257 "disable_app_splash_screen",
2258 g_variant_new("(us)", uid, appid), &result);
2259 if (ret != PKGMGR_R_OK) {
2260 ERR("request failed: %d", ret);
2264 g_variant_get(result, "(i)", &ret);
2265 g_variant_unref(result);
2266 if (ret != PKGMGR_R_OK)
2267 ERR("disable splash screen failed: %d", ret);
2272 static int __set_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
2273 int mode, uid_t uid)
2276 int ret = PKGMGR_R_ECOMM;
2277 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2279 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
2280 ERR("invalid parameter");
2281 return PKGMGR_R_EINVAL;
2284 ret = pkgmgr_client_connection_send_request(client,
2285 "set_restriction_mode",
2286 g_variant_new("(usi)", uid, pkgid, mode), &result);
2287 if (ret != PKGMGR_R_OK) {
2288 ERR("request failed: %d", ret);
2292 g_variant_get(result, "(i)", &ret);
2293 g_variant_unref(result);
2298 API int pkgmgr_client_usr_set_pkg_restriction_mode(pkgmgr_client *pc,
2299 const char *pkgid, int mode, uid_t uid)
2301 return __set_pkg_restriction_mode(pc, pkgid, mode, uid);
2304 API int pkgmgr_client_set_pkg_restriction_mode(pkgmgr_client *pc,
2305 const char *pkgid, int mode)
2307 return pkgmgr_client_usr_set_pkg_restriction_mode(pc, pkgid, mode,
2311 static int __unset_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
2312 int mode, uid_t uid)
2315 int ret = PKGMGR_R_ECOMM;
2316 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2318 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
2319 ERR("invalid parameter");
2320 return PKGMGR_R_EINVAL;
2323 ret = pkgmgr_client_connection_send_request(client,
2324 "unset_restriction_mode",
2325 g_variant_new("(usi)", uid, pkgid, mode), &result);
2326 if (ret != PKGMGR_R_OK) {
2327 ERR("request failed: %d", ret);
2331 g_variant_get(result, "(i)", &ret);
2332 g_variant_unref(result);
2338 API int pkgmgr_client_usr_unset_pkg_restriction_mode(pkgmgr_client *pc,
2339 const char *pkgid, int mode, uid_t uid)
2341 return __unset_pkg_restriction_mode(pc, pkgid, mode, uid);
2344 API int pkgmgr_client_unset_pkg_restriction_mode(pkgmgr_client *pc,
2345 const char *pkgid, int mode)
2347 return pkgmgr_client_usr_unset_pkg_restriction_mode(pc, pkgid, mode,
2351 static int __get_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
2352 int *mode, uid_t uid)
2355 int ret = PKGMGR_R_ECOMM;
2357 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2359 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0) {
2360 ERR("invalid parameter");
2361 return PKGMGR_R_EINVAL;
2364 ret = pkgmgr_client_connection_send_request(client,
2365 "get_restriction_mode",
2366 g_variant_new("(us)", uid, pkgid), &result);
2367 if (ret != PKGMGR_R_OK) {
2368 ERR("request failed: %d", ret);
2372 g_variant_get(result, "(ii)", &m, &ret);
2373 g_variant_unref(result);
2374 if (ret != PKGMGR_R_OK)
2382 API int pkgmgr_client_usr_get_pkg_restriction_mode(pkgmgr_client *pc,
2383 const char *pkgid, int *mode, uid_t uid)
2385 return __get_pkg_restriction_mode(pc, pkgid, mode, uid);
2388 API int pkgmgr_client_get_pkg_restriction_mode(pkgmgr_client *pc,
2389 const char *pkgid, int *mode)
2391 return pkgmgr_client_usr_get_pkg_restriction_mode(pc, pkgid, mode,
2395 API int pkgmgr_client_usr_set_restriction_mode(pkgmgr_client *pc, int mode,
2399 int ret = PKGMGR_R_ECOMM;
2400 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2403 ERR("invalid parameter");
2404 return PKGMGR_R_EINVAL;
2407 ret = pkgmgr_client_connection_send_request(client,
2408 "set_restriction_mode",
2409 g_variant_new("(usi)", uid, "", mode), &result);
2410 if (ret != PKGMGR_R_OK) {
2411 ERR("request failed: %d", ret);
2415 g_variant_get(result, "(i)", &ret);
2416 g_variant_unref(result);
2421 API int pkgmgr_client_set_restriction_mode(pkgmgr_client *pc, int mode)
2423 return pkgmgr_client_usr_set_restriction_mode(pc, mode, _getuid());
2426 API int pkgmgr_client_usr_unset_restriction_mode(pkgmgr_client *pc, int mode,
2430 int ret = PKGMGR_R_ECOMM;
2431 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2434 ERR("invalid parameter");
2435 return PKGMGR_R_EINVAL;
2438 ret = pkgmgr_client_connection_send_request(client,
2439 "unset_restriction_mode",
2440 g_variant_new("(usi)", uid, "", mode), &result);
2441 if (ret != PKGMGR_R_OK) {
2442 ERR("request failed: %d", ret);
2446 g_variant_get(result, "(i)", &ret);
2447 g_variant_unref(result);
2452 API int pkgmgr_client_unset_restriction_mode(pkgmgr_client *pc, int mode)
2454 return pkgmgr_client_usr_unset_restriction_mode(pc, mode, _getuid());
2457 API int pkgmgr_client_usr_get_restriction_mode(pkgmgr_client *pc,
2458 int *mode, uid_t uid)
2461 int ret = PKGMGR_R_ECOMM;
2463 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2466 ERR("invalid parameter");
2467 return PKGMGR_R_EINVAL;
2470 ret = pkgmgr_client_connection_send_request(client,
2471 "get_restriction_mode",
2472 g_variant_new("(us)", uid, ""), &result);
2473 if (ret != PKGMGR_R_OK) {
2474 ERR("request failed: %d", ret);
2478 g_variant_get(result, "(ii)", &m, &ret);
2479 g_variant_unref(result);
2480 if (ret != PKGMGR_R_OK)
2488 API int pkgmgr_client_get_restriction_mode(pkgmgr_client *pc, int *mode)
2490 return pkgmgr_client_usr_get_restriction_mode(pc, mode, _getuid());
2493 API pkgmgr_info *pkgmgr_client_check_pkginfo_from_file(const char *pkg_path)
2496 pkg_plugin_set *plugin_set;
2497 package_manager_pkg_detail_info_t *info;
2500 if (pkg_path == NULL) {
2501 ERR("invalid parameter");
2505 pkg_type = __get_type_from_path(pkg_path);
2506 if (pkg_type == NULL) {
2507 ERR("cannot get pkg type");
2511 plugin_set = _package_manager_load_library(pkg_type);
2512 if (plugin_set == NULL) {
2513 ERR("failed to load library for %s", pkg_type);
2518 info = calloc(1, sizeof(package_manager_pkg_detail_info_t));
2520 ERR("out of memory");
2525 ret = plugin_set->get_pkg_detail_info_from_package(pkg_path, info);
2527 ERR("get_pkg_detail_info_from_package failed");
2535 return (pkgmgr_info *)info;
2538 API int pkgmgr_client_free_pkginfo(pkgmgr_info *info)
2540 package_manager_pkg_detail_info_t *pkg_info =
2541 (package_manager_pkg_detail_info_t *)info;
2544 ERR("invalid parameter");
2545 return PKGMGR_R_EINVAL;
2548 g_list_free_full(pkg_info->privilege_list, free);
2549 free(pkg_info->icon_buf);
2555 API int pkgmgr_client_usr_set_app_label(pkgmgr_client *pc, char *appid,
2556 char *label, uid_t uid)
2560 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2562 if (pc == NULL || appid == NULL || label == NULL) {
2563 ERR("Invalid parameter");
2564 return PKGMGR_R_EINVAL;
2567 ret = pkgmgr_client_connection_send_request(client,
2569 g_variant_new("(uss)", uid, appid, label), &result);
2570 if (ret != PKGMGR_R_OK) {
2571 ERR("Request failed: %d", ret);
2575 g_variant_get(result, "(i)", &ret);
2576 g_variant_unref(result);
2581 API int pkgmgr_client_set_app_label(pkgmgr_client *pc, char *appid, char *label)
2583 return pkgmgr_client_usr_set_app_label(pc, appid, label, _getuid());
2586 API int pkgmgr_client_usr_set_app_icon(pkgmgr_client *pc, char *appid,
2587 char *icon_path, uid_t uid)
2591 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2593 if (pc == NULL || appid == NULL || icon_path == NULL) {
2594 ERR("Invalid parameter");
2595 return PKGMGR_R_EINVAL;
2598 if (access(icon_path, F_OK) != 0) {
2599 ERR("failed to access: %s", icon_path);
2600 return PKGMGR_R_EINVAL;
2603 ret = pkgmgr_client_connection_send_request(client,
2605 g_variant_new("(uss)", uid, appid, icon_path), &result);
2606 if (ret != PKGMGR_R_OK) {
2607 ERR("Request failed: %d", ret);
2611 g_variant_get(result, "(i)", &ret);
2612 g_variant_unref(result);
2617 API int pkgmgr_client_set_app_icon(pkgmgr_client *pc, char *appid, char *icon_path)
2619 return pkgmgr_client_usr_set_app_icon(pc, appid, icon_path, _getuid());
2622 API int pkgmgr_client_set_debug_mode(pkgmgr_client *pc, bool debug_mode)
2624 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2627 ERR("invalid parameter");
2628 return PKGMGR_R_EINVAL;
2631 client->debug_mode = debug_mode;
2636 API int pkgmgr_client_set_skip_optimization(pkgmgr_client *pc, bool skip_optimization)
2638 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2641 ERR("invalid parameter");
2642 return PKGMGR_R_EINVAL;
2645 client->skip_optimization = skip_optimization;
2650 API int pkgmgr_client_usr_migrate_external_image(pkgmgr_client *pc,
2651 const char *pkgid, uid_t uid)
2654 int ret = PKGMGR_R_ECOMM;
2655 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2658 ERR("invalid parameter");
2659 return PKGMGR_R_EINVAL;
2662 ret = pkgmgr_client_connection_send_request(client,
2663 "migrate_external_image",
2664 g_variant_new("(us)", uid, pkgid), &result);
2665 if (ret != PKGMGR_R_OK) {
2666 ERR("request failed: %d", ret);
2670 g_variant_get(result, "(i)", &ret);
2671 g_variant_unref(result);