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>
49 #define DEFAULT_LOCALE "No Locale"
51 #define PKG_PARSERLIB "parserlib:"
52 #define PKG_PARSER_CONF_PATH "/usr/etc/package-manager/parser_path.conf"
54 #define PKG_STRING_LEN_MAX 1024
57 * @brief List definitions.
58 * All lists are doubly-linked, the last element is stored to list pointer,
59 * which means that lists must be looped using the prev pointer, or by
60 * calling LISTHEAD first to go to start in order to use the next pointer.
64 * @brief Convinience Macro to add node in list
67 #define LISTADD(list, node) \
69 (node)->prev = (list); \
70 if (list) (node)->next = (list)->next; \
71 else (node)->next = NULL; \
72 if (list) (list)->next = (node); \
77 * @brief Convinience Macro to add one node to another node
79 #define NODEADD(node1, node2) \
81 (node2)->prev = (node1); \
82 (node2)->next = (node1)->next; \
83 if ((node1)->next) (node1)->next->prev = (node2); \
84 (node1)->next = (node2); \
88 * @brief Convinience Macro to concatenate two lists
90 #define LISTCAT(list, first, last) \
91 if ((first) && (last)) { \
92 (first)->prev = (list); \
97 * @brief Convinience Macro to delete node from list
99 #define LISTDEL(list, node) \
101 if ((node)->prev) (node)->prev->next = (node)->next; \
102 if ((node)->next) (node)->next->prev = (node)->prev; \
103 if (!((node)->prev) && !((node)->next)) (list) = NULL; \
107 * @brief Convinience Macro to get list head
109 #define LISTHEAD(list, node) \
110 for ((node) = (list); (node)->prev; (node) = (node)->prev)
113 * @brief Convinience Macro to get list tail
115 #define LISTTAIL(list, node) \
116 for ((node) = (list); (node)->next; (node) = (node)->next)
118 typedef struct metadata_x {
121 struct metadata_x *prev;
122 struct metadata_x *next;
125 typedef struct privilege_x {
127 struct privilege_x *prev;
128 struct privilege_x *next;
131 typedef struct privileges_x {
132 struct privilege_x *privilege;
133 struct privileges_x *prev;
134 struct privileges_x *next;
137 typedef struct permission_x {
140 struct permission_x *prev;
141 struct permission_x *next;
144 typedef struct icon_x {
150 const char *resolution;
155 typedef struct image_x {
160 struct image_x *prev;
161 struct image_x *next;
164 typedef struct allowed_x {
167 struct allowed_x *prev;
168 struct allowed_x *next;
171 typedef struct request_x {
173 struct request_x *prev;
174 struct request_x *next;
177 typedef struct define_x {
179 struct allowed_x *allowed;
180 struct request_x *request;
181 struct define_x *prev;
182 struct define_x *next;
185 typedef struct datashare_x {
186 struct define_x *define;
187 struct request_x *request;
188 struct datashare_x *prev;
189 struct datashare_x *next;
192 typedef struct description_x {
196 struct description_x *prev;
197 struct description_x *next;
200 typedef struct registry_x {
203 struct registry_x *prev;
204 struct registry_x *next;
207 typedef struct database_x {
210 struct database_x *prev;
211 struct database_x *next;
214 typedef struct layout_x {
217 struct layout_x *prev;
218 struct layout_x *next;
221 typedef struct label_x {
225 struct label_x *prev;
226 struct label_x *next;
229 typedef struct author_x {
234 struct author_x *prev;
235 struct author_x *next;
238 typedef struct license_x {
241 struct license_x *prev;
242 struct license_x *next;
245 typedef struct operation_x {
248 struct operation_x *prev;
249 struct operation_x *next;
252 typedef struct uri_x {
259 typedef struct mime_x {
266 typedef struct subapp_x {
269 struct subapp_x *prev;
270 struct subapp_x *next;
273 typedef struct condition_x {
276 struct condition_x *prev;
277 struct condition_x *next;
280 typedef struct notification_x {
283 struct notification_x *prev;
284 struct notification_x *next;
287 typedef struct appsvc_x {
289 struct operation_x *operation;
292 struct subapp_x *subapp;
293 struct appsvc_x *prev;
294 struct appsvc_x *next;
297 typedef struct appcontrol_x {
299 struct operation_x *operation;
302 struct subapp_x *subapp;
303 struct appcontrol_x *prev;
304 struct appcontrol_x *next;
307 typedef struct category_x{
309 struct category_x *prev;
310 struct category_x *next;
313 typedef struct launchconditions_x {
315 struct condition_x *condition;
316 struct launchconditions_x *prev;
317 struct launchconditions_x *next;
318 } launchconditions_x;
320 typedef struct compatibility_x {
323 struct compatibility_x *prev;
324 struct compatibility_x *next;
327 typedef struct deviceprofile_x {
330 struct deviceprofile_x *prev;
331 struct deviceprofile_x *next;
334 typedef struct resolution_x {
335 const char *mimetype;
336 const char *urischeme;
337 struct resolution_x *prev;
338 struct resolution_x *next;
341 typedef struct capability_x {
342 const char *operationid;
344 struct resolution_x *resolution;
345 struct capability_x *prev;
346 struct capability_x *next;
349 typedef struct datacontrol_x {
350 const char *providerid;
351 struct capability_x *capability;
352 struct datacontrol_x *prev;
353 struct datacontrol_x *next;
356 typedef struct uiapplication_x {
359 const char *nodisplay;
360 const char *multiple;
361 const char *taskmanage;
364 const char *categories;
366 const char *hwacceleration;
369 const char *recentimage;
370 const char *launchcondition;
371 const char *indicatordisplay;
372 const char *portraitimg;
373 const char *landscapeimg;
374 const char *guestmode_visibility;
375 const char *app_component;
376 const char *permission_type;
377 const char *component_type;
380 const char *submode_mainid;
381 struct label_x *label;
383 struct image_x *image;
384 struct appsvc_x *appsvc;
385 struct appcontrol_x *appcontrol;
386 struct category_x *category;
387 struct metadata_x *metadata;
388 struct permission_x *permission;
389 struct launchconditions_x *launchconditions;
390 struct notification_x *notification;
391 struct datashare_x *datashare;
392 struct uiapplication_x *prev;
393 struct uiapplication_x *next;
396 typedef struct serviceapplication_x {
400 const char *autorestart;
404 const char *permission_type;
405 struct label_x *label;
407 struct appsvc_x *appsvc;
408 struct appcontrol_x *appcontrol;
409 struct category_x *category;
410 struct metadata_x *metadata;
411 struct permission_x *permission;
412 struct datacontrol_x *datacontrol;
413 struct launchconditions_x *launchconditions;
414 struct notification_x *notification;
415 struct datashare_x *datashare;
416 struct serviceapplication_x *prev;
417 struct serviceapplication_x *next;
418 } serviceapplication_x;
420 typedef struct daemon_x {
423 struct daemon_x *prev;
424 struct daemon_x *next;
427 typedef struct theme_x {
430 struct theme_x *prev;
431 struct theme_x *next;
434 typedef struct font_x {
441 typedef struct ime_x {
448 typedef struct manifest_x {
449 const char *package; /**< package name*/
450 const char *version; /**< package version*/
451 const char *installlocation; /**< package install location*/
452 const char *ns; /**<name space*/
453 const char *removable; /**< package removable flag*/
454 const char *preload; /**< package preload flag*/
455 const char *readonly; /**< package readonly flag*/
456 const char *update; /**< package update flag*/
457 const char *appsetting; /**< package app setting flag*/
458 const char *type; /**< package type*/
459 const char *package_size; /**< package size for external installation*/
460 const char *installed_time; /**< installed time after finishing of installation*/
461 const char *installed_storage; /**< package currently installed storage*/
462 const char *storeclient_id; /**< id of store client for installed package*/
463 const char *mainapp_id; /**< app id of main application*/
464 const char *package_url; /**< app id of main application*/
465 const char *root_path; /**< package root path*/
466 const char *csc_path; /**< package csc path*/
467 const char *nodisplay_setting; /**< package no display setting menu*/
468 struct icon_x *icon; /**< package icon*/
469 struct label_x *label; /**< package label*/
470 struct author_x *author; /**< package author*/
471 struct description_x *description; /**< package description*/
472 struct license_x *license; /**< package license*/
473 struct privileges_x *privileges; /**< package privileges*/
474 struct uiapplication_x *uiapplication; /**< package's ui application*/
475 struct serviceapplication_x *serviceapplication; /**< package's service application*/
476 struct daemon_x *daemon; /**< package daemon*/
477 struct theme_x *theme; /**< package theme*/
478 struct font_x *font; /**< package font*/
479 struct ime_x *ime; /**< package ime*/
480 struct compatibility_x *compatibility; /**< package compatibility*/
481 struct deviceprofile_x *deviceprofile; /**< package device profile*/
485 * @fn char *pkgmgr_parser_get_manifest_file(const char *pkgid)
486 * @brief This API gets the manifest file of the package.
488 * @par This API is for package-manager installer backends.
489 * @par Sync (or) Async : Synchronous API
491 * @param[in] pkgid pointer to package ID
492 * @return manifest file path on success, NULL on failure
494 * @post Free the manifest file pointer that is returned by API
496 static int get_manifest_file(const char *pkgid)
498 char *manifest = NULL;
499 manifest = pkgmgr_parser_get_manifest_file(pkgid);
500 if (manifest == NULL)
502 printf("Manifest File Path is %s\n", manifest);
508 char *pkgmgr_parser_get_manifest_file(const char *pkgid);
511 * @fn int pkgmgr_parser_parse_manifest_for_installation(const char *manifest, char *const tagv[])
512 * @brief This API parses the manifest file of the package after installation and stores the data in DB.
514 * @par This API is for package-manager installer backends.
515 * @par Sync (or) Async : Synchronous API
517 * @param[in] manifest pointer to package manifest file
518 * @param[in] tagv array of xml tags or NULL
519 * @return 0 if success, error code(<0) if fail
520 * @retval PMINFO_R_OK success
521 * @retval PMINFO_R_EINVAL invalid argument
522 * @retval PMINFO_R_ERROR internal error
526 static int parse_manifest_file_for_installation(const char *manifest)
529 ret = pkgmgr_parser_parse_manifest_for_installation(manifest, NULL);
536 int pkgmgr_parser_parse_manifest_for_installation(const char *manifest, char *const tagv[]);
539 * @fn int pkgmgr_parser_parse_manifest_for_upgrade(const char *manifest, char *const tagv[])
540 * @brief This API parses the manifest file of the package after upgrade and stores the data in DB.
542 * @par This API is for package-manager installer backends.
543 * @par Sync (or) Async : Synchronous API
545 * @param[in] manifest pointer to package manifest file
546 * @param[in] tagv array of xml tags or NULL
547 * @return 0 if success, error code(<0) if fail
548 * @retval PMINFO_R_OK success
549 * @retval PMINFO_R_EINVAL invalid argument
550 * @retval PMINFO_R_ERROR internal error
554 static int parse_manifest_file_for_upgrade(const char *manifest)
557 ret = pkgmgr_parser_parse_manifest_for_upgrade(manifest, NULL);
564 int pkgmgr_parser_parse_manifest_for_upgrade(const char *manifest, char *const tagv[]);
567 * @fn int pkgmgr_parser_parse_manifest_for_uninstallation(const char *manifest, char *const tagv[])
568 * @brief This API parses the manifest file of the package after uninstallation and deletes the data from DB.
570 * @par This API is for package-manager installer backends.
571 * @par Sync (or) Async : Synchronous API
573 * @param[in] manifest pointer to package manifest file
574 * @param[in] tagv array of xml tags or NULL
575 * @return 0 if success, error code(<0) if fail
576 * @retval PMINFO_R_OK success
577 * @retval PMINFO_R_EINVAL invalid argument
578 * @retval PMINFO_R_ERROR internal error
582 static int parse_manifest_file_for_uninstallation(const char *manifest)
585 ret = pkgmgr_parser_parse_manifest_for_uninstallation(manifest, NULL);
592 int pkgmgr_parser_parse_manifest_for_uninstallation(const char *manifest, char *const tagv[]);
595 * @fn int pkgmgr_parser_check_manifest_validation(const char *manifest)
596 * @brief This API validates the manifest file against the manifest schema.
598 * @par This API is for package-manager installer backends.
599 * @par Sync (or) Async : Synchronous API
601 * @param[in] manifest pointer to package manifest file
602 * @return 0 if success, error code(<0) if fail
603 * @retval PMINFO_R_OK success
604 * @retval PMINFO_R_EINVAL invalid argument
605 * @retval PMINFO_R_ERROR internal error
609 static int validate_manifest_file(const char *manifest)
612 ret = pkgmgr_parser_check_manifest_validation(manifest);
619 int pkgmgr_parser_check_manifest_validation(const char *manifest);
622 * @fn void pkgmgr_parser_free_manifest_xml(manifest_x *mfx)
623 * @brief This API will free the manifest pointer by recursively freeing all sub elements.
625 * @par This API is for package-manager installer backends.
626 * @par Sync (or) Async : Synchronous API
628 * @param[in] mfx pointer to parsed manifest data
629 * @pre pkgmgr_parser_process_manifest_xml()
632 static int parse_manifest_file(const char *manifest)
634 manifest_x *mfx = NULL
635 mfx = pkgmgr_parser_process_manifest_xml(manifest);
638 printf("Parsing Manifest Success\n");
639 pkgmgr_parser_free_manifest_xml(mfx);
644 void pkgmgr_parser_free_manifest_xml(manifest_x *mfx);
647 * @fn manifest_x *pkgmgr_parser_process_manifest_xml(const char *manifest)
648 * @brief This API parses the manifest file and stores all the data in the manifest structure.
650 * @par This API is for package-manager installer backends.
651 * @par Sync (or) Async : Synchronous API
653 * @param[in] manifest pointer to package manifest file
654 * @return manifest pointer on success, NULL on failure
656 * @post pkgmgr_parser_free_manifest_xml()
658 static int parse_manifest_file(const char *manifest)
660 manifest_x *mfx = NULL
661 mfx = pkgmgr_parser_process_manifest_xml(manifest);
664 printf("Parsing Manifest Success\n");
665 pkgmgr_parser_free_manifest_xml(mfx);
670 manifest_x *pkgmgr_parser_process_manifest_xml(const char *manifest);
673 * @fn manifest_x *pkgmgr_parser_get_manifest_info(const char *pkigid)
674 * @brief This API gets the manifest info from DB and stores all the data in the manifest structure.
676 * @par This API is for package-manager installer backends.
677 * @par Sync (or) Async : Synchronous API
679 * @param[in] pkgid package id for package
680 * @return manifest pointer on success, NULL on failure
682 * @post pkgmgr_parser_free_manifest_xml()
684 static int get_manifest_info(const char *pkgid)
686 manifest_x *mfx = NULL
687 mfx = pkgmgr_parser_get_manifest_info(pkgid);
690 printf("Parsing Manifest Success\n");
691 pkgmgr_parser_free_manifest_xml(mfx);
696 manifest_x *pkgmgr_parser_get_manifest_info(const char *pkigid);
698 /* These APIs are intended to call parser directly */
699 typedef int (*ps_iter_fn) (const char *tag, int type, void *userdata);
701 int pkgmgr_parser_has_parser(const char *tag, int *type);
702 int pkgmgr_parser_get_list(ps_iter_fn iter_fn, void *data);
705 * @fn int pkgmgr_parser_run_parser_for_installation(xmlDocPtr docPtr, const char *tag, const char *pkgid)
706 * @brief This API calls the parser directly by supplying the xml docptr. It is used during package installation
708 * @par This API is for package-manager installer backends.
709 * @par Sync (or) Async : Synchronous API
711 * @param[in] docPtr XML doxument pointer
712 * @param[in] tag the xml tag corresponding to the parser that will parse the docPtr
713 * @param[in] pkgid the package id
714 * @return 0 if success, error code(<0) if fail
715 * @retval PMINFO_R_OK success
716 * @retval PMINFO_R_EINVAL invalid argument
717 * @retval PMINFO_R_ERROR internal error
721 static int parse_docptr_for_installation(xmlDocPtr docPtr)
724 ret = pkgmgr_parser_run_parser_for_installation(docPtr, "theme", "com.samsung.test");
731 int pkgmgr_parser_run_parser_for_installation(xmlDocPtr docPtr, const char *tag, const char *pkgid);
734 * @fn int pkgmgr_parser_run_parser_for_upgrade(xmlDocPtr docPtr, const char *tag, const char *pkgid)
735 * @brief This API calls the parser directly by supplying the xml docptr. It is used during package upgrade
737 * @par This API is for package-manager installer backends.
738 * @par Sync (or) Async : Synchronous API
740 * @param[in] docPtr XML doxument pointer
741 * @param[in] tag the xml tag corresponding to the parser that will parse the docPtr
742 * @param[in] pkgid the package id
743 * @return 0 if success, error code(<0) if fail
744 * @retval PMINFO_R_OK success
745 * @retval PMINFO_R_EINVAL invalid argument
746 * @retval PMINFO_R_ERROR internal error
750 static int parse_docptr_for_upgrade(xmlDocPtr docPtr)
753 ret = pkgmgr_parser_run_parser_for_upgrade(docPtr, "theme", "com.samsung.test");
760 int pkgmgr_parser_run_parser_for_upgrade(xmlDocPtr docPtr, const char *tag, const char *pkgid);
763 * @fn int pkgmgr_parser_run_parser_for_uninstallation(xmlDocPtr docPtr, const char *tag, const char *pkgid)
764 * @brief This API calls the parser directly by supplying the xml docptr. It is used during package uninstallation
766 * @par This API is for package-manager installer backends.
767 * @par Sync (or) Async : Synchronous API
769 * @param[in] docPtr XML doxument pointer
770 * @param[in] tag the xml tag corresponding to the parser that will parse the docPtr
771 * @param[in] pkgid the package id
772 * @return 0 if success, error code(<0) if fail
773 * @retval PMINFO_R_OK success
774 * @retval PMINFO_R_EINVAL invalid argument
775 * @retval PMINFO_R_ERROR internal error
779 static int parse_docptr_for_uninstallation(xmlDocPtr docPtr)
782 ret = pkgmgr_parser_run_parser_for_uninstallation(docPtr, "theme", "com.samsung.test");
789 int pkgmgr_parser_run_parser_for_uninstallation(xmlDocPtr docPtr, const char *tag, const char *pkgid);
792 * @fn int pkgmgr_parser_run_post_for_installation(const char *pkgid, char *const tagv[])
793 * @brief This API is called by backend installer for post action. It is used during package installation
795 * @par This API is for package-manager installer backends.
796 * @par Sync (or) Async : Synchronous API
798 * @param[in] pkgid the package id
799 * @param[in] tagv array of tags or NULL
800 * @return 0 if success, error code(<0) if fail
801 * @retval PMINFO_R_OK success
802 * @retval PMINFO_R_EINVAL invalid argument
803 * @retval PMINFO_R_ERROR internal error
807 static int parse_post_for_installation(const char *pkgid)
810 ret = pkgmgr_parser_run_post_for_installation(pkgid, NULL);
817 int pkgmgr_parser_run_post_for_installation(const char *pkgid, char *const tagv[]);
820 * @fn int pkgmgr_parser_run_post_for_upgrade(const char *pkgid, char *const tagv[])
821 * @brief This API is called by backend installer for post action. It is used during package upgrade
823 * @par This API is for package-manager installer backends.
824 * @par Sync (or) Async : Synchronous API
826 * @param[in] pkgid the package id
827 * @param[in] tagv array of tags or NULL
828 * @return 0 if success, error code(<0) if fail
829 * @retval PMINFO_R_OK success
830 * @retval PMINFO_R_EINVAL invalid argument
831 * @retval PMINFO_R_ERROR internal error
835 static int parse_post_for_upgrade(const char *pkgid)
838 ret = pkgmgr_parser_run_post_for_upgrade(pkgid, NULL);
845 int pkgmgr_parser_run_post_for_upgrade(const char *pkgid, char *const tagv[]);
848 * @fn int pkgmgr_parser_run_post_for_uninstallation(const char *pkgid)
849 * @brief This API is called by backend installer for run post action. It is used during package uninstallation
851 * @par This API is for package-manager installer backends.
852 * @par Sync (or) Async : Synchronous API
854 * @param[in] pkgid the package id
855 * @return 0 if success, error code(<0) if fail
856 * @retval PMINFO_R_OK success
857 * @retval PMINFO_R_EINVAL invalid argument
858 * @retval PMINFO_R_ERROR internal error
862 static int parse_post_for_uninstallation(const char *pkgid)
865 ret = pkgmgr_parser_run_post_for_uninstallation(pkgid);
872 int pkgmgr_parser_run_post_for_uninstallation(const char *pkgid);
876 * @fn int pkgmgr_parser_create_desktop_file(manifest_x *mfx)
877 * @brief This API generates the application desktop file
879 * @par This API is for package-manager installer backends.
880 * @par Sync (or) Async : Synchronous API
882 * @param[in] mfx manifest pointer
883 * @return 0 if success, error code(<0) if fail
884 * @retval PMINFO_R_OK success
885 * @retval PMINFO_R_EINVAL invalid argument
886 * @retval PMINFO_R_ERROR internal error
887 * @pre pkgmgr_parser_process_manifest_xml()
888 * @post pkgmgr_parser_free_manifest_xml()
890 static int create_desktop_file(char *manifest)
893 manifest_x *mfx = NULL;
894 mfx = pkgmgr_parser_process_manifest_xml(manifest);
895 ret = pkgmgr_parser_create_desktop_file(mfx);
898 pkgmgr_parser_free_manifest_xml(mfx);
903 int pkgmgr_parser_create_desktop_file(manifest_x *mfx);
909 #endif /* __PKGMGR_PARSER_H__ */