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 char *pkgtype = NULL;
400 struct cb_info *cb_info;
402 if (pc == NULL || pkg_path == NULL) {
403 ERR("invalid parameter");
404 return PKGMGR_R_EINVAL;
407 if (client->pc_type != PC_REQUEST) {
408 ERR("client type is not PC_REQUEST");
409 return PKGMGR_R_EINVAL;
412 if (access(pkg_path, F_OK) != 0) {
413 ERR("failed to access: %s", pkg_path);
414 return PKGMGR_R_EINVAL;
417 if (client->tep_path != NULL && access(client->tep_path, F_OK) != 0) {
418 ERR("failed to access: %s", client->tep_path);
419 return PKGMGR_R_EINVAL;
423 pkgtype = strdup(pkg_type);
425 /* build arguments */
426 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
427 if (client->tep_path) {
428 g_variant_builder_add(builder, "s", "-e");
429 g_variant_builder_add(builder, "s", client->tep_path);
430 g_variant_builder_add(builder, "s", "-M");
431 /* TODO: revise tep_move */
432 g_variant_builder_add(builder, "s",
433 client->tep_move ? "tep_move" : "tep_copy");
435 if (client->debug_mode)
436 g_variant_builder_add(builder, "s", "-G");
438 args = g_variant_new("as", builder);
439 g_variant_builder_unref(builder);
441 ret = pkgmgr_client_connection_send_request(client, "install",
442 g_variant_new("(uss@as)", uid, pkgtype ? pkgtype : "",
445 if (ret != PKGMGR_R_OK) {
446 ERR("request failed: %d", ret);
450 g_variant_get(result, "(i&s)", &ret, &req_key);
451 if (req_key == NULL) {
452 g_variant_unref(result);
453 return PKGMGR_R_ECOMM;
455 if (ret != PKGMGR_R_OK) {
456 g_variant_unref(result);
460 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
461 if (cb_info == NULL) {
462 g_variant_unref(result);
463 return PKGMGR_R_ENOMEM;
465 g_variant_unref(result);
466 ret = pkgmgr_client_connection_set_callback(client, cb_info);
467 if (ret != PKGMGR_R_OK) {
468 __free_cb_info(cb_info);
471 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
473 return cb_info->req_id;
476 API int pkgmgr_client_install(pkgmgr_client *pc, const char *pkg_type,
477 const char *descriptor_path, const char *pkg_path,
478 const char *optional_data, pkgmgr_mode mode,
479 pkgmgr_handler event_cb, void *data)
481 return pkgmgr_client_usr_install(pc, pkg_type, descriptor_path,
482 pkg_path, optional_data, mode, event_cb, data,
486 API int pkgmgr_client_reinstall(pkgmgr_client *pc, const char *pkg_type,
487 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
488 pkgmgr_handler event_cb, void *data)
490 return pkgmgr_client_usr_reinstall(pc, pkg_type, pkgid, optional_data,
491 mode, event_cb, data, _getuid());
494 API int pkgmgr_client_usr_reinstall(pkgmgr_client *pc, const char *pkg_type,
495 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
496 pkgmgr_handler event_cb, void *data, uid_t uid)
499 int ret = PKGMGR_R_ECOMM;
500 char *req_key = NULL;
501 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
502 struct cb_info *cb_info;
504 if (pc == NULL || pkgid == NULL) {
505 ERR("invalid parameter");
506 return PKGMGR_R_EINVAL;
509 if (client->pc_type != PC_REQUEST) {
510 ERR("client->pc_type is not PC_REQUEST");
511 return PKGMGR_R_EINVAL;
514 ret = pkgmgr_client_connection_send_request(client, "reinstall",
515 g_variant_new("(us)", uid, pkgid), &result);
516 if (ret != PKGMGR_R_OK) {
517 ERR("request failed: %d", ret);
521 g_variant_get(result, "(i&s)", &ret, &req_key);
522 if (req_key == NULL) {
523 g_variant_unref(result);
524 return PKGMGR_R_ECOMM;
526 if (ret != PKGMGR_R_OK) {
527 g_variant_unref(result);
531 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
532 if (cb_info == NULL) {
533 g_variant_unref(result);
534 return PKGMGR_R_ENOMEM;
536 g_variant_unref(result);
537 ret = pkgmgr_client_connection_set_callback(client, cb_info);
538 if (ret != PKGMGR_R_OK) {
539 __free_cb_info(cb_info);
542 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
544 return cb_info->req_id;
547 API int pkgmgr_client_usr_mount_install(pkgmgr_client *pc, const char *pkg_type,
548 const char *descriptor_path, const char *pkg_path,
549 const char *optional_data, pkgmgr_mode mode,
550 pkgmgr_handler event_cb, void *data, uid_t uid)
553 int ret = PKGMGR_R_ECOMM;
554 char *req_key = NULL;
555 GVariantBuilder *builder = NULL;
556 GVariant *args = NULL;
557 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
558 char *pkgtype = NULL;
559 struct cb_info *cb_info;
561 if (pc == NULL || pkg_path == NULL) {
562 ERR("invalid parameter");
563 return PKGMGR_R_EINVAL;
566 if (client->pc_type != PC_REQUEST) {
567 ERR("client->pc_type is not PC_REQUEST");
568 return PKGMGR_R_EINVAL;
571 if (access(pkg_path, F_OK) != 0) {
572 ERR("failed to access: %s", pkg_path);
573 return PKGMGR_R_EINVAL;
576 if (client->tep_path != NULL && access(client->tep_path, F_OK) != 0) {
577 ERR("failed to access: %s", client->tep_path);
578 return PKGMGR_R_EINVAL;
582 pkgtype = strdup(pkg_type);
584 /* build arguments */
585 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
586 if (client->tep_path) {
587 g_variant_builder_add(builder, "s", "-e");
588 g_variant_builder_add(builder, "s", client->tep_path);
589 g_variant_builder_add(builder, "s", "-M");
590 /* TODO: revise tep_move */
591 g_variant_builder_add(builder, "s",
592 client->tep_move ? "tep_move" : "tep_copy");
595 args = g_variant_new("as", builder);
596 g_variant_builder_unref(builder);
598 ret = pkgmgr_client_connection_send_request(client, "mount_install",
599 g_variant_new("(uss@as)", uid, pkgtype ? pkgtype : "",
602 if (ret != PKGMGR_R_OK) {
603 ERR("request failed: %d", ret);
607 g_variant_get(result, "(i&s)", &ret, &req_key);
608 if (req_key == NULL) {
609 g_variant_unref(result);
610 return PKGMGR_R_ECOMM;
612 if (ret != PKGMGR_R_OK) {
613 g_variant_unref(result);
617 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
618 if (cb_info == NULL) {
619 g_variant_unref(result);
620 return PKGMGR_R_ENOMEM;
622 g_variant_unref(result);
623 ret = pkgmgr_client_connection_set_callback(client, cb_info);
624 if (ret != PKGMGR_R_OK) {
625 __free_cb_info(cb_info);
628 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
630 return cb_info->req_id;
633 API int pkgmgr_client_mount_install(pkgmgr_client *pc, const char *pkg_type,
634 const char *descriptor_path, const char *pkg_path,
635 const char *optional_data, pkgmgr_mode mode,
636 pkgmgr_handler event_cb, void *data)
638 return pkgmgr_client_usr_mount_install(pc, pkg_type, descriptor_path,
639 pkg_path, optional_data, mode, event_cb, data,
643 API int pkgmgr_client_uninstall(pkgmgr_client *pc, const char *pkg_type,
644 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
647 return pkgmgr_client_usr_uninstall(pc, pkg_type, pkgid, mode, event_cb,
651 API int pkgmgr_client_usr_uninstall(pkgmgr_client *pc, const char *pkg_type,
652 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
653 void *data, uid_t uid)
656 int ret = PKGMGR_R_ECOMM;
657 char *req_key = NULL;
658 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
659 struct cb_info *cb_info;
661 if (pc == NULL || pkgid == NULL) {
662 ERR("invalid parameter");
663 return PKGMGR_R_EINVAL;
666 if (client->pc_type != PC_REQUEST) {
667 ERR("client->pc_type is not PC_REQUEST");
668 return PKGMGR_R_EINVAL;
671 ret = pkgmgr_client_connection_send_request(client, "uninstall",
672 g_variant_new("(us)", uid, pkgid), &result);
673 if (ret != PKGMGR_R_OK) {
674 ERR("request failed: %d", ret);
678 g_variant_get(result, "(i&s)", &ret, &req_key);
679 if (req_key == NULL) {
680 g_variant_unref(result);
681 return PKGMGR_R_ECOMM;
683 if (ret != PKGMGR_R_OK) {
684 g_variant_unref(result);
688 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
689 if (cb_info == NULL) {
690 g_variant_unref(result);
691 return PKGMGR_R_ENOMEM;
693 g_variant_unref(result);
694 ret = pkgmgr_client_connection_set_callback(client, cb_info);
695 if (ret != PKGMGR_R_OK) {
696 __free_cb_info(cb_info);
699 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
701 return cb_info->req_id;
704 API int pkgmgr_client_move(pkgmgr_client *pc, const char *pkg_type,
705 const char *pkgid, pkgmgr_move_type move_type,
706 pkgmgr_handler event_cb, void *data)
708 return pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type,
709 event_cb, data, _getuid());
711 API int pkgmgr_client_usr_move(pkgmgr_client *pc, const char *pkg_type,
712 const char *pkgid, pkgmgr_move_type move_type,
713 pkgmgr_handler event_cb, void *data, uid_t uid)
716 int ret = PKGMGR_R_ECOMM;
717 char *req_key = NULL;
718 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
719 struct cb_info *cb_info;
721 if (pc == NULL || pkgid == NULL) {
722 ERR("invalid parameter");
723 return PKGMGR_R_EINVAL;
726 if ((move_type < PM_MOVE_TO_INTERNAL) ||
727 (move_type > PM_MOVE_TO_SDCARD))
728 return PKGMGR_R_EINVAL;
730 if (client->pc_type != PC_REQUEST) {
731 ERR("client->pc_type is not PC_REQUEST");
732 return PKGMGR_R_EINVAL;
735 ret = pkgmgr_client_connection_send_request(client, "move",
736 g_variant_new("(usi)", uid, pkgid, move_type), &result);
737 if (ret != PKGMGR_R_OK) {
738 ERR("request failed: %d", ret);
742 g_variant_get(result, "(i&s)", &ret, &req_key);
743 if (req_key == NULL) {
744 g_variant_unref(result);
745 return PKGMGR_R_ECOMM;
747 if (ret != PKGMGR_R_OK) {
748 g_variant_unref(result);
752 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
753 if (cb_info == NULL) {
754 g_variant_unref(result);
755 return PKGMGR_R_ERROR;
757 g_variant_unref(result);
758 ret = pkgmgr_client_connection_set_callback(client, cb_info);
759 if (ret != PKGMGR_R_OK) {
760 __free_cb_info(cb_info);
763 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
765 return cb_info->req_id;
768 API int pkgmgr_client_usr_activate(pkgmgr_client *pc, const char *pkg_type,
769 const char *pkgid, uid_t uid)
772 int ret = PKGMGR_R_ECOMM;
773 GVariantBuilder *builder;
774 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
776 if (pc == NULL || pkgid == NULL) {
777 ERR("invalid parameter");
778 return PKGMGR_R_EINVAL;
781 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
782 g_variant_builder_add(builder, "s", pkgid);
784 ret = pkgmgr_client_connection_send_request(client, "enable_pkgs",
785 g_variant_new("(uas)", uid, builder), &result);
786 g_variant_builder_unref(builder);
787 if (ret != PKGMGR_R_OK) {
788 ERR("request failed: %d", ret);
792 g_variant_get(result, "(is)", &ret, NULL);
793 g_variant_unref(result);
798 API int pkgmgr_client_activate(pkgmgr_client *pc, const char *pkg_type,
801 return pkgmgr_client_usr_activate(pc, pkg_type, pkgid, _getuid());
804 API int pkgmgr_client_usr_activate_packages(pkgmgr_client *pc,
805 const char *pkg_type, const char **pkgids, int n_pkgs,
806 pkgmgr_handler event_cb, void *data, uid_t uid)
809 GVariantBuilder *builder;
810 int ret = PKGMGR_R_ECOMM;
811 char *req_key = NULL;
812 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
813 struct cb_info *cb_info;
816 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
817 ERR("invalid parameter");
818 return PKGMGR_R_EINVAL;
821 if (client->pc_type != PC_REQUEST) {
822 ERR("client type is not PC_REQUEST");
823 return PKGMGR_R_EINVAL;
826 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
827 for (i = 0; i < n_pkgs; i++)
828 g_variant_builder_add(builder, "s", pkgids[i]);
830 ret = pkgmgr_client_connection_send_request(client, "enable_pkgs",
831 g_variant_new("(uas)", uid, builder), &result);
832 g_variant_builder_unref(builder);
833 if (ret != PKGMGR_R_OK) {
834 ERR("request failed: %d", ret);
838 g_variant_get(result, "(i&s)", &ret, &req_key);
839 if (req_key == NULL) {
840 g_variant_unref(result);
841 return PKGMGR_R_ECOMM;
843 if (ret != PKGMGR_R_OK) {
844 g_variant_unref(result);
848 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
849 if (cb_info == NULL) {
850 g_variant_unref(result);
851 return PKGMGR_R_ERROR;
853 g_variant_unref(result);
854 ret = pkgmgr_client_connection_set_callback(client, cb_info);
855 if (ret != PKGMGR_R_OK) {
856 __free_cb_info(cb_info);
859 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
861 return cb_info->req_id;
864 API int pkgmgr_client_activate_packages(pkgmgr_client *pc,
865 const char *pkg_type, const char **pkgids, int n_pkgs,
866 pkgmgr_handler event_cb, void *data)
868 return pkgmgr_client_usr_activate_packages(pc, pkg_type,
869 pkgids, n_pkgs, event_cb, data, _getuid());
872 API int pkgmgr_client_usr_deactivate(pkgmgr_client *pc, const char *pkg_type,
873 const char *pkgid, uid_t uid)
876 GVariantBuilder *builder;
877 int ret = PKGMGR_R_ECOMM;
878 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
880 if (pc == NULL || pkgid == NULL) {
881 ERR("invalid parameter");
882 return PKGMGR_R_EINVAL;
885 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
886 g_variant_builder_add(builder, "s", pkgid);
888 ret = pkgmgr_client_connection_send_request(client, "disable_pkgs",
889 g_variant_new("(uas)", uid, builder), &result);
890 g_variant_builder_unref(builder);
891 if (ret != PKGMGR_R_OK) {
892 ERR("request failed: %d", ret);
896 g_variant_get(result, "(is)", &ret, NULL);
897 g_variant_unref(result);
902 API int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type,
905 return pkgmgr_client_usr_deactivate(pc, pkg_type, pkgid, _getuid());
908 API int pkgmgr_client_usr_deactivate_packages(pkgmgr_client *pc,
909 const char *pkg_type, const char **pkgids, int n_pkgs,
910 pkgmgr_handler event_cb, void *data, uid_t uid)
913 GVariantBuilder *builder;
914 int ret = PKGMGR_R_ECOMM;
915 char *req_key = NULL;
916 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
917 struct cb_info *cb_info;
920 if (pc == NULL || pkgids == NULL || n_pkgs < 1) {
921 ERR("invalid parameter");
922 return PKGMGR_R_EINVAL;
925 if (client->pc_type != PC_REQUEST) {
926 ERR("client type is not PC_REQUEST");
927 return PKGMGR_R_EINVAL;
930 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
931 for (i = 0; i < n_pkgs; i++)
932 g_variant_builder_add(builder, "s", pkgids[i]);
934 ret = pkgmgr_client_connection_send_request(client, "disable_pkgs",
935 g_variant_new("(uas)", uid, builder), &result);
936 g_variant_builder_unref(builder);
937 if (ret != PKGMGR_R_OK) {
938 ERR("request failed: %d", ret);
942 g_variant_get(result, "(i&s)", &ret, &req_key);
943 if (req_key == NULL) {
944 g_variant_unref(result);
945 return PKGMGR_R_ECOMM;
947 if (ret != PKGMGR_R_OK) {
948 g_variant_unref(result);
952 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
953 if (cb_info == NULL) {
954 g_variant_unref(result);
955 return PKGMGR_R_ERROR;
957 g_variant_unref(result);
958 ret = pkgmgr_client_connection_set_callback(client, cb_info);
959 if (ret != PKGMGR_R_OK) {
960 __free_cb_info(cb_info);
963 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
965 return cb_info->req_id;
968 API int pkgmgr_client_deactivate_packages(pkgmgr_client *pc,
969 const char *pkg_type, const char **pkgids, int n_pkgs,
970 pkgmgr_handler event_cb, void *data)
972 return pkgmgr_client_usr_deactivate_packages(pc, pkg_type,
973 pkgids, n_pkgs, event_cb, data, _getuid());
976 API int pkgmgr_client_usr_activate_app(pkgmgr_client *pc, const char *appid,
977 pkgmgr_app_handler app_event_cb, uid_t uid)
980 int ret = PKGMGR_R_ECOMM;
981 char *req_key = NULL;
982 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
983 struct cb_info *cb_info;
985 if (pc == NULL || appid == NULL) {
986 ERR("invalid parameter");
987 return PKGMGR_R_EINVAL;
990 ret = pkgmgr_client_connection_send_request(client, "enable_app",
991 g_variant_new("(us)", uid, appid), &result);
992 if (ret != PKGMGR_R_OK) {
993 ERR("request failed: %d", ret);
997 g_variant_get(result, "(i&s)", &ret, &req_key);
998 if (req_key == NULL) {
999 g_variant_unref(result);
1000 return PKGMGR_R_ECOMM;
1002 if (ret != PKGMGR_R_OK) {
1003 g_variant_unref(result);
1007 cb_info = __create_app_event_cb_info(client, app_event_cb, NULL,
1009 if (cb_info == NULL) {
1010 g_variant_unref(result);
1011 return PKGMGR_R_ENOMEM;
1013 g_variant_unref(result);
1014 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1015 if (ret != PKGMGR_R_OK) {
1016 __free_cb_info(cb_info);
1019 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1024 API int pkgmgr_client_activate_app(pkgmgr_client *pc, const char *appid,
1025 pkgmgr_app_handler app_event_cb)
1027 return pkgmgr_client_usr_activate_app(pc, appid, app_event_cb,
1031 API int pkgmgr_client_activate_global_app_for_uid(pkgmgr_client *pc,
1032 const char *appid, pkgmgr_app_handler app_event_cb, uid_t uid)
1035 int ret = PKGMGR_R_ECOMM;
1036 char *req_key = NULL;
1037 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1038 struct cb_info *cb_info;
1040 if (pc == NULL || appid == NULL) {
1041 ERR("invalid parameter");
1042 return PKGMGR_R_EINVAL;
1045 ret = pkgmgr_client_connection_send_request(client,
1046 "enable_global_app_for_uid",
1047 g_variant_new("(us)", uid, appid), &result);
1048 if (ret != PKGMGR_R_OK) {
1049 ERR("request failed: %d", ret);
1053 g_variant_get(result, "(i&s)", &ret, &req_key);
1054 if (req_key == NULL) {
1055 g_variant_unref(result);
1056 return PKGMGR_R_ECOMM;
1058 if (ret != PKGMGR_R_OK) {
1059 g_variant_unref(result);
1063 cb_info = __create_app_event_cb_info(client, app_event_cb, NULL,
1065 if (cb_info == NULL) {
1066 g_variant_unref(result);
1067 return PKGMGR_R_ENOMEM;
1069 g_variant_unref(result);
1070 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1071 if (ret != PKGMGR_R_OK) {
1072 __free_cb_info(cb_info);
1075 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1080 API int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid,
1081 pkgmgr_app_handler app_event_cb, uid_t uid)
1084 int ret = PKGMGR_R_ECOMM;
1085 char *req_key = NULL;
1086 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1087 struct cb_info *cb_info;
1089 if (pc == NULL || appid == NULL) {
1090 ERR("invalid parameter");
1091 return PKGMGR_R_EINVAL;
1094 ret = pkgmgr_client_connection_send_request(client, "disable_app",
1095 g_variant_new("(us)", uid, appid), &result);
1096 if (ret != PKGMGR_R_OK) {
1097 ERR("request failed: %d", ret);
1101 g_variant_get(result, "(i&s)", &ret, &req_key);
1102 if (req_key == NULL) {
1103 g_variant_unref(result);
1104 return PKGMGR_R_ECOMM;
1106 if (ret != PKGMGR_R_OK) {
1107 g_variant_unref(result);
1111 cb_info = __create_app_event_cb_info(client, app_event_cb, NULL,
1113 if (cb_info == NULL) {
1114 g_variant_unref(result);
1115 return PKGMGR_R_ENOMEM;
1117 g_variant_unref(result);
1118 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1119 if (ret != PKGMGR_R_OK) {
1120 __free_cb_info(cb_info);
1123 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1128 API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid,
1129 pkgmgr_app_handler app_event_cb)
1131 return pkgmgr_client_usr_deactivate_app(pc, appid, app_event_cb,
1135 API int pkgmgr_client_deactivate_global_app_for_uid(pkgmgr_client *pc,
1136 const char *appid, pkgmgr_app_handler app_event_cb, uid_t uid)
1139 int ret = PKGMGR_R_ECOMM;
1140 char *req_key = NULL;
1141 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1142 struct cb_info *cb_info;
1144 if (pc == NULL || appid == NULL) {
1145 ERR("invalid parameter");
1146 return PKGMGR_R_EINVAL;
1149 ret = pkgmgr_client_connection_send_request(client,
1150 "disable_global_app_for_uid",
1151 g_variant_new("(us)", uid, appid), &result);
1152 if (ret != PKGMGR_R_OK) {
1153 ERR("request failed: %d", ret);
1157 g_variant_get(result, "(i&s)", &ret, &req_key);
1158 if (req_key == NULL) {
1159 g_variant_unref(result);
1160 return PKGMGR_R_ECOMM;
1162 if (ret != PKGMGR_R_OK) {
1163 g_variant_unref(result);
1167 cb_info = __create_app_event_cb_info(client, app_event_cb, NULL,
1169 if (cb_info == NULL) {
1170 g_variant_unref(result);
1171 return PKGMGR_R_ENOMEM;
1173 g_variant_unref(result);
1174 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1175 if (ret != PKGMGR_R_OK) {
1176 __free_cb_info(cb_info);
1179 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1184 API int pkgmgr_client_usr_clear_user_data(pkgmgr_client *pc,
1185 const char *pkg_type, const char *appid, pkgmgr_mode mode,
1190 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1192 if (pc == NULL || appid == NULL || uid == GLOBAL_USER) {
1193 ERR("invalid parameter");
1194 return PKGMGR_R_EINVAL;
1197 if (client->pc_type != PC_REQUEST) {
1198 ERR("client->pc_type is not PC_REQUEST");
1199 return PKGMGR_R_EINVAL;
1202 ret = pkgmgr_client_connection_send_request(client, "cleardata",
1203 g_variant_new("(us)", uid, appid), &result);
1204 if (ret != PKGMGR_R_OK) {
1205 ERR("request failed: %d", ret);
1209 g_variant_get(result, "(i)", &ret);
1210 g_variant_unref(result);
1215 API int pkgmgr_client_clear_user_data(pkgmgr_client *pc, const char *pkg_type,
1216 const char *appid, pkgmgr_mode mode)
1218 return pkgmgr_client_usr_clear_user_data(pc, pkg_type, appid, mode,
1222 API int pkgmgr_client_set_status_type(pkgmgr_client *pc, int status_type)
1224 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1227 ERR("invalid parameter");
1228 return PKGMGR_R_EINVAL;
1231 client->status_type = status_type;
1236 API int pkgmgr_client_listen_status(pkgmgr_client *pc, pkgmgr_handler event_cb,
1240 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1241 struct cb_info *cb_info;
1243 if (pc == NULL || event_cb == NULL) {
1244 ERR("invalid parameter");
1245 return PKGMGR_R_EINVAL;
1248 if (client->pc_type != PC_LISTENING) {
1249 ERR("client->pc_type is not PC_LISTENING");
1250 return PKGMGR_R_EINVAL;
1253 cb_info = __create_event_cb_info(client, event_cb, data, NULL);
1254 if (cb_info == NULL)
1255 return PKGMGR_R_ENOMEM;
1256 cb_info->status_type = client->status_type;
1257 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1258 if (ret != PKGMGR_R_OK) {
1259 __free_cb_info(cb_info);
1262 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1264 return cb_info->req_id;
1267 API int pkgmgr_client_listen_app_status(pkgmgr_client *pc,
1268 pkgmgr_app_handler app_event_cb, void *data)
1271 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1272 struct cb_info *cb_info;
1274 if (pc == NULL || app_event_cb == NULL) {
1275 ERR("invalid parameter");
1276 return PKGMGR_R_EINVAL;
1279 if (client->pc_type != PC_LISTENING) {
1280 ERR("client->pc_type is not PC_LISTENING");
1281 return PKGMGR_R_EINVAL;
1284 cb_info = __create_app_event_cb_info(client, app_event_cb, data, NULL);
1285 if (cb_info == NULL)
1286 return PKGMGR_R_ENOMEM;
1287 cb_info->status_type = client->status_type;
1288 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1289 if (ret != PKGMGR_R_OK) {
1290 __free_cb_info(cb_info);
1293 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1295 return cb_info->req_id;
1298 API int pkgmgr_client_remove_listen_status(pkgmgr_client *pc)
1300 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1303 struct cb_info *cb_info;
1306 ERR("invalid parameter");
1307 return PKGMGR_R_EINVAL;
1310 /* unset all callback */
1311 tmp = client->cb_info_list;
1312 while (tmp != NULL) {
1314 cb_info = (struct cb_info *)tmp->data;
1315 pkgmgr_client_connection_unset_callback(pc, cb_info);
1316 client->cb_info_list = g_list_delete_link(client->cb_info_list,
1318 __free_cb_info(cb_info);
1325 API int pkgmgr_client_broadcast_status(pkgmgr_client *pc, const char *pkg_type,
1326 const char *pkgid, const char *key, const char *val)
1328 /* client cannot broadcast signal */
1332 /* TODO: deprecate(or remove) */
1333 API int pkgmgr_client_request_service(pkgmgr_request_service_type service_type,
1334 int service_mode, pkgmgr_client *pc, const char *pkg_type,
1335 const char *pkgid, const char *custom_info,
1336 pkgmgr_handler event_cb, void *data)
1338 return pkgmgr_client_usr_request_service(service_type, service_mode,
1339 pc, pkg_type, pkgid, _getuid(), custom_info, event_cb,
1343 API int pkgmgr_client_usr_request_service(
1344 pkgmgr_request_service_type service_type, int service_mode,
1345 pkgmgr_client *pc, const char *pkg_type, const char *pkgid,
1346 uid_t uid, const char *custom_info, pkgmgr_handler event_cb,
1351 /* Check for NULL value of service type */
1352 retvm_if(service_type > PM_REQUEST_MAX, PKGMGR_R_EINVAL, "service type is not defined\n");
1353 retvm_if(service_type < 0, PKGMGR_R_EINVAL, "service type is error\n");
1355 switch (service_type) {
1356 case PM_REQUEST_MOVE:
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_MOVE_TO_INTERNAL) || (service_mode > PM_MOVE_TO_SDCARD), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1361 ret = __move_pkg_process(pc, pkgid, pkg_type, uid, (pkgmgr_move_type)service_mode, event_cb, data);
1364 case PM_REQUEST_GET_SIZE:
1365 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1366 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1367 tryvm_if((service_mode < PM_GET_TOTAL_SIZE) || (service_mode >= PM_GET_MAX), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1369 ret = __get_size_process(pc, pkgid, uid, (pkgmgr_getsize_type)service_mode, event_cb, data);
1372 case PM_REQUEST_KILL_APP:
1373 case PM_REQUEST_CHECK_APP:
1374 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1375 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1377 ret = __check_app_process(service_type, pc, pkgid, uid, data);
1379 ERR("__check_app_process fail \n");
1386 ERR("Wrong Request\n");
1397 API int pkgmgr_client_usr_request_size_info(uid_t uid)
1400 struct pkgmgr_client *client;
1402 client = pkgmgr_client_new(PC_REQUEST);
1403 if (client == NULL) {
1404 ERR("out of memory");
1405 return PKGMGR_R_ENOMEM;
1408 ret = __request_size_info(client, uid);
1410 ERR("__request_size_info fail");
1412 pkgmgr_client_free(client);
1416 API int pkgmgr_client_request_size_info(void)
1418 /* get all package size (data, total) */
1419 return pkgmgr_client_usr_request_size_info(_getuid());
1422 API int pkgmgr_client_usr_clear_cache_dir(const char *pkgid, uid_t uid)
1426 struct pkgmgr_client_t *client;
1428 if (pkgid == NULL || uid == GLOBAL_USER) {
1429 ERR("invalid parameter");
1430 return PKGMGR_R_EINVAL;
1433 client = pkgmgr_client_new(PC_REQUEST);
1434 if (client == NULL) {
1435 ERR("out of memory");
1436 return PKGMGR_R_ENOMEM;
1439 ret = pkgmgr_client_connection_send_request(client, "clearcache",
1440 g_variant_new("(us)", uid, pkgid), &result);
1441 if (ret != PKGMGR_R_OK) {
1442 ERR("request failed: %d", ret);
1446 g_variant_get(result, "(i)", &ret);
1447 g_variant_unref(result);
1452 API int pkgmgr_client_clear_cache_dir(const char *pkgid)
1454 return pkgmgr_client_usr_clear_cache_dir(pkgid, _getuid());
1457 API int pkgmgr_client_clear_usr_all_cache_dir(uid_t uid)
1459 return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, uid);
1462 API int pkgmgr_client_clear_all_cache_dir(void)
1464 return pkgmgr_client_usr_clear_cache_dir(
1465 PKG_CLEAR_ALL_CACHE, _getuid());
1468 API int pkgmgr_client_get_size(pkgmgr_client *pc, const char *pkgid,
1469 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
1472 return pkgmgr_client_usr_get_size(pc, pkgid, get_type, event_cb, data,
1476 /* TODO: deprecate(or remove) */
1477 API int pkgmgr_client_usr_get_size(pkgmgr_client *pc, const char *pkgid,
1478 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
1479 void *data, uid_t uid)
1482 int ret = PKGMGR_R_ECOMM;
1483 char *req_key = NULL;
1484 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1485 struct cb_info *cb_info;
1487 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
1488 ERR("invalid parameter");
1489 return PKGMGR_R_EINVAL;
1492 if (client->pc_type != PC_REQUEST) {
1493 ERR("client->pc_type is not PC_REQUEST");
1494 return PKGMGR_R_EINVAL;
1498 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
1499 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
1501 get_type = PM_GET_PKG_SIZE_INFO;
1503 ret = pkgmgr_client_connection_send_request(client, "getsize",
1504 g_variant_new("(usi)", uid, pkgid, get_type), &result);
1505 if (ret != PKGMGR_R_OK) {
1506 ERR("request failed: %d", ret);
1510 g_variant_get(result, "(i&s)", &ret, &req_key);
1511 if (req_key == NULL) {
1512 g_variant_unref(result);
1513 return PKGMGR_R_ECOMM;
1515 if (ret != PKGMGR_R_OK) {
1516 g_variant_unref(result);
1520 cb_info = __create_event_cb_info(client, event_cb, data, req_key);
1521 if (cb_info == NULL) {
1522 g_variant_unref(result);
1523 return PKGMGR_R_ENOMEM;
1525 g_variant_unref(result);
1526 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1527 if (ret != PKGMGR_R_OK) {
1528 __free_cb_info(cb_info);
1531 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1536 API int pkgmgr_client_usr_get_package_size_info(pkgmgr_client *pc,
1537 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
1538 void *user_data, uid_t uid)
1541 int ret = PKGMGR_R_ECOMM;
1542 char *req_key = NULL;
1544 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1545 struct cb_info *cb_info;
1547 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
1548 ERR("invalid parameter");
1549 return PKGMGR_R_EINVAL;
1552 if (client->pc_type != PC_REQUEST) {
1553 ERR("client->pc_type is not PC_REQUEST");
1554 return PKGMGR_R_EINVAL;
1557 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
1558 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
1560 get_type = PM_GET_PKG_SIZE_INFO;
1562 ret = pkgmgr_client_connection_send_request(client, "getsize",
1563 g_variant_new("(usi)", uid, pkgid, get_type), &result);
1564 if (ret != PKGMGR_R_OK) {
1565 ERR("request failed: %d", ret);
1569 g_variant_get(result, "(i&s)", &ret, &req_key);
1570 if (req_key == NULL) {
1571 g_variant_unref(result);
1572 return PKGMGR_R_ECOMM;
1574 if (ret != PKGMGR_R_OK) {
1575 g_variant_unref(result);
1579 cb_info = __create_size_info_cb_info(client, event_cb, user_data,
1581 if (cb_info == NULL) {
1582 g_variant_unref(result);
1583 return PKGMGR_R_ENOMEM;
1585 g_variant_unref(result);
1586 ret = pkgmgr_client_connection_set_callback(client, cb_info);
1587 if (ret != PKGMGR_R_OK) {
1588 __free_cb_info(cb_info);
1591 client->cb_info_list = g_list_append(client->cb_info_list, cb_info);
1596 API int pkgmgr_client_get_package_size_info(pkgmgr_client *pc,
1597 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
1600 return pkgmgr_client_usr_get_package_size_info(pc, pkgid, event_cb,
1601 user_data, _getuid());
1604 API int pkgmgr_client_usr_get_total_package_size_info(pkgmgr_client *pc,
1605 pkgmgr_total_pkg_size_info_receive_cb event_cb,
1606 void *user_data, uid_t uid)
1607 { /* total package size info */
1608 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL,
1609 (pkgmgr_pkg_size_info_receive_cb)event_cb,
1613 API int pkgmgr_client_get_total_package_size_info(pkgmgr_client *pc,
1614 pkgmgr_total_pkg_size_info_receive_cb event_cb, void *user_data)
1616 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL,
1617 (pkgmgr_pkg_size_info_receive_cb)event_cb,
1618 user_data, _getuid());
1621 API int pkgmgr_client_generate_license_request(pkgmgr_client *pc,
1622 const char *resp_data, char **req_data, char **license_url)
1628 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1630 if (pc == NULL || resp_data == NULL || req_data == NULL ||
1631 license_url == NULL) {
1632 ERR("invalid parameter");
1633 return PKGMGR_R_EINVAL;
1636 if (client->pc_type != PC_REQUEST) {
1637 ERR("client->pc_type is not PC_REQUEST");
1638 return PKGMGR_R_EINVAL;
1641 ret = pkgmgr_client_connection_send_request(client,
1642 "generate_license_request",
1643 g_variant_new("(s)", resp_data), &result);
1644 if (ret != PKGMGR_R_OK) {
1645 ERR("request failed: %d", ret);
1649 g_variant_get(result, "(i&s&s)", &ret, &data, &url);
1650 if (ret != PKGMGR_R_OK) {
1651 ERR("generate_license_request failed: %d", ret);
1652 g_variant_unref(result);
1656 *req_data = strdup(data);
1657 *license_url = strdup(url);
1659 g_variant_unref(result);
1664 API int pkgmgr_client_register_license(pkgmgr_client *pc, const char *resp_data)
1668 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1670 if (pc == NULL || resp_data == NULL) {
1671 ERR("invalid parameter");
1672 return PKGMGR_R_EINVAL;
1675 if (client->pc_type != PC_REQUEST) {
1676 ERR("client->pc_type is not PC_REQUEST");
1677 return PKGMGR_R_EINVAL;
1680 ret = pkgmgr_client_connection_send_request(client, "register_license",
1681 g_variant_new("(s)", resp_data), &result);
1682 if (ret != PKGMGR_R_OK) {
1683 ERR("request failed: %d", ret);
1687 g_variant_get(result, "(i)", &ret);
1688 g_variant_unref(result);
1689 if (ret != PKGMGR_R_OK)
1690 ERR("register license failed: %d", ret);
1695 API int pkgmgr_client_decrypt_package(pkgmgr_client *pc,
1696 const char *drm_file_path, const char *decrypted_file_path)
1700 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1702 if (pc == NULL || drm_file_path == NULL ||
1703 decrypted_file_path == NULL) {
1704 ERR("invalid parameter");
1705 return PKGMGR_R_EINVAL;
1708 if (client->pc_type != PC_REQUEST) {
1709 ERR("client->pc_type is not PC_REQUEST");
1710 return PKGMGR_R_EINVAL;
1713 ret = pkgmgr_client_connection_send_request(client, "decrypt_package",
1714 g_variant_new("(ss)", drm_file_path,
1715 decrypted_file_path), &result);
1716 if (ret != PKGMGR_R_OK) {
1717 ERR("request failed: %d", ret);
1721 g_variant_get(result, "(i)", &ret);
1722 g_variant_unref(result);
1723 if (ret != PKGMGR_R_OK)
1724 ERR("decrypt_package failed: %d", ret);
1729 API int pkgmgr_client_enable_splash_screen(pkgmgr_client *pc, const char *appid)
1731 return pkgmgr_client_usr_enable_splash_screen(pc, appid, _getuid());
1734 API int pkgmgr_client_usr_enable_splash_screen(pkgmgr_client *pc,
1735 const char *appid, uid_t uid)
1739 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1741 if (pc == NULL || appid == NULL) {
1742 ERR("Invalid parameter");
1743 return PKGMGR_R_EINVAL;
1746 ret = pkgmgr_client_connection_send_request(client,
1747 "enable_app_splash_screen",
1748 g_variant_new("(us)", uid, appid), &result);
1749 if (ret != PKGMGR_R_OK) {
1750 ERR("request failed: %d", ret);
1754 g_variant_get(result, "(i)", &ret);
1755 g_variant_unref(result);
1756 if (ret != PKGMGR_R_OK)
1757 ERR("enable splash screen failed: %d", ret);
1762 API int pkgmgr_client_disable_splash_screen(pkgmgr_client *pc,
1765 return pkgmgr_client_usr_disable_splash_screen(pc, appid,
1769 API int pkgmgr_client_usr_disable_splash_screen(pkgmgr_client *pc,
1770 const char *appid, uid_t uid)
1774 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1776 if (pc == NULL || appid == NULL) {
1777 ERR("Invalid parameter");
1778 return PKGMGR_R_EINVAL;
1781 ret = pkgmgr_client_connection_send_request(client,
1782 "disable_app_splash_screen",
1783 g_variant_new("(us)", uid, appid), &result);
1784 if (ret != PKGMGR_R_OK) {
1785 ERR("request failed: %d", ret);
1789 g_variant_get(result, "(i)", &ret);
1790 g_variant_unref(result);
1791 if (ret != PKGMGR_R_OK)
1792 ERR("disable splash screen failed: %d", ret);
1797 static int __set_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
1798 int mode, uid_t uid)
1801 int ret = PKGMGR_R_ECOMM;
1802 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1804 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
1805 ERR("invalid parameter");
1806 return PKGMGR_R_EINVAL;
1809 ret = pkgmgr_client_connection_send_request(client,
1810 "set_restriction_mode",
1811 g_variant_new("(usi)", uid, pkgid, mode), &result);
1812 if (ret != PKGMGR_R_OK) {
1813 ERR("request failed: %d", ret);
1817 g_variant_get(result, "(i)", &ret);
1818 g_variant_unref(result);
1823 API int pkgmgr_client_usr_set_pkg_restriction_mode(pkgmgr_client *pc,
1824 const char *pkgid, int mode, uid_t uid)
1826 return __set_pkg_restriction_mode(pc, pkgid, mode, uid);
1829 API int pkgmgr_client_set_pkg_restriction_mode(pkgmgr_client *pc,
1830 const char *pkgid, int mode)
1832 return pkgmgr_client_usr_set_pkg_restriction_mode(pc, pkgid, mode,
1836 static int __unset_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
1837 int mode, uid_t uid)
1840 int ret = PKGMGR_R_ECOMM;
1841 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1843 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
1844 ERR("invalid parameter");
1845 return PKGMGR_R_EINVAL;
1848 ret = pkgmgr_client_connection_send_request(client,
1849 "unset_restriction_mode",
1850 g_variant_new("(usi)", uid, pkgid, mode), &result);
1851 if (ret != PKGMGR_R_OK) {
1852 ERR("request failed: %d", ret);
1856 g_variant_get(result, "(i)", &ret);
1857 g_variant_unref(result);
1863 API int pkgmgr_client_usr_unset_pkg_restriction_mode(pkgmgr_client *pc,
1864 const char *pkgid, int mode, uid_t uid)
1866 return __unset_pkg_restriction_mode(pc, pkgid, mode, uid);
1869 API int pkgmgr_client_unset_pkg_restriction_mode(pkgmgr_client *pc,
1870 const char *pkgid, int mode)
1872 return pkgmgr_client_usr_unset_pkg_restriction_mode(pc, pkgid, mode,
1876 static int __get_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid,
1877 int *mode, uid_t uid)
1880 int ret = PKGMGR_R_ECOMM;
1882 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1884 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0) {
1885 ERR("invalid parameter");
1886 return PKGMGR_R_EINVAL;
1889 ret = pkgmgr_client_connection_send_request(client,
1890 "get_restriction_mode",
1891 g_variant_new("(us)", uid, pkgid), &result);
1892 if (ret != PKGMGR_R_OK) {
1893 ERR("request failed: %d", ret);
1897 g_variant_get(result, "(ii)", &m, &ret);
1898 g_variant_unref(result);
1899 if (ret != PKGMGR_R_OK)
1907 API int pkgmgr_client_usr_get_pkg_restriction_mode(pkgmgr_client *pc,
1908 const char *pkgid, int *mode, uid_t uid)
1910 return __get_pkg_restriction_mode(pc, pkgid, mode, uid);
1913 API int pkgmgr_client_get_pkg_restriction_mode(pkgmgr_client *pc,
1914 const char *pkgid, int *mode)
1916 return pkgmgr_client_usr_get_pkg_restriction_mode(pc, pkgid, mode,
1920 API int pkgmgr_client_usr_set_restriction_mode(pkgmgr_client *pc, int mode,
1924 int ret = PKGMGR_R_ECOMM;
1925 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1928 ERR("invalid parameter");
1929 return PKGMGR_R_EINVAL;
1932 ret = pkgmgr_client_connection_send_request(client,
1933 "set_restriction_mode",
1934 g_variant_new("(usi)", uid, "", mode), &result);
1935 if (ret != PKGMGR_R_OK) {
1936 ERR("request failed: %d", ret);
1940 g_variant_get(result, "(i)", &ret);
1941 g_variant_unref(result);
1946 API int pkgmgr_client_set_restriction_mode(pkgmgr_client *pc, int mode)
1948 return pkgmgr_client_usr_set_restriction_mode(pc, mode, _getuid());
1951 API int pkgmgr_client_usr_unset_restriction_mode(pkgmgr_client *pc, int mode,
1955 int ret = PKGMGR_R_ECOMM;
1956 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1959 ERR("invalid parameter");
1960 return PKGMGR_R_EINVAL;
1963 ret = pkgmgr_client_connection_send_request(client,
1964 "unset_restriction_mode",
1965 g_variant_new("(usi)", uid, "", mode), &result);
1966 if (ret != PKGMGR_R_OK) {
1967 ERR("request failed: %d", ret);
1971 g_variant_get(result, "(i)", &ret);
1972 g_variant_unref(result);
1977 API int pkgmgr_client_unset_restriction_mode(pkgmgr_client *pc, int mode)
1979 return pkgmgr_client_usr_unset_restriction_mode(pc, mode, _getuid());
1982 API int pkgmgr_client_usr_get_restriction_mode(pkgmgr_client *pc,
1983 int *mode, uid_t uid)
1986 int ret = PKGMGR_R_ECOMM;
1988 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
1991 ERR("invalid parameter");
1992 return PKGMGR_R_EINVAL;
1995 ret = pkgmgr_client_connection_send_request(client,
1996 "get_restriction_mode",
1997 g_variant_new("(us)", uid, ""), &result);
1998 if (ret != PKGMGR_R_OK) {
1999 ERR("request failed: %d", ret);
2003 g_variant_get(result, "(ii)", &m, &ret);
2004 g_variant_unref(result);
2005 if (ret != PKGMGR_R_OK)
2013 API int pkgmgr_client_get_restriction_mode(pkgmgr_client *pc, int *mode)
2015 return pkgmgr_client_usr_get_restriction_mode(pc, mode, _getuid());
2018 API pkgmgr_info *pkgmgr_client_check_pkginfo_from_file(const char *pkg_path)
2021 pkg_plugin_set *plugin_set;
2022 package_manager_pkg_detail_info_t *info;
2025 if (pkg_path == NULL) {
2026 ERR("invalid parameter");
2030 pkg_type = __get_type_from_path(pkg_path);
2031 if (pkg_type == NULL) {
2032 ERR("cannot get pkg type");
2036 plugin_set = _package_manager_load_library(pkg_type);
2037 if (plugin_set == NULL) {
2038 ERR("failed to load library for %s", pkg_type);
2043 info = calloc(1, sizeof(package_manager_pkg_detail_info_t));
2045 ERR("out of memory");
2050 ret = plugin_set->get_pkg_detail_info_from_package(pkg_path, info);
2052 ERR("get_pkg_detail_info_from_package failed");
2060 return (pkgmgr_info *)info;
2063 API int pkgmgr_client_free_pkginfo(pkgmgr_info *info)
2065 package_manager_pkg_detail_info_t *pkg_info =
2066 (package_manager_pkg_detail_info_t *)info;
2069 ERR("invalid parameter");
2070 return PKGMGR_R_EINVAL;
2073 free(pkg_info->icon_buf);
2079 API int pkgmgr_client_usr_set_app_label(pkgmgr_client *pc, char *appid,
2080 char *label, uid_t uid)
2084 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2086 if (pc == NULL || appid == NULL || label == NULL) {
2087 ERR("Invalid parameter");
2088 return PKGMGR_R_EINVAL;
2091 ret = pkgmgr_client_connection_send_request(client,
2093 g_variant_new("(uss)", uid, appid, label), &result);
2094 if (ret != PKGMGR_R_OK) {
2095 ERR("Request failed: %d", ret);
2099 g_variant_get(result, "(i)", &ret);
2100 g_variant_unref(result);
2105 API int pkgmgr_client_set_app_label(pkgmgr_client *pc, char *appid, char *label)
2107 return pkgmgr_client_usr_set_app_label(pc, appid, label, _getuid());
2110 API int pkgmgr_client_set_debug_mode(pkgmgr_client *pc, bool debug_mode)
2112 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2115 ERR("invalid parameter");
2116 return PKGMGR_R_EINVAL;
2119 client->debug_mode = debug_mode;
2124 API int pkgmgr_client_usr_migrate_external_image(pkgmgr_client *pc,
2125 const char *pkgid, uid_t uid)
2128 int ret = PKGMGR_R_ECOMM;
2129 struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc;
2132 ERR("invalid parameter");
2133 return PKGMGR_R_EINVAL;
2136 ret = pkgmgr_client_connection_send_request(client,
2137 "migrate_external_image",
2138 g_variant_new("(us)", uid, pkgid), &result);
2139 if (ret != PKGMGR_R_OK) {
2140 ERR("request failed: %d", ret);
2144 g_variant_get(result, "(i)", &ret);
2145 g_variant_unref(result);