Release version 0.7.0
[platform/core/api/package-manager.git] / src / package_manager.c
1 /*
2  * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the License);
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an AS IS BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <stdlib.h>
18 #include <string.h>
19 #include <glib.h>
20 #include <unistd.h>
21
22 #include <package-manager.h>
23 #include <pkgmgr_installer.h>
24 #include <pkgmgr_installer_error.h>
25 #include <pkgmgr-info.h>
26 #include <tzplatform_config.h>
27
28 #include "package_manager.h"
29 #include "package_manager_internal.h"
30
31 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
32 typedef struct _request_event_info {
33         int req_id;
34         package_manager_event_type_e event_type;
35         package_manager_event_state_e event_state;
36         struct _request_event_info *next;
37 } request_event_info;
38
39 struct package_manager_event_info {
40         char *pkg_name;
41         package_manager_event_type_e event_type;
42         package_manager_event_state_e event_state;
43 };
44
45 struct package_manager_s {
46         int handle_id;
47         pkgmgr_client_type ctype;
48         pkgmgr_client *pc;
49         pkgmgr_mode mode;
50         GHashTable *event_info_table;
51         package_manager_event_cb event_cb;
52         void *user_data;
53         GMutex mutex;
54 };
55
56 struct package_manager_request_s {
57         int handle_id;
58         pkgmgr_client_type ctype;
59         pkgmgr_client *pc;
60         char *pkg_type;
61         pkgmgr_mode mode;
62         request_event_info *head;
63         package_manager_request_event_cb event_cb;
64         GHashTable *request_cb_table;
65         void *user_data;
66 };
67
68 struct package_manager_request_cb_info {
69         int req_id;
70         package_manager_request_event_cb callback;
71         void *user_data;
72 };
73
74 typedef struct package_size_info {
75         long long data_size;
76         long long cache_size;
77         long long app_size;
78
79         long long external_data_size;
80         long long external_cache_size;
81         long long external_app_size;
82 } package_size_info_t;
83
84 struct package_manager_filter_s {
85         pkgmgrinfo_pkginfo_filter_h pkgmgrinfo_pkginfo_filter;
86 };
87
88 struct package_updateinfo_request_s {
89         pkgmgr_client *pc;
90         pkg_update_info_t *updateinfo_handle;
91 };
92
93 static int package_manager_request_new_id()
94 {
95         static int request_handle_id = 0;
96         return request_handle_id++;
97 }
98
99 static int package_manager_new_id()
100 {
101         static int manager_handle_id = 0;
102         return manager_handle_id++;
103 }
104
105 static void __clean_all_event_info(request_event_info *head)
106 {
107         request_event_info *current = head;
108         request_event_info *prev;
109
110         if (current == NULL)
111                 return;
112
113         while (current) {
114                 prev = current;
115                 current = current->next;
116                 free(prev);
117         }
118 }
119
120 static int __insert_event_info(package_manager_h manager, const char *pkg_name,
121                         package_manager_event_type_e event_type,
122                         package_manager_event_state_e event_state)
123 {
124         struct package_manager_event_info *info;
125
126         info = calloc(1, sizeof(struct package_manager_event_info));
127         if (info == NULL)
128                 return -1;
129         info->pkg_name = strdup(pkg_name);
130         info->event_type = event_type;
131         info->event_state = event_state;
132         g_hash_table_insert(manager->event_info_table, info->pkg_name, info);
133
134         return 0;
135 }
136
137 static void __free_event_info(gpointer data)
138 {
139         struct package_manager_event_info *info =
140                         (struct package_manager_event_info *)data;
141
142         if (!info)
143                 return;
144
145         if (info->pkg_name)
146                 free(info->pkg_name);
147         free(info);
148
149         _LOGD("event_info removed");
150 }
151
152 static void __free_request_cb_info(gpointer data)
153 {
154         int req_id;
155         struct package_manager_request_cb_info *cb_info =
156                         (struct package_manager_request_cb_info *)data;
157
158         req_id = cb_info->req_id;
159         free(cb_info);
160         cb_info = NULL;
161
162         _LOGD("request callback info removed, req_id(%d)", req_id);
163 }
164
165 static void __initialize_request_cb_table(package_manager_request_h request)
166 {
167         request->request_cb_table =
168                 g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, __free_request_cb_info);
169 }
170
171 static int __insert_request_cb_info(package_manager_request_h request, int req_id,
172                 package_manager_request_event_cb callback, void *user_data)
173 {
174         struct package_manager_request_cb_info *cb_info;
175
176         if (request->request_cb_table == NULL)
177                 return -1;
178
179         cb_info = calloc(1, sizeof(struct package_manager_request_cb_info));
180         if (cb_info == NULL)
181                 return -1;
182         cb_info->req_id = req_id;
183         cb_info->callback = callback;
184         cb_info->user_data = user_data;
185         _LOGD("insert req_id(%d)", req_id);
186         g_hash_table_insert(request->request_cb_table, GINT_TO_POINTER(cb_info->req_id), cb_info);
187
188         return 0;
189 }
190
191 API int package_manager_request_create(package_manager_request_h *request)
192 {
193         struct package_manager_request_s *package_manager_request;
194
195         if (request == NULL) {
196                 return
197                     package_manager_error
198                     (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
199                      NULL);
200         }
201
202         package_manager_request =
203             calloc(1, sizeof(struct package_manager_request_s));
204         if (package_manager_request == NULL) {
205                 return
206                     package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
207                                           __FUNCTION__,
208                                           "failed to create a package_manager handle");
209         }
210
211         package_manager_request->ctype = PC_REQUEST;
212         package_manager_request->pc = pkgmgr_client_new(PC_REQUEST);
213         if (package_manager_request->pc == NULL) {
214                 free(package_manager_request);
215                 return
216                     package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
217                                           __FUNCTION__,
218                                           "failed to create a package_manager client");
219         }
220
221         package_manager_request->handle_id = package_manager_request_new_id();
222
223         *request = package_manager_request;
224
225         return PACKAGE_MANAGER_ERROR_NONE;
226 }
227
228 static int package_manager_client_validate_handle(package_manager_request_h
229                                                  request)
230 {
231         if (request == NULL || request->pc == NULL)
232                 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
233
234         return PACKAGE_MANAGER_ERROR_NONE;
235 }
236
237 API int package_manager_request_destroy(package_manager_request_h request)
238 {
239         if (package_manager_client_validate_handle(request)) {
240                 return
241                     package_manager_error
242                     (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
243                      NULL);
244         }
245
246         pkgmgr_client_free(request->pc);
247         request->pc = NULL;
248         free(request->pkg_type);
249         __clean_all_event_info(request->head);
250         if (request->request_cb_table) {
251                 g_hash_table_destroy(request->request_cb_table);
252                 request->request_cb_table = NULL;
253         }
254         free(request);
255
256         return PACKAGE_MANAGER_ERROR_NONE;
257 }
258
259 static int __reset_user_request_callback(package_manager_request_h request,
260                         package_manager_request_event_cb callback, void *user_data)
261 {
262         if (package_manager_client_validate_handle(request))
263                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
264
265         request->event_cb = callback;
266         request->user_data = user_data;
267
268         return PACKAGE_MANAGER_ERROR_NONE;
269 }
270
271 API int package_manager_request_set_event_cb(package_manager_request_h request,
272                                          package_manager_request_event_cb
273                                          callback, void *user_data)
274 {
275         int ret;
276
277         if (package_manager_client_validate_handle(request))
278                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER,
279                                 __FUNCTION__, NULL);
280
281         ret = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
282         if (ret != PACKAGE_MANAGER_ERROR_NONE)
283                 return ret;
284
285         return __reset_user_request_callback(request, callback, user_data);
286 }
287
288 API int package_manager_request_unset_event_cb(package_manager_request_h request)
289 {
290         if (package_manager_client_validate_handle(request))
291                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
292
293         request->event_cb = NULL;
294         request->user_data = NULL;
295
296         return PACKAGE_MANAGER_ERROR_NONE;
297 }
298
299 API int package_manager_request_set_type(package_manager_request_h request,
300                                      const char *pkg_type)
301 {
302         if (package_manager_client_validate_handle(request)) {
303                 return
304                     package_manager_error
305                     (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
306                      NULL);
307         }
308
309         if (request->pkg_type)
310                 free(request->pkg_type);
311         request->pkg_type = strdup(pkg_type);
312
313         return PACKAGE_MANAGER_ERROR_NONE;
314 }
315
316 API int package_manager_request_set_mode(package_manager_request_h request,
317                                      package_manager_request_mode_e mode)
318 {
319         if (package_manager_client_validate_handle(request)) {
320                 return
321                     package_manager_error
322                     (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
323                      NULL);
324         }
325
326         /* request mode is not used anymore */
327
328         return PACKAGE_MANAGER_ERROR_NONE;
329 }
330
331 API int package_manager_request_set_tep(package_manager_request_h request,
332                                      const char *tep_path)
333 {
334         int retval = 0;
335
336         if (package_manager_client_validate_handle(request) || tep_path == NULL) {
337                 return
338                         package_manager_error
339                         (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
340                          NULL);
341         }
342
343         retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
344         if (retval != PACKAGE_MANAGER_ERROR_NONE)
345                 return retval;
346
347         if (pkgmgr_client_set_tep_path(request->pc, tep_path, true))
348                 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
349
350         return PACKAGE_MANAGER_ERROR_NONE;
351 }
352
353 static int package_manager_get_event_type(const char *key,
354                                           package_manager_event_type_e *
355                                           event_type)
356 {
357         if (key == NULL)
358                 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
359
360         if (strcasecmp(key, PKGMGR_INSTALLER_INSTALL_EVENT_STR) == 0)
361                 *event_type = PACKAGE_MANAGER_EVENT_TYPE_INSTALL;
362         else if (strcasecmp(key, PKGMGR_INSTALLER_UNINSTALL_EVENT_STR) == 0)
363                 *event_type = PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL;
364         else if (strcasecmp(key, PKGMGR_INSTALLER_UPGRADE_EVENT_STR) == 0)
365                 *event_type = PACKAGE_MANAGER_EVENT_TYPE_UPDATE;
366         else if (strcasecmp(key, PKGMGR_INSTALLER_MOVE_EVENT_STR) == 0)
367                 *event_type = PACKAGE_MANAGER_EVENT_TYPE_MOVE;
368         else if (strcasecmp(key, PKGMGR_INSTALLER_CLEAR_EVENT_STR) == 0)
369                 *event_type = PACKAGE_MANAGER_EVENT_TYPE_CLEAR;
370         else
371                 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
372
373         return PACKAGE_MANAGER_ERROR_NONE;
374 }
375
376 static package_manager_error_e __convert_to_error(const char *val)
377 {
378         int errcode = atoi(val);
379
380         switch (errcode) {
381         case PKGMGR_INSTALLER_ERRCODE_UNDEFINED_ERROR:
382         case PKGMGR_INSTALLER_ERRCODE_GLOBALSYMLINK_ERROR:
383         case PKGMGR_INSTALLER_ERRCODE_GRANT_PERMISSION_ERROR:
384         case PKGMGR_INSTALLER_ERRCODE_IMAGE_ERROR:
385         case PKGMGR_INSTALLER_ERRCODE_PARSE_ERROR:
386         case PKGMGR_INSTALLER_ERRCODE_RECOVERY_ERROR:
387         case PKGMGR_INSTALLER_ERRCODE_DELTA_ERROR:
388         case PKGMGR_INSTALLER_ERRCODE_APP_DIR_ERROR:
389         case PKGMGR_INSTALLER_ERRCODE_CONFIG_ERROR:
390         case PKGMGR_INSTALLER_ERRCODE_ICON_ERROR:
391         case PKGMGR_INSTALLER_ERRCODE_MANIFEST_ERROR:
392         case PKGMGR_INSTALLER_ERRCODE_OUT_OF_SPACE:
393         case PKGMGR_INSTALLER_ERRCODE_ERROR:
394                 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
395         case PKGMGR_INSTALLER_ERRCODE_UNZIP_ERROR:
396         case PKGMGR_INSTALLER_ERRCODE_SECURITY_ERROR:
397         case PKGMGR_INSTALLER_ERRCODE_REGISTER_ERROR:
398         case PKGMGR_INSTALLER_ERRCODE_PRIVILEGE_ERROR:
399         case PKGMGR_INSTALLER_ERRCODE_SIGNATURE_ERROR:
400         case PKGMGR_INSTALLER_ERRCODE_SIGNATURE_INVALID:
401         case PKGMGR_INSTALLER_ERRCODE_CERT_ERROR:
402         case PKGMGR_INSTALLER_ERRCODE_AUTHOR_CERT_NOT_MATCH:
403         case PKGMGR_INSTALLER_ERRCODE_AUTHOR_CERT_NOT_FOUND:
404         case PKGMGR_INSTALLER_ERRCODE_ICON_NOT_FOUND:
405         case PKGMGR_INSTALLER_ERRCODE_MANIFEST_NOT_FOUND:
406                 return PACKAGE_MANAGER_ERROR_IO_ERROR;
407         case PKGMGR_INSTALLER_ERRCODE_PACKAGE_NOT_FOUND:
408                 return PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE;
409         case PKGMGR_INSTALLER_ERRCODE_OPERATION_NOT_ALLOWED:
410                 return PACKAGE_MANAGER_ERROR_PERMISSION_DENIED;
411         case PKGMGR_INSTALLER_ERRCODE_INVALID_VALUE:
412                 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
413         case PKGMGR_INSTALLER_ERRCODE_OK:
414                 return PACKAGE_MANAGER_ERROR_NONE;
415         default:
416                 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
417         }
418 }
419
420 static int __add_event_info(request_event_info **head, int req_id,
421                             package_manager_event_type_e event_type,
422                             package_manager_event_state_e event_state)
423 {
424         request_event_info *evt_info;
425         request_event_info *current;
426         request_event_info *prev;
427
428         evt_info = (request_event_info *) calloc(1, sizeof(request_event_info));
429         if (evt_info == NULL) {
430                 _LOGD("calloc failed");
431                 return -1;
432         }
433         evt_info->req_id = req_id;
434         evt_info->event_type = event_type;
435         evt_info->event_state = event_state;
436         evt_info->next = NULL;
437
438         if (*head == NULL)
439                 *head = evt_info;
440         else {
441                 current = prev = *head;
442                 while (current) {
443                         prev = current;
444                         current = current->next;
445                 }
446
447                 prev->next = evt_info;
448         }
449
450         return 0;
451 }
452
453 static int __find_event_info(request_event_info **head, int req_id,
454                              package_manager_event_type_e *event_type,
455                              package_manager_event_state_e *event_state)
456 {
457         request_event_info *tmp;
458
459         tmp = *head;
460
461         if (tmp == NULL) {
462                 _LOGE("tmp is NULL");
463                 return -1;
464         }
465
466         while (tmp) {
467                 if (tmp->req_id == req_id) {
468                         *event_type = tmp->event_type;
469                         *event_state = tmp->event_state;
470                         return 0;
471                 }
472                 tmp = tmp->next;
473         }
474         return -1;
475 }
476
477 static int __update_event_info(request_event_info **head, int req_id,
478                                package_manager_event_type_e event_type,
479                                package_manager_event_state_e event_state)
480 {
481         package_manager_event_type_e evt_type;
482         package_manager_event_state_e evt_state;
483         request_event_info *tmp;
484
485         if (__find_event_info(head, req_id, &evt_type, &evt_state) != 0)
486                 __add_event_info(head, req_id, event_type, event_state);
487         else {
488                 tmp = *head;
489
490                 if (tmp == NULL) {
491                         _LOGE("tmp is NULL");
492                         return -1;
493                 }
494
495                 while (tmp) {
496                         if (tmp->req_id == req_id) {
497                                 tmp->event_type = event_type;
498                                 tmp->event_state = event_state;
499                                 return 0;
500                         }
501                         tmp = tmp->next;
502                 }
503         }
504
505         return -1;
506 }
507
508 static int request_event_handler(uid_t target_uid, int req_id, const char *pkg_type,
509                                  const char *pkg_name, const char *key,
510                                  const char *val, const void *pmsg, void *data)
511 {
512         int ret = -1;
513         package_manager_event_type_e event_type = -1;
514         package_manager_event_state_e event_state = -1;
515
516         package_manager_request_h request = data;
517
518         if (strcasecmp(key, "start") == 0) {
519                 ret = package_manager_get_event_type(val, &event_type);
520                 if (ret != PACKAGE_MANAGER_ERROR_NONE)
521                         return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
522
523                 __add_event_info(&(request->head), req_id, event_type,
524                                  PACKAGE_MANAGER_EVENT_STATE_STARTED);
525
526                 if (request->event_cb)
527                         request->event_cb(req_id, pkg_type, pkg_name,
528                                           event_type,
529                                           PACKAGE_MANAGER_EVENT_STATE_STARTED,
530                                           0, PACKAGE_MANAGER_ERROR_NONE, request->user_data);
531
532         } else if (strcasecmp(key, "install_percent") == 0
533                    || strcasecmp(key, "progress_percent") == 0) {
534                 if (__find_event_info
535                     (&(request->head), req_id, &event_type,
536                      &event_state) == 0) {
537                         __update_event_info(&(request->head), req_id,
538                                             event_type,
539                                             PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
540                         if (request->event_cb)
541                                 request->event_cb(req_id, pkg_type, pkg_name,
542                                                   event_type,
543                                                   PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
544                                                   atoi(val),
545                                                   PACKAGE_MANAGER_ERROR_NONE,
546                                                   request->user_data);
547                 }
548
549         } else if (strcasecmp(key, "error") == 0) {
550                 if (__find_event_info
551                     (&(request->head), req_id, &event_type,
552                      &event_state) == 0) {
553                         __update_event_info(&(request->head), req_id,
554                                             event_type,
555                                             PACKAGE_MANAGER_EVENT_STATE_FAILED);
556                 }
557
558                 if (request->event_cb)
559                         request->event_cb(req_id, pkg_type,
560                                           pkg_name, event_type,
561                                           PACKAGE_MANAGER_EVENT_STATE_FAILED,
562                                           0,
563                                           __convert_to_error(val),
564                                           request->user_data);
565
566         } else if (strcasecmp(key, "end") == 0) {
567                 if (__find_event_info
568                     (&(request->head), req_id, &event_type,
569                      &event_state) == 0) {
570                         if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
571                                 if (request->event_cb)
572                                         request->event_cb(req_id, pkg_type,
573                                                           pkg_name, event_type,
574                                                           PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
575                                                           100,
576                                                           PACKAGE_MANAGER_ERROR_NONE,
577                                                           request->user_data);
578                         }
579                 } else {
580                         if (strcasecmp(key, "ok") != 0)
581                                 if (request->event_cb)
582                                         request->event_cb(req_id, pkg_type,
583                                                           pkg_name, event_type,
584                                                           PACKAGE_MANAGER_EVENT_STATE_FAILED,
585                                                           0,
586                                                           PACKAGE_MANAGER_ERROR_SYSTEM_ERROR,
587                                                           request->user_data);
588                 }
589         }
590
591         return PACKAGE_MANAGER_ERROR_NONE;
592 }
593
594 static int internal_request_callback(uid_t target_uid, int req_id, const char *pkg_type,
595                                 const char *pkg_name, const char *key,
596                                 const char *val, const void *pmsg, void *data)
597 {
598         int ret;
599         package_manager_event_type_e event_type = -1;
600         package_manager_event_state_e event_state = -1;
601         struct package_manager_request_cb_info *cb_info;
602         package_manager_request_event_cb event_cb;
603         void *user_data = NULL;
604
605         _LOGD("request callback called, req_id[%d]", req_id);
606
607         package_manager_request_h request = data;
608
609         if (request->request_cb_table)
610                 cb_info = g_hash_table_lookup(request->request_cb_table,
611                                 GINT_TO_POINTER(req_id));
612         else
613                 cb_info = NULL;
614
615         if (!cb_info || (cb_info && !cb_info->callback)) {
616                 _LOGE("no callback info");
617                 return 0;
618         }
619
620         if (cb_info->req_id != req_id) {
621                 _LOGE("not matched request id");
622                 return 0;
623         }
624
625         event_cb = cb_info->callback;
626         user_data = cb_info->user_data;
627
628         if (strcasecmp(key, "start") == 0) {
629                 ret = package_manager_get_event_type(val, &event_type);
630                 if (ret != PACKAGE_MANAGER_ERROR_NONE)
631                         return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
632
633                 __add_event_info(&request->head, req_id, event_type,
634                                  PACKAGE_MANAGER_EVENT_STATE_STARTED);
635
636                 event_cb(req_id, pkg_type, pkg_name,
637                         event_type,
638                         PACKAGE_MANAGER_EVENT_STATE_STARTED,
639                         0, PACKAGE_MANAGER_ERROR_NONE, user_data);
640         } else if (strcasecmp(key, "install_percent") == 0) {
641                 if (__find_event_info(&request->head, req_id, &event_type,
642                                 &event_state) == 0) {
643                         __update_event_info(&request->head, req_id,
644                                         event_type,
645                                         PACKAGE_MANAGER_EVENT_STATE_PROCESSING);
646                         event_cb(req_id, pkg_type, pkg_name,
647                                 event_type,
648                                 PACKAGE_MANAGER_EVENT_STATE_PROCESSING,
649                                 atoi(val),
650                                 PACKAGE_MANAGER_ERROR_NONE,
651                                 user_data);
652                 }
653         } else if (strcasecmp(key, "error") == 0) {
654                 if (__find_event_info(&request->head, req_id, &event_type,
655                                 &event_state) == 0) {
656                         __update_event_info(&request->head, req_id,
657                                         event_type,
658                                         PACKAGE_MANAGER_EVENT_STATE_FAILED);
659                         event_cb(req_id, pkg_type,
660                                 pkg_name, event_type,
661                                 PACKAGE_MANAGER_EVENT_STATE_FAILED,
662                                 0,
663                                 __convert_to_error(val),
664                                 user_data);
665                 }
666         } else if (strcasecmp(key, "end") == 0) {
667                 if (__find_event_info(&request->head, req_id, &event_type,
668                                 &event_state) == 0) {
669                         if (request->request_cb_table) {
670                                 _LOGD("remove item, req_id(%d)", req_id);
671                                 g_hash_table_remove(request->request_cb_table,
672                                         GINT_TO_POINTER(req_id));
673                         }
674                         if (event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
675                                 if (strcasecmp(val, "ok") == 0) {
676                                         event_cb(req_id, pkg_type,
677                                                 pkg_name, event_type,
678                                                 PACKAGE_MANAGER_EVENT_STATE_COMPLETED,
679                                                 100,
680                                                 PACKAGE_MANAGER_ERROR_NONE,
681                                                 user_data);
682                                 } else {
683                                         event_cb(req_id, pkg_type,
684                                                 pkg_name, event_type,
685                                                 PACKAGE_MANAGER_EVENT_STATE_FAILED,
686                                                 0,
687                                                 PACKAGE_MANAGER_ERROR_SYSTEM_ERROR,
688                                                 user_data);
689                                 }
690                         }
691                 } else {
692                         _LOGE("unexpected end event");
693                 }
694         }
695
696         return 0;
697 }
698
699 static int __request_install(package_manager_request_h request,
700                 const char *path, pkgmgr_handler event_cb, int *id)
701 {
702         int retval;
703         retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
704         if (retval != PACKAGE_MANAGER_ERROR_NONE)
705                 return retval;
706
707         if (package_manager_client_validate_handle(request))
708                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
709
710         if (path == NULL)
711                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
712
713         int request_id = 0;
714         request_id = pkgmgr_client_install(request->pc, request->pkg_type, NULL,
715                         path, NULL, request->mode, event_cb ? event_cb : request_event_handler, request);
716
717         if (request_id == PKGMGR_R_EINVAL)
718                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
719         else if (request_id == PKGMGR_R_ENOPKG)
720                 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
721         else if (request_id == PKGMGR_R_ENOMEM)
722                 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
723         else if (request_id == PKGMGR_R_EIO)
724                 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
725         else if (request_id == PKGMGR_R_EPRIV)
726                 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
727         else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR)
728                 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
729
730         if (id)
731                 *id = request_id;
732
733         return PACKAGE_MANAGER_ERROR_NONE;
734 }
735
736 static int __request_uninstall(package_manager_request_h request,
737                 const char *name, pkgmgr_handler event_cb, int *id)
738 {
739         int retval;
740         retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
741         if (retval != PACKAGE_MANAGER_ERROR_NONE)
742                 return retval;
743
744         if (package_manager_client_validate_handle(request))
745                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
746
747         if (name == NULL)
748                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
749
750         int request_id = 0;
751         request_id = pkgmgr_client_uninstall(request->pc, request->pkg_type,
752                         name, request->mode, event_cb ? event_cb : request_event_handler, request);
753
754         if (request_id == PKGMGR_R_EINVAL)
755                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
756         else if (request_id == PKGMGR_R_ENOPKG)
757                 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
758         else if (request_id == PKGMGR_R_ENOMEM)
759                 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
760         else if (request_id == PKGMGR_R_EIO)
761                 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
762         else if (request_id == PKGMGR_R_EPRIV)
763                 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
764         else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR)
765                 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
766
767         if (id)
768                 *id = request_id;
769
770         return PACKAGE_MANAGER_ERROR_NONE;
771 }
772
773 static int __request_move(package_manager_request_h request,
774                 const char *name, package_manager_move_type_e move_type,
775                 pkgmgr_handler event_cb, int *id)
776 {
777         int retval;
778         retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
779         if (retval != PACKAGE_MANAGER_ERROR_NONE)
780                 return retval;
781
782         if (package_manager_client_validate_handle(request))
783                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
784
785         if (name == NULL)
786                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
787
788         int request_id = 0;
789         request_id = pkgmgr_client_request_service(PM_REQUEST_MOVE, move_type,
790                         request->pc, request->pkg_type, name,
791                         NULL, event_cb ? event_cb : request_event_handler, request);
792
793         if (request_id == PKGMGR_R_EINVAL)
794                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
795         else if (request_id == PKGMGR_R_ENOPKG)
796                 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
797         else if (request_id == PKGMGR_R_ENOMEM)
798                 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
799         else if (request_id == PKGMGR_R_EIO)
800                 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
801         else if (request_id == PKGMGR_R_EPRIV)
802                 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
803         else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR)
804                 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
805
806         if (id)
807                 *id = request_id;
808
809         return PACKAGE_MANAGER_ERROR_NONE;
810 }
811
812 static int __request_mount_install(package_manager_request_h request,
813                 const char *path, pkgmgr_handler event_cb, int *id)
814 {
815         int retval;
816         retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
817         if (retval != PACKAGE_MANAGER_ERROR_NONE)
818                 return retval;
819
820         if (package_manager_client_validate_handle(request))
821                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
822
823         if (path == NULL)
824                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
825
826         int request_id = 0;
827         request_id = pkgmgr_client_mount_install(request->pc, request->pkg_type, NULL,
828                         path, NULL, request->mode, event_cb ? event_cb : request_event_handler, request);
829
830         if (request_id == PKGMGR_R_EINVAL)
831                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
832         else if (request_id == PKGMGR_R_ENOPKG)
833                 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
834         else if (request_id == PKGMGR_R_ENOMEM)
835                 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
836         else if (request_id == PKGMGR_R_EIO)
837                 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
838         else if (request_id == PKGMGR_R_EPRIV)
839                 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
840         else if (request_id == PKGMGR_R_ESYSTEM || request_id == PKGMGR_R_ECOMM || request_id == PKGMGR_R_ERROR)
841                 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
842
843         if (id)
844                 *id = request_id;
845
846         return PACKAGE_MANAGER_ERROR_NONE;
847 }
848
849
850 API int package_manager_request_install(package_manager_request_h request,
851                                 const char *path, int *id)
852 {
853         return __request_install(request, path, NULL, id);
854 }
855
856 API int package_manager_request_install_with_cb(package_manager_request_h request,
857                         const char *path, package_manager_request_event_cb callback,
858                         void *user_data, int *id)
859 {
860         int ret;
861         int req_id = 0;
862
863         if (request->request_cb_table == NULL)
864                 __initialize_request_cb_table(request);
865
866         ret = __request_install(request, path, internal_request_callback, &req_id);
867
868         if (req_id > 0) {
869                 ret = __insert_request_cb_info(request, req_id, callback, user_data);
870                 if (ret < 0)
871                         return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
872                                         __FUNCTION__, "failed to create request cb info");
873                 if (id)
874                         *id = req_id;
875         }
876
877         return ret;
878 }
879
880 API int package_manager_request_uninstall(package_manager_request_h request,
881                 const char *name, int *id)
882 {
883         return __request_uninstall(request, name, NULL, id);
884 }
885
886 API int package_manager_request_uninstall_with_cb(package_manager_request_h request,
887                         const char *name, package_manager_request_event_cb callback,
888                         void *user_data, int *id)
889 {
890         int ret;
891         int req_id = 0;
892
893         if (request->request_cb_table == NULL)
894                 __initialize_request_cb_table(request);
895
896         ret = __request_uninstall(request, name, internal_request_callback, &req_id);
897
898         if (req_id > 0) {
899                 ret = __insert_request_cb_info(request, req_id, callback, user_data);
900                 if (ret < 0)
901                         return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
902                                         __FUNCTION__, "failed to create request cb info");
903                 if (id)
904                         *id = req_id;
905         }
906
907         return ret;
908 }
909
910 API int package_manager_request_move(package_manager_request_h request,
911                 const char *name, package_manager_move_type_e move_type)
912 {
913         return __request_move(request, name, move_type, NULL, NULL);
914 }
915
916 API int package_manager_request_move_with_cb(package_manager_request_h request,
917                 const char *name, package_manager_move_type_e move_type,
918                 package_manager_request_event_cb callback, void *user_data, int *id)
919 {
920         int ret;
921         int req_id = 0;
922
923         if (request->request_cb_table == NULL)
924                 __initialize_request_cb_table(request);
925
926         ret = __request_move(request, name, move_type, internal_request_callback, &req_id);
927
928         if (req_id > 0) {
929                 ret = __insert_request_cb_info(request, req_id, callback, user_data);
930                 if (ret < 0)
931                         return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
932                                         __FUNCTION__, "failed to create request cb info");
933                 if (id)
934                         *id = req_id;
935         }
936
937         return ret;
938 }
939
940 API int package_manager_request_mount_install(package_manager_request_h request,
941                                 const char *path, int *id)
942 {
943         return __request_mount_install(request, path, NULL, id);
944 }
945
946 API int package_manager_request_mount_install_with_cb(package_manager_request_h request,
947                         const char *path, package_manager_request_event_cb callback,
948                         void *user_data, int *id)
949 {
950         int ret;
951         int req_id = 0;
952
953         if (request->request_cb_table == NULL)
954                 __initialize_request_cb_table(request);
955
956         ret = __request_mount_install(request, path, internal_request_callback, &req_id);
957
958         if (req_id > 0) {
959                 ret = __insert_request_cb_info(request, req_id, callback, user_data);
960                 if (ret < 0)
961                         return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
962                                         __FUNCTION__, "failed to create request cb info");
963                 if (id)
964                         *id = req_id;
965         }
966
967         return ret;
968 }
969
970 API int package_manager_create(package_manager_h *manager)
971 {
972         int retval;
973         retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
974         if (retval != PACKAGE_MANAGER_ERROR_NONE)
975                 return retval;
976
977         struct package_manager_s *package_manager = NULL;
978
979         if (manager == NULL) {
980                 return
981                     package_manager_error
982                     (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
983                      NULL);
984         }
985
986         package_manager = calloc(1, sizeof(struct package_manager_s));
987         if (package_manager == NULL) {
988                 return
989                     package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
990                                           __FUNCTION__,
991                                           "failed to create a package_manager handle");
992         }
993
994         package_manager->ctype = PC_LISTENING;
995         package_manager->pc = pkgmgr_client_new(PC_LISTENING);
996         if (package_manager->pc == NULL) {
997                 free(package_manager);
998                 return
999                     package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY,
1000                                           __FUNCTION__,
1001                                           "failed to create a package_manager client");
1002         }
1003
1004         package_manager->handle_id = package_manager_new_id();
1005         g_mutex_init(&package_manager->mutex);
1006
1007         *manager = package_manager;
1008
1009         return PACKAGE_MANAGER_ERROR_NONE;
1010 }
1011
1012 static int package_manager_validate_handle(package_manager_h manager)
1013 {
1014         if (manager == NULL || manager->pc == NULL)
1015                 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
1016
1017         return PACKAGE_MANAGER_ERROR_NONE;
1018 }
1019
1020 API int package_manager_destroy(package_manager_h manager)
1021 {
1022         if (package_manager_validate_handle(manager)) {
1023                 return
1024                     package_manager_error
1025                     (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1026                      NULL);
1027         }
1028
1029         g_mutex_clear(&manager->mutex);
1030         pkgmgr_client_free(manager->pc);
1031         g_hash_table_destroy(manager->event_info_table);
1032         free(manager);
1033
1034         return PACKAGE_MANAGER_ERROR_NONE;
1035 }
1036
1037 /* App Event Listening Policy:
1038  * +----------------+------------+---------------+------------------+
1039  * |Listener \ Type |Global Event|My User's Event|Other user's Event|
1040  * +----------------+------------+---------------+------------------+
1041  * |User Process App|   Grant    |     Grant     |      Deny        |
1042  * +----------------+------------+---------------+------------------+
1043  * |Platform module |   Grant    |     Grant     |      Grant       |
1044  * +----------------+------------+---------------+------------------+
1045  * UID assignment policy:
1046  * https://wiki.tizen.org/wiki/Security/User_and_group_ID_assignment_policy
1047  */
1048 #define REGULAR_USER 5000
1049 static int __validate_event_signal(uid_t target_uid)
1050 {
1051         uid_t self = getuid();
1052
1053         if (self == target_uid)
1054                 return 0;
1055
1056         if (self < REGULAR_USER)
1057                 return 0;
1058
1059         return -1;
1060 }
1061
1062 static int internal_callback(uid_t target_uid, int req_id, const char *pkg_type,
1063                                 const char *pkg_name, const char *key,
1064                                 const char *val, const void *pmsg, void *data)
1065 {
1066         struct package_manager_event_info *info = NULL;
1067         int ret = -1;
1068         package_manager_h manager = data;
1069         uid_t uid = target_uid;
1070         bool invoke_callback = false;
1071         package_manager_event_type_e event_type = -1;
1072         package_manager_event_state_e event_state;
1073         int progress = 0;
1074         package_manager_error_e error = PACKAGE_MANAGER_ERROR_NONE;
1075
1076         _LOGD("req_id(%d), pkg_name(%s), type(%s), key(%s), val(%s)",
1077                         req_id, pkg_name, pkg_type, key, val);
1078
1079         if (target_uid == GLOBAL_USER)
1080                 uid = getuid();
1081
1082         if (__validate_event_signal(uid))
1083                 return PACKAGE_MANAGER_ERROR_NONE;
1084
1085         if (manager && manager->event_info_table) {
1086                 g_mutex_lock(&manager->mutex);
1087                 info = g_hash_table_lookup(manager->event_info_table, pkg_name);
1088         } else {
1089                 _LOGE("invalid handle");
1090                 return PACKAGE_MANAGER_ERROR_NONE;
1091         }
1092
1093         if (!info) {
1094                 if (strcasecmp(key, "start") != 0) {
1095                         _LOGD("unexpected signal or no info(removed)");
1096                         g_mutex_unlock(&manager->mutex);
1097                         return PACKAGE_MANAGER_ERROR_NONE;
1098                 }
1099         }
1100
1101         if (strcasecmp(key, "start") == 0) {
1102                 ret = package_manager_get_event_type(val, &event_type);
1103                 if (ret != PACKAGE_MANAGER_ERROR_NONE) {
1104                         g_mutex_unlock(&manager->mutex);
1105                         return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
1106                 }
1107
1108                 if (!info) {
1109                         __insert_event_info(manager, pkg_name, event_type,
1110                                         PACKAGE_MANAGER_EVENT_STATE_STARTED);
1111
1112                         event_state = PACKAGE_MANAGER_EVENT_STATE_STARTED;
1113                         progress = 0;
1114                         error = PACKAGE_MANAGER_ERROR_NONE;
1115                         invoke_callback = true;
1116                 } else {
1117                         _LOGE("unexpected start event");
1118                 }
1119         } else if (strcasecmp(key, "install_percent") == 0
1120                    || strcasecmp(key, "progress_percent") == 0) {
1121                 info->event_state = PACKAGE_MANAGER_EVENT_STATE_PROCESSING;
1122                 event_type = info->event_type;
1123                 event_state = info->event_state;
1124                 progress = atoi(val);
1125                 error = PACKAGE_MANAGER_ERROR_NONE;
1126                 invoke_callback = true;
1127         } else if (strcasecmp(key, "error") == 0) {
1128                 info->event_state = PACKAGE_MANAGER_EVENT_STATE_FAILED;
1129                 event_type = info->event_state;
1130                 event_state = info->event_state;
1131                 progress = 0;
1132                 error = __convert_to_error(val);
1133                 invoke_callback = true;
1134         } else if (strcasecmp(key, "end") == 0) {
1135                 if (info->event_state != PACKAGE_MANAGER_EVENT_STATE_FAILED) {
1136                         if (strcasecmp(val, "ok") == 0) {
1137                                 event_type = info->event_type;
1138                                 event_state =
1139                                         PACKAGE_MANAGER_EVENT_STATE_COMPLETED;
1140                                 progress = 100;
1141                                 error = PACKAGE_MANAGER_ERROR_NONE;
1142                                 invoke_callback = true;
1143                         } else {
1144                                 event_type = info->event_type;
1145                                 event_state =
1146                                         PACKAGE_MANAGER_EVENT_STATE_FAILED;
1147                                 progress = 0;
1148                                 error = PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
1149                                 invoke_callback = true;
1150                         }
1151                 }
1152                 g_hash_table_remove(manager->event_info_table, info->pkg_name);
1153         }
1154         g_mutex_unlock(&manager->mutex);
1155
1156         if (invoke_callback && manager->event_cb && getuid() == uid) {
1157                 manager->event_cb(pkg_type, pkg_name, event_type, event_state,
1158                                 progress, error, manager->user_data);
1159         }
1160
1161         return PACKAGE_MANAGER_ERROR_NONE;
1162 }
1163
1164 static int __convert_status_type(package_manager_status_type_e status_type)
1165 {
1166         int type = 0;
1167
1168         if (status_type == PACKAGE_MANAGER_STATUS_TYPE_ALL)
1169                 return PKGMGR_CLIENT_STATUS_ALL;
1170
1171         if (status_type & PACKAGE_MANAGER_STATUS_TYPE_INSTALL)
1172                 type |= PKGMGR_CLIENT_STATUS_INSTALL;
1173         if (status_type & PACKAGE_MANAGER_STATUS_TYPE_UNINSTALL)
1174                 type |= PKGMGR_CLIENT_STATUS_UNINSTALL;
1175         if (status_type & PACKAGE_MANAGER_STATUS_TYPE_UPGRADE)
1176                 type |= PKGMGR_CLIENT_STATUS_UPGRADE;
1177         if (status_type & PACKAGE_MANAGER_STATUS_TYPE_MOVE)
1178                 type |= PKGMGR_CLIENT_STATUS_MOVE;
1179         if (status_type & PACKAGE_MANAGER_STATUS_TYPE_CLEAR_DATA)
1180                 type |= PKGMGR_CLIENT_STATUS_CLEAR_DATA;
1181         if (status_type & PACKAGE_MANAGER_STATUS_TYPE_INSTALL_PROGRESS)
1182                 type |= PKGMGR_CLIENT_STATUS_INSTALL_PROGRESS;
1183         if (status_type & PACKAGE_MANAGER_STATUS_TYPE_GET_SIZE)
1184                 type |= PKGMGR_CLIENT_STATUS_GET_SIZE;
1185
1186         return type;
1187 }
1188
1189 API int package_manager_set_event_status(package_manager_h manager, int status_type)
1190 {
1191         int retval;
1192         int type;
1193         int type_all = PACKAGE_MANAGER_STATUS_TYPE_INSTALL |
1194                 PACKAGE_MANAGER_STATUS_TYPE_UNINSTALL |
1195                 PACKAGE_MANAGER_STATUS_TYPE_UPGRADE |
1196                 PACKAGE_MANAGER_STATUS_TYPE_MOVE |
1197                 PACKAGE_MANAGER_STATUS_TYPE_CLEAR_DATA |
1198                 PACKAGE_MANAGER_STATUS_TYPE_INSTALL_PROGRESS |
1199                 PACKAGE_MANAGER_STATUS_TYPE_GET_SIZE;
1200
1201         if (manager == NULL)
1202                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1203
1204         if (status_type < 0 || status_type > type_all)
1205                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1206
1207         type = __convert_status_type(status_type);
1208         retval = pkgmgr_client_set_status_type(manager->pc, type);
1209
1210         if (retval < 0)
1211                 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1212
1213         return PACKAGE_MANAGER_ERROR_NONE;
1214 }
1215
1216 API int package_manager_set_event_cb(package_manager_h manager,
1217                                  package_manager_event_cb callback,
1218                                  void *user_data)
1219 {
1220         int retval;
1221         retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1222         if (retval != PACKAGE_MANAGER_ERROR_NONE)
1223                 return retval;
1224
1225         if (package_manager_validate_handle(manager)) {
1226                 return
1227                     package_manager_error
1228                     (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1229                      NULL);
1230         }
1231
1232         manager->event_cb = callback;
1233         manager->user_data = user_data;
1234
1235         retval = pkgmgr_client_listen_status(manager->pc,
1236                         internal_callback, manager);
1237         if (retval < 0) {
1238                 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR,
1239                         __FUNCTION__, NULL);
1240         }
1241
1242         if (!manager->event_info_table) {
1243                 manager->event_info_table =
1244                         g_hash_table_new_full(g_str_hash, g_str_equal,
1245                                 NULL, __free_event_info);
1246         }
1247
1248         return PACKAGE_MANAGER_ERROR_NONE;
1249 }
1250
1251 API int package_manager_unset_event_cb(package_manager_h manager)
1252 {
1253         if (manager == NULL) {
1254                 return
1255                     package_manager_error
1256                     (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1257                      NULL);
1258         }
1259
1260         int retval;
1261         manager->event_cb = NULL;
1262         manager->user_data = NULL;
1263
1264         g_mutex_lock(&manager->mutex);
1265         g_hash_table_remove_all(manager->event_info_table);
1266         g_mutex_unlock(&manager->mutex);
1267
1268         retval = pkgmgr_client_remove_listen_status(manager->pc);
1269         if (retval == PKGMGR_R_EINVAL)
1270                 return
1271                          package_manager_error
1272                          (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1273                           NULL);
1274         else if (retval == PKGMGR_R_ERROR)
1275                 return
1276                          package_manager_error
1277                          (PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__,
1278                           NULL);
1279
1280         return PACKAGE_MANAGER_ERROR_NONE;
1281 }
1282
1283 API int package_manager_get_package_id_by_app_id(const char *app_id, char **package_id)
1284 {
1285         pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo;
1286         int retval;
1287         char *pkg_id = NULL;
1288         char *pkg_id_dup = NULL;
1289
1290         retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1291         if (retval != PACKAGE_MANAGER_ERROR_NONE)
1292                 return retval;
1293
1294         if (app_id == NULL || package_id == NULL)
1295                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1296
1297         if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1298                 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1299         retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
1300         if (retval != PMINFO_R_OK) {
1301                 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1302                 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1303         }
1304
1305         pkg_id_dup = strdup(pkg_id);
1306         if (pkg_id_dup == NULL) {
1307                 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1308                 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1309         }
1310
1311         *package_id = pkg_id_dup;
1312
1313         pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1314
1315         return PACKAGE_MANAGER_ERROR_NONE;
1316 }
1317
1318 API int package_manager_get_package_info(const char *package_id, package_info_h *package_info)
1319 {
1320         int retval;
1321         retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1322         if (retval != PACKAGE_MANAGER_ERROR_NONE)
1323                 return retval;
1324
1325         retval = package_info_get_package_info(package_id, package_info);
1326
1327         if (retval != PACKAGE_MANAGER_ERROR_NONE)
1328                 return package_manager_error(retval, __FUNCTION__, NULL);
1329         else
1330                 return PACKAGE_MANAGER_ERROR_NONE;
1331 }
1332
1333 API int package_manager_foreach_package_info(package_manager_package_info_cb callback,
1334                                         void *user_data)
1335 {
1336         int retval;
1337         retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1338         if (retval != PACKAGE_MANAGER_ERROR_NONE)
1339                 return retval;
1340
1341         retval = package_info_foreach_package_info(callback, user_data);
1342
1343         if (retval != PACKAGE_MANAGER_ERROR_NONE)
1344                 return package_manager_error(retval, __FUNCTION__, NULL);
1345         else
1346                 return PACKAGE_MANAGER_ERROR_NONE;
1347 }
1348
1349 API int package_manager_compare_package_cert_info(const char *lhs_package_id, const char *rhs_package_id, package_manager_compare_result_type_e *compare_result)
1350 {
1351         pkgmgrinfo_cert_compare_result_type_e result;
1352
1353         if (lhs_package_id == NULL || rhs_package_id == NULL || compare_result == NULL)
1354                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1355         if (pkgmgrinfo_pkginfo_compare_pkg_cert_info(lhs_package_id, rhs_package_id, &result) != PKGMGR_R_OK)
1356                 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1357         *compare_result = (package_manager_compare_result_type_e)result;
1358
1359         return PACKAGE_MANAGER_ERROR_NONE;
1360 }
1361
1362 API int package_manager_compare_app_cert_info(const char *lhs_app_id, const char *rhs_app_id, package_manager_compare_result_type_e *compare_result)
1363 {
1364         pkgmgrinfo_cert_compare_result_type_e result;
1365
1366         if (lhs_app_id == NULL || rhs_app_id == NULL || compare_result == NULL)
1367                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1368         if (pkgmgrinfo_pkginfo_compare_app_cert_info(lhs_app_id, rhs_app_id, &result) != PKGMGR_R_OK)
1369                 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1370
1371         *compare_result = (package_manager_compare_result_type_e)result;
1372
1373         return PACKAGE_MANAGER_ERROR_NONE;
1374 }
1375
1376 API int package_manager_is_preload_package_by_app_id(const char *app_id, bool *preload)
1377 {
1378         int retval;
1379         retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1380         if (retval != PACKAGE_MANAGER_ERROR_NONE)
1381                 return retval;
1382
1383         pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL;
1384         pkgmgrinfo_pkginfo_h pkgmgrinfo_pkginfo = NULL;
1385
1386         char *pkg_id = NULL;
1387         bool is_preload = 0;
1388         if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1389                 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1390
1391         retval = pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id);
1392         if (retval != PMINFO_R_OK) {
1393                 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1394                 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1395         }
1396         if (pkgmgrinfo_pkginfo_get_pkginfo(pkg_id, &pkgmgrinfo_pkginfo) != PMINFO_R_OK) {
1397                 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1398                 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1399                 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1400         }
1401         if (pkgmgrinfo_pkginfo_is_preload(pkgmgrinfo_pkginfo, &is_preload) != PMINFO_R_OK) {
1402                 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1403                 pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1404                 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1405         }
1406
1407         if (is_preload)
1408                 *preload = 1;
1409         else
1410                 *preload = 0;
1411
1412         pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1413         pkgmgrinfo_pkginfo_destroy_pkginfo(pkgmgrinfo_pkginfo);
1414
1415         return PACKAGE_MANAGER_ERROR_NONE;
1416 }
1417
1418 API int package_manager_get_permission_type(const char *app_id, package_manager_permission_type_e *permission_type)
1419 {
1420         int retval;
1421         retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1422         if (retval != PACKAGE_MANAGER_ERROR_NONE)
1423                 return retval;
1424
1425         pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL;
1426         pkgmgrinfo_permission_type permission = 0;
1427         if (pkgmgrinfo_appinfo_get_appinfo(app_id, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
1428                 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1429         retval = pkgmgrinfo_appinfo_get_permission_type(pkgmgrinfo_appinfo, &permission);
1430         if (retval != PMINFO_R_OK) {
1431                 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1432                 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1433         }
1434
1435         if (permission == PMINFO_PERMISSION_NORMAL)
1436                 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
1437         else if (permission == PMINFO_PERMISSION_SIGNATURE)
1438                 *permission_type = PACKAGE_MANAGER_PERMISSION_SIGNATURE;
1439         else if (permission == PMINFO_PERMISSION_PRIVILEGE)
1440                 *permission_type = PACKAGE_MANAGER_PERMISSION_PRIVILEGE;
1441         else
1442                 *permission_type = PACKAGE_MANAGER_PERMISSION_NORMAL;
1443
1444         pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
1445         return PACKAGE_MANAGER_ERROR_NONE;
1446 }
1447
1448 API int package_manager_clear_cache_dir(const char *package_id)
1449 {
1450         int retval;
1451         retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_CACHE);
1452         if (retval != PACKAGE_MANAGER_ERROR_NONE)
1453                 return retval;
1454
1455         int res = pkgmgr_client_clear_cache_dir(package_id);
1456         if (res == PKGMGR_R_EINVAL) {
1457                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1458         } else if (res == PKGMGR_R_ENOPKG) {
1459                 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1460         } else if (res == PKGMGR_R_ENOMEM) {
1461                 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1462         } else if (res == PKGMGR_R_EIO) {
1463                 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1464         } else if (res == PKGMGR_R_EPRIV) {
1465                 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1466         } else if (res == PKGMGR_R_ESYSTEM || res == PKGMGR_R_ECOMM || res == PKGMGR_R_ERROR) {
1467                 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1468         } else if (res != PKGMGR_R_OK) {
1469                 _LOGE("Unexpected error");
1470                 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1471         }
1472
1473         return PACKAGE_MANAGER_ERROR_NONE;
1474 }
1475
1476 API int package_manager_clear_data_dir(const char *package_id)
1477 {
1478         int retval;
1479         pkgmgr_client *pc = NULL;
1480         char *pkg_type = NULL;
1481         pkgmgrinfo_pkginfo_h pkginfo = NULL;
1482
1483         if (package_id == NULL)
1484                 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
1485
1486         retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1487         if (retval != PACKAGE_MANAGER_ERROR_NONE)
1488                 return retval;
1489
1490         retval = pkgmgrinfo_pkginfo_get_pkginfo(package_id, &pkginfo);
1491         if (retval == PMINFO_R_ENOENT)
1492                 return PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE;
1493         else if (retval != PMINFO_R_OK || pkginfo == NULL)
1494                 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
1495
1496         retval = pkgmgrinfo_pkginfo_get_type(pkginfo, &pkg_type);
1497         if (retval != PMINFO_R_OK || pkg_type == NULL) {
1498                 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1499                 return PACKAGE_MANAGER_ERROR_SYSTEM_ERROR;
1500         }
1501
1502         pc = pkgmgr_client_new(PC_REQUEST);
1503         if (pc == NULL) {
1504                 _LOGE("Out of memory");
1505                 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1506                 return PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY;
1507         }
1508
1509         retval = pkgmgr_client_clear_user_data(pc, pkg_type, package_id, PM_QUIET);
1510         pkgmgr_client_free(pc);
1511         pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1512
1513         if (retval == PKGMGR_R_EINVAL) {
1514                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1515         } else if (retval == PKGMGR_R_ENOPKG) {
1516                 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1517         } else if (retval == PKGMGR_R_ENOMEM) {
1518                 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1519         } else if (retval == PKGMGR_R_EIO) {
1520                 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1521         } else if (retval == PKGMGR_R_EPRIV) {
1522                 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1523         } else if (retval == PKGMGR_R_ESYSTEM || retval == PKGMGR_R_ECOMM || retval == PKGMGR_R_ERROR) {
1524                 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1525         } else if (retval != PKGMGR_R_OK) {
1526                 _LOGE("Unexpected error");
1527                 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1528         }
1529
1530         return PACKAGE_MANAGER_ERROR_NONE;
1531 }
1532
1533 API int package_manager_clear_all_cache_dir(void)
1534 {
1535         int retval;
1536         retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1537         if (retval != PACKAGE_MANAGER_ERROR_NONE)
1538                 return retval;
1539
1540         return package_manager_clear_cache_dir(PKG_CLEAR_ALL_CACHE);
1541 }
1542
1543 struct getsize_cbdata {
1544         pkgmgr_client *pc;
1545         void *cb;
1546         void *user_data;
1547 };
1548
1549 static void __free_getsize_cbdata(struct getsize_cbdata *cbdata)
1550 {
1551         pkgmgr_client_free(cbdata->pc);
1552         free(cbdata);
1553 }
1554
1555 static void __result_cb(pkgmgr_client *pc, const char *pkgid, const pkg_size_info_t *result, void *user_data)
1556 {
1557         struct getsize_cbdata *cbdata = (struct getsize_cbdata *)user_data;
1558         package_manager_size_info_receive_cb callback = cbdata->cb;
1559         if (callback == NULL) {
1560                 _LOGE("callback is null.");
1561                 __free_getsize_cbdata(cbdata);
1562                 return;
1563         }
1564
1565         package_size_info_t size_info;
1566         size_info.data_size  = result->data_size;
1567         size_info.cache_size = result->cache_size;
1568         size_info.app_size   = result->app_size;
1569         size_info.external_data_size  = result->ext_data_size;
1570         size_info.external_cache_size = result->ext_cache_size;
1571         size_info.external_app_size   = result->ext_app_size;
1572
1573         callback(pkgid, (package_size_info_h)&size_info, user_data);
1574
1575         __free_getsize_cbdata(cbdata);
1576 }
1577
1578 static void __total_result_cb(pkgmgr_client *pc, const pkg_size_info_t *result, void *user_data)
1579 {
1580         struct getsize_cbdata *cbdata = (struct getsize_cbdata *)user_data;
1581         package_manager_total_size_info_receive_cb callback = cbdata->cb;
1582         if (callback == NULL) {
1583                 _LOGE("callback is null.");
1584                 __free_getsize_cbdata(cbdata);
1585                 return;
1586         }
1587
1588         package_size_info_t size_info;
1589         size_info.data_size  = result->data_size;
1590         size_info.cache_size = result->cache_size;
1591         size_info.app_size   = result->app_size;
1592         size_info.external_data_size  = result->ext_data_size;
1593         size_info.external_cache_size = result->ext_cache_size;
1594         size_info.external_app_size   = result->ext_app_size;
1595
1596         callback((package_size_info_h)&size_info, user_data);
1597
1598         __free_getsize_cbdata(cbdata);
1599 }
1600
1601 static int _get_pkg_size_info(const char *package_id, void *callback, void *user_data)
1602 {
1603         struct getsize_cbdata *cbdata;
1604
1605         if (package_id == NULL || callback == NULL)
1606                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1607
1608         cbdata = malloc(sizeof(struct getsize_cbdata));
1609         if (cbdata == NULL)
1610                 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1611
1612         pkgmgr_client *pc = pkgmgr_client_new(PC_REQUEST);
1613         if (pc == NULL) {
1614                 free(cbdata);
1615                 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1616         }
1617
1618         cbdata->pc = pc;
1619         cbdata->cb = callback;
1620         cbdata->user_data = user_data;
1621
1622         int res = 0;
1623         if (strcmp(package_id, PKG_SIZE_INFO_TOTAL) != 0)
1624                 res = pkgmgr_client_get_package_size_info(pc, package_id, __result_cb, cbdata);
1625         else
1626                 res = pkgmgr_client_get_total_package_size_info(pc, __total_result_cb, cbdata);
1627
1628         if (res == PKGMGR_R_EINVAL) {
1629                 pkgmgr_client_free(pc);
1630                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1631         } else if (res == PKGMGR_R_ENOPKG) {
1632                 pkgmgr_client_free(pc);
1633                 return package_manager_error(PACKAGE_MANAGER_ERROR_NO_SUCH_PACKAGE, __FUNCTION__, NULL);
1634         } else if (res == PKGMGR_R_ENOMEM) {
1635                 pkgmgr_client_free(pc);
1636                 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1637         } else if (res == PKGMGR_R_EIO) {
1638                 pkgmgr_client_free(pc);
1639                 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1640         } else if (res == PKGMGR_R_EPRIV) {
1641                 pkgmgr_client_free(pc);
1642                 return package_manager_error(PACKAGE_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
1643         } else if (res == PKGMGR_R_ESYSTEM || res == PKGMGR_R_ECOMM || res == PKGMGR_R_ERROR) {
1644                 pkgmgr_client_free(pc);
1645                 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1646         } else if (res != PKGMGR_R_OK) {
1647                 _LOGE("Unexpected error");
1648                 __free_getsize_cbdata(cbdata);
1649                 return package_manager_error(PACKAGE_MANAGER_ERROR_SYSTEM_ERROR, __FUNCTION__, NULL);
1650         }
1651
1652         return PACKAGE_MANAGER_ERROR_NONE;
1653 }
1654
1655 API int package_manager_get_package_size_info(const char *package_id, package_manager_size_info_receive_cb callback, void *user_data)
1656 {
1657         return _get_pkg_size_info(package_id, (void *)callback, user_data);
1658 }
1659
1660 API int package_manager_get_total_package_size_info(package_manager_total_size_info_receive_cb callback, void *user_data)
1661 {
1662         return _get_pkg_size_info(PKG_SIZE_INFO_TOTAL, (void *)callback, user_data);
1663 }
1664
1665 API int package_manager_filter_create(package_manager_filter_h *handle)
1666 {
1667         int retval;
1668         pkgmgrinfo_pkginfo_filter_h pkgmgr_filter = NULL;
1669
1670         retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1671         if (retval != PACKAGE_MANAGER_ERROR_NONE)
1672                 return retval;
1673
1674         if (handle == NULL) {
1675                 return
1676                     package_manager_error
1677                     (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1678                      NULL);
1679         }
1680
1681         retval = pkgmgrinfo_pkginfo_filter_create(&pkgmgr_filter);
1682         if (retval != PACKAGE_MANAGER_ERROR_NONE)
1683                 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1684
1685         *handle = pkgmgr_filter;
1686
1687         return PACKAGE_MANAGER_ERROR_NONE;
1688 }
1689
1690 API int package_manager_filter_destroy(package_manager_filter_h handle)
1691 {
1692         int retval;
1693
1694         if (handle == NULL) {
1695                 return
1696                     package_manager_error
1697                     (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1698                      NULL);
1699         }
1700
1701         retval = pkgmgrinfo_pkginfo_filter_destroy(handle);
1702         if (retval != PACKAGE_MANAGER_ERROR_NONE)
1703                 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1704
1705         return PACKAGE_MANAGER_ERROR_NONE;
1706 }
1707
1708 API int package_manager_filter_add_bool(package_manager_filter_h handle,
1709                 const char *property, const bool value)
1710 {
1711         int retval;
1712
1713         if ((handle == NULL) || (property == NULL)) {
1714                 return
1715                     package_manager_error
1716                     (PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__,
1717                      NULL);
1718         }
1719
1720         retval = pkgmgrinfo_pkginfo_filter_add_bool(handle, property, value);
1721         if (retval != PACKAGE_MANAGER_ERROR_NONE)
1722                 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1723
1724         return PACKAGE_MANAGER_ERROR_NONE;
1725 }
1726
1727 API int package_manager_filter_count(package_manager_filter_h handle, int *count)
1728 {
1729         int retval;
1730         retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1731         if (retval != PACKAGE_MANAGER_ERROR_NONE)
1732                 return retval;
1733
1734         if ((handle == NULL) || (count == NULL))
1735                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1736
1737         retval = pkgmgrinfo_pkginfo_filter_count(handle, count);
1738         if (retval < 0)
1739                 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1740
1741         return PACKAGE_MANAGER_ERROR_NONE;
1742 }
1743
1744 API int package_manager_filter_foreach_package_info(package_manager_filter_h handle,
1745                 package_manager_package_info_cb callback, void *user_data)
1746 {
1747         int retval;
1748         retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_INFO);
1749         if (retval != PACKAGE_MANAGER_ERROR_NONE)
1750                 return retval;
1751
1752         retval = package_info_filter_foreach_package_info(handle, callback, user_data);
1753
1754         if (retval != PACKAGE_MANAGER_ERROR_NONE)
1755                 return package_manager_error(retval, __FUNCTION__, NULL);
1756         else
1757                 return PACKAGE_MANAGER_ERROR_NONE;
1758 }
1759
1760 API int package_size_info_get_data_size(package_size_info_h handle, long long *data_size)
1761 {
1762         if (handle == NULL)
1763                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1764
1765         package_size_info_t *size_info = (package_size_info_t *)handle;
1766
1767         *data_size = (long long)size_info->data_size;
1768         return PACKAGE_MANAGER_ERROR_NONE;
1769 }
1770
1771 API int package_size_info_get_cache_size(package_size_info_h handle, long long *cache_size)
1772 {
1773         if (handle == NULL)
1774                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1775
1776         package_size_info_t *size_info = (package_size_info_t *)handle;
1777
1778         *cache_size = size_info->cache_size;
1779         return PACKAGE_MANAGER_ERROR_NONE;
1780 }
1781
1782 API int package_size_info_get_app_size(package_size_info_h handle, long long *app_size)
1783 {
1784         if (handle == NULL)
1785                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1786
1787         package_size_info_t *size_info = (package_size_info_t *)handle;
1788         *app_size = size_info->app_size;
1789         return PACKAGE_MANAGER_ERROR_NONE;
1790 }
1791
1792 API int package_size_info_get_external_data_size(package_size_info_h handle, long long *ext_data_size)
1793 {
1794         if (handle == NULL)
1795                 return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER;
1796
1797         package_size_info_t *size_info = (package_size_info_t *)handle;
1798         *ext_data_size = size_info->external_data_size;
1799         return PACKAGE_MANAGER_ERROR_NONE;
1800 }
1801
1802 API int package_size_info_get_external_cache_size(package_size_info_h handle, long long *ext_cache_size)
1803 {
1804         if (handle == NULL)
1805                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1806
1807         package_size_info_t *size_info = (package_size_info_t *)handle;
1808         *ext_cache_size = size_info->external_cache_size;
1809         return PACKAGE_MANAGER_ERROR_NONE;
1810 }
1811
1812 API int package_size_info_get_external_app_size(package_size_info_h handle, long long *ext_app_size)
1813 {
1814         if (handle == NULL)
1815                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1816
1817         package_size_info_t *size_info = (package_size_info_t *)handle;
1818         *ext_app_size = size_info->external_app_size;
1819         return PACKAGE_MANAGER_ERROR_NONE;
1820 }
1821
1822 API int package_manager_updateinfo_set_pkgid(package_updateinfo_request_h pkg_updateinfo_req, const char *pkgid)
1823 {
1824         struct package_updateinfo_request_s *request;
1825
1826         if (pkg_updateinfo_req == NULL || pkg_updateinfo_req->updateinfo_handle == NULL || pkgid == NULL)
1827                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1828
1829         request = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1830         if (request->updateinfo_handle->pkgid)
1831                 free(request->updateinfo_handle->pkgid);
1832         request->updateinfo_handle->pkgid = strdup(pkgid);
1833         if (request->updateinfo_handle->pkgid == NULL)
1834                 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1835
1836         return PACKAGE_MANAGER_ERROR_NONE;
1837 }
1838
1839 API int package_manager_updateinfo_set_version(package_updateinfo_request_h pkg_updateinfo_req, const char *version)
1840 {
1841         struct package_updateinfo_request_s *request;
1842
1843         if (pkg_updateinfo_req == NULL || pkg_updateinfo_req->updateinfo_handle == NULL || version == NULL)
1844                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1845
1846         request = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1847         if (request->updateinfo_handle->version)
1848                 free(request->updateinfo_handle->version);
1849         request->updateinfo_handle->version = strdup(version);
1850         if (request->updateinfo_handle->version == NULL)
1851                 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1852
1853         return PACKAGE_MANAGER_ERROR_NONE;
1854 }
1855
1856 static int package_manager_updateinfo_convert_property(package_updateinfo_type_e property, pkgmgr_updateinfo_type *converted_property)
1857 {
1858         if (converted_property == NULL)
1859                 return -1;
1860
1861         if (property == PACKAGE_UPDATEINFO_TYPE_FORCE)
1862                 *converted_property = PM_UPDATEINFO_TYPE_FORCE;
1863         else if (property == PACKAGE_UPDATEINFO_TYPE_OPTIONAL)
1864                 *converted_property = PM_UPDATEINFO_TYPE_OPTIONAL;
1865         else if (property == PACKAGE_UPDATEINFO_TYPE_NONE)
1866                 *converted_property = PM_UPDATEINFO_TYPE_NONE;
1867         else
1868                 return -1;
1869
1870         return 0;
1871 }
1872
1873 API int package_manager_updateinfo_set_type(package_updateinfo_request_h pkg_updateinfo_req, package_updateinfo_type_e type)
1874 {
1875         int retval;
1876         pkgmgr_updateinfo_type converted_type;
1877         struct package_updateinfo_request_s *request;
1878
1879         if (pkg_updateinfo_req == NULL || pkg_updateinfo_req->updateinfo_handle == NULL)
1880                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1881
1882         request = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1883         retval = package_manager_updateinfo_convert_property(type, &converted_type);
1884         if (retval != 0)
1885                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1886
1887         request->updateinfo_handle->type = converted_type;
1888         return PACKAGE_MANAGER_ERROR_NONE;
1889 }
1890
1891 API int package_manager_updateinfo_request_destroy(package_updateinfo_request_h pkg_updateinfo_req)
1892 {
1893         struct package_updateinfo_request_s *request;
1894
1895         if (pkg_updateinfo_req == NULL)
1896                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1897
1898         request = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1899         if (request->pc)
1900                 pkgmgr_client_free(request->pc);
1901
1902         if (request->updateinfo_handle) {
1903                 if (request->updateinfo_handle->pkgid)
1904                         free(request->updateinfo_handle->pkgid);
1905                 if (request->updateinfo_handle->version)
1906                         free(request->updateinfo_handle->version);
1907                 free(request->updateinfo_handle);
1908         }
1909         free(request);
1910
1911         return PACKAGE_MANAGER_ERROR_NONE;
1912 }
1913
1914 API  int package_manager_updateinfo_request_create(package_updateinfo_request_h *pkg_updateinfo_req)
1915 {
1916         struct package_updateinfo_request_s *request;
1917         pkg_update_info_t *update_info;
1918
1919         if (pkg_updateinfo_req == NULL)
1920                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1921
1922         request = calloc(1, sizeof(struct package_updateinfo_request_s));
1923         if (request == NULL)
1924                 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1925
1926         request->pc = pkgmgr_client_new(PC_REQUEST);
1927         if (request->pc == NULL) {
1928                 free(request);
1929                 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1930         }
1931
1932         update_info = calloc(1, sizeof(pkg_update_info_t));
1933         if (update_info == NULL) {
1934                 pkgmgr_client_free(request->pc);
1935                 free(request);
1936                 return package_manager_error(PACKAGE_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
1937         }
1938         request->updateinfo_handle = update_info;
1939
1940         *pkg_updateinfo_req = request;
1941         return PACKAGE_MANAGER_ERROR_NONE;
1942 }
1943
1944 API int package_manager_updateinfo_request_register(package_updateinfo_request_h pkg_updateinfo_req)
1945 {
1946         struct package_updateinfo_request_s *update_info;
1947         int retval;
1948
1949         if (pkg_updateinfo_req == NULL)
1950                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1951         update_info = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1952
1953         retval = pkgmgr_client_register_pkg_update_info(update_info->pc, update_info->updateinfo_handle);
1954         if (retval == PKGMGR_R_EINVAL)
1955                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1956
1957         return PACKAGE_MANAGER_ERROR_NONE;
1958 }
1959
1960 API int package_manager_updateinfo_request_unregister(package_updateinfo_request_h pkg_updateinfo_req, const char *pkgid)
1961 {
1962         int retval;
1963         struct package_updateinfo_request_s *update_info;
1964
1965         retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1966         if (retval != PACKAGE_MANAGER_ERROR_NONE)
1967                 return retval;
1968
1969         if (pkg_updateinfo_req == NULL || pkgid == NULL)
1970                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1971
1972         update_info = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1973         retval = pkgmgr_client_unregister_pkg_update_info(update_info->pc, pkgid);
1974         if (retval != PMINFO_R_OK)
1975                 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1976
1977         return PACKAGE_MANAGER_ERROR_NONE;
1978 }
1979
1980 API int package_manager_updateinfo_request_unregister_all(package_updateinfo_request_h pkg_updateinfo_req)
1981 {
1982         int retval;
1983         struct package_updateinfo_request_s *update_info;
1984
1985         retval = check_privilege(PRIVILEGE_PACKAGE_MANAGER_ADMIN);
1986         if (retval != PACKAGE_MANAGER_ERROR_NONE)
1987                 return retval;
1988
1989         if (pkg_updateinfo_req == NULL)
1990                 return package_manager_error(PACKAGE_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
1991
1992         update_info = (struct package_updateinfo_request_s *)pkg_updateinfo_req;
1993         retval = pkgmgr_client_unregister_all_pkg_update_info(update_info->pc);
1994
1995         if (retval != PMINFO_R_OK)
1996                 return package_manager_error(PACKAGE_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
1997
1998         return PACKAGE_MANAGER_ERROR_NONE;
1999 }