From: skeezix Date: Mon, 11 Mar 2013 21:18:08 +0000 (-0400) Subject: Quick change so back to single .desktop/info, no assoc .desktops, and no alternative... X-Git-Tag: sz_173~18 X-Git-Url: http://git.openpandora.org/cgi-bin/gitweb.cgi?p=pandora-libraries.git;a=commitdiff_plain;h=e0f2719a878776d63fb5a0993bb74e8c9b815bea Quick change so back to single .desktop/info, no assoc .desktops, and no alternative exec args --- diff --git a/apps/pndnotifyd.c b/apps/pndnotifyd.c index c488257..218608c 100644 --- a/apps/pndnotifyd.c +++ b/apps/pndnotifyd.c @@ -759,11 +759,6 @@ void process_discoveries ( pnd_box_handle applist, char *emitdesktoppath, char * } } - // file association requests - if ( ! pnd_emit_dotassoc ( info_dotdesktoppath, pndrun, d ) ) { - pnd_log ( pndn_rem, "ERROR: Error creating file association .desktop file for app: %s\n", pnd_box_get_key ( d ) ); - } - // does this object request any mkdir's? if ( d -> mkdir_sp ) { diff --git a/include/pnd_desktop.h b/include/pnd_desktop.h index 0729aaa..3de5627 100644 --- a/include/pnd_desktop.h +++ b/include/pnd_desktop.h @@ -24,14 +24,6 @@ pnd_disco_t *pnd_parse_dotdesktop ( char *ddpath, unsigned int flags ); // sets // extra fields to emit_dotdesktop()'s function and breaking apps, or annoying callers down the road unsigned char pnd_emit_dotinfo ( char *targetpath, char *pndrun, pnd_disco_t *p ); -// emit_dotassoc() will spit out a .desktop executable entry (more or less similar to the emit_dotdesktop above) -// however in this variation the executable line is set up for invokation of a file association instead of the -// normal executable line. -// - lame code is a copy from emit_dotdesktop() .. I really need to clean this up and paramterize a subfunction.. -// - this function will emit all file association .desktops (not just one of them) -unsigned char pnd_emit_dotassoc ( char *targetpath, char *pndrun, pnd_disco_t *p ); -unsigned char _pnd_emit_dotassoc ( char *targetpath, char *pndrun, pnd_disco_t *p, unsigned char i ); // will only emit the requested assoc 1, 2, 3 - // emit_icon() will attempt to copy the icon from a PXML directory, or from a pnd file if appended, // to the given directory; returns 1 on sucess, otherwise is a fail. unsigned char pnd_emit_icon ( char *targetpath, pnd_disco_t *p ); diff --git a/include/pnd_discovery.h b/include/pnd_discovery.h index b21bd89..2901010 100644 --- a/include/pnd_discovery.h +++ b/include/pnd_discovery.h @@ -93,16 +93,8 @@ typedef struct { // existing above, lets just copy from pxml and use a list of [123] members.. char *associationitem1_name; char *associationitem1_filetype; - char *associationitem1_command; - char *associationitem1_args; - char *associationitem2_name; - char *associationitem2_filetype; - char *associationitem2_command; - char *associationitem2_args; - char *associationitem3_name; - char *associationitem3_filetype; - char *associationitem3_command; - char *associationitem3_args; + char *exec_dashdash_args; + } pnd_disco_t; void pnd_disco_destroy ( pnd_disco_t *p ); // a function name that simply could not be avoided diff --git a/include/pnd_pxml.h b/include/pnd_pxml.h index d1c8862..432e218 100644 --- a/include/pnd_pxml.h +++ b/include/pnd_pxml.h @@ -70,6 +70,7 @@ char *pnd_pxml_get_version_build ( pnd_pxml_handle h ); char *pnd_pxml_get_exec ( pnd_pxml_handle h ); char *pnd_pxml_get_execargs ( pnd_pxml_handle h ); char *pnd_pxml_get_exec_option_no_x11 ( pnd_pxml_handle h ); +char *pnd_pxml_get_execdashdashargs ( pnd_pxml_handle h ); char *pnd_pxml_get_main_category ( pnd_pxml_handle h ); char *pnd_pxml_get_subcategory1 ( pnd_pxml_handle h ); char *pnd_pxml_get_subcategory2 ( pnd_pxml_handle h ); @@ -82,16 +83,10 @@ char *pnd_pxml_get_osversion_release ( pnd_pxml_handle h ); char *pnd_pxml_get_osversion_build ( pnd_pxml_handle h ); char *pnd_pxml_get_associationitem1_name ( pnd_pxml_handle h ); char *pnd_pxml_get_associationitem1_filetype ( pnd_pxml_handle h ); -char *pnd_pxml_get_associationitem1_command ( pnd_pxml_handle h ); -char *pnd_pxml_get_associationitem1_args ( pnd_pxml_handle h ); -char *pnd_pxml_get_associationitem2_name ( pnd_pxml_handle h ); -char *pnd_pxml_get_associationitem2_filetype ( pnd_pxml_handle h ); -char *pnd_pxml_get_associationitem2_command ( pnd_pxml_handle h ); -char *pnd_pxml_get_associationitem2_args ( pnd_pxml_handle h ); -char *pnd_pxml_get_associationitem3_name ( pnd_pxml_handle h ); -char *pnd_pxml_get_associationitem3_filetype ( pnd_pxml_handle h ); -char *pnd_pxml_get_associationitem3_command ( pnd_pxml_handle h ); -char *pnd_pxml_get_associationitem3_args ( pnd_pxml_handle h ); +char *pnd_pxml_get_associationitem2_name ( pnd_pxml_handle h ); // may not be used +char *pnd_pxml_get_associationitem2_filetype ( pnd_pxml_handle h ); // may not be used +char *pnd_pxml_get_associationitem3_name ( pnd_pxml_handle h ); // may not be used +char *pnd_pxml_get_associationitem3_filetype ( pnd_pxml_handle h ); // may not be used char *pnd_pxml_get_clockspeed ( pnd_pxml_handle h ); char *pnd_pxml_get_background ( pnd_pxml_handle h ); char *pnd_pxml_get_startdir ( pnd_pxml_handle h ); @@ -160,13 +155,13 @@ typedef struct char *osversion_build; char *associationitem1_name; char *associationitem1_filetype; - char *associationitem1_command; - char *associationitem2_name; - char *associationitem2_filetype; - char *associationitem2_command; - char *associationitem3_name; - char *associationitem3_filetype; - char *associationitem3_command; + char *_unused1; // was previously unused, but slotted for association stuff + char *associationitem2_name; // may not be used + char *associationitem2_filetype; // may not be used + char *_unused2; // was previously unused, but slotted for association stuff + char *associationitem3_name; // may not be used + char *associationitem3_filetype; // may not be used + char *_unused3; // was previously unused, but slotted for association stuff char *clockspeed; char *background; char *startdir; @@ -175,7 +170,6 @@ typedef struct 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. - char *info_name; // should be a struct.. char *info_filename; char *info_type; @@ -183,9 +177,7 @@ typedef struct char *package_version_minor; char *package_version_release; char *package_version_build; - char *associationitem1_args; // wish it could be above, but that would break existing ABI - char *associationitem2_args; // wish it could be above, but that would break existing ABI - char *associationitem3_args; // wish it could be above, but that would break existing ABI + char *exec_dashdash_args; } pnd_pxml_t; diff --git a/include/pnd_pxml_names.h b/include/pnd_pxml_names.h index e57fe8d..70668a4 100644 --- a/include/pnd_pxml_names.h +++ b/include/pnd_pxml_names.h @@ -34,6 +34,7 @@ extern "C" { #define PND_PXML_ATTRNAME_EXECARGS "arguments" #define PND_PXML_ATTRNAME_EXECWD "startdir" #define PND_PXML_ATTRNAME_EXECNOX11 "x11" +#define PND_PXML_ATTRNAME_DASHDASH "extraarguments" /* */ #define PND_PXML_ENAME_ICON "icon" diff --git a/lib/pnd_desktop.c b/lib/pnd_desktop.c index d6f48d3..3977f19 100644 --- a/lib/pnd_desktop.c +++ b/lib/pnd_desktop.c @@ -16,7 +16,7 @@ unsigned char pnd_emit_dotdesktop ( char *targetpath, char *pndrun, pnd_disco_t *p ) { char filename [ FILENAME_MAX ]; - char buffer [ 1024 ]; + char buffer [ 4096 ]; FILE *f; // specification @@ -131,6 +131,11 @@ unsigned char pnd_emit_dotdesktop ( char *targetpath, char *pndrun, pnd_disco_t } #endif + // association requests + if ( p -> associationitem1_filetype ) { + fprintf ( f, "MimeType=%s\n", p -> associationitem1_filetype ); + } + if ( p -> exec ) { char *nohup; @@ -157,7 +162,7 @@ unsigned char pnd_emit_dotdesktop ( char *targetpath, char *pndrun, pnd_disco_t strncat ( buffer, p -> startdir, 1020 ); } - // args + // args (regular args, for pnd_run.sh to handle) if ( p -> execargs ) { char argbuf [ 1024 ]; snprintf ( argbuf, 1000, " -a \"%s\"", p -> execargs ); @@ -175,6 +180,13 @@ unsigned char pnd_emit_dotdesktop ( char *targetpath, char *pndrun, pnd_disco_t strncat ( buffer, " -x ", 1020 ); } + // args (dashdash -- args, that the shell can screw with before pnd_run.sh gets them) + if ( p -> exec_dashdash_args ) { + char argbuf [ 4096 ]; + snprintf ( argbuf, 4096, " -- %s", p -> exec_dashdash_args ); + strncat ( buffer, argbuf, 4096 ); + } + // newline strncat ( buffer, "\n", 1020 ); @@ -390,214 +402,6 @@ unsigned char pnd_emit_dotinfo ( char *targetpath, char *pndrun, pnd_disco_t *p return ( 1 ); } -unsigned char pnd_emit_dotassoc ( char *targetpath, char *pndrun, pnd_disco_t *p ) { - - if ( p -> associationitem1_command ) { - if ( ! _pnd_emit_dotassoc ( targetpath, pndrun, p, 1 ) ) { - return ( 0 ); - } - } - - if ( p -> associationitem2_command ) { - if ( ! _pnd_emit_dotassoc ( targetpath, pndrun, p, 2 ) ) { - return ( 0 ); - } - } - - if ( p -> associationitem3_command ) { - if ( ! _pnd_emit_dotassoc ( targetpath, pndrun, p, 3 ) ) { - return ( 0 ); - } - } - - return ( 1 ); -} - -unsigned char _pnd_emit_dotassoc ( char *targetpath, char *pndrun, pnd_disco_t *p, unsigned char i ) { - char filename [ FILENAME_MAX ]; - char buffer [ 1024 ]; - FILE *f; - - char *command; - char *args; - char *filetype; - char *mimename; - - if ( i == 1 ) { - command = p -> associationitem1_command; - args = p -> associationitem1_args; - filetype = p -> associationitem1_filetype; - mimename = p -> associationitem1_name; - } else if ( i == 2 ) { - command = p -> associationitem2_command; - args = p -> associationitem2_args; - filetype = p -> associationitem2_filetype; - mimename = p -> associationitem2_name; - } else if ( i == 3 ) { - command = p -> associationitem3_command; - args = p -> associationitem3_args; - filetype = p -> associationitem3_filetype; - mimename = p -> associationitem3_name; - } else { - return ( 0 ); // w-t-f - } - - // specification - // http://standards.freedesktop.org/desktop-entry-spec - - // validation - - if ( ! p -> unique_id ) { - pnd_log ( PND_LOG_DEFAULT, "Can't emit dotdesktop for %s, missing unique-id\n", targetpath ); - return ( 0 ); - } - - if ( ! command ) { - pnd_log ( PND_LOG_DEFAULT, "Can't emit dotdesktop for %s, missing exec\n", targetpath ); - return ( 0 ); - } - - if ( ! filetype ) { - pnd_log ( PND_LOG_DEFAULT, "Can't emit dotdesktop for %s, missing MIME-type\n", targetpath ); - return ( 0 ); - } - - if ( ! targetpath ) { - pnd_log ( PND_LOG_DEFAULT, "Can't emit dotdesktop for %s, missing target path\n", targetpath ); - return ( 0 ); - } - - if ( ! pndrun ) { - pnd_log ( PND_LOG_DEFAULT, "Can't emit dotdesktop for %s, missing pnd_run.sh\n", targetpath ); - return ( 0 ); - } - - // set up - - sprintf ( filename, "%s/%s#%u#%u.desktop", targetpath, p -> unique_id, p -> subapp_number, i ); - - // emit - - //printf ( "EMIT DOTDESKTOP '%s'\n", filename ); - - f = fopen ( filename, "w" ); - - if ( ! f ) { - return ( 0 ); - } - - fprintf ( f, "%s\n", PND_DOTDESKTOP_HEADER ); - - fprintf ( f, "NoDisplay=false\n" ); // file association entries shouldn't live in the menus; but if 'true', xfce won't show this association in the dialog.. stupid! - - if ( p -> title_en ) { - snprintf ( buffer, 1020, "Name=%s\n", mimename ); - fprintf ( f, "%s", buffer ); - } - - fprintf ( f, "Type=Application\n" ); - fprintf ( f, "Version=1.0\n" ); - - if ( p -> icon ) { - snprintf ( buffer, 1020, "Icon=%s\n", p -> icon ); - fprintf ( f, "%s", buffer ); - } - - if ( p -> unique_id ) { - fprintf ( f, "X-Pandora-UID=%s\n", p -> unique_id ); - } - - if ( p -> clockspeed ) { - fprintf ( f, "X-Pandora-Clockspeed=%s\n", p -> clockspeed ); - } - - if ( p -> startdir ) { - fprintf ( f, "X-Pandora-Startdir=%s\n", p -> startdir ); - } - - if ( filetype ) { - pnd_log ( PND_LOG_DEFAULT, " EmitDesktopAssoc: Found file association request in PXML (%s) for mimetype (%s)\n", p -> title_en, filetype ); - fprintf ( f, "MimeType=%s\n", filetype ); - } - - if ( command ) { - char *nohup; - - if ( p -> option_no_x11 ) { - nohup = "/usr/bin/nohup "; - } else { - nohup = ""; - } - - // basics - if ( p -> object_type == pnd_object_type_directory ) { - snprintf ( buffer, 1020, "Exec=%s%s -p \"%s\" -e \"%s\" -b \"%s\"", - nohup, pndrun, p -> object_path, command, - p -> appdata_dirname ? p -> appdata_dirname : p -> unique_id ); - } else if ( p -> object_type == pnd_object_type_pnd ) { - snprintf ( buffer, 1020, "Exec=%s%s -p \"%s/%s\" -e \"%s\" -b \"%s\"", - nohup, pndrun, p -> object_path, p -> object_filename, command, - p -> appdata_dirname ? p -> appdata_dirname : p -> unique_id ); - } - - // start dir - if ( p -> startdir ) { - strncat ( buffer, " -s ", 1020 ); - strncat ( buffer, p -> startdir, 1020 ); - } - - // args (pxml args) - if ( p -> execargs ) { - char argbuf [ 1024 ]; - snprintf ( argbuf, 1000, " -a \"%s\"", p -> execargs ); - strncat ( buffer, argbuf, 1020 ); - } - - // clockspeed - if ( p -> clockspeed && atoi ( p -> clockspeed ) != 0 ) { - strncat ( buffer, " -c ", 1020 ); - strncat ( buffer, p -> clockspeed, 1020 ); - } - - // exec options - if ( pnd_pxml_get_x11 ( p -> option_no_x11 ) == pnd_pxml_x11_stop ) { - strncat ( buffer, " -x ", 1020 ); - } - - // args (mimetype args) - if ( args ) { - char argbuf [ 1024 ]; - snprintf ( argbuf, 1000, " -- %s", args ); - strncat ( buffer, argbuf, 1020 ); - } - - // newline - strncat ( buffer, "\n", 1020 ); - - // emit - fprintf ( f, "%s", buffer ); - - // and lets copy in some stuff in case it makes .desktop consumers life easier - if ( command ) { fprintf ( f, "X-Pandora-Exec=%s\n", command ); } - if ( args ) { fprintf ( f, "X-Pandora-ExecArgs=%s\n", args ); } - if ( p -> appdata_dirname ) { fprintf ( f, "X-Pandora-Appdata-Dirname=%s\n", p -> appdata_dirname ); } - if ( p -> object_flags & PND_DISCO_FLAG_OVR ) { fprintf ( f, "X-Pandora-Object-Flag-OVR=%s\n", "Yes" ); } - if ( p -> object_type == pnd_object_type_pnd ) { - fprintf ( f, "X-Pandora-Object-Path=%s\n", p -> object_path ); - fprintf ( f, "X-Pandora-Object-Filename=%s\n", p -> object_filename ); - } - - } - - fprintf ( f, "Categories=Other\n" ); // NoDisplay means can't confirm choice in xfce, so how do we hide this out of the way? - - fprintf ( f, "%s\n", PND_DOTDESKTOP_SOURCE ); // should we need to know 'who' created the file during trimming - - fclose ( f ); - - return ( 1 ); -} // dotassoc - unsigned char pnd_emit_icon ( char *targetpath, pnd_disco_t *p ) { //#define BITLEN (8*1024) #define BITLEN (64*1024) diff --git a/lib/pnd_discovery.c b/lib/pnd_discovery.c index 90baba0..2fd1882 100644 --- a/lib/pnd_discovery.c +++ b/lib/pnd_discovery.c @@ -63,16 +63,7 @@ void pnd_disco_destroy ( pnd_disco_t *p ) { if ( p -> package_version_build ) { free ( p -> package_version_build ); } if ( p -> associationitem1_name ) { free ( p -> associationitem1_name ); } if ( p -> associationitem1_filetype ) { free ( p -> associationitem1_filetype ); } - if ( p -> associationitem1_command ) { free ( p -> associationitem1_command ); } - if ( p -> associationitem1_args ) { free ( p -> associationitem1_args ); } - if ( p -> associationitem2_name ) { free ( p -> associationitem2_name ); } - if ( p -> associationitem2_filetype ) { free ( p -> associationitem2_filetype ); } - if ( p -> associationitem2_command ) { free ( p -> associationitem2_command ); } - if ( p -> associationitem2_args ) { free ( p -> associationitem2_args ); } - if ( p -> associationitem3_name ) { free ( p -> associationitem3_name ); } - if ( p -> associationitem3_filetype ) { free ( p -> associationitem3_filetype ); } - if ( p -> associationitem3_command ) { free ( p -> associationitem3_command ); } - if ( p -> associationitem3_args ) { free ( p -> associationitem3_args ); } + if ( p -> exec_dashdash_args ) { free ( p -> exec_dashdash_args ); } return; } @@ -353,23 +344,12 @@ static int pnd_disco_callback ( const char *fpath, const struct stat *sb, if ( pnd_pxml_get_associationitem1_name ( pxmlh ) ) { p -> associationitem1_name = strdup ( pnd_pxml_get_associationitem1_name ( pxmlh ) ); p -> associationitem1_filetype = strdup ( pnd_pxml_get_associationitem1_filetype ( pxmlh ) ); - p -> associationitem1_command = strdup ( pnd_pxml_get_associationitem1_command ( pxmlh ) ); - p -> associationitem1_args = strdup ( pnd_pxml_get_associationitem1_args ( pxmlh ) ); //pnd_log ( PND_LOG_DEFAULT, " Disco: Found file association request in PXML (%s)\n", p -> title_en ); } - if ( pnd_pxml_get_associationitem2_name ( pxmlh ) ) { - p -> associationitem2_name = strdup ( pnd_pxml_get_associationitem2_name ( pxmlh ) ); - p -> associationitem2_filetype = strdup ( pnd_pxml_get_associationitem2_filetype ( pxmlh ) ); - p -> associationitem2_command = strdup ( pnd_pxml_get_associationitem2_command ( pxmlh ) ); - p -> associationitem2_args = strdup ( pnd_pxml_get_associationitem2_args ( pxmlh ) ); - } - if ( pnd_pxml_get_associationitem3_name ( pxmlh ) ) { - p -> associationitem3_name = strdup ( pnd_pxml_get_associationitem3_name ( pxmlh ) ); - p -> associationitem3_filetype = strdup ( pnd_pxml_get_associationitem3_filetype ( pxmlh ) ); - p -> associationitem3_command = strdup ( pnd_pxml_get_associationitem3_command ( pxmlh ) ); - p -> associationitem3_args = strdup ( pnd_pxml_get_associationitem3_args ( pxmlh ) ); - } #endif + if ( pnd_pxml_get_execdashdashargs ( pxmlh ) ) { + p -> exec_dashdash_args = strdup ( pnd_pxml_get_execdashdashargs ( pxmlh ) ); + } // look for any PXML overrides, if requested if ( disco_overrides ) { diff --git a/lib/pnd_pxml.c b/lib/pnd_pxml.c index 52d5ceb..699f4c2 100644 --- a/lib/pnd_pxml.c +++ b/lib/pnd_pxml.c @@ -160,36 +160,18 @@ void pnd_pxml_delete ( pnd_pxml_handle h ) { if ( p -> associationitem1_filetype ) { free ( p -> associationitem1_filetype ); } - if ( p -> associationitem1_command ) { - free ( p -> associationitem1_command ); - } - if ( p -> associationitem1_args ) { - free ( p -> associationitem1_args ); - } if ( p -> associationitem2_name ) { free ( p -> associationitem2_name ); } if ( p -> associationitem2_filetype ) { free ( p -> associationitem2_filetype ); } - if ( p -> associationitem2_command ) { - free ( p -> associationitem2_command ); - } - if ( p -> associationitem2_args ) { - free ( p -> associationitem2_args ); - } if ( p -> associationitem3_name ) { free ( p -> associationitem3_name ); } if ( p -> associationitem1_filetype ) { free ( p -> associationitem3_filetype ); } - if ( p -> associationitem1_command ) { - free ( p -> associationitem3_command ); - } - if ( p -> associationitem1_args ) { - free ( p -> associationitem3_args ); - } if ( p -> clockspeed ) { free ( p -> clockspeed ); } @@ -232,6 +214,9 @@ void pnd_pxml_delete ( pnd_pxml_handle h ) { if ( p -> package_version_build ) { free ( p -> package_version_build ); } + if ( p -> exec_dashdash_args ) { + free ( p -> exec_dashdash_args ); + } free(p); /*very important!*/ @@ -498,6 +483,11 @@ char *pnd_pxml_get_exec_option_no_x11 ( pnd_pxml_handle h ) { return ( p -> exec_no_x11 ); } +char *pnd_pxml_get_execdashdashargs ( pnd_pxml_handle h ) { + pnd_pxml_t *p = (pnd_pxml_t*) h; + return ( p -> exec_dashdash_args ); +} + char *pnd_pxml_get_main_category ( pnd_pxml_handle h ) { pnd_pxml_t *p = (pnd_pxml_t*) h; return ( p -> main_category ); @@ -558,16 +548,6 @@ char *pnd_pxml_get_associationitem1_filetype ( pnd_pxml_handle h ) { return ( p -> associationitem1_filetype ); } -char *pnd_pxml_get_associationitem1_command ( pnd_pxml_handle h ) { - pnd_pxml_t *p = (pnd_pxml_t*) h; - return ( p -> associationitem1_command ); -} - -char *pnd_pxml_get_associationitem1_args ( pnd_pxml_handle h ) { - pnd_pxml_t *p = (pnd_pxml_t*) h; - return ( p -> associationitem1_args ); -} - char *pnd_pxml_get_associationitem2_name ( pnd_pxml_handle h ) { pnd_pxml_t *p = (pnd_pxml_t*) h; return ( p -> associationitem2_name ); @@ -578,16 +558,6 @@ char *pnd_pxml_get_associationitem2_filetype ( pnd_pxml_handle h ) { return ( p -> associationitem2_filetype ); } -char *pnd_pxml_get_associationitem2_command ( pnd_pxml_handle h ) { - pnd_pxml_t *p = (pnd_pxml_t*) h; - return ( p -> associationitem2_command ); -} - -char *pnd_pxml_get_associationitem2_args ( pnd_pxml_handle h ) { - pnd_pxml_t *p = (pnd_pxml_t*) h; - return ( p -> associationitem2_args ); -} - char *pnd_pxml_get_associationitem3_name ( pnd_pxml_handle h ) { pnd_pxml_t *p = (pnd_pxml_t*) h; return ( p -> associationitem3_name ); @@ -598,16 +568,6 @@ char *pnd_pxml_get_associationitem3_filetype ( pnd_pxml_handle h ) { return ( p -> associationitem3_filetype ); } -char *pnd_pxml_get_associationitem3_command ( pnd_pxml_handle h ) { - pnd_pxml_t *p = (pnd_pxml_t*) h; - return ( p -> associationitem3_command ); -} - -char *pnd_pxml_get_associationitem3_args ( pnd_pxml_handle h ) { - pnd_pxml_t *p = (pnd_pxml_t*) h; - return ( p -> associationitem3_args ); -} - char *pnd_pxml_get_clockspeed ( pnd_pxml_handle h ) { pnd_pxml_t *p = (pnd_pxml_t*) h; return ( p -> clockspeed ); diff --git a/lib/pnd_tinyxml.cpp b/lib/pnd_tinyxml.cpp index 641769b..bccffab 100644 --- a/lib/pnd_tinyxml.cpp +++ b/lib/pnd_tinyxml.cpp @@ -301,8 +301,9 @@ unsigned char pnd_pxml_parse ( const char *pFilename, char *buffer, unsigned int app->standalone = pnd_pxml_get_attribute(pElem, PND_PXML_ATTRNAME_EXECSTAL); app->exec = pnd_pxml_get_attribute(pElem, PND_PXML_ATTRNAME_EXECCMD); app->startdir = pnd_pxml_get_attribute(pElem, PND_PXML_ATTRNAME_EXECWD); - app->exec_no_x11 = pnd_pxml_get_attribute(pElem, PND_PXML_ATTRNAME_EXECNOX11); + app->exec_no_x11 = pnd_pxml_get_attribute(pElem, PND_PXML_ATTRNAME_EXECNOX11); app->execargs = pnd_pxml_get_attribute(pElem, PND_PXML_ATTRNAME_EXECARGS); + app->exec_dashdash_args = pnd_pxml_get_attribute(pElem, PND_PXML_ATTRNAME_DASHDASH); } //The app icon: @@ -417,59 +418,42 @@ unsigned char pnd_pxml_parse ( const char *pFilename, char *buffer, unsigned int { i = 0; - //Go through all associations. i serves as index; since the format only supports 3 associations we need to keep track of the number. - for (pElem = pElem->FirstChildElement(PND_PXML_ENAME_ASSOC); pElem && i < 3; + for (pElem = pElem->FirstChildElement(PND_PXML_ENAME_ASSOC); pElem && i < 50; pElem = pElem->NextSiblingElement(PND_PXML_ENAME_ASSOC), i++) { char *name = pnd_pxml_get_attribute(pElem, PND_PXML_ATTRNAME_ASSOCNAME); char *filetype = pnd_pxml_get_attribute(pElem, PND_PXML_ATTRNAME_ASSOCFTYPE); - char *command = pnd_pxml_get_attribute(pElem, PND_PXML_ATTRNAME_ASSOCCMD); - char *args = pnd_pxml_get_attribute(pElem, PND_PXML_ATTRNAME_ASSOCARGS); + unsigned int maxlen; - if ( ! ( name && filetype && command ) ) { + if ( ! ( name && filetype ) ) { if ( name ) free(name); if ( filetype ) free(filetype); - if ( command ) free(command); - if ( args ) free(args); continue; } - switch ( i ) { //TODO: same problem here: only 3 associations supported - case 0: { - app->associationitem1_name = strdup ( name ); - app->associationitem1_filetype = strdup ( filetype ); - app->associationitem1_command = strdup ( command ); - if ( args ) { - app->associationitem1_args = strdup ( args ); - } - //pnd_log ( PND_LOG_DEFAULT, (char*)" Found file association request in PXML (%d-0)\n", i ); - break; - } - case 1: { - app->associationitem2_name = strdup ( name ); - app->associationitem2_filetype = strdup ( filetype ); - app->associationitem2_command = strdup ( command ); - if ( args ) { - app->associationitem2_args = strdup ( args ); - } - //pnd_log ( PND_LOG_DEFAULT, (char*)" Found file association request in PXML (%d-1)\n", i ); - break; - } - case 2: { - app->associationitem3_name = strdup ( name ); - app->associationitem3_filetype = strdup ( filetype ); - app->associationitem3_command = strdup ( command ); - if ( args ) { - app->associationitem3_args = strdup ( args ); - } - //pnd_log ( PND_LOG_DEFAULT, (char*)" Found file association request in PXML (%d-2)\n", i ); - } // case - } // switch + if ( app -> associationitem1_name == NULL ) { + // first hit, just dupe + app -> associationitem1_name = strdup ( name ); + app -> associationitem1_filetype = strdup ( filetype ); + pnd_log ( PND_LOG_DEFAULT, (char*)" File assoc initial: %s -> %s\n", name, filetype ); + } else { + // grow-append buffer + + maxlen = strlen ( app -> associationitem1_name ) + strlen ( name ) + 3; + app -> associationitem1_name = (char*) realloc ( app -> associationitem1_name, maxlen ); + strncat ( app -> associationitem1_name, "; ", maxlen ); + strncat ( app -> associationitem1_name, name, maxlen ); + + maxlen = strlen ( app -> associationitem1_filetype ) + strlen ( filetype ) + 3; + app -> associationitem1_filetype = (char*) realloc ( app -> associationitem1_filetype, maxlen ); + strncat ( app -> associationitem1_filetype, "; ", maxlen ); + strncat ( app -> associationitem1_filetype, filetype, maxlen ); + + pnd_log ( PND_LOG_DEFAULT, (char*)" File assoc growpend: %s -> %s\n", name, filetype ); + } if ( name ) free(name); if ( filetype ) free(filetype); - if ( command ) free(command); - if ( args ) free(args); } // for } // assoc