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.
35 #include <pkgmgr-info.h>
36 #include <iniparser.h>
37 /* For multi-user support */
38 #include <tzplatform_config.h>
40 #include "package-manager.h"
41 #include "pkgmgr_client_debug.h"
42 #include "pkgmgr_client_internal.h"
44 /* API export macro */
46 #define API __attribute__ ((visibility("default")))
49 #define PKG_TMP_PATH tzplatform_mkpath(TZ_USER_APP, "tmp")
51 #define BINSH_NAME "/bin/sh"
54 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
55 #define REGULAR_USER 5000
57 static inline uid_t _getuid(void)
61 if (uid < REGULAR_USER)
67 static int _get_request_id()
69 static int internal_req_id = 1;
71 return internal_req_id++;
74 static struct cb_info *__create_event_cb_info(struct pkgmgr_client_t *client,
75 pkgmgr_handler event_cb, void *data, const char *req_key)
77 struct cb_info *cb_info;
79 cb_info = calloc(1, sizeof(struct cb_info));
80 if (cb_info == NULL) {
84 cb_info->client = client;
85 cb_info->event_cb = event_cb;
87 cb_info->req_id = _get_request_id();
88 if (req_key != NULL) {
89 cb_info->req_key = strdup(req_key);
90 if (cb_info->req_key == NULL) {
100 static struct cb_info *__create_app_event_cb_info(
101 struct pkgmgr_client_t *client, pkgmgr_app_handler app_event_cb,
102 void *data, const char *req_key)
104 struct cb_info *cb_info;
106 cb_info = calloc(1, sizeof(struct cb_info));
107 if (cb_info == NULL) {
108 ERR("out of memory");
111 cb_info->client = client;
112 cb_info->app_event_cb = app_event_cb;
113 cb_info->data = data;
114 cb_info->req_id = _get_request_id();
115 if (req_key != NULL) {
116 cb_info->req_key = strdup(req_key);
117 if (cb_info->req_key == NULL) {
118 ERR("out of memory");
127 static struct cb_info *__create_size_info_cb_info(
128 struct pkgmgr_client_t *client,
129 pkgmgr_pkg_size_info_receive_cb size_info_cb,
130 void *data, const char *req_key)
132 struct cb_info *cb_info;
134 cb_info = calloc(1, sizeof(struct cb_info));
135 if (cb_info == NULL) {
136 ERR("out of memory");
139 cb_info->client = client;
140 cb_info->size_info_cb = size_info_cb;
141 cb_info->data = data;
142 cb_info->req_id = _get_request_id();
143 if (req_key != NULL) {
144 cb_info->req_key = strdup(req_key);
145 if (cb_info->req_key == NULL) {
146 ERR("out of memory");
155 static void __free_cb_info(struct cb_info *cb_info)
157 free(cb_info->req_key);
161 static int __sync_process(const char *req_key)
164 char info_file[PKG_STRING_LEN_MAX] = {'\0', };
168 char buf[PKG_STRING_LEN_MAX] = {0, };
170 snprintf(info_file, PKG_STRING_LEN_MAX, "%s/%s", PKG_SIZE_INFO_PATH, req_key);
174 if (access(info_file, F_OK) == 0) {
175 fp = fopen(info_file, "r");
177 DBG("file is not generated yet.... wait\n");
178 usleep(100 * 1000); /* 100ms sleep*/
182 if (fgets(buf, PKG_STRING_LEN_MAX, fp) == NULL) {
183 ERR("failed to read info file");
189 DBG("info_file file is generated, result = %s. \n", buf);
194 DBG("file is not generated yet.... wait\n");
195 usleep(100 * 1000); /* 100ms sleep*/
197 if (check_cnt > 6000) { /* 60s * 10 time over*/
198 ERR("wait time over!!\n");
203 ret = remove(info_file);
205 ERR("file is can not remove[%s, %d]\n", info_file, ret);
210 static int __get_size_process(pkgmgr_client *pc, const char *pkgid, uid_t uid,
211 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
215 int ret = PKGMGR_R_ECOMM;
216 char *req_key = NULL;
217 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
219 if (pc == NULL || pkgid == NULL) {
220 ERR("invalid parameter");
221 return PKGMGR_R_EINVAL;
224 if (client->pc_type != PC_REQUEST) {
225 ERR("client->pc_type is not PC_REQUEST");
226 return PKGMGR_R_EINVAL;
229 ret = pkgmgr_client_connection_send_request(client, "getsize",
230 g_variant_new("(usi)", uid, pkgid, get_type), &result);
231 if (ret != PKGMGR_R_OK) {
232 ERR("request failed: %d", ret);
236 g_variant_get(result, "(i&s)", &ret, &req_key);
237 if (req_key == NULL) {
238 g_variant_unref(result);
239 return PKGMGR_R_ECOMM;
241 if (ret != PKGMGR_R_OK) {
242 g_variant_unref(result);
246 ret = __sync_process(req_key);
248 ERR("get size failed, ret=%d\n", ret);
250 g_variant_unref(result);
255 static int __move_pkg_process(pkgmgr_client *pc, const char *pkgid,
256 const char *pkg_type, uid_t uid, pkgmgr_move_type move_type,
257 pkgmgr_handler event_cb, void *data)
261 ret = pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type, event_cb, data, uid);
263 ERR("move request failed");
270 static int __check_app_process(pkgmgr_request_service_type service_type,
271 pkgmgr_client *pc, const char *pkgid, uid_t uid, void *data)
274 int ret = PKGMGR_R_ECOMM;
275 pkgmgrinfo_pkginfo_h handle;
277 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
279 retvm_if(client->pc_type != PC_REQUEST, PKGMGR_R_EINVAL, "client->pc_type is not PC_REQUEST\n");
281 if (uid != GLOBAL_USER)
282 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
284 ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle);
285 retvm_if(ret < 0, PKGMGR_R_ERROR, "pkgmgrinfo_pkginfo_get_pkginfo failed");
287 if (service_type == PM_REQUEST_KILL_APP)
288 ret = pkgmgr_client_connection_send_request(client, "kill",
289 g_variant_new("(us)", uid, pkgid), &result);
290 else if (service_type == PM_REQUEST_CHECK_APP)
291 ret = pkgmgr_client_connection_send_request(client, "check",
292 g_variant_new("(us)", uid, pkgid), &result);
293 if (ret != PKGMGR_R_OK) {
294 ERR("request failed: %d", ret);
298 g_variant_get(result, "(ii)", &ret, &pid);
299 g_variant_unref(result);
300 if (ret != PKGMGR_R_OK) {
301 ERR("request failed, ret=%d", ret);
307 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
313 static int __request_size_info(pkgmgr_client *pc, uid_t uid)
316 int ret = PKGMGR_R_ECOMM;
317 // char *req_key = NULL;
318 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
321 ERR("invalid parameter");
322 return PKGMGR_R_EINVAL;
325 if (client->pc_type != PC_REQUEST) {
326 ERR("client->pc_type is not PC_REQUEST");
327 return PKGMGR_R_EINVAL;
330 ret = pkgmgr_client_connection_send_request(client, "getsize",
331 g_variant_new("(usi)", uid, "size_info",
332 PM_GET_SIZE_INFO), &result);
333 if (ret != PKGMGR_R_OK) {
334 ERR("request failed: %d", ret);
339 g_variant_get(result, "(i&s)", &ret, &req_key);
340 if (req_key == NULL) {
341 g_variant_unref(result);
342 return PKGMGR_R_ECOMM;
346 g_variant_unref(result);
351 API pkgmgr_client *pkgmgr_client_new(pkgmgr_client_type pc_type)
353 struct pkgmgr_client_t *client;
355 if (pc_type == PC_BROADCAST) {
356 ERR("broadcast type is not supported");
360 if (pc_type != PC_REQUEST && pc_type != PC_LISTENING) {
361 ERR("invalid parameter");
365 client = calloc(1, sizeof(struct pkgmgr_client_t));
366 if (client == NULL) {
367 ERR("out of memory");
371 client->pc_type = pc_type;
372 client->status_type = PKGMGR_CLIENT_STATUS_ALL;
374 if (pkgmgr_client_connection_connect(client))
377 return (pkgmgr_client *)client;
380 API int pkgmgr_client_free(pkgmgr_client *pc)
382 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
385 ERR("invalid argument");
386 return PKGMGR_R_EINVAL;
389 pkgmgr_client_remove_listen_status(client);
390 pkgmgr_client_connection_disconnect(client);
391 if (client->tep_path)
392 free(client->tep_path);
398 static char *__get_type_from_path(const char *pkg_path)
401 char mimetype[255] = { '\0', };
402 char extlist[256] = { '\0', };
405 ret = _get_mime_from_file(pkg_path, mimetype, sizeof(mimetype));
407 ERR("_get_mime_from_file() failed - error code[%d]\n", ret);
411 ret = _get_mime_extension(mimetype, extlist, sizeof(extlist));
413 ERR("_get_mime_extension() failed - error code[%d]\n", ret);
417 if (strlen(extlist) == 0)
420 if (strchr(extlist, ','))
421 extlist[strlen(extlist) - strlen(strchr(extlist, ','))] = '\0';
423 pkg_type = strchr(extlist, '.') + 1;
424 return strdup(pkg_type);
427 API int pkgmgr_client_set_tep_path(pkgmgr_client *pc, const char *tep_path,
430 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *) pc;
432 if (pc == NULL || tep_path == NULL) {
433 ERR("invalied parameter");
434 return PKGMGR_R_EINVAL;
437 if (client->tep_path)
438 free(client->tep_path);
440 client->tep_path = strdup(tep_path);
441 client->tep_move = tep_move;
446 API int pkgmgr_client_usr_install(pkgmgr_client *pc, const char *pkg_type,
447 const char *descriptor_path, const char *pkg_path,
448 const char *optional_data, pkgmgr_mode mode,
449 pkgmgr_handler event_cb, void *data, uid_t uid)
452 int ret = PKGMGR_R_ECOMM;
453 char *req_key = NULL;
454 GVariantBuilder *builder = NULL;
455 GVariant *args = NULL;
456 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
457 char *pkgtype = NULL;
458 struct cb_info *cb_info;
460 if (pc == NULL || pkg_path == NULL) {
461 ERR("invalid parameter");
462 return PKGMGR_R_EINVAL;
465 if (client->pc_type != PC_REQUEST) {
466 ERR("client type is not PC_REQUEST");
467 return PKGMGR_R_EINVAL;
470 if (access(pkg_path, F_OK) != 0) {
471 ERR("failed to access: %s", pkg_path);
472 return PKGMGR_R_EINVAL;
475 if (client->tep_path != NULL && access(client->tep_path, F_OK) != 0) {
476 ERR("failed to access: %s", client->tep_path);
477 return PKGMGR_R_EINVAL;
481 pkgtype = strdup(pkg_type);
483 /* build arguments */
484 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
485 if (client->tep_path) {
486 g_variant_builder_add(builder, "s", "-e");
487 g_variant_builder_add(builder, "s", client->tep_path);
488 g_variant_builder_add(builder, "s", "-M");
489 /* TODO: revise tep_move */
490 g_variant_builder_add(builder, "s",
491 client->tep_move ? "tep_move" : "tep_copy");
494 args = g_variant_new("as", builder);
495 g_variant_builder_unref(builder);
497 ret = pkgmgr_client_connection_send_request(client, "install",
498 g_variant_new("(uss@as)", uid, pkgtype, pkg_path, args),
500 if (ret != PKGMGR_R_OK) {
501 ERR("request failed: %d", ret);
505 g_variant_get(result, "(i&s)", &ret, &req_key);
506 if (req_key == NULL) {
507 g_variant_unref(result);
508 return PKGMGR_R_ECOMM;
510 if (ret != PKGMGR_R_OK) {
511 g_variant_unref(result);
515 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
516 if (cb_info == NULL) {
517 g_variant_unref(result);
518 return PKGMGR_R_ENOMEM;
520 g_variant_unref(result);
521 ret = pkgmgr_client_connection_set_callback(client, cb_info);
522 if (ret != PKGMGR_R_OK) {
523 __free_cb_info(cb_info);
526 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
528 return cb_info->req_id;
531 API int pkgmgr_client_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)
536 return pkgmgr_client_usr_install(pc, pkg_type, descriptor_path,
537 pkg_path, optional_data, mode, event_cb, data,
541 API int pkgmgr_client_reinstall(pkgmgr_client *pc, const char *pkg_type,
542 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
543 pkgmgr_handler event_cb, void *data)
545 return pkgmgr_client_usr_reinstall(pc, pkg_type, pkgid, optional_data,
546 mode, event_cb, data, _getuid());
549 API int pkgmgr_client_usr_reinstall(pkgmgr_client *pc, const char *pkg_type,
550 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
551 pkgmgr_handler event_cb, void *data, uid_t uid)
554 int ret = PKGMGR_R_ECOMM;
555 char *req_key = NULL;
556 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
557 struct cb_info *cb_info;
559 if (pc == NULL || pkgid == NULL) {
560 ERR("invalid parameter");
561 return PKGMGR_R_EINVAL;
564 if (client->pc_type != PC_REQUEST) {
565 ERR("client->pc_type is not PC_REQUEST");
566 return PKGMGR_R_EINVAL;
569 ret = pkgmgr_client_connection_send_request(client, "reinstall",
570 g_variant_new("(us)", uid, pkgid), &result);
571 if (ret != PKGMGR_R_OK) {
572 ERR("request failed: %d", ret);
576 g_variant_get(result, "(i&s)", &ret, &req_key);
577 if (req_key == NULL) {
578 g_variant_unref(result);
579 return PKGMGR_R_ECOMM;
581 if (ret != PKGMGR_R_OK) {
582 g_variant_unref(result);
586 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
587 if (cb_info == NULL) {
588 g_variant_unref(result);
589 return PKGMGR_R_ENOMEM;
591 g_variant_unref(result);
592 ret = pkgmgr_client_connection_set_callback(client, cb_info);
593 if (ret != PKGMGR_R_OK) {
594 __free_cb_info(cb_info);
597 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
599 return cb_info->req_id;
602 API int pkgmgr_client_usr_mount_install(pkgmgr_client *pc, const char *pkg_type,
603 const char *descriptor_path, const char *pkg_path,
604 const char *optional_data, pkgmgr_mode mode,
605 pkgmgr_handler event_cb, void *data, uid_t uid)
608 int ret = PKGMGR_R_ECOMM;
609 char *req_key = NULL;
610 GVariantBuilder *builder = NULL;
611 GVariant *args = NULL;
612 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
613 char *pkgtype = NULL;
614 struct cb_info *cb_info;
616 if (pc == NULL || pkg_path == NULL) {
617 ERR("invalid parameter");
618 return PKGMGR_R_EINVAL;
621 if (client->pc_type != PC_REQUEST) {
622 ERR("client->pc_type is not PC_REQUEST");
623 return PKGMGR_R_EINVAL;
626 if (access(pkg_path, F_OK) != 0) {
627 ERR("failed to access: %s", pkg_path);
628 return PKGMGR_R_EINVAL;
631 if (client->tep_path != NULL && access(client->tep_path, F_OK) != 0) {
632 ERR("failed to access: %s", client->tep_path);
633 return PKGMGR_R_EINVAL;
637 pkgtype = strdup(pkg_type);
639 /* build arguments */
640 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
641 if (client->tep_path) {
642 g_variant_builder_add(builder, "s", "-e");
643 g_variant_builder_add(builder, "s", client->tep_path);
644 g_variant_builder_add(builder, "s", "-M");
645 /* TODO: revise tep_move */
646 g_variant_builder_add(builder, "s",
647 client->tep_move ? "tep_move" : "tep_copy");
650 args = g_variant_new("as", builder);
651 g_variant_builder_unref(builder);
653 ret = pkgmgr_client_connection_send_request(client, "mount_install",
654 g_variant_new("(uss@as)", uid, pkgtype, pkg_path, args),
656 if (ret != PKGMGR_R_OK) {
657 ERR("request failed: %d", ret);
661 g_variant_get(result, "(i&s)", &ret, &req_key);
662 if (req_key == NULL) {
663 g_variant_unref(result);
664 return PKGMGR_R_ECOMM;
666 if (ret != PKGMGR_R_OK) {
667 g_variant_unref(result);
671 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
672 if (cb_info == NULL) {
673 g_variant_unref(result);
674 return PKGMGR_R_ENOMEM;
676 g_variant_unref(result);
677 ret = pkgmgr_client_connection_set_callback(client, cb_info);
678 if (ret != PKGMGR_R_OK) {
679 __free_cb_info(cb_info);
682 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
684 return cb_info->req_id;
687 API int pkgmgr_client_mount_install(pkgmgr_client *pc, const char *pkg_type,
688 const char *descriptor_path, const char *pkg_path,
689 const char *optional_data, pkgmgr_mode mode,
690 pkgmgr_handler event_cb, void *data)
692 return pkgmgr_client_usr_mount_install(pc, pkg_type, descriptor_path,
693 pkg_path, optional_data, mode, event_cb, data,
697 API int pkgmgr_client_uninstall(pkgmgr_client *pc, const char *pkg_type,
698 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
701 return pkgmgr_client_usr_uninstall(pc, pkg_type, pkgid, mode, event_cb,
705 API int pkgmgr_client_usr_uninstall(pkgmgr_client *pc, const char *pkg_type,
706 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
707 void *data, uid_t uid)
710 int ret = PKGMGR_R_ECOMM;
711 char *req_key = NULL;
712 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
713 struct cb_info *cb_info;
715 if (pc == NULL || pkgid == NULL) {
716 ERR("invalid parameter");
717 return PKGMGR_R_EINVAL;
720 if (client->pc_type != PC_REQUEST) {
721 ERR("client->pc_type is not PC_REQUEST");
722 return PKGMGR_R_EINVAL;
725 ret = pkgmgr_client_connection_send_request(client, "uninstall",
726 g_variant_new("(us)", uid, pkgid), &result);
727 if (ret != PKGMGR_R_OK) {
728 ERR("request failed: %d", ret);
732 g_variant_get(result, "(i&s)", &ret, &req_key);
733 if (req_key == NULL) {
734 g_variant_unref(result);
735 return PKGMGR_R_ECOMM;
737 if (ret != PKGMGR_R_OK) {
738 g_variant_unref(result);
742 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
743 if (cb_info == NULL) {
744 g_variant_unref(result);
745 return PKGMGR_R_ENOMEM;
747 g_variant_unref(result);
748 ret = pkgmgr_client_connection_set_callback(client, cb_info);
749 if (ret != PKGMGR_R_OK) {
750 __free_cb_info(cb_info);
753 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
755 return cb_info->req_id;
758 API int pkgmgr_client_move(pkgmgr_client *pc, const char *pkg_type,
759 const char *pkgid, pkgmgr_move_type move_type,
760 pkgmgr_handler event_cb, void *data)
762 return pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type,
763 event_cb, data, _getuid());
765 API int pkgmgr_client_usr_move(pkgmgr_client *pc, const char *pkg_type,
766 const char *pkgid, pkgmgr_move_type move_type,
767 pkgmgr_handler event_cb, void *data, uid_t uid)
770 int ret = PKGMGR_R_ECOMM;
771 char *req_key = NULL;
772 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
773 struct cb_info *cb_info;
775 if (pc == NULL || pkgid == NULL) {
776 ERR("invalid parameter");
777 return PKGMGR_R_EINVAL;
780 if ((move_type < PM_MOVE_TO_INTERNAL) ||
781 (move_type > PM_MOVE_TO_SDCARD))
782 return PKGMGR_R_EINVAL;
784 if (client->pc_type != PC_REQUEST) {
785 ERR("client->pc_type is not PC_REQUEST");
786 return PKGMGR_R_EINVAL;
789 ret = pkgmgr_client_connection_send_request(client, "move",
790 g_variant_new("(usi)", uid, pkgid, move_type), &result);
791 if (ret != PKGMGR_R_OK) {
792 ERR("request failed: %d", ret);
796 g_variant_get(result, "(i&s)", &ret, &req_key);
797 if (req_key == NULL) {
798 g_variant_unref(result);
799 return PKGMGR_R_ECOMM;
801 if (ret != PKGMGR_R_OK) {
802 g_variant_unref(result);
806 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
807 if (cb_info == NULL) {
808 g_variant_unref(result);
809 return PKGMGR_R_ERROR;
811 g_variant_unref(result);
812 ret = pkgmgr_client_connection_set_callback(client, cb_info);
813 if (ret != PKGMGR_R_OK) {
814 __free_cb_info(cb_info);
817 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
819 return cb_info->req_id;
822 API int pkgmgr_client_usr_activate(pkgmgr_client *pc, const char *pkg_type,
823 const char *pkgid, uid_t uid)
826 int ret = PKGMGR_R_ECOMM;
827 GVariantBuilder *builder;
828 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
830 if (pc == NULL || pkgid == NULL) {
831 ERR("invalid parameter");
832 return PKGMGR_R_EINVAL;
835 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
836 g_variant_builder_add(builder, "s", pkgid);
838 ret = pkgmgr_client_connection_send_request(client, "enable_pkgs",
839 g_variant_new("(uas)", uid, builder), &result);
840 g_variant_builder_unref(builder);
841 if (ret != PKGMGR_R_OK) {
842 ERR("request failed: %d", ret);
846 g_variant_get(result, "(is)", &ret, NULL);
847 g_variant_unref(result);
852 API int pkgmgr_client_activate(pkgmgr_client *pc, const char *pkg_type,
855 return pkgmgr_client_usr_activate(pc, pkg_type, pkgid, _getuid());
858 API int pkgmgr_client_usr_activate_packages(pkgmgr_client *pc,
859 const char *pkg_type, const char **pkgids, int n_pkgs,
860 pkgmgr_handler event_cb, void *data, uid_t uid)
863 GVariantBuilder *builder;
864 int ret = PKGMGR_R_ECOMM;
865 char *req_key = NULL;
866 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
867 struct cb_info *cb_info;
870 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
871 ERR("invalid parameter");
872 return PKGMGR_R_EINVAL;
875 if (client->pc_type != PC_REQUEST) {
876 ERR("client type is not PC_REQUEST");
877 return PKGMGR_R_EINVAL;
880 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
881 for (i = 0; i < n_pkgs; i++)
882 g_variant_builder_add(builder, "s", pkgids[i]);
884 ret = pkgmgr_client_connection_send_request(client, "enable_pkgs",
885 g_variant_new("(uas)", uid, builder), &result);
886 g_variant_builder_unref(builder);
887 if (ret != PKGMGR_R_OK) {
888 ERR("request failed: %d", ret);
892 g_variant_get(result, "(i&s)", &ret, &req_key);
893 if (req_key == NULL) {
894 g_variant_unref(result);
895 return PKGMGR_R_ECOMM;
897 if (ret != PKGMGR_R_OK) {
898 g_variant_unref(result);
902 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
903 if (cb_info == NULL) {
904 g_variant_unref(result);
905 return PKGMGR_R_ERROR;
907 g_variant_unref(result);
908 ret = pkgmgr_client_connection_set_callback(client, cb_info);
909 if (ret != PKGMGR_R_OK) {
910 __free_cb_info(cb_info);
913 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
915 return cb_info->req_id;
918 API int pkgmgr_client_activate_packages(pkgmgr_client *pc,
919 const char *pkg_type, const char **pkgids, int n_pkgs,
920 pkgmgr_handler event_cb, void *data)
922 return pkgmgr_client_usr_activate_packages(pc, pkg_type,
923 pkgids, n_pkgs, event_cb, data, _getuid());
926 API int pkgmgr_client_usr_deactivate(pkgmgr_client *pc, const char *pkg_type,
927 const char *pkgid, uid_t uid)
930 GVariantBuilder *builder;
931 int ret = PKGMGR_R_ECOMM;
932 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
934 if (pc == NULL || pkgid == NULL) {
935 ERR("invalid parameter");
936 return PKGMGR_R_EINVAL;
939 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
940 g_variant_builder_add(builder, "s", pkgid);
942 ret = pkgmgr_client_connection_send_request(client, "disable_pkgs",
943 g_variant_new("(uas)", uid, builder), &result);
944 g_variant_builder_unref(builder);
945 if (ret != PKGMGR_R_OK) {
946 ERR("request failed: %d", ret);
950 g_variant_get(result, "(is)", &ret, NULL);
951 g_variant_unref(result);
956 API int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type,
959 return pkgmgr_client_usr_deactivate(pc, pkg_type, pkgid, _getuid());
962 API int pkgmgr_client_usr_deactivate_packages(pkgmgr_client *pc,
963 const char *pkg_type, const char **pkgids, int n_pkgs,
964 pkgmgr_handler event_cb, void *data, uid_t uid)
967 GVariantBuilder *builder;
968 int ret = PKGMGR_R_ECOMM;
969 char *req_key = NULL;
970 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
971 struct cb_info *cb_info;
974 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
975 ERR("invalid parameter");
976 return PKGMGR_R_EINVAL;
979 if (client->pc_type != PC_REQUEST) {
980 ERR("client type is not PC_REQUEST");
981 return PKGMGR_R_EINVAL;
984 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
985 for (i = 0; i < n_pkgs; i++)
986 g_variant_builder_add(builder, "s", pkgids[i]);
988 ret = pkgmgr_client_connection_send_request(client, "disable_pkgs",
989 g_variant_new("(uas)", uid, builder), &result);
990 g_variant_builder_unref(builder);
991 if (ret != PKGMGR_R_OK) {
992 ERR("request failed: %d", ret);
996 g_variant_get(result, "(i&s)", &ret, &req_key);
997 if (req_key == NULL) {
998 g_variant_unref(result);
999 return PKGMGR_R_ECOMM;
1001 if (ret != PKGMGR_R_OK) {
1002 g_variant_unref(result);
1006 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1007 if (cb_info == NULL) {
1008 g_variant_unref(result);
1009 return PKGMGR_R_ERROR;
1011 g_variant_unref(result);
1012 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1013 if (ret != PKGMGR_R_OK) {
1014 __free_cb_info(cb_info);
1017 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1019 return cb_info->req_id;
1022 API int pkgmgr_client_deactivate_packages(pkgmgr_client *pc,
1023 const char *pkg_type, const char **pkgids, int n_pkgs,
1024 pkgmgr_handler event_cb, void *data)
1026 return pkgmgr_client_usr_deactivate_packages(pc, pkg_type,
1027 pkgids, n_pkgs, event_cb, data, _getuid());
1030 API int pkgmgr_client_usr_activate_app(pkgmgr_client *pc, const char *appid,
1031 pkgmgr_app_handler app_event_cb, uid_t uid)
1034 int ret = PKGMGR_R_ECOMM;
1035 char *req_key = NULL;
1036 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1037 struct cb_info *cb_info;
1039 if (pc == NULL || appid == NULL) {
1040 ERR("invalid parameter");
1041 return PKGMGR_R_EINVAL;
1044 ret = pkgmgr_client_connection_send_request(client, "enable_app",
1045 g_variant_new("(us)", uid, appid), &result);
1046 if (ret != PKGMGR_R_OK) {
1047 ERR("request failed: %d", ret);
1051 g_variant_get(result, "(i&s)", &ret, &req_key);
1052 if (req_key == NULL) {
1053 g_variant_unref(result);
1054 return PKGMGR_R_ECOMM;
1056 if (ret != PKGMGR_R_OK) {
1057 g_variant_unref(result);
1061 cb_info = __create_app_event_cb_info(client, app_event_cb, NULL,
1063 if (cb_info == NULL) {
1064 g_variant_unref(result);
1065 return PKGMGR_R_ENOMEM;
1067 g_variant_unref(result);
1068 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1069 if (ret != PKGMGR_R_OK) {
1070 __free_cb_info(cb_info);
1073 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1078 API int pkgmgr_client_activate_app(pkgmgr_client *pc, const char *appid,
1079 pkgmgr_app_handler app_event_cb)
1081 return pkgmgr_client_usr_activate_app(pc, appid, app_event_cb,
1085 API int pkgmgr_client_activate_global_app_for_uid(pkgmgr_client *pc,
1086 const char *appid, pkgmgr_app_handler app_event_cb, uid_t uid)
1089 int ret = PKGMGR_R_ECOMM;
1090 char *req_key = NULL;
1091 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1092 struct cb_info *cb_info;
1094 if (pc == NULL || appid == NULL) {
1095 ERR("invalid parameter");
1096 return PKGMGR_R_EINVAL;
1099 ret = pkgmgr_client_connection_send_request(client,
1100 "enable_global_app_for_uid",
1101 g_variant_new("(us)", uid, appid), &result);
1102 if (ret != PKGMGR_R_OK) {
1103 ERR("request failed: %d", ret);
1107 g_variant_get(result, "(i&s)", &ret, &req_key);
1108 if (req_key == NULL) {
1109 g_variant_unref(result);
1110 return PKGMGR_R_ECOMM;
1112 if (ret != PKGMGR_R_OK) {
1113 g_variant_unref(result);
1117 cb_info = __create_app_event_cb_info(client, app_event_cb, NULL,
1119 if (cb_info == NULL) {
1120 g_variant_unref(result);
1121 return PKGMGR_R_ENOMEM;
1123 g_variant_unref(result);
1124 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1125 if (ret != PKGMGR_R_OK) {
1126 __free_cb_info(cb_info);
1129 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1134 API int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid,
1135 pkgmgr_app_handler app_event_cb, uid_t uid)
1138 int ret = PKGMGR_R_ECOMM;
1139 char *req_key = NULL;
1140 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1141 struct cb_info *cb_info;
1143 if (pc == NULL || appid == NULL) {
1144 ERR("invalid parameter");
1145 return PKGMGR_R_EINVAL;
1148 ret = pkgmgr_client_connection_send_request(client, "disable_app",
1149 g_variant_new("(us)", uid, appid), &result);
1150 if (ret != PKGMGR_R_OK) {
1151 ERR("request failed: %d", ret);
1155 g_variant_get(result, "(i&s)", &ret, &req_key);
1156 if (req_key == NULL) {
1157 g_variant_unref(result);
1158 return PKGMGR_R_ECOMM;
1160 if (ret != PKGMGR_R_OK) {
1161 g_variant_unref(result);
1165 cb_info = __create_app_event_cb_info(client, app_event_cb, NULL,
1167 if (cb_info == NULL) {
1168 g_variant_unref(result);
1169 return PKGMGR_R_ENOMEM;
1171 g_variant_unref(result);
1172 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1173 if (ret != PKGMGR_R_OK) {
1174 __free_cb_info(cb_info);
1177 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1182 API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid,
1183 pkgmgr_app_handler app_event_cb)
1185 return pkgmgr_client_usr_deactivate_app(pc, appid, app_event_cb,
1189 API int pkgmgr_client_deactivate_global_app_for_uid(pkgmgr_client *pc,
1190 const char *appid, pkgmgr_app_handler app_event_cb, uid_t uid)
1193 int ret = PKGMGR_R_ECOMM;
1194 char *req_key = NULL;
1195 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1196 struct cb_info *cb_info;
1198 if (pc == NULL || appid == NULL) {
1199 ERR("invalid parameter");
1200 return PKGMGR_R_EINVAL;
1203 ret = pkgmgr_client_connection_send_request(client,
1204 "disable_global_app_for_uid",
1205 g_variant_new("(us)", uid, appid), &result);
1206 if (ret != PKGMGR_R_OK) {
1207 ERR("request failed: %d", ret);
1211 g_variant_get(result, "(i&s)", &ret, &req_key);
1212 if (req_key == NULL) {
1213 g_variant_unref(result);
1214 return PKGMGR_R_ECOMM;
1216 if (ret != PKGMGR_R_OK) {
1217 g_variant_unref(result);
1221 cb_info = __create_app_event_cb_info(client, app_event_cb, NULL,
1223 if (cb_info == NULL) {
1224 g_variant_unref(result);
1225 return PKGMGR_R_ENOMEM;
1227 g_variant_unref(result);
1228 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1229 if (ret != PKGMGR_R_OK) {
1230 __free_cb_info(cb_info);
1233 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1238 API int pkgmgr_client_usr_clear_user_data(pkgmgr_client *pc,
1239 const char *pkg_type, const char *appid, pkgmgr_mode mode,
1244 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1246 if (pc == NULL || appid == NULL) {
1247 ERR("invalid parameter");
1248 return PKGMGR_R_EINVAL;
1251 if (client->pc_type != PC_REQUEST) {
1252 ERR("client->pc_type is not PC_REQUEST");
1253 return PKGMGR_R_EINVAL;
1256 ret = pkgmgr_client_connection_send_request(client, "cleardata",
1257 g_variant_new("(us)", uid, appid), &result);
1258 if (ret == PKGMGR_R_OK) {
1259 ERR("request failed: %d", ret);
1263 g_variant_get(result, "(i)", &ret);
1264 g_variant_unref(result);
1269 API int pkgmgr_client_clear_user_data(pkgmgr_client *pc, const char *pkg_type,
1270 const char *appid, pkgmgr_mode mode)
1272 return pkgmgr_client_usr_clear_user_data(pc, pkg_type, appid, mode,
1276 API int pkgmgr_client_set_status_type(pkgmgr_client *pc, int status_type)
1278 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1281 ERR("invalid parameter");
1282 return PKGMGR_R_EINVAL;
1285 client->status_type = status_type;
1290 API int pkgmgr_client_listen_status(pkgmgr_client *pc, pkgmgr_handler event_cb,
1294 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1295 struct cb_info *cb_info;
1297 if (pc == NULL || event_cb == NULL) {
1298 ERR("invalid parameter");
1299 return PKGMGR_R_EINVAL;
1302 if (client->pc_type != PC_LISTENING) {
1303 ERR("client->pc_type is not PC_LISTENING");
1304 return PKGMGR_R_EINVAL;
1307 cb_info = __create_event_cb_info(client, event_cb, data, NULL);
1308 if (cb_info == NULL)
1309 return PKGMGR_R_ENOMEM;
1310 cb_info->status_type = client->status_type;
1311 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1312 if (ret != PKGMGR_R_OK) {
1313 __free_cb_info(cb_info);
1316 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1318 return cb_info->req_id;
1321 API int pkgmgr_client_listen_app_status(pkgmgr_client *pc,
1322 pkgmgr_app_handler app_event_cb, void *data)
1325 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1326 struct cb_info *cb_info;
1328 if (pc == NULL || app_event_cb == NULL) {
1329 ERR("invalid parameter");
1330 return PKGMGR_R_EINVAL;
1333 if (client->pc_type != PC_LISTENING) {
1334 ERR("client->pc_type is not PC_LISTENING");
1335 return PKGMGR_R_EINVAL;
1338 cb_info = __create_app_event_cb_info(client, app_event_cb, data, NULL);
1339 if (cb_info == NULL)
1340 return PKGMGR_R_ENOMEM;
1341 cb_info->status_type = client->status_type;
1342 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1343 if (ret != PKGMGR_R_OK) {
1344 __free_cb_info(cb_info);
1347 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1349 return cb_info->req_id;
1352 API int pkgmgr_client_remove_listen_status(pkgmgr_client *pc)
1354 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1357 struct cb_info *cb_info;
1360 ERR("invalid parameter");
1361 return PKGMGR_R_EINVAL;
1364 /* unset all callback */
1365 tmp = client->cb_info_list;
1366 while (tmp != NULL) {
1368 cb_info = (struct cb_info *)tmp->data;
1369 pkgmgr_client_connection_unset_callback(pc, cb_info);
1370 client->cb_info_list = g_list_delete_link(client->cb_info_list,
1372 __free_cb_info(cb_info);
1379 API int pkgmgr_client_broadcast_status(pkgmgr_client *pc, const char *pkg_type,
1380 const char *pkgid, const char *key, const char *val)
1382 /* client cannot broadcast signal */
1386 /* TODO: deprecate(or remove) */
1387 API int pkgmgr_client_request_service(pkgmgr_request_service_type service_type,
1388 int service_mode, pkgmgr_client *pc, const char *pkg_type,
1389 const char *pkgid, const char *custom_info,
1390 pkgmgr_handler event_cb, void *data)
1392 return pkgmgr_client_usr_request_service(service_type, service_mode,
1393 pc, pkg_type, pkgid, _getuid(), custom_info, event_cb,
1397 API int pkgmgr_client_usr_request_service(
1398 pkgmgr_request_service_type service_type, int service_mode,
1399 pkgmgr_client *pc, const char *pkg_type, const char *pkgid,
1400 uid_t uid, const char *custom_info, pkgmgr_handler event_cb,
1405 /* Check for NULL value of service type */
1406 retvm_if(service_type > PM_REQUEST_MAX, PKGMGR_R_EINVAL, "service type is not defined\n");
1407 retvm_if(service_type < 0, PKGMGR_R_EINVAL, "service type is error\n");
1409 switch (service_type) {
1410 case PM_REQUEST_MOVE:
1411 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1412 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1413 tryvm_if((service_mode < PM_MOVE_TO_INTERNAL) || (service_mode > PM_MOVE_TO_SDCARD), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1415 ret = __move_pkg_process(pc, pkgid, pkg_type, uid, (pkgmgr_move_type)service_mode, event_cb, data);
1418 case PM_REQUEST_GET_SIZE:
1419 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1420 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1421 tryvm_if((service_mode < PM_GET_TOTAL_SIZE) || (service_mode >= PM_GET_MAX), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1423 ret = __get_size_process(pc, pkgid, uid, (pkgmgr_getsize_type)service_mode, event_cb, data);
1426 case PM_REQUEST_KILL_APP:
1427 case PM_REQUEST_CHECK_APP:
1428 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1429 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1431 ret = __check_app_process(service_type, pc, pkgid, uid, data);
1433 ERR("__check_app_process fail \n");
1440 ERR("Wrong Request\n");
1451 API int pkgmgr_client_usr_request_size_info(uid_t uid)
1454 struct pkgmgr_client *client;
1456 client = pkgmgr_client_new(PC_REQUEST);
1457 if (client == NULL) {
1458 ERR("out of memory");
1459 return PKGMGR_R_ENOMEM;
1462 ret = __request_size_info(client, uid);
1464 ERR("__request_size_info fail");
1466 pkgmgr_client_free(client);
1470 API int pkgmgr_client_request_size_info(void)
1472 /* get all package size (data, total) */
1473 return pkgmgr_client_usr_request_size_info(_getuid());
1476 API int pkgmgr_client_usr_clear_cache_dir(const char *pkgid, uid_t uid)
1480 struct pkgmgr_client_t *client;
1482 if (pkgid == NULL) {
1483 ERR("invalid parameter");
1484 return PKGMGR_R_EINVAL;
1487 client = pkgmgr_client_new(PC_REQUEST);
1488 if (client == NULL) {
1489 ERR("out of memory");
1490 return PKGMGR_R_ENOMEM;
1493 ret = pkgmgr_client_connection_send_request(client, "clearcache",
1494 g_variant_new("(us)", uid, pkgid), &result);
1495 if (ret != PKGMGR_R_OK) {
1496 ERR("request failed: %d", ret);
1500 g_variant_get(result, "(i)", &ret);
1501 g_variant_unref(result);
1506 API int pkgmgr_client_clear_cache_dir(const char *pkgid)
1508 return pkgmgr_client_usr_clear_cache_dir(pkgid, _getuid());
1511 API int pkgmgr_client_clear_usr_all_cache_dir(uid_t uid)
1513 return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, uid);
1516 API int pkgmgr_client_clear_all_cache_dir(void)
1518 return pkgmgr_client_usr_clear_cache_dir(
1519 PKG_CLEAR_ALL_CACHE, getuid());
1522 API int pkgmgr_client_get_size(pkgmgr_client *pc, const char *pkgid,
1523 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
1526 return pkgmgr_client_usr_get_size(pc, pkgid, get_type, event_cb, data,
1530 /* TODO: deprecate(or remove) */
1531 API int pkgmgr_client_usr_get_size(pkgmgr_client *pc, const char *pkgid,
1532 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
1533 void *data, uid_t uid)
1536 int ret = PKGMGR_R_ECOMM;
1537 char *req_key = NULL;
1538 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1539 struct cb_info *cb_info;
1541 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
1542 ERR("invalid parameter");
1543 return PKGMGR_R_EINVAL;
1546 if (client->pc_type != PC_REQUEST) {
1547 ERR("client->pc_type is not PC_REQUEST");
1548 return PKGMGR_R_EINVAL;
1552 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
1553 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
1555 get_type = PM_GET_PKG_SIZE_INFO;
1557 ret = pkgmgr_client_connection_send_request(client, "getsize",
1558 g_variant_new("(usi)", uid, pkgid, get_type), &result);
1559 if (ret != PKGMGR_R_OK) {
1560 ERR("request failed: %d", ret);
1564 g_variant_get(result, "(i&s)", &ret, &req_key);
1565 if (req_key == NULL) {
1566 g_variant_unref(result);
1567 return PKGMGR_R_ECOMM;
1569 if (ret != PKGMGR_R_OK) {
1570 g_variant_unref(result);
1574 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1575 if (cb_info == NULL) {
1576 g_variant_unref(result);
1577 return PKGMGR_R_ENOMEM;
1579 g_variant_unref(result);
1580 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1581 if (ret != PKGMGR_R_OK) {
1582 __free_cb_info(cb_info);
1585 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1590 API int pkgmgr_client_usr_get_package_size_info(pkgmgr_client *pc,
1591 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
1592 void *user_data, uid_t uid)
1595 int ret = PKGMGR_R_ECOMM;
1596 char *req_key = NULL;
1598 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1599 struct cb_info *cb_info;
1601 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
1602 ERR("invalid parameter");
1603 return PKGMGR_R_EINVAL;
1606 if (client->pc_type != PC_REQUEST) {
1607 ERR("client->pc_type is not PC_REQUEST");
1608 return PKGMGR_R_EINVAL;
1611 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
1612 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
1614 get_type = PM_GET_PKG_SIZE_INFO;
1616 ret = pkgmgr_client_connection_send_request(client, "getsize",
1617 g_variant_new("(usi)", uid, pkgid, get_type), &result);
1618 if (ret != PKGMGR_R_OK) {
1619 ERR("request failed: %d", ret);
1623 g_variant_get(result, "(i&s)", &ret, &req_key);
1624 if (req_key == NULL) {
1625 g_variant_unref(result);
1626 return PKGMGR_R_ECOMM;
1628 if (ret != PKGMGR_R_OK) {
1629 g_variant_unref(result);
1633 cb_info = __create_size_info_cb_info(client, event_cb, user_data,
1635 if (cb_info == NULL) {
1636 g_variant_unref(result);
1637 return PKGMGR_R_ENOMEM;
1639 g_variant_unref(result);
1640 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1641 if (ret != PKGMGR_R_OK) {
1642 __free_cb_info(cb_info);
1645 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1650 API int pkgmgr_client_get_package_size_info(pkgmgr_client *pc,
1651 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
1654 return pkgmgr_client_usr_get_package_size_info(pc, pkgid, event_cb,
1655 user_data, _getuid());
1658 API int pkgmgr_client_usr_get_total_package_size_info(pkgmgr_client *pc,
1659 pkgmgr_total_pkg_size_info_receive_cb event_cb,
1660 void *user_data, uid_t uid)
1661 { /* total package size info */
1662 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL,
1663 (pkgmgr_pkg_size_info_receive_cb)event_cb,
1667 API int pkgmgr_client_get_total_package_size_info(pkgmgr_client *pc,
1668 pkgmgr_total_pkg_size_info_receive_cb event_cb, void *user_data)
1670 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL,
1671 (pkgmgr_pkg_size_info_receive_cb)event_cb,
1672 user_data, _getuid());
1675 API int pkgmgr_client_generate_license_request(pkgmgr_client *pc,
1676 const char *resp_data, char **req_data, char **license_url)
1682 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1684 if (pc == NULL || resp_data == NULL || req_data == NULL ||
1685 license_url == NULL) {
1686 ERR("invalid parameter");
1687 return PKGMGR_R_EINVAL;
1690 if (client->pc_type != PC_REQUEST) {
1691 ERR("client->pc_type is not PC_REQUEST");
1692 return PKGMGR_R_EINVAL;
1695 ret = pkgmgr_client_connection_send_request(client,
1696 "generate_license_request",
1697 g_variant_new("(s)", resp_data), &result);
1698 if (ret != PKGMGR_R_OK) {
1699 ERR("request failed: %d", ret);
1703 g_variant_get(result, "(i&s&s)", &ret, &data, &url);
1704 if (ret != PKGMGR_R_OK) {
1705 ERR("generate_license_request failed: %d", ret);
1706 g_variant_unref(result);
1710 *req_data = strdup(data);
1711 *license_url = strdup(url);
1713 g_variant_unref(result);
1718 API int pkgmgr_client_register_license(pkgmgr_client *pc, const char *resp_data)
1722 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1724 if (pc == NULL || resp_data == NULL) {
1725 ERR("invalid parameter");
1726 return PKGMGR_R_EINVAL;
1729 if (client->pc_type != PC_REQUEST) {
1730 ERR("client->pc_type is not PC_REQUEST");
1731 return PKGMGR_R_EINVAL;
1734 ret = pkgmgr_client_connection_send_request(client, "register_license",
1735 g_variant_new("(s)", resp_data), &result);
1736 if (ret != PKGMGR_R_OK) {
1737 ERR("request failed: %d", ret);
1741 g_variant_get(result, "(i)", &ret);
1742 g_variant_unref(result);
1743 if (ret != PKGMGR_R_OK)
1744 ERR("register license failed: %d", ret);
1749 API int pkgmgr_client_decrypt_package(pkgmgr_client *pc,
1750 const char *drm_file_path, const char *decrypted_file_path)
1754 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1756 if (pc == NULL || drm_file_path == NULL ||
1757 decrypted_file_path == NULL) {
1758 ERR("invalid parameter");
1759 return PKGMGR_R_EINVAL;
1762 if (client->pc_type != PC_REQUEST) {
1763 ERR("client->pc_type is not PC_REQUEST");
1764 return PKGMGR_R_EINVAL;
1767 ret = pkgmgr_client_connection_send_request(client, "decrypt_package",
1768 g_variant_new("(ss)", drm_file_path,
1769 decrypted_file_path), &result);
1770 if (ret != PKGMGR_R_OK) {
1771 ERR("request failed: %d", ret);
1775 g_variant_get(result, "(i)", &ret);
1776 g_variant_unref(result);
1777 if (ret != PKGMGR_R_OK)
1778 ERR("decrypt_package failed: %d", ret);
1783 API int pkgmgr_client_enable_splash_screen(pkgmgr_client *pc, const char *appid)
1785 return pkgmgr_client_usr_enable_splash_screen(pc, appid, _getuid());
1788 API int pkgmgr_client_usr_enable_splash_screen(pkgmgr_client *pc,
1789 const char *appid, uid_t uid)
1793 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1795 if (pc == NULL || appid == NULL) {
1796 ERR("Invalid parameter");
1797 return PKGMGR_R_EINVAL;
1800 ret = pkgmgr_client_connection_send_request(client,
1801 "enable_app_splash_screen",
1802 g_variant_new("(us)", uid, appid), &result);
1803 if (ret != PKGMGR_R_OK) {
1804 ERR("request failed: %d", ret);
1808 g_variant_get(result, "(i)", &ret);
1809 g_variant_unref(result);
1810 if (ret != PKGMGR_R_OK)
1811 ERR("enable splash screen failed: %d", ret);
1816 API int pkgmgr_client_disable_splash_screen(pkgmgr_client *pc,
1819 return pkgmgr_client_usr_disable_splash_screen(pc, appid,
1823 API int pkgmgr_client_usr_disable_splash_screen(pkgmgr_client *pc,
1824 const char *appid, uid_t uid)
1828 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1830 if (pc == NULL || appid == NULL) {
1831 ERR("Invalid parameter");
1832 return PKGMGR_R_EINVAL;
1835 ret = pkgmgr_client_connection_send_request(client,
1836 "disable_app_splash_screen",
1837 g_variant_new("(us)", uid, appid), &result);
1838 if (ret != PKGMGR_R_OK) {
1839 ERR("request failed: %d", ret);
1843 g_variant_get(result, "(i)", &ret);
1844 g_variant_unref(result);
1845 if (ret != PKGMGR_R_OK)
1846 ERR("disable splash screen failed: %d", ret);
1851 static int __set_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
1852 int mode, uid_t uid)
1855 int ret = PKGMGR_R_ECOMM;
1856 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1858 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
1859 ERR("invalid parameter");
1860 return PKGMGR_R_EINVAL;
1863 ret = pkgmgr_client_connection_send_request(client,
1864 "set_restriction_mode",
1865 g_variant_new("(usi)", uid, pkgid, mode), &result);
1866 if (ret != PKGMGR_R_OK) {
1867 ERR("request failed: %d", ret);
1871 g_variant_get(result, "(i)", &ret);
1872 g_variant_unref(result);
1877 API int pkgmgr_client_usr_set_pkg_restriction_mode(pkgmgr_client *pc,
1878 const char *pkgid, int mode, uid_t uid)
1880 return __set_pkg_restriction_mode(pc, pkgid, mode, uid);
1883 API int pkgmgr_client_set_pkg_restriction_mode(pkgmgr_client *pc,
1884 const char *pkgid, int mode)
1886 return pkgmgr_client_usr_set_pkg_restriction_mode(pc, pkgid, mode,
1890 static int __unset_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
1891 int mode, uid_t uid)
1894 int ret = PKGMGR_R_ECOMM;
1895 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1897 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
1898 ERR("invalid parameter");
1899 return PKGMGR_R_EINVAL;
1902 ret = pkgmgr_client_connection_send_request(client,
1903 "unset_restriction_mode",
1904 g_variant_new("(usi)", uid, pkgid, mode), &result);
1905 if (ret != PKGMGR_R_OK) {
1906 ERR("request failed: %d", ret);
1910 g_variant_get(result, "(i)", &ret);
1911 g_variant_unref(result);
1917 API int pkgmgr_client_usr_unset_pkg_restriction_mode(pkgmgr_client *pc,
1918 const char *pkgid, int mode, uid_t uid)
1920 return __unset_pkg_restriction_mode(pc, pkgid, mode, uid);
1923 API int pkgmgr_client_unset_pkg_restriction_mode(pkgmgr_client *pc,
1924 const char *pkgid, int mode)
1926 return pkgmgr_client_usr_unset_pkg_restriction_mode(pc, pkgid, mode,
1930 static int __get_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
1931 int *mode, uid_t uid)
1934 int ret = PKGMGR_R_ECOMM;
1936 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1938 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0) {
1939 ERR("invalid parameter");
1940 return PKGMGR_R_EINVAL;
1943 ret = pkgmgr_client_connection_send_request(client,
1944 "get_restriction_mode",
1945 g_variant_new("(us)", uid, pkgid), &result);
1946 if (ret != PKGMGR_R_OK) {
1947 ERR("request failed: %d", ret);
1951 g_variant_get(result, "(ii)", &m, &ret);
1952 g_variant_unref(result);
1953 if (ret != PKGMGR_R_OK)
1961 API int pkgmgr_client_usr_get_pkg_restriction_mode(pkgmgr_client *pc,
1962 const char *pkgid, int *mode, uid_t uid)
1964 return __get_pkg_restriction_mode(pc, pkgid, mode, uid);
1967 API int pkgmgr_client_get_pkg_restriction_mode(pkgmgr_client *pc,
1968 const char *pkgid, int *mode)
1970 return pkgmgr_client_usr_get_pkg_restriction_mode(pc, pkgid, mode,
1974 API int pkgmgr_client_usr_set_restriction_mode(pkgmgr_client *pc, int mode,
1978 int ret = PKGMGR_R_ECOMM;
1979 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1982 ERR("invalid parameter");
1983 return PKGMGR_R_EINVAL;
1986 ret = pkgmgr_client_connection_send_request(client,
1987 "set_restriction_mode",
1988 g_variant_new("(usi)", uid, "", mode), &result);
1989 if (ret != PKGMGR_R_OK) {
1990 ERR("request failed: %d", ret);
1994 g_variant_get(result, "(i)", &ret);
1995 g_variant_unref(result);
2000 API int pkgmgr_client_set_restriction_mode(pkgmgr_client *pc, int mode)
2002 return pkgmgr_client_usr_set_restriction_mode(pc, mode, _getuid());
2005 API int pkgmgr_client_usr_unset_restriction_mode(pkgmgr_client *pc, int mode,
2009 int ret = PKGMGR_R_ECOMM;
2010 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2013 ERR("invalid parameter");
2014 return PKGMGR_R_EINVAL;
2017 ret = pkgmgr_client_connection_send_request(client,
2018 "unset_restriction_mode",
2019 g_variant_new("(usi)", uid, "", mode), &result);
2020 if (ret != PKGMGR_R_OK) {
2021 ERR("request failed: %d", ret);
2025 g_variant_get(result, "(i)", &ret);
2026 g_variant_unref(result);
2031 API int pkgmgr_client_unset_restriction_mode(pkgmgr_client *pc, int mode)
2033 return pkgmgr_client_usr_unset_restriction_mode(pc, mode, _getuid());
2036 API int pkgmgr_client_usr_get_restriction_mode(pkgmgr_client *pc,
2037 int *mode, uid_t uid)
2040 int ret = PKGMGR_R_ECOMM;
2042 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2045 ERR("invalid parameter");
2046 return PKGMGR_R_EINVAL;
2049 ret = pkgmgr_client_connection_send_request(client,
2050 "get_restriction_mode",
2051 g_variant_new("(us)", uid, ""), &result);
2052 if (ret != PKGMGR_R_OK) {
2053 ERR("request failed: %d", ret);
2057 g_variant_get(result, "(ii)", &m, &ret);
2058 g_variant_unref(result);
2059 if (ret != PKGMGR_R_OK)
2067 API int pkgmgr_client_get_restriction_mode(pkgmgr_client *pc, int *mode)
2069 return pkgmgr_client_usr_get_restriction_mode(pc, mode, _getuid());
2072 API pkgmgr_info *pkgmgr_client_check_pkginfo_from_file(const char *pkg_path)
2075 pkg_plugin_set *plugin_set;
2076 package_manager_pkg_detail_info_t *info;
2079 if (pkg_path == NULL) {
2080 ERR("invalid parameter");
2084 pkg_type = __get_type_from_path(pkg_path);
2085 if (pkg_type == NULL) {
2086 ERR("cannot get pkg type");
2090 plugin_set = _package_manager_load_library(pkg_type);
2091 if (plugin_set == NULL) {
2092 ERR("failed to load library for %s", pkg_type);
2097 info = calloc(1, sizeof(package_manager_pkg_detail_info_t));
2099 ERR("out of memory");
2104 ret = plugin_set->get_pkg_detail_info_from_package(pkg_path, info);
2106 ERR("get_pkg_detail_info_from_package failed");
2114 return (pkgmgr_info *)info;
2117 API int pkgmgr_client_free_pkginfo(pkgmgr_info *info)
2119 package_manager_pkg_detail_info_t *pkg_info =
2120 (package_manager_pkg_detail_info_t *)info;
2123 ERR("invalid parameter");
2124 return PKGMGR_R_EINVAL;
2127 free(pkg_info->icon_buf);
2133 API int pkgmgr_client_usr_set_app_label(pkgmgr_client *pc, char *appid,
2134 char *label, uid_t uid)
2138 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2140 if (pc == NULL || appid == NULL || label == NULL) {
2141 ERR("Invalid parameter");
2142 return PKGMGR_R_EINVAL;
2145 ret = pkgmgr_client_connection_send_request(client,
2147 g_variant_new("(uss)", uid, appid, label), &result);
2148 if (ret != PKGMGR_R_OK) {
2149 ERR("Request failed: %d", ret);
2153 g_variant_get(result, "(i)", &ret);
2154 g_variant_unref(result);
2159 API int pkgmgr_client_set_app_label(pkgmgr_client *pc, char *appid, char *label)
2161 return pkgmgr_client_usr_set_app_label(pc, appid, label, _getuid());