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 "package-manager-types.h"
44 #include "pkgmgr_client_debug.h"
45 #include "pkgmgr_client_internal.h"
47 /* API export macro */
49 #define API __attribute__ ((visibility("default")))
52 #define BINSH_NAME "/bin/sh"
55 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
56 #define REGULAR_USER 5000
58 static GList *jobs_to_free;
59 static pthread_mutex_t __mutex = PTHREAD_MUTEX_INITIALIZER;
61 static inline uid_t _getuid(void)
65 if (uid < REGULAR_USER)
71 static int _get_internal_request_id()
73 static int internal_req_id = 1;
75 return internal_req_id++;
78 static char *_generate_request_id(void)
84 gettimeofday(&tv, NULL);
85 curtime = tv.tv_sec * 1000000 + tv.tv_usec;
87 snprintf(buf, sizeof(buf), "%d_%ld", getpid(), curtime);
92 static struct cb_info *__create_event_cb_info(struct pkgmgr_client_t *client,
93 pkgmgr_handler event_cb, void *data, const char *req_key)
95 struct cb_info *cb_info;
97 cb_info = calloc(1, sizeof(struct cb_info));
98 if (cb_info == NULL) {
102 cb_info->client = client;
103 cb_info->event_cb = event_cb;
104 cb_info->data = data;
105 cb_info->req_id = _get_internal_request_id();
106 if (req_key != NULL) {
107 cb_info->req_key = strdup(req_key);
108 if (cb_info->req_key == NULL) {
109 ERR("out of memory");
118 static struct cb_info *__create_app_event_cb_info(
119 struct pkgmgr_client_t *client, pkgmgr_app_handler app_event_cb,
120 void *data, const char *req_key)
122 struct cb_info *cb_info;
124 cb_info = calloc(1, sizeof(struct cb_info));
125 if (cb_info == NULL) {
126 ERR("out of memory");
129 cb_info->client = client;
130 cb_info->app_event_cb = app_event_cb;
131 cb_info->data = data;
132 cb_info->req_id = _get_internal_request_id();
133 if (req_key != NULL) {
134 cb_info->req_key = strdup(req_key);
135 if (cb_info->req_key == NULL) {
136 ERR("out of memory");
145 static struct cb_info *__create_res_copy_event_cb_info(
146 struct pkgmgr_client_t *client,
147 pkgmgr_res_copy_handler res_copy_event_cb,
148 void *data, const char *req_key)
150 struct cb_info *cb_info;
152 cb_info = calloc(1, sizeof(struct cb_info));
153 if (cb_info == NULL) {
154 ERR("out of memory");
158 cb_info->client = client;
159 cb_info->res_copy_event_cb = res_copy_event_cb;
160 cb_info->data = data;
161 cb_info->req_id = _get_internal_request_id();
165 cb_info->req_key = strdup(req_key);
166 if (cb_info->req_key == NULL) {
167 ERR("out of memory");
175 static struct cb_info *__create_size_info_cb_info(
176 struct pkgmgr_client_t *client,
177 pkgmgr_pkg_size_info_receive_cb size_info_cb,
178 void *data, const char *req_key)
180 struct cb_info *cb_info;
182 cb_info = calloc(1, sizeof(struct cb_info));
183 if (cb_info == NULL) {
184 ERR("out of memory");
187 cb_info->client = client;
188 cb_info->size_info_cb = size_info_cb;
189 cb_info->data = data;
190 cb_info->req_id = _get_internal_request_id();
191 if (req_key != NULL) {
192 cb_info->req_key = strdup(req_key);
193 if (cb_info->req_key == NULL) {
194 ERR("out of memory");
203 static int __jobs_to_free_add(gpointer data)
205 pthread_mutex_lock(&__mutex);
206 if (g_list_find(jobs_to_free, data)) {
207 pthread_mutex_unlock(&__mutex);
211 jobs_to_free = g_list_append(jobs_to_free, data);
212 pthread_mutex_unlock(&__mutex);
216 static void __jobs_to_free_remove(gpointer data)
218 pthread_mutex_lock(&__mutex);
219 jobs_to_free = g_list_remove(jobs_to_free, data);
220 pthread_mutex_unlock(&__mutex);
223 static void __do_free_cb_info(gpointer data)
225 struct cb_info *cb_info = (struct cb_info *)data;
227 g_list_free(cb_info->sid_list);
228 free(cb_info->req_key);
232 static void __free_cb_info_cb(gpointer data)
234 g_idle_remove_by_data(data);
235 __do_free_cb_info(data);
238 __attribute__((destructor)) static void __free_cb_info_at_destructor(void)
240 pthread_mutex_lock(&__mutex);
241 g_list_free_full(jobs_to_free, __free_cb_info_cb);
242 pthread_mutex_unlock(&__mutex);
245 static gboolean __free_cb_info_at_idle(gpointer data)
247 __jobs_to_free_remove(data);
248 __do_free_cb_info(data);
250 return G_SOURCE_REMOVE;
253 static void __free_cb_info(struct cb_info *cb_info)
255 if (__jobs_to_free_add(cb_info) < 0)
258 g_idle_add(__free_cb_info_at_idle, cb_info);
261 static int __get_size_process(pkgmgr_client *pc, const char *pkgid, uid_t uid,
262 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
266 int ret = PKGMGR_R_ECOMM;
267 long long size_info = 0;
268 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
270 if (pc == NULL || pkgid == NULL) {
271 ERR("invalid parameter");
272 return PKGMGR_R_EINVAL;
275 if (client->pc_type != PC_REQUEST) {
276 ERR("client->pc_type is not PC_REQUEST");
277 return PKGMGR_R_EINVAL;
280 ret = pkgmgr_client_connection_send_request(client, "getsize_sync",
281 g_variant_new("(usi)", uid, pkgid, get_type), &result);
282 if (ret != PKGMGR_R_OK) {
283 ERR("request failed: %d", ret);
287 g_variant_get(result, "(ix)", &ret, &size_info);
288 if (ret != PKGMGR_R_OK) {
289 ERR("request result failed: %d", ret);
290 g_variant_unref(result);
295 ERR("invalid size_info=(%lld)", size_info);
298 ret = (int)size_info;
299 DBG("size_info(%lld), return size(%d)", size_info, ret);
302 g_variant_unref(result);
307 static int __move_pkg_process(pkgmgr_client *pc, const char *pkgid,
308 const char *pkg_type, uid_t uid, pkgmgr_move_type move_type,
309 pkgmgr_handler event_cb, void *data)
313 ret = pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type, event_cb, data, uid);
315 ERR("move request failed");
322 static int __check_app_process(pkgmgr_request_service_type service_type,
323 pkgmgr_client *pc, const char *pkgid, uid_t uid, void *data)
326 int ret = PKGMGR_R_ECOMM;
327 pkgmgrinfo_pkginfo_h handle;
329 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
331 retvm_if(client->pc_type != PC_REQUEST, PKGMGR_R_EINVAL, "client->pc_type is not PC_REQUEST\n");
333 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
334 if (ret != PMINFO_R_OK) {
335 ERR("pkgmgrinfo_pkginfo_get_pkginfo failed");
336 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
337 return PKGMGR_R_ERROR;
340 if (service_type == PM_REQUEST_KILL_APP) {
341 ret = pkgmgr_client_connection_send_request(client, "kill",
342 g_variant_new("(us)", uid, pkgid), &result);
343 } else if (service_type == PM_REQUEST_CHECK_APP) {
344 ret = pkgmgr_client_connection_send_request(client, "check",
345 g_variant_new("(us)", uid, pkgid), &result);
347 ERR("unexpected service type: %d", service_type);
348 ret = PKGMGR_R_ERROR;
351 if (ret != PKGMGR_R_OK) {
352 ERR("request failed: %d", ret);
353 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
357 g_variant_get(result, "(ii)", &ret, &pid);
358 g_variant_unref(result);
359 if (ret != PKGMGR_R_OK) {
360 ERR("request failed, ret=%d", ret);
361 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
367 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
373 API pkgmgr_client *pkgmgr_client_new(pkgmgr_client_type pc_type)
375 struct pkgmgr_client_t *client;
377 if (pc_type == PC_BROADCAST) {
378 ERR("broadcast type is not supported");
382 if (pc_type != PC_REQUEST && pc_type != PC_LISTENING) {
383 ERR("invalid parameter");
387 client = calloc(1, sizeof(struct pkgmgr_client_t));
388 if (client == NULL) {
389 ERR("out of memory");
393 client->pc_type = pc_type;
394 client->status_type = PKGMGR_CLIENT_STATUS_ALL;
396 if (pkgmgr_client_connection_connect(client) != PKGMGR_R_OK) {
401 return (pkgmgr_client *)client;
404 API int pkgmgr_client_free(pkgmgr_client *pc)
406 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
409 ERR("invalid argument");
410 return PKGMGR_R_EINVAL;
413 pkgmgr_client_remove_listen_status(client);
414 pkgmgr_client_connection_disconnect(client);
415 if (client->tep_path)
416 free(client->tep_path);
417 if (client->res_copy_builder)
418 g_variant_builder_unref(client->res_copy_builder);
419 if (client->res_remove_builder)
420 g_variant_builder_unref(client->res_remove_builder);
426 struct manifest_and_type type_map[] = {
427 { "res/wgt/config.xml", "wgt" },
428 { "config.xml", "wgt" },
429 { "tizen-manifest.xml", "tpk" },
433 static char *__get_type_from_path(const char *pkg_path)
435 const char *type = NULL;
439 uf = unzOpen(pkg_path);
441 ERR("failed to open zip file %s", pkg_path);
445 for (i = 0; type_map[i].manifest != NULL; i++) {
446 if (unzLocateFile(uf, type_map[i].manifest, 0) == UNZ_OK) {
447 DBG("pkgtype of %s: [%s]", pkg_path, type_map[i].type);
448 type = type_map[i].type;
454 return type ? strdup(type) : NULL;
457 API int pkgmgr_client_set_tep_path(pkgmgr_client *pc, const char *tep_path,
460 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *) pc;
462 if (pc == NULL || tep_path == NULL) {
463 ERR("invalied parameter");
464 return PKGMGR_R_EINVAL;
467 if (client->tep_path)
468 free(client->tep_path);
470 client->tep_path = strdup(tep_path);
471 client->tep_move = tep_move;
476 API int pkgmgr_client_usr_install_packages(pkgmgr_client *pc,
477 const char **pkg_paths, int n_pkgs, pkgmgr_handler event_cb,
478 void *data, uid_t uid)
481 GVariantBuilder *pkgs_builder;
483 GVariantBuilder *args_builder;
486 char *req_key = NULL;
487 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
488 struct cb_info *cb_info;
490 char *request_id = NULL;
492 if (pc == NULL || pkg_paths == NULL || n_pkgs < 1) {
493 ERR("invalid parameter");
494 return PKGMGR_R_EINVAL;
497 if (client->pc_type != PC_REQUEST) {
498 ERR("client type is not PC_REQUEST");
499 return PKGMGR_R_EINVAL;
502 for (i = 0; i < n_pkgs; i++) {
503 if (access(pkg_paths[i], F_OK) != 0) {
504 ERR("failed to access: %s", pkg_paths[i]);
505 return PKGMGR_R_EINVAL;
509 pkgs_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
510 for (i = 0; i < n_pkgs; i++)
511 g_variant_builder_add(pkgs_builder, "s", pkg_paths[i]);
512 pkgs = g_variant_new("as", pkgs_builder);
513 g_variant_builder_unref(pkgs_builder);
515 args_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
516 if (client->debug_mode)
517 g_variant_builder_add(args_builder, "s", "-G");
518 if (client->skip_optimization)
519 g_variant_builder_add(args_builder, "s", "-S");
520 args = g_variant_new("as", args_builder);
521 g_variant_builder_unref(args_builder);
523 request_id = _generate_request_id();
524 ret = pkgmgr_client_connection_send_request(client, "install_pkgs",
525 g_variant_new("(u@as@ass)", uid, pkgs, args,
529 if (ret != PKGMGR_R_OK) {
530 ERR("request failed: %d", ret);
534 g_variant_get(result, "(i&s)", &ret, &req_key);
535 if (req_key == NULL) {
536 g_variant_unref(result);
537 return PKGMGR_R_ECOMM;
539 if (ret != PKGMGR_R_OK) {
540 g_variant_unref(result);
544 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
545 if (cb_info == NULL) {
546 g_variant_unref(result);
547 return PKGMGR_R_ERROR;
549 g_variant_unref(result);
550 ret = pkgmgr_client_connection_set_callback(client, cb_info);
551 if (ret != PKGMGR_R_OK) {
552 __free_cb_info(cb_info);
555 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
557 return cb_info->req_id;
560 API int pkgmgr_client_install_packages(pkgmgr_client *pc,
561 const char **pkg_paths, int n_pkgs, pkgmgr_handler event_cb,
564 return pkgmgr_client_usr_install_packages(pc, pkg_paths, n_pkgs,
565 event_cb, data, _getuid());
568 API int pkgmgr_client_usr_install(pkgmgr_client *pc, const char *pkg_type,
569 const char *descriptor_path, const char *pkg_path,
570 const char *optional_data, pkgmgr_mode mode,
571 pkgmgr_handler event_cb, void *data, uid_t uid)
574 int ret = PKGMGR_R_ECOMM;
575 char *req_key = NULL;
576 GVariantBuilder *builder = NULL;
577 GVariant *args = NULL;
578 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
579 struct cb_info *cb_info;
580 char *request_id = NULL;
582 if (pc == NULL || pkg_path == NULL) {
583 ERR("invalid parameter");
584 return PKGMGR_R_EINVAL;
587 if (client->pc_type != PC_REQUEST) {
588 ERR("client type is not PC_REQUEST");
589 return PKGMGR_R_EINVAL;
592 if (access(pkg_path, F_OK) != 0) {
593 ERR("failed to access: %s", pkg_path);
594 return PKGMGR_R_EINVAL;
597 if (client->tep_path != NULL && access(client->tep_path, F_OK) != 0) {
598 ERR("failed to access: %s", client->tep_path);
599 return PKGMGR_R_EINVAL;
602 /* build arguments */
603 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
604 if (client->tep_path) {
605 g_variant_builder_add(builder, "s", "-e");
606 g_variant_builder_add(builder, "s", client->tep_path);
607 g_variant_builder_add(builder, "s", "-M");
608 /* TODO: revise tep_move */
609 g_variant_builder_add(builder, "s",
610 client->tep_move ? "tep_move" : "tep_copy");
612 if (client->debug_mode)
613 g_variant_builder_add(builder, "s", "-G");
614 if (client->skip_optimization)
615 g_variant_builder_add(builder, "s", "-S");
617 args = g_variant_new("as", builder);
618 g_variant_builder_unref(builder);
620 request_id = _generate_request_id();
621 ret = pkgmgr_client_connection_send_request(client, "install",
622 g_variant_new("(uss@ass)", uid, pkg_type ? pkg_type : "",
623 pkg_path, args, request_id),
626 if (ret != PKGMGR_R_OK) {
627 ERR("request failed: %d", ret);
631 g_variant_get(result, "(i&s)", &ret, &req_key);
632 if (req_key == NULL) {
633 g_variant_unref(result);
634 return PKGMGR_R_ECOMM;
636 if (ret != PKGMGR_R_OK) {
637 g_variant_unref(result);
641 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
642 if (cb_info == NULL) {
643 g_variant_unref(result);
644 return PKGMGR_R_ENOMEM;
646 g_variant_unref(result);
647 ret = pkgmgr_client_connection_set_callback(client, cb_info);
648 if (ret != PKGMGR_R_OK) {
649 __free_cb_info(cb_info);
652 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
653 return cb_info->req_id;
656 API int pkgmgr_client_install(pkgmgr_client *pc, const char *pkg_type,
657 const char *descriptor_path, const char *pkg_path,
658 const char *optional_data, pkgmgr_mode mode,
659 pkgmgr_handler event_cb, void *data)
661 return pkgmgr_client_usr_install(pc, pkg_type, descriptor_path,
662 pkg_path, optional_data, mode, event_cb, data,
666 API int pkgmgr_client_reinstall(pkgmgr_client *pc, const char *pkg_type,
667 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
668 pkgmgr_handler event_cb, void *data)
670 return pkgmgr_client_usr_reinstall(pc, pkg_type, pkgid, optional_data,
671 mode, event_cb, data, _getuid());
674 API int pkgmgr_client_usr_reinstall(pkgmgr_client *pc, const char *pkg_type,
675 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
676 pkgmgr_handler event_cb, void *data, uid_t uid)
679 int ret = PKGMGR_R_ECOMM;
680 char *req_key = NULL;
681 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
682 struct cb_info *cb_info;
684 if (pc == NULL || pkgid == NULL) {
685 ERR("invalid parameter");
686 return PKGMGR_R_EINVAL;
689 if (client->pc_type != PC_REQUEST) {
690 ERR("client->pc_type is not PC_REQUEST");
691 return PKGMGR_R_EINVAL;
694 ret = pkgmgr_client_connection_send_request(client, "reinstall",
695 g_variant_new("(us)", uid, pkgid), &result);
696 if (ret != PKGMGR_R_OK) {
697 ERR("request failed: %d", ret);
701 g_variant_get(result, "(i&s)", &ret, &req_key);
702 if (req_key == NULL) {
703 g_variant_unref(result);
704 return PKGMGR_R_ECOMM;
706 if (ret != PKGMGR_R_OK) {
707 g_variant_unref(result);
711 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
712 if (cb_info == NULL) {
713 g_variant_unref(result);
714 return PKGMGR_R_ENOMEM;
716 g_variant_unref(result);
717 ret = pkgmgr_client_connection_set_callback(client, cb_info);
718 if (ret != PKGMGR_R_OK) {
719 __free_cb_info(cb_info);
722 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
724 return cb_info->req_id;
727 API int pkgmgr_client_usr_mount_install_packages(pkgmgr_client *pc,
728 const char **pkg_paths, int n_pkgs, pkgmgr_handler event_cb,
729 void *data, uid_t uid)
732 GVariantBuilder *pkgs_builder;
734 int ret = PKGMGR_R_ECOMM;
735 char *req_key = NULL;
736 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
737 struct cb_info *cb_info;
739 char *request_id = NULL;
741 if (pc == NULL || pkg_paths == NULL || n_pkgs < 1) {
742 ERR("invalid parameter");
743 return PKGMGR_R_EINVAL;
746 if (client->pc_type != PC_REQUEST) {
747 ERR("client->pc_type is not PC_REQUEST");
748 return PKGMGR_R_EINVAL;
751 for (i = 0; i < n_pkgs; i++) {
752 if (access(pkg_paths[i], F_OK) != 0) {
753 ERR("failed to access: %s", pkg_paths[i]);
754 return PKGMGR_R_EINVAL;
758 pkgs_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
759 for (i = 0; i < n_pkgs; i++)
760 g_variant_builder_add(pkgs_builder, "s", pkg_paths[i]);
761 pkgs = g_variant_new("as", pkgs_builder);
762 g_variant_builder_unref(pkgs_builder);
764 request_id = _generate_request_id();
765 ret = pkgmgr_client_connection_send_request(client,
766 "mount_install_pkgs",
767 g_variant_new("(u@ass)", uid, pkgs, request_id),
770 if (ret != PKGMGR_R_OK) {
771 ERR("request failed: %d", ret);
775 g_variant_get(result, "(i&s)", &ret, &req_key);
776 if (req_key == NULL) {
777 g_variant_unref(result);
778 return PKGMGR_R_ECOMM;
780 if (ret != PKGMGR_R_OK) {
781 g_variant_unref(result);
785 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
786 if (cb_info == NULL) {
787 g_variant_unref(result);
788 return PKGMGR_R_ENOMEM;
790 g_variant_unref(result);
791 ret = pkgmgr_client_connection_set_callback(client, cb_info);
792 if (ret != PKGMGR_R_OK) {
793 __free_cb_info(cb_info);
796 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
798 return cb_info->req_id;
801 API int pkgmgr_client_mount_install_packages(pkgmgr_client *pc,
802 const char **pkg_paths, int n_pkgs, pkgmgr_handler event_cb,
805 return pkgmgr_client_usr_mount_install_packages(pc, pkg_paths, n_pkgs,
806 event_cb, data, _getuid());
809 API int pkgmgr_client_usr_mount_install(pkgmgr_client *pc, const char *pkg_type,
810 const char *descriptor_path, const char *pkg_path,
811 const char *optional_data, pkgmgr_mode mode,
812 pkgmgr_handler event_cb, void *data, uid_t uid)
815 int ret = PKGMGR_R_ECOMM;
816 char *req_key = NULL;
817 GVariantBuilder *builder = NULL;
818 GVariant *args = NULL;
819 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
820 struct cb_info *cb_info;
821 char *request_id = NULL;
823 if (pc == NULL || pkg_path == NULL) {
824 ERR("invalid parameter");
825 return PKGMGR_R_EINVAL;
828 if (client->pc_type != PC_REQUEST) {
829 ERR("client->pc_type is not PC_REQUEST");
830 return PKGMGR_R_EINVAL;
833 if (access(pkg_path, F_OK) != 0) {
834 ERR("failed to access: %s", pkg_path);
835 return PKGMGR_R_EINVAL;
838 if (client->tep_path != NULL && access(client->tep_path, F_OK) != 0) {
839 ERR("failed to access: %s", client->tep_path);
840 return PKGMGR_R_EINVAL;
843 /* build arguments */
844 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
845 if (client->tep_path) {
846 g_variant_builder_add(builder, "s", "-e");
847 g_variant_builder_add(builder, "s", client->tep_path);
848 g_variant_builder_add(builder, "s", "-M");
849 /* TODO: revise tep_move */
850 g_variant_builder_add(builder, "s",
851 client->tep_move ? "tep_move" : "tep_copy");
854 args = g_variant_new("as", builder);
855 g_variant_builder_unref(builder);
857 request_id = _generate_request_id();
858 ret = pkgmgr_client_connection_send_request(client, "mount_install",
859 g_variant_new("(uss@ass)", uid,
860 pkg_type ? pkg_type : "", pkg_path,
864 if (ret != PKGMGR_R_OK) {
865 ERR("request failed: %d", ret);
869 g_variant_get(result, "(i&s)", &ret, &req_key);
870 if (req_key == NULL) {
871 g_variant_unref(result);
872 return PKGMGR_R_ECOMM;
874 if (ret != PKGMGR_R_OK) {
875 g_variant_unref(result);
879 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
880 if (cb_info == NULL) {
881 g_variant_unref(result);
882 return PKGMGR_R_ENOMEM;
884 g_variant_unref(result);
885 ret = pkgmgr_client_connection_set_callback(client, cb_info);
886 if (ret != PKGMGR_R_OK) {
887 __free_cb_info(cb_info);
890 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
892 return cb_info->req_id;
895 API int pkgmgr_client_mount_install(pkgmgr_client *pc, const char *pkg_type,
896 const char *descriptor_path, const char *pkg_path,
897 const char *optional_data, pkgmgr_mode mode,
898 pkgmgr_handler event_cb, void *data)
900 return pkgmgr_client_usr_mount_install(pc, pkg_type, descriptor_path,
901 pkg_path, optional_data, mode, event_cb, data,
905 API int pkgmgr_client_usr_uninstall_packages(pkgmgr_client *pc,
906 const char **pkgids, int n_pkgs, pkgmgr_handler event_cb,
907 void *data, uid_t uid)
910 GVariantBuilder *pkgs_builder;
912 int ret = PKGMGR_R_ECOMM;
913 char *req_key = NULL;
914 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
915 struct cb_info *cb_info;
918 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
919 ERR("invalid parameter");
920 return PKGMGR_R_EINVAL;
923 if (client->pc_type != PC_REQUEST) {
924 ERR("client->pc_type is not PC_REQUEST");
925 return PKGMGR_R_EINVAL;
928 pkgs_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
929 for (i = 0; i < n_pkgs; i++)
930 g_variant_builder_add(pkgs_builder, "s", pkgids[i]);
931 pkgs = g_variant_new("as", pkgs_builder);
932 g_variant_builder_unref(pkgs_builder);
934 ret = pkgmgr_client_connection_send_request(client, "uninstall_pkgs",
935 g_variant_new("(u@as)", uid, pkgs), &result);
936 if (ret != PKGMGR_R_OK) {
937 ERR("request failed: %d", ret);
941 g_variant_get(result, "(i&s)", &ret, &req_key);
942 if (req_key == NULL) {
943 g_variant_unref(result);
944 return PKGMGR_R_ECOMM;
946 if (ret != PKGMGR_R_OK) {
947 g_variant_unref(result);
951 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
952 if (cb_info == NULL) {
953 g_variant_unref(result);
954 return PKGMGR_R_ENOMEM;
956 g_variant_unref(result);
957 ret = pkgmgr_client_connection_set_callback(client, cb_info);
958 if (ret != PKGMGR_R_OK) {
959 __free_cb_info(cb_info);
962 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
964 return cb_info->req_id;
967 API int pkgmgr_client_uninstall_packages(pkgmgr_client *pc,
968 const char **pkgids, int n_pkgs, pkgmgr_handler event_cb,
971 return pkgmgr_client_usr_uninstall_packages(pc, pkgids, n_pkgs,
972 event_cb, data, _getuid());
975 API int pkgmgr_client_uninstall(pkgmgr_client *pc, const char *pkg_type,
976 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
979 return pkgmgr_client_usr_uninstall(pc, pkg_type, pkgid, mode, event_cb,
983 API int pkgmgr_client_usr_uninstall(pkgmgr_client *pc, const char *pkg_type,
984 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
985 void *data, uid_t uid)
988 int ret = PKGMGR_R_ECOMM;
989 char *req_key = NULL;
990 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
991 struct cb_info *cb_info;
993 if (pc == NULL || pkgid == NULL) {
994 ERR("invalid parameter");
995 return PKGMGR_R_EINVAL;
998 if (client->pc_type != PC_REQUEST) {
999 ERR("client->pc_type is not PC_REQUEST");
1000 return PKGMGR_R_EINVAL;
1003 ret = pkgmgr_client_connection_send_request(client, "uninstall",
1004 g_variant_new("(us)", uid, pkgid), &result);
1005 if (ret != PKGMGR_R_OK) {
1006 ERR("request failed: %d", ret);
1010 g_variant_get(result, "(i&s)", &ret, &req_key);
1011 if (req_key == NULL) {
1012 g_variant_unref(result);
1013 return PKGMGR_R_ECOMM;
1015 if (ret != PKGMGR_R_OK) {
1016 g_variant_unref(result);
1020 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1021 if (cb_info == NULL) {
1022 g_variant_unref(result);
1023 return PKGMGR_R_ENOMEM;
1025 g_variant_unref(result);
1026 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1027 if (ret != PKGMGR_R_OK) {
1028 __free_cb_info(cb_info);
1031 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1033 return cb_info->req_id;
1036 API int pkgmgr_client_move(pkgmgr_client *pc, const char *pkg_type,
1037 const char *pkgid, pkgmgr_move_type move_type,
1038 pkgmgr_handler event_cb, void *data)
1040 return pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type,
1041 event_cb, data, _getuid());
1043 API int pkgmgr_client_usr_move(pkgmgr_client *pc, const char *pkg_type,
1044 const char *pkgid, pkgmgr_move_type move_type,
1045 pkgmgr_handler event_cb, void *data, uid_t uid)
1048 int ret = PKGMGR_R_ECOMM;
1049 char *req_key = NULL;
1050 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1051 struct cb_info *cb_info;
1053 if (pc == NULL || pkgid == NULL) {
1054 ERR("invalid parameter");
1055 return PKGMGR_R_EINVAL;
1058 if ((move_type < PM_MOVE_TO_INTERNAL) ||
1059 (move_type > PM_MOVE_TO_EXTENDED))
1060 return PKGMGR_R_EINVAL;
1062 if (client->pc_type != PC_REQUEST) {
1063 ERR("client->pc_type is not PC_REQUEST");
1064 return PKGMGR_R_EINVAL;
1067 ret = pkgmgr_client_connection_send_request(client, "move",
1068 g_variant_new("(usi)", uid, pkgid, move_type), &result);
1069 if (ret != PKGMGR_R_OK) {
1070 ERR("request failed: %d", ret);
1074 g_variant_get(result, "(i&s)", &ret, &req_key);
1075 if (req_key == NULL) {
1076 g_variant_unref(result);
1077 return PKGMGR_R_ECOMM;
1079 if (ret != PKGMGR_R_OK) {
1080 g_variant_unref(result);
1084 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1085 if (cb_info == NULL) {
1086 g_variant_unref(result);
1087 return PKGMGR_R_ERROR;
1089 g_variant_unref(result);
1090 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1091 if (ret != PKGMGR_R_OK) {
1092 __free_cb_info(cb_info);
1095 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1097 return cb_info->req_id;
1100 API int pkgmgr_client_usr_register_pkg_update_info(pkgmgr_client *pc,
1101 pkg_update_info_t *update_info, uid_t uid)
1104 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1107 if (pc == NULL || update_info == NULL || update_info->pkgid == NULL) {
1108 ERR("invalid parameter");
1109 return PKGMGR_R_EINVAL;
1112 if (client->pc_type != PC_REQUEST) {
1113 ERR("client->pc_type is not PC_REQUEST");
1114 return PKGMGR_R_EINVAL;
1117 ret = pkgmgr_client_connection_send_request(client, "register_pkg_update_info",
1118 g_variant_new("(ussi)", uid, update_info->pkgid, update_info->version,
1119 update_info->type), &result);
1120 if (ret != PKGMGR_R_OK) {
1121 ERR("request failed: %d", ret);
1125 g_variant_get(result, "(i)", &ret);
1126 if (ret != PKGMGR_R_OK) {
1127 g_variant_unref(result);
1130 g_variant_unref(result);
1135 API int pkgmgr_client_register_pkg_update_info(pkgmgr_client *pc,
1136 pkg_update_info_t *update_info)
1138 return pkgmgr_client_usr_register_pkg_update_info(pc, update_info,
1142 API int pkgmgr_client_usr_unregister_pkg_update_info(pkgmgr_client *pc,
1143 const char *pkgid, uid_t uid)
1146 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1149 if (pc == NULL || pkgid == NULL) {
1150 ERR("invalid parameter");
1151 return PKGMGR_R_EINVAL;
1154 if (client->pc_type != PC_REQUEST) {
1155 ERR("client->pc_type is not PC_REQUEST");
1156 return PKGMGR_R_EINVAL;
1159 ret = pkgmgr_client_connection_send_request(client,
1160 "unregister_pkg_update_info",
1161 g_variant_new("(us)", uid, pkgid), &result);
1162 if (ret != PKGMGR_R_OK) {
1163 ERR("request failed: %d", ret);
1167 g_variant_get(result, "(i)", &ret);
1168 if (ret != PKGMGR_R_OK) {
1169 g_variant_unref(result);
1172 g_variant_unref(result);
1177 API int pkgmgr_client_unregister_pkg_update_info(pkgmgr_client *pc,
1180 return pkgmgr_client_usr_unregister_pkg_update_info(pc, pkgid, _getuid());
1183 API int pkgmgr_client_usr_unregister_all_pkg_update_info(pkgmgr_client *pc,
1187 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1191 ERR("invalid parameter");
1192 return PKGMGR_R_EINVAL;
1195 if (client->pc_type != PC_REQUEST) {
1196 ERR("client->pc_type is not PC_REQUEST");
1197 return PKGMGR_R_EINVAL;
1200 ret = pkgmgr_client_connection_send_request(client,
1201 "unregister_all_pkg_update_info",
1202 g_variant_new("(u)", uid), &result);
1203 if (ret != PKGMGR_R_OK) {
1204 ERR("request failed: %d", ret);
1208 g_variant_get(result, "(i)", &ret);
1209 if (ret != PKGMGR_R_OK) {
1210 g_variant_unref(result);
1213 g_variant_unref(result);
1218 API int pkgmgr_client_unregister_all_pkg_update_info(pkgmgr_client *pc)
1220 return pkgmgr_client_usr_unregister_all_pkg_update_info(pc, _getuid());
1223 API int pkgmgr_client_usr_activate(pkgmgr_client *pc, const char *pkg_type,
1224 const char *pkgid, uid_t uid)
1227 int ret = PKGMGR_R_ECOMM;
1228 GVariantBuilder *builder;
1229 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1231 if (pc == NULL || pkgid == NULL) {
1232 ERR("invalid parameter");
1233 return PKGMGR_R_EINVAL;
1236 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1237 g_variant_builder_add(builder, "s", pkgid);
1239 ret = pkgmgr_client_connection_send_request(client, "enable_pkgs",
1240 g_variant_new("(uas)", uid, builder), &result);
1241 g_variant_builder_unref(builder);
1242 if (ret != PKGMGR_R_OK) {
1243 ERR("request failed: %d", ret);
1247 g_variant_get(result, "(is)", &ret, NULL);
1248 g_variant_unref(result);
1253 API int pkgmgr_client_activate(pkgmgr_client *pc, const char *pkg_type,
1256 return pkgmgr_client_usr_activate(pc, pkg_type, pkgid, _getuid());
1259 API int pkgmgr_client_usr_activate_packages(pkgmgr_client *pc,
1260 const char *pkg_type, const char **pkgids, int n_pkgs,
1261 pkgmgr_handler event_cb, void *data, uid_t uid)
1264 GVariantBuilder *builder;
1265 int ret = PKGMGR_R_ECOMM;
1266 char *req_key = NULL;
1267 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1268 struct cb_info *cb_info;
1271 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
1272 ERR("invalid parameter");
1273 return PKGMGR_R_EINVAL;
1276 if (client->pc_type != PC_REQUEST) {
1277 ERR("client type is not PC_REQUEST");
1278 return PKGMGR_R_EINVAL;
1281 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1282 for (i = 0; i < n_pkgs; i++)
1283 g_variant_builder_add(builder, "s", pkgids[i]);
1285 ret = pkgmgr_client_connection_send_request(client, "enable_pkgs",
1286 g_variant_new("(uas)", uid, builder), &result);
1287 g_variant_builder_unref(builder);
1288 if (ret != PKGMGR_R_OK) {
1289 ERR("request failed: %d", ret);
1293 g_variant_get(result, "(i&s)", &ret, &req_key);
1294 if (req_key == NULL) {
1295 g_variant_unref(result);
1296 return PKGMGR_R_ECOMM;
1298 if (ret != PKGMGR_R_OK) {
1299 g_variant_unref(result);
1303 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1304 if (cb_info == NULL) {
1305 g_variant_unref(result);
1306 return PKGMGR_R_ERROR;
1308 g_variant_unref(result);
1309 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1310 if (ret != PKGMGR_R_OK) {
1311 __free_cb_info(cb_info);
1314 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1316 return cb_info->req_id;
1319 API int pkgmgr_client_activate_packages(pkgmgr_client *pc,
1320 const char *pkg_type, const char **pkgids, int n_pkgs,
1321 pkgmgr_handler event_cb, void *data)
1323 return pkgmgr_client_usr_activate_packages(pc, pkg_type,
1324 pkgids, n_pkgs, event_cb, data, _getuid());
1327 API int pkgmgr_client_usr_deactivate(pkgmgr_client *pc, const char *pkg_type,
1328 const char *pkgid, uid_t uid)
1331 GVariantBuilder *builder;
1332 int ret = PKGMGR_R_ECOMM;
1333 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1335 if (pc == NULL || pkgid == NULL) {
1336 ERR("invalid parameter");
1337 return PKGMGR_R_EINVAL;
1340 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1341 g_variant_builder_add(builder, "s", pkgid);
1343 ret = pkgmgr_client_connection_send_request(client, "disable_pkgs",
1344 g_variant_new("(uas)", uid, builder), &result);
1345 g_variant_builder_unref(builder);
1346 if (ret != PKGMGR_R_OK) {
1347 ERR("request failed: %d", ret);
1351 g_variant_get(result, "(is)", &ret, NULL);
1352 g_variant_unref(result);
1357 API int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type,
1360 return pkgmgr_client_usr_deactivate(pc, pkg_type, pkgid, _getuid());
1363 API int pkgmgr_client_usr_deactivate_packages(pkgmgr_client *pc,
1364 const char *pkg_type, const char **pkgids, int n_pkgs,
1365 pkgmgr_handler event_cb, void *data, uid_t uid)
1368 GVariantBuilder *builder;
1369 int ret = PKGMGR_R_ECOMM;
1370 char *req_key = NULL;
1371 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1372 struct cb_info *cb_info;
1375 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
1376 ERR("invalid parameter");
1377 return PKGMGR_R_EINVAL;
1380 if (client->pc_type != PC_REQUEST) {
1381 ERR("client type is not PC_REQUEST");
1382 return PKGMGR_R_EINVAL;
1385 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1386 for (i = 0; i < n_pkgs; i++)
1387 g_variant_builder_add(builder, "s", pkgids[i]);
1389 ret = pkgmgr_client_connection_send_request(client, "disable_pkgs",
1390 g_variant_new("(uas)", uid, builder), &result);
1391 g_variant_builder_unref(builder);
1392 if (ret != PKGMGR_R_OK) {
1393 ERR("request failed: %d", ret);
1397 g_variant_get(result, "(i&s)", &ret, &req_key);
1398 if (req_key == NULL) {
1399 g_variant_unref(result);
1400 return PKGMGR_R_ECOMM;
1402 if (ret != PKGMGR_R_OK) {
1403 g_variant_unref(result);
1407 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1408 if (cb_info == NULL) {
1409 g_variant_unref(result);
1410 return PKGMGR_R_ERROR;
1412 g_variant_unref(result);
1413 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1414 if (ret != PKGMGR_R_OK) {
1415 __free_cb_info(cb_info);
1418 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1420 return cb_info->req_id;
1423 API int pkgmgr_client_deactivate_packages(pkgmgr_client *pc,
1424 const char *pkg_type, const char **pkgids, int n_pkgs,
1425 pkgmgr_handler event_cb, void *data)
1427 return pkgmgr_client_usr_deactivate_packages(pc, pkg_type,
1428 pkgids, n_pkgs, event_cb, data, _getuid());
1431 API int pkgmgr_client_usr_activate_app(pkgmgr_client *pc, const char *appid,
1432 pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1435 int ret = PKGMGR_R_ECOMM;
1436 char *req_key = NULL;
1437 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1438 struct cb_info *cb_info;
1440 if (pc == NULL || appid == NULL) {
1441 ERR("invalid parameter");
1442 return PKGMGR_R_EINVAL;
1445 ret = pkgmgr_client_connection_send_request(client, "enable_app",
1446 g_variant_new("(us)", uid, appid), &result);
1447 if (ret != PKGMGR_R_OK) {
1448 ERR("request failed: %d", ret);
1452 g_variant_get(result, "(i&s)", &ret, &req_key);
1453 if (req_key == NULL) {
1454 g_variant_unref(result);
1455 return PKGMGR_R_ECOMM;
1457 if (ret != PKGMGR_R_OK) {
1458 g_variant_unref(result);
1462 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1464 if (cb_info == NULL) {
1465 g_variant_unref(result);
1466 return PKGMGR_R_ENOMEM;
1468 g_variant_unref(result);
1469 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1470 if (ret != PKGMGR_R_OK) {
1471 __free_cb_info(cb_info);
1474 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1476 return cb_info->req_id;
1479 API int pkgmgr_client_activate_app(pkgmgr_client *pc, const char *appid,
1480 pkgmgr_app_handler app_event_cb, void *data)
1482 return pkgmgr_client_usr_activate_app(pc, appid, app_event_cb,
1486 API int pkgmgr_client_usr_activate_apps(pkgmgr_client *pc, const char **appids,
1487 int n_apps, pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1490 GVariantBuilder *builder;
1491 int ret = PKGMGR_R_ECOMM;
1492 char *req_key = NULL;
1493 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1494 struct cb_info *cb_info;
1497 if (pc == NULL || appids == NULL || n_apps < 1) {
1498 ERR("invalid parameter");
1499 return PKGMGR_R_EINVAL;
1502 if (client->pc_type != PC_REQUEST) {
1503 ERR("client type is not PC_REQUEST");
1504 return PKGMGR_R_EINVAL;
1507 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1508 for (i = 0; i < n_apps; i++)
1509 g_variant_builder_add(builder, "s", appids[i]);
1511 ret = pkgmgr_client_connection_send_request(client, "enable_apps",
1512 g_variant_new("(uas)", uid, builder), &result);
1513 g_variant_builder_unref(builder);
1514 if (ret != PKGMGR_R_OK) {
1515 ERR("request failed: %d", ret);
1519 g_variant_get(result, "(i&s)", &ret, &req_key);
1520 if (req_key == NULL) {
1521 g_variant_unref(result);
1522 return PKGMGR_R_ECOMM;
1524 if (ret != PKGMGR_R_OK) {
1525 g_variant_unref(result);
1529 cb_info = __create_app_event_cb_info(client, app_event_cb, data, req_key);
1530 if (cb_info == NULL) {
1531 g_variant_unref(result);
1532 return PKGMGR_R_ERROR;
1534 g_variant_unref(result);
1535 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1536 if (ret != PKGMGR_R_OK) {
1537 __free_cb_info(cb_info);
1540 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1542 return cb_info->req_id;
1545 API int pkgmgr_client_activate_apps(pkgmgr_client *pc, const char **appids,
1546 int n_apps, pkgmgr_app_handler app_event_cb, void *data)
1548 return pkgmgr_client_usr_activate_apps(pc, appids, n_apps,
1549 app_event_cb, data, _getuid());
1552 API int pkgmgr_client_activate_global_app_for_uid(pkgmgr_client *pc,
1553 const char *appid, pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1556 int ret = PKGMGR_R_ECOMM;
1557 char *req_key = NULL;
1558 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1559 struct cb_info *cb_info;
1561 if (pc == NULL || appid == NULL) {
1562 ERR("invalid parameter");
1563 return PKGMGR_R_EINVAL;
1566 ret = pkgmgr_client_connection_send_request(client,
1567 "enable_global_app_for_uid",
1568 g_variant_new("(us)", uid, appid), &result);
1569 if (ret != PKGMGR_R_OK) {
1570 ERR("request failed: %d", ret);
1574 g_variant_get(result, "(i&s)", &ret, &req_key);
1575 if (req_key == NULL) {
1576 g_variant_unref(result);
1577 return PKGMGR_R_ECOMM;
1579 if (ret != PKGMGR_R_OK) {
1580 g_variant_unref(result);
1584 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1586 if (cb_info == NULL) {
1587 g_variant_unref(result);
1588 return PKGMGR_R_ENOMEM;
1590 g_variant_unref(result);
1591 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1592 if (ret != PKGMGR_R_OK) {
1593 __free_cb_info(cb_info);
1596 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1598 return cb_info->req_id;
1601 API int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid,
1602 pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1605 int ret = PKGMGR_R_ECOMM;
1606 char *req_key = NULL;
1607 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1608 struct cb_info *cb_info;
1610 if (pc == NULL || appid == NULL) {
1611 ERR("invalid parameter");
1612 return PKGMGR_R_EINVAL;
1615 ret = pkgmgr_client_connection_send_request(client, "disable_app",
1616 g_variant_new("(us)", uid, appid), &result);
1617 if (ret != PKGMGR_R_OK) {
1618 ERR("request failed: %d", ret);
1622 g_variant_get(result, "(i&s)", &ret, &req_key);
1623 if (req_key == NULL) {
1624 g_variant_unref(result);
1625 return PKGMGR_R_ECOMM;
1627 if (ret != PKGMGR_R_OK) {
1628 g_variant_unref(result);
1632 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1634 if (cb_info == NULL) {
1635 g_variant_unref(result);
1636 return PKGMGR_R_ENOMEM;
1638 g_variant_unref(result);
1639 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1640 if (ret != PKGMGR_R_OK) {
1641 __free_cb_info(cb_info);
1644 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1646 return cb_info->req_id;
1649 API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid,
1650 pkgmgr_app_handler app_event_cb, void *data)
1652 return pkgmgr_client_usr_deactivate_app(pc, appid, app_event_cb, data,
1656 API int pkgmgr_client_usr_deactivate_apps(pkgmgr_client *pc,
1657 const char **appids, int n_apps,
1658 pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1661 GVariantBuilder *builder;
1662 int ret = PKGMGR_R_ECOMM;
1663 char *req_key = NULL;
1664 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1665 struct cb_info *cb_info;
1668 if (pc == NULL || appids == NULL || n_apps < 1) {
1669 ERR("invalid parameter");
1670 return PKGMGR_R_EINVAL;
1673 if (client->pc_type != PC_REQUEST) {
1674 ERR("client type is not PC_REQUEST");
1675 return PKGMGR_R_EINVAL;
1678 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1679 for (i = 0; i < n_apps; i++)
1680 g_variant_builder_add(builder, "s", appids[i]);
1682 ret = pkgmgr_client_connection_send_request(client, "disable_apps",
1683 g_variant_new("(uas)", uid, builder), &result);
1684 g_variant_builder_unref(builder);
1685 if (ret != PKGMGR_R_OK) {
1686 ERR("request failed: %d", ret);
1690 g_variant_get(result, "(i&s)", &ret, &req_key);
1691 if (req_key == NULL) {
1692 g_variant_unref(result);
1693 return PKGMGR_R_ECOMM;
1695 if (ret != PKGMGR_R_OK) {
1696 g_variant_unref(result);
1700 cb_info = __create_app_event_cb_info(client, app_event_cb, data, req_key);
1701 if (cb_info == NULL) {
1702 g_variant_unref(result);
1703 return PKGMGR_R_ERROR;
1705 g_variant_unref(result);
1706 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1707 if (ret != PKGMGR_R_OK) {
1708 __free_cb_info(cb_info);
1711 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1713 return cb_info->req_id;
1716 API int pkgmgr_client_deactivate_apps(pkgmgr_client *pc, const char **appids,
1717 int n_apps, pkgmgr_app_handler app_event_cb, void *data)
1719 return pkgmgr_client_usr_deactivate_apps(pc, appids, n_apps,
1720 app_event_cb, data, _getuid());
1723 API int pkgmgr_client_deactivate_global_app_for_uid(pkgmgr_client *pc,
1724 const char *appid, pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1727 int ret = PKGMGR_R_ECOMM;
1728 char *req_key = NULL;
1729 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1730 struct cb_info *cb_info;
1732 if (pc == NULL || appid == NULL) {
1733 ERR("invalid parameter");
1734 return PKGMGR_R_EINVAL;
1737 ret = pkgmgr_client_connection_send_request(client,
1738 "disable_global_app_for_uid",
1739 g_variant_new("(us)", uid, appid), &result);
1740 if (ret != PKGMGR_R_OK) {
1741 ERR("request failed: %d", ret);
1745 g_variant_get(result, "(i&s)", &ret, &req_key);
1746 if (req_key == NULL) {
1747 g_variant_unref(result);
1748 return PKGMGR_R_ECOMM;
1750 if (ret != PKGMGR_R_OK) {
1751 g_variant_unref(result);
1755 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1757 if (cb_info == NULL) {
1758 g_variant_unref(result);
1759 return PKGMGR_R_ENOMEM;
1761 g_variant_unref(result);
1762 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1763 if (ret != PKGMGR_R_OK) {
1764 __free_cb_info(cb_info);
1767 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1769 return cb_info->req_id;
1772 API int pkgmgr_client_usr_clear_user_data(pkgmgr_client *pc,
1773 const char *pkg_type, const char *pkgid, pkgmgr_mode mode,
1778 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1780 if (pc == NULL || pkgid == NULL || uid == GLOBAL_USER) {
1781 ERR("invalid parameter");
1782 return PKGMGR_R_EINVAL;
1785 if (client->pc_type != PC_REQUEST) {
1786 ERR("client->pc_type is not PC_REQUEST");
1787 return PKGMGR_R_EINVAL;
1790 ret = pkgmgr_client_connection_send_request(client, "cleardata",
1791 g_variant_new("(us)", uid, pkgid), &result);
1792 if (ret != PKGMGR_R_OK) {
1793 ERR("request failed: %d", ret);
1797 g_variant_get(result, "(i)", &ret);
1798 g_variant_unref(result);
1803 API int pkgmgr_client_clear_user_data(pkgmgr_client *pc, const char *pkg_type,
1804 const char *pkgid, pkgmgr_mode mode)
1806 return pkgmgr_client_usr_clear_user_data(pc, pkg_type, pkgid, mode,
1810 API int pkgmgr_client_set_status_type(pkgmgr_client *pc, int status_type)
1812 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1815 ERR("invalid parameter");
1816 return PKGMGR_R_EINVAL;
1819 client->status_type = status_type;
1824 API int pkgmgr_client_listen_status(pkgmgr_client *pc, pkgmgr_handler event_cb,
1828 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1829 struct cb_info *cb_info;
1831 if (pc == NULL || event_cb == NULL) {
1832 ERR("invalid parameter");
1833 return PKGMGR_R_EINVAL;
1836 if (client->pc_type != PC_LISTENING) {
1837 ERR("client->pc_type is not PC_LISTENING");
1838 return PKGMGR_R_EINVAL;
1841 cb_info = __create_event_cb_info(client, event_cb, data, NULL);
1842 if (cb_info == NULL)
1843 return PKGMGR_R_ENOMEM;
1844 cb_info->status_type = client->status_type;
1845 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1846 if (ret != PKGMGR_R_OK) {
1847 __free_cb_info(cb_info);
1850 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1852 return cb_info->req_id;
1855 API int pkgmgr_client_listen_app_status(pkgmgr_client *pc,
1856 pkgmgr_app_handler app_event_cb, void *data)
1859 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1860 struct cb_info *cb_info;
1862 if (pc == NULL || app_event_cb == NULL) {
1863 ERR("invalid parameter");
1864 return PKGMGR_R_EINVAL;
1867 if (client->pc_type != PC_LISTENING) {
1868 ERR("client->pc_type is not PC_LISTENING");
1869 return PKGMGR_R_EINVAL;
1872 cb_info = __create_app_event_cb_info(client, app_event_cb, data, NULL);
1873 if (cb_info == NULL)
1874 return PKGMGR_R_ENOMEM;
1875 cb_info->status_type = client->status_type;
1876 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1877 if (ret != PKGMGR_R_OK) {
1878 __free_cb_info(cb_info);
1881 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1883 return cb_info->req_id;
1886 API int pkgmgr_client_listen_res_copy_status(pkgmgr_client *pc,
1887 pkgmgr_res_copy_handler event_cb, void *data)
1890 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1891 struct cb_info *cb_info;
1893 if (pc == NULL || event_cb == NULL) {
1894 ERR("invalid parameter");
1895 return PKGMGR_R_EINVAL;
1898 if (client->pc_type != PC_LISTENING) {
1899 ERR("client->pc_type is not PC_LISTENING");
1900 return PKGMGR_R_EINVAL;
1903 cb_info = __create_res_copy_event_cb_info(client, event_cb, data, NULL);
1904 if (cb_info == NULL)
1905 return PKGMGR_R_ENOMEM;
1906 cb_info->status_type = client->status_type;
1907 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1908 if (ret != PKGMGR_R_OK) {
1909 __free_cb_info(cb_info);
1912 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1914 return cb_info->req_id;
1917 API int pkgmgr_client_remove_listen_status(pkgmgr_client *pc)
1919 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1922 struct cb_info *cb_info;
1925 ERR("invalid parameter");
1926 return PKGMGR_R_EINVAL;
1929 /* unset all callback */
1930 tmp = client->cb_info_list;
1931 while (tmp != NULL) {
1933 cb_info = (struct cb_info *)tmp->data;
1934 pkgmgr_client_connection_unset_callback(pc, cb_info);
1935 client->cb_info_list = g_list_delete_link(client->cb_info_list,
1937 __free_cb_info(cb_info);
1944 API int pkgmgr_client_broadcast_status(pkgmgr_client *pc, const char *pkg_type,
1945 const char *pkgid, const char *key, const char *val)
1947 /* client cannot broadcast signal */
1951 /* TODO: deprecate(or remove) */
1952 API int pkgmgr_client_request_service(pkgmgr_request_service_type service_type,
1953 int service_mode, pkgmgr_client *pc, const char *pkg_type,
1954 const char *pkgid, const char *custom_info,
1955 pkgmgr_handler event_cb, void *data)
1957 return pkgmgr_client_usr_request_service(service_type, service_mode,
1958 pc, pkg_type, pkgid, _getuid(), custom_info, event_cb,
1962 API int pkgmgr_client_usr_request_service(
1963 pkgmgr_request_service_type service_type, int service_mode,
1964 pkgmgr_client *pc, const char *pkg_type, const char *pkgid,
1965 uid_t uid, const char *custom_info, pkgmgr_handler event_cb,
1970 /* Check for NULL value of service type */
1971 retvm_if(service_type > PM_REQUEST_MAX, PKGMGR_R_EINVAL, "service type is not defined\n");
1972 retvm_if(service_type < 0, PKGMGR_R_EINVAL, "service type is error\n");
1974 switch (service_type) {
1975 case PM_REQUEST_MOVE:
1976 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1977 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1978 tryvm_if((service_mode < PM_MOVE_TO_INTERNAL) || (service_mode > PM_MOVE_TO_EXTENDED), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1980 ret = __move_pkg_process(pc, pkgid, pkg_type, uid, (pkgmgr_move_type)service_mode, event_cb, data);
1983 case PM_REQUEST_GET_SIZE:
1984 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1985 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1986 tryvm_if((service_mode < PM_GET_TOTAL_SIZE) || (service_mode >= PM_GET_MAX), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1988 ret = __get_size_process(pc, pkgid, uid, (pkgmgr_getsize_type)service_mode, event_cb, data);
1991 case PM_REQUEST_KILL_APP:
1992 case PM_REQUEST_CHECK_APP:
1993 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1994 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1996 ret = __check_app_process(service_type, pc, pkgid, uid, data);
1998 ERR("__check_app_process fail \n");
2005 ERR("Wrong Request\n");
2015 API int pkgmgr_client_usr_clear_cache_dir(const char *pkgid, uid_t uid)
2019 struct pkgmgr_client_t *client;
2021 if (pkgid == NULL || uid == GLOBAL_USER) {
2022 ERR("invalid parameter");
2023 return PKGMGR_R_EINVAL;
2026 client = pkgmgr_client_new(PC_REQUEST);
2027 if (client == NULL) {
2028 ERR("out of memory");
2029 return PKGMGR_R_ENOMEM;
2032 ret = pkgmgr_client_connection_send_request(client, "clearcache",
2033 g_variant_new("(us)", uid, pkgid), &result);
2034 if (ret != PKGMGR_R_OK) {
2035 ERR("request failed: %d", ret);
2036 pkgmgr_client_free(client);
2040 g_variant_get(result, "(i)", &ret);
2041 g_variant_unref(result);
2042 pkgmgr_client_free(client);
2047 API int pkgmgr_client_clear_cache_dir(const char *pkgid)
2049 return pkgmgr_client_usr_clear_cache_dir(pkgid, _getuid());
2052 API int pkgmgr_client_clear_usr_all_cache_dir(uid_t uid)
2054 return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, uid);
2057 API int pkgmgr_client_clear_all_cache_dir(void)
2059 return pkgmgr_client_usr_clear_cache_dir(
2060 PKG_CLEAR_ALL_CACHE, _getuid());
2063 API int pkgmgr_client_get_size(pkgmgr_client *pc, const char *pkgid,
2064 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
2067 return pkgmgr_client_usr_get_size(pc, pkgid, get_type, event_cb, data,
2071 /* TODO: deprecate(or remove) */
2072 API int pkgmgr_client_usr_get_size(pkgmgr_client *pc, const char *pkgid,
2073 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
2074 void *data, uid_t uid)
2077 int ret = PKGMGR_R_ECOMM;
2078 char *req_key = NULL;
2079 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2080 struct cb_info *cb_info;
2082 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
2083 ERR("invalid parameter");
2084 return PKGMGR_R_EINVAL;
2087 if (client->pc_type != PC_REQUEST) {
2088 ERR("client->pc_type is not PC_REQUEST");
2089 return PKGMGR_R_EINVAL;
2093 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
2094 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
2096 get_type = PM_GET_PKG_SIZE_INFO;
2098 ret = pkgmgr_client_connection_send_request(client, "getsize",
2099 g_variant_new("(usi)", uid, pkgid, get_type), &result);
2100 if (ret != PKGMGR_R_OK) {
2101 ERR("request failed: %d", ret);
2105 g_variant_get(result, "(i&s)", &ret, &req_key);
2106 if (req_key == NULL) {
2107 g_variant_unref(result);
2108 return PKGMGR_R_ECOMM;
2110 if (ret != PKGMGR_R_OK) {
2111 g_variant_unref(result);
2115 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
2116 if (cb_info == NULL) {
2117 g_variant_unref(result);
2118 return PKGMGR_R_ENOMEM;
2120 g_variant_unref(result);
2121 ret = pkgmgr_client_connection_set_callback(client, cb_info);
2122 if (ret != PKGMGR_R_OK) {
2123 __free_cb_info(cb_info);
2126 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
2131 API int pkgmgr_client_usr_get_package_size_info(pkgmgr_client *pc,
2132 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
2133 void *user_data, uid_t uid)
2136 int ret = PKGMGR_R_ECOMM;
2137 char *req_key = NULL;
2139 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2140 struct cb_info *cb_info;
2142 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
2143 ERR("invalid parameter");
2144 return PKGMGR_R_EINVAL;
2147 if (client->pc_type != PC_REQUEST) {
2148 ERR("client->pc_type is not PC_REQUEST");
2149 return PKGMGR_R_EINVAL;
2152 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
2153 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
2155 get_type = PM_GET_PKG_SIZE_INFO;
2157 ret = pkgmgr_client_connection_send_request(client, "getsize",
2158 g_variant_new("(usi)", uid, pkgid, get_type), &result);
2159 if (ret != PKGMGR_R_OK) {
2160 ERR("request failed: %d", ret);
2164 g_variant_get(result, "(i&s)", &ret, &req_key);
2165 if (req_key == NULL) {
2166 g_variant_unref(result);
2167 return PKGMGR_R_ECOMM;
2169 if (ret != PKGMGR_R_OK) {
2170 g_variant_unref(result);
2174 cb_info = __create_size_info_cb_info(client, event_cb, user_data,
2176 if (cb_info == NULL) {
2177 g_variant_unref(result);
2178 return PKGMGR_R_ENOMEM;
2180 g_variant_unref(result);
2181 ret = pkgmgr_client_connection_set_callback(client, cb_info);
2182 if (ret != PKGMGR_R_OK) {
2183 __free_cb_info(cb_info);
2186 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
2191 API int pkgmgr_client_get_package_size_info(pkgmgr_client *pc,
2192 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
2195 return pkgmgr_client_usr_get_package_size_info(pc, pkgid, event_cb,
2196 user_data, _getuid());
2199 API int pkgmgr_client_usr_get_total_package_size_info(pkgmgr_client *pc,
2200 pkgmgr_total_pkg_size_info_receive_cb event_cb,
2201 void *user_data, uid_t uid)
2202 { /* total package size info */
2203 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL,
2204 (pkgmgr_pkg_size_info_receive_cb)event_cb,
2208 API int pkgmgr_client_get_total_package_size_info(pkgmgr_client *pc,
2209 pkgmgr_total_pkg_size_info_receive_cb event_cb, void *user_data)
2211 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL,
2212 (pkgmgr_pkg_size_info_receive_cb)event_cb,
2213 user_data, _getuid());
2216 API int pkgmgr_client_generate_license_request(pkgmgr_client *pc,
2217 const char *resp_data, char **req_data, char **license_url)
2223 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2225 if (pc == NULL || resp_data == NULL || req_data == NULL ||
2226 license_url == NULL) {
2227 ERR("invalid parameter");
2228 return PKGMGR_R_EINVAL;
2231 if (client->pc_type != PC_REQUEST) {
2232 ERR("client->pc_type is not PC_REQUEST");
2233 return PKGMGR_R_EINVAL;
2236 ret = pkgmgr_client_connection_send_request(client,
2237 "generate_license_request",
2238 g_variant_new("(s)", resp_data), &result);
2239 if (ret != PKGMGR_R_OK) {
2240 ERR("request failed: %d", ret);
2244 g_variant_get(result, "(i&s&s)", &ret, &data, &url);
2245 if (ret != PKGMGR_R_OK) {
2246 ERR("generate_license_request failed: %d", ret);
2247 g_variant_unref(result);
2251 *req_data = strdup(data);
2252 *license_url = strdup(url);
2254 g_variant_unref(result);
2259 API int pkgmgr_client_register_license(pkgmgr_client *pc, const char *resp_data)
2263 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2265 if (pc == NULL || resp_data == NULL) {
2266 ERR("invalid parameter");
2267 return PKGMGR_R_EINVAL;
2270 if (client->pc_type != PC_REQUEST) {
2271 ERR("client->pc_type is not PC_REQUEST");
2272 return PKGMGR_R_EINVAL;
2275 ret = pkgmgr_client_connection_send_request(client, "register_license",
2276 g_variant_new("(s)", resp_data), &result);
2277 if (ret != PKGMGR_R_OK) {
2278 ERR("request failed: %d", ret);
2282 g_variant_get(result, "(i)", &ret);
2283 g_variant_unref(result);
2284 if (ret != PKGMGR_R_OK)
2285 ERR("register license failed: %d", ret);
2290 API int pkgmgr_client_decrypt_package(pkgmgr_client *pc,
2291 const char *drm_file_path, const char *decrypted_file_path)
2295 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2297 if (pc == NULL || drm_file_path == NULL ||
2298 decrypted_file_path == NULL) {
2299 ERR("invalid parameter");
2300 return PKGMGR_R_EINVAL;
2303 if (client->pc_type != PC_REQUEST) {
2304 ERR("client->pc_type is not PC_REQUEST");
2305 return PKGMGR_R_EINVAL;
2308 ret = pkgmgr_client_connection_send_request(client, "decrypt_package",
2309 g_variant_new("(ss)", drm_file_path,
2310 decrypted_file_path), &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("decrypt_package failed: %d", ret);
2324 API int pkgmgr_client_enable_splash_screen(pkgmgr_client *pc, const char *appid)
2326 return pkgmgr_client_usr_enable_splash_screen(pc, appid, _getuid());
2329 API int pkgmgr_client_usr_enable_splash_screen(pkgmgr_client *pc,
2330 const char *appid, uid_t uid)
2334 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2336 if (pc == NULL || appid == NULL) {
2337 ERR("Invalid parameter");
2338 return PKGMGR_R_EINVAL;
2341 ret = pkgmgr_client_connection_send_request(client,
2342 "enable_app_splash_screen",
2343 g_variant_new("(us)", uid, appid), &result);
2344 if (ret != PKGMGR_R_OK) {
2345 ERR("request failed: %d", ret);
2349 g_variant_get(result, "(i)", &ret);
2350 g_variant_unref(result);
2351 if (ret != PKGMGR_R_OK)
2352 ERR("enable splash screen failed: %d", ret);
2357 API int pkgmgr_client_disable_splash_screen(pkgmgr_client *pc,
2360 return pkgmgr_client_usr_disable_splash_screen(pc, appid,
2364 API int pkgmgr_client_usr_disable_splash_screen(pkgmgr_client *pc,
2365 const char *appid, uid_t uid)
2369 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2371 if (pc == NULL || appid == NULL) {
2372 ERR("Invalid parameter");
2373 return PKGMGR_R_EINVAL;
2376 ret = pkgmgr_client_connection_send_request(client,
2377 "disable_app_splash_screen",
2378 g_variant_new("(us)", uid, appid), &result);
2379 if (ret != PKGMGR_R_OK) {
2380 ERR("request failed: %d", ret);
2384 g_variant_get(result, "(i)", &ret);
2385 g_variant_unref(result);
2386 if (ret != PKGMGR_R_OK)
2387 ERR("disable splash screen failed: %d", ret);
2392 static int __set_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
2393 int mode, uid_t uid)
2396 int ret = PKGMGR_R_ECOMM;
2397 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2399 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
2400 ERR("invalid parameter");
2401 return PKGMGR_R_EINVAL;
2404 ret = pkgmgr_client_connection_send_request(client,
2405 "set_restriction_mode",
2406 g_variant_new("(usi)", uid, pkgid, mode), &result);
2407 if (ret != PKGMGR_R_OK) {
2408 ERR("request failed: %d", ret);
2412 g_variant_get(result, "(i)", &ret);
2413 g_variant_unref(result);
2418 API int pkgmgr_client_usr_set_pkg_restriction_mode(pkgmgr_client *pc,
2419 const char *pkgid, int mode, uid_t uid)
2421 return __set_pkg_restriction_mode(pc, pkgid, mode, uid);
2424 API int pkgmgr_client_set_pkg_restriction_mode(pkgmgr_client *pc,
2425 const char *pkgid, int mode)
2427 return pkgmgr_client_usr_set_pkg_restriction_mode(pc, pkgid, mode,
2431 static int __unset_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
2432 int mode, uid_t uid)
2435 int ret = PKGMGR_R_ECOMM;
2436 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2438 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
2439 ERR("invalid parameter");
2440 return PKGMGR_R_EINVAL;
2443 ret = pkgmgr_client_connection_send_request(client,
2444 "unset_restriction_mode",
2445 g_variant_new("(usi)", uid, pkgid, mode), &result);
2446 if (ret != PKGMGR_R_OK) {
2447 ERR("request failed: %d", ret);
2451 g_variant_get(result, "(i)", &ret);
2452 g_variant_unref(result);
2458 API int pkgmgr_client_usr_unset_pkg_restriction_mode(pkgmgr_client *pc,
2459 const char *pkgid, int mode, uid_t uid)
2461 return __unset_pkg_restriction_mode(pc, pkgid, mode, uid);
2464 API int pkgmgr_client_unset_pkg_restriction_mode(pkgmgr_client *pc,
2465 const char *pkgid, int mode)
2467 return pkgmgr_client_usr_unset_pkg_restriction_mode(pc, pkgid, mode,
2471 static int __get_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
2472 int *mode, uid_t uid)
2475 int ret = PKGMGR_R_ECOMM;
2477 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2479 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0) {
2480 ERR("invalid parameter");
2481 return PKGMGR_R_EINVAL;
2484 ret = pkgmgr_client_connection_send_request(client,
2485 "get_restriction_mode",
2486 g_variant_new("(us)", uid, pkgid), &result);
2487 if (ret != PKGMGR_R_OK) {
2488 ERR("request failed: %d", ret);
2492 g_variant_get(result, "(ii)", &m, &ret);
2493 g_variant_unref(result);
2494 if (ret != PKGMGR_R_OK)
2502 API int pkgmgr_client_usr_get_pkg_restriction_mode(pkgmgr_client *pc,
2503 const char *pkgid, int *mode, uid_t uid)
2505 return __get_pkg_restriction_mode(pc, pkgid, mode, uid);
2508 API int pkgmgr_client_get_pkg_restriction_mode(pkgmgr_client *pc,
2509 const char *pkgid, int *mode)
2511 return pkgmgr_client_usr_get_pkg_restriction_mode(pc, pkgid, mode,
2515 API int pkgmgr_client_usr_set_restriction_mode(pkgmgr_client *pc, int mode,
2519 int ret = PKGMGR_R_ECOMM;
2520 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2523 ERR("invalid parameter");
2524 return PKGMGR_R_EINVAL;
2527 ret = pkgmgr_client_connection_send_request(client,
2528 "set_restriction_mode",
2529 g_variant_new("(usi)", uid, "", mode), &result);
2530 if (ret != PKGMGR_R_OK) {
2531 ERR("request failed: %d", ret);
2535 g_variant_get(result, "(i)", &ret);
2536 g_variant_unref(result);
2541 API int pkgmgr_client_set_restriction_mode(pkgmgr_client *pc, int mode)
2543 return pkgmgr_client_usr_set_restriction_mode(pc, mode, _getuid());
2546 API int pkgmgr_client_usr_unset_restriction_mode(pkgmgr_client *pc, int mode,
2550 int ret = PKGMGR_R_ECOMM;
2551 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2554 ERR("invalid parameter");
2555 return PKGMGR_R_EINVAL;
2558 ret = pkgmgr_client_connection_send_request(client,
2559 "unset_restriction_mode",
2560 g_variant_new("(usi)", uid, "", mode), &result);
2561 if (ret != PKGMGR_R_OK) {
2562 ERR("request failed: %d", ret);
2566 g_variant_get(result, "(i)", &ret);
2567 g_variant_unref(result);
2572 API int pkgmgr_client_unset_restriction_mode(pkgmgr_client *pc, int mode)
2574 return pkgmgr_client_usr_unset_restriction_mode(pc, mode, _getuid());
2577 API int pkgmgr_client_usr_get_restriction_mode(pkgmgr_client *pc,
2578 int *mode, uid_t uid)
2581 int ret = PKGMGR_R_ECOMM;
2583 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2586 ERR("invalid parameter");
2587 return PKGMGR_R_EINVAL;
2590 ret = pkgmgr_client_connection_send_request(client,
2591 "get_restriction_mode",
2592 g_variant_new("(us)", uid, ""), &result);
2593 if (ret != PKGMGR_R_OK) {
2594 ERR("request failed: %d", ret);
2598 g_variant_get(result, "(ii)", &m, &ret);
2599 g_variant_unref(result);
2600 if (ret != PKGMGR_R_OK)
2608 API int pkgmgr_client_get_restriction_mode(pkgmgr_client *pc, int *mode)
2610 return pkgmgr_client_usr_get_restriction_mode(pc, mode, _getuid());
2613 API pkgmgr_info *pkgmgr_client_check_pkginfo_from_file(const char *pkg_path)
2616 pkg_plugin_set *plugin_set;
2617 package_manager_pkg_detail_info_t *info;
2620 if (pkg_path == NULL) {
2621 ERR("invalid parameter");
2625 pkg_type = __get_type_from_path(pkg_path);
2626 if (pkg_type == NULL) {
2627 ERR("cannot get pkg type");
2631 plugin_set = _package_manager_load_library(pkg_type);
2632 if (plugin_set == NULL) {
2633 ERR("failed to load library for %s", pkg_type);
2638 info = calloc(1, sizeof(package_manager_pkg_detail_info_t));
2640 ERR("out of memory");
2645 ret = plugin_set->get_pkg_detail_info_from_package(pkg_path, info);
2647 ERR("get_pkg_detail_info_from_package failed");
2655 return (pkgmgr_info *)info;
2658 API int pkgmgr_client_free_pkginfo(pkgmgr_info *info)
2660 package_manager_pkg_detail_info_t *pkg_info =
2661 (package_manager_pkg_detail_info_t *)info;
2664 ERR("invalid parameter");
2665 return PKGMGR_R_EINVAL;
2668 g_list_free_full(pkg_info->privilege_list, free);
2669 free(pkg_info->icon_buf);
2675 API int pkgmgr_client_usr_set_app_label(pkgmgr_client *pc, char *appid,
2676 char *label, uid_t uid)
2680 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2682 if (pc == NULL || appid == NULL || label == NULL) {
2683 ERR("Invalid parameter");
2684 return PKGMGR_R_EINVAL;
2687 ret = pkgmgr_client_connection_send_request(client,
2689 g_variant_new("(uss)", uid, appid, label), &result);
2690 if (ret != PKGMGR_R_OK) {
2691 ERR("Request failed: %d", ret);
2695 g_variant_get(result, "(i)", &ret);
2696 g_variant_unref(result);
2701 API int pkgmgr_client_set_app_label(pkgmgr_client *pc, char *appid, char *label)
2703 return pkgmgr_client_usr_set_app_label(pc, appid, label, _getuid());
2706 API int pkgmgr_client_usr_set_app_icon(pkgmgr_client *pc, char *appid,
2707 char *icon_path, uid_t uid)
2711 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2713 if (pc == NULL || appid == NULL || icon_path == NULL) {
2714 ERR("Invalid parameter");
2715 return PKGMGR_R_EINVAL;
2718 if (access(icon_path, F_OK) != 0) {
2719 ERR("failed to access: %s", icon_path);
2720 return PKGMGR_R_EINVAL;
2723 ret = pkgmgr_client_connection_send_request(client,
2725 g_variant_new("(uss)", uid, appid, icon_path), &result);
2726 if (ret != PKGMGR_R_OK) {
2727 ERR("Request failed: %d", ret);
2731 g_variant_get(result, "(i)", &ret);
2732 g_variant_unref(result);
2737 API int pkgmgr_client_set_app_icon(pkgmgr_client *pc, char *appid, char *icon_path)
2739 return pkgmgr_client_usr_set_app_icon(pc, appid, icon_path, _getuid());
2742 API int pkgmgr_client_set_debug_mode(pkgmgr_client *pc, bool debug_mode)
2744 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2747 ERR("invalid parameter");
2748 return PKGMGR_R_EINVAL;
2751 client->debug_mode = debug_mode;
2756 API int pkgmgr_client_set_skip_optimization(pkgmgr_client *pc, bool skip_optimization)
2758 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2761 ERR("invalid parameter");
2762 return PKGMGR_R_EINVAL;
2765 client->skip_optimization = skip_optimization;
2770 API int pkgmgr_client_usr_migrate_external_image(pkgmgr_client *pc,
2771 const char *pkgid, uid_t uid)
2774 int ret = PKGMGR_R_ECOMM;
2775 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2778 ERR("invalid parameter");
2779 return PKGMGR_R_EINVAL;
2782 ret = pkgmgr_client_connection_send_request(client,
2783 "migrate_external_image",
2784 g_variant_new("(us)", uid, pkgid), &result);
2785 if (ret != PKGMGR_R_OK) {
2786 ERR("request failed: %d", ret);
2790 g_variant_get(result, "(i)", &ret);
2791 g_variant_unref(result);
2796 API int pkgmgr_client_add_res_copy_path(pkgmgr_client *pc,
2797 const char *src_path, const char *dest_path)
2799 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2801 if (pc == NULL || src_path == NULL) {
2802 ERR("invalid parameter");
2803 return PKGMGR_R_EINVAL;
2806 if (client->res_copy_builder == NULL) {
2807 client->res_copy_builder =
2808 g_variant_builder_new(G_VARIANT_TYPE("a(ss)"));
2809 if (client->res_copy_builder == NULL) {
2810 ERR("out of memory");
2811 return PKGMGR_R_ENOMEM;
2815 g_variant_builder_add(client->res_copy_builder, "(ss)",
2816 src_path, dest_path ? dest_path : "");
2821 API int pkgmgr_client_res_copy(pkgmgr_client *pc,
2822 pkgmgr_res_copy_handler event_cb, void *user_data)
2826 char *req_key = NULL;
2827 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2828 struct cb_info *cb_info;
2830 if (pc == NULL || event_cb == NULL) {
2831 ERR("invalid parameter");
2832 return PKGMGR_R_EINVAL;
2835 ret = pkgmgr_client_connection_send_request(client,
2837 g_variant_new("(a(ss))",
2838 client->res_copy_builder), &result);
2839 if (ret != PKGMGR_R_OK) {
2840 ERR("request failed: %d", ret);
2844 g_variant_get(result, "(i&s)", &ret, &req_key);
2845 if (req_key == NULL) {
2846 g_variant_unref(result);
2847 return PKGMGR_R_ECOMM;
2849 if (ret != PKGMGR_R_OK) {
2850 g_variant_unref(result);
2854 cb_info = __create_res_copy_event_cb_info(client,
2855 event_cb, user_data, req_key);
2856 g_variant_unref(result);
2857 if (cb_info == NULL)
2858 return PKGMGR_R_ENOMEM;
2860 ret = pkgmgr_client_connection_set_callback(client, cb_info);
2861 if (ret != PKGMGR_R_OK) {
2862 __free_cb_info(cb_info);
2865 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
2867 return cb_info->req_id;
2870 API int pkgmgr_client_add_res_remove_path(pkgmgr_client *pc,
2871 const char *res_path)
2873 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2875 if (pc == NULL || res_path == NULL) {
2876 ERR("invalid parameter");
2877 return PKGMGR_R_EINVAL;
2880 if (client->res_remove_builder == NULL) {
2881 client->res_remove_builder =
2882 g_variant_builder_new(G_VARIANT_TYPE("as"));
2883 if (client->res_remove_builder == NULL) {
2884 ERR("out of memory");
2885 return PKGMGR_R_ENOMEM;
2889 g_variant_builder_add(client->res_remove_builder, "s", res_path);
2894 API int pkgmgr_client_res_remove(pkgmgr_client *pc,
2895 pkgmgr_res_copy_handler event_cb, void *user_data)
2899 char *req_key = NULL;
2900 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2901 struct cb_info *cb_info;
2903 if (pc == NULL || event_cb == NULL) {
2904 ERR("invalid parameter");
2905 return PKGMGR_R_EINVAL;
2908 ret = pkgmgr_client_connection_send_request(client,
2910 g_variant_new("(as)",
2911 client->res_remove_builder), &result);
2912 if (ret != PKGMGR_R_OK) {
2913 ERR("request failed: %d", ret);
2917 g_variant_get(result, "(i&s)", &ret, &req_key);
2918 if (req_key == NULL) {
2919 g_variant_unref(result);
2920 return PKGMGR_R_ECOMM;
2922 if (ret != PKGMGR_R_OK) {
2923 g_variant_unref(result);
2927 cb_info = __create_res_copy_event_cb_info(client,
2928 event_cb, user_data, req_key);
2929 g_variant_unref(result);
2930 if (cb_info == NULL)
2931 return PKGMGR_R_ENOMEM;
2933 ret = pkgmgr_client_connection_set_callback(client, cb_info);
2934 if (ret != PKGMGR_R_OK) {
2935 __free_cb_info(cb_info);
2938 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
2940 return cb_info->req_id;
2943 API int pkgmgr_client_res_uninstall(pkgmgr_client *pc, const char *pkgid,
2944 pkgmgr_res_copy_handler event_cb, void *user_data)
2946 return pkgmgr_client_res_usr_uninstall(pc, pkgid, event_cb,
2947 user_data, _getuid());
2950 API int pkgmgr_client_res_usr_uninstall(pkgmgr_client *pc, const char *pkgid,
2951 pkgmgr_res_copy_handler event_cb, void *user_data, uid_t uid)
2954 int ret = PKGMGR_R_ECOMM;
2955 char *req_key = NULL;
2956 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2957 struct cb_info *cb_info;
2959 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
2960 ERR("invalid parameter");
2961 return PKGMGR_R_EINVAL;
2964 ret = pkgmgr_client_connection_send_request(client,
2966 g_variant_new("(us)", uid, pkgid), &result);
2967 if (ret != PKGMGR_R_OK) {
2968 ERR("request failed: %d", ret);
2972 g_variant_get(result, "(i&s)", &ret, &req_key);
2973 if (req_key == NULL) {
2974 g_variant_unref(result);
2975 return PKGMGR_R_ECOMM;
2977 if (ret != PKGMGR_R_OK) {
2978 g_variant_unref(result);
2982 cb_info = __create_res_copy_event_cb_info(client,
2983 event_cb, user_data, req_key);
2984 g_variant_unref(result);
2985 if (cb_info == NULL)
2986 return PKGMGR_R_ENOMEM;
2988 ret = pkgmgr_client_connection_set_callback(client, cb_info);
2989 if (ret != PKGMGR_R_OK) {
2990 __free_cb_info(cb_info);
2993 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
2995 return cb_info->req_id;
2998 API pkgmgr_res_event_info *pkgmgr_res_event_info_new()
3000 pkgmgr_res_event_info_t *info;
3002 info = calloc(1, sizeof(pkgmgr_res_event_info_t));
3004 ERR("out of memory");
3008 return (pkgmgr_res_event_info *)info;
3011 API int pkgmgr_res_event_info_free(pkgmgr_res_event_info *info)
3013 pkgmgr_res_event_info_t *event_info =
3014 (pkgmgr_res_event_info_t *)info;
3016 if (event_info == NULL) {
3017 ERR("invalid argument");
3018 return PKGMGR_R_EINVAL;
3026 API int pkgmgr_res_event_info_set_error_code(pkgmgr_res_event_info *handle, int error_code)
3028 pkgmgr_res_event_info_t *info = handle;
3030 ERR("invalid parameter");
3031 return PKGMGR_R_EINVAL;
3034 info->error_code = error_code;
3038 API int pkgmgr_res_event_info_get_error_code(pkgmgr_res_event_info *handle, int *error_code)
3040 pkgmgr_res_event_info_t *info = handle;
3041 if (info == NULL || error_code == NULL) {
3042 ERR("invalid parameter");
3043 return PKGMGR_R_EINVAL;
3046 *error_code = info->error_code;