4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
7 * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
37 #include <pkgmgr-info.h>
38 #include <iniparser.h>
39 /* For multi-user support */
40 #include <tzplatform_config.h>
42 #include "package-manager.h"
43 #include "pkgmgr_client_debug.h"
44 #include "pkgmgr_client_internal.h"
46 /* API export macro */
48 #define API __attribute__ ((visibility("default")))
51 #define BINSH_NAME "/bin/sh"
54 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
55 #define REGULAR_USER 5000
57 static GList *jobs_to_free;
58 static pthread_mutex_t __mutex = PTHREAD_MUTEX_INITIALIZER;
60 static inline uid_t _getuid(void)
64 if (uid < REGULAR_USER)
70 static int _get_internal_request_id()
72 static int internal_req_id = 1;
74 return internal_req_id++;
77 static char *_generate_request_id(void)
83 gettimeofday(&tv, NULL);
84 curtime = tv.tv_sec * 1000000 + tv.tv_usec;
86 snprintf(buf, sizeof(buf), "%d_%ld", getpid(), curtime);
91 static struct cb_info *__create_event_cb_info(struct pkgmgr_client_t *client,
92 pkgmgr_handler event_cb, void *data, const char *req_key)
94 struct cb_info *cb_info;
96 cb_info = calloc(1, sizeof(struct cb_info));
97 if (cb_info == NULL) {
101 cb_info->client = client;
102 cb_info->event_cb = event_cb;
103 cb_info->data = data;
104 cb_info->req_id = _get_internal_request_id();
105 if (req_key != NULL) {
106 cb_info->req_key = strdup(req_key);
107 if (cb_info->req_key == NULL) {
108 ERR("out of memory");
117 static struct cb_info *__create_app_event_cb_info(
118 struct pkgmgr_client_t *client, pkgmgr_app_handler app_event_cb,
119 void *data, const char *req_key)
121 struct cb_info *cb_info;
123 cb_info = calloc(1, sizeof(struct cb_info));
124 if (cb_info == NULL) {
125 ERR("out of memory");
128 cb_info->client = client;
129 cb_info->app_event_cb = app_event_cb;
130 cb_info->data = data;
131 cb_info->req_id = _get_internal_request_id();
132 if (req_key != NULL) {
133 cb_info->req_key = strdup(req_key);
134 if (cb_info->req_key == NULL) {
135 ERR("out of memory");
144 static struct cb_info *__create_size_info_cb_info(
145 struct pkgmgr_client_t *client,
146 pkgmgr_pkg_size_info_receive_cb size_info_cb,
147 void *data, const char *req_key)
149 struct cb_info *cb_info;
151 cb_info = calloc(1, sizeof(struct cb_info));
152 if (cb_info == NULL) {
153 ERR("out of memory");
156 cb_info->client = client;
157 cb_info->size_info_cb = size_info_cb;
158 cb_info->data = data;
159 cb_info->req_id = _get_internal_request_id();
160 if (req_key != NULL) {
161 cb_info->req_key = strdup(req_key);
162 if (cb_info->req_key == NULL) {
163 ERR("out of memory");
172 static int __jobs_to_free_add(gpointer data)
174 pthread_mutex_lock(&__mutex);
175 if (g_list_find(jobs_to_free, data)) {
176 pthread_mutex_unlock(&__mutex);
180 jobs_to_free = g_list_append(jobs_to_free, data);
181 pthread_mutex_unlock(&__mutex);
185 static void __jobs_to_free_remove(gpointer data)
187 pthread_mutex_lock(&__mutex);
188 jobs_to_free = g_list_remove(jobs_to_free, data);
189 pthread_mutex_unlock(&__mutex);
192 static void __do_free_cb_info(gpointer data)
194 struct cb_info *cb_info = (struct cb_info *)data;
196 g_list_free(cb_info->sid_list);
197 free(cb_info->req_key);
201 static void __free_cb_info_cb(gpointer data)
203 g_idle_remove_by_data(data);
204 __do_free_cb_info(data);
207 __attribute__((destructor)) static void __free_cb_info_at_destructor(void)
209 pthread_mutex_lock(&__mutex);
210 g_list_free_full(jobs_to_free, __free_cb_info_cb);
211 pthread_mutex_unlock(&__mutex);
214 static gboolean __free_cb_info_at_idle(gpointer data)
216 __jobs_to_free_remove(data);
217 __do_free_cb_info(data);
219 return G_SOURCE_REMOVE;
222 static void __free_cb_info(struct cb_info *cb_info)
224 if (__jobs_to_free_add(cb_info) < 0)
227 g_idle_add(__free_cb_info_at_idle, cb_info);
230 static int __get_size_process(pkgmgr_client *pc, const char *pkgid, uid_t uid,
231 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
235 int ret = PKGMGR_R_ECOMM;
236 long long size_info = 0;
237 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
239 if (pc == NULL || pkgid == NULL) {
240 ERR("invalid parameter");
241 return PKGMGR_R_EINVAL;
244 if (client->pc_type != PC_REQUEST) {
245 ERR("client->pc_type is not PC_REQUEST");
246 return PKGMGR_R_EINVAL;
249 ret = pkgmgr_client_connection_send_request(client, "getsize_sync",
250 g_variant_new("(usi)", uid, pkgid, get_type), &result);
251 if (ret != PKGMGR_R_OK) {
252 ERR("request failed: %d", ret);
256 g_variant_get(result, "(ix)", &ret, &size_info);
257 if (ret != PKGMGR_R_OK) {
258 ERR("request result failed: %d", ret);
259 g_variant_unref(result);
264 ERR("invalid size_info=(%lld)", size_info);
267 ret = (int)size_info;
268 DBG("size_info(%lld), return size(%d)", size_info, ret);
271 g_variant_unref(result);
276 static int __move_pkg_process(pkgmgr_client *pc, const char *pkgid,
277 const char *pkg_type, uid_t uid, pkgmgr_move_type move_type,
278 pkgmgr_handler event_cb, void *data)
282 ret = pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type, event_cb, data, uid);
284 ERR("move request failed");
291 static int __check_app_process(pkgmgr_request_service_type service_type,
292 pkgmgr_client *pc, const char *pkgid, uid_t uid, void *data)
295 int ret = PKGMGR_R_ECOMM;
296 pkgmgrinfo_pkginfo_h handle;
298 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
300 retvm_if(client->pc_type != PC_REQUEST, PKGMGR_R_EINVAL, "client->pc_type is not PC_REQUEST\n");
302 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
303 if (ret != PMINFO_R_OK) {
304 ERR("pkgmgrinfo_pkginfo_get_pkginfo failed");
305 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
306 return PKGMGR_R_ERROR;
309 if (service_type == PM_REQUEST_KILL_APP) {
310 ret = pkgmgr_client_connection_send_request(client, "kill",
311 g_variant_new("(us)", uid, pkgid), &result);
312 } else if (service_type == PM_REQUEST_CHECK_APP) {
313 ret = pkgmgr_client_connection_send_request(client, "check",
314 g_variant_new("(us)", uid, pkgid), &result);
316 ERR("unexpected service type: %d", service_type);
317 ret = PKGMGR_R_ERROR;
320 if (ret != PKGMGR_R_OK) {
321 ERR("request failed: %d", ret);
322 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
326 g_variant_get(result, "(ii)", &ret, &pid);
327 g_variant_unref(result);
328 if (ret != PKGMGR_R_OK) {
329 ERR("request failed, ret=%d", ret);
330 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
336 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
342 API pkgmgr_client *pkgmgr_client_new(pkgmgr_client_type pc_type)
344 struct pkgmgr_client_t *client;
346 if (pc_type == PC_BROADCAST) {
347 ERR("broadcast type is not supported");
351 if (pc_type != PC_REQUEST && pc_type != PC_LISTENING) {
352 ERR("invalid parameter");
356 client = calloc(1, sizeof(struct pkgmgr_client_t));
357 if (client == NULL) {
358 ERR("out of memory");
362 client->pc_type = pc_type;
363 client->status_type = PKGMGR_CLIENT_STATUS_ALL;
365 if (pkgmgr_client_connection_connect(client) != PKGMGR_R_OK) {
370 return (pkgmgr_client *)client;
373 API int pkgmgr_client_free(pkgmgr_client *pc)
375 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
378 ERR("invalid argument");
379 return PKGMGR_R_EINVAL;
382 pkgmgr_client_remove_listen_status(client);
383 pkgmgr_client_connection_disconnect(client);
384 if (client->tep_path)
385 free(client->tep_path);
391 struct manifest_and_type type_map[] = {
392 { "res/wgt/config.xml", "wgt" },
393 { "config.xml", "wgt" },
394 { "tizen-manifest.xml", "tpk" },
398 static char *__get_type_from_path(const char *pkg_path)
400 const char *type = NULL;
404 uf = unzOpen(pkg_path);
406 ERR("failed to open zip file %s", pkg_path);
410 for (i = 0; type_map[i].manifest != NULL; i++) {
411 if (unzLocateFile(uf, type_map[i].manifest, 0) == UNZ_OK) {
412 DBG("pkgtype of %s: [%s]", pkg_path, type_map[i].type);
413 type = type_map[i].type;
419 return type ? strdup(type) : NULL;
422 API int pkgmgr_client_set_tep_path(pkgmgr_client *pc, const char *tep_path,
425 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *) pc;
427 if (pc == NULL || tep_path == NULL) {
428 ERR("invalied parameter");
429 return PKGMGR_R_EINVAL;
432 if (client->tep_path)
433 free(client->tep_path);
435 client->tep_path = strdup(tep_path);
436 client->tep_move = tep_move;
441 API int pkgmgr_client_usr_install_packages(pkgmgr_client *pc,
442 const char **pkg_paths, int n_pkgs, pkgmgr_handler event_cb,
443 void *data, uid_t uid)
446 GVariantBuilder *pkgs_builder;
448 GVariantBuilder *args_builder;
451 char *req_key = NULL;
452 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
453 struct cb_info *cb_info;
455 char *request_id = NULL;
457 if (pc == NULL || pkg_paths == NULL || n_pkgs < 1) {
458 ERR("invalid parameter");
459 return PKGMGR_R_EINVAL;
462 if (client->pc_type != PC_REQUEST) {
463 ERR("client type is not PC_REQUEST");
464 return PKGMGR_R_EINVAL;
467 for (i = 0; i < n_pkgs; i++) {
468 if (access(pkg_paths[i], F_OK) != 0) {
469 ERR("failed to access: %s", pkg_paths[i]);
470 return PKGMGR_R_EINVAL;
474 pkgs_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
475 for (i = 0; i < n_pkgs; i++)
476 g_variant_builder_add(pkgs_builder, "s", pkg_paths[i]);
477 pkgs = g_variant_new("as", pkgs_builder);
478 g_variant_builder_unref(pkgs_builder);
480 args_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
481 if (client->debug_mode)
482 g_variant_builder_add(args_builder, "s", "-G");
483 if (client->skip_optimization)
484 g_variant_builder_add(args_builder, "s", "-S");
485 args = g_variant_new("as", args_builder);
486 g_variant_builder_unref(args_builder);
488 request_id = _generate_request_id();
489 ret = pkgmgr_client_connection_send_request(client, "install_pkgs",
490 g_variant_new("(u@as@ass)", uid, pkgs, args,
494 if (ret != PKGMGR_R_OK) {
495 ERR("request failed: %d", ret);
499 g_variant_get(result, "(i&s)", &ret, &req_key);
500 if (req_key == NULL) {
501 g_variant_unref(result);
502 return PKGMGR_R_ECOMM;
504 if (ret != PKGMGR_R_OK) {
505 g_variant_unref(result);
509 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
510 if (cb_info == NULL) {
511 g_variant_unref(result);
512 return PKGMGR_R_ERROR;
514 g_variant_unref(result);
515 ret = pkgmgr_client_connection_set_callback(client, cb_info);
516 if (ret != PKGMGR_R_OK) {
517 __free_cb_info(cb_info);
520 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
522 return cb_info->req_id;
525 API int pkgmgr_client_install_packages(pkgmgr_client *pc,
526 const char **pkg_paths, int n_pkgs, pkgmgr_handler event_cb,
529 return pkgmgr_client_usr_install_packages(pc, pkg_paths, n_pkgs,
530 event_cb, data, _getuid());
533 API int pkgmgr_client_usr_install(pkgmgr_client *pc, const char *pkg_type,
534 const char *descriptor_path, const char *pkg_path,
535 const char *optional_data, pkgmgr_mode mode,
536 pkgmgr_handler event_cb, void *data, uid_t uid)
539 int ret = PKGMGR_R_ECOMM;
540 char *req_key = NULL;
541 GVariantBuilder *builder = NULL;
542 GVariant *args = NULL;
543 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
544 struct cb_info *cb_info;
545 char *request_id = NULL;
547 if (pc == NULL || pkg_path == NULL) {
548 ERR("invalid parameter");
549 return PKGMGR_R_EINVAL;
552 if (client->pc_type != PC_REQUEST) {
553 ERR("client type is not PC_REQUEST");
554 return PKGMGR_R_EINVAL;
557 if (access(pkg_path, F_OK) != 0) {
558 ERR("failed to access: %s", pkg_path);
559 return PKGMGR_R_EINVAL;
562 if (client->tep_path != NULL && access(client->tep_path, F_OK) != 0) {
563 ERR("failed to access: %s", client->tep_path);
564 return PKGMGR_R_EINVAL;
567 /* build arguments */
568 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
569 if (client->tep_path) {
570 g_variant_builder_add(builder, "s", "-e");
571 g_variant_builder_add(builder, "s", client->tep_path);
572 g_variant_builder_add(builder, "s", "-M");
573 /* TODO: revise tep_move */
574 g_variant_builder_add(builder, "s",
575 client->tep_move ? "tep_move" : "tep_copy");
577 if (client->debug_mode)
578 g_variant_builder_add(builder, "s", "-G");
579 if (client->skip_optimization)
580 g_variant_builder_add(builder, "s", "-S");
582 args = g_variant_new("as", builder);
583 g_variant_builder_unref(builder);
585 request_id = _generate_request_id();
586 ret = pkgmgr_client_connection_send_request(client, "install",
587 g_variant_new("(uss@ass)", uid, pkg_type ? pkg_type : "",
588 pkg_path, args, request_id),
591 if (ret != PKGMGR_R_OK) {
592 ERR("request failed: %d", ret);
596 g_variant_get(result, "(i&s)", &ret, &req_key);
597 if (req_key == NULL) {
598 g_variant_unref(result);
599 return PKGMGR_R_ECOMM;
601 if (ret != PKGMGR_R_OK) {
602 g_variant_unref(result);
606 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
607 if (cb_info == NULL) {
608 g_variant_unref(result);
609 return PKGMGR_R_ENOMEM;
611 g_variant_unref(result);
612 ret = pkgmgr_client_connection_set_callback(client, cb_info);
613 if (ret != PKGMGR_R_OK) {
614 __free_cb_info(cb_info);
617 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
618 return cb_info->req_id;
621 API int pkgmgr_client_install(pkgmgr_client *pc, const char *pkg_type,
622 const char *descriptor_path, const char *pkg_path,
623 const char *optional_data, pkgmgr_mode mode,
624 pkgmgr_handler event_cb, void *data)
626 return pkgmgr_client_usr_install(pc, pkg_type, descriptor_path,
627 pkg_path, optional_data, mode, event_cb, data,
631 API int pkgmgr_client_reinstall(pkgmgr_client *pc, const char *pkg_type,
632 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
633 pkgmgr_handler event_cb, void *data)
635 return pkgmgr_client_usr_reinstall(pc, pkg_type, pkgid, optional_data,
636 mode, event_cb, data, _getuid());
639 API int pkgmgr_client_usr_reinstall(pkgmgr_client *pc, const char *pkg_type,
640 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
641 pkgmgr_handler event_cb, void *data, uid_t uid)
644 int ret = PKGMGR_R_ECOMM;
645 char *req_key = NULL;
646 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
647 struct cb_info *cb_info;
649 if (pc == NULL || pkgid == NULL) {
650 ERR("invalid parameter");
651 return PKGMGR_R_EINVAL;
654 if (client->pc_type != PC_REQUEST) {
655 ERR("client->pc_type is not PC_REQUEST");
656 return PKGMGR_R_EINVAL;
659 ret = pkgmgr_client_connection_send_request(client, "reinstall",
660 g_variant_new("(us)", uid, pkgid), &result);
661 if (ret != PKGMGR_R_OK) {
662 ERR("request failed: %d", ret);
666 g_variant_get(result, "(i&s)", &ret, &req_key);
667 if (req_key == NULL) {
668 g_variant_unref(result);
669 return PKGMGR_R_ECOMM;
671 if (ret != PKGMGR_R_OK) {
672 g_variant_unref(result);
676 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
677 if (cb_info == NULL) {
678 g_variant_unref(result);
679 return PKGMGR_R_ENOMEM;
681 g_variant_unref(result);
682 ret = pkgmgr_client_connection_set_callback(client, cb_info);
683 if (ret != PKGMGR_R_OK) {
684 __free_cb_info(cb_info);
687 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
689 return cb_info->req_id;
692 API int pkgmgr_client_usr_mount_install_packages(pkgmgr_client *pc,
693 const char **pkg_paths, int n_pkgs, pkgmgr_handler event_cb,
694 void *data, uid_t uid)
697 GVariantBuilder *pkgs_builder;
699 int ret = PKGMGR_R_ECOMM;
700 char *req_key = NULL;
701 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
702 struct cb_info *cb_info;
704 char *request_id = NULL;
706 if (pc == NULL || pkg_paths == NULL || n_pkgs < 1) {
707 ERR("invalid parameter");
708 return PKGMGR_R_EINVAL;
711 if (client->pc_type != PC_REQUEST) {
712 ERR("client->pc_type is not PC_REQUEST");
713 return PKGMGR_R_EINVAL;
716 for (i = 0; i < n_pkgs; i++) {
717 if (access(pkg_paths[i], F_OK) != 0) {
718 ERR("failed to access: %s", pkg_paths[i]);
719 return PKGMGR_R_EINVAL;
723 pkgs_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
724 for (i = 0; i < n_pkgs; i++)
725 g_variant_builder_add(pkgs_builder, "s", pkg_paths[i]);
726 pkgs = g_variant_new("as", pkgs_builder);
727 g_variant_builder_unref(pkgs_builder);
729 request_id = _generate_request_id();
730 ret = pkgmgr_client_connection_send_request(client,
731 "mount_install_pkgs",
732 g_variant_new("(u@ass)", uid, pkgs, request_id),
735 if (ret != PKGMGR_R_OK) {
736 ERR("request failed: %d", ret);
740 g_variant_get(result, "(i&s)", &ret, &req_key);
741 if (req_key == NULL) {
742 g_variant_unref(result);
743 return PKGMGR_R_ECOMM;
745 if (ret != PKGMGR_R_OK) {
746 g_variant_unref(result);
750 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
751 if (cb_info == NULL) {
752 g_variant_unref(result);
753 return PKGMGR_R_ENOMEM;
755 g_variant_unref(result);
756 ret = pkgmgr_client_connection_set_callback(client, cb_info);
757 if (ret != PKGMGR_R_OK) {
758 __free_cb_info(cb_info);
761 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
763 return cb_info->req_id;
766 API int pkgmgr_client_mount_install_packages(pkgmgr_client *pc,
767 const char **pkg_paths, int n_pkgs, pkgmgr_handler event_cb,
770 return pkgmgr_client_usr_mount_install_packages(pc, pkg_paths, n_pkgs,
771 event_cb, data, _getuid());
774 API int pkgmgr_client_usr_mount_install(pkgmgr_client *pc, const char *pkg_type,
775 const char *descriptor_path, const char *pkg_path,
776 const char *optional_data, pkgmgr_mode mode,
777 pkgmgr_handler event_cb, void *data, uid_t uid)
780 int ret = PKGMGR_R_ECOMM;
781 char *req_key = NULL;
782 GVariantBuilder *builder = NULL;
783 GVariant *args = NULL;
784 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
785 struct cb_info *cb_info;
786 char *request_id = NULL;
788 if (pc == NULL || pkg_path == NULL) {
789 ERR("invalid parameter");
790 return PKGMGR_R_EINVAL;
793 if (client->pc_type != PC_REQUEST) {
794 ERR("client->pc_type is not PC_REQUEST");
795 return PKGMGR_R_EINVAL;
798 if (access(pkg_path, F_OK) != 0) {
799 ERR("failed to access: %s", pkg_path);
800 return PKGMGR_R_EINVAL;
803 if (client->tep_path != NULL && access(client->tep_path, F_OK) != 0) {
804 ERR("failed to access: %s", client->tep_path);
805 return PKGMGR_R_EINVAL;
808 /* build arguments */
809 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
810 if (client->tep_path) {
811 g_variant_builder_add(builder, "s", "-e");
812 g_variant_builder_add(builder, "s", client->tep_path);
813 g_variant_builder_add(builder, "s", "-M");
814 /* TODO: revise tep_move */
815 g_variant_builder_add(builder, "s",
816 client->tep_move ? "tep_move" : "tep_copy");
819 args = g_variant_new("as", builder);
820 g_variant_builder_unref(builder);
822 request_id = _generate_request_id();
823 ret = pkgmgr_client_connection_send_request(client, "mount_install",
824 g_variant_new("(uss@ass)", uid,
825 pkg_type ? pkg_type : "", pkg_path,
829 if (ret != PKGMGR_R_OK) {
830 ERR("request failed: %d", ret);
834 g_variant_get(result, "(i&s)", &ret, &req_key);
835 if (req_key == NULL) {
836 g_variant_unref(result);
837 return PKGMGR_R_ECOMM;
839 if (ret != PKGMGR_R_OK) {
840 g_variant_unref(result);
844 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
845 if (cb_info == NULL) {
846 g_variant_unref(result);
847 return PKGMGR_R_ENOMEM;
849 g_variant_unref(result);
850 ret = pkgmgr_client_connection_set_callback(client, cb_info);
851 if (ret != PKGMGR_R_OK) {
852 __free_cb_info(cb_info);
855 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
857 return cb_info->req_id;
860 API int pkgmgr_client_mount_install(pkgmgr_client *pc, const char *pkg_type,
861 const char *descriptor_path, const char *pkg_path,
862 const char *optional_data, pkgmgr_mode mode,
863 pkgmgr_handler event_cb, void *data)
865 return pkgmgr_client_usr_mount_install(pc, pkg_type, descriptor_path,
866 pkg_path, optional_data, mode, event_cb, data,
870 API int pkgmgr_client_usr_uninstall_packages(pkgmgr_client *pc,
871 const char **pkgids, int n_pkgs, pkgmgr_handler event_cb,
872 void *data, uid_t uid)
875 GVariantBuilder *pkgs_builder;
877 int ret = PKGMGR_R_ECOMM;
878 char *req_key = NULL;
879 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
880 struct cb_info *cb_info;
883 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
884 ERR("invalid parameter");
885 return PKGMGR_R_EINVAL;
888 if (client->pc_type != PC_REQUEST) {
889 ERR("client->pc_type is not PC_REQUEST");
890 return PKGMGR_R_EINVAL;
893 pkgs_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
894 for (i = 0; i < n_pkgs; i++)
895 g_variant_builder_add(pkgs_builder, "s", pkgids[i]);
896 pkgs = g_variant_new("as", pkgs_builder);
897 g_variant_builder_unref(pkgs_builder);
899 ret = pkgmgr_client_connection_send_request(client, "uninstall_pkgs",
900 g_variant_new("(u@as)", uid, pkgs), &result);
901 if (ret != PKGMGR_R_OK) {
902 ERR("request failed: %d", ret);
906 g_variant_get(result, "(i&s)", &ret, &req_key);
907 if (req_key == NULL) {
908 g_variant_unref(result);
909 return PKGMGR_R_ECOMM;
911 if (ret != PKGMGR_R_OK) {
912 g_variant_unref(result);
916 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
917 if (cb_info == NULL) {
918 g_variant_unref(result);
919 return PKGMGR_R_ENOMEM;
921 g_variant_unref(result);
922 ret = pkgmgr_client_connection_set_callback(client, cb_info);
923 if (ret != PKGMGR_R_OK) {
924 __free_cb_info(cb_info);
927 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
929 return cb_info->req_id;
932 API int pkgmgr_client_uninstall_packages(pkgmgr_client *pc,
933 const char **pkgids, int n_pkgs, pkgmgr_handler event_cb,
936 return pkgmgr_client_usr_uninstall_packages(pc, pkgids, n_pkgs,
937 event_cb, data, _getuid());
940 API int pkgmgr_client_uninstall(pkgmgr_client *pc, const char *pkg_type,
941 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
944 return pkgmgr_client_usr_uninstall(pc, pkg_type, pkgid, mode, event_cb,
948 API int pkgmgr_client_usr_uninstall(pkgmgr_client *pc, const char *pkg_type,
949 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
950 void *data, uid_t uid)
953 int ret = PKGMGR_R_ECOMM;
954 char *req_key = NULL;
955 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
956 struct cb_info *cb_info;
958 if (pc == NULL || pkgid == NULL) {
959 ERR("invalid parameter");
960 return PKGMGR_R_EINVAL;
963 if (client->pc_type != PC_REQUEST) {
964 ERR("client->pc_type is not PC_REQUEST");
965 return PKGMGR_R_EINVAL;
968 ret = pkgmgr_client_connection_send_request(client, "uninstall",
969 g_variant_new("(us)", uid, pkgid), &result);
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_ENOMEM;
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_move(pkgmgr_client *pc, const char *pkg_type,
1002 const char *pkgid, pkgmgr_move_type move_type,
1003 pkgmgr_handler event_cb, void *data)
1005 return pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type,
1006 event_cb, data, _getuid());
1008 API int pkgmgr_client_usr_move(pkgmgr_client *pc, const char *pkg_type,
1009 const char *pkgid, pkgmgr_move_type move_type,
1010 pkgmgr_handler event_cb, void *data, uid_t uid)
1013 int ret = PKGMGR_R_ECOMM;
1014 char *req_key = NULL;
1015 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1016 struct cb_info *cb_info;
1018 if (pc == NULL || pkgid == NULL) {
1019 ERR("invalid parameter");
1020 return PKGMGR_R_EINVAL;
1023 if ((move_type < PM_MOVE_TO_INTERNAL) ||
1024 (move_type > PM_MOVE_TO_EXTENDED))
1025 return PKGMGR_R_EINVAL;
1027 if (client->pc_type != PC_REQUEST) {
1028 ERR("client->pc_type is not PC_REQUEST");
1029 return PKGMGR_R_EINVAL;
1032 ret = pkgmgr_client_connection_send_request(client, "move",
1033 g_variant_new("(usi)", uid, pkgid, move_type), &result);
1034 if (ret != PKGMGR_R_OK) {
1035 ERR("request failed: %d", ret);
1039 g_variant_get(result, "(i&s)", &ret, &req_key);
1040 if (req_key == NULL) {
1041 g_variant_unref(result);
1042 return PKGMGR_R_ECOMM;
1044 if (ret != PKGMGR_R_OK) {
1045 g_variant_unref(result);
1049 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1050 if (cb_info == NULL) {
1051 g_variant_unref(result);
1052 return PKGMGR_R_ERROR;
1054 g_variant_unref(result);
1055 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1056 if (ret != PKGMGR_R_OK) {
1057 __free_cb_info(cb_info);
1060 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1062 return cb_info->req_id;
1065 API int pkgmgr_client_usr_register_pkg_update_info(pkgmgr_client *pc,
1066 pkg_update_info_t *update_info, uid_t uid)
1069 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1072 if (pc == NULL || update_info == NULL || update_info->pkgid == NULL) {
1073 ERR("invalid parameter");
1074 return PKGMGR_R_EINVAL;
1077 if (client->pc_type != PC_REQUEST) {
1078 ERR("client->pc_type is not PC_REQUEST");
1079 return PKGMGR_R_EINVAL;
1082 ret = pkgmgr_client_connection_send_request(client, "register_pkg_update_info",
1083 g_variant_new("(ussi)", uid, update_info->pkgid, update_info->version,
1084 update_info->type), &result);
1085 if (ret != PKGMGR_R_OK) {
1086 ERR("request failed: %d", ret);
1090 g_variant_get(result, "(i)", &ret);
1091 if (ret != PKGMGR_R_OK) {
1092 g_variant_unref(result);
1095 g_variant_unref(result);
1100 API int pkgmgr_client_register_pkg_update_info(pkgmgr_client *pc,
1101 pkg_update_info_t *update_info)
1103 return pkgmgr_client_usr_register_pkg_update_info(pc, update_info,
1107 API int pkgmgr_client_usr_unregister_pkg_update_info(pkgmgr_client *pc,
1108 const char *pkgid, uid_t uid)
1111 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1114 if (pc == NULL || pkgid == NULL) {
1115 ERR("invalid parameter");
1116 return PKGMGR_R_EINVAL;
1119 if (client->pc_type != PC_REQUEST) {
1120 ERR("client->pc_type is not PC_REQUEST");
1121 return PKGMGR_R_EINVAL;
1124 ret = pkgmgr_client_connection_send_request(client,
1125 "unregister_pkg_update_info",
1126 g_variant_new("(us)", uid, pkgid), &result);
1127 if (ret != PKGMGR_R_OK) {
1128 ERR("request failed: %d", ret);
1132 g_variant_get(result, "(i)", &ret);
1133 if (ret != PKGMGR_R_OK) {
1134 g_variant_unref(result);
1137 g_variant_unref(result);
1142 API int pkgmgr_client_unregister_pkg_update_info(pkgmgr_client *pc,
1145 return pkgmgr_client_usr_unregister_pkg_update_info(pc, pkgid, _getuid());
1148 API int pkgmgr_client_usr_unregister_all_pkg_update_info(pkgmgr_client *pc,
1152 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1156 ERR("invalid parameter");
1157 return PKGMGR_R_EINVAL;
1160 if (client->pc_type != PC_REQUEST) {
1161 ERR("client->pc_type is not PC_REQUEST");
1162 return PKGMGR_R_EINVAL;
1165 ret = pkgmgr_client_connection_send_request(client,
1166 "unregister_all_pkg_update_info",
1167 g_variant_new("(u)", uid), &result);
1168 if (ret != PKGMGR_R_OK) {
1169 ERR("request failed: %d", ret);
1173 g_variant_get(result, "(i)", &ret);
1174 if (ret != PKGMGR_R_OK) {
1175 g_variant_unref(result);
1178 g_variant_unref(result);
1183 API int pkgmgr_client_unregister_all_pkg_update_info(pkgmgr_client *pc)
1185 return pkgmgr_client_usr_unregister_all_pkg_update_info(pc, _getuid());
1188 API int pkgmgr_client_usr_activate(pkgmgr_client *pc, const char *pkg_type,
1189 const char *pkgid, uid_t uid)
1192 int ret = PKGMGR_R_ECOMM;
1193 GVariantBuilder *builder;
1194 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1196 if (pc == NULL || pkgid == NULL) {
1197 ERR("invalid parameter");
1198 return PKGMGR_R_EINVAL;
1201 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1202 g_variant_builder_add(builder, "s", pkgid);
1204 ret = pkgmgr_client_connection_send_request(client, "enable_pkgs",
1205 g_variant_new("(uas)", uid, builder), &result);
1206 g_variant_builder_unref(builder);
1207 if (ret != PKGMGR_R_OK) {
1208 ERR("request failed: %d", ret);
1212 g_variant_get(result, "(is)", &ret, NULL);
1213 g_variant_unref(result);
1218 API int pkgmgr_client_activate(pkgmgr_client *pc, const char *pkg_type,
1221 return pkgmgr_client_usr_activate(pc, pkg_type, pkgid, _getuid());
1224 API int pkgmgr_client_usr_activate_packages(pkgmgr_client *pc,
1225 const char *pkg_type, const char **pkgids, int n_pkgs,
1226 pkgmgr_handler event_cb, void *data, uid_t uid)
1229 GVariantBuilder *builder;
1230 int ret = PKGMGR_R_ECOMM;
1231 char *req_key = NULL;
1232 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1233 struct cb_info *cb_info;
1236 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
1237 ERR("invalid parameter");
1238 return PKGMGR_R_EINVAL;
1241 if (client->pc_type != PC_REQUEST) {
1242 ERR("client type is not PC_REQUEST");
1243 return PKGMGR_R_EINVAL;
1246 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1247 for (i = 0; i < n_pkgs; i++)
1248 g_variant_builder_add(builder, "s", pkgids[i]);
1250 ret = pkgmgr_client_connection_send_request(client, "enable_pkgs",
1251 g_variant_new("(uas)", uid, builder), &result);
1252 g_variant_builder_unref(builder);
1253 if (ret != PKGMGR_R_OK) {
1254 ERR("request failed: %d", ret);
1258 g_variant_get(result, "(i&s)", &ret, &req_key);
1259 if (req_key == NULL) {
1260 g_variant_unref(result);
1261 return PKGMGR_R_ECOMM;
1263 if (ret != PKGMGR_R_OK) {
1264 g_variant_unref(result);
1268 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1269 if (cb_info == NULL) {
1270 g_variant_unref(result);
1271 return PKGMGR_R_ERROR;
1273 g_variant_unref(result);
1274 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1275 if (ret != PKGMGR_R_OK) {
1276 __free_cb_info(cb_info);
1279 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1281 return cb_info->req_id;
1284 API int pkgmgr_client_activate_packages(pkgmgr_client *pc,
1285 const char *pkg_type, const char **pkgids, int n_pkgs,
1286 pkgmgr_handler event_cb, void *data)
1288 return pkgmgr_client_usr_activate_packages(pc, pkg_type,
1289 pkgids, n_pkgs, event_cb, data, _getuid());
1292 API int pkgmgr_client_usr_deactivate(pkgmgr_client *pc, const char *pkg_type,
1293 const char *pkgid, uid_t uid)
1296 GVariantBuilder *builder;
1297 int ret = PKGMGR_R_ECOMM;
1298 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1300 if (pc == NULL || pkgid == NULL) {
1301 ERR("invalid parameter");
1302 return PKGMGR_R_EINVAL;
1305 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1306 g_variant_builder_add(builder, "s", pkgid);
1308 ret = pkgmgr_client_connection_send_request(client, "disable_pkgs",
1309 g_variant_new("(uas)", uid, builder), &result);
1310 g_variant_builder_unref(builder);
1311 if (ret != PKGMGR_R_OK) {
1312 ERR("request failed: %d", ret);
1316 g_variant_get(result, "(is)", &ret, NULL);
1317 g_variant_unref(result);
1322 API int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type,
1325 return pkgmgr_client_usr_deactivate(pc, pkg_type, pkgid, _getuid());
1328 API int pkgmgr_client_usr_deactivate_packages(pkgmgr_client *pc,
1329 const char *pkg_type, const char **pkgids, int n_pkgs,
1330 pkgmgr_handler event_cb, void *data, uid_t uid)
1333 GVariantBuilder *builder;
1334 int ret = PKGMGR_R_ECOMM;
1335 char *req_key = NULL;
1336 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1337 struct cb_info *cb_info;
1340 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
1341 ERR("invalid parameter");
1342 return PKGMGR_R_EINVAL;
1345 if (client->pc_type != PC_REQUEST) {
1346 ERR("client type is not PC_REQUEST");
1347 return PKGMGR_R_EINVAL;
1350 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1351 for (i = 0; i < n_pkgs; i++)
1352 g_variant_builder_add(builder, "s", pkgids[i]);
1354 ret = pkgmgr_client_connection_send_request(client, "disable_pkgs",
1355 g_variant_new("(uas)", uid, builder), &result);
1356 g_variant_builder_unref(builder);
1357 if (ret != PKGMGR_R_OK) {
1358 ERR("request failed: %d", ret);
1362 g_variant_get(result, "(i&s)", &ret, &req_key);
1363 if (req_key == NULL) {
1364 g_variant_unref(result);
1365 return PKGMGR_R_ECOMM;
1367 if (ret != PKGMGR_R_OK) {
1368 g_variant_unref(result);
1372 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1373 if (cb_info == NULL) {
1374 g_variant_unref(result);
1375 return PKGMGR_R_ERROR;
1377 g_variant_unref(result);
1378 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1379 if (ret != PKGMGR_R_OK) {
1380 __free_cb_info(cb_info);
1383 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1385 return cb_info->req_id;
1388 API int pkgmgr_client_deactivate_packages(pkgmgr_client *pc,
1389 const char *pkg_type, const char **pkgids, int n_pkgs,
1390 pkgmgr_handler event_cb, void *data)
1392 return pkgmgr_client_usr_deactivate_packages(pc, pkg_type,
1393 pkgids, n_pkgs, event_cb, data, _getuid());
1396 API int pkgmgr_client_usr_activate_app(pkgmgr_client *pc, const char *appid,
1397 pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1400 int ret = PKGMGR_R_ECOMM;
1401 char *req_key = NULL;
1402 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1403 struct cb_info *cb_info;
1405 if (pc == NULL || appid == NULL) {
1406 ERR("invalid parameter");
1407 return PKGMGR_R_EINVAL;
1410 ret = pkgmgr_client_connection_send_request(client, "enable_app",
1411 g_variant_new("(us)", uid, appid), &result);
1412 if (ret != PKGMGR_R_OK) {
1413 ERR("request failed: %d", ret);
1417 g_variant_get(result, "(i&s)", &ret, &req_key);
1418 if (req_key == NULL) {
1419 g_variant_unref(result);
1420 return PKGMGR_R_ECOMM;
1422 if (ret != PKGMGR_R_OK) {
1423 g_variant_unref(result);
1427 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1429 if (cb_info == NULL) {
1430 g_variant_unref(result);
1431 return PKGMGR_R_ENOMEM;
1433 g_variant_unref(result);
1434 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1435 if (ret != PKGMGR_R_OK) {
1436 __free_cb_info(cb_info);
1439 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1441 return cb_info->req_id;
1444 API int pkgmgr_client_activate_app(pkgmgr_client *pc, const char *appid,
1445 pkgmgr_app_handler app_event_cb, void *data)
1447 return pkgmgr_client_usr_activate_app(pc, appid, app_event_cb,
1451 API int pkgmgr_client_usr_activate_apps(pkgmgr_client *pc, const char **appids,
1452 int n_apps, pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1455 GVariantBuilder *builder;
1456 int ret = PKGMGR_R_ECOMM;
1457 char *req_key = NULL;
1458 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1459 struct cb_info *cb_info;
1462 if (pc == NULL || appids == NULL || n_apps < 1) {
1463 ERR("invalid parameter");
1464 return PKGMGR_R_EINVAL;
1467 if (client->pc_type != PC_REQUEST) {
1468 ERR("client type is not PC_REQUEST");
1469 return PKGMGR_R_EINVAL;
1472 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1473 for (i = 0; i < n_apps; i++)
1474 g_variant_builder_add(builder, "s", appids[i]);
1476 ret = pkgmgr_client_connection_send_request(client, "enable_apps",
1477 g_variant_new("(uas)", uid, builder), &result);
1478 g_variant_builder_unref(builder);
1479 if (ret != PKGMGR_R_OK) {
1480 ERR("request failed: %d", ret);
1484 g_variant_get(result, "(i&s)", &ret, &req_key);
1485 if (req_key == NULL) {
1486 g_variant_unref(result);
1487 return PKGMGR_R_ECOMM;
1489 if (ret != PKGMGR_R_OK) {
1490 g_variant_unref(result);
1494 cb_info = __create_app_event_cb_info(client, app_event_cb, data, req_key);
1495 if (cb_info == NULL) {
1496 g_variant_unref(result);
1497 return PKGMGR_R_ERROR;
1499 g_variant_unref(result);
1500 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1501 if (ret != PKGMGR_R_OK) {
1502 __free_cb_info(cb_info);
1505 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1507 return cb_info->req_id;
1510 API int pkgmgr_client_activate_apps(pkgmgr_client *pc, const char **appids,
1511 int n_apps, pkgmgr_app_handler app_event_cb, void *data)
1513 return pkgmgr_client_usr_activate_apps(pc, appids, n_apps,
1514 app_event_cb, data, _getuid());
1517 API int pkgmgr_client_activate_global_app_for_uid(pkgmgr_client *pc,
1518 const char *appid, pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1521 int ret = PKGMGR_R_ECOMM;
1522 char *req_key = NULL;
1523 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1524 struct cb_info *cb_info;
1526 if (pc == NULL || appid == NULL) {
1527 ERR("invalid parameter");
1528 return PKGMGR_R_EINVAL;
1531 ret = pkgmgr_client_connection_send_request(client,
1532 "enable_global_app_for_uid",
1533 g_variant_new("(us)", uid, appid), &result);
1534 if (ret != PKGMGR_R_OK) {
1535 ERR("request failed: %d", ret);
1539 g_variant_get(result, "(i&s)", &ret, &req_key);
1540 if (req_key == NULL) {
1541 g_variant_unref(result);
1542 return PKGMGR_R_ECOMM;
1544 if (ret != PKGMGR_R_OK) {
1545 g_variant_unref(result);
1549 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1551 if (cb_info == NULL) {
1552 g_variant_unref(result);
1553 return PKGMGR_R_ENOMEM;
1555 g_variant_unref(result);
1556 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1557 if (ret != PKGMGR_R_OK) {
1558 __free_cb_info(cb_info);
1561 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1563 return cb_info->req_id;
1566 API int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid,
1567 pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1570 int ret = PKGMGR_R_ECOMM;
1571 char *req_key = NULL;
1572 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1573 struct cb_info *cb_info;
1575 if (pc == NULL || appid == NULL) {
1576 ERR("invalid parameter");
1577 return PKGMGR_R_EINVAL;
1580 ret = pkgmgr_client_connection_send_request(client, "disable_app",
1581 g_variant_new("(us)", uid, appid), &result);
1582 if (ret != PKGMGR_R_OK) {
1583 ERR("request failed: %d", ret);
1587 g_variant_get(result, "(i&s)", &ret, &req_key);
1588 if (req_key == NULL) {
1589 g_variant_unref(result);
1590 return PKGMGR_R_ECOMM;
1592 if (ret != PKGMGR_R_OK) {
1593 g_variant_unref(result);
1597 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1599 if (cb_info == NULL) {
1600 g_variant_unref(result);
1601 return PKGMGR_R_ENOMEM;
1603 g_variant_unref(result);
1604 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1605 if (ret != PKGMGR_R_OK) {
1606 __free_cb_info(cb_info);
1609 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1611 return cb_info->req_id;
1614 API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid,
1615 pkgmgr_app_handler app_event_cb, void *data)
1617 return pkgmgr_client_usr_deactivate_app(pc, appid, app_event_cb, data,
1621 API int pkgmgr_client_usr_deactivate_apps(pkgmgr_client *pc,
1622 const char **appids, int n_apps,
1623 pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1626 GVariantBuilder *builder;
1627 int ret = PKGMGR_R_ECOMM;
1628 char *req_key = NULL;
1629 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1630 struct cb_info *cb_info;
1633 if (pc == NULL || appids == NULL || n_apps < 1) {
1634 ERR("invalid parameter");
1635 return PKGMGR_R_EINVAL;
1638 if (client->pc_type != PC_REQUEST) {
1639 ERR("client type is not PC_REQUEST");
1640 return PKGMGR_R_EINVAL;
1643 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1644 for (i = 0; i < n_apps; i++)
1645 g_variant_builder_add(builder, "s", appids[i]);
1647 ret = pkgmgr_client_connection_send_request(client, "disable_apps",
1648 g_variant_new("(uas)", uid, builder), &result);
1649 g_variant_builder_unref(builder);
1650 if (ret != PKGMGR_R_OK) {
1651 ERR("request failed: %d", ret);
1655 g_variant_get(result, "(i&s)", &ret, &req_key);
1656 if (req_key == NULL) {
1657 g_variant_unref(result);
1658 return PKGMGR_R_ECOMM;
1660 if (ret != PKGMGR_R_OK) {
1661 g_variant_unref(result);
1665 cb_info = __create_app_event_cb_info(client, app_event_cb, data, req_key);
1666 if (cb_info == NULL) {
1667 g_variant_unref(result);
1668 return PKGMGR_R_ERROR;
1670 g_variant_unref(result);
1671 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1672 if (ret != PKGMGR_R_OK) {
1673 __free_cb_info(cb_info);
1676 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1678 return cb_info->req_id;
1681 API int pkgmgr_client_deactivate_apps(pkgmgr_client *pc, const char **appids,
1682 int n_apps, pkgmgr_app_handler app_event_cb, void *data)
1684 return pkgmgr_client_usr_deactivate_apps(pc, appids, n_apps,
1685 app_event_cb, data, _getuid());
1688 API int pkgmgr_client_deactivate_global_app_for_uid(pkgmgr_client *pc,
1689 const char *appid, pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1692 int ret = PKGMGR_R_ECOMM;
1693 char *req_key = NULL;
1694 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1695 struct cb_info *cb_info;
1697 if (pc == NULL || appid == NULL) {
1698 ERR("invalid parameter");
1699 return PKGMGR_R_EINVAL;
1702 ret = pkgmgr_client_connection_send_request(client,
1703 "disable_global_app_for_uid",
1704 g_variant_new("(us)", uid, appid), &result);
1705 if (ret != PKGMGR_R_OK) {
1706 ERR("request failed: %d", ret);
1710 g_variant_get(result, "(i&s)", &ret, &req_key);
1711 if (req_key == NULL) {
1712 g_variant_unref(result);
1713 return PKGMGR_R_ECOMM;
1715 if (ret != PKGMGR_R_OK) {
1716 g_variant_unref(result);
1720 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1722 if (cb_info == NULL) {
1723 g_variant_unref(result);
1724 return PKGMGR_R_ENOMEM;
1726 g_variant_unref(result);
1727 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1728 if (ret != PKGMGR_R_OK) {
1729 __free_cb_info(cb_info);
1732 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1734 return cb_info->req_id;
1737 API int pkgmgr_client_usr_clear_user_data(pkgmgr_client *pc,
1738 const char *pkg_type, const char *pkgid, pkgmgr_mode mode,
1743 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1745 if (pc == NULL || pkgid == NULL || uid == GLOBAL_USER) {
1746 ERR("invalid parameter");
1747 return PKGMGR_R_EINVAL;
1750 if (client->pc_type != PC_REQUEST) {
1751 ERR("client->pc_type is not PC_REQUEST");
1752 return PKGMGR_R_EINVAL;
1755 ret = pkgmgr_client_connection_send_request(client, "cleardata",
1756 g_variant_new("(us)", uid, pkgid), &result);
1757 if (ret != PKGMGR_R_OK) {
1758 ERR("request failed: %d", ret);
1762 g_variant_get(result, "(i)", &ret);
1763 g_variant_unref(result);
1768 API int pkgmgr_client_clear_user_data(pkgmgr_client *pc, const char *pkg_type,
1769 const char *pkgid, pkgmgr_mode mode)
1771 return pkgmgr_client_usr_clear_user_data(pc, pkg_type, pkgid, mode,
1775 API int pkgmgr_client_set_status_type(pkgmgr_client *pc, int status_type)
1777 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1780 ERR("invalid parameter");
1781 return PKGMGR_R_EINVAL;
1784 client->status_type = status_type;
1789 API int pkgmgr_client_listen_status(pkgmgr_client *pc, pkgmgr_handler event_cb,
1793 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1794 struct cb_info *cb_info;
1796 if (pc == NULL || event_cb == NULL) {
1797 ERR("invalid parameter");
1798 return PKGMGR_R_EINVAL;
1801 if (client->pc_type != PC_LISTENING) {
1802 ERR("client->pc_type is not PC_LISTENING");
1803 return PKGMGR_R_EINVAL;
1806 cb_info = __create_event_cb_info(client, event_cb, data, NULL);
1807 if (cb_info == NULL)
1808 return PKGMGR_R_ENOMEM;
1809 cb_info->status_type = client->status_type;
1810 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1811 if (ret != PKGMGR_R_OK) {
1812 __free_cb_info(cb_info);
1815 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1817 return cb_info->req_id;
1820 API int pkgmgr_client_listen_app_status(pkgmgr_client *pc,
1821 pkgmgr_app_handler app_event_cb, void *data)
1824 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1825 struct cb_info *cb_info;
1827 if (pc == NULL || app_event_cb == NULL) {
1828 ERR("invalid parameter");
1829 return PKGMGR_R_EINVAL;
1832 if (client->pc_type != PC_LISTENING) {
1833 ERR("client->pc_type is not PC_LISTENING");
1834 return PKGMGR_R_EINVAL;
1837 cb_info = __create_app_event_cb_info(client, app_event_cb, data, NULL);
1838 if (cb_info == NULL)
1839 return PKGMGR_R_ENOMEM;
1840 cb_info->status_type = client->status_type;
1841 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1842 if (ret != PKGMGR_R_OK) {
1843 __free_cb_info(cb_info);
1846 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1848 return cb_info->req_id;
1851 API int pkgmgr_client_remove_listen_status(pkgmgr_client *pc)
1853 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1856 struct cb_info *cb_info;
1859 ERR("invalid parameter");
1860 return PKGMGR_R_EINVAL;
1863 /* unset all callback */
1864 tmp = client->cb_info_list;
1865 while (tmp != NULL) {
1867 cb_info = (struct cb_info *)tmp->data;
1868 pkgmgr_client_connection_unset_callback(pc, cb_info);
1869 client->cb_info_list = g_list_delete_link(client->cb_info_list,
1871 __free_cb_info(cb_info);
1878 API int pkgmgr_client_broadcast_status(pkgmgr_client *pc, const char *pkg_type,
1879 const char *pkgid, const char *key, const char *val)
1881 /* client cannot broadcast signal */
1885 /* TODO: deprecate(or remove) */
1886 API int pkgmgr_client_request_service(pkgmgr_request_service_type service_type,
1887 int service_mode, pkgmgr_client *pc, const char *pkg_type,
1888 const char *pkgid, const char *custom_info,
1889 pkgmgr_handler event_cb, void *data)
1891 return pkgmgr_client_usr_request_service(service_type, service_mode,
1892 pc, pkg_type, pkgid, _getuid(), custom_info, event_cb,
1896 API int pkgmgr_client_usr_request_service(
1897 pkgmgr_request_service_type service_type, int service_mode,
1898 pkgmgr_client *pc, const char *pkg_type, const char *pkgid,
1899 uid_t uid, const char *custom_info, pkgmgr_handler event_cb,
1904 /* Check for NULL value of service type */
1905 retvm_if(service_type > PM_REQUEST_MAX, PKGMGR_R_EINVAL, "service type is not defined\n");
1906 retvm_if(service_type < 0, PKGMGR_R_EINVAL, "service type is error\n");
1908 switch (service_type) {
1909 case PM_REQUEST_MOVE:
1910 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1911 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1912 tryvm_if((service_mode < PM_MOVE_TO_INTERNAL) || (service_mode > PM_MOVE_TO_EXTENDED), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1914 ret = __move_pkg_process(pc, pkgid, pkg_type, uid, (pkgmgr_move_type)service_mode, event_cb, data);
1917 case PM_REQUEST_GET_SIZE:
1918 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1919 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1920 tryvm_if((service_mode < PM_GET_TOTAL_SIZE) || (service_mode >= PM_GET_MAX), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1922 ret = __get_size_process(pc, pkgid, uid, (pkgmgr_getsize_type)service_mode, event_cb, data);
1925 case PM_REQUEST_KILL_APP:
1926 case PM_REQUEST_CHECK_APP:
1927 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1928 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1930 ret = __check_app_process(service_type, pc, pkgid, uid, data);
1932 ERR("__check_app_process fail \n");
1939 ERR("Wrong Request\n");
1949 API int pkgmgr_client_usr_clear_cache_dir(const char *pkgid, uid_t uid)
1953 struct pkgmgr_client_t *client;
1955 if (pkgid == NULL || uid == GLOBAL_USER) {
1956 ERR("invalid parameter");
1957 return PKGMGR_R_EINVAL;
1960 client = pkgmgr_client_new(PC_REQUEST);
1961 if (client == NULL) {
1962 ERR("out of memory");
1963 return PKGMGR_R_ENOMEM;
1966 ret = pkgmgr_client_connection_send_request(client, "clearcache",
1967 g_variant_new("(us)", uid, pkgid), &result);
1968 if (ret != PKGMGR_R_OK) {
1969 ERR("request failed: %d", ret);
1970 pkgmgr_client_free(client);
1974 g_variant_get(result, "(i)", &ret);
1975 g_variant_unref(result);
1976 pkgmgr_client_free(client);
1981 API int pkgmgr_client_clear_cache_dir(const char *pkgid)
1983 return pkgmgr_client_usr_clear_cache_dir(pkgid, _getuid());
1986 API int pkgmgr_client_clear_usr_all_cache_dir(uid_t uid)
1988 return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, uid);
1991 API int pkgmgr_client_clear_all_cache_dir(void)
1993 return pkgmgr_client_usr_clear_cache_dir(
1994 PKG_CLEAR_ALL_CACHE, _getuid());
1997 API int pkgmgr_client_get_size(pkgmgr_client *pc, const char *pkgid,
1998 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
2001 return pkgmgr_client_usr_get_size(pc, pkgid, get_type, event_cb, data,
2005 /* TODO: deprecate(or remove) */
2006 API int pkgmgr_client_usr_get_size(pkgmgr_client *pc, const char *pkgid,
2007 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
2008 void *data, uid_t uid)
2011 int ret = PKGMGR_R_ECOMM;
2012 char *req_key = NULL;
2013 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2014 struct cb_info *cb_info;
2016 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
2017 ERR("invalid parameter");
2018 return PKGMGR_R_EINVAL;
2021 if (client->pc_type != PC_REQUEST) {
2022 ERR("client->pc_type is not PC_REQUEST");
2023 return PKGMGR_R_EINVAL;
2027 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
2028 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
2030 get_type = PM_GET_PKG_SIZE_INFO;
2032 ret = pkgmgr_client_connection_send_request(client, "getsize",
2033 g_variant_new("(usi)", uid, pkgid, get_type), &result);
2034 if (ret != PKGMGR_R_OK) {
2035 ERR("request failed: %d", ret);
2039 g_variant_get(result, "(i&s)", &ret, &req_key);
2040 if (req_key == NULL) {
2041 g_variant_unref(result);
2042 return PKGMGR_R_ECOMM;
2044 if (ret != PKGMGR_R_OK) {
2045 g_variant_unref(result);
2049 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
2050 if (cb_info == NULL) {
2051 g_variant_unref(result);
2052 return PKGMGR_R_ENOMEM;
2054 g_variant_unref(result);
2055 ret = pkgmgr_client_connection_set_callback(client, cb_info);
2056 if (ret != PKGMGR_R_OK) {
2057 __free_cb_info(cb_info);
2060 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
2065 API int pkgmgr_client_usr_get_package_size_info(pkgmgr_client *pc,
2066 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
2067 void *user_data, uid_t uid)
2070 int ret = PKGMGR_R_ECOMM;
2071 char *req_key = NULL;
2073 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2074 struct cb_info *cb_info;
2076 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
2077 ERR("invalid parameter");
2078 return PKGMGR_R_EINVAL;
2081 if (client->pc_type != PC_REQUEST) {
2082 ERR("client->pc_type is not PC_REQUEST");
2083 return PKGMGR_R_EINVAL;
2086 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
2087 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
2089 get_type = PM_GET_PKG_SIZE_INFO;
2091 ret = pkgmgr_client_connection_send_request(client, "getsize",
2092 g_variant_new("(usi)", uid, pkgid, get_type), &result);
2093 if (ret != PKGMGR_R_OK) {
2094 ERR("request failed: %d", ret);
2098 g_variant_get(result, "(i&s)", &ret, &req_key);
2099 if (req_key == NULL) {
2100 g_variant_unref(result);
2101 return PKGMGR_R_ECOMM;
2103 if (ret != PKGMGR_R_OK) {
2104 g_variant_unref(result);
2108 cb_info = __create_size_info_cb_info(client, event_cb, user_data,
2110 if (cb_info == NULL) {
2111 g_variant_unref(result);
2112 return PKGMGR_R_ENOMEM;
2114 g_variant_unref(result);
2115 ret = pkgmgr_client_connection_set_callback(client, cb_info);
2116 if (ret != PKGMGR_R_OK) {
2117 __free_cb_info(cb_info);
2120 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
2125 API int pkgmgr_client_get_package_size_info(pkgmgr_client *pc,
2126 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
2129 return pkgmgr_client_usr_get_package_size_info(pc, pkgid, event_cb,
2130 user_data, _getuid());
2133 API int pkgmgr_client_usr_get_total_package_size_info(pkgmgr_client *pc,
2134 pkgmgr_total_pkg_size_info_receive_cb event_cb,
2135 void *user_data, uid_t uid)
2136 { /* total package size info */
2137 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL,
2138 (pkgmgr_pkg_size_info_receive_cb)event_cb,
2142 API int pkgmgr_client_get_total_package_size_info(pkgmgr_client *pc,
2143 pkgmgr_total_pkg_size_info_receive_cb event_cb, void *user_data)
2145 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL,
2146 (pkgmgr_pkg_size_info_receive_cb)event_cb,
2147 user_data, _getuid());
2150 API int pkgmgr_client_generate_license_request(pkgmgr_client *pc,
2151 const char *resp_data, char **req_data, char **license_url)
2157 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2159 if (pc == NULL || resp_data == NULL || req_data == NULL ||
2160 license_url == NULL) {
2161 ERR("invalid parameter");
2162 return PKGMGR_R_EINVAL;
2165 if (client->pc_type != PC_REQUEST) {
2166 ERR("client->pc_type is not PC_REQUEST");
2167 return PKGMGR_R_EINVAL;
2170 ret = pkgmgr_client_connection_send_request(client,
2171 "generate_license_request",
2172 g_variant_new("(s)", resp_data), &result);
2173 if (ret != PKGMGR_R_OK) {
2174 ERR("request failed: %d", ret);
2178 g_variant_get(result, "(i&s&s)", &ret, &data, &url);
2179 if (ret != PKGMGR_R_OK) {
2180 ERR("generate_license_request failed: %d", ret);
2181 g_variant_unref(result);
2185 *req_data = strdup(data);
2186 *license_url = strdup(url);
2188 g_variant_unref(result);
2193 API int pkgmgr_client_register_license(pkgmgr_client *pc, const char *resp_data)
2197 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2199 if (pc == NULL || resp_data == NULL) {
2200 ERR("invalid parameter");
2201 return PKGMGR_R_EINVAL;
2204 if (client->pc_type != PC_REQUEST) {
2205 ERR("client->pc_type is not PC_REQUEST");
2206 return PKGMGR_R_EINVAL;
2209 ret = pkgmgr_client_connection_send_request(client, "register_license",
2210 g_variant_new("(s)", resp_data), &result);
2211 if (ret != PKGMGR_R_OK) {
2212 ERR("request failed: %d", ret);
2216 g_variant_get(result, "(i)", &ret);
2217 g_variant_unref(result);
2218 if (ret != PKGMGR_R_OK)
2219 ERR("register license failed: %d", ret);
2224 API int pkgmgr_client_decrypt_package(pkgmgr_client *pc,
2225 const char *drm_file_path, const char *decrypted_file_path)
2229 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2231 if (pc == NULL || drm_file_path == NULL ||
2232 decrypted_file_path == NULL) {
2233 ERR("invalid parameter");
2234 return PKGMGR_R_EINVAL;
2237 if (client->pc_type != PC_REQUEST) {
2238 ERR("client->pc_type is not PC_REQUEST");
2239 return PKGMGR_R_EINVAL;
2242 ret = pkgmgr_client_connection_send_request(client, "decrypt_package",
2243 g_variant_new("(ss)", drm_file_path,
2244 decrypted_file_path), &result);
2245 if (ret != PKGMGR_R_OK) {
2246 ERR("request failed: %d", ret);
2250 g_variant_get(result, "(i)", &ret);
2251 g_variant_unref(result);
2252 if (ret != PKGMGR_R_OK)
2253 ERR("decrypt_package failed: %d", ret);
2258 API int pkgmgr_client_enable_splash_screen(pkgmgr_client *pc, const char *appid)
2260 return pkgmgr_client_usr_enable_splash_screen(pc, appid, _getuid());
2263 API int pkgmgr_client_usr_enable_splash_screen(pkgmgr_client *pc,
2264 const char *appid, uid_t uid)
2268 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2270 if (pc == NULL || appid == NULL) {
2271 ERR("Invalid parameter");
2272 return PKGMGR_R_EINVAL;
2275 ret = pkgmgr_client_connection_send_request(client,
2276 "enable_app_splash_screen",
2277 g_variant_new("(us)", uid, appid), &result);
2278 if (ret != PKGMGR_R_OK) {
2279 ERR("request failed: %d", ret);
2283 g_variant_get(result, "(i)", &ret);
2284 g_variant_unref(result);
2285 if (ret != PKGMGR_R_OK)
2286 ERR("enable splash screen failed: %d", ret);
2291 API int pkgmgr_client_disable_splash_screen(pkgmgr_client *pc,
2294 return pkgmgr_client_usr_disable_splash_screen(pc, appid,
2298 API int pkgmgr_client_usr_disable_splash_screen(pkgmgr_client *pc,
2299 const char *appid, uid_t uid)
2303 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2305 if (pc == NULL || appid == NULL) {
2306 ERR("Invalid parameter");
2307 return PKGMGR_R_EINVAL;
2310 ret = pkgmgr_client_connection_send_request(client,
2311 "disable_app_splash_screen",
2312 g_variant_new("(us)", uid, appid), &result);
2313 if (ret != PKGMGR_R_OK) {
2314 ERR("request failed: %d", ret);
2318 g_variant_get(result, "(i)", &ret);
2319 g_variant_unref(result);
2320 if (ret != PKGMGR_R_OK)
2321 ERR("disable splash screen failed: %d", ret);
2326 static int __set_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
2327 int mode, uid_t uid)
2330 int ret = PKGMGR_R_ECOMM;
2331 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2333 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
2334 ERR("invalid parameter");
2335 return PKGMGR_R_EINVAL;
2338 ret = pkgmgr_client_connection_send_request(client,
2339 "set_restriction_mode",
2340 g_variant_new("(usi)", uid, pkgid, mode), &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_usr_set_pkg_restriction_mode(pkgmgr_client *pc,
2353 const char *pkgid, int mode, uid_t uid)
2355 return __set_pkg_restriction_mode(pc, pkgid, mode, uid);
2358 API int pkgmgr_client_set_pkg_restriction_mode(pkgmgr_client *pc,
2359 const char *pkgid, int mode)
2361 return pkgmgr_client_usr_set_pkg_restriction_mode(pc, pkgid, mode,
2365 static int __unset_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
2366 int mode, uid_t uid)
2369 int ret = PKGMGR_R_ECOMM;
2370 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2372 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
2373 ERR("invalid parameter");
2374 return PKGMGR_R_EINVAL;
2377 ret = pkgmgr_client_connection_send_request(client,
2378 "unset_restriction_mode",
2379 g_variant_new("(usi)", uid, pkgid, mode), &result);
2380 if (ret != PKGMGR_R_OK) {
2381 ERR("request failed: %d", ret);
2385 g_variant_get(result, "(i)", &ret);
2386 g_variant_unref(result);
2392 API int pkgmgr_client_usr_unset_pkg_restriction_mode(pkgmgr_client *pc,
2393 const char *pkgid, int mode, uid_t uid)
2395 return __unset_pkg_restriction_mode(pc, pkgid, mode, uid);
2398 API int pkgmgr_client_unset_pkg_restriction_mode(pkgmgr_client *pc,
2399 const char *pkgid, int mode)
2401 return pkgmgr_client_usr_unset_pkg_restriction_mode(pc, pkgid, mode,
2405 static int __get_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
2406 int *mode, uid_t uid)
2409 int ret = PKGMGR_R_ECOMM;
2411 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2413 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0) {
2414 ERR("invalid parameter");
2415 return PKGMGR_R_EINVAL;
2418 ret = pkgmgr_client_connection_send_request(client,
2419 "get_restriction_mode",
2420 g_variant_new("(us)", uid, pkgid), &result);
2421 if (ret != PKGMGR_R_OK) {
2422 ERR("request failed: %d", ret);
2426 g_variant_get(result, "(ii)", &m, &ret);
2427 g_variant_unref(result);
2428 if (ret != PKGMGR_R_OK)
2436 API int pkgmgr_client_usr_get_pkg_restriction_mode(pkgmgr_client *pc,
2437 const char *pkgid, int *mode, uid_t uid)
2439 return __get_pkg_restriction_mode(pc, pkgid, mode, uid);
2442 API int pkgmgr_client_get_pkg_restriction_mode(pkgmgr_client *pc,
2443 const char *pkgid, int *mode)
2445 return pkgmgr_client_usr_get_pkg_restriction_mode(pc, pkgid, mode,
2449 API int pkgmgr_client_usr_set_restriction_mode(pkgmgr_client *pc, int mode,
2453 int ret = PKGMGR_R_ECOMM;
2454 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2457 ERR("invalid parameter");
2458 return PKGMGR_R_EINVAL;
2461 ret = pkgmgr_client_connection_send_request(client,
2462 "set_restriction_mode",
2463 g_variant_new("(usi)", uid, "", mode), &result);
2464 if (ret != PKGMGR_R_OK) {
2465 ERR("request failed: %d", ret);
2469 g_variant_get(result, "(i)", &ret);
2470 g_variant_unref(result);
2475 API int pkgmgr_client_set_restriction_mode(pkgmgr_client *pc, int mode)
2477 return pkgmgr_client_usr_set_restriction_mode(pc, mode, _getuid());
2480 API int pkgmgr_client_usr_unset_restriction_mode(pkgmgr_client *pc, int mode,
2484 int ret = PKGMGR_R_ECOMM;
2485 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2488 ERR("invalid parameter");
2489 return PKGMGR_R_EINVAL;
2492 ret = pkgmgr_client_connection_send_request(client,
2493 "unset_restriction_mode",
2494 g_variant_new("(usi)", uid, "", mode), &result);
2495 if (ret != PKGMGR_R_OK) {
2496 ERR("request failed: %d", ret);
2500 g_variant_get(result, "(i)", &ret);
2501 g_variant_unref(result);
2506 API int pkgmgr_client_unset_restriction_mode(pkgmgr_client *pc, int mode)
2508 return pkgmgr_client_usr_unset_restriction_mode(pc, mode, _getuid());
2511 API int pkgmgr_client_usr_get_restriction_mode(pkgmgr_client *pc,
2512 int *mode, uid_t uid)
2515 int ret = PKGMGR_R_ECOMM;
2517 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2520 ERR("invalid parameter");
2521 return PKGMGR_R_EINVAL;
2524 ret = pkgmgr_client_connection_send_request(client,
2525 "get_restriction_mode",
2526 g_variant_new("(us)", uid, ""), &result);
2527 if (ret != PKGMGR_R_OK) {
2528 ERR("request failed: %d", ret);
2532 g_variant_get(result, "(ii)", &m, &ret);
2533 g_variant_unref(result);
2534 if (ret != PKGMGR_R_OK)
2542 API int pkgmgr_client_get_restriction_mode(pkgmgr_client *pc, int *mode)
2544 return pkgmgr_client_usr_get_restriction_mode(pc, mode, _getuid());
2547 API pkgmgr_info *pkgmgr_client_check_pkginfo_from_file(const char *pkg_path)
2550 pkg_plugin_set *plugin_set;
2551 package_manager_pkg_detail_info_t *info;
2554 if (pkg_path == NULL) {
2555 ERR("invalid parameter");
2559 pkg_type = __get_type_from_path(pkg_path);
2560 if (pkg_type == NULL) {
2561 ERR("cannot get pkg type");
2565 plugin_set = _package_manager_load_library(pkg_type);
2566 if (plugin_set == NULL) {
2567 ERR("failed to load library for %s", pkg_type);
2572 info = calloc(1, sizeof(package_manager_pkg_detail_info_t));
2574 ERR("out of memory");
2579 ret = plugin_set->get_pkg_detail_info_from_package(pkg_path, info);
2581 ERR("get_pkg_detail_info_from_package failed");
2589 return (pkgmgr_info *)info;
2592 API int pkgmgr_client_free_pkginfo(pkgmgr_info *info)
2594 package_manager_pkg_detail_info_t *pkg_info =
2595 (package_manager_pkg_detail_info_t *)info;
2598 ERR("invalid parameter");
2599 return PKGMGR_R_EINVAL;
2602 g_list_free_full(pkg_info->privilege_list, free);
2603 free(pkg_info->icon_buf);
2609 API int pkgmgr_client_usr_set_app_label(pkgmgr_client *pc, char *appid,
2610 char *label, uid_t uid)
2614 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2616 if (pc == NULL || appid == NULL || label == NULL) {
2617 ERR("Invalid parameter");
2618 return PKGMGR_R_EINVAL;
2621 ret = pkgmgr_client_connection_send_request(client,
2623 g_variant_new("(uss)", uid, appid, label), &result);
2624 if (ret != PKGMGR_R_OK) {
2625 ERR("Request failed: %d", ret);
2629 g_variant_get(result, "(i)", &ret);
2630 g_variant_unref(result);
2635 API int pkgmgr_client_set_app_label(pkgmgr_client *pc, char *appid, char *label)
2637 return pkgmgr_client_usr_set_app_label(pc, appid, label, _getuid());
2640 API int pkgmgr_client_usr_set_app_icon(pkgmgr_client *pc, char *appid,
2641 char *icon_path, uid_t uid)
2645 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2647 if (pc == NULL || appid == NULL || icon_path == NULL) {
2648 ERR("Invalid parameter");
2649 return PKGMGR_R_EINVAL;
2652 if (access(icon_path, F_OK) != 0) {
2653 ERR("failed to access: %s", icon_path);
2654 return PKGMGR_R_EINVAL;
2657 ret = pkgmgr_client_connection_send_request(client,
2659 g_variant_new("(uss)", uid, appid, icon_path), &result);
2660 if (ret != PKGMGR_R_OK) {
2661 ERR("Request failed: %d", ret);
2665 g_variant_get(result, "(i)", &ret);
2666 g_variant_unref(result);
2671 API int pkgmgr_client_set_app_icon(pkgmgr_client *pc, char *appid, char *icon_path)
2673 return pkgmgr_client_usr_set_app_icon(pc, appid, icon_path, _getuid());
2676 API int pkgmgr_client_set_debug_mode(pkgmgr_client *pc, bool debug_mode)
2678 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2681 ERR("invalid parameter");
2682 return PKGMGR_R_EINVAL;
2685 client->debug_mode = debug_mode;
2690 API int pkgmgr_client_set_skip_optimization(pkgmgr_client *pc, bool skip_optimization)
2692 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2695 ERR("invalid parameter");
2696 return PKGMGR_R_EINVAL;
2699 client->skip_optimization = skip_optimization;
2704 API int pkgmgr_client_usr_migrate_external_image(pkgmgr_client *pc,
2705 const char *pkgid, uid_t uid)
2708 int ret = PKGMGR_R_ECOMM;
2709 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2712 ERR("invalid parameter");
2713 return PKGMGR_R_EINVAL;
2716 ret = pkgmgr_client_connection_send_request(client,
2717 "migrate_external_image",
2718 g_variant_new("(us)", uid, pkgid), &result);
2719 if (ret != PKGMGR_R_OK) {
2720 ERR("request failed: %d", ret);
2724 g_variant_get(result, "(i)", &ret);
2725 g_variant_unref(result);