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 {
61 GDBusConnection *conn;
64 static const char *__get_signal_name(int status_type)
66 switch (status_type) {
67 case COMM_STATUS_BROADCAST_ALL:
68 return COMM_STATUS_BROADCAST_SIGNAL_STATUS;
69 case COMM_STATUS_BROADCAST_INSTALL:
70 return COMM_STATUS_BROADCAST_EVENT_INSTALL;
71 case COMM_STATUS_BROADCAST_UNINSTALL:
72 return COMM_STATUS_BROADCAST_EVENT_UNINSTALL;
73 case COMM_STATUS_BROADCAST_MOVE:
74 return COMM_STATUS_BROADCAST_EVENT_MOVE;
75 case COMM_STATUS_BROADCAST_INSTALL_PROGRESS:
76 return COMM_STATUS_BROADCAST_EVENT_INSTALL_PROGRESS;
77 case COMM_STATUS_BROADCAST_UPGRADE:
78 return COMM_STATUS_BROADCAST_EVENT_UPGRADE;
79 case COMM_STATUS_BROADCAST_GET_SIZE:
80 return COMM_STATUS_BROADCAST_EVENT_GET_SIZE;
86 static int __send_signal_for_event(int comm_status_type, pkgmgr_installer *pi,
89 const char *key, const char *val)
95 if (!pi || pi->conn == NULL)
102 name = __get_signal_name(comm_status_type);
104 ERR("unknown signal type");
108 if (g_dbus_connection_emit_signal(pi->conn, NULL,
109 COMM_STATUS_BROADCAST_OBJECT_PATH,
110 COMM_STATUS_BROADCAST_INTERFACE, name,
111 g_variant_new("(usssss)", getuid(), sid,
112 pkg_type, pkgid, key, val), &err)
114 ERR("failed to send dbus signal: %s", err->message);
122 API int __send_event(pkgmgr_installer *pi,
123 const char *pkg_type,
125 const char *key, const char *val)
129 if (strcmp(key,PKGMGR_INSTALLER_START_KEY_STR) == 0) {
130 if(strcmp(key,PKGMGR_INSTALLER_UPGRADE_EVENT_STR) == 0) {
131 pi->request_type = PKGMGR_REQ_UPGRADE;
132 r = __send_signal_for_event(COMM_STATUS_BROADCAST_UPGRADE, pi, pkg_type, pkgid, key, val);
134 if(pi->request_type == PKGMGR_REQ_INSTALL) {
135 r = __send_signal_for_event(COMM_STATUS_BROADCAST_INSTALL, pi, pkg_type, pkgid, key, val);
136 } else if (pi->request_type == PKGMGR_REQ_UNINSTALL){
137 r = __send_signal_for_event(COMM_STATUS_BROADCAST_UNINSTALL, pi, pkg_type, pkgid, key, val);
139 } else if (strcmp(key,PKGMGR_INSTALLER_END_KEY_STR) == 0) {
140 if(pi->request_type == PKGMGR_REQ_INSTALL) {
141 r = __send_signal_for_event(COMM_STATUS_BROADCAST_INSTALL, pi, pkg_type, pkgid, key, val);
142 } else if (pi->request_type == PKGMGR_REQ_UNINSTALL){
143 r = __send_signal_for_event(COMM_STATUS_BROADCAST_UNINSTALL, pi, pkg_type, pkgid, key, val);
144 } else if (pi->request_type == PKGMGR_REQ_UPGRADE){
145 r = __send_signal_for_event(COMM_STATUS_BROADCAST_UPGRADE, pi, pkg_type, pkgid, key, val);
147 } else if (strcmp(key,PKGMGR_INSTALLER_INSTALL_PERCENT_KEY_STR) == 0) {
148 r = __send_signal_for_event(COMM_STATUS_BROADCAST_INSTALL_PROGRESS, pi, pkg_type, pkgid, key, val);
154 API pkgmgr_installer *pkgmgr_installer_new(void)
156 pkgmgr_installer *pi;
159 pi = calloc(1, sizeof(struct pkgmgr_installer));
163 pi->conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
164 if (pi->conn == NULL) {
165 ERR("failed to get bus: %s", err->message);
171 pi->request_type = PKGMGR_REQ_INVALID;
176 API int pkgmgr_installer_free(pkgmgr_installer *pi)
182 free(pi->pkgmgr_info);
184 free(pi->session_id);
185 if (pi->optional_data)
186 free(pi->optional_data);
187 if (pi->caller_pkgid)
188 free(pi->caller_pkgid);
191 g_dbus_connection_flush_sync(pi->conn, NULL, NULL);
192 g_object_unref(pi->conn);
201 pkgmgr_installer_receive_request(pkgmgr_installer *pi,
202 const int argc, char **argv)
209 optind = 1; /* Initialize optind to clear prev. index */
214 pi->target_uid = getuid();
216 c = getopt_long(argc, argv, short_opts, long_opts, &opt_idx);
217 /* printf("c=%d %c\n", c, c); //debug */
219 break; /* Parse is end */
221 case 'k': /* session id */
223 free(pi->session_id);
224 pi->session_id = strndup(optarg, MAX_STRLEN);
227 case 'l': /* license path */
228 if (pi->license_path)
229 free(pi->license_path);
230 pi->license_path = strndup(optarg, MAX_STRLEN);
233 case 'i': /* install */
239 pi->request_type = PKGMGR_REQ_INSTALL;
241 free(pi->pkgmgr_info);
242 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
245 case 'd': /* uninstall */
251 pi->request_type = PKGMGR_REQ_UNINSTALL;
253 free(pi->pkgmgr_info);
254 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
258 case 'c': /* clear */
264 pi->request_type = PKGMGR_REQ_CLEAR;
266 free(pi->pkgmgr_info);
267 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
276 pi->request_type = PKGMGR_REQ_MOVE;
278 free(pi->pkgmgr_info);
279 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
282 case 'r': /* reinstall */
288 pi->request_type = PKGMGR_REQ_REINSTALL;
290 free(pi->pkgmgr_info);
291 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
294 case 't': /* move type*/
295 pi->move_type = atoi(optarg);
298 case 'p': /* caller pkgid*/
299 if (pi->caller_pkgid)
300 free(pi->caller_pkgid);
301 pi->caller_pkgid = strndup(optarg, MAX_STRLEN);
305 case 's': /* smack */
311 pi->request_type = PKGMGR_REQ_SMACK;
313 free(pi->pkgmgr_info);
314 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
317 case 'o': /* optional data*/
318 pi->optional_data = strndup(optarg, MAX_STRLEN);
322 case '?': /* Not an option */
335 API int pkgmgr_installer_get_request_type(pkgmgr_installer *pi)
337 CHK_PI_RET(PKGMGR_REQ_INVALID);
338 return pi->request_type;
341 API const char *pkgmgr_installer_get_request_info(pkgmgr_installer *pi)
343 CHK_PI_RET(PKGMGR_REQ_INVALID);
344 return pi->pkgmgr_info;
347 API const char *pkgmgr_installer_get_session_id(pkgmgr_installer *pi)
349 CHK_PI_RET(PKGMGR_REQ_INVALID);
350 return pi->session_id;
353 API const char *pkgmgr_installer_get_license_path(pkgmgr_installer *pi)
355 CHK_PI_RET(PKGMGR_REQ_INVALID);
356 return pi->license_path;
359 API const char *pkgmgr_installer_get_optional_data(pkgmgr_installer *pi)
361 CHK_PI_RET(PKGMGR_REQ_INVALID);
362 return pi->optional_data;
365 API int pkgmgr_installer_is_quiet(pkgmgr_installer *pi)
370 API int pkgmgr_installer_get_move_type(pkgmgr_installer *pi)
372 CHK_PI_RET(PKGMGR_REQ_INVALID);
373 return pi->move_type;
376 API const char *pkgmgr_installer_get_caller_pkgid(pkgmgr_installer *pi)
378 CHK_PI_RET(PKGMGR_REQ_INVALID);
379 return pi->caller_pkgid;
383 pkgmgr_installer_send_signal(pkgmgr_installer *pi,
384 const char *pkg_type,
386 const char *key, const char *val)
392 ERR("connection is NULL");
396 if (strcmp(pkg_type,PKGMGR_INSTALLER_GET_SIZE_KEY_STR) == 0) {
397 r = __send_signal_for_event(COMM_STATUS_BROADCAST_GET_SIZE, pi, pkg_type, pkgid, key, val);
401 sid = pi->session_id;
405 r = __send_event(pi, pkg_type, pkgid, key, val);
410 API int pkgmgr_installer_create_certinfo_set_handle(pkgmgr_instcertinfo_h *handle)
413 ret = pkgmgrinfo_create_certinfo_set_handle(handle);
417 API int pkgmgr_installer_set_cert_value(pkgmgr_instcertinfo_h handle, pkgmgr_instcert_type cert_type, char *cert_value)
420 ret = pkgmgrinfo_set_cert_value(handle, cert_type, cert_value);
424 API int pkgmgr_installer_save_certinfo(const char *pkgid, pkgmgr_instcertinfo_h handle, uid_t uid)
427 ret = pkgmgrinfo_save_certinfo(pkgid, handle, uid);
431 API int pkgmgr_installer_destroy_certinfo_set_handle(pkgmgr_instcertinfo_h handle)
434 ret = pkgmgrinfo_destroy_certinfo_set_handle(handle);
438 API int pkgmgr_installer_delete_certinfo(const char *pkgid)
441 ret = pkgmgrinfo_delete_certinfo(pkgid);