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.
32 #include "pkgmgr_installer.h"
33 #include "pkgmgr_installer_config.h"
35 #include "comm_config.h"
36 #include "comm_debug.h"
38 #include <pkgmgr-info.h>
42 #define LOG_TAG "PKGMGR_INSTALLER"
45 #define MAX_STRLEN 1024
46 #define MAX_QUERY_LEN 4096
48 #define CHK_PI_RET(r) \
49 do { if (NULL == pi) return (r); } while (0)
51 struct pkgmgr_installer {
64 GDBusConnection *conn;
67 static const char *__get_signal_name(pkgmgr_installer *pi, const char *key)
69 if (strcmp(key, PKGMGR_INSTALLER_INSTALL_PERCENT_KEY_STR) == 0)
70 return COMM_STATUS_BROADCAST_EVENT_INSTALL_PROGRESS;
71 else if (strcmp(key, PKGMGR_INSTALLER_GET_SIZE_KEY_STR) == 0)
72 return COMM_STATUS_BROADCAST_EVENT_GET_SIZE;
73 else if (strcmp(key, PKGMGR_INSTALLER_APPID_KEY_STR) == 0)
74 return COMM_STATUS_BROADCAST_EVENT_UNINSTALL;
76 switch (pi->request_type) {
77 case PKGMGR_REQ_INSTALL:
78 return COMM_STATUS_BROADCAST_EVENT_INSTALL;
79 case PKGMGR_REQ_UNINSTALL:
80 return COMM_STATUS_BROADCAST_EVENT_UNINSTALL;
81 case PKGMGR_REQ_UPGRADE:
82 return COMM_STATUS_BROADCAST_EVENT_UPGRADE;
84 return COMM_STATUS_BROADCAST_EVENT_MOVE;
85 case PKGMGR_REQ_ENABLE_DISABLE_APP:
86 return COMM_STATUS_BROADCAST_EVENT_ENABLE_DISABLE_APP;
89 ERR("cannot find type, send signal with type SIGNAL_STATUS");
91 return COMM_STATUS_BROADCAST_SIGNAL_STATUS;
94 static int __send_signal_for_app_event(pkgmgr_installer *pi, const char *pkg_type,
95 const char *pkgid, const char *appid, const char *key, const char *val)
101 if (!pi || pi->conn == NULL || appid == NULL)
104 sid = pi->session_id;
108 name = __get_signal_name(pi, key);
110 ERR("unknown signal type");
114 if (g_dbus_connection_emit_signal(pi->conn, NULL,
115 COMM_STATUS_BROADCAST_OBJECT_PATH,
116 COMM_STATUS_BROADCAST_INTERFACE, name,
117 g_variant_new("(ussssss)", getuid(), sid,
118 pkg_type, pkgid, appid, key, val), &err)
120 ERR("failed to send dbus signal: %s", err->message);
128 static int __send_signal_for_event(pkgmgr_installer *pi, const char *pkg_type,
129 const char *pkgid, const char *key, const char *val)
135 if (!pi || pi->conn == NULL)
138 sid = pi->session_id;
142 name = __get_signal_name(pi, key);
144 ERR("unknown signal type");
148 if (g_dbus_connection_emit_signal(pi->conn, NULL,
149 COMM_STATUS_BROADCAST_OBJECT_PATH,
150 COMM_STATUS_BROADCAST_INTERFACE, name,
151 g_variant_new("(ussssss)", getuid(), sid,
152 pkg_type, pkgid, "", key, val), &err)
154 ERR("failed to send dbus signal: %s", err->message);
162 API pkgmgr_installer *pkgmgr_installer_new(void)
164 pkgmgr_installer *pi;
167 pi = calloc(1, sizeof(struct pkgmgr_installer));
171 pi->conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
172 if (pi->conn == NULL) {
173 ERR("failed to get bus: %s", err->message);
181 pi->request_type = PKGMGR_REQ_INVALID;
186 API pkgmgr_installer *pkgmgr_installer_offline_new(void)
188 pkgmgr_installer *pi;
190 pi = calloc(1, sizeof(struct pkgmgr_installer));
196 pi->request_type = PKGMGR_REQ_INVALID;
201 API int pkgmgr_installer_free(pkgmgr_installer *pi)
207 free(pi->pkgmgr_info);
209 free(pi->session_id);
210 if (pi->optional_data)
211 free(pi->optional_data);
212 if (pi->caller_pkgid)
213 free(pi->caller_pkgid);
218 g_dbus_connection_flush_sync(pi->conn, NULL, NULL);
219 g_object_unref(pi->conn);
228 pkgmgr_installer_receive_request(pkgmgr_installer *pi,
229 const int argc, char **argv)
236 optind = 1; /* Initialize optind to clear prev. index */
241 pi->target_uid = getuid();
243 c = getopt_long(argc, argv, short_opts, long_opts, &opt_idx);
244 /* printf("c=%d %c\n", c, c); //debug */
246 break; /* Parse is end */
248 case OPTVAL_PRELOAD: /* request for preload app */
250 DBG("option is 1000 is_preload[%d]", pi->is_preload );
252 case 'k': /* session id */
254 free(pi->session_id);
255 pi->session_id = strndup(optarg, MAX_STRLEN);
258 case 'l': /* license path */
259 if (pi->license_path)
260 free(pi->license_path);
261 pi->license_path = strndup(optarg, MAX_STRLEN);
264 case 'i': /* install */
270 pi->request_type = PKGMGR_REQ_INSTALL;
272 free(pi->pkgmgr_info);
273 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
274 DBG("option is [i] pkgid[%s]", pi->pkgmgr_info );
275 if (pi->pkgmgr_info && strlen(pi->pkgmgr_info)==0){
276 free(pi->pkgmgr_info);
282 case 'e': /* install */
285 pi->tep_path = strndup(optarg, MAX_STRLEN);
286 pi->is_tep_included = 1;
287 DBG("option is [e] tep_path[%s]", pi->tep_path);
290 case 'M': /* install */
291 if (strcmp(optarg, "tep_move") == 0)
295 DBG("option is [M] tep_move[%d]", pi->tep_move);
298 case 'd': /* uninstall */
304 pi->request_type = PKGMGR_REQ_UNINSTALL;
306 free(pi->pkgmgr_info);
307 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
311 case 'c': /* clear */
317 pi->request_type = PKGMGR_REQ_CLEAR;
319 free(pi->pkgmgr_info);
320 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
329 pi->request_type = PKGMGR_REQ_MOVE;
331 free(pi->pkgmgr_info);
332 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
335 case 'r': /* reinstall */
341 pi->request_type = PKGMGR_REQ_REINSTALL;
343 free(pi->pkgmgr_info);
344 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
347 case 't': /* move type*/
348 pi->move_type = atoi(optarg);
351 case 'p': /* caller pkgid*/
352 if (pi->caller_pkgid)
353 free(pi->caller_pkgid);
354 pi->caller_pkgid = strndup(optarg, MAX_STRLEN);
358 case 's': /* smack */
364 pi->request_type = PKGMGR_REQ_SMACK;
366 free(pi->pkgmgr_info);
367 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
370 case 'o': /* optional data*/
371 pi->optional_data = strndup(optarg, MAX_STRLEN);
374 case 'y': /* pkgid for direct manifest installation */
376 pi->request_type = PKGMGR_REQ_MANIFEST_DIRECT_INSTALL;
377 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
380 case 'b': /* recovery */
386 pi->request_type = PKGMGR_REQ_RECOVER;
388 free(pi->pkgmgr_info);
389 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
393 case '?': /* Not an option */
406 API int pkgmgr_installer_get_request_type(pkgmgr_installer *pi)
408 CHK_PI_RET(PKGMGR_REQ_INVALID);
409 return pi->request_type;
412 API const char *pkgmgr_installer_get_request_info(pkgmgr_installer *pi)
414 CHK_PI_RET(PKGMGR_REQ_INVALID);
415 return pi->pkgmgr_info;
418 API const char *pkgmgr_installer_get_tep_path(pkgmgr_installer *pi)
420 CHK_PI_RET(PKGMGR_REQ_INVALID);
424 API int pkgmgr_installer_get_tep_move_type(pkgmgr_installer *pi)
426 CHK_PI_RET(PKGMGR_REQ_INVALID);
430 API const char *pkgmgr_installer_get_session_id(pkgmgr_installer *pi)
432 CHK_PI_RET(PKGMGR_REQ_INVALID);
433 return pi->session_id;
436 API const char *pkgmgr_installer_get_license_path(pkgmgr_installer *pi)
438 CHK_PI_RET(PKGMGR_REQ_INVALID);
439 return pi->license_path;
442 API const char *pkgmgr_installer_get_optional_data(pkgmgr_installer *pi)
444 CHK_PI_RET(PKGMGR_REQ_INVALID);
445 return pi->optional_data;
448 API int pkgmgr_installer_is_quiet(pkgmgr_installer *pi)
453 API int pkgmgr_installer_get_move_type(pkgmgr_installer *pi)
455 CHK_PI_RET(PKGMGR_REQ_INVALID);
456 return pi->move_type;
459 API const char *pkgmgr_installer_get_caller_pkgid(pkgmgr_installer *pi)
461 CHK_PI_RET(PKGMGR_REQ_INVALID);
462 return pi->caller_pkgid;
465 API int pkgmgr_installer_get_is_preload(pkgmgr_installer *pi)
467 CHK_PI_RET(PKGMGR_REQ_INVALID);
468 return pi->is_preload;
471 API int pkgmgr_installer_send_app_uninstall_signal(pkgmgr_installer *pi,
472 const char *pkg_type,
477 ret = __send_signal_for_event(pi, pkg_type, pkgid,
478 PKGMGR_INSTALLER_APPID_KEY_STR, val);
483 pkgmgr_installer_send_app_signal(pkgmgr_installer *pi,
484 const char *pkg_type,
487 const char *key, const char *val)
492 ERR("connection is NULL");
496 if (strcmp(key, PKGMGR_INSTALLER_UPGRADE_EVENT_STR) == 0)
497 pi->request_type = PKGMGR_REQ_UPGRADE;
499 r = __send_signal_for_app_event(pi, pkg_type, pkgid, appid, key, val);
505 pkgmgr_installer_send_signal(pkgmgr_installer *pi,
506 const char *pkg_type,
508 const char *key, const char *val)
513 ERR("connection is NULL");
517 if (strcmp(key, PKGMGR_INSTALLER_UPGRADE_EVENT_STR) == 0)
518 pi->request_type = PKGMGR_REQ_UPGRADE;
520 r = __send_signal_for_event(pi, pkg_type, pkgid, key, val);
525 API int pkgmgr_installer_set_request_type(pkgmgr_installer *pi, int request_type)
530 pi->request_type = request_type;
534 API int pkgmgr_installer_set_session_id(pkgmgr_installer *pi, char *session_id)
536 if (pi == NULL || session_id == NULL)
539 pi->session_id = strndup(session_id, MAX_STRLEN);
543 API int pkgmgr_installer_create_certinfo_set_handle(pkgmgr_instcertinfo_h *handle)
546 ret = pkgmgrinfo_create_certinfo_set_handle(handle);
550 API int pkgmgr_installer_set_cert_value(pkgmgr_instcertinfo_h handle, pkgmgr_instcert_type cert_type, char *cert_value)
553 ret = pkgmgrinfo_set_cert_value(handle, cert_type, cert_value);
557 API int pkgmgr_installer_save_certinfo(const char *pkgid, pkgmgr_instcertinfo_h handle, uid_t uid)
560 ret = pkgmgrinfo_save_certinfo(pkgid, handle, uid);
564 API int pkgmgr_installer_destroy_certinfo_set_handle(pkgmgr_instcertinfo_h handle)
567 ret = pkgmgrinfo_destroy_certinfo_set_handle(handle);
571 API int pkgmgr_installer_delete_certinfo(const char *pkgid)
574 ret = pkgmgrinfo_delete_certinfo(pkgid);