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