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);
1013 return cb_info->req_id;
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_usr_activate_apps(pkgmgr_client *pc, const char **appids,
1024 int n_apps, pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1027 GVariantBuilder *builder;
1028 int ret = PKGMGR_R_ECOMM;
1029 char *req_key = NULL;
1030 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1031 struct cb_info *cb_info;
1034 if (pc == NULL || appids == NULL || n_apps < 1) {
1035 ERR("invalid parameter");
1036 return PKGMGR_R_EINVAL;
1039 if (client->pc_type != PC_REQUEST) {
1040 ERR("client type is not PC_REQUEST");
1041 return PKGMGR_R_EINVAL;
1044 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1045 for (i = 0; i < n_apps; i++)
1046 g_variant_builder_add(builder, "s", appids[i]);
1048 ret = pkgmgr_client_connection_send_request(client, "enable_apps",
1049 g_variant_new("(uas)", uid, builder), &result);
1050 g_variant_builder_unref(builder);
1051 if (ret != PKGMGR_R_OK) {
1052 ERR("request failed: %d", ret);
1056 g_variant_get(result, "(i&s)", &ret, &req_key);
1057 if (req_key == NULL) {
1058 g_variant_unref(result);
1059 return PKGMGR_R_ECOMM;
1061 if (ret != PKGMGR_R_OK) {
1062 g_variant_unref(result);
1066 cb_info = __create_app_event_cb_info(client, app_event_cb, data, req_key);
1067 if (cb_info == NULL) {
1068 g_variant_unref(result);
1069 return PKGMGR_R_ERROR;
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);
1079 return cb_info->req_id;
1082 API int pkgmgr_client_activate_apps(pkgmgr_client *pc, const char **appids,
1083 int n_apps, pkgmgr_app_handler app_event_cb, void *data)
1085 return pkgmgr_client_usr_activate_apps(pc, appids, n_apps,
1086 app_event_cb, data, _getuid());
1089 API int pkgmgr_client_activate_global_app_for_uid(pkgmgr_client *pc,
1090 const char *appid, pkgmgr_app_handler app_event_cb, void *data, 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, data,
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);
1135 return cb_info->req_id;
1138 API int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid,
1139 pkgmgr_app_handler app_event_cb, void *data, 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, data,
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);
1183 return cb_info->req_id;
1186 API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid,
1187 pkgmgr_app_handler app_event_cb, void *data)
1189 return pkgmgr_client_usr_deactivate_app(pc, appid, app_event_cb, data,
1193 API int pkgmgr_client_usr_deactivate_apps(pkgmgr_client *pc,
1194 const char **appids, int n_apps,
1195 pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1198 GVariantBuilder *builder;
1199 int ret = PKGMGR_R_ECOMM;
1200 char *req_key = NULL;
1201 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1202 struct cb_info *cb_info;
1205 if (pc == NULL || appids == NULL || n_apps < 1) {
1206 ERR("invalid parameter");
1207 return PKGMGR_R_EINVAL;
1210 if (client->pc_type != PC_REQUEST) {
1211 ERR("client type is not PC_REQUEST");
1212 return PKGMGR_R_EINVAL;
1215 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1216 for (i = 0; i < n_apps; i++)
1217 g_variant_builder_add(builder, "s", appids[i]);
1219 ret = pkgmgr_client_connection_send_request(client, "disable_apps",
1220 g_variant_new("(uas)", uid, builder), &result);
1221 g_variant_builder_unref(builder);
1222 if (ret != PKGMGR_R_OK) {
1223 ERR("request failed: %d", ret);
1227 g_variant_get(result, "(i&s)", &ret, &req_key);
1228 if (req_key == NULL) {
1229 g_variant_unref(result);
1230 return PKGMGR_R_ECOMM;
1232 if (ret != PKGMGR_R_OK) {
1233 g_variant_unref(result);
1237 cb_info = __create_app_event_cb_info(client, app_event_cb, data, req_key);
1238 if (cb_info == NULL) {
1239 g_variant_unref(result);
1240 return PKGMGR_R_ERROR;
1242 g_variant_unref(result);
1243 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1244 if (ret != PKGMGR_R_OK) {
1245 __free_cb_info(cb_info);
1248 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1250 return cb_info->req_id;
1253 API int pkgmgr_client_deactivate_apps(pkgmgr_client *pc, const char **appids,
1254 int n_apps, pkgmgr_app_handler app_event_cb, void *data)
1256 return pkgmgr_client_usr_deactivate_apps(pc, appids, n_apps,
1257 app_event_cb, data, _getuid());
1260 API int pkgmgr_client_deactivate_global_app_for_uid(pkgmgr_client *pc,
1261 const char *appid, pkgmgr_app_handler app_event_cb, void *data, uid_t uid)
1264 int ret = PKGMGR_R_ECOMM;
1265 char *req_key = NULL;
1266 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1267 struct cb_info *cb_info;
1269 if (pc == NULL || appid == NULL) {
1270 ERR("invalid parameter");
1271 return PKGMGR_R_EINVAL;
1274 ret = pkgmgr_client_connection_send_request(client,
1275 "disable_global_app_for_uid",
1276 g_variant_new("(us)", uid, appid), &result);
1277 if (ret != PKGMGR_R_OK) {
1278 ERR("request failed: %d", ret);
1282 g_variant_get(result, "(i&s)", &ret, &req_key);
1283 if (req_key == NULL) {
1284 g_variant_unref(result);
1285 return PKGMGR_R_ECOMM;
1287 if (ret != PKGMGR_R_OK) {
1288 g_variant_unref(result);
1292 cb_info = __create_app_event_cb_info(client, app_event_cb, data,
1294 if (cb_info == NULL) {
1295 g_variant_unref(result);
1296 return PKGMGR_R_ENOMEM;
1298 g_variant_unref(result);
1299 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1300 if (ret != PKGMGR_R_OK) {
1301 __free_cb_info(cb_info);
1304 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1306 return cb_info->req_id;
1309 API int pkgmgr_client_usr_clear_user_data(pkgmgr_client *pc,
1310 const char *pkg_type, const char *appid, pkgmgr_mode mode,
1315 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1317 if (pc == NULL || appid == NULL || uid == GLOBAL_USER) {
1318 ERR("invalid parameter");
1319 return PKGMGR_R_EINVAL;
1322 if (client->pc_type != PC_REQUEST) {
1323 ERR("client->pc_type is not PC_REQUEST");
1324 return PKGMGR_R_EINVAL;
1327 ret = pkgmgr_client_connection_send_request(client, "cleardata",
1328 g_variant_new("(us)", uid, appid), &result);
1329 if (ret != PKGMGR_R_OK) {
1330 ERR("request failed: %d", ret);
1334 g_variant_get(result, "(i)", &ret);
1335 g_variant_unref(result);
1340 API int pkgmgr_client_clear_user_data(pkgmgr_client *pc, const char *pkg_type,
1341 const char *appid, pkgmgr_mode mode)
1343 return pkgmgr_client_usr_clear_user_data(pc, pkg_type, appid, mode,
1347 API int pkgmgr_client_set_status_type(pkgmgr_client *pc, int status_type)
1349 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1352 ERR("invalid parameter");
1353 return PKGMGR_R_EINVAL;
1356 client->status_type = status_type;
1361 API int pkgmgr_client_listen_status(pkgmgr_client *pc, pkgmgr_handler event_cb,
1365 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1366 struct cb_info *cb_info;
1368 if (pc == NULL || event_cb == NULL) {
1369 ERR("invalid parameter");
1370 return PKGMGR_R_EINVAL;
1373 if (client->pc_type != PC_LISTENING) {
1374 ERR("client->pc_type is not PC_LISTENING");
1375 return PKGMGR_R_EINVAL;
1378 cb_info = __create_event_cb_info(client, event_cb, data, NULL);
1379 if (cb_info == NULL)
1380 return PKGMGR_R_ENOMEM;
1381 cb_info->status_type = client->status_type;
1382 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1383 if (ret != PKGMGR_R_OK) {
1384 __free_cb_info(cb_info);
1387 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1389 return cb_info->req_id;
1392 API int pkgmgr_client_listen_app_status(pkgmgr_client *pc,
1393 pkgmgr_app_handler app_event_cb, void *data)
1396 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1397 struct cb_info *cb_info;
1399 if (pc == NULL || app_event_cb == NULL) {
1400 ERR("invalid parameter");
1401 return PKGMGR_R_EINVAL;
1404 if (client->pc_type != PC_LISTENING) {
1405 ERR("client->pc_type is not PC_LISTENING");
1406 return PKGMGR_R_EINVAL;
1409 cb_info = __create_app_event_cb_info(client, app_event_cb, data, NULL);
1410 if (cb_info == NULL)
1411 return PKGMGR_R_ENOMEM;
1412 cb_info->status_type = client->status_type;
1413 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1414 if (ret != PKGMGR_R_OK) {
1415 __free_cb_info(cb_info);
1418 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1420 return cb_info->req_id;
1423 API int pkgmgr_client_remove_listen_status(pkgmgr_client *pc)
1425 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1428 struct cb_info *cb_info;
1431 ERR("invalid parameter");
1432 return PKGMGR_R_EINVAL;
1435 /* unset all callback */
1436 tmp = client->cb_info_list;
1437 while (tmp != NULL) {
1439 cb_info = (struct cb_info *)tmp->data;
1440 pkgmgr_client_connection_unset_callback(pc, cb_info);
1441 client->cb_info_list = g_list_delete_link(client->cb_info_list,
1443 __free_cb_info(cb_info);
1450 API int pkgmgr_client_broadcast_status(pkgmgr_client *pc, const char *pkg_type,
1451 const char *pkgid, const char *key, const char *val)
1453 /* client cannot broadcast signal */
1457 /* TODO: deprecate(or remove) */
1458 API int pkgmgr_client_request_service(pkgmgr_request_service_type service_type,
1459 int service_mode, pkgmgr_client *pc, const char *pkg_type,
1460 const char *pkgid, const char *custom_info,
1461 pkgmgr_handler event_cb, void *data)
1463 return pkgmgr_client_usr_request_service(service_type, service_mode,
1464 pc, pkg_type, pkgid, _getuid(), custom_info, event_cb,
1468 API int pkgmgr_client_usr_request_service(
1469 pkgmgr_request_service_type service_type, int service_mode,
1470 pkgmgr_client *pc, const char *pkg_type, const char *pkgid,
1471 uid_t uid, const char *custom_info, pkgmgr_handler event_cb,
1476 /* Check for NULL value of service type */
1477 retvm_if(service_type > PM_REQUEST_MAX, PKGMGR_R_EINVAL, "service type is not defined\n");
1478 retvm_if(service_type < 0, PKGMGR_R_EINVAL, "service type is error\n");
1480 switch (service_type) {
1481 case PM_REQUEST_MOVE:
1482 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1483 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1484 tryvm_if((service_mode < PM_MOVE_TO_INTERNAL) || (service_mode > PM_MOVE_TO_SDCARD), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1486 ret = __move_pkg_process(pc, pkgid, pkg_type, uid, (pkgmgr_move_type)service_mode, event_cb, data);
1489 case PM_REQUEST_GET_SIZE:
1490 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1491 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1492 tryvm_if((service_mode < PM_GET_TOTAL_SIZE) || (service_mode >= PM_GET_MAX), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1494 ret = __get_size_process(pc, pkgid, uid, (pkgmgr_getsize_type)service_mode, event_cb, data);
1497 case PM_REQUEST_KILL_APP:
1498 case PM_REQUEST_CHECK_APP:
1499 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1500 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1502 ret = __check_app_process(service_type, pc, pkgid, uid, data);
1504 ERR("__check_app_process fail \n");
1511 ERR("Wrong Request\n");
1522 API int pkgmgr_client_usr_request_size_info(uid_t uid)
1525 struct pkgmgr_client *client;
1527 client = pkgmgr_client_new(PC_REQUEST);
1528 if (client == NULL) {
1529 ERR("out of memory");
1530 return PKGMGR_R_ENOMEM;
1533 ret = __request_size_info(client, uid);
1535 ERR("__request_size_info fail");
1537 pkgmgr_client_free(client);
1541 API int pkgmgr_client_request_size_info(void)
1543 /* get all package size (data, total) */
1544 return pkgmgr_client_usr_request_size_info(_getuid());
1547 API int pkgmgr_client_usr_clear_cache_dir(const char *pkgid, uid_t uid)
1551 struct pkgmgr_client_t *client;
1553 if (pkgid == NULL || uid == GLOBAL_USER) {
1554 ERR("invalid parameter");
1555 return PKGMGR_R_EINVAL;
1558 client = pkgmgr_client_new(PC_REQUEST);
1559 if (client == NULL) {
1560 ERR("out of memory");
1561 return PKGMGR_R_ENOMEM;
1564 ret = pkgmgr_client_connection_send_request(client, "clearcache",
1565 g_variant_new("(us)", uid, pkgid), &result);
1566 if (ret != PKGMGR_R_OK) {
1567 ERR("request failed: %d", ret);
1571 g_variant_get(result, "(i)", &ret);
1572 g_variant_unref(result);
1577 API int pkgmgr_client_clear_cache_dir(const char *pkgid)
1579 return pkgmgr_client_usr_clear_cache_dir(pkgid, _getuid());
1582 API int pkgmgr_client_clear_usr_all_cache_dir(uid_t uid)
1584 return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, uid);
1587 API int pkgmgr_client_clear_all_cache_dir(void)
1589 return pkgmgr_client_usr_clear_cache_dir(
1590 PKG_CLEAR_ALL_CACHE, _getuid());
1593 API int pkgmgr_client_get_size(pkgmgr_client *pc, const char *pkgid,
1594 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
1597 return pkgmgr_client_usr_get_size(pc, pkgid, get_type, event_cb, data,
1601 /* TODO: deprecate(or remove) */
1602 API int pkgmgr_client_usr_get_size(pkgmgr_client *pc, const char *pkgid,
1603 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
1604 void *data, uid_t uid)
1607 int ret = PKGMGR_R_ECOMM;
1608 char *req_key = NULL;
1609 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1610 struct cb_info *cb_info;
1612 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
1613 ERR("invalid parameter");
1614 return PKGMGR_R_EINVAL;
1617 if (client->pc_type != PC_REQUEST) {
1618 ERR("client->pc_type is not PC_REQUEST");
1619 return PKGMGR_R_EINVAL;
1623 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
1624 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
1626 get_type = PM_GET_PKG_SIZE_INFO;
1628 ret = pkgmgr_client_connection_send_request(client, "getsize",
1629 g_variant_new("(usi)", uid, pkgid, get_type), &result);
1630 if (ret != PKGMGR_R_OK) {
1631 ERR("request failed: %d", ret);
1635 g_variant_get(result, "(i&s)", &ret, &req_key);
1636 if (req_key == NULL) {
1637 g_variant_unref(result);
1638 return PKGMGR_R_ECOMM;
1640 if (ret != PKGMGR_R_OK) {
1641 g_variant_unref(result);
1645 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1646 if (cb_info == NULL) {
1647 g_variant_unref(result);
1648 return PKGMGR_R_ENOMEM;
1650 g_variant_unref(result);
1651 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1652 if (ret != PKGMGR_R_OK) {
1653 __free_cb_info(cb_info);
1656 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1661 API int pkgmgr_client_usr_get_package_size_info(pkgmgr_client *pc,
1662 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
1663 void *user_data, uid_t uid)
1666 int ret = PKGMGR_R_ECOMM;
1667 char *req_key = NULL;
1669 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1670 struct cb_info *cb_info;
1672 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
1673 ERR("invalid parameter");
1674 return PKGMGR_R_EINVAL;
1677 if (client->pc_type != PC_REQUEST) {
1678 ERR("client->pc_type is not PC_REQUEST");
1679 return PKGMGR_R_EINVAL;
1682 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
1683 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
1685 get_type = PM_GET_PKG_SIZE_INFO;
1687 ret = pkgmgr_client_connection_send_request(client, "getsize",
1688 g_variant_new("(usi)", uid, pkgid, get_type), &result);
1689 if (ret != PKGMGR_R_OK) {
1690 ERR("request failed: %d", ret);
1694 g_variant_get(result, "(i&s)", &ret, &req_key);
1695 if (req_key == NULL) {
1696 g_variant_unref(result);
1697 return PKGMGR_R_ECOMM;
1699 if (ret != PKGMGR_R_OK) {
1700 g_variant_unref(result);
1704 cb_info = __create_size_info_cb_info(client, event_cb, user_data,
1706 if (cb_info == NULL) {
1707 g_variant_unref(result);
1708 return PKGMGR_R_ENOMEM;
1710 g_variant_unref(result);
1711 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1712 if (ret != PKGMGR_R_OK) {
1713 __free_cb_info(cb_info);
1716 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1721 API int pkgmgr_client_get_package_size_info(pkgmgr_client *pc,
1722 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
1725 return pkgmgr_client_usr_get_package_size_info(pc, pkgid, event_cb,
1726 user_data, _getuid());
1729 API int pkgmgr_client_usr_get_total_package_size_info(pkgmgr_client *pc,
1730 pkgmgr_total_pkg_size_info_receive_cb event_cb,
1731 void *user_data, uid_t uid)
1732 { /* total package size info */
1733 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL,
1734 (pkgmgr_pkg_size_info_receive_cb)event_cb,
1738 API int pkgmgr_client_get_total_package_size_info(pkgmgr_client *pc,
1739 pkgmgr_total_pkg_size_info_receive_cb event_cb, void *user_data)
1741 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL,
1742 (pkgmgr_pkg_size_info_receive_cb)event_cb,
1743 user_data, _getuid());
1746 API int pkgmgr_client_generate_license_request(pkgmgr_client *pc,
1747 const char *resp_data, char **req_data, char **license_url)
1753 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1755 if (pc == NULL || resp_data == NULL || req_data == NULL ||
1756 license_url == NULL) {
1757 ERR("invalid parameter");
1758 return PKGMGR_R_EINVAL;
1761 if (client->pc_type != PC_REQUEST) {
1762 ERR("client->pc_type is not PC_REQUEST");
1763 return PKGMGR_R_EINVAL;
1766 ret = pkgmgr_client_connection_send_request(client,
1767 "generate_license_request",
1768 g_variant_new("(s)", resp_data), &result);
1769 if (ret != PKGMGR_R_OK) {
1770 ERR("request failed: %d", ret);
1774 g_variant_get(result, "(i&s&s)", &ret, &data, &url);
1775 if (ret != PKGMGR_R_OK) {
1776 ERR("generate_license_request failed: %d", ret);
1777 g_variant_unref(result);
1781 *req_data = strdup(data);
1782 *license_url = strdup(url);
1784 g_variant_unref(result);
1789 API int pkgmgr_client_register_license(pkgmgr_client *pc, const char *resp_data)
1793 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1795 if (pc == NULL || resp_data == NULL) {
1796 ERR("invalid parameter");
1797 return PKGMGR_R_EINVAL;
1800 if (client->pc_type != PC_REQUEST) {
1801 ERR("client->pc_type is not PC_REQUEST");
1802 return PKGMGR_R_EINVAL;
1805 ret = pkgmgr_client_connection_send_request(client, "register_license",
1806 g_variant_new("(s)", resp_data), &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("register license failed: %d", ret);
1820 API int pkgmgr_client_decrypt_package(pkgmgr_client *pc,
1821 const char *drm_file_path, const char *decrypted_file_path)
1825 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1827 if (pc == NULL || drm_file_path == NULL ||
1828 decrypted_file_path == NULL) {
1829 ERR("invalid parameter");
1830 return PKGMGR_R_EINVAL;
1833 if (client->pc_type != PC_REQUEST) {
1834 ERR("client->pc_type is not PC_REQUEST");
1835 return PKGMGR_R_EINVAL;
1838 ret = pkgmgr_client_connection_send_request(client, "decrypt_package",
1839 g_variant_new("(ss)", drm_file_path,
1840 decrypted_file_path), &result);
1841 if (ret != PKGMGR_R_OK) {
1842 ERR("request failed: %d", ret);
1846 g_variant_get(result, "(i)", &ret);
1847 g_variant_unref(result);
1848 if (ret != PKGMGR_R_OK)
1849 ERR("decrypt_package failed: %d", ret);
1854 API int pkgmgr_client_enable_splash_screen(pkgmgr_client *pc, const char *appid)
1856 return pkgmgr_client_usr_enable_splash_screen(pc, appid, _getuid());
1859 API int pkgmgr_client_usr_enable_splash_screen(pkgmgr_client *pc,
1860 const char *appid, uid_t uid)
1864 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1866 if (pc == NULL || appid == NULL) {
1867 ERR("Invalid parameter");
1868 return PKGMGR_R_EINVAL;
1871 ret = pkgmgr_client_connection_send_request(client,
1872 "enable_app_splash_screen",
1873 g_variant_new("(us)", uid, appid), &result);
1874 if (ret != PKGMGR_R_OK) {
1875 ERR("request failed: %d", ret);
1879 g_variant_get(result, "(i)", &ret);
1880 g_variant_unref(result);
1881 if (ret != PKGMGR_R_OK)
1882 ERR("enable splash screen failed: %d", ret);
1887 API int pkgmgr_client_disable_splash_screen(pkgmgr_client *pc,
1890 return pkgmgr_client_usr_disable_splash_screen(pc, appid,
1894 API int pkgmgr_client_usr_disable_splash_screen(pkgmgr_client *pc,
1895 const char *appid, uid_t uid)
1899 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1901 if (pc == NULL || appid == NULL) {
1902 ERR("Invalid parameter");
1903 return PKGMGR_R_EINVAL;
1906 ret = pkgmgr_client_connection_send_request(client,
1907 "disable_app_splash_screen",
1908 g_variant_new("(us)", uid, appid), &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);
1916 if (ret != PKGMGR_R_OK)
1917 ERR("disable splash screen failed: %d", ret);
1922 static int __set_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
1923 int mode, uid_t uid)
1926 int ret = PKGMGR_R_ECOMM;
1927 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1929 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
1930 ERR("invalid parameter");
1931 return PKGMGR_R_EINVAL;
1934 ret = pkgmgr_client_connection_send_request(client,
1935 "set_restriction_mode",
1936 g_variant_new("(usi)", uid, pkgid, mode), &result);
1937 if (ret != PKGMGR_R_OK) {
1938 ERR("request failed: %d", ret);
1942 g_variant_get(result, "(i)", &ret);
1943 g_variant_unref(result);
1948 API int pkgmgr_client_usr_set_pkg_restriction_mode(pkgmgr_client *pc,
1949 const char *pkgid, int mode, uid_t uid)
1951 return __set_pkg_restriction_mode(pc, pkgid, mode, uid);
1954 API int pkgmgr_client_set_pkg_restriction_mode(pkgmgr_client *pc,
1955 const char *pkgid, int mode)
1957 return pkgmgr_client_usr_set_pkg_restriction_mode(pc, pkgid, mode,
1961 static int __unset_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
1962 int mode, uid_t uid)
1965 int ret = PKGMGR_R_ECOMM;
1966 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1968 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
1969 ERR("invalid parameter");
1970 return PKGMGR_R_EINVAL;
1973 ret = pkgmgr_client_connection_send_request(client,
1974 "unset_restriction_mode",
1975 g_variant_new("(usi)", uid, pkgid, mode), &result);
1976 if (ret != PKGMGR_R_OK) {
1977 ERR("request failed: %d", ret);
1981 g_variant_get(result, "(i)", &ret);
1982 g_variant_unref(result);
1988 API int pkgmgr_client_usr_unset_pkg_restriction_mode(pkgmgr_client *pc,
1989 const char *pkgid, int mode, uid_t uid)
1991 return __unset_pkg_restriction_mode(pc, pkgid, mode, uid);
1994 API int pkgmgr_client_unset_pkg_restriction_mode(pkgmgr_client *pc,
1995 const char *pkgid, int mode)
1997 return pkgmgr_client_usr_unset_pkg_restriction_mode(pc, pkgid, mode,
2001 static int __get_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
2002 int *mode, uid_t uid)
2005 int ret = PKGMGR_R_ECOMM;
2007 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2009 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0) {
2010 ERR("invalid parameter");
2011 return PKGMGR_R_EINVAL;
2014 ret = pkgmgr_client_connection_send_request(client,
2015 "get_restriction_mode",
2016 g_variant_new("(us)", uid, pkgid), &result);
2017 if (ret != PKGMGR_R_OK) {
2018 ERR("request failed: %d", ret);
2022 g_variant_get(result, "(ii)", &m, &ret);
2023 g_variant_unref(result);
2024 if (ret != PKGMGR_R_OK)
2032 API int pkgmgr_client_usr_get_pkg_restriction_mode(pkgmgr_client *pc,
2033 const char *pkgid, int *mode, uid_t uid)
2035 return __get_pkg_restriction_mode(pc, pkgid, mode, uid);
2038 API int pkgmgr_client_get_pkg_restriction_mode(pkgmgr_client *pc,
2039 const char *pkgid, int *mode)
2041 return pkgmgr_client_usr_get_pkg_restriction_mode(pc, pkgid, mode,
2045 API int pkgmgr_client_usr_set_restriction_mode(pkgmgr_client *pc, int mode,
2049 int ret = PKGMGR_R_ECOMM;
2050 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2053 ERR("invalid parameter");
2054 return PKGMGR_R_EINVAL;
2057 ret = pkgmgr_client_connection_send_request(client,
2058 "set_restriction_mode",
2059 g_variant_new("(usi)", uid, "", mode), &result);
2060 if (ret != PKGMGR_R_OK) {
2061 ERR("request failed: %d", ret);
2065 g_variant_get(result, "(i)", &ret);
2066 g_variant_unref(result);
2071 API int pkgmgr_client_set_restriction_mode(pkgmgr_client *pc, int mode)
2073 return pkgmgr_client_usr_set_restriction_mode(pc, mode, _getuid());
2076 API int pkgmgr_client_usr_unset_restriction_mode(pkgmgr_client *pc, int mode,
2080 int ret = PKGMGR_R_ECOMM;
2081 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2084 ERR("invalid parameter");
2085 return PKGMGR_R_EINVAL;
2088 ret = pkgmgr_client_connection_send_request(client,
2089 "unset_restriction_mode",
2090 g_variant_new("(usi)", uid, "", mode), &result);
2091 if (ret != PKGMGR_R_OK) {
2092 ERR("request failed: %d", ret);
2096 g_variant_get(result, "(i)", &ret);
2097 g_variant_unref(result);
2102 API int pkgmgr_client_unset_restriction_mode(pkgmgr_client *pc, int mode)
2104 return pkgmgr_client_usr_unset_restriction_mode(pc, mode, _getuid());
2107 API int pkgmgr_client_usr_get_restriction_mode(pkgmgr_client *pc,
2108 int *mode, uid_t uid)
2111 int ret = PKGMGR_R_ECOMM;
2113 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2116 ERR("invalid parameter");
2117 return PKGMGR_R_EINVAL;
2120 ret = pkgmgr_client_connection_send_request(client,
2121 "get_restriction_mode",
2122 g_variant_new("(us)", uid, ""), &result);
2123 if (ret != PKGMGR_R_OK) {
2124 ERR("request failed: %d", ret);
2128 g_variant_get(result, "(ii)", &m, &ret);
2129 g_variant_unref(result);
2130 if (ret != PKGMGR_R_OK)
2138 API int pkgmgr_client_get_restriction_mode(pkgmgr_client *pc, int *mode)
2140 return pkgmgr_client_usr_get_restriction_mode(pc, mode, _getuid());
2143 API pkgmgr_info *pkgmgr_client_check_pkginfo_from_file(const char *pkg_path)
2146 pkg_plugin_set *plugin_set;
2147 package_manager_pkg_detail_info_t *info;
2150 if (pkg_path == NULL) {
2151 ERR("invalid parameter");
2155 pkg_type = __get_type_from_path(pkg_path);
2156 if (pkg_type == NULL) {
2157 ERR("cannot get pkg type");
2161 plugin_set = _package_manager_load_library(pkg_type);
2162 if (plugin_set == NULL) {
2163 ERR("failed to load library for %s", pkg_type);
2168 info = calloc(1, sizeof(package_manager_pkg_detail_info_t));
2170 ERR("out of memory");
2175 ret = plugin_set->get_pkg_detail_info_from_package(pkg_path, info);
2177 ERR("get_pkg_detail_info_from_package failed");
2185 return (pkgmgr_info *)info;
2188 API int pkgmgr_client_free_pkginfo(pkgmgr_info *info)
2190 package_manager_pkg_detail_info_t *pkg_info =
2191 (package_manager_pkg_detail_info_t *)info;
2194 ERR("invalid parameter");
2195 return PKGMGR_R_EINVAL;
2198 free(pkg_info->icon_buf);
2204 API int pkgmgr_client_usr_set_app_label(pkgmgr_client *pc, char *appid,
2205 char *label, uid_t uid)
2209 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2211 if (pc == NULL || appid == NULL || label == NULL) {
2212 ERR("Invalid parameter");
2213 return PKGMGR_R_EINVAL;
2216 ret = pkgmgr_client_connection_send_request(client,
2218 g_variant_new("(uss)", uid, appid, label), &result);
2219 if (ret != PKGMGR_R_OK) {
2220 ERR("Request failed: %d", ret);
2224 g_variant_get(result, "(i)", &ret);
2225 g_variant_unref(result);
2230 API int pkgmgr_client_set_app_label(pkgmgr_client *pc, char *appid, char *label)
2232 return pkgmgr_client_usr_set_app_label(pc, appid, label, _getuid());
2235 API int pkgmgr_client_set_debug_mode(pkgmgr_client *pc, bool debug_mode)
2237 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2240 ERR("invalid parameter");
2241 return PKGMGR_R_EINVAL;
2244 client->debug_mode = debug_mode;
2249 API int pkgmgr_client_usr_migrate_external_image(pkgmgr_client *pc,
2250 const char *pkgid, uid_t uid)
2253 int ret = PKGMGR_R_ECOMM;
2254 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2257 ERR("invalid parameter");
2258 return PKGMGR_R_EINVAL;
2261 ret = pkgmgr_client_connection_send_request(client,
2262 "migrate_external_image",
2263 g_variant_new("(us)", uid, pkgid), &result);
2264 if (ret != PKGMGR_R_OK) {
2265 ERR("request failed: %d", ret);
2269 g_variant_get(result, "(i)", &ret);
2270 g_variant_unref(result);