From b2aaaf39eef7bcc2bfa000fbdb9f72e6d0f656c8 Mon Sep 17 00:00:00 2001 From: skeezix Date: Tue, 24 May 2011 11:10:13 -0400 Subject: [PATCH] Patch from Cloudef to add very basic support for 'package' PXML tags --- include/pnd_discovery.h | 1 + include/pnd_pxml.h | 3 +++ include/pnd_pxml_names.h | 3 ++- lib/pnd_discovery.c | 5 ++++- lib/pnd_pxml.c | 6 +++++- lib/pnd_tinyxml.cpp | 12 ++++++++++++ 6 files changed, 27 insertions(+), 3 deletions(-) diff --git a/include/pnd_discovery.h b/include/pnd_discovery.h index d59c87e..237ef62 100644 --- a/include/pnd_discovery.h +++ b/include/pnd_discovery.h @@ -57,6 +57,7 @@ typedef struct { unsigned char subapp_number; // # of app within PXML (ie: 0, 1, 2, 3, up to the number of apps within the PXML) unsigned int object_flags; // see PND_DISCO_ bitmasks above // strdup'd from PXML -- hey, who was the idiot who thought it was a reat idea not to just re-use the pxml-struct? + char *package_id; char *title_en; char *desc_en; char *unique_id; diff --git a/include/pnd_pxml.h b/include/pnd_pxml.h index bca88f4..15b3e96 100644 --- a/include/pnd_pxml.h +++ b/include/pnd_pxml.h @@ -43,6 +43,8 @@ signed char pnd_pxml_merge_override ( pnd_pxml_handle h, char *searchpath ); /* these accessor functions will return READ ONLY char*s; do not free them or modify them. */ + +char *pnd_pxml_get_package_id ( pnd_pxml_handle h ); char *pnd_pxml_get_app_name_en ( pnd_pxml_handle h ); char *pnd_pxml_get_app_name_de ( pnd_pxml_handle h ); char *pnd_pxml_get_app_name_it ( pnd_pxml_handle h ); @@ -162,6 +164,7 @@ typedef struct char *background; char *startdir; char *exec_no_x11; + char *package_id; char *package_name; char *package_release_date; char *mkdir_sp; // a colon separated list of paths to be mkdir'd (silently fail) when pnd is autodiscovered. path is always relative to the root of the hosting device. diff --git a/include/pnd_pxml_names.h b/include/pnd_pxml_names.h index 24c2294..f3ae64c 100644 --- a/include/pnd_pxml_names.h +++ b/include/pnd_pxml_names.h @@ -93,8 +93,9 @@ extern "C" { #define PND_PXML_ENAME_CLOCK "clockspeed" #define PND_PXML_ATTRNAME_CLOCKFREQ "frequency" -/* */ +/* */ #define PND_PXML_ENAME_PACKAGE "package" +#define PND_PXML_ATTRNAME_PACKAGE_ID "id" #define PND_PXML_ATTRNAME_PACKAGE_NAME "name" #define PND_PXML_ATTRNAME_PACKAGE_DATE "released" diff --git a/lib/pnd_discovery.c b/lib/pnd_discovery.c index e1fc0ef..7d89475 100644 --- a/lib/pnd_discovery.c +++ b/lib/pnd_discovery.c @@ -28,7 +28,7 @@ static pnd_box_handle disco_box; static char *disco_overrides = NULL; void pnd_disco_destroy ( pnd_disco_t *p ) { - + if ( p -> package_id ) { free ( p -> package_id); } if ( p -> title_en ) { free ( p -> title_en ); } if ( p -> unique_id ) { free ( p -> unique_id ); } if ( p -> appdata_dirname ) { free ( p -> appdata_dirname ); } @@ -224,6 +224,9 @@ static int pnd_disco_callback ( const char *fpath, const struct stat *sb, p -> object_type = valid; // PXML fields + if ( pnd_pxml_get_package_id ( pxmlh ) ) { + p -> package_id = strdup ( pnd_pxml_get_package_id ( pxmlh ) ); + } if ( pnd_pxml_get_app_name_en ( pxmlh ) ) { p -> title_en = strdup ( pnd_pxml_get_app_name_en ( pxmlh ) ); } diff --git a/lib/pnd_pxml.c b/lib/pnd_pxml.c index a6516ab..4b743d4 100644 --- a/lib/pnd_pxml.c +++ b/lib/pnd_pxml.c @@ -315,6 +315,11 @@ char *pnd_pxml_get_best_localized_string(pnd_localized_string_t strings[], int s return ( NULL ); } +char *pnd_pxml_get_package_id ( pnd_pxml_handle h ) { + pnd_pxml_t *p = (pnd_pxml_t*) h; + return ( p -> package_id ); +} + char *pnd_pxml_get_app_name ( pnd_pxml_handle h, char *iso_lang ) { pnd_pxml_t *p = (pnd_pxml_t *) h; return pnd_pxml_get_best_localized_string(p->titles, p->titles_c, iso_lang); @@ -335,7 +340,6 @@ char *pnd_pxml_get_app_name_it ( pnd_pxml_handle h ) { char *pnd_pxml_get_app_name_fr ( pnd_pxml_handle h ) { return pnd_pxml_get_app_name(h, "fr"); } - char *pnd_pxml_get_unique_id ( pnd_pxml_handle h ) { pnd_pxml_t *p = (pnd_pxml_t*) h; return ( p -> unique_id ); diff --git a/lib/pnd_tinyxml.cpp b/lib/pnd_tinyxml.cpp index 8e8319f..1d64af2 100644 --- a/lib/pnd_tinyxml.cpp +++ b/lib/pnd_tinyxml.cpp @@ -221,6 +221,15 @@ unsigned char pnd_pxml_parse ( const char *pFilename, char *buffer, unsigned int // is present in PXML line or not; if not, assume application mode? hRoot = TiXmlHandle(pElem); + // workaround for package ID's used by some package managers + // get the package ID and store it for each application + char* package_id = NULL; + pElem = hRoot.FirstChild ( PND_PXML_ENAME_PACKAGE ).Element(); + if ( pElem ) { + package_id = pnd_pxml_get_attribute ( pElem, PND_PXML_ATTRNAME_PACKAGE_ID ); + } + + // move to applications element then if ( hRoot.FirstChild(PND_PXML_APP).Element() != NULL ) { appwrappermode = 1; appElem = hRoot.FirstChild(PND_PXML_APP).Element(); @@ -243,6 +252,9 @@ unsigned char pnd_pxml_parse ( const char *pFilename, char *buffer, unsigned int } else { app -> subapp_number = 0; } + + // give application the package id, if there is one + app -> package_id = package_id; //Get unique ID first. if ( appwrappermode ) { -- 2.39.2