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 BINSH_NAME "/bin/sh"
52 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
53 #define REGULAR_USER 5000
55 static inline uid_t _getuid(void)
59 if (uid < REGULAR_USER)
65 static int _get_request_id()
67 static int internal_req_id = 1;
69 return internal_req_id++;
72 static struct cb_info *__create_event_cb_info(struct pkgmgr_client_t *client,
73 pkgmgr_handler event_cb, void *data, const char *req_key)
75 struct cb_info *cb_info;
77 cb_info = calloc(1, sizeof(struct cb_info));
78 if (cb_info == NULL) {
82 cb_info->client = client;
83 cb_info->event_cb = event_cb;
85 cb_info->req_id = _get_request_id();
86 if (req_key != NULL) {
87 cb_info->req_key = strdup(req_key);
88 if (cb_info->req_key == NULL) {
98 static struct cb_info *__create_app_event_cb_info(
99 struct pkgmgr_client_t *client, pkgmgr_app_handler app_event_cb,
100 void *data, const char *req_key)
102 struct cb_info *cb_info;
104 cb_info = calloc(1, sizeof(struct cb_info));
105 if (cb_info == NULL) {
106 ERR("out of memory");
109 cb_info->client = client;
110 cb_info->app_event_cb = app_event_cb;
111 cb_info->data = data;
112 cb_info->req_id = _get_request_id();
113 if (req_key != NULL) {
114 cb_info->req_key = strdup(req_key);
115 if (cb_info->req_key == NULL) {
116 ERR("out of memory");
125 static struct cb_info *__create_size_info_cb_info(
126 struct pkgmgr_client_t *client,
127 pkgmgr_pkg_size_info_receive_cb size_info_cb,
128 void *data, const char *req_key)
130 struct cb_info *cb_info;
132 cb_info = calloc(1, sizeof(struct cb_info));
133 if (cb_info == NULL) {
134 ERR("out of memory");
137 cb_info->client = client;
138 cb_info->size_info_cb = size_info_cb;
139 cb_info->data = data;
140 cb_info->req_id = _get_request_id();
141 if (req_key != NULL) {
142 cb_info->req_key = strdup(req_key);
143 if (cb_info->req_key == NULL) {
144 ERR("out of memory");
153 static void __free_cb_info(struct cb_info *cb_info)
155 free(cb_info->req_key);
159 static int __get_size_process(pkgmgr_client *pc, const char *pkgid, uid_t uid,
160 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
164 int ret = PKGMGR_R_ECOMM;
165 long long size_info = 0;
166 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
168 if (pc == NULL || pkgid == NULL) {
169 ERR("invalid parameter");
170 return PKGMGR_R_EINVAL;
173 if (client->pc_type != PC_REQUEST) {
174 ERR("client->pc_type is not PC_REQUEST");
175 return PKGMGR_R_EINVAL;
178 ret = pkgmgr_client_connection_send_request(client, "getsize_sync",
179 g_variant_new("(usi)", uid, pkgid, get_type), &result);
180 if (ret != PKGMGR_R_OK) {
181 ERR("request failed: %d", ret);
185 g_variant_get(result, "(ix)", &ret, &size_info);
186 if (ret != PKGMGR_R_OK) {
187 ERR("request result failed: %d", ret);
188 g_variant_unref(result);
193 ERR("invalid size_info=(%d)", size_info);
196 ret = (int)size_info;
197 DBG("size_info(%lld), return size(%d)", size_info, ret);
200 g_variant_unref(result);
205 static int __move_pkg_process(pkgmgr_client *pc, const char *pkgid,
206 const char *pkg_type, uid_t uid, pkgmgr_move_type move_type,
207 pkgmgr_handler event_cb, void *data)
211 ret = pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type, event_cb, data, uid);
213 ERR("move request failed");
220 static int __check_app_process(pkgmgr_request_service_type service_type,
221 pkgmgr_client *pc, const char *pkgid, uid_t uid, void *data)
224 int ret = PKGMGR_R_ECOMM;
225 pkgmgrinfo_pkginfo_h handle;
227 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
229 retvm_if(client->pc_type != PC_REQUEST, PKGMGR_R_EINVAL, "client->pc_type is not PC_REQUEST\n");
231 if (uid != GLOBAL_USER)
232 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
234 ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle);
235 retvm_if(ret < 0, PKGMGR_R_ERROR, "pkgmgrinfo_pkginfo_get_pkginfo failed");
237 if (service_type == PM_REQUEST_KILL_APP)
238 ret = pkgmgr_client_connection_send_request(client, "kill",
239 g_variant_new("(us)", uid, pkgid), &result);
240 else if (service_type == PM_REQUEST_CHECK_APP)
241 ret = pkgmgr_client_connection_send_request(client, "check",
242 g_variant_new("(us)", uid, pkgid), &result);
243 if (ret != PKGMGR_R_OK) {
244 ERR("request failed: %d", ret);
248 g_variant_get(result, "(ii)", &ret, &pid);
249 g_variant_unref(result);
250 if (ret != PKGMGR_R_OK) {
251 ERR("request failed, ret=%d", ret);
257 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
263 static int __request_size_info(pkgmgr_client *pc, uid_t uid)
266 int ret = PKGMGR_R_ECOMM;
267 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
270 ERR("invalid parameter");
271 return PKGMGR_R_EINVAL;
274 if (client->pc_type != PC_REQUEST) {
275 ERR("client->pc_type is not PC_REQUEST");
276 return PKGMGR_R_EINVAL;
279 ret = pkgmgr_client_connection_send_request(client, "getsize",
280 g_variant_new("(usi)", uid, "size_info",
281 PM_GET_SIZE_INFO), &result);
282 if (ret != PKGMGR_R_OK) {
283 ERR("request failed: %d", ret);
287 /* just free result here because it cannot return result(reqkey) */
288 g_variant_unref(result);
293 API pkgmgr_client *pkgmgr_client_new(pkgmgr_client_type pc_type)
295 struct pkgmgr_client_t *client;
297 if (pc_type == PC_BROADCAST) {
298 ERR("broadcast type is not supported");
302 if (pc_type != PC_REQUEST && pc_type != PC_LISTENING) {
303 ERR("invalid parameter");
307 client = calloc(1, sizeof(struct pkgmgr_client_t));
308 if (client == NULL) {
309 ERR("out of memory");
313 client->pc_type = pc_type;
314 client->status_type = PKGMGR_CLIENT_STATUS_ALL;
316 if (pkgmgr_client_connection_connect(client))
319 return (pkgmgr_client *)client;
322 API int pkgmgr_client_free(pkgmgr_client *pc)
324 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
327 ERR("invalid argument");
328 return PKGMGR_R_EINVAL;
331 pkgmgr_client_remove_listen_status(client);
332 pkgmgr_client_connection_disconnect(client);
333 if (client->tep_path)
334 free(client->tep_path);
340 static char *__get_type_from_path(const char *pkg_path)
343 char mimetype[255] = { '\0', };
344 char extlist[256] = { '\0', };
347 ret = _get_mime_from_file(pkg_path, mimetype, sizeof(mimetype));
349 ERR("_get_mime_from_file() failed - error code[%d]\n", ret);
353 ret = _get_mime_extension(mimetype, extlist, sizeof(extlist));
355 ERR("_get_mime_extension() failed - error code[%d]\n", ret);
359 if (strlen(extlist) == 0)
362 if (strchr(extlist, ','))
363 extlist[strlen(extlist) - strlen(strchr(extlist, ','))] = '\0';
365 pkg_type = strchr(extlist, '.') + 1;
366 return strdup(pkg_type);
369 API int pkgmgr_client_set_tep_path(pkgmgr_client *pc, const char *tep_path,
372 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *) pc;
374 if (pc == NULL || tep_path == NULL) {
375 ERR("invalied parameter");
376 return PKGMGR_R_EINVAL;
379 if (client->tep_path)
380 free(client->tep_path);
382 client->tep_path = strdup(tep_path);
383 client->tep_move = tep_move;
388 API int pkgmgr_client_usr_install(pkgmgr_client *pc, const char *pkg_type,
389 const char *descriptor_path, const char *pkg_path,
390 const char *optional_data, pkgmgr_mode mode,
391 pkgmgr_handler event_cb, void *data, uid_t uid)
394 int ret = PKGMGR_R_ECOMM;
395 char *req_key = NULL;
396 GVariantBuilder *builder = NULL;
397 GVariant *args = NULL;
398 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
399 struct cb_info *cb_info;
401 if (pc == NULL || pkg_path == NULL) {
402 ERR("invalid parameter");
403 return PKGMGR_R_EINVAL;
406 if (client->pc_type != PC_REQUEST) {
407 ERR("client type is not PC_REQUEST");
408 return PKGMGR_R_EINVAL;
411 if (access(pkg_path, F_OK) != 0) {
412 ERR("failed to access: %s", pkg_path);
413 return PKGMGR_R_EINVAL;
416 if (client->tep_path != NULL && access(client->tep_path, F_OK) != 0) {
417 ERR("failed to access: %s", client->tep_path);
418 return PKGMGR_R_EINVAL;
421 /* build arguments */
422 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
423 if (client->tep_path) {
424 g_variant_builder_add(builder, "s", "-e");
425 g_variant_builder_add(builder, "s", client->tep_path);
426 g_variant_builder_add(builder, "s", "-M");
427 /* TODO: revise tep_move */
428 g_variant_builder_add(builder, "s",
429 client->tep_move ? "tep_move" : "tep_copy");
431 if (client->debug_mode)
432 g_variant_builder_add(builder, "s", "-G");
434 args = g_variant_new("as", builder);
435 g_variant_builder_unref(builder);
437 ret = pkgmgr_client_connection_send_request(client, "install",
438 g_variant_new("(uss@as)", uid, pkg_type ? pkg_type : "",
441 if (ret != PKGMGR_R_OK) {
442 ERR("request failed: %d", ret);
446 g_variant_get(result, "(i&s)", &ret, &req_key);
447 if (req_key == NULL) {
448 g_variant_unref(result);
449 return PKGMGR_R_ECOMM;
451 if (ret != PKGMGR_R_OK) {
452 g_variant_unref(result);
456 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
457 if (cb_info == NULL) {
458 g_variant_unref(result);
459 return PKGMGR_R_ENOMEM;
461 g_variant_unref(result);
462 ret = pkgmgr_client_connection_set_callback(client, cb_info);
463 if (ret != PKGMGR_R_OK) {
464 __free_cb_info(cb_info);
467 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
469 return cb_info->req_id;
472 API int pkgmgr_client_install(pkgmgr_client *pc, const char *pkg_type,
473 const char *descriptor_path, const char *pkg_path,
474 const char *optional_data, pkgmgr_mode mode,
475 pkgmgr_handler event_cb, void *data)
477 return pkgmgr_client_usr_install(pc, pkg_type, descriptor_path,
478 pkg_path, optional_data, mode, event_cb, data,
482 API int pkgmgr_client_reinstall(pkgmgr_client *pc, const char *pkg_type,
483 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
484 pkgmgr_handler event_cb, void *data)
486 return pkgmgr_client_usr_reinstall(pc, pkg_type, pkgid, optional_data,
487 mode, event_cb, data, _getuid());
490 API int pkgmgr_client_usr_reinstall(pkgmgr_client *pc, const char *pkg_type,
491 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
492 pkgmgr_handler event_cb, void *data, uid_t uid)
495 int ret = PKGMGR_R_ECOMM;
496 char *req_key = NULL;
497 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
498 struct cb_info *cb_info;
500 if (pc == NULL || pkgid == NULL) {
501 ERR("invalid parameter");
502 return PKGMGR_R_EINVAL;
505 if (client->pc_type != PC_REQUEST) {
506 ERR("client->pc_type is not PC_REQUEST");
507 return PKGMGR_R_EINVAL;
510 ret = pkgmgr_client_connection_send_request(client, "reinstall",
511 g_variant_new("(us)", uid, pkgid), &result);
512 if (ret != PKGMGR_R_OK) {
513 ERR("request failed: %d", ret);
517 g_variant_get(result, "(i&s)", &ret, &req_key);
518 if (req_key == NULL) {
519 g_variant_unref(result);
520 return PKGMGR_R_ECOMM;
522 if (ret != PKGMGR_R_OK) {
523 g_variant_unref(result);
527 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
528 if (cb_info == NULL) {
529 g_variant_unref(result);
530 return PKGMGR_R_ENOMEM;
532 g_variant_unref(result);
533 ret = pkgmgr_client_connection_set_callback(client, cb_info);
534 if (ret != PKGMGR_R_OK) {
535 __free_cb_info(cb_info);
538 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
540 return cb_info->req_id;
543 API int pkgmgr_client_usr_mount_install(pkgmgr_client *pc, const char *pkg_type,
544 const char *descriptor_path, const char *pkg_path,
545 const char *optional_data, pkgmgr_mode mode,
546 pkgmgr_handler event_cb, void *data, uid_t uid)
549 int ret = PKGMGR_R_ECOMM;
550 char *req_key = NULL;
551 GVariantBuilder *builder = NULL;
552 GVariant *args = NULL;
553 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
554 struct cb_info *cb_info;
556 if (pc == NULL || pkg_path == NULL) {
557 ERR("invalid parameter");
558 return PKGMGR_R_EINVAL;
561 if (client->pc_type != PC_REQUEST) {
562 ERR("client->pc_type is not PC_REQUEST");
563 return PKGMGR_R_EINVAL;
566 if (access(pkg_path, F_OK) != 0) {
567 ERR("failed to access: %s", pkg_path);
568 return PKGMGR_R_EINVAL;
571 if (client->tep_path != NULL && access(client->tep_path, F_OK) != 0) {
572 ERR("failed to access: %s", client->tep_path);
573 return PKGMGR_R_EINVAL;
576 /* build arguments */
577 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
578 if (client->tep_path) {
579 g_variant_builder_add(builder, "s", "-e");
580 g_variant_builder_add(builder, "s", client->tep_path);
581 g_variant_builder_add(builder, "s", "-M");
582 /* TODO: revise tep_move */
583 g_variant_builder_add(builder, "s",
584 client->tep_move ? "tep_move" : "tep_copy");
587 args = g_variant_new("as", builder);
588 g_variant_builder_unref(builder);
590 ret = pkgmgr_client_connection_send_request(client, "mount_install",
591 g_variant_new("(uss@as)", uid, pkg_type ? pkg_type : "",
594 if (ret != PKGMGR_R_OK) {
595 ERR("request failed: %d", ret);
599 g_variant_get(result, "(i&s)", &ret, &req_key);
600 if (req_key == NULL) {
601 g_variant_unref(result);
602 return PKGMGR_R_ECOMM;
604 if (ret != PKGMGR_R_OK) {
605 g_variant_unref(result);
609 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
610 if (cb_info == NULL) {
611 g_variant_unref(result);
612 return PKGMGR_R_ENOMEM;
614 g_variant_unref(result);
615 ret = pkgmgr_client_connection_set_callback(client, cb_info);
616 if (ret != PKGMGR_R_OK) {
617 __free_cb_info(cb_info);
620 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
622 return cb_info->req_id;
625 API int pkgmgr_client_mount_install(pkgmgr_client *pc, const char *pkg_type,
626 const char *descriptor_path, const char *pkg_path,
627 const char *optional_data, pkgmgr_mode mode,
628 pkgmgr_handler event_cb, void *data)
630 return pkgmgr_client_usr_mount_install(pc, pkg_type, descriptor_path,
631 pkg_path, optional_data, mode, event_cb, data,
635 API int pkgmgr_client_uninstall(pkgmgr_client *pc, const char *pkg_type,
636 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
639 return pkgmgr_client_usr_uninstall(pc, pkg_type, pkgid, mode, event_cb,
643 API int pkgmgr_client_usr_uninstall(pkgmgr_client *pc, const char *pkg_type,
644 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
645 void *data, uid_t uid)
648 int ret = PKGMGR_R_ECOMM;
649 char *req_key = NULL;
650 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
651 struct cb_info *cb_info;
653 if (pc == NULL || pkgid == NULL) {
654 ERR("invalid parameter");
655 return PKGMGR_R_EINVAL;
658 if (client->pc_type != PC_REQUEST) {
659 ERR("client->pc_type is not PC_REQUEST");
660 return PKGMGR_R_EINVAL;
663 ret = pkgmgr_client_connection_send_request(client, "uninstall",
664 g_variant_new("(us)", uid, pkgid), &result);
665 if (ret != PKGMGR_R_OK) {
666 ERR("request failed: %d", ret);
670 g_variant_get(result, "(i&s)", &ret, &req_key);
671 if (req_key == NULL) {
672 g_variant_unref(result);
673 return PKGMGR_R_ECOMM;
675 if (ret != PKGMGR_R_OK) {
676 g_variant_unref(result);
680 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
681 if (cb_info == NULL) {
682 g_variant_unref(result);
683 return PKGMGR_R_ENOMEM;
685 g_variant_unref(result);
686 ret = pkgmgr_client_connection_set_callback(client, cb_info);
687 if (ret != PKGMGR_R_OK) {
688 __free_cb_info(cb_info);
691 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
693 return cb_info->req_id;
696 API int pkgmgr_client_move(pkgmgr_client *pc, const char *pkg_type,
697 const char *pkgid, pkgmgr_move_type move_type,
698 pkgmgr_handler event_cb, void *data)
700 return pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type,
701 event_cb, data, _getuid());
703 API int pkgmgr_client_usr_move(pkgmgr_client *pc, const char *pkg_type,
704 const char *pkgid, pkgmgr_move_type move_type,
705 pkgmgr_handler event_cb, void *data, uid_t uid)
708 int ret = PKGMGR_R_ECOMM;
709 char *req_key = NULL;
710 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
711 struct cb_info *cb_info;
713 if (pc == NULL || pkgid == NULL) {
714 ERR("invalid parameter");
715 return PKGMGR_R_EINVAL;
718 if ((move_type < PM_MOVE_TO_INTERNAL) ||
719 (move_type > PM_MOVE_TO_SDCARD))
720 return PKGMGR_R_EINVAL;
722 if (client->pc_type != PC_REQUEST) {
723 ERR("client->pc_type is not PC_REQUEST");
724 return PKGMGR_R_EINVAL;
727 ret = pkgmgr_client_connection_send_request(client, "move",
728 g_variant_new("(usi)", uid, pkgid, move_type), &result);
729 if (ret != PKGMGR_R_OK) {
730 ERR("request failed: %d", ret);
734 g_variant_get(result, "(i&s)", &ret, &req_key);
735 if (req_key == NULL) {
736 g_variant_unref(result);
737 return PKGMGR_R_ECOMM;
739 if (ret != PKGMGR_R_OK) {
740 g_variant_unref(result);
744 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
745 if (cb_info == NULL) {
746 g_variant_unref(result);
747 return PKGMGR_R_ERROR;
749 g_variant_unref(result);
750 ret = pkgmgr_client_connection_set_callback(client, cb_info);
751 if (ret != PKGMGR_R_OK) {
752 __free_cb_info(cb_info);
755 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
757 return cb_info->req_id;
760 API int pkgmgr_client_usr_activate(pkgmgr_client *pc, const char *pkg_type,
761 const char *pkgid, uid_t uid)
764 int ret = PKGMGR_R_ECOMM;
765 GVariantBuilder *builder;
766 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
768 if (pc == NULL || pkgid == NULL) {
769 ERR("invalid parameter");
770 return PKGMGR_R_EINVAL;
773 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
774 g_variant_builder_add(builder, "s", pkgid);
776 ret = pkgmgr_client_connection_send_request(client, "enable_pkgs",
777 g_variant_new("(uas)", uid, builder), &result);
778 g_variant_builder_unref(builder);
779 if (ret != PKGMGR_R_OK) {
780 ERR("request failed: %d", ret);
784 g_variant_get(result, "(is)", &ret, NULL);
785 g_variant_unref(result);
790 API int pkgmgr_client_activate(pkgmgr_client *pc, const char *pkg_type,
793 return pkgmgr_client_usr_activate(pc, pkg_type, pkgid, _getuid());
796 API int pkgmgr_client_usr_activate_packages(pkgmgr_client *pc,
797 const char *pkg_type, const char **pkgids, int n_pkgs,
798 pkgmgr_handler event_cb, void *data, uid_t uid)
801 GVariantBuilder *builder;
802 int ret = PKGMGR_R_ECOMM;
803 char *req_key = NULL;
804 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
805 struct cb_info *cb_info;
808 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
809 ERR("invalid parameter");
810 return PKGMGR_R_EINVAL;
813 if (client->pc_type != PC_REQUEST) {
814 ERR("client type is not PC_REQUEST");
815 return PKGMGR_R_EINVAL;
818 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
819 for (i = 0; i < n_pkgs; i++)
820 g_variant_builder_add(builder, "s", pkgids[i]);
822 ret = pkgmgr_client_connection_send_request(client, "enable_pkgs",
823 g_variant_new("(uas)", uid, builder), &result);
824 g_variant_builder_unref(builder);
825 if (ret != PKGMGR_R_OK) {
826 ERR("request failed: %d", ret);
830 g_variant_get(result, "(i&s)", &ret, &req_key);
831 if (req_key == NULL) {
832 g_variant_unref(result);
833 return PKGMGR_R_ECOMM;
835 if (ret != PKGMGR_R_OK) {
836 g_variant_unref(result);
840 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
841 if (cb_info == NULL) {
842 g_variant_unref(result);
843 return PKGMGR_R_ERROR;
845 g_variant_unref(result);
846 ret = pkgmgr_client_connection_set_callback(client, cb_info);
847 if (ret != PKGMGR_R_OK) {
848 __free_cb_info(cb_info);
851 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
853 return cb_info->req_id;
856 API int pkgmgr_client_activate_packages(pkgmgr_client *pc,
857 const char *pkg_type, const char **pkgids, int n_pkgs,
858 pkgmgr_handler event_cb, void *data)
860 return pkgmgr_client_usr_activate_packages(pc, pkg_type,
861 pkgids, n_pkgs, event_cb, data, _getuid());
864 API int pkgmgr_client_usr_deactivate(pkgmgr_client *pc, const char *pkg_type,
865 const char *pkgid, uid_t uid)
868 GVariantBuilder *builder;
869 int ret = PKGMGR_R_ECOMM;
870 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
872 if (pc == NULL || pkgid == NULL) {
873 ERR("invalid parameter");
874 return PKGMGR_R_EINVAL;
877 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
878 g_variant_builder_add(builder, "s", pkgid);
880 ret = pkgmgr_client_connection_send_request(client, "disable_pkgs",
881 g_variant_new("(uas)", uid, builder), &result);
882 g_variant_builder_unref(builder);
883 if (ret != PKGMGR_R_OK) {
884 ERR("request failed: %d", ret);
888 g_variant_get(result, "(is)", &ret, NULL);
889 g_variant_unref(result);
894 API int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type,
897 return pkgmgr_client_usr_deactivate(pc, pkg_type, pkgid, _getuid());
900 API int pkgmgr_client_usr_deactivate_packages(pkgmgr_client *pc,
901 const char *pkg_type, const char **pkgids, int n_pkgs,
902 pkgmgr_handler event_cb, void *data, uid_t uid)
905 GVariantBuilder *builder;
906 int ret = PKGMGR_R_ECOMM;
907 char *req_key = NULL;
908 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
909 struct cb_info *cb_info;
912 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
913 ERR("invalid parameter");
914 return PKGMGR_R_EINVAL;
917 if (client->pc_type != PC_REQUEST) {
918 ERR("client type is not PC_REQUEST");
919 return PKGMGR_R_EINVAL;
922 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
923 for (i = 0; i < n_pkgs; i++)
924 g_variant_builder_add(builder, "s", pkgids[i]);
926 ret = pkgmgr_client_connection_send_request(client, "disable_pkgs",
927 g_variant_new("(uas)", uid, builder), &result);
928 g_variant_builder_unref(builder);
929 if (ret != PKGMGR_R_OK) {
930 ERR("request failed: %d", ret);
934 g_variant_get(result, "(i&s)", &ret, &req_key);
935 if (req_key == NULL) {
936 g_variant_unref(result);
937 return PKGMGR_R_ECOMM;
939 if (ret != PKGMGR_R_OK) {
940 g_variant_unref(result);
944 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
945 if (cb_info == NULL) {
946 g_variant_unref(result);
947 return PKGMGR_R_ERROR;
949 g_variant_unref(result);
950 ret = pkgmgr_client_connection_set_callback(client, cb_info);
951 if (ret != PKGMGR_R_OK) {
952 __free_cb_info(cb_info);
955 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
957 return cb_info->req_id;
960 API int pkgmgr_client_deactivate_packages(pkgmgr_client *pc,
961 const char *pkg_type, const char **pkgids, int n_pkgs,
962 pkgmgr_handler event_cb, void *data)
964 return pkgmgr_client_usr_deactivate_packages(pc, pkg_type,
965 pkgids, n_pkgs, event_cb, data, _getuid());
968 API int pkgmgr_client_usr_activate_app(pkgmgr_client *pc, const char *appid,
969 pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
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;
977 if (pc == NULL || appid == NULL) {
978 ERR("invalid parameter");
979 return PKGMGR_R_EINVAL;
982 ret = pkgmgr_client_connection_send_request(client, "enable_app",
983 g_variant_new("(us)", uid, appid), &result);
984 if (ret != PKGMGR_R_OK) {
985 ERR("request failed: %d", ret);
989 g_variant_get(result, "(i&s)", &ret, &req_key);
990 if (req_key == NULL) {
991 g_variant_unref(result);
992 return PKGMGR_R_ECOMM;
994 if (ret != PKGMGR_R_OK) {
995 g_variant_unref(result);
999 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1001 if (cb_info == NULL) {
1002 g_variant_unref(result);
1003 return PKGMGR_R_ENOMEM;
1005 g_variant_unref(result);
1006 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1007 if (ret != PKGMGR_R_OK) {
1008 __free_cb_info(cb_info);
1011 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1016 API int pkgmgr_client_activate_app(pkgmgr_client *pc, const char *appid,
1017 pkgmgr_app_handler app_event_cb, void *data)
1019 return pkgmgr_client_usr_activate_app(pc, appid, app_event_cb,
1023 API int pkgmgr_client_activate_global_app_for_uid(pkgmgr_client *pc,
1024 const char *appid, pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1027 int ret = PKGMGR_R_ECOMM;
1028 char *req_key = NULL;
1029 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1030 struct cb_info *cb_info;
1032 if (pc == NULL || appid == NULL) {
1033 ERR("invalid parameter");
1034 return PKGMGR_R_EINVAL;
1037 ret = pkgmgr_client_connection_send_request(client,
1038 "enable_global_app_for_uid",
1039 g_variant_new("(us)", uid, appid), &result);
1040 if (ret != PKGMGR_R_OK) {
1041 ERR("request failed: %d", ret);
1045 g_variant_get(result, "(i&s)", &ret, &req_key);
1046 if (req_key == NULL) {
1047 g_variant_unref(result);
1048 return PKGMGR_R_ECOMM;
1050 if (ret != PKGMGR_R_OK) {
1051 g_variant_unref(result);
1055 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1057 if (cb_info == NULL) {
1058 g_variant_unref(result);
1059 return PKGMGR_R_ENOMEM;
1061 g_variant_unref(result);
1062 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1063 if (ret != PKGMGR_R_OK) {
1064 __free_cb_info(cb_info);
1067 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1072 API int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid,
1073 pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1076 int ret = PKGMGR_R_ECOMM;
1077 char *req_key = NULL;
1078 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1079 struct cb_info *cb_info;
1081 if (pc == NULL || appid == NULL) {
1082 ERR("invalid parameter");
1083 return PKGMGR_R_EINVAL;
1086 ret = pkgmgr_client_connection_send_request(client, "disable_app",
1087 g_variant_new("(us)", uid, appid), &result);
1088 if (ret != PKGMGR_R_OK) {
1089 ERR("request failed: %d", ret);
1093 g_variant_get(result, "(i&s)", &ret, &req_key);
1094 if (req_key == NULL) {
1095 g_variant_unref(result);
1096 return PKGMGR_R_ECOMM;
1098 if (ret != PKGMGR_R_OK) {
1099 g_variant_unref(result);
1103 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1105 if (cb_info == NULL) {
1106 g_variant_unref(result);
1107 return PKGMGR_R_ENOMEM;
1109 g_variant_unref(result);
1110 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1111 if (ret != PKGMGR_R_OK) {
1112 __free_cb_info(cb_info);
1115 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1120 API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid,
1121 pkgmgr_app_handler app_event_cb, void *data)
1123 return pkgmgr_client_usr_deactivate_app(pc, appid, app_event_cb, data,
1127 API int pkgmgr_client_deactivate_global_app_for_uid(pkgmgr_client *pc,
1128 const char *appid, pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1131 int ret = PKGMGR_R_ECOMM;
1132 char *req_key = NULL;
1133 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1134 struct cb_info *cb_info;
1136 if (pc == NULL || appid == NULL) {
1137 ERR("invalid parameter");
1138 return PKGMGR_R_EINVAL;
1141 ret = pkgmgr_client_connection_send_request(client,
1142 "disable_global_app_for_uid",
1143 g_variant_new("(us)", uid, appid), &result);
1144 if (ret != PKGMGR_R_OK) {
1145 ERR("request failed: %d", ret);
1149 g_variant_get(result, "(i&s)", &ret, &req_key);
1150 if (req_key == NULL) {
1151 g_variant_unref(result);
1152 return PKGMGR_R_ECOMM;
1154 if (ret != PKGMGR_R_OK) {
1155 g_variant_unref(result);
1159 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1161 if (cb_info == NULL) {
1162 g_variant_unref(result);
1163 return PKGMGR_R_ENOMEM;
1165 g_variant_unref(result);
1166 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1167 if (ret != PKGMGR_R_OK) {
1168 __free_cb_info(cb_info);
1171 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1176 API int pkgmgr_client_usr_clear_user_data(pkgmgr_client *pc,
1177 const char *pkg_type, const char *appid, pkgmgr_mode mode,
1182 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1184 if (pc == NULL || appid == NULL || uid == GLOBAL_USER) {
1185 ERR("invalid parameter");
1186 return PKGMGR_R_EINVAL;
1189 if (client->pc_type != PC_REQUEST) {
1190 ERR("client->pc_type is not PC_REQUEST");
1191 return PKGMGR_R_EINVAL;
1194 ret = pkgmgr_client_connection_send_request(client, "cleardata",
1195 g_variant_new("(us)", uid, appid), &result);
1196 if (ret != PKGMGR_R_OK) {
1197 ERR("request failed: %d", ret);
1201 g_variant_get(result, "(i)", &ret);
1202 g_variant_unref(result);
1207 API int pkgmgr_client_clear_user_data(pkgmgr_client *pc, const char *pkg_type,
1208 const char *appid, pkgmgr_mode mode)
1210 return pkgmgr_client_usr_clear_user_data(pc, pkg_type, appid, mode,
1214 API int pkgmgr_client_set_status_type(pkgmgr_client *pc, int status_type)
1216 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1219 ERR("invalid parameter");
1220 return PKGMGR_R_EINVAL;
1223 client->status_type = status_type;
1228 API int pkgmgr_client_listen_status(pkgmgr_client *pc, pkgmgr_handler event_cb,
1232 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1233 struct cb_info *cb_info;
1235 if (pc == NULL || event_cb == NULL) {
1236 ERR("invalid parameter");
1237 return PKGMGR_R_EINVAL;
1240 if (client->pc_type != PC_LISTENING) {
1241 ERR("client->pc_type is not PC_LISTENING");
1242 return PKGMGR_R_EINVAL;
1245 cb_info = __create_event_cb_info(client, event_cb, data, NULL);
1246 if (cb_info == NULL)
1247 return PKGMGR_R_ENOMEM;
1248 cb_info->status_type = client->status_type;
1249 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1250 if (ret != PKGMGR_R_OK) {
1251 __free_cb_info(cb_info);
1254 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1256 return cb_info->req_id;
1259 API int pkgmgr_client_listen_app_status(pkgmgr_client *pc,
1260 pkgmgr_app_handler app_event_cb, void *data)
1263 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1264 struct cb_info *cb_info;
1266 if (pc == NULL || app_event_cb == NULL) {
1267 ERR("invalid parameter");
1268 return PKGMGR_R_EINVAL;
1271 if (client->pc_type != PC_LISTENING) {
1272 ERR("client->pc_type is not PC_LISTENING");
1273 return PKGMGR_R_EINVAL;
1276 cb_info = __create_app_event_cb_info(client, app_event_cb, data, NULL);
1277 if (cb_info == NULL)
1278 return PKGMGR_R_ENOMEM;
1279 cb_info->status_type = client->status_type;
1280 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1281 if (ret != PKGMGR_R_OK) {
1282 __free_cb_info(cb_info);
1285 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1287 return cb_info->req_id;
1290 API int pkgmgr_client_remove_listen_status(pkgmgr_client *pc)
1292 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1295 struct cb_info *cb_info;
1298 ERR("invalid parameter");
1299 return PKGMGR_R_EINVAL;
1302 /* unset all callback */
1303 tmp = client->cb_info_list;
1304 while (tmp != NULL) {
1306 cb_info = (struct cb_info *)tmp->data;
1307 pkgmgr_client_connection_unset_callback(pc, cb_info);
1308 client->cb_info_list = g_list_delete_link(client->cb_info_list,
1310 __free_cb_info(cb_info);
1317 API int pkgmgr_client_broadcast_status(pkgmgr_client *pc, const char *pkg_type,
1318 const char *pkgid, const char *key, const char *val)
1320 /* client cannot broadcast signal */
1324 /* TODO: deprecate(or remove) */
1325 API int pkgmgr_client_request_service(pkgmgr_request_service_type service_type,
1326 int service_mode, pkgmgr_client *pc, const char *pkg_type,
1327 const char *pkgid, const char *custom_info,
1328 pkgmgr_handler event_cb, void *data)
1330 return pkgmgr_client_usr_request_service(service_type, service_mode,
1331 pc, pkg_type, pkgid, _getuid(), custom_info, event_cb,
1335 API int pkgmgr_client_usr_request_service(
1336 pkgmgr_request_service_type service_type, int service_mode,
1337 pkgmgr_client *pc, const char *pkg_type, const char *pkgid,
1338 uid_t uid, const char *custom_info, pkgmgr_handler event_cb,
1343 /* Check for NULL value of service type */
1344 retvm_if(service_type > PM_REQUEST_MAX, PKGMGR_R_EINVAL, "service type is not defined\n");
1345 retvm_if(service_type < 0, PKGMGR_R_EINVAL, "service type is error\n");
1347 switch (service_type) {
1348 case PM_REQUEST_MOVE:
1349 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1350 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1351 tryvm_if((service_mode < PM_MOVE_TO_INTERNAL) || (service_mode > PM_MOVE_TO_SDCARD), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1353 ret = __move_pkg_process(pc, pkgid, pkg_type, uid, (pkgmgr_move_type)service_mode, event_cb, data);
1356 case PM_REQUEST_GET_SIZE:
1357 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1358 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1359 tryvm_if((service_mode < PM_GET_TOTAL_SIZE) || (service_mode >= PM_GET_MAX), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1361 ret = __get_size_process(pc, pkgid, uid, (pkgmgr_getsize_type)service_mode, event_cb, data);
1364 case PM_REQUEST_KILL_APP:
1365 case PM_REQUEST_CHECK_APP:
1366 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1367 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1369 ret = __check_app_process(service_type, pc, pkgid, uid, data);
1371 ERR("__check_app_process fail \n");
1378 ERR("Wrong Request\n");
1389 API int pkgmgr_client_usr_request_size_info(uid_t uid)
1392 struct pkgmgr_client *client;
1394 client = pkgmgr_client_new(PC_REQUEST);
1395 if (client == NULL) {
1396 ERR("out of memory");
1397 return PKGMGR_R_ENOMEM;
1400 ret = __request_size_info(client, uid);
1402 ERR("__request_size_info fail");
1404 pkgmgr_client_free(client);
1408 API int pkgmgr_client_request_size_info(void)
1410 /* get all package size (data, total) */
1411 return pkgmgr_client_usr_request_size_info(_getuid());
1414 API int pkgmgr_client_usr_clear_cache_dir(const char *pkgid, uid_t uid)
1418 struct pkgmgr_client_t *client;
1420 if (pkgid == NULL || uid == GLOBAL_USER) {
1421 ERR("invalid parameter");
1422 return PKGMGR_R_EINVAL;
1425 client = pkgmgr_client_new(PC_REQUEST);
1426 if (client == NULL) {
1427 ERR("out of memory");
1428 return PKGMGR_R_ENOMEM;
1431 ret = pkgmgr_client_connection_send_request(client, "clearcache",
1432 g_variant_new("(us)", uid, pkgid), &result);
1433 if (ret != PKGMGR_R_OK) {
1434 ERR("request failed: %d", ret);
1438 g_variant_get(result, "(i)", &ret);
1439 g_variant_unref(result);
1444 API int pkgmgr_client_clear_cache_dir(const char *pkgid)
1446 return pkgmgr_client_usr_clear_cache_dir(pkgid, _getuid());
1449 API int pkgmgr_client_clear_usr_all_cache_dir(uid_t uid)
1451 return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, uid);
1454 API int pkgmgr_client_clear_all_cache_dir(void)
1456 return pkgmgr_client_usr_clear_cache_dir(
1457 PKG_CLEAR_ALL_CACHE, _getuid());
1460 API int pkgmgr_client_get_size(pkgmgr_client *pc, const char *pkgid,
1461 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
1464 return pkgmgr_client_usr_get_size(pc, pkgid, get_type, event_cb, data,
1468 /* TODO: deprecate(or remove) */
1469 API int pkgmgr_client_usr_get_size(pkgmgr_client *pc, const char *pkgid,
1470 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
1471 void *data, uid_t uid)
1474 int ret = PKGMGR_R_ECOMM;
1475 char *req_key = NULL;
1476 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1477 struct cb_info *cb_info;
1479 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
1480 ERR("invalid parameter");
1481 return PKGMGR_R_EINVAL;
1484 if (client->pc_type != PC_REQUEST) {
1485 ERR("client->pc_type is not PC_REQUEST");
1486 return PKGMGR_R_EINVAL;
1490 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
1491 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
1493 get_type = PM_GET_PKG_SIZE_INFO;
1495 ret = pkgmgr_client_connection_send_request(client, "getsize",
1496 g_variant_new("(usi)", uid, pkgid, get_type), &result);
1497 if (ret != PKGMGR_R_OK) {
1498 ERR("request failed: %d", ret);
1502 g_variant_get(result, "(i&s)", &ret, &req_key);
1503 if (req_key == NULL) {
1504 g_variant_unref(result);
1505 return PKGMGR_R_ECOMM;
1507 if (ret != PKGMGR_R_OK) {
1508 g_variant_unref(result);
1512 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1513 if (cb_info == NULL) {
1514 g_variant_unref(result);
1515 return PKGMGR_R_ENOMEM;
1517 g_variant_unref(result);
1518 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1519 if (ret != PKGMGR_R_OK) {
1520 __free_cb_info(cb_info);
1523 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1528 API int pkgmgr_client_usr_get_package_size_info(pkgmgr_client *pc,
1529 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
1530 void *user_data, uid_t uid)
1533 int ret = PKGMGR_R_ECOMM;
1534 char *req_key = NULL;
1536 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1537 struct cb_info *cb_info;
1539 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
1540 ERR("invalid parameter");
1541 return PKGMGR_R_EINVAL;
1544 if (client->pc_type != PC_REQUEST) {
1545 ERR("client->pc_type is not PC_REQUEST");
1546 return PKGMGR_R_EINVAL;
1549 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
1550 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
1552 get_type = PM_GET_PKG_SIZE_INFO;
1554 ret = pkgmgr_client_connection_send_request(client, "getsize",
1555 g_variant_new("(usi)", uid, pkgid, get_type), &result);
1556 if (ret != PKGMGR_R_OK) {
1557 ERR("request failed: %d", ret);
1561 g_variant_get(result, "(i&s)", &ret, &req_key);
1562 if (req_key == NULL) {
1563 g_variant_unref(result);
1564 return PKGMGR_R_ECOMM;
1566 if (ret != PKGMGR_R_OK) {
1567 g_variant_unref(result);
1571 cb_info = __create_size_info_cb_info(client, event_cb, user_data,
1573 if (cb_info == NULL) {
1574 g_variant_unref(result);
1575 return PKGMGR_R_ENOMEM;
1577 g_variant_unref(result);
1578 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1579 if (ret != PKGMGR_R_OK) {
1580 __free_cb_info(cb_info);
1583 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1588 API int pkgmgr_client_get_package_size_info(pkgmgr_client *pc,
1589 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
1592 return pkgmgr_client_usr_get_package_size_info(pc, pkgid, event_cb,
1593 user_data, _getuid());
1596 API int pkgmgr_client_usr_get_total_package_size_info(pkgmgr_client *pc,
1597 pkgmgr_total_pkg_size_info_receive_cb event_cb,
1598 void *user_data, uid_t uid)
1599 { /* total package size info */
1600 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL,
1601 (pkgmgr_pkg_size_info_receive_cb)event_cb,
1605 API int pkgmgr_client_get_total_package_size_info(pkgmgr_client *pc,
1606 pkgmgr_total_pkg_size_info_receive_cb event_cb, void *user_data)
1608 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL,
1609 (pkgmgr_pkg_size_info_receive_cb)event_cb,
1610 user_data, _getuid());
1613 API int pkgmgr_client_generate_license_request(pkgmgr_client *pc,
1614 const char *resp_data, char **req_data, char **license_url)
1620 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1622 if (pc == NULL || resp_data == NULL || req_data == NULL ||
1623 license_url == NULL) {
1624 ERR("invalid parameter");
1625 return PKGMGR_R_EINVAL;
1628 if (client->pc_type != PC_REQUEST) {
1629 ERR("client->pc_type is not PC_REQUEST");
1630 return PKGMGR_R_EINVAL;
1633 ret = pkgmgr_client_connection_send_request(client,
1634 "generate_license_request",
1635 g_variant_new("(s)", resp_data), &result);
1636 if (ret != PKGMGR_R_OK) {
1637 ERR("request failed: %d", ret);
1641 g_variant_get(result, "(i&s&s)", &ret, &data, &url);
1642 if (ret != PKGMGR_R_OK) {
1643 ERR("generate_license_request failed: %d", ret);
1644 g_variant_unref(result);
1648 *req_data = strdup(data);
1649 *license_url = strdup(url);
1651 g_variant_unref(result);
1656 API int pkgmgr_client_register_license(pkgmgr_client *pc, const char *resp_data)
1660 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1662 if (pc == NULL || resp_data == NULL) {
1663 ERR("invalid parameter");
1664 return PKGMGR_R_EINVAL;
1667 if (client->pc_type != PC_REQUEST) {
1668 ERR("client->pc_type is not PC_REQUEST");
1669 return PKGMGR_R_EINVAL;
1672 ret = pkgmgr_client_connection_send_request(client, "register_license",
1673 g_variant_new("(s)", resp_data), &result);
1674 if (ret != PKGMGR_R_OK) {
1675 ERR("request failed: %d", ret);
1679 g_variant_get(result, "(i)", &ret);
1680 g_variant_unref(result);
1681 if (ret != PKGMGR_R_OK)
1682 ERR("register license failed: %d", ret);
1687 API int pkgmgr_client_decrypt_package(pkgmgr_client *pc,
1688 const char *drm_file_path, const char *decrypted_file_path)
1692 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1694 if (pc == NULL || drm_file_path == NULL ||
1695 decrypted_file_path == NULL) {
1696 ERR("invalid parameter");
1697 return PKGMGR_R_EINVAL;
1700 if (client->pc_type != PC_REQUEST) {
1701 ERR("client->pc_type is not PC_REQUEST");
1702 return PKGMGR_R_EINVAL;
1705 ret = pkgmgr_client_connection_send_request(client, "decrypt_package",
1706 g_variant_new("(ss)", drm_file_path,
1707 decrypted_file_path), &result);
1708 if (ret != PKGMGR_R_OK) {
1709 ERR("request failed: %d", ret);
1713 g_variant_get(result, "(i)", &ret);
1714 g_variant_unref(result);
1715 if (ret != PKGMGR_R_OK)
1716 ERR("decrypt_package failed: %d", ret);
1721 API int pkgmgr_client_enable_splash_screen(pkgmgr_client *pc, const char *appid)
1723 return pkgmgr_client_usr_enable_splash_screen(pc, appid, _getuid());
1726 API int pkgmgr_client_usr_enable_splash_screen(pkgmgr_client *pc,
1727 const char *appid, uid_t uid)
1731 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1733 if (pc == NULL || appid == NULL) {
1734 ERR("Invalid parameter");
1735 return PKGMGR_R_EINVAL;
1738 ret = pkgmgr_client_connection_send_request(client,
1739 "enable_app_splash_screen",
1740 g_variant_new("(us)", uid, appid), &result);
1741 if (ret != PKGMGR_R_OK) {
1742 ERR("request failed: %d", ret);
1746 g_variant_get(result, "(i)", &ret);
1747 g_variant_unref(result);
1748 if (ret != PKGMGR_R_OK)
1749 ERR("enable splash screen failed: %d", ret);
1754 API int pkgmgr_client_disable_splash_screen(pkgmgr_client *pc,
1757 return pkgmgr_client_usr_disable_splash_screen(pc, appid,
1761 API int pkgmgr_client_usr_disable_splash_screen(pkgmgr_client *pc,
1762 const char *appid, uid_t uid)
1766 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1768 if (pc == NULL || appid == NULL) {
1769 ERR("Invalid parameter");
1770 return PKGMGR_R_EINVAL;
1773 ret = pkgmgr_client_connection_send_request(client,
1774 "disable_app_splash_screen",
1775 g_variant_new("(us)", uid, appid), &result);
1776 if (ret != PKGMGR_R_OK) {
1777 ERR("request failed: %d", ret);
1781 g_variant_get(result, "(i)", &ret);
1782 g_variant_unref(result);
1783 if (ret != PKGMGR_R_OK)
1784 ERR("disable splash screen failed: %d", ret);
1789 static int __set_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
1790 int mode, uid_t uid)
1793 int ret = PKGMGR_R_ECOMM;
1794 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1796 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
1797 ERR("invalid parameter");
1798 return PKGMGR_R_EINVAL;
1801 ret = pkgmgr_client_connection_send_request(client,
1802 "set_restriction_mode",
1803 g_variant_new("(usi)", uid, pkgid, mode), &result);
1804 if (ret != PKGMGR_R_OK) {
1805 ERR("request failed: %d", ret);
1809 g_variant_get(result, "(i)", &ret);
1810 g_variant_unref(result);
1815 API int pkgmgr_client_usr_set_pkg_restriction_mode(pkgmgr_client *pc,
1816 const char *pkgid, int mode, uid_t uid)
1818 return __set_pkg_restriction_mode(pc, pkgid, mode, uid);
1821 API int pkgmgr_client_set_pkg_restriction_mode(pkgmgr_client *pc,
1822 const char *pkgid, int mode)
1824 return pkgmgr_client_usr_set_pkg_restriction_mode(pc, pkgid, mode,
1828 static int __unset_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
1829 int mode, uid_t uid)
1832 int ret = PKGMGR_R_ECOMM;
1833 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1835 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
1836 ERR("invalid parameter");
1837 return PKGMGR_R_EINVAL;
1840 ret = pkgmgr_client_connection_send_request(client,
1841 "unset_restriction_mode",
1842 g_variant_new("(usi)", uid, pkgid, mode), &result);
1843 if (ret != PKGMGR_R_OK) {
1844 ERR("request failed: %d", ret);
1848 g_variant_get(result, "(i)", &ret);
1849 g_variant_unref(result);
1855 API int pkgmgr_client_usr_unset_pkg_restriction_mode(pkgmgr_client *pc,
1856 const char *pkgid, int mode, uid_t uid)
1858 return __unset_pkg_restriction_mode(pc, pkgid, mode, uid);
1861 API int pkgmgr_client_unset_pkg_restriction_mode(pkgmgr_client *pc,
1862 const char *pkgid, int mode)
1864 return pkgmgr_client_usr_unset_pkg_restriction_mode(pc, pkgid, mode,
1868 static int __get_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
1869 int *mode, uid_t uid)
1872 int ret = PKGMGR_R_ECOMM;
1874 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1876 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0) {
1877 ERR("invalid parameter");
1878 return PKGMGR_R_EINVAL;
1881 ret = pkgmgr_client_connection_send_request(client,
1882 "get_restriction_mode",
1883 g_variant_new("(us)", uid, pkgid), &result);
1884 if (ret != PKGMGR_R_OK) {
1885 ERR("request failed: %d", ret);
1889 g_variant_get(result, "(ii)", &m, &ret);
1890 g_variant_unref(result);
1891 if (ret != PKGMGR_R_OK)
1899 API int pkgmgr_client_usr_get_pkg_restriction_mode(pkgmgr_client *pc,
1900 const char *pkgid, int *mode, uid_t uid)
1902 return __get_pkg_restriction_mode(pc, pkgid, mode, uid);
1905 API int pkgmgr_client_get_pkg_restriction_mode(pkgmgr_client *pc,
1906 const char *pkgid, int *mode)
1908 return pkgmgr_client_usr_get_pkg_restriction_mode(pc, pkgid, mode,
1912 API int pkgmgr_client_usr_set_restriction_mode(pkgmgr_client *pc, int mode,
1916 int ret = PKGMGR_R_ECOMM;
1917 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1920 ERR("invalid parameter");
1921 return PKGMGR_R_EINVAL;
1924 ret = pkgmgr_client_connection_send_request(client,
1925 "set_restriction_mode",
1926 g_variant_new("(usi)", uid, "", mode), &result);
1927 if (ret != PKGMGR_R_OK) {
1928 ERR("request failed: %d", ret);
1932 g_variant_get(result, "(i)", &ret);
1933 g_variant_unref(result);
1938 API int pkgmgr_client_set_restriction_mode(pkgmgr_client *pc, int mode)
1940 return pkgmgr_client_usr_set_restriction_mode(pc, mode, _getuid());
1943 API int pkgmgr_client_usr_unset_restriction_mode(pkgmgr_client *pc, int mode,
1947 int ret = PKGMGR_R_ECOMM;
1948 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1951 ERR("invalid parameter");
1952 return PKGMGR_R_EINVAL;
1955 ret = pkgmgr_client_connection_send_request(client,
1956 "unset_restriction_mode",
1957 g_variant_new("(usi)", uid, "", mode), &result);
1958 if (ret != PKGMGR_R_OK) {
1959 ERR("request failed: %d", ret);
1963 g_variant_get(result, "(i)", &ret);
1964 g_variant_unref(result);
1969 API int pkgmgr_client_unset_restriction_mode(pkgmgr_client *pc, int mode)
1971 return pkgmgr_client_usr_unset_restriction_mode(pc, mode, _getuid());
1974 API int pkgmgr_client_usr_get_restriction_mode(pkgmgr_client *pc,
1975 int *mode, uid_t uid)
1978 int ret = PKGMGR_R_ECOMM;
1980 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1983 ERR("invalid parameter");
1984 return PKGMGR_R_EINVAL;
1987 ret = pkgmgr_client_connection_send_request(client,
1988 "get_restriction_mode",
1989 g_variant_new("(us)", uid, ""), &result);
1990 if (ret != PKGMGR_R_OK) {
1991 ERR("request failed: %d", ret);
1995 g_variant_get(result, "(ii)", &m, &ret);
1996 g_variant_unref(result);
1997 if (ret != PKGMGR_R_OK)
2005 API int pkgmgr_client_get_restriction_mode(pkgmgr_client *pc, int *mode)
2007 return pkgmgr_client_usr_get_restriction_mode(pc, mode, _getuid());
2010 API pkgmgr_info *pkgmgr_client_check_pkginfo_from_file(const char *pkg_path)
2013 pkg_plugin_set *plugin_set;
2014 package_manager_pkg_detail_info_t *info;
2017 if (pkg_path == NULL) {
2018 ERR("invalid parameter");
2022 pkg_type = __get_type_from_path(pkg_path);
2023 if (pkg_type == NULL) {
2024 ERR("cannot get pkg type");
2028 plugin_set = _package_manager_load_library(pkg_type);
2029 if (plugin_set == NULL) {
2030 ERR("failed to load library for %s", pkg_type);
2035 info = calloc(1, sizeof(package_manager_pkg_detail_info_t));
2037 ERR("out of memory");
2042 ret = plugin_set->get_pkg_detail_info_from_package(pkg_path, info);
2044 ERR("get_pkg_detail_info_from_package failed");
2052 return (pkgmgr_info *)info;
2055 API int pkgmgr_client_free_pkginfo(pkgmgr_info *info)
2057 package_manager_pkg_detail_info_t *pkg_info =
2058 (package_manager_pkg_detail_info_t *)info;
2061 ERR("invalid parameter");
2062 return PKGMGR_R_EINVAL;
2065 free(pkg_info->icon_buf);
2071 API int pkgmgr_client_usr_set_app_label(pkgmgr_client *pc, char *appid,
2072 char *label, uid_t uid)
2076 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2078 if (pc == NULL || appid == NULL || label == NULL) {
2079 ERR("Invalid parameter");
2080 return PKGMGR_R_EINVAL;
2083 ret = pkgmgr_client_connection_send_request(client,
2085 g_variant_new("(uss)", uid, appid, label), &result);
2086 if (ret != PKGMGR_R_OK) {
2087 ERR("Request failed: %d", ret);
2091 g_variant_get(result, "(i)", &ret);
2092 g_variant_unref(result);
2097 API int pkgmgr_client_set_app_label(pkgmgr_client *pc, char *appid, char *label)
2099 return pkgmgr_client_usr_set_app_label(pc, appid, label, _getuid());
2102 API int pkgmgr_client_set_debug_mode(pkgmgr_client *pc, bool debug_mode)
2104 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2107 ERR("invalid parameter");
2108 return PKGMGR_R_EINVAL;
2111 client->debug_mode = debug_mode;
2116 API int pkgmgr_client_usr_migrate_external_image(pkgmgr_client *pc,
2117 const char *pkgid, uid_t uid)
2120 int ret = PKGMGR_R_ECOMM;
2121 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2124 ERR("invalid parameter");
2125 return PKGMGR_R_EINVAL;
2128 ret = pkgmgr_client_connection_send_request(client,
2129 "migrate_external_image",
2130 g_variant_new("(us)", uid, pkgid), &result);
2131 if (ret != PKGMGR_R_OK) {
2132 ERR("request failed: %d", ret);
2136 g_variant_get(result, "(i)", &ret);
2137 g_variant_unref(result);