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");
493 if (client->debug_mode)
494 g_variant_builder_add(builder, "s", "-G");
496 args = g_variant_new("as", builder);
497 g_variant_builder_unref(builder);
499 ret = pkgmgr_client_connection_send_request(client, "install",
500 g_variant_new("(uss@as)", uid, pkgtype ? pkgtype : "",
503 if (ret != PKGMGR_R_OK) {
504 ERR("request failed: %d", ret);
508 g_variant_get(result, "(i&s)", &ret, &req_key);
509 if (req_key == NULL) {
510 g_variant_unref(result);
511 return PKGMGR_R_ECOMM;
513 if (ret != PKGMGR_R_OK) {
514 g_variant_unref(result);
518 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
519 if (cb_info == NULL) {
520 g_variant_unref(result);
521 return PKGMGR_R_ENOMEM;
523 g_variant_unref(result);
524 ret = pkgmgr_client_connection_set_callback(client, cb_info);
525 if (ret != PKGMGR_R_OK) {
526 __free_cb_info(cb_info);
529 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
531 return cb_info->req_id;
534 API int pkgmgr_client_install(pkgmgr_client *pc, const char *pkg_type,
535 const char *descriptor_path, const char *pkg_path,
536 const char *optional_data, pkgmgr_mode mode,
537 pkgmgr_handler event_cb, void *data)
539 return pkgmgr_client_usr_install(pc, pkg_type, descriptor_path,
540 pkg_path, optional_data, mode, event_cb, data,
544 API int pkgmgr_client_reinstall(pkgmgr_client *pc, const char *pkg_type,
545 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
546 pkgmgr_handler event_cb, void *data)
548 return pkgmgr_client_usr_reinstall(pc, pkg_type, pkgid, optional_data,
549 mode, event_cb, data, _getuid());
552 API int pkgmgr_client_usr_reinstall(pkgmgr_client *pc, const char *pkg_type,
553 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
554 pkgmgr_handler event_cb, void *data, uid_t uid)
557 int ret = PKGMGR_R_ECOMM;
558 char *req_key = NULL;
559 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
560 struct cb_info *cb_info;
562 if (pc == NULL || pkgid == NULL) {
563 ERR("invalid parameter");
564 return PKGMGR_R_EINVAL;
567 if (client->pc_type != PC_REQUEST) {
568 ERR("client->pc_type is not PC_REQUEST");
569 return PKGMGR_R_EINVAL;
572 ret = pkgmgr_client_connection_send_request(client, "reinstall",
573 g_variant_new("(us)", uid, pkgid), &result);
574 if (ret != PKGMGR_R_OK) {
575 ERR("request failed: %d", ret);
579 g_variant_get(result, "(i&s)", &ret, &req_key);
580 if (req_key == NULL) {
581 g_variant_unref(result);
582 return PKGMGR_R_ECOMM;
584 if (ret != PKGMGR_R_OK) {
585 g_variant_unref(result);
589 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
590 if (cb_info == NULL) {
591 g_variant_unref(result);
592 return PKGMGR_R_ENOMEM;
594 g_variant_unref(result);
595 ret = pkgmgr_client_connection_set_callback(client, cb_info);
596 if (ret != PKGMGR_R_OK) {
597 __free_cb_info(cb_info);
600 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
602 return cb_info->req_id;
605 API int pkgmgr_client_usr_mount_install(pkgmgr_client *pc, const char *pkg_type,
606 const char *descriptor_path, const char *pkg_path,
607 const char *optional_data, pkgmgr_mode mode,
608 pkgmgr_handler event_cb, void *data, uid_t uid)
611 int ret = PKGMGR_R_ECOMM;
612 char *req_key = NULL;
613 GVariantBuilder *builder = NULL;
614 GVariant *args = NULL;
615 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
616 char *pkgtype = NULL;
617 struct cb_info *cb_info;
619 if (pc == NULL || pkg_path == NULL) {
620 ERR("invalid parameter");
621 return PKGMGR_R_EINVAL;
624 if (client->pc_type != PC_REQUEST) {
625 ERR("client->pc_type is not PC_REQUEST");
626 return PKGMGR_R_EINVAL;
629 if (access(pkg_path, F_OK) != 0) {
630 ERR("failed to access: %s", pkg_path);
631 return PKGMGR_R_EINVAL;
634 if (client->tep_path != NULL && access(client->tep_path, F_OK) != 0) {
635 ERR("failed to access: %s", client->tep_path);
636 return PKGMGR_R_EINVAL;
640 pkgtype = strdup(pkg_type);
642 /* build arguments */
643 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
644 if (client->tep_path) {
645 g_variant_builder_add(builder, "s", "-e");
646 g_variant_builder_add(builder, "s", client->tep_path);
647 g_variant_builder_add(builder, "s", "-M");
648 /* TODO: revise tep_move */
649 g_variant_builder_add(builder, "s",
650 client->tep_move ? "tep_move" : "tep_copy");
653 args = g_variant_new("as", builder);
654 g_variant_builder_unref(builder);
656 ret = pkgmgr_client_connection_send_request(client, "mount_install",
657 g_variant_new("(uss@as)", uid, pkgtype ? pkgtype : "",
660 if (ret != PKGMGR_R_OK) {
661 ERR("request failed: %d", ret);
665 g_variant_get(result, "(i&s)", &ret, &req_key);
666 if (req_key == NULL) {
667 g_variant_unref(result);
668 return PKGMGR_R_ECOMM;
670 if (ret != PKGMGR_R_OK) {
671 g_variant_unref(result);
675 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
676 if (cb_info == NULL) {
677 g_variant_unref(result);
678 return PKGMGR_R_ENOMEM;
680 g_variant_unref(result);
681 ret = pkgmgr_client_connection_set_callback(client, cb_info);
682 if (ret != PKGMGR_R_OK) {
683 __free_cb_info(cb_info);
686 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
688 return cb_info->req_id;
691 API int pkgmgr_client_mount_install(pkgmgr_client *pc, const char *pkg_type,
692 const char *descriptor_path, const char *pkg_path,
693 const char *optional_data, pkgmgr_mode mode,
694 pkgmgr_handler event_cb, void *data)
696 return pkgmgr_client_usr_mount_install(pc, pkg_type, descriptor_path,
697 pkg_path, optional_data, mode, event_cb, data,
701 API int pkgmgr_client_uninstall(pkgmgr_client *pc, const char *pkg_type,
702 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
705 return pkgmgr_client_usr_uninstall(pc, pkg_type, pkgid, mode, event_cb,
709 API int pkgmgr_client_usr_uninstall(pkgmgr_client *pc, const char *pkg_type,
710 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
711 void *data, uid_t uid)
714 int ret = PKGMGR_R_ECOMM;
715 char *req_key = NULL;
716 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
717 struct cb_info *cb_info;
719 if (pc == NULL || pkgid == NULL) {
720 ERR("invalid parameter");
721 return PKGMGR_R_EINVAL;
724 if (client->pc_type != PC_REQUEST) {
725 ERR("client->pc_type is not PC_REQUEST");
726 return PKGMGR_R_EINVAL;
729 ret = pkgmgr_client_connection_send_request(client, "uninstall",
730 g_variant_new("(us)", uid, pkgid), &result);
731 if (ret != PKGMGR_R_OK) {
732 ERR("request failed: %d", ret);
736 g_variant_get(result, "(i&s)", &ret, &req_key);
737 if (req_key == NULL) {
738 g_variant_unref(result);
739 return PKGMGR_R_ECOMM;
741 if (ret != PKGMGR_R_OK) {
742 g_variant_unref(result);
746 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
747 if (cb_info == NULL) {
748 g_variant_unref(result);
749 return PKGMGR_R_ENOMEM;
751 g_variant_unref(result);
752 ret = pkgmgr_client_connection_set_callback(client, cb_info);
753 if (ret != PKGMGR_R_OK) {
754 __free_cb_info(cb_info);
757 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
759 return cb_info->req_id;
762 API int pkgmgr_client_move(pkgmgr_client *pc, const char *pkg_type,
763 const char *pkgid, pkgmgr_move_type move_type,
764 pkgmgr_handler event_cb, void *data)
766 return pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type,
767 event_cb, data, _getuid());
769 API int pkgmgr_client_usr_move(pkgmgr_client *pc, const char *pkg_type,
770 const char *pkgid, pkgmgr_move_type move_type,
771 pkgmgr_handler event_cb, void *data, uid_t uid)
774 int ret = PKGMGR_R_ECOMM;
775 char *req_key = NULL;
776 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
777 struct cb_info *cb_info;
779 if (pc == NULL || pkgid == NULL) {
780 ERR("invalid parameter");
781 return PKGMGR_R_EINVAL;
784 if ((move_type < PM_MOVE_TO_INTERNAL) ||
785 (move_type > PM_MOVE_TO_SDCARD))
786 return PKGMGR_R_EINVAL;
788 if (client->pc_type != PC_REQUEST) {
789 ERR("client->pc_type is not PC_REQUEST");
790 return PKGMGR_R_EINVAL;
793 ret = pkgmgr_client_connection_send_request(client, "move",
794 g_variant_new("(usi)", uid, pkgid, move_type), &result);
795 if (ret != PKGMGR_R_OK) {
796 ERR("request failed: %d", ret);
800 g_variant_get(result, "(i&s)", &ret, &req_key);
801 if (req_key == NULL) {
802 g_variant_unref(result);
803 return PKGMGR_R_ECOMM;
805 if (ret != PKGMGR_R_OK) {
806 g_variant_unref(result);
810 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
811 if (cb_info == NULL) {
812 g_variant_unref(result);
813 return PKGMGR_R_ERROR;
815 g_variant_unref(result);
816 ret = pkgmgr_client_connection_set_callback(client, cb_info);
817 if (ret != PKGMGR_R_OK) {
818 __free_cb_info(cb_info);
821 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
823 return cb_info->req_id;
826 API int pkgmgr_client_usr_activate(pkgmgr_client *pc, const char *pkg_type,
827 const char *pkgid, uid_t uid)
830 int ret = PKGMGR_R_ECOMM;
831 GVariantBuilder *builder;
832 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
834 if (pc == NULL || pkgid == NULL) {
835 ERR("invalid parameter");
836 return PKGMGR_R_EINVAL;
839 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
840 g_variant_builder_add(builder, "s", pkgid);
842 ret = pkgmgr_client_connection_send_request(client, "enable_pkgs",
843 g_variant_new("(uas)", uid, builder), &result);
844 g_variant_builder_unref(builder);
845 if (ret != PKGMGR_R_OK) {
846 ERR("request failed: %d", ret);
850 g_variant_get(result, "(is)", &ret, NULL);
851 g_variant_unref(result);
856 API int pkgmgr_client_activate(pkgmgr_client *pc, const char *pkg_type,
859 return pkgmgr_client_usr_activate(pc, pkg_type, pkgid, _getuid());
862 API int pkgmgr_client_usr_activate_packages(pkgmgr_client *pc,
863 const char *pkg_type, const char **pkgids, int n_pkgs,
864 pkgmgr_handler event_cb, void *data, uid_t uid)
867 GVariantBuilder *builder;
868 int ret = PKGMGR_R_ECOMM;
869 char *req_key = NULL;
870 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
871 struct cb_info *cb_info;
874 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
875 ERR("invalid parameter");
876 return PKGMGR_R_EINVAL;
879 if (client->pc_type != PC_REQUEST) {
880 ERR("client type is not PC_REQUEST");
881 return PKGMGR_R_EINVAL;
884 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
885 for (i = 0; i < n_pkgs; i++)
886 g_variant_builder_add(builder, "s", pkgids[i]);
888 ret = pkgmgr_client_connection_send_request(client, "enable_pkgs",
889 g_variant_new("(uas)", uid, builder), &result);
890 g_variant_builder_unref(builder);
891 if (ret != PKGMGR_R_OK) {
892 ERR("request failed: %d", ret);
896 g_variant_get(result, "(i&s)", &ret, &req_key);
897 if (req_key == NULL) {
898 g_variant_unref(result);
899 return PKGMGR_R_ECOMM;
901 if (ret != PKGMGR_R_OK) {
902 g_variant_unref(result);
906 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
907 if (cb_info == NULL) {
908 g_variant_unref(result);
909 return PKGMGR_R_ERROR;
911 g_variant_unref(result);
912 ret = pkgmgr_client_connection_set_callback(client, cb_info);
913 if (ret != PKGMGR_R_OK) {
914 __free_cb_info(cb_info);
917 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
919 return cb_info->req_id;
922 API int pkgmgr_client_activate_packages(pkgmgr_client *pc,
923 const char *pkg_type, const char **pkgids, int n_pkgs,
924 pkgmgr_handler event_cb, void *data)
926 return pkgmgr_client_usr_activate_packages(pc, pkg_type,
927 pkgids, n_pkgs, event_cb, data, _getuid());
930 API int pkgmgr_client_usr_deactivate(pkgmgr_client *pc, const char *pkg_type,
931 const char *pkgid, uid_t uid)
934 GVariantBuilder *builder;
935 int ret = PKGMGR_R_ECOMM;
936 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
938 if (pc == NULL || pkgid == NULL) {
939 ERR("invalid parameter");
940 return PKGMGR_R_EINVAL;
943 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
944 g_variant_builder_add(builder, "s", pkgid);
946 ret = pkgmgr_client_connection_send_request(client, "disable_pkgs",
947 g_variant_new("(uas)", uid, builder), &result);
948 g_variant_builder_unref(builder);
949 if (ret != PKGMGR_R_OK) {
950 ERR("request failed: %d", ret);
954 g_variant_get(result, "(is)", &ret, NULL);
955 g_variant_unref(result);
960 API int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type,
963 return pkgmgr_client_usr_deactivate(pc, pkg_type, pkgid, _getuid());
966 API int pkgmgr_client_usr_deactivate_packages(pkgmgr_client *pc,
967 const char *pkg_type, const char **pkgids, int n_pkgs,
968 pkgmgr_handler event_cb, void *data, uid_t uid)
971 GVariantBuilder *builder;
972 int ret = PKGMGR_R_ECOMM;
973 char *req_key = NULL;
974 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
975 struct cb_info *cb_info;
978 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
979 ERR("invalid parameter");
980 return PKGMGR_R_EINVAL;
983 if (client->pc_type != PC_REQUEST) {
984 ERR("client type is not PC_REQUEST");
985 return PKGMGR_R_EINVAL;
988 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
989 for (i = 0; i < n_pkgs; i++)
990 g_variant_builder_add(builder, "s", pkgids[i]);
992 ret = pkgmgr_client_connection_send_request(client, "disable_pkgs",
993 g_variant_new("(uas)", uid, builder), &result);
994 g_variant_builder_unref(builder);
995 if (ret != PKGMGR_R_OK) {
996 ERR("request failed: %d", ret);
1000 g_variant_get(result, "(i&s)", &ret, &req_key);
1001 if (req_key == NULL) {
1002 g_variant_unref(result);
1003 return PKGMGR_R_ECOMM;
1005 if (ret != PKGMGR_R_OK) {
1006 g_variant_unref(result);
1010 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1011 if (cb_info == NULL) {
1012 g_variant_unref(result);
1013 return PKGMGR_R_ERROR;
1015 g_variant_unref(result);
1016 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1017 if (ret != PKGMGR_R_OK) {
1018 __free_cb_info(cb_info);
1021 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1023 return cb_info->req_id;
1026 API int pkgmgr_client_deactivate_packages(pkgmgr_client *pc,
1027 const char *pkg_type, const char **pkgids, int n_pkgs,
1028 pkgmgr_handler event_cb, void *data)
1030 return pkgmgr_client_usr_deactivate_packages(pc, pkg_type,
1031 pkgids, n_pkgs, event_cb, data, _getuid());
1034 API int pkgmgr_client_usr_activate_app(pkgmgr_client *pc, const char *appid,
1035 pkgmgr_app_handler app_event_cb, uid_t uid)
1038 int ret = PKGMGR_R_ECOMM;
1039 char *req_key = NULL;
1040 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1041 struct cb_info *cb_info;
1043 if (pc == NULL || appid == NULL) {
1044 ERR("invalid parameter");
1045 return PKGMGR_R_EINVAL;
1048 ret = pkgmgr_client_connection_send_request(client, "enable_app",
1049 g_variant_new("(us)", uid, appid), &result);
1050 if (ret != PKGMGR_R_OK) {
1051 ERR("request failed: %d", ret);
1055 g_variant_get(result, "(i&s)", &ret, &req_key);
1056 if (req_key == NULL) {
1057 g_variant_unref(result);
1058 return PKGMGR_R_ECOMM;
1060 if (ret != PKGMGR_R_OK) {
1061 g_variant_unref(result);
1065 cb_info = __create_app_event_cb_info(client, app_event_cb, NULL,
1067 if (cb_info == NULL) {
1068 g_variant_unref(result);
1069 return PKGMGR_R_ENOMEM;
1071 g_variant_unref(result);
1072 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1073 if (ret != PKGMGR_R_OK) {
1074 __free_cb_info(cb_info);
1077 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1082 API int pkgmgr_client_activate_app(pkgmgr_client *pc, const char *appid,
1083 pkgmgr_app_handler app_event_cb)
1085 return pkgmgr_client_usr_activate_app(pc, appid, app_event_cb,
1089 API int pkgmgr_client_activate_global_app_for_uid(pkgmgr_client *pc,
1090 const char *appid, pkgmgr_app_handler app_event_cb, uid_t uid)
1093 int ret = PKGMGR_R_ECOMM;
1094 char *req_key = NULL;
1095 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1096 struct cb_info *cb_info;
1098 if (pc == NULL || appid == NULL) {
1099 ERR("invalid parameter");
1100 return PKGMGR_R_EINVAL;
1103 ret = pkgmgr_client_connection_send_request(client,
1104 "enable_global_app_for_uid",
1105 g_variant_new("(us)", uid, appid), &result);
1106 if (ret != PKGMGR_R_OK) {
1107 ERR("request failed: %d", ret);
1111 g_variant_get(result, "(i&s)", &ret, &req_key);
1112 if (req_key == NULL) {
1113 g_variant_unref(result);
1114 return PKGMGR_R_ECOMM;
1116 if (ret != PKGMGR_R_OK) {
1117 g_variant_unref(result);
1121 cb_info = __create_app_event_cb_info(client, app_event_cb, NULL,
1123 if (cb_info == NULL) {
1124 g_variant_unref(result);
1125 return PKGMGR_R_ENOMEM;
1127 g_variant_unref(result);
1128 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1129 if (ret != PKGMGR_R_OK) {
1130 __free_cb_info(cb_info);
1133 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1138 API int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid,
1139 pkgmgr_app_handler app_event_cb, uid_t uid)
1142 int ret = PKGMGR_R_ECOMM;
1143 char *req_key = NULL;
1144 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1145 struct cb_info *cb_info;
1147 if (pc == NULL || appid == NULL) {
1148 ERR("invalid parameter");
1149 return PKGMGR_R_EINVAL;
1152 ret = pkgmgr_client_connection_send_request(client, "disable_app",
1153 g_variant_new("(us)", uid, appid), &result);
1154 if (ret != PKGMGR_R_OK) {
1155 ERR("request failed: %d", ret);
1159 g_variant_get(result, "(i&s)", &ret, &req_key);
1160 if (req_key == NULL) {
1161 g_variant_unref(result);
1162 return PKGMGR_R_ECOMM;
1164 if (ret != PKGMGR_R_OK) {
1165 g_variant_unref(result);
1169 cb_info = __create_app_event_cb_info(client, app_event_cb, NULL,
1171 if (cb_info == NULL) {
1172 g_variant_unref(result);
1173 return PKGMGR_R_ENOMEM;
1175 g_variant_unref(result);
1176 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1177 if (ret != PKGMGR_R_OK) {
1178 __free_cb_info(cb_info);
1181 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1186 API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid,
1187 pkgmgr_app_handler app_event_cb)
1189 return pkgmgr_client_usr_deactivate_app(pc, appid, app_event_cb,
1193 API int pkgmgr_client_deactivate_global_app_for_uid(pkgmgr_client *pc,
1194 const char *appid, pkgmgr_app_handler app_event_cb, uid_t uid)
1197 int ret = PKGMGR_R_ECOMM;
1198 char *req_key = NULL;
1199 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1200 struct cb_info *cb_info;
1202 if (pc == NULL || appid == NULL) {
1203 ERR("invalid parameter");
1204 return PKGMGR_R_EINVAL;
1207 ret = pkgmgr_client_connection_send_request(client,
1208 "disable_global_app_for_uid",
1209 g_variant_new("(us)", uid, appid), &result);
1210 if (ret != PKGMGR_R_OK) {
1211 ERR("request failed: %d", ret);
1215 g_variant_get(result, "(i&s)", &ret, &req_key);
1216 if (req_key == NULL) {
1217 g_variant_unref(result);
1218 return PKGMGR_R_ECOMM;
1220 if (ret != PKGMGR_R_OK) {
1221 g_variant_unref(result);
1225 cb_info = __create_app_event_cb_info(client, app_event_cb, NULL,
1227 if (cb_info == NULL) {
1228 g_variant_unref(result);
1229 return PKGMGR_R_ENOMEM;
1231 g_variant_unref(result);
1232 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1233 if (ret != PKGMGR_R_OK) {
1234 __free_cb_info(cb_info);
1237 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1242 API int pkgmgr_client_usr_clear_user_data(pkgmgr_client *pc,
1243 const char *pkg_type, const char *appid, pkgmgr_mode mode,
1248 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1250 if (pc == NULL || appid == NULL) {
1251 ERR("invalid parameter");
1252 return PKGMGR_R_EINVAL;
1255 if (client->pc_type != PC_REQUEST) {
1256 ERR("client->pc_type is not PC_REQUEST");
1257 return PKGMGR_R_EINVAL;
1260 ret = pkgmgr_client_connection_send_request(client, "cleardata",
1261 g_variant_new("(us)", uid, appid), &result);
1262 if (ret == PKGMGR_R_OK) {
1263 ERR("request failed: %d", ret);
1267 g_variant_get(result, "(i)", &ret);
1268 g_variant_unref(result);
1273 API int pkgmgr_client_clear_user_data(pkgmgr_client *pc, const char *pkg_type,
1274 const char *appid, pkgmgr_mode mode)
1276 return pkgmgr_client_usr_clear_user_data(pc, pkg_type, appid, mode,
1280 API int pkgmgr_client_set_status_type(pkgmgr_client *pc, int status_type)
1282 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1285 ERR("invalid parameter");
1286 return PKGMGR_R_EINVAL;
1289 client->status_type = status_type;
1294 API int pkgmgr_client_listen_status(pkgmgr_client *pc, pkgmgr_handler event_cb,
1298 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1299 struct cb_info *cb_info;
1301 if (pc == NULL || event_cb == NULL) {
1302 ERR("invalid parameter");
1303 return PKGMGR_R_EINVAL;
1306 if (client->pc_type != PC_LISTENING) {
1307 ERR("client->pc_type is not PC_LISTENING");
1308 return PKGMGR_R_EINVAL;
1311 cb_info = __create_event_cb_info(client, event_cb, data, NULL);
1312 if (cb_info == NULL)
1313 return PKGMGR_R_ENOMEM;
1314 cb_info->status_type = client->status_type;
1315 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1316 if (ret != PKGMGR_R_OK) {
1317 __free_cb_info(cb_info);
1320 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1322 return cb_info->req_id;
1325 API int pkgmgr_client_listen_app_status(pkgmgr_client *pc,
1326 pkgmgr_app_handler app_event_cb, void *data)
1329 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1330 struct cb_info *cb_info;
1332 if (pc == NULL || app_event_cb == NULL) {
1333 ERR("invalid parameter");
1334 return PKGMGR_R_EINVAL;
1337 if (client->pc_type != PC_LISTENING) {
1338 ERR("client->pc_type is not PC_LISTENING");
1339 return PKGMGR_R_EINVAL;
1342 cb_info = __create_app_event_cb_info(client, app_event_cb, data, NULL);
1343 if (cb_info == NULL)
1344 return PKGMGR_R_ENOMEM;
1345 cb_info->status_type = client->status_type;
1346 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1347 if (ret != PKGMGR_R_OK) {
1348 __free_cb_info(cb_info);
1351 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1353 return cb_info->req_id;
1356 API int pkgmgr_client_remove_listen_status(pkgmgr_client *pc)
1358 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1361 struct cb_info *cb_info;
1364 ERR("invalid parameter");
1365 return PKGMGR_R_EINVAL;
1368 /* unset all callback */
1369 tmp = client->cb_info_list;
1370 while (tmp != NULL) {
1372 cb_info = (struct cb_info *)tmp->data;
1373 pkgmgr_client_connection_unset_callback(pc, cb_info);
1374 client->cb_info_list = g_list_delete_link(client->cb_info_list,
1376 __free_cb_info(cb_info);
1383 API int pkgmgr_client_broadcast_status(pkgmgr_client *pc, const char *pkg_type,
1384 const char *pkgid, const char *key, const char *val)
1386 /* client cannot broadcast signal */
1390 /* TODO: deprecate(or remove) */
1391 API int pkgmgr_client_request_service(pkgmgr_request_service_type service_type,
1392 int service_mode, pkgmgr_client *pc, const char *pkg_type,
1393 const char *pkgid, const char *custom_info,
1394 pkgmgr_handler event_cb, void *data)
1396 return pkgmgr_client_usr_request_service(service_type, service_mode,
1397 pc, pkg_type, pkgid, _getuid(), custom_info, event_cb,
1401 API int pkgmgr_client_usr_request_service(
1402 pkgmgr_request_service_type service_type, int service_mode,
1403 pkgmgr_client *pc, const char *pkg_type, const char *pkgid,
1404 uid_t uid, const char *custom_info, pkgmgr_handler event_cb,
1409 /* Check for NULL value of service type */
1410 retvm_if(service_type > PM_REQUEST_MAX, PKGMGR_R_EINVAL, "service type is not defined\n");
1411 retvm_if(service_type < 0, PKGMGR_R_EINVAL, "service type is error\n");
1413 switch (service_type) {
1414 case PM_REQUEST_MOVE:
1415 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1416 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1417 tryvm_if((service_mode < PM_MOVE_TO_INTERNAL) || (service_mode > PM_MOVE_TO_SDCARD), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1419 ret = __move_pkg_process(pc, pkgid, pkg_type, uid, (pkgmgr_move_type)service_mode, event_cb, data);
1422 case PM_REQUEST_GET_SIZE:
1423 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1424 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1425 tryvm_if((service_mode < PM_GET_TOTAL_SIZE) || (service_mode >= PM_GET_MAX), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1427 ret = __get_size_process(pc, pkgid, uid, (pkgmgr_getsize_type)service_mode, event_cb, data);
1430 case PM_REQUEST_KILL_APP:
1431 case PM_REQUEST_CHECK_APP:
1432 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1433 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1435 ret = __check_app_process(service_type, pc, pkgid, uid, data);
1437 ERR("__check_app_process fail \n");
1444 ERR("Wrong Request\n");
1455 API int pkgmgr_client_usr_request_size_info(uid_t uid)
1458 struct pkgmgr_client *client;
1460 client = pkgmgr_client_new(PC_REQUEST);
1461 if (client == NULL) {
1462 ERR("out of memory");
1463 return PKGMGR_R_ENOMEM;
1466 ret = __request_size_info(client, uid);
1468 ERR("__request_size_info fail");
1470 pkgmgr_client_free(client);
1474 API int pkgmgr_client_request_size_info(void)
1476 /* get all package size (data, total) */
1477 return pkgmgr_client_usr_request_size_info(_getuid());
1480 API int pkgmgr_client_usr_clear_cache_dir(const char *pkgid, uid_t uid)
1484 struct pkgmgr_client_t *client;
1486 if (pkgid == NULL) {
1487 ERR("invalid parameter");
1488 return PKGMGR_R_EINVAL;
1491 client = pkgmgr_client_new(PC_REQUEST);
1492 if (client == NULL) {
1493 ERR("out of memory");
1494 return PKGMGR_R_ENOMEM;
1497 ret = pkgmgr_client_connection_send_request(client, "clearcache",
1498 g_variant_new("(us)", uid, pkgid), &result);
1499 if (ret != PKGMGR_R_OK) {
1500 ERR("request failed: %d", ret);
1504 g_variant_get(result, "(i)", &ret);
1505 g_variant_unref(result);
1510 API int pkgmgr_client_clear_cache_dir(const char *pkgid)
1512 return pkgmgr_client_usr_clear_cache_dir(pkgid, _getuid());
1515 API int pkgmgr_client_clear_usr_all_cache_dir(uid_t uid)
1517 return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, uid);
1520 API int pkgmgr_client_clear_all_cache_dir(void)
1522 return pkgmgr_client_usr_clear_cache_dir(
1523 PKG_CLEAR_ALL_CACHE, getuid());
1526 API int pkgmgr_client_get_size(pkgmgr_client *pc, const char *pkgid,
1527 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
1530 return pkgmgr_client_usr_get_size(pc, pkgid, get_type, event_cb, data,
1534 /* TODO: deprecate(or remove) */
1535 API int pkgmgr_client_usr_get_size(pkgmgr_client *pc, const char *pkgid,
1536 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
1537 void *data, uid_t uid)
1540 int ret = PKGMGR_R_ECOMM;
1541 char *req_key = NULL;
1542 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1543 struct cb_info *cb_info;
1545 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
1546 ERR("invalid parameter");
1547 return PKGMGR_R_EINVAL;
1550 if (client->pc_type != PC_REQUEST) {
1551 ERR("client->pc_type is not PC_REQUEST");
1552 return PKGMGR_R_EINVAL;
1556 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
1557 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
1559 get_type = PM_GET_PKG_SIZE_INFO;
1561 ret = pkgmgr_client_connection_send_request(client, "getsize",
1562 g_variant_new("(usi)", uid, pkgid, get_type), &result);
1563 if (ret != PKGMGR_R_OK) {
1564 ERR("request failed: %d", ret);
1568 g_variant_get(result, "(i&s)", &ret, &req_key);
1569 if (req_key == NULL) {
1570 g_variant_unref(result);
1571 return PKGMGR_R_ECOMM;
1573 if (ret != PKGMGR_R_OK) {
1574 g_variant_unref(result);
1578 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1579 if (cb_info == NULL) {
1580 g_variant_unref(result);
1581 return PKGMGR_R_ENOMEM;
1583 g_variant_unref(result);
1584 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1585 if (ret != PKGMGR_R_OK) {
1586 __free_cb_info(cb_info);
1589 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1594 API int pkgmgr_client_usr_get_package_size_info(pkgmgr_client *pc,
1595 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
1596 void *user_data, uid_t uid)
1599 int ret = PKGMGR_R_ECOMM;
1600 char *req_key = NULL;
1602 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1603 struct cb_info *cb_info;
1605 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
1606 ERR("invalid parameter");
1607 return PKGMGR_R_EINVAL;
1610 if (client->pc_type != PC_REQUEST) {
1611 ERR("client->pc_type is not PC_REQUEST");
1612 return PKGMGR_R_EINVAL;
1615 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
1616 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
1618 get_type = PM_GET_PKG_SIZE_INFO;
1620 ret = pkgmgr_client_connection_send_request(client, "getsize",
1621 g_variant_new("(usi)", uid, pkgid, get_type), &result);
1622 if (ret != PKGMGR_R_OK) {
1623 ERR("request failed: %d", ret);
1627 g_variant_get(result, "(i&s)", &ret, &req_key);
1628 if (req_key == NULL) {
1629 g_variant_unref(result);
1630 return PKGMGR_R_ECOMM;
1632 if (ret != PKGMGR_R_OK) {
1633 g_variant_unref(result);
1637 cb_info = __create_size_info_cb_info(client, event_cb, user_data,
1639 if (cb_info == NULL) {
1640 g_variant_unref(result);
1641 return PKGMGR_R_ENOMEM;
1643 g_variant_unref(result);
1644 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1645 if (ret != PKGMGR_R_OK) {
1646 __free_cb_info(cb_info);
1649 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1654 API int pkgmgr_client_get_package_size_info(pkgmgr_client *pc,
1655 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
1658 return pkgmgr_client_usr_get_package_size_info(pc, pkgid, event_cb,
1659 user_data, _getuid());
1662 API int pkgmgr_client_usr_get_total_package_size_info(pkgmgr_client *pc,
1663 pkgmgr_total_pkg_size_info_receive_cb event_cb,
1664 void *user_data, uid_t uid)
1665 { /* total package size info */
1666 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL,
1667 (pkgmgr_pkg_size_info_receive_cb)event_cb,
1671 API int pkgmgr_client_get_total_package_size_info(pkgmgr_client *pc,
1672 pkgmgr_total_pkg_size_info_receive_cb event_cb, void *user_data)
1674 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL,
1675 (pkgmgr_pkg_size_info_receive_cb)event_cb,
1676 user_data, _getuid());
1679 API int pkgmgr_client_generate_license_request(pkgmgr_client *pc,
1680 const char *resp_data, char **req_data, char **license_url)
1686 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1688 if (pc == NULL || resp_data == NULL || req_data == NULL ||
1689 license_url == NULL) {
1690 ERR("invalid parameter");
1691 return PKGMGR_R_EINVAL;
1694 if (client->pc_type != PC_REQUEST) {
1695 ERR("client->pc_type is not PC_REQUEST");
1696 return PKGMGR_R_EINVAL;
1699 ret = pkgmgr_client_connection_send_request(client,
1700 "generate_license_request",
1701 g_variant_new("(s)", resp_data), &result);
1702 if (ret != PKGMGR_R_OK) {
1703 ERR("request failed: %d", ret);
1707 g_variant_get(result, "(i&s&s)", &ret, &data, &url);
1708 if (ret != PKGMGR_R_OK) {
1709 ERR("generate_license_request failed: %d", ret);
1710 g_variant_unref(result);
1714 *req_data = strdup(data);
1715 *license_url = strdup(url);
1717 g_variant_unref(result);
1722 API int pkgmgr_client_register_license(pkgmgr_client *pc, const char *resp_data)
1726 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1728 if (pc == NULL || resp_data == NULL) {
1729 ERR("invalid parameter");
1730 return PKGMGR_R_EINVAL;
1733 if (client->pc_type != PC_REQUEST) {
1734 ERR("client->pc_type is not PC_REQUEST");
1735 return PKGMGR_R_EINVAL;
1738 ret = pkgmgr_client_connection_send_request(client, "register_license",
1739 g_variant_new("(s)", resp_data), &result);
1740 if (ret != PKGMGR_R_OK) {
1741 ERR("request failed: %d", ret);
1745 g_variant_get(result, "(i)", &ret);
1746 g_variant_unref(result);
1747 if (ret != PKGMGR_R_OK)
1748 ERR("register license failed: %d", ret);
1753 API int pkgmgr_client_decrypt_package(pkgmgr_client *pc,
1754 const char *drm_file_path, const char *decrypted_file_path)
1758 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1760 if (pc == NULL || drm_file_path == NULL ||
1761 decrypted_file_path == NULL) {
1762 ERR("invalid parameter");
1763 return PKGMGR_R_EINVAL;
1766 if (client->pc_type != PC_REQUEST) {
1767 ERR("client->pc_type is not PC_REQUEST");
1768 return PKGMGR_R_EINVAL;
1771 ret = pkgmgr_client_connection_send_request(client, "decrypt_package",
1772 g_variant_new("(ss)", drm_file_path,
1773 decrypted_file_path), &result);
1774 if (ret != PKGMGR_R_OK) {
1775 ERR("request failed: %d", ret);
1779 g_variant_get(result, "(i)", &ret);
1780 g_variant_unref(result);
1781 if (ret != PKGMGR_R_OK)
1782 ERR("decrypt_package failed: %d", ret);
1787 API int pkgmgr_client_enable_splash_screen(pkgmgr_client *pc, const char *appid)
1789 return pkgmgr_client_usr_enable_splash_screen(pc, appid, _getuid());
1792 API int pkgmgr_client_usr_enable_splash_screen(pkgmgr_client *pc,
1793 const char *appid, uid_t uid)
1797 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1799 if (pc == NULL || appid == NULL) {
1800 ERR("Invalid parameter");
1801 return PKGMGR_R_EINVAL;
1804 ret = pkgmgr_client_connection_send_request(client,
1805 "enable_app_splash_screen",
1806 g_variant_new("(us)", uid, appid), &result);
1807 if (ret != PKGMGR_R_OK) {
1808 ERR("request failed: %d", ret);
1812 g_variant_get(result, "(i)", &ret);
1813 g_variant_unref(result);
1814 if (ret != PKGMGR_R_OK)
1815 ERR("enable splash screen failed: %d", ret);
1820 API int pkgmgr_client_disable_splash_screen(pkgmgr_client *pc,
1823 return pkgmgr_client_usr_disable_splash_screen(pc, appid,
1827 API int pkgmgr_client_usr_disable_splash_screen(pkgmgr_client *pc,
1828 const char *appid, uid_t uid)
1832 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1834 if (pc == NULL || appid == NULL) {
1835 ERR("Invalid parameter");
1836 return PKGMGR_R_EINVAL;
1839 ret = pkgmgr_client_connection_send_request(client,
1840 "disable_app_splash_screen",
1841 g_variant_new("(us)", uid, appid), &result);
1842 if (ret != PKGMGR_R_OK) {
1843 ERR("request failed: %d", ret);
1847 g_variant_get(result, "(i)", &ret);
1848 g_variant_unref(result);
1849 if (ret != PKGMGR_R_OK)
1850 ERR("disable splash screen failed: %d", ret);
1855 static int __set_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
1856 int mode, uid_t uid)
1859 int ret = PKGMGR_R_ECOMM;
1860 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1862 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
1863 ERR("invalid parameter");
1864 return PKGMGR_R_EINVAL;
1867 ret = pkgmgr_client_connection_send_request(client,
1868 "set_restriction_mode",
1869 g_variant_new("(usi)", uid, pkgid, mode), &result);
1870 if (ret != PKGMGR_R_OK) {
1871 ERR("request failed: %d", ret);
1875 g_variant_get(result, "(i)", &ret);
1876 g_variant_unref(result);
1881 API int pkgmgr_client_usr_set_pkg_restriction_mode(pkgmgr_client *pc,
1882 const char *pkgid, int mode, uid_t uid)
1884 return __set_pkg_restriction_mode(pc, pkgid, mode, uid);
1887 API int pkgmgr_client_set_pkg_restriction_mode(pkgmgr_client *pc,
1888 const char *pkgid, int mode)
1890 return pkgmgr_client_usr_set_pkg_restriction_mode(pc, pkgid, mode,
1894 static int __unset_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
1895 int mode, uid_t uid)
1898 int ret = PKGMGR_R_ECOMM;
1899 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1901 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
1902 ERR("invalid parameter");
1903 return PKGMGR_R_EINVAL;
1906 ret = pkgmgr_client_connection_send_request(client,
1907 "unset_restriction_mode",
1908 g_variant_new("(usi)", uid, pkgid, mode), &result);
1909 if (ret != PKGMGR_R_OK) {
1910 ERR("request failed: %d", ret);
1914 g_variant_get(result, "(i)", &ret);
1915 g_variant_unref(result);
1921 API int pkgmgr_client_usr_unset_pkg_restriction_mode(pkgmgr_client *pc,
1922 const char *pkgid, int mode, uid_t uid)
1924 return __unset_pkg_restriction_mode(pc, pkgid, mode, uid);
1927 API int pkgmgr_client_unset_pkg_restriction_mode(pkgmgr_client *pc,
1928 const char *pkgid, int mode)
1930 return pkgmgr_client_usr_unset_pkg_restriction_mode(pc, pkgid, mode,
1934 static int __get_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
1935 int *mode, uid_t uid)
1938 int ret = PKGMGR_R_ECOMM;
1940 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1942 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0) {
1943 ERR("invalid parameter");
1944 return PKGMGR_R_EINVAL;
1947 ret = pkgmgr_client_connection_send_request(client,
1948 "get_restriction_mode",
1949 g_variant_new("(us)", uid, pkgid), &result);
1950 if (ret != PKGMGR_R_OK) {
1951 ERR("request failed: %d", ret);
1955 g_variant_get(result, "(ii)", &m, &ret);
1956 g_variant_unref(result);
1957 if (ret != PKGMGR_R_OK)
1965 API int pkgmgr_client_usr_get_pkg_restriction_mode(pkgmgr_client *pc,
1966 const char *pkgid, int *mode, uid_t uid)
1968 return __get_pkg_restriction_mode(pc, pkgid, mode, uid);
1971 API int pkgmgr_client_get_pkg_restriction_mode(pkgmgr_client *pc,
1972 const char *pkgid, int *mode)
1974 return pkgmgr_client_usr_get_pkg_restriction_mode(pc, pkgid, mode,
1978 API int pkgmgr_client_usr_set_restriction_mode(pkgmgr_client *pc, int mode,
1982 int ret = PKGMGR_R_ECOMM;
1983 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1986 ERR("invalid parameter");
1987 return PKGMGR_R_EINVAL;
1990 ret = pkgmgr_client_connection_send_request(client,
1991 "set_restriction_mode",
1992 g_variant_new("(usi)", uid, "", mode), &result);
1993 if (ret != PKGMGR_R_OK) {
1994 ERR("request failed: %d", ret);
1998 g_variant_get(result, "(i)", &ret);
1999 g_variant_unref(result);
2004 API int pkgmgr_client_set_restriction_mode(pkgmgr_client *pc, int mode)
2006 return pkgmgr_client_usr_set_restriction_mode(pc, mode, _getuid());
2009 API int pkgmgr_client_usr_unset_restriction_mode(pkgmgr_client *pc, int mode,
2013 int ret = PKGMGR_R_ECOMM;
2014 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2017 ERR("invalid parameter");
2018 return PKGMGR_R_EINVAL;
2021 ret = pkgmgr_client_connection_send_request(client,
2022 "unset_restriction_mode",
2023 g_variant_new("(usi)", uid, "", mode), &result);
2024 if (ret != PKGMGR_R_OK) {
2025 ERR("request failed: %d", ret);
2029 g_variant_get(result, "(i)", &ret);
2030 g_variant_unref(result);
2035 API int pkgmgr_client_unset_restriction_mode(pkgmgr_client *pc, int mode)
2037 return pkgmgr_client_usr_unset_restriction_mode(pc, mode, _getuid());
2040 API int pkgmgr_client_usr_get_restriction_mode(pkgmgr_client *pc,
2041 int *mode, uid_t uid)
2044 int ret = PKGMGR_R_ECOMM;
2046 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2049 ERR("invalid parameter");
2050 return PKGMGR_R_EINVAL;
2053 ret = pkgmgr_client_connection_send_request(client,
2054 "get_restriction_mode",
2055 g_variant_new("(us)", uid, ""), &result);
2056 if (ret != PKGMGR_R_OK) {
2057 ERR("request failed: %d", ret);
2061 g_variant_get(result, "(ii)", &m, &ret);
2062 g_variant_unref(result);
2063 if (ret != PKGMGR_R_OK)
2071 API int pkgmgr_client_get_restriction_mode(pkgmgr_client *pc, int *mode)
2073 return pkgmgr_client_usr_get_restriction_mode(pc, mode, _getuid());
2076 API pkgmgr_info *pkgmgr_client_check_pkginfo_from_file(const char *pkg_path)
2079 pkg_plugin_set *plugin_set;
2080 package_manager_pkg_detail_info_t *info;
2083 if (pkg_path == NULL) {
2084 ERR("invalid parameter");
2088 pkg_type = __get_type_from_path(pkg_path);
2089 if (pkg_type == NULL) {
2090 ERR("cannot get pkg type");
2094 plugin_set = _package_manager_load_library(pkg_type);
2095 if (plugin_set == NULL) {
2096 ERR("failed to load library for %s", pkg_type);
2101 info = calloc(1, sizeof(package_manager_pkg_detail_info_t));
2103 ERR("out of memory");
2108 ret = plugin_set->get_pkg_detail_info_from_package(pkg_path, info);
2110 ERR("get_pkg_detail_info_from_package failed");
2118 return (pkgmgr_info *)info;
2121 API int pkgmgr_client_free_pkginfo(pkgmgr_info *info)
2123 package_manager_pkg_detail_info_t *pkg_info =
2124 (package_manager_pkg_detail_info_t *)info;
2127 ERR("invalid parameter");
2128 return PKGMGR_R_EINVAL;
2131 free(pkg_info->icon_buf);
2137 API int pkgmgr_client_usr_set_app_label(pkgmgr_client *pc, char *appid,
2138 char *label, uid_t uid)
2142 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2144 if (pc == NULL || appid == NULL || label == NULL) {
2145 ERR("Invalid parameter");
2146 return PKGMGR_R_EINVAL;
2149 ret = pkgmgr_client_connection_send_request(client,
2151 g_variant_new("(uss)", uid, appid, label), &result);
2152 if (ret != PKGMGR_R_OK) {
2153 ERR("Request failed: %d", ret);
2157 g_variant_get(result, "(i)", &ret);
2158 g_variant_unref(result);
2163 API int pkgmgr_client_set_app_label(pkgmgr_client *pc, char *appid, char *label)
2165 return pkgmgr_client_usr_set_app_label(pc, appid, label, _getuid());
2168 API int pkgmgr_client_set_debug_mode(pkgmgr_client *pc, bool debug_mode)
2170 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2173 ERR("invalid parameter");
2174 return PKGMGR_R_EINVAL;
2177 client->debug_mode = debug_mode;