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);
325 g_variant_get(result, "(ii)", &ret, &pid);
326 g_variant_unref(result);
327 if (ret != PKGMGR_R_OK) {
328 ERR("request failed, ret=%d", ret);
334 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
340 API pkgmgr_client *pkgmgr_client_new(pkgmgr_client_type pc_type)
342 struct pkgmgr_client_t *client;
344 if (pc_type == PC_BROADCAST) {
345 ERR("broadcast type is not supported");
349 if (pc_type != PC_REQUEST && pc_type != PC_LISTENING) {
350 ERR("invalid parameter");
354 client = calloc(1, sizeof(struct pkgmgr_client_t));
355 if (client == NULL) {
356 ERR("out of memory");
360 client->pc_type = pc_type;
361 client->status_type = PKGMGR_CLIENT_STATUS_ALL;
363 if (pkgmgr_client_connection_connect(client) != PKGMGR_R_OK) {
368 return (pkgmgr_client *)client;
371 API int pkgmgr_client_free(pkgmgr_client *pc)
373 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
376 ERR("invalid argument");
377 return PKGMGR_R_EINVAL;
380 pkgmgr_client_remove_listen_status(client);
381 pkgmgr_client_connection_disconnect(client);
382 if (client->tep_path)
383 free(client->tep_path);
389 struct manifest_and_type type_map[] = {
390 { "res/wgt/config.xml", "wgt" },
391 { "config.xml", "wgt" },
392 { "tizen-manifest.xml", "tpk" },
396 static char *__get_type_from_path(const char *pkg_path)
398 const char *type = NULL;
402 uf = unzOpen(pkg_path);
404 ERR("failed to open zip file %s", pkg_path);
408 for (i = 0; type_map[i].manifest != NULL; i++) {
409 if (unzLocateFile(uf, type_map[i].manifest, 0) == UNZ_OK) {
410 DBG("pkgtype of %s: [%s]", pkg_path, type_map[i].type);
411 type = type_map[i].type;
417 return type ? strdup(type) : NULL;
420 API int pkgmgr_client_set_tep_path(pkgmgr_client *pc, const char *tep_path,
423 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *) pc;
425 if (pc == NULL || tep_path == NULL) {
426 ERR("invalied parameter");
427 return PKGMGR_R_EINVAL;
430 if (client->tep_path)
431 free(client->tep_path);
433 client->tep_path = strdup(tep_path);
434 client->tep_move = tep_move;
439 API int pkgmgr_client_usr_install_packages(pkgmgr_client *pc,
440 const char **pkg_paths, int n_pkgs, pkgmgr_handler event_cb,
441 void *data, uid_t uid)
444 GVariantBuilder *pkgs_builder;
446 GVariantBuilder *args_builder;
449 char *req_key = NULL;
450 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
451 struct cb_info *cb_info;
453 char *request_id = NULL;
455 if (pc == NULL || pkg_paths == NULL || n_pkgs < 1) {
456 ERR("invalid parameter");
457 return PKGMGR_R_EINVAL;
460 if (client->pc_type != PC_REQUEST) {
461 ERR("client type is not PC_REQUEST");
462 return PKGMGR_R_EINVAL;
465 for (i = 0; i < n_pkgs; i++) {
466 if (access(pkg_paths[i], F_OK) != 0) {
467 ERR("failed to access: %s", pkg_paths[i]);
468 return PKGMGR_R_EINVAL;
472 pkgs_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
473 for (i = 0; i < n_pkgs; i++)
474 g_variant_builder_add(pkgs_builder, "s", pkg_paths[i]);
475 pkgs = g_variant_new("as", pkgs_builder);
476 g_variant_builder_unref(pkgs_builder);
478 args_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
479 if (client->debug_mode)
480 g_variant_builder_add(args_builder, "s", "-G");
481 if (client->skip_optimization)
482 g_variant_builder_add(args_builder, "s", "-S");
483 args = g_variant_new("as", args_builder);
484 g_variant_builder_unref(args_builder);
486 request_id = _generate_request_id();
487 ret = pkgmgr_client_connection_send_request(client, "install_pkgs",
488 g_variant_new("(u@as@ass)", uid, pkgs, args,
492 if (ret != PKGMGR_R_OK) {
493 ERR("request failed: %d", ret);
497 g_variant_get(result, "(i&s)", &ret, &req_key);
498 if (req_key == NULL) {
499 g_variant_unref(result);
500 return PKGMGR_R_ECOMM;
502 if (ret != PKGMGR_R_OK) {
503 g_variant_unref(result);
507 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
508 if (cb_info == NULL) {
509 g_variant_unref(result);
510 return PKGMGR_R_ERROR;
512 g_variant_unref(result);
513 ret = pkgmgr_client_connection_set_callback(client, cb_info);
514 if (ret != PKGMGR_R_OK) {
515 __free_cb_info(cb_info);
518 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
520 return cb_info->req_id;
523 API int pkgmgr_client_install_packages(pkgmgr_client *pc,
524 const char **pkg_paths, int n_pkgs, pkgmgr_handler event_cb,
527 return pkgmgr_client_usr_install_packages(pc, pkg_paths, n_pkgs,
528 event_cb, data, _getuid());
531 API int pkgmgr_client_usr_install(pkgmgr_client *pc, const char *pkg_type,
532 const char *descriptor_path, const char *pkg_path,
533 const char *optional_data, pkgmgr_mode mode,
534 pkgmgr_handler event_cb, void *data, uid_t uid)
537 int ret = PKGMGR_R_ECOMM;
538 char *req_key = NULL;
539 GVariantBuilder *builder = NULL;
540 GVariant *args = NULL;
541 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
542 struct cb_info *cb_info;
543 char *request_id = NULL;
545 if (pc == NULL || pkg_path == NULL) {
546 ERR("invalid parameter");
547 return PKGMGR_R_EINVAL;
550 if (client->pc_type != PC_REQUEST) {
551 ERR("client type is not PC_REQUEST");
552 return PKGMGR_R_EINVAL;
555 if (access(pkg_path, F_OK) != 0) {
556 ERR("failed to access: %s", pkg_path);
557 return PKGMGR_R_EINVAL;
560 if (client->tep_path != NULL && access(client->tep_path, F_OK) != 0) {
561 ERR("failed to access: %s", client->tep_path);
562 return PKGMGR_R_EINVAL;
565 /* build arguments */
566 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
567 if (client->tep_path) {
568 g_variant_builder_add(builder, "s", "-e");
569 g_variant_builder_add(builder, "s", client->tep_path);
570 g_variant_builder_add(builder, "s", "-M");
571 /* TODO: revise tep_move */
572 g_variant_builder_add(builder, "s",
573 client->tep_move ? "tep_move" : "tep_copy");
575 if (client->debug_mode)
576 g_variant_builder_add(builder, "s", "-G");
577 if (client->skip_optimization)
578 g_variant_builder_add(builder, "s", "-S");
580 args = g_variant_new("as", builder);
581 g_variant_builder_unref(builder);
583 request_id = _generate_request_id();
584 ret = pkgmgr_client_connection_send_request(client, "install",
585 g_variant_new("(uss@ass)", uid, pkg_type ? pkg_type : "",
586 pkg_path, args, request_id),
589 if (ret != PKGMGR_R_OK) {
590 ERR("request failed: %d", ret);
594 g_variant_get(result, "(i&s)", &ret, &req_key);
595 if (req_key == NULL) {
596 g_variant_unref(result);
597 return PKGMGR_R_ECOMM;
599 if (ret != PKGMGR_R_OK) {
600 g_variant_unref(result);
604 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
605 if (cb_info == NULL) {
606 g_variant_unref(result);
607 return PKGMGR_R_ENOMEM;
609 g_variant_unref(result);
610 ret = pkgmgr_client_connection_set_callback(client, cb_info);
611 if (ret != PKGMGR_R_OK) {
612 __free_cb_info(cb_info);
615 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
616 return cb_info->req_id;
619 API int pkgmgr_client_install(pkgmgr_client *pc, const char *pkg_type,
620 const char *descriptor_path, const char *pkg_path,
621 const char *optional_data, pkgmgr_mode mode,
622 pkgmgr_handler event_cb, void *data)
624 return pkgmgr_client_usr_install(pc, pkg_type, descriptor_path,
625 pkg_path, optional_data, mode, event_cb, data,
629 API int pkgmgr_client_reinstall(pkgmgr_client *pc, const char *pkg_type,
630 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
631 pkgmgr_handler event_cb, void *data)
633 return pkgmgr_client_usr_reinstall(pc, pkg_type, pkgid, optional_data,
634 mode, event_cb, data, _getuid());
637 API int pkgmgr_client_usr_reinstall(pkgmgr_client *pc, const char *pkg_type,
638 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
639 pkgmgr_handler event_cb, void *data, uid_t uid)
642 int ret = PKGMGR_R_ECOMM;
643 char *req_key = NULL;
644 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
645 struct cb_info *cb_info;
647 if (pc == NULL || pkgid == NULL) {
648 ERR("invalid parameter");
649 return PKGMGR_R_EINVAL;
652 if (client->pc_type != PC_REQUEST) {
653 ERR("client->pc_type is not PC_REQUEST");
654 return PKGMGR_R_EINVAL;
657 ret = pkgmgr_client_connection_send_request(client, "reinstall",
658 g_variant_new("(us)", uid, pkgid), &result);
659 if (ret != PKGMGR_R_OK) {
660 ERR("request failed: %d", ret);
664 g_variant_get(result, "(i&s)", &ret, &req_key);
665 if (req_key == NULL) {
666 g_variant_unref(result);
667 return PKGMGR_R_ECOMM;
669 if (ret != PKGMGR_R_OK) {
670 g_variant_unref(result);
674 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
675 if (cb_info == NULL) {
676 g_variant_unref(result);
677 return PKGMGR_R_ENOMEM;
679 g_variant_unref(result);
680 ret = pkgmgr_client_connection_set_callback(client, cb_info);
681 if (ret != PKGMGR_R_OK) {
682 __free_cb_info(cb_info);
685 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
687 return cb_info->req_id;
690 API int pkgmgr_client_usr_mount_install_packages(pkgmgr_client *pc,
691 const char **pkg_paths, int n_pkgs, pkgmgr_handler event_cb,
692 void *data, uid_t uid)
695 GVariantBuilder *pkgs_builder;
697 int ret = PKGMGR_R_ECOMM;
698 char *req_key = NULL;
699 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
700 struct cb_info *cb_info;
702 char *request_id = NULL;
704 if (pc == NULL || pkg_paths == NULL || n_pkgs < 1) {
705 ERR("invalid parameter");
706 return PKGMGR_R_EINVAL;
709 if (client->pc_type != PC_REQUEST) {
710 ERR("client->pc_type is not PC_REQUEST");
711 return PKGMGR_R_EINVAL;
714 for (i = 0; i < n_pkgs; i++) {
715 if (access(pkg_paths[i], F_OK) != 0) {
716 ERR("failed to access: %s", pkg_paths[i]);
717 return PKGMGR_R_EINVAL;
721 pkgs_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
722 for (i = 0; i < n_pkgs; i++)
723 g_variant_builder_add(pkgs_builder, "s", pkg_paths[i]);
724 pkgs = g_variant_new("as", pkgs_builder);
725 g_variant_builder_unref(pkgs_builder);
727 request_id = _generate_request_id();
728 ret = pkgmgr_client_connection_send_request(client,
729 "mount_install_pkgs",
730 g_variant_new("(u@ass)", uid, pkgs, request_id),
733 if (ret != PKGMGR_R_OK) {
734 ERR("request failed: %d", ret);
738 g_variant_get(result, "(i&s)", &ret, &req_key);
739 if (req_key == NULL) {
740 g_variant_unref(result);
741 return PKGMGR_R_ECOMM;
743 if (ret != PKGMGR_R_OK) {
744 g_variant_unref(result);
748 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
749 if (cb_info == NULL) {
750 g_variant_unref(result);
751 return PKGMGR_R_ENOMEM;
753 g_variant_unref(result);
754 ret = pkgmgr_client_connection_set_callback(client, cb_info);
755 if (ret != PKGMGR_R_OK) {
756 __free_cb_info(cb_info);
759 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
761 return cb_info->req_id;
764 API int pkgmgr_client_mount_install_packages(pkgmgr_client *pc,
765 const char **pkg_paths, int n_pkgs, pkgmgr_handler event_cb,
768 return pkgmgr_client_usr_mount_install_packages(pc, pkg_paths, n_pkgs,
769 event_cb, data, _getuid());
772 API int pkgmgr_client_usr_mount_install(pkgmgr_client *pc, const char *pkg_type,
773 const char *descriptor_path, const char *pkg_path,
774 const char *optional_data, pkgmgr_mode mode,
775 pkgmgr_handler event_cb, void *data, uid_t uid)
778 int ret = PKGMGR_R_ECOMM;
779 char *req_key = NULL;
780 GVariantBuilder *builder = NULL;
781 GVariant *args = NULL;
782 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
783 struct cb_info *cb_info;
784 char *request_id = NULL;
786 if (pc == NULL || pkg_path == NULL) {
787 ERR("invalid parameter");
788 return PKGMGR_R_EINVAL;
791 if (client->pc_type != PC_REQUEST) {
792 ERR("client->pc_type is not PC_REQUEST");
793 return PKGMGR_R_EINVAL;
796 if (access(pkg_path, F_OK) != 0) {
797 ERR("failed to access: %s", pkg_path);
798 return PKGMGR_R_EINVAL;
801 if (client->tep_path != NULL && access(client->tep_path, F_OK) != 0) {
802 ERR("failed to access: %s", client->tep_path);
803 return PKGMGR_R_EINVAL;
806 /* build arguments */
807 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
808 if (client->tep_path) {
809 g_variant_builder_add(builder, "s", "-e");
810 g_variant_builder_add(builder, "s", client->tep_path);
811 g_variant_builder_add(builder, "s", "-M");
812 /* TODO: revise tep_move */
813 g_variant_builder_add(builder, "s",
814 client->tep_move ? "tep_move" : "tep_copy");
817 args = g_variant_new("as", builder);
818 g_variant_builder_unref(builder);
820 request_id = _generate_request_id();
821 ret = pkgmgr_client_connection_send_request(client, "mount_install",
822 g_variant_new("(uss@ass)", uid,
823 pkg_type ? pkg_type : "", pkg_path,
827 if (ret != PKGMGR_R_OK) {
828 ERR("request failed: %d", ret);
832 g_variant_get(result, "(i&s)", &ret, &req_key);
833 if (req_key == NULL) {
834 g_variant_unref(result);
835 return PKGMGR_R_ECOMM;
837 if (ret != PKGMGR_R_OK) {
838 g_variant_unref(result);
842 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
843 if (cb_info == NULL) {
844 g_variant_unref(result);
845 return PKGMGR_R_ENOMEM;
847 g_variant_unref(result);
848 ret = pkgmgr_client_connection_set_callback(client, cb_info);
849 if (ret != PKGMGR_R_OK) {
850 __free_cb_info(cb_info);
853 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
855 return cb_info->req_id;
858 API int pkgmgr_client_mount_install(pkgmgr_client *pc, const char *pkg_type,
859 const char *descriptor_path, const char *pkg_path,
860 const char *optional_data, pkgmgr_mode mode,
861 pkgmgr_handler event_cb, void *data)
863 return pkgmgr_client_usr_mount_install(pc, pkg_type, descriptor_path,
864 pkg_path, optional_data, mode, event_cb, data,
868 API int pkgmgr_client_usr_uninstall_packages(pkgmgr_client *pc,
869 const char **pkgids, int n_pkgs, pkgmgr_handler event_cb,
870 void *data, uid_t uid)
873 GVariantBuilder *pkgs_builder;
875 int ret = PKGMGR_R_ECOMM;
876 char *req_key = NULL;
877 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
878 struct cb_info *cb_info;
881 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
882 ERR("invalid parameter");
883 return PKGMGR_R_EINVAL;
886 if (client->pc_type != PC_REQUEST) {
887 ERR("client->pc_type is not PC_REQUEST");
888 return PKGMGR_R_EINVAL;
891 pkgs_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
892 for (i = 0; i < n_pkgs; i++)
893 g_variant_builder_add(pkgs_builder, "s", pkgids[i]);
894 pkgs = g_variant_new("as", pkgs_builder);
895 g_variant_builder_unref(pkgs_builder);
897 ret = pkgmgr_client_connection_send_request(client, "uninstall_pkgs",
898 g_variant_new("(u@as)", uid, pkgs), &result);
899 if (ret != PKGMGR_R_OK) {
900 ERR("request failed: %d", ret);
904 g_variant_get(result, "(i&s)", &ret, &req_key);
905 if (req_key == NULL) {
906 g_variant_unref(result);
907 return PKGMGR_R_ECOMM;
909 if (ret != PKGMGR_R_OK) {
910 g_variant_unref(result);
914 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
915 if (cb_info == NULL) {
916 g_variant_unref(result);
917 return PKGMGR_R_ENOMEM;
919 g_variant_unref(result);
920 ret = pkgmgr_client_connection_set_callback(client, cb_info);
921 if (ret != PKGMGR_R_OK) {
922 __free_cb_info(cb_info);
925 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
927 return cb_info->req_id;
930 API int pkgmgr_client_uninstall_packages(pkgmgr_client *pc,
931 const char **pkgids, int n_pkgs, pkgmgr_handler event_cb,
934 return pkgmgr_client_usr_uninstall_packages(pc, pkgids, n_pkgs,
935 event_cb, data, _getuid());
938 API int pkgmgr_client_uninstall(pkgmgr_client *pc, const char *pkg_type,
939 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
942 return pkgmgr_client_usr_uninstall(pc, pkg_type, pkgid, mode, event_cb,
946 API int pkgmgr_client_usr_uninstall(pkgmgr_client *pc, const char *pkg_type,
947 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
948 void *data, uid_t uid)
951 int ret = PKGMGR_R_ECOMM;
952 char *req_key = NULL;
953 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
954 struct cb_info *cb_info;
956 if (pc == NULL || pkgid == NULL) {
957 ERR("invalid parameter");
958 return PKGMGR_R_EINVAL;
961 if (client->pc_type != PC_REQUEST) {
962 ERR("client->pc_type is not PC_REQUEST");
963 return PKGMGR_R_EINVAL;
966 ret = pkgmgr_client_connection_send_request(client, "uninstall",
967 g_variant_new("(us)", uid, pkgid), &result);
968 if (ret != PKGMGR_R_OK) {
969 ERR("request failed: %d", ret);
973 g_variant_get(result, "(i&s)", &ret, &req_key);
974 if (req_key == NULL) {
975 g_variant_unref(result);
976 return PKGMGR_R_ECOMM;
978 if (ret != PKGMGR_R_OK) {
979 g_variant_unref(result);
983 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
984 if (cb_info == NULL) {
985 g_variant_unref(result);
986 return PKGMGR_R_ENOMEM;
988 g_variant_unref(result);
989 ret = pkgmgr_client_connection_set_callback(client, cb_info);
990 if (ret != PKGMGR_R_OK) {
991 __free_cb_info(cb_info);
994 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
996 return cb_info->req_id;
999 API int pkgmgr_client_move(pkgmgr_client *pc, const char *pkg_type,
1000 const char *pkgid, pkgmgr_move_type move_type,
1001 pkgmgr_handler event_cb, void *data)
1003 return pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type,
1004 event_cb, data, _getuid());
1006 API int pkgmgr_client_usr_move(pkgmgr_client *pc, const char *pkg_type,
1007 const char *pkgid, pkgmgr_move_type move_type,
1008 pkgmgr_handler event_cb, void *data, uid_t uid)
1011 int ret = PKGMGR_R_ECOMM;
1012 char *req_key = NULL;
1013 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1014 struct cb_info *cb_info;
1016 if (pc == NULL || pkgid == NULL) {
1017 ERR("invalid parameter");
1018 return PKGMGR_R_EINVAL;
1021 if ((move_type < PM_MOVE_TO_INTERNAL) ||
1022 (move_type > PM_MOVE_TO_EXTENDED))
1023 return PKGMGR_R_EINVAL;
1025 if (client->pc_type != PC_REQUEST) {
1026 ERR("client->pc_type is not PC_REQUEST");
1027 return PKGMGR_R_EINVAL;
1030 ret = pkgmgr_client_connection_send_request(client, "move",
1031 g_variant_new("(usi)", uid, pkgid, move_type), &result);
1032 if (ret != PKGMGR_R_OK) {
1033 ERR("request failed: %d", ret);
1037 g_variant_get(result, "(i&s)", &ret, &req_key);
1038 if (req_key == NULL) {
1039 g_variant_unref(result);
1040 return PKGMGR_R_ECOMM;
1042 if (ret != PKGMGR_R_OK) {
1043 g_variant_unref(result);
1047 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1048 if (cb_info == NULL) {
1049 g_variant_unref(result);
1050 return PKGMGR_R_ERROR;
1052 g_variant_unref(result);
1053 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1054 if (ret != PKGMGR_R_OK) {
1055 __free_cb_info(cb_info);
1058 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1060 return cb_info->req_id;
1063 API int pkgmgr_client_usr_register_pkg_update_info(pkgmgr_client *pc,
1064 pkg_update_info_t *update_info, uid_t uid)
1067 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1070 if (pc == NULL || update_info == NULL || update_info->pkgid == NULL) {
1071 ERR("invalid parameter");
1072 return PKGMGR_R_EINVAL;
1075 if (client->pc_type != PC_REQUEST) {
1076 ERR("client->pc_type is not PC_REQUEST");
1077 return PKGMGR_R_EINVAL;
1080 ret = pkgmgr_client_connection_send_request(client, "register_pkg_update_info",
1081 g_variant_new("(ussi)", uid, update_info->pkgid, update_info->version,
1082 update_info->type), &result);
1083 if (ret != PKGMGR_R_OK) {
1084 ERR("request failed: %d", ret);
1088 g_variant_get(result, "(i)", &ret);
1089 if (ret != PKGMGR_R_OK) {
1090 g_variant_unref(result);
1093 g_variant_unref(result);
1098 API int pkgmgr_client_register_pkg_update_info(pkgmgr_client *pc,
1099 pkg_update_info_t *update_info)
1101 return pkgmgr_client_usr_register_pkg_update_info(pc, update_info,
1105 API int pkgmgr_client_usr_unregister_pkg_update_info(pkgmgr_client *pc,
1106 const char *pkgid, uid_t uid)
1109 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1112 if (pc == NULL || pkgid == NULL) {
1113 ERR("invalid parameter");
1114 return PKGMGR_R_EINVAL;
1117 if (client->pc_type != PC_REQUEST) {
1118 ERR("client->pc_type is not PC_REQUEST");
1119 return PKGMGR_R_EINVAL;
1122 ret = pkgmgr_client_connection_send_request(client,
1123 "unregister_pkg_update_info",
1124 g_variant_new("(us)", uid, pkgid), &result);
1125 if (ret != PKGMGR_R_OK) {
1126 ERR("request failed: %d", ret);
1130 g_variant_get(result, "(i)", &ret);
1131 if (ret != PKGMGR_R_OK) {
1132 g_variant_unref(result);
1135 g_variant_unref(result);
1140 API int pkgmgr_client_unregister_pkg_update_info(pkgmgr_client *pc,
1143 return pkgmgr_client_usr_unregister_pkg_update_info(pc, pkgid, _getuid());
1146 API int pkgmgr_client_usr_unregister_all_pkg_update_info(pkgmgr_client *pc,
1150 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1154 ERR("invalid parameter");
1155 return PKGMGR_R_EINVAL;
1158 if (client->pc_type != PC_REQUEST) {
1159 ERR("client->pc_type is not PC_REQUEST");
1160 return PKGMGR_R_EINVAL;
1163 ret = pkgmgr_client_connection_send_request(client,
1164 "unregister_all_pkg_update_info",
1165 g_variant_new("(u)", uid), &result);
1166 if (ret != PKGMGR_R_OK) {
1167 ERR("request failed: %d", ret);
1171 g_variant_get(result, "(i)", &ret);
1172 if (ret != PKGMGR_R_OK) {
1173 g_variant_unref(result);
1176 g_variant_unref(result);
1181 API int pkgmgr_client_unregister_all_pkg_update_info(pkgmgr_client *pc)
1183 return pkgmgr_client_usr_unregister_all_pkg_update_info(pc, _getuid());
1186 API int pkgmgr_client_usr_activate(pkgmgr_client *pc, const char *pkg_type,
1187 const char *pkgid, uid_t uid)
1190 int ret = PKGMGR_R_ECOMM;
1191 GVariantBuilder *builder;
1192 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1194 if (pc == NULL || pkgid == NULL) {
1195 ERR("invalid parameter");
1196 return PKGMGR_R_EINVAL;
1199 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1200 g_variant_builder_add(builder, "s", pkgid);
1202 ret = pkgmgr_client_connection_send_request(client, "enable_pkgs",
1203 g_variant_new("(uas)", uid, builder), &result);
1204 g_variant_builder_unref(builder);
1205 if (ret != PKGMGR_R_OK) {
1206 ERR("request failed: %d", ret);
1210 g_variant_get(result, "(is)", &ret, NULL);
1211 g_variant_unref(result);
1216 API int pkgmgr_client_activate(pkgmgr_client *pc, const char *pkg_type,
1219 return pkgmgr_client_usr_activate(pc, pkg_type, pkgid, _getuid());
1222 API int pkgmgr_client_usr_activate_packages(pkgmgr_client *pc,
1223 const char *pkg_type, const char **pkgids, int n_pkgs,
1224 pkgmgr_handler event_cb, void *data, uid_t uid)
1227 GVariantBuilder *builder;
1228 int ret = PKGMGR_R_ECOMM;
1229 char *req_key = NULL;
1230 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1231 struct cb_info *cb_info;
1234 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
1235 ERR("invalid parameter");
1236 return PKGMGR_R_EINVAL;
1239 if (client->pc_type != PC_REQUEST) {
1240 ERR("client type is not PC_REQUEST");
1241 return PKGMGR_R_EINVAL;
1244 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1245 for (i = 0; i < n_pkgs; i++)
1246 g_variant_builder_add(builder, "s", pkgids[i]);
1248 ret = pkgmgr_client_connection_send_request(client, "enable_pkgs",
1249 g_variant_new("(uas)", uid, builder), &result);
1250 g_variant_builder_unref(builder);
1251 if (ret != PKGMGR_R_OK) {
1252 ERR("request failed: %d", ret);
1256 g_variant_get(result, "(i&s)", &ret, &req_key);
1257 if (req_key == NULL) {
1258 g_variant_unref(result);
1259 return PKGMGR_R_ECOMM;
1261 if (ret != PKGMGR_R_OK) {
1262 g_variant_unref(result);
1266 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1267 if (cb_info == NULL) {
1268 g_variant_unref(result);
1269 return PKGMGR_R_ERROR;
1271 g_variant_unref(result);
1272 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1273 if (ret != PKGMGR_R_OK) {
1274 __free_cb_info(cb_info);
1277 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1279 return cb_info->req_id;
1282 API int pkgmgr_client_activate_packages(pkgmgr_client *pc,
1283 const char *pkg_type, const char **pkgids, int n_pkgs,
1284 pkgmgr_handler event_cb, void *data)
1286 return pkgmgr_client_usr_activate_packages(pc, pkg_type,
1287 pkgids, n_pkgs, event_cb, data, _getuid());
1290 API int pkgmgr_client_usr_deactivate(pkgmgr_client *pc, const char *pkg_type,
1291 const char *pkgid, uid_t uid)
1294 GVariantBuilder *builder;
1295 int ret = PKGMGR_R_ECOMM;
1296 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1298 if (pc == NULL || pkgid == NULL) {
1299 ERR("invalid parameter");
1300 return PKGMGR_R_EINVAL;
1303 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1304 g_variant_builder_add(builder, "s", pkgid);
1306 ret = pkgmgr_client_connection_send_request(client, "disable_pkgs",
1307 g_variant_new("(uas)", uid, builder), &result);
1308 g_variant_builder_unref(builder);
1309 if (ret != PKGMGR_R_OK) {
1310 ERR("request failed: %d", ret);
1314 g_variant_get(result, "(is)", &ret, NULL);
1315 g_variant_unref(result);
1320 API int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type,
1323 return pkgmgr_client_usr_deactivate(pc, pkg_type, pkgid, _getuid());
1326 API int pkgmgr_client_usr_deactivate_packages(pkgmgr_client *pc,
1327 const char *pkg_type, const char **pkgids, int n_pkgs,
1328 pkgmgr_handler event_cb, void *data, uid_t uid)
1331 GVariantBuilder *builder;
1332 int ret = PKGMGR_R_ECOMM;
1333 char *req_key = NULL;
1334 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1335 struct cb_info *cb_info;
1338 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
1339 ERR("invalid parameter");
1340 return PKGMGR_R_EINVAL;
1343 if (client->pc_type != PC_REQUEST) {
1344 ERR("client type is not PC_REQUEST");
1345 return PKGMGR_R_EINVAL;
1348 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1349 for (i = 0; i < n_pkgs; i++)
1350 g_variant_builder_add(builder, "s", pkgids[i]);
1352 ret = pkgmgr_client_connection_send_request(client, "disable_pkgs",
1353 g_variant_new("(uas)", uid, builder), &result);
1354 g_variant_builder_unref(builder);
1355 if (ret != PKGMGR_R_OK) {
1356 ERR("request failed: %d", ret);
1360 g_variant_get(result, "(i&s)", &ret, &req_key);
1361 if (req_key == NULL) {
1362 g_variant_unref(result);
1363 return PKGMGR_R_ECOMM;
1365 if (ret != PKGMGR_R_OK) {
1366 g_variant_unref(result);
1370 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1371 if (cb_info == NULL) {
1372 g_variant_unref(result);
1373 return PKGMGR_R_ERROR;
1375 g_variant_unref(result);
1376 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1377 if (ret != PKGMGR_R_OK) {
1378 __free_cb_info(cb_info);
1381 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1383 return cb_info->req_id;
1386 API int pkgmgr_client_deactivate_packages(pkgmgr_client *pc,
1387 const char *pkg_type, const char **pkgids, int n_pkgs,
1388 pkgmgr_handler event_cb, void *data)
1390 return pkgmgr_client_usr_deactivate_packages(pc, pkg_type,
1391 pkgids, n_pkgs, event_cb, data, _getuid());
1394 API int pkgmgr_client_usr_activate_app(pkgmgr_client *pc, const char *appid,
1395 pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1398 int ret = PKGMGR_R_ECOMM;
1399 char *req_key = NULL;
1400 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1401 struct cb_info *cb_info;
1403 if (pc == NULL || appid == NULL) {
1404 ERR("invalid parameter");
1405 return PKGMGR_R_EINVAL;
1408 ret = pkgmgr_client_connection_send_request(client, "enable_app",
1409 g_variant_new("(us)", uid, appid), &result);
1410 if (ret != PKGMGR_R_OK) {
1411 ERR("request failed: %d", ret);
1415 g_variant_get(result, "(i&s)", &ret, &req_key);
1416 if (req_key == NULL) {
1417 g_variant_unref(result);
1418 return PKGMGR_R_ECOMM;
1420 if (ret != PKGMGR_R_OK) {
1421 g_variant_unref(result);
1425 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1427 if (cb_info == NULL) {
1428 g_variant_unref(result);
1429 return PKGMGR_R_ENOMEM;
1431 g_variant_unref(result);
1432 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1433 if (ret != PKGMGR_R_OK) {
1434 __free_cb_info(cb_info);
1437 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1439 return cb_info->req_id;
1442 API int pkgmgr_client_activate_app(pkgmgr_client *pc, const char *appid,
1443 pkgmgr_app_handler app_event_cb, void *data)
1445 return pkgmgr_client_usr_activate_app(pc, appid, app_event_cb,
1449 API int pkgmgr_client_usr_activate_apps(pkgmgr_client *pc, const char **appids,
1450 int n_apps, pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1453 GVariantBuilder *builder;
1454 int ret = PKGMGR_R_ECOMM;
1455 char *req_key = NULL;
1456 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1457 struct cb_info *cb_info;
1460 if (pc == NULL || appids == NULL || n_apps < 1) {
1461 ERR("invalid parameter");
1462 return PKGMGR_R_EINVAL;
1465 if (client->pc_type != PC_REQUEST) {
1466 ERR("client type is not PC_REQUEST");
1467 return PKGMGR_R_EINVAL;
1470 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1471 for (i = 0; i < n_apps; i++)
1472 g_variant_builder_add(builder, "s", appids[i]);
1474 ret = pkgmgr_client_connection_send_request(client, "enable_apps",
1475 g_variant_new("(uas)", uid, builder), &result);
1476 g_variant_builder_unref(builder);
1477 if (ret != PKGMGR_R_OK) {
1478 ERR("request failed: %d", ret);
1482 g_variant_get(result, "(i&s)", &ret, &req_key);
1483 if (req_key == NULL) {
1484 g_variant_unref(result);
1485 return PKGMGR_R_ECOMM;
1487 if (ret != PKGMGR_R_OK) {
1488 g_variant_unref(result);
1492 cb_info = __create_app_event_cb_info(client, app_event_cb, data, req_key);
1493 if (cb_info == NULL) {
1494 g_variant_unref(result);
1495 return PKGMGR_R_ERROR;
1497 g_variant_unref(result);
1498 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1499 if (ret != PKGMGR_R_OK) {
1500 __free_cb_info(cb_info);
1503 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1505 return cb_info->req_id;
1508 API int pkgmgr_client_activate_apps(pkgmgr_client *pc, const char **appids,
1509 int n_apps, pkgmgr_app_handler app_event_cb, void *data)
1511 return pkgmgr_client_usr_activate_apps(pc, appids, n_apps,
1512 app_event_cb, data, _getuid());
1515 API int pkgmgr_client_activate_global_app_for_uid(pkgmgr_client *pc,
1516 const char *appid, pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1519 int ret = PKGMGR_R_ECOMM;
1520 char *req_key = NULL;
1521 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1522 struct cb_info *cb_info;
1524 if (pc == NULL || appid == NULL) {
1525 ERR("invalid parameter");
1526 return PKGMGR_R_EINVAL;
1529 ret = pkgmgr_client_connection_send_request(client,
1530 "enable_global_app_for_uid",
1531 g_variant_new("(us)", uid, appid), &result);
1532 if (ret != PKGMGR_R_OK) {
1533 ERR("request failed: %d", ret);
1537 g_variant_get(result, "(i&s)", &ret, &req_key);
1538 if (req_key == NULL) {
1539 g_variant_unref(result);
1540 return PKGMGR_R_ECOMM;
1542 if (ret != PKGMGR_R_OK) {
1543 g_variant_unref(result);
1547 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1549 if (cb_info == NULL) {
1550 g_variant_unref(result);
1551 return PKGMGR_R_ENOMEM;
1553 g_variant_unref(result);
1554 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1555 if (ret != PKGMGR_R_OK) {
1556 __free_cb_info(cb_info);
1559 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1561 return cb_info->req_id;
1564 API int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid,
1565 pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1568 int ret = PKGMGR_R_ECOMM;
1569 char *req_key = NULL;
1570 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1571 struct cb_info *cb_info;
1573 if (pc == NULL || appid == NULL) {
1574 ERR("invalid parameter");
1575 return PKGMGR_R_EINVAL;
1578 ret = pkgmgr_client_connection_send_request(client, "disable_app",
1579 g_variant_new("(us)", uid, appid), &result);
1580 if (ret != PKGMGR_R_OK) {
1581 ERR("request failed: %d", ret);
1585 g_variant_get(result, "(i&s)", &ret, &req_key);
1586 if (req_key == NULL) {
1587 g_variant_unref(result);
1588 return PKGMGR_R_ECOMM;
1590 if (ret != PKGMGR_R_OK) {
1591 g_variant_unref(result);
1595 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1597 if (cb_info == NULL) {
1598 g_variant_unref(result);
1599 return PKGMGR_R_ENOMEM;
1601 g_variant_unref(result);
1602 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1603 if (ret != PKGMGR_R_OK) {
1604 __free_cb_info(cb_info);
1607 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1609 return cb_info->req_id;
1612 API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid,
1613 pkgmgr_app_handler app_event_cb, void *data)
1615 return pkgmgr_client_usr_deactivate_app(pc, appid, app_event_cb, data,
1619 API int pkgmgr_client_usr_deactivate_apps(pkgmgr_client *pc,
1620 const char **appids, int n_apps,
1621 pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1624 GVariantBuilder *builder;
1625 int ret = PKGMGR_R_ECOMM;
1626 char *req_key = NULL;
1627 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1628 struct cb_info *cb_info;
1631 if (pc == NULL || appids == NULL || n_apps < 1) {
1632 ERR("invalid parameter");
1633 return PKGMGR_R_EINVAL;
1636 if (client->pc_type != PC_REQUEST) {
1637 ERR("client type is not PC_REQUEST");
1638 return PKGMGR_R_EINVAL;
1641 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1642 for (i = 0; i < n_apps; i++)
1643 g_variant_builder_add(builder, "s", appids[i]);
1645 ret = pkgmgr_client_connection_send_request(client, "disable_apps",
1646 g_variant_new("(uas)", uid, builder), &result);
1647 g_variant_builder_unref(builder);
1648 if (ret != PKGMGR_R_OK) {
1649 ERR("request failed: %d", ret);
1653 g_variant_get(result, "(i&s)", &ret, &req_key);
1654 if (req_key == NULL) {
1655 g_variant_unref(result);
1656 return PKGMGR_R_ECOMM;
1658 if (ret != PKGMGR_R_OK) {
1659 g_variant_unref(result);
1663 cb_info = __create_app_event_cb_info(client, app_event_cb, data, req_key);
1664 if (cb_info == NULL) {
1665 g_variant_unref(result);
1666 return PKGMGR_R_ERROR;
1668 g_variant_unref(result);
1669 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1670 if (ret != PKGMGR_R_OK) {
1671 __free_cb_info(cb_info);
1674 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1676 return cb_info->req_id;
1679 API int pkgmgr_client_deactivate_apps(pkgmgr_client *pc, const char **appids,
1680 int n_apps, pkgmgr_app_handler app_event_cb, void *data)
1682 return pkgmgr_client_usr_deactivate_apps(pc, appids, n_apps,
1683 app_event_cb, data, _getuid());
1686 API int pkgmgr_client_deactivate_global_app_for_uid(pkgmgr_client *pc,
1687 const char *appid, pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1690 int ret = PKGMGR_R_ECOMM;
1691 char *req_key = NULL;
1692 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1693 struct cb_info *cb_info;
1695 if (pc == NULL || appid == NULL) {
1696 ERR("invalid parameter");
1697 return PKGMGR_R_EINVAL;
1700 ret = pkgmgr_client_connection_send_request(client,
1701 "disable_global_app_for_uid",
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&s)", &ret, &req_key);
1709 if (req_key == NULL) {
1710 g_variant_unref(result);
1711 return PKGMGR_R_ECOMM;
1713 if (ret != PKGMGR_R_OK) {
1714 g_variant_unref(result);
1718 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1720 if (cb_info == NULL) {
1721 g_variant_unref(result);
1722 return PKGMGR_R_ENOMEM;
1724 g_variant_unref(result);
1725 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1726 if (ret != PKGMGR_R_OK) {
1727 __free_cb_info(cb_info);
1730 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1732 return cb_info->req_id;
1735 API int pkgmgr_client_usr_clear_user_data(pkgmgr_client *pc,
1736 const char *pkg_type, const char *appid, pkgmgr_mode mode,
1741 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1743 if (pc == NULL || appid == NULL || uid == GLOBAL_USER) {
1744 ERR("invalid parameter");
1745 return PKGMGR_R_EINVAL;
1748 if (client->pc_type != PC_REQUEST) {
1749 ERR("client->pc_type is not PC_REQUEST");
1750 return PKGMGR_R_EINVAL;
1753 ret = pkgmgr_client_connection_send_request(client, "cleardata",
1754 g_variant_new("(us)", uid, appid), &result);
1755 if (ret != PKGMGR_R_OK) {
1756 ERR("request failed: %d", ret);
1760 g_variant_get(result, "(i)", &ret);
1761 g_variant_unref(result);
1766 API int pkgmgr_client_clear_user_data(pkgmgr_client *pc, const char *pkg_type,
1767 const char *appid, pkgmgr_mode mode)
1769 return pkgmgr_client_usr_clear_user_data(pc, pkg_type, appid, mode,
1773 API int pkgmgr_client_set_status_type(pkgmgr_client *pc, int status_type)
1775 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1778 ERR("invalid parameter");
1779 return PKGMGR_R_EINVAL;
1782 client->status_type = status_type;
1787 API int pkgmgr_client_listen_status(pkgmgr_client *pc, pkgmgr_handler event_cb,
1791 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1792 struct cb_info *cb_info;
1794 if (pc == NULL || event_cb == NULL) {
1795 ERR("invalid parameter");
1796 return PKGMGR_R_EINVAL;
1799 if (client->pc_type != PC_LISTENING) {
1800 ERR("client->pc_type is not PC_LISTENING");
1801 return PKGMGR_R_EINVAL;
1804 cb_info = __create_event_cb_info(client, event_cb, data, NULL);
1805 if (cb_info == NULL)
1806 return PKGMGR_R_ENOMEM;
1807 cb_info->status_type = client->status_type;
1808 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1809 if (ret != PKGMGR_R_OK) {
1810 __free_cb_info(cb_info);
1813 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1815 return cb_info->req_id;
1818 API int pkgmgr_client_listen_app_status(pkgmgr_client *pc,
1819 pkgmgr_app_handler app_event_cb, void *data)
1822 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1823 struct cb_info *cb_info;
1825 if (pc == NULL || app_event_cb == NULL) {
1826 ERR("invalid parameter");
1827 return PKGMGR_R_EINVAL;
1830 if (client->pc_type != PC_LISTENING) {
1831 ERR("client->pc_type is not PC_LISTENING");
1832 return PKGMGR_R_EINVAL;
1835 cb_info = __create_app_event_cb_info(client, app_event_cb, data, NULL);
1836 if (cb_info == NULL)
1837 return PKGMGR_R_ENOMEM;
1838 cb_info->status_type = client->status_type;
1839 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1840 if (ret != PKGMGR_R_OK) {
1841 __free_cb_info(cb_info);
1844 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1846 return cb_info->req_id;
1849 API int pkgmgr_client_remove_listen_status(pkgmgr_client *pc)
1851 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1854 struct cb_info *cb_info;
1857 ERR("invalid parameter");
1858 return PKGMGR_R_EINVAL;
1861 /* unset all callback */
1862 tmp = client->cb_info_list;
1863 while (tmp != NULL) {
1865 cb_info = (struct cb_info *)tmp->data;
1866 pkgmgr_client_connection_unset_callback(pc, cb_info);
1867 client->cb_info_list = g_list_delete_link(client->cb_info_list,
1869 __free_cb_info(cb_info);
1876 API int pkgmgr_client_broadcast_status(pkgmgr_client *pc, const char *pkg_type,
1877 const char *pkgid, const char *key, const char *val)
1879 /* client cannot broadcast signal */
1883 /* TODO: deprecate(or remove) */
1884 API int pkgmgr_client_request_service(pkgmgr_request_service_type service_type,
1885 int service_mode, pkgmgr_client *pc, const char *pkg_type,
1886 const char *pkgid, const char *custom_info,
1887 pkgmgr_handler event_cb, void *data)
1889 return pkgmgr_client_usr_request_service(service_type, service_mode,
1890 pc, pkg_type, pkgid, _getuid(), custom_info, event_cb,
1894 API int pkgmgr_client_usr_request_service(
1895 pkgmgr_request_service_type service_type, int service_mode,
1896 pkgmgr_client *pc, const char *pkg_type, const char *pkgid,
1897 uid_t uid, const char *custom_info, pkgmgr_handler event_cb,
1902 /* Check for NULL value of service type */
1903 retvm_if(service_type > PM_REQUEST_MAX, PKGMGR_R_EINVAL, "service type is not defined\n");
1904 retvm_if(service_type < 0, PKGMGR_R_EINVAL, "service type is error\n");
1906 switch (service_type) {
1907 case PM_REQUEST_MOVE:
1908 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1909 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1910 tryvm_if((service_mode < PM_MOVE_TO_INTERNAL) || (service_mode > PM_MOVE_TO_EXTENDED), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1912 ret = __move_pkg_process(pc, pkgid, pkg_type, uid, (pkgmgr_move_type)service_mode, event_cb, data);
1915 case PM_REQUEST_GET_SIZE:
1916 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1917 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1918 tryvm_if((service_mode < PM_GET_TOTAL_SIZE) || (service_mode >= PM_GET_MAX), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1920 ret = __get_size_process(pc, pkgid, uid, (pkgmgr_getsize_type)service_mode, event_cb, data);
1923 case PM_REQUEST_KILL_APP:
1924 case PM_REQUEST_CHECK_APP:
1925 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1926 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1928 ret = __check_app_process(service_type, pc, pkgid, uid, data);
1930 ERR("__check_app_process fail \n");
1937 ERR("Wrong Request\n");
1947 API int pkgmgr_client_usr_clear_cache_dir(const char *pkgid, uid_t uid)
1951 struct pkgmgr_client_t *client;
1953 if (pkgid == NULL || uid == GLOBAL_USER) {
1954 ERR("invalid parameter");
1955 return PKGMGR_R_EINVAL;
1958 client = pkgmgr_client_new(PC_REQUEST);
1959 if (client == NULL) {
1960 ERR("out of memory");
1961 return PKGMGR_R_ENOMEM;
1964 ret = pkgmgr_client_connection_send_request(client, "clearcache",
1965 g_variant_new("(us)", uid, pkgid), &result);
1966 if (ret != PKGMGR_R_OK) {
1967 ERR("request failed: %d", ret);
1968 pkgmgr_client_free(client);
1972 g_variant_get(result, "(i)", &ret);
1973 g_variant_unref(result);
1974 pkgmgr_client_free(client);
1979 API int pkgmgr_client_clear_cache_dir(const char *pkgid)
1981 return pkgmgr_client_usr_clear_cache_dir(pkgid, _getuid());
1984 API int pkgmgr_client_clear_usr_all_cache_dir(uid_t uid)
1986 return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, uid);
1989 API int pkgmgr_client_clear_all_cache_dir(void)
1991 return pkgmgr_client_usr_clear_cache_dir(
1992 PKG_CLEAR_ALL_CACHE, _getuid());
1995 API int pkgmgr_client_get_size(pkgmgr_client *pc, const char *pkgid,
1996 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
1999 return pkgmgr_client_usr_get_size(pc, pkgid, get_type, event_cb, data,
2003 /* TODO: deprecate(or remove) */
2004 API int pkgmgr_client_usr_get_size(pkgmgr_client *pc, const char *pkgid,
2005 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
2006 void *data, uid_t uid)
2009 int ret = PKGMGR_R_ECOMM;
2010 char *req_key = NULL;
2011 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2012 struct cb_info *cb_info;
2014 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
2015 ERR("invalid parameter");
2016 return PKGMGR_R_EINVAL;
2019 if (client->pc_type != PC_REQUEST) {
2020 ERR("client->pc_type is not PC_REQUEST");
2021 return PKGMGR_R_EINVAL;
2025 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
2026 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
2028 get_type = PM_GET_PKG_SIZE_INFO;
2030 ret = pkgmgr_client_connection_send_request(client, "getsize",
2031 g_variant_new("(usi)", uid, pkgid, get_type), &result);
2032 if (ret != PKGMGR_R_OK) {
2033 ERR("request failed: %d", ret);
2037 g_variant_get(result, "(i&s)", &ret, &req_key);
2038 if (req_key == NULL) {
2039 g_variant_unref(result);
2040 return PKGMGR_R_ECOMM;
2042 if (ret != PKGMGR_R_OK) {
2043 g_variant_unref(result);
2047 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
2048 if (cb_info == NULL) {
2049 g_variant_unref(result);
2050 return PKGMGR_R_ENOMEM;
2052 g_variant_unref(result);
2053 ret = pkgmgr_client_connection_set_callback(client, cb_info);
2054 if (ret != PKGMGR_R_OK) {
2055 __free_cb_info(cb_info);
2058 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
2063 API int pkgmgr_client_usr_get_package_size_info(pkgmgr_client *pc,
2064 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
2065 void *user_data, uid_t uid)
2068 int ret = PKGMGR_R_ECOMM;
2069 char *req_key = NULL;
2071 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2072 struct cb_info *cb_info;
2074 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
2075 ERR("invalid parameter");
2076 return PKGMGR_R_EINVAL;
2079 if (client->pc_type != PC_REQUEST) {
2080 ERR("client->pc_type is not PC_REQUEST");
2081 return PKGMGR_R_EINVAL;
2084 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
2085 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
2087 get_type = PM_GET_PKG_SIZE_INFO;
2089 ret = pkgmgr_client_connection_send_request(client, "getsize",
2090 g_variant_new("(usi)", uid, pkgid, get_type), &result);
2091 if (ret != PKGMGR_R_OK) {
2092 ERR("request failed: %d", ret);
2096 g_variant_get(result, "(i&s)", &ret, &req_key);
2097 if (req_key == NULL) {
2098 g_variant_unref(result);
2099 return PKGMGR_R_ECOMM;
2101 if (ret != PKGMGR_R_OK) {
2102 g_variant_unref(result);
2106 cb_info = __create_size_info_cb_info(client, event_cb, user_data,
2108 if (cb_info == NULL) {
2109 g_variant_unref(result);
2110 return PKGMGR_R_ENOMEM;
2112 g_variant_unref(result);
2113 ret = pkgmgr_client_connection_set_callback(client, cb_info);
2114 if (ret != PKGMGR_R_OK) {
2115 __free_cb_info(cb_info);
2118 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
2123 API int pkgmgr_client_get_package_size_info(pkgmgr_client *pc,
2124 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
2127 return pkgmgr_client_usr_get_package_size_info(pc, pkgid, event_cb,
2128 user_data, _getuid());
2131 API int pkgmgr_client_usr_get_total_package_size_info(pkgmgr_client *pc,
2132 pkgmgr_total_pkg_size_info_receive_cb event_cb,
2133 void *user_data, uid_t uid)
2134 { /* total package size info */
2135 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL,
2136 (pkgmgr_pkg_size_info_receive_cb)event_cb,
2140 API int pkgmgr_client_get_total_package_size_info(pkgmgr_client *pc,
2141 pkgmgr_total_pkg_size_info_receive_cb event_cb, void *user_data)
2143 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL,
2144 (pkgmgr_pkg_size_info_receive_cb)event_cb,
2145 user_data, _getuid());
2148 API int pkgmgr_client_generate_license_request(pkgmgr_client *pc,
2149 const char *resp_data, char **req_data, char **license_url)
2155 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2157 if (pc == NULL || resp_data == NULL || req_data == NULL ||
2158 license_url == NULL) {
2159 ERR("invalid parameter");
2160 return PKGMGR_R_EINVAL;
2163 if (client->pc_type != PC_REQUEST) {
2164 ERR("client->pc_type is not PC_REQUEST");
2165 return PKGMGR_R_EINVAL;
2168 ret = pkgmgr_client_connection_send_request(client,
2169 "generate_license_request",
2170 g_variant_new("(s)", resp_data), &result);
2171 if (ret != PKGMGR_R_OK) {
2172 ERR("request failed: %d", ret);
2176 g_variant_get(result, "(i&s&s)", &ret, &data, &url);
2177 if (ret != PKGMGR_R_OK) {
2178 ERR("generate_license_request failed: %d", ret);
2179 g_variant_unref(result);
2183 *req_data = strdup(data);
2184 *license_url = strdup(url);
2186 g_variant_unref(result);
2191 API int pkgmgr_client_register_license(pkgmgr_client *pc, const char *resp_data)
2195 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2197 if (pc == NULL || resp_data == NULL) {
2198 ERR("invalid parameter");
2199 return PKGMGR_R_EINVAL;
2202 if (client->pc_type != PC_REQUEST) {
2203 ERR("client->pc_type is not PC_REQUEST");
2204 return PKGMGR_R_EINVAL;
2207 ret = pkgmgr_client_connection_send_request(client, "register_license",
2208 g_variant_new("(s)", resp_data), &result);
2209 if (ret != PKGMGR_R_OK) {
2210 ERR("request failed: %d", ret);
2214 g_variant_get(result, "(i)", &ret);
2215 g_variant_unref(result);
2216 if (ret != PKGMGR_R_OK)
2217 ERR("register license failed: %d", ret);
2222 API int pkgmgr_client_decrypt_package(pkgmgr_client *pc,
2223 const char *drm_file_path, const char *decrypted_file_path)
2227 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2229 if (pc == NULL || drm_file_path == NULL ||
2230 decrypted_file_path == NULL) {
2231 ERR("invalid parameter");
2232 return PKGMGR_R_EINVAL;
2235 if (client->pc_type != PC_REQUEST) {
2236 ERR("client->pc_type is not PC_REQUEST");
2237 return PKGMGR_R_EINVAL;
2240 ret = pkgmgr_client_connection_send_request(client, "decrypt_package",
2241 g_variant_new("(ss)", drm_file_path,
2242 decrypted_file_path), &result);
2243 if (ret != PKGMGR_R_OK) {
2244 ERR("request failed: %d", ret);
2248 g_variant_get(result, "(i)", &ret);
2249 g_variant_unref(result);
2250 if (ret != PKGMGR_R_OK)
2251 ERR("decrypt_package failed: %d", ret);
2256 API int pkgmgr_client_enable_splash_screen(pkgmgr_client *pc, const char *appid)
2258 return pkgmgr_client_usr_enable_splash_screen(pc, appid, _getuid());
2261 API int pkgmgr_client_usr_enable_splash_screen(pkgmgr_client *pc,
2262 const char *appid, uid_t uid)
2266 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2268 if (pc == NULL || appid == NULL) {
2269 ERR("Invalid parameter");
2270 return PKGMGR_R_EINVAL;
2273 ret = pkgmgr_client_connection_send_request(client,
2274 "enable_app_splash_screen",
2275 g_variant_new("(us)", uid, appid), &result);
2276 if (ret != PKGMGR_R_OK) {
2277 ERR("request failed: %d", ret);
2281 g_variant_get(result, "(i)", &ret);
2282 g_variant_unref(result);
2283 if (ret != PKGMGR_R_OK)
2284 ERR("enable splash screen failed: %d", ret);
2289 API int pkgmgr_client_disable_splash_screen(pkgmgr_client *pc,
2292 return pkgmgr_client_usr_disable_splash_screen(pc, appid,
2296 API int pkgmgr_client_usr_disable_splash_screen(pkgmgr_client *pc,
2297 const char *appid, uid_t uid)
2301 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2303 if (pc == NULL || appid == NULL) {
2304 ERR("Invalid parameter");
2305 return PKGMGR_R_EINVAL;
2308 ret = pkgmgr_client_connection_send_request(client,
2309 "disable_app_splash_screen",
2310 g_variant_new("(us)", uid, appid), &result);
2311 if (ret != PKGMGR_R_OK) {
2312 ERR("request failed: %d", ret);
2316 g_variant_get(result, "(i)", &ret);
2317 g_variant_unref(result);
2318 if (ret != PKGMGR_R_OK)
2319 ERR("disable splash screen failed: %d", ret);
2324 static int __set_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
2325 int mode, uid_t uid)
2328 int ret = PKGMGR_R_ECOMM;
2329 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2331 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
2332 ERR("invalid parameter");
2333 return PKGMGR_R_EINVAL;
2336 ret = pkgmgr_client_connection_send_request(client,
2337 "set_restriction_mode",
2338 g_variant_new("(usi)", uid, pkgid, mode), &result);
2339 if (ret != PKGMGR_R_OK) {
2340 ERR("request failed: %d", ret);
2344 g_variant_get(result, "(i)", &ret);
2345 g_variant_unref(result);
2350 API int pkgmgr_client_usr_set_pkg_restriction_mode(pkgmgr_client *pc,
2351 const char *pkgid, int mode, uid_t uid)
2353 return __set_pkg_restriction_mode(pc, pkgid, mode, uid);
2356 API int pkgmgr_client_set_pkg_restriction_mode(pkgmgr_client *pc,
2357 const char *pkgid, int mode)
2359 return pkgmgr_client_usr_set_pkg_restriction_mode(pc, pkgid, mode,
2363 static int __unset_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
2364 int mode, uid_t uid)
2367 int ret = PKGMGR_R_ECOMM;
2368 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2370 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
2371 ERR("invalid parameter");
2372 return PKGMGR_R_EINVAL;
2375 ret = pkgmgr_client_connection_send_request(client,
2376 "unset_restriction_mode",
2377 g_variant_new("(usi)", uid, pkgid, mode), &result);
2378 if (ret != PKGMGR_R_OK) {
2379 ERR("request failed: %d", ret);
2383 g_variant_get(result, "(i)", &ret);
2384 g_variant_unref(result);
2390 API int pkgmgr_client_usr_unset_pkg_restriction_mode(pkgmgr_client *pc,
2391 const char *pkgid, int mode, uid_t uid)
2393 return __unset_pkg_restriction_mode(pc, pkgid, mode, uid);
2396 API int pkgmgr_client_unset_pkg_restriction_mode(pkgmgr_client *pc,
2397 const char *pkgid, int mode)
2399 return pkgmgr_client_usr_unset_pkg_restriction_mode(pc, pkgid, mode,
2403 static int __get_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
2404 int *mode, uid_t uid)
2407 int ret = PKGMGR_R_ECOMM;
2409 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2411 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0) {
2412 ERR("invalid parameter");
2413 return PKGMGR_R_EINVAL;
2416 ret = pkgmgr_client_connection_send_request(client,
2417 "get_restriction_mode",
2418 g_variant_new("(us)", uid, pkgid), &result);
2419 if (ret != PKGMGR_R_OK) {
2420 ERR("request failed: %d", ret);
2424 g_variant_get(result, "(ii)", &m, &ret);
2425 g_variant_unref(result);
2426 if (ret != PKGMGR_R_OK)
2434 API int pkgmgr_client_usr_get_pkg_restriction_mode(pkgmgr_client *pc,
2435 const char *pkgid, int *mode, uid_t uid)
2437 return __get_pkg_restriction_mode(pc, pkgid, mode, uid);
2440 API int pkgmgr_client_get_pkg_restriction_mode(pkgmgr_client *pc,
2441 const char *pkgid, int *mode)
2443 return pkgmgr_client_usr_get_pkg_restriction_mode(pc, pkgid, mode,
2447 API int pkgmgr_client_usr_set_restriction_mode(pkgmgr_client *pc, int mode,
2451 int ret = PKGMGR_R_ECOMM;
2452 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2455 ERR("invalid parameter");
2456 return PKGMGR_R_EINVAL;
2459 ret = pkgmgr_client_connection_send_request(client,
2460 "set_restriction_mode",
2461 g_variant_new("(usi)", uid, "", mode), &result);
2462 if (ret != PKGMGR_R_OK) {
2463 ERR("request failed: %d", ret);
2467 g_variant_get(result, "(i)", &ret);
2468 g_variant_unref(result);
2473 API int pkgmgr_client_set_restriction_mode(pkgmgr_client *pc, int mode)
2475 return pkgmgr_client_usr_set_restriction_mode(pc, mode, _getuid());
2478 API int pkgmgr_client_usr_unset_restriction_mode(pkgmgr_client *pc, int mode,
2482 int ret = PKGMGR_R_ECOMM;
2483 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2486 ERR("invalid parameter");
2487 return PKGMGR_R_EINVAL;
2490 ret = pkgmgr_client_connection_send_request(client,
2491 "unset_restriction_mode",
2492 g_variant_new("(usi)", uid, "", mode), &result);
2493 if (ret != PKGMGR_R_OK) {
2494 ERR("request failed: %d", ret);
2498 g_variant_get(result, "(i)", &ret);
2499 g_variant_unref(result);
2504 API int pkgmgr_client_unset_restriction_mode(pkgmgr_client *pc, int mode)
2506 return pkgmgr_client_usr_unset_restriction_mode(pc, mode, _getuid());
2509 API int pkgmgr_client_usr_get_restriction_mode(pkgmgr_client *pc,
2510 int *mode, uid_t uid)
2513 int ret = PKGMGR_R_ECOMM;
2515 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2518 ERR("invalid parameter");
2519 return PKGMGR_R_EINVAL;
2522 ret = pkgmgr_client_connection_send_request(client,
2523 "get_restriction_mode",
2524 g_variant_new("(us)", uid, ""), &result);
2525 if (ret != PKGMGR_R_OK) {
2526 ERR("request failed: %d", ret);
2530 g_variant_get(result, "(ii)", &m, &ret);
2531 g_variant_unref(result);
2532 if (ret != PKGMGR_R_OK)
2540 API int pkgmgr_client_get_restriction_mode(pkgmgr_client *pc, int *mode)
2542 return pkgmgr_client_usr_get_restriction_mode(pc, mode, _getuid());
2545 API pkgmgr_info *pkgmgr_client_check_pkginfo_from_file(const char *pkg_path)
2548 pkg_plugin_set *plugin_set;
2549 package_manager_pkg_detail_info_t *info;
2552 if (pkg_path == NULL) {
2553 ERR("invalid parameter");
2557 pkg_type = __get_type_from_path(pkg_path);
2558 if (pkg_type == NULL) {
2559 ERR("cannot get pkg type");
2563 plugin_set = _package_manager_load_library(pkg_type);
2564 if (plugin_set == NULL) {
2565 ERR("failed to load library for %s", pkg_type);
2570 info = calloc(1, sizeof(package_manager_pkg_detail_info_t));
2572 ERR("out of memory");
2577 ret = plugin_set->get_pkg_detail_info_from_package(pkg_path, info);
2579 ERR("get_pkg_detail_info_from_package failed");
2587 return (pkgmgr_info *)info;
2590 API int pkgmgr_client_free_pkginfo(pkgmgr_info *info)
2592 package_manager_pkg_detail_info_t *pkg_info =
2593 (package_manager_pkg_detail_info_t *)info;
2596 ERR("invalid parameter");
2597 return PKGMGR_R_EINVAL;
2600 g_list_free_full(pkg_info->privilege_list, free);
2601 free(pkg_info->icon_buf);
2607 API int pkgmgr_client_usr_set_app_label(pkgmgr_client *pc, char *appid,
2608 char *label, uid_t uid)
2612 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2614 if (pc == NULL || appid == NULL || label == NULL) {
2615 ERR("Invalid parameter");
2616 return PKGMGR_R_EINVAL;
2619 ret = pkgmgr_client_connection_send_request(client,
2621 g_variant_new("(uss)", uid, appid, label), &result);
2622 if (ret != PKGMGR_R_OK) {
2623 ERR("Request failed: %d", ret);
2627 g_variant_get(result, "(i)", &ret);
2628 g_variant_unref(result);
2633 API int pkgmgr_client_set_app_label(pkgmgr_client *pc, char *appid, char *label)
2635 return pkgmgr_client_usr_set_app_label(pc, appid, label, _getuid());
2638 API int pkgmgr_client_usr_set_app_icon(pkgmgr_client *pc, char *appid,
2639 char *icon_path, uid_t uid)
2643 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2645 if (pc == NULL || appid == NULL || icon_path == NULL) {
2646 ERR("Invalid parameter");
2647 return PKGMGR_R_EINVAL;
2650 if (access(icon_path, F_OK) != 0) {
2651 ERR("failed to access: %s", icon_path);
2652 return PKGMGR_R_EINVAL;
2655 ret = pkgmgr_client_connection_send_request(client,
2657 g_variant_new("(uss)", uid, appid, icon_path), &result);
2658 if (ret != PKGMGR_R_OK) {
2659 ERR("Request failed: %d", ret);
2663 g_variant_get(result, "(i)", &ret);
2664 g_variant_unref(result);
2669 API int pkgmgr_client_set_app_icon(pkgmgr_client *pc, char *appid, char *icon_path)
2671 return pkgmgr_client_usr_set_app_icon(pc, appid, icon_path, _getuid());
2674 API int pkgmgr_client_set_debug_mode(pkgmgr_client *pc, bool debug_mode)
2676 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2679 ERR("invalid parameter");
2680 return PKGMGR_R_EINVAL;
2683 client->debug_mode = debug_mode;
2688 API int pkgmgr_client_set_skip_optimization(pkgmgr_client *pc, bool skip_optimization)
2690 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2693 ERR("invalid parameter");
2694 return PKGMGR_R_EINVAL;
2697 client->skip_optimization = skip_optimization;
2702 API int pkgmgr_client_usr_migrate_external_image(pkgmgr_client *pc,
2703 const char *pkgid, uid_t uid)
2706 int ret = PKGMGR_R_ECOMM;
2707 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2710 ERR("invalid parameter");
2711 return PKGMGR_R_EINVAL;
2714 ret = pkgmgr_client_connection_send_request(client,
2715 "migrate_external_image",
2716 g_variant_new("(us)", uid, pkgid), &result);
2717 if (ret != PKGMGR_R_OK) {
2718 ERR("request failed: %d", ret);
2722 g_variant_get(result, "(i)", &ret);
2723 g_variant_unref(result);