4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
7 * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
23 #ifndef __PKGMGR_PARSER_H__
24 #define __PKGMGR_PARSER_H__
27 * @file pkgmgr_parser.h
28 * @author Sewook Park <sewook7.park@samsung.com>
29 * @author Shobhit Srivastava <shobhit.s@samsung.com>
31 * @brief This file declares API of pkgmgr_parser
32 * @addtogroup APPLICATION_FRAMEWORK
35 * @defgroup PackageManagerParser
36 * @section Header Header file to include:
38 * #include <pkgmgr_parser.h>
44 #include <libxml/xmlreader.h>
46 /* For multi-user support */
47 #include <tzplatform_config.h>
52 #define DEFAULT_LOCALE "No Locale"
54 #define PKG_PARSERLIB "parserlib:"
55 #define PKG_PARSER_CONF_PATH SYSCONFDIR "/package-manager/parser_path.conf"
57 #define PKG_STRING_LEN_MAX 1024
59 #define PKGMGR_PARSER_EMPTY_STR ""
60 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
64 * @brief List definitions.
65 * All lists are doubly-linked, the last element is stored to list pointer,
66 * which means that lists must be looped using the prev pointer, or by
67 * calling LISTHEAD first to go to start in order to use the next pointer.
71 * @brief Convinience Macro to add node in list
74 #define LISTADD(list, node) \
76 (node)->prev = (list); \
77 if (list) (node)->next = (list)->next; \
78 else (node)->next = NULL; \
79 if (list) (list)->next = (node); \
84 * @brief Convinience Macro to add one node to another node
86 #define NODEADD(node1, node2) \
88 (node2)->prev = (node1); \
89 (node2)->next = (node1)->next; \
90 if ((node1)->next) (node1)->next->prev = (node2); \
91 (node1)->next = (node2); \
95 * @brief Convinience Macro to concatenate two lists
97 #define LISTCAT(list, first, last) \
98 if ((first) && (last)) { \
99 (first)->prev = (list); \
104 * @brief Convinience Macro to delete node from list
106 #define LISTDEL(list, node) \
108 if ((node)->prev) (node)->prev->next = (node)->next; \
109 if ((node)->next) (node)->next->prev = (node)->prev; \
110 if (!((node)->prev) && !((node)->next)) (list) = NULL; \
114 * @brief Convinience Macro to get list head
116 #define LISTHEAD(list, node) \
117 for ((node) = (list); (node)->prev; (node) = (node)->prev)
120 * @brief Convinience Macro to get list tail
122 #define LISTTAIL(list, node) \
123 for ((node) = (list); (node)->next; (node) = (node)->next)
125 typedef struct metadata_x {
128 struct metadata_x *prev;
129 struct metadata_x *next;
132 typedef struct privilege_x {
134 struct privilege_x *prev;
135 struct privilege_x *next;
138 typedef struct privileges_x {
139 struct privilege_x *privilege;
140 struct privileges_x *prev;
141 struct privileges_x *next;
144 typedef struct permission_x {
147 struct permission_x *prev;
148 struct permission_x *next;
151 typedef struct icon_x {
157 const char *resolution;
162 typedef struct image_x {
167 struct image_x *prev;
168 struct image_x *next;
171 typedef struct allowed_x {
174 struct allowed_x *prev;
175 struct allowed_x *next;
178 typedef struct request_x {
180 struct request_x *prev;
181 struct request_x *next;
184 typedef struct define_x {
186 struct allowed_x *allowed;
187 struct request_x *request;
188 struct define_x *prev;
189 struct define_x *next;
192 typedef struct datashare_x {
193 struct define_x *define;
194 struct request_x *request;
195 struct datashare_x *prev;
196 struct datashare_x *next;
199 typedef struct description_x {
203 struct description_x *prev;
204 struct description_x *next;
207 typedef struct registry_x {
210 struct registry_x *prev;
211 struct registry_x *next;
214 typedef struct database_x {
217 struct database_x *prev;
218 struct database_x *next;
221 typedef struct layout_x {
224 struct layout_x *prev;
225 struct layout_x *next;
228 typedef struct label_x {
232 struct label_x *prev;
233 struct label_x *next;
236 typedef struct author_x {
241 struct author_x *prev;
242 struct author_x *next;
245 typedef struct license_x {
248 struct license_x *prev;
249 struct license_x *next;
252 typedef struct operation_x {
255 struct operation_x *prev;
256 struct operation_x *next;
259 typedef struct uri_x {
266 typedef struct mime_x {
273 typedef struct subapp_x {
276 struct subapp_x *prev;
277 struct subapp_x *next;
280 typedef struct condition_x {
283 struct condition_x *prev;
284 struct condition_x *next;
287 typedef struct notification_x {
290 struct notification_x *prev;
291 struct notification_x *next;
294 typedef struct appsvc_x {
296 struct operation_x *operation;
299 struct subapp_x *subapp;
300 struct appsvc_x *prev;
301 struct appsvc_x *next;
304 typedef struct appcontrol_x {
306 struct operation_x *operation;
309 struct subapp_x *subapp;
310 struct appcontrol_x *prev;
311 struct appcontrol_x *next;
314 typedef struct category_x{
316 struct category_x *prev;
317 struct category_x *next;
320 typedef struct launchconditions_x {
322 struct condition_x *condition;
323 struct launchconditions_x *prev;
324 struct launchconditions_x *next;
325 } launchconditions_x;
327 typedef struct compatibility_x {
330 struct compatibility_x *prev;
331 struct compatibility_x *next;
334 typedef struct deviceprofile_x {
337 struct deviceprofile_x *prev;
338 struct deviceprofile_x *next;
341 typedef struct resolution_x {
342 const char *mimetype;
343 const char *urischeme;
344 struct resolution_x *prev;
345 struct resolution_x *next;
348 typedef struct capability_x {
349 const char *operationid;
351 struct resolution_x *resolution;
352 struct capability_x *prev;
353 struct capability_x *next;
356 typedef struct datacontrol_x {
357 const char *providerid;
360 struct datacontrol_x *prev;
361 struct datacontrol_x *next;
364 typedef struct uiapplication_x {
367 const char *nodisplay;
368 const char *multiple;
369 const char *taskmanage;
372 const char *categories;
374 const char *hwacceleration;
375 const char *screenreader;
378 const char *recentimage;
379 const char *launchcondition;
380 const char *indicatordisplay;
381 const char *portraitimg;
382 const char *landscapeimg;
383 const char *guestmode_visibility;
384 const char *app_component;
385 const char *permission_type;
386 const char *component_type;
389 const char *submode_mainid;
390 struct label_x *label;
392 struct image_x *image;
393 struct appsvc_x *appsvc;
394 struct appcontrol_x *appcontrol;
395 struct category_x *category;
396 struct metadata_x *metadata;
397 struct permission_x *permission;
398 struct launchconditions_x *launchconditions;
399 struct notification_x *notification;
400 struct datashare_x *datashare;
401 struct datacontrol_x *datacontrol;
402 struct uiapplication_x *prev;
403 struct uiapplication_x *next;
406 typedef struct serviceapplication_x {
410 const char *autorestart;
414 const char *permission_type;
415 struct label_x *label;
417 struct appsvc_x *appsvc;
418 struct appcontrol_x *appcontrol;
419 struct category_x *category;
420 struct metadata_x *metadata;
421 struct permission_x *permission;
422 struct datacontrol_x *datacontrol;
423 struct launchconditions_x *launchconditions;
424 struct notification_x *notification;
425 struct datashare_x *datashare;
426 struct serviceapplication_x *prev;
427 struct serviceapplication_x *next;
428 } serviceapplication_x;
430 typedef struct daemon_x {
433 struct daemon_x *prev;
434 struct daemon_x *next;
437 typedef struct theme_x {
440 struct theme_x *prev;
441 struct theme_x *next;
444 typedef struct font_x {
451 typedef struct ime_x {
458 typedef struct manifest_x {
459 const char *for_all_users; /**< Flag that indicates if the package is available for everyone or for current user only*/
460 const char *package; /**< package name*/
461 const char *version; /**< package version*/
462 const char *installlocation; /**< package install location*/
463 const char *ns; /**<name space*/
464 const char *removable; /**< package removable flag*/
465 const char *preload; /**< package preload flag*/
466 const char *readonly; /**< package readonly flag*/
467 const char *update; /**< package update flag*/
468 const char *appsetting; /**< package app setting flag*/
469 const char *system; /**< package system flag*/
470 const char *type; /**< package type*/
471 const char *package_size; /**< package size for external installation*/
472 const char *installed_time; /**< installed time after finishing of installation*/
473 const char *installed_storage; /**< package currently installed storage*/
474 const char *storeclient_id; /**< id of store client for installed package*/
475 const char *mainapp_id; /**< app id of main application*/
476 const char *package_url; /**< app id of main application*/
477 const char *root_path; /**< package root path*/
478 const char *csc_path; /**< package csc path*/
479 const char *nodisplay_setting; /**< package no display setting menu*/
480 const char *main_package; /**< main package id for sub-package(ug)*/
481 struct icon_x *icon; /**< package icon*/
482 struct label_x *label; /**< package label*/
483 struct author_x *author; /**< package author*/
484 struct description_x *description; /**< package description*/
485 struct license_x *license; /**< package license*/
486 struct privileges_x *privileges; /**< package privileges*/
487 struct uiapplication_x *uiapplication; /**< package's ui application*/
488 struct serviceapplication_x *serviceapplication; /**< package's service application*/
489 struct daemon_x *daemon; /**< package daemon*/
490 struct theme_x *theme; /**< package theme*/
491 struct font_x *font; /**< package font*/
492 struct ime_x *ime; /**< package ime*/
493 struct compatibility_x *compatibility; /**< package compatibility*/
494 struct deviceprofile_x *deviceprofile; /**< package device profile*/
506 /* int check_uid(uid_t uid)
510 case GLOBAL_USER: return GLOBAL;
512 default: goto user; break;
520 * @fn char *pkgmgr_parser_get_manifest_file(const char *pkgid)
521 * @brief This API gets the manifest file of the package.
523 * @par This API is for package-manager installer backends.
524 * @par Sync (or) Async : Synchronous API
526 * @param[in] pkgid pointer to package ID
527 * @return manifest file path on success, NULL on failure
529 * @post Free the manifest file pointer that is returned by API
531 static int get_manifest_file(const char *pkgid)
533 char *manifest = NULL;
534 manifest = pkgmgr_parser_get_manifest_file(pkgid);
535 if (manifest == NULL)
537 printf("Manifest File Path is %s\n", manifest);
543 char *pkgmgr_parser_get_manifest_file(const char *pkgid);
546 * @fn int pkgmgr_parser_parse_manifest_for_installation(const char *manifest, char *const tagv[])
547 * @fn int pkgmgr_parser_parse_usr_manifest_for_installation(const char *manifest, uid_t uid, char *const tagv[])
548 * @brief This API parses the manifest file of the package after installation and stores the data in DB.
550 * @par This API is for package-manager installer backends.
551 * @par Sync (or) Async : Synchronous API
553 * @param[in] manifest pointer to package manifest file
554 * @param[in] uid the addressee user id of the instruction
555 * @param[in] tagv array of xml tags or NULL
556 * @return 0 if success, error code(<0) if fail
557 * @retval PMINFO_R_OK success
558 * @retval PMINFO_R_EINVAL invalid argument
559 * @retval PMINFO_R_ERROR internal error
563 static int parse_manifest_file_for_installation(const char *manifest)
566 ret = pkgmgr_parser_parse_manifest_for_installation(manifest, NULL);
573 int pkgmgr_parser_parse_manifest_for_installation(const char *manifest, char *const tagv[]);
574 int pkgmgr_parser_parse_usr_manifest_for_installation(const char *manifest, uid_t uid, char *const tagv[]);
577 * @fn int pkgmgr_parser_parse_usr_manifest_for_upgrade(const char *manifest, uid_t uid, char *const tagv[])
578 * @fn int pkgmgr_parser_parse_manifest_for_upgrade(const char *manifest, char *const tagv[])
579 * @brief This API parses the manifest file of the package after upgrade and stores the data in DB.
581 * @par This API is for package-manager installer backends.
582 * @par Sync (or) Async : Synchronous API
584 * @param[in] manifest pointer to package manifest file
585 * @param[in] uid the addressee user id of the instruction
586 * @param[in] tagv array of xml tags or NULL
587 * @return 0 if success, error code(<0) if fail
588 * @retval PMINFO_R_OK success
589 * @retval PMINFO_R_EINVAL invalid argument
590 * @retval PMINFO_R_ERROR internal error
594 static int parse_manifest_file_for_upgrade(const char *manifest)
597 ret = pkgmgr_parser_parse_manifest_for_upgrade(manifest, NULL);
604 int pkgmgr_parser_parse_manifest_for_upgrade(const char *manifest, char *const tagv[]);
605 int pkgmgr_parser_parse_usr_manifest_for_upgrade(const char *manifest, uid_t uid, char *const tagv[]);
607 * @fn int pkgmgr_parser_parse_manifest_for_uninstallation(const char *manifest, char *const tagv[])
608 * @fn int pkgmgr_parser_parse_usr_manifest_for_uninstallation(const char *manifest, uid_t uid, char *const tagv[])
609 * @brief This API parses the manifest file of the package after uninstallation and deletes the data from DB.
611 * @par This API is for package-manager installer backends.
612 * @par Sync (or) Async : Synchronous API
614 * @param[in] manifest pointer to package manifest file
615 * @param[in] uid the addressee user id of the instruction
616 * @param[in] tagv array of xml tags or NULL
617 * @return 0 if success, error code(<0) if fail
618 * @retval PMINFO_R_OK success
619 * @retval PMINFO_R_EINVAL invalid argument
620 * @retval PMINFO_R_ERROR internal error
624 static int parse_manifest_file_for_uninstallation(const char *manifest)
627 ret = pkgmgr_parser_parse_manifest_for_uninstallation(manifest, NULL);
634 int pkgmgr_parser_parse_manifest_for_uninstallation(const char *manifest, char *const tagv[]);
635 int pkgmgr_parser_parse_usr_manifest_for_uninstallation(const char *manifest, uid_t uid, char *const tagv[]);
637 * @fn int pkgmgr_parser_parse_manifest_for_preload()
638 * @fn int pkgmgr_parser_parse_usr_manifest_for_preload(uid_t uid)
639 * @brief This API update preload information to DB.
641 * @par This API is for package-manager installer backends.
642 * @par Sync (or) Async : Synchronous API
644 * @return 0 if success, error code(<0) if fail
645 * @retval PMINFO_R_OK success
646 * @retval PMINFO_R_EINVAL invalid argument
647 * @retval PMINFO_R_ERROR internal error
651 static int parser_parse_manifest_for_preload()
654 ret = pkgmgr_parser_parse_manifest_for_preload();
661 int pkgmgr_parser_parse_manifest_for_preload();
662 int pkgmgr_parser_parse_usr_manifest_for_preload(uid_t uid);
665 * @fn int pkgmgr_parser_check_manifest_validation(const char *manifest)
666 * @brief This API validates the manifest file against the manifest schema.
668 * @par This API is for package-manager installer backends.
669 * @par Sync (or) Async : Synchronous API
671 * @param[in] manifest pointer to package manifest file
672 * @return 0 if success, error code(<0) if fail
673 * @retval PMINFO_R_OK success
674 * @retval PMINFO_R_EINVAL invalid argument
675 * @retval PMINFO_R_ERROR internal error
679 static int validate_manifest_file(const char *manifest)
682 ret = pkgmgr_parser_check_manifest_validation(manifest);
689 int pkgmgr_parser_check_manifest_validation(const char *manifest);
692 * @fn void pkgmgr_parser_free_manifest_xml(manifest_x *mfx)
693 * @brief This API will free the manifest pointer by recursively freeing all sub elements.
695 * @par This API is for package-manager installer backends.
696 * @par Sync (or) Async : Synchronous API
698 * @param[in] mfx pointer to parsed manifest data
699 * @pre pkgmgr_parser_process_manifest_xml()
702 static int parse_manifest_file(const char *manifest)
704 manifest_x *mfx = NULL
705 mfx = pkgmgr_parser_process_manifest_xml(manifest);
708 printf("Parsing Manifest Success\n");
709 pkgmgr_parser_free_manifest_xml(mfx);
714 void pkgmgr_parser_free_manifest_xml(manifest_x *mfx);
717 * @fn manifest_x *pkgmgr_parser_process_manifest_xml(const char *manifest)
718 * @fn manifest_x *pkgmgr_parser_usr_process_manifest_xml(const char *manifest, uid_t uid)
719 * @brief This API parses the manifest file and stores all the data in the manifest structure.
721 * @par This API is for package-manager installer backends.
722 * @par Sync (or) Async : Synchronous API
724 * @param[in] manifest pointer to package manifest file
725 * @param[in] uid the addressee user id of the instruction
726 * @return manifest pointer on success, NULL on failure
728 * @post pkgmgr_parser_free_manifest_xml()
730 static int parse_manifest_file(const char *manifest)
732 manifest_x *mfx = NULL
733 mfx = pkgmgr_parser_process_manifest_xml(manifest);
736 printf("Parsing Manifest Success\n");
737 pkgmgr_parser_free_manifest_xml(mfx);
742 manifest_x *pkgmgr_parser_process_manifest_xml(const char *manifest);
743 manifest_x *pkgmgr_parser_usr_process_manifest_xml(const char *manifest, uid_t uid);
746 * @fn manifest_x *pkgmgr_parser_get_manifest_info(const char *pkigid)
747 * @brief This API gets the manifest info from DB and stores all the data in the manifest structure.
749 * @par This API is for package-manager installer backends.
750 * @par Sync (or) Async : Synchronous API
752 * @param[in] pkgid package id for package
753 * @return manifest pointer on success, NULL on failure
755 * @post pkgmgr_parser_free_manifest_xml()
757 static int get_manifest_info(const char *pkgid)
759 manifest_x *mfx = NULL
760 mfx = pkgmgr_parser_get_manifest_info(pkgid);
763 printf("Parsing Manifest Success\n");
764 pkgmgr_parser_free_manifest_xml(mfx);
769 manifest_x *pkgmgr_parser_get_manifest_info(const char *pkigid);
771 /* These APIs are intended to call parser directly */
772 typedef int (*ps_iter_fn) (const char *tag, int type, void *userdata);
774 int pkgmgr_parser_has_parser(const char *tag, int *type);
775 int pkgmgr_parser_get_list(ps_iter_fn iter_fn, void *data);
778 * @fn int pkgmgr_parser_run_parser_for_installation(xmlDocPtr docPtr, const char *tag, const char *pkgid)
779 * @brief This API calls the parser directly by supplying the xml docptr. It is used during package installation
781 * @par This API is for package-manager installer backends.
782 * @par Sync (or) Async : Synchronous API
784 * @param[in] docPtr XML doxument pointer
785 * @param[in] tag the xml tag corresponding to the parser that will parse the docPtr
786 * @param[in] pkgid the package id
787 * @return 0 if success, error code(<0) if fail
788 * @retval PMINFO_R_OK success
789 * @retval PMINFO_R_EINVAL invalid argument
790 * @retval PMINFO_R_ERROR internal error
794 static int parse_docptr_for_installation(xmlDocPtr docPtr)
797 ret = pkgmgr_parser_run_parser_for_installation(docPtr, "theme", "com.samsung.test");
804 int pkgmgr_parser_run_parser_for_installation(xmlDocPtr docPtr, const char *tag, const char *pkgid);
807 * @fn int pkgmgr_parser_run_parser_for_upgrade(xmlDocPtr docPtr, const char *tag, const char *pkgid)
808 * @brief This API calls the parser directly by supplying the xml docptr. It is used during package upgrade
810 * @par This API is for package-manager installer backends.
811 * @par Sync (or) Async : Synchronous API
813 * @param[in] docPtr XML doxument pointer
814 * @param[in] tag the xml tag corresponding to the parser that will parse the docPtr
815 * @param[in] pkgid the package id
816 * @return 0 if success, error code(<0) if fail
817 * @retval PMINFO_R_OK success
818 * @retval PMINFO_R_EINVAL invalid argument
819 * @retval PMINFO_R_ERROR internal error
823 static int parse_docptr_for_upgrade(xmlDocPtr docPtr)
826 ret = pkgmgr_parser_run_parser_for_upgrade(docPtr, "theme", "com.samsung.test");
833 int pkgmgr_parser_run_parser_for_upgrade(xmlDocPtr docPtr, const char *tag, const char *pkgid);
836 * @fn int pkgmgr_parser_run_parser_for_uninstallation(xmlDocPtr docPtr, const char *tag, const char *pkgid)
837 * @brief This API calls the parser directly by supplying the xml docptr. It is used during package uninstallation
839 * @par This API is for package-manager installer backends.
840 * @par Sync (or) Async : Synchronous API
842 * @param[in] docPtr XML doxument pointer
843 * @param[in] tag the xml tag corresponding to the parser that will parse the docPtr
844 * @param[in] pkgid the package id
845 * @return 0 if success, error code(<0) if fail
846 * @retval PMINFO_R_OK success
847 * @retval PMINFO_R_EINVAL invalid argument
848 * @retval PMINFO_R_ERROR internal error
852 static int parse_docptr_for_uninstallation(xmlDocPtr docPtr)
855 ret = pkgmgr_parser_run_parser_for_uninstallation(docPtr, "theme", "com.samsung.test");
862 int pkgmgr_parser_run_parser_for_uninstallation(xmlDocPtr docPtr, const char *tag, const char *pkgid);
867 * @fn int pkgmgr_parser_create_desktop_file(manifest_x *mfx)
868 * @fn int pkgmgr_parser_create_usr_desktop_file(manifest_x *mfx, uid_t uid)
869 * @brief This API generates the application desktop file
871 * @par This API is for package-manager installer backends.
872 * @par Sync (or) Async : Synchronous API
874 * @param[in] mfx manifest pointer
875 * @param[in] uid the addressee user id of the instruction
876 * @return 0 if success, error code(<0) if fail
877 * @retval PMINFO_R_OK success
878 * @retval PMINFO_R_EINVAL invalid argument
879 * @retval PMINFO_R_ERROR internal error
880 * @pre pkgmgr_parser_process_manifest_xml()
881 * @post pkgmgr_parser_free_manifest_xml()
883 static int create_desktop_file(char *manifest)
886 manifest_x *mfx = NULL;
887 mfx = pkgmgr_parser_process_manifest_xml(manifest);
888 ret = pkgmgr_parser_create_desktop_file(mfx);
891 pkgmgr_parser_free_manifest_xml(mfx);
896 int pkgmgr_parser_create_desktop_file(manifest_x *mfx);
897 int pkgmgr_parser_create_usr_desktop_file(manifest_x *mfx, uid_t uid);
903 #endif /* __PKGMGR_PARSER_H__ */