2 #include <stdio.h> /* for FILE etc */
4 #include <unistd.h> /* for unlink */
7 #include "pnd_container.h"
9 #include "pnd_discovery.h"
10 #include "pnd_pndfiles.h"
12 unsigned char pnd_emit_dotdesktop ( char *targetpath, char *pndrun, pnd_disco_t *p ) {
13 char filename [ FILENAME_MAX ];
18 // http://standards.freedesktop.org/desktop-entry-spec
22 if ( ! p -> unique_id ) {
40 sprintf ( filename, "%s/%s.desktop", targetpath, p -> unique_id );
44 //printf ( "EMIT DOTDESKTOP '%s'\n", filename );
46 f = fopen ( filename, "w" );
52 fprintf ( f, "%s\n", PND_DOTDESKTOP_HEADER );
54 if ( p -> title_en ) {
55 snprintf ( buffer, 1020, "Name=%s\n", p -> title_en );
56 fprintf ( f, "%s", buffer );
59 fprintf ( f, "Type=Application\n" );
60 fprintf ( f, "Version=1.0\n" );
63 snprintf ( buffer, 1020, "Icon=%s\n", p -> icon );
64 fprintf ( f, "%s", buffer );
68 if ( p -> description_en ) {
69 snprintf ( buffer, 1020, "Comment=%s\n", p -> description_en );
70 fprintf ( f, "%s", buffer );
74 #if 0 // we let pnd_run.sh handle this
75 if ( p -> startdir ) {
76 snprintf ( buffer, 1020, "Path=%s\n", p -> startdir );
77 fprintf ( f, "%s", buffer );
79 fprintf ( f, "Path=%s\n", PND_DEFAULT_WORKDIR );
86 if ( p -> object_type == pnd_object_type_directory ) {
87 snprintf ( buffer, 1020, "Exec=%s -p %s -e %s -n", pndrun, p -> object_path, p -> exec );
88 } else if ( p -> object_type == pnd_object_type_pnd ) {
89 snprintf ( buffer, 1020, "Exec=%s -p %s/%s -e %s -n", pndrun, p -> object_path, p -> object_filename, p -> exec );
93 if ( p -> startdir ) {
94 strncat ( buffer, " -s ", 1020 );
95 strncat ( buffer, p -> startdir, 1020 );
99 strncat ( buffer, "\n", 1020 );
102 fprintf ( f, "%s", buffer );
106 fprintf ( f, "%s\n", "Categories=Application;Network;" );
109 fprintf ( f, "%s\n", PND_DOTDESKTOP_SOURCE ); // should we need to know 'who' created the file during trimming
116 unsigned char pnd_emit_icon ( char *targetpath, pnd_disco_t *p ) {
117 char buffer [ FILENAME_MAX ]; // target filename
118 char from [ FILENAME_MAX ]; // source filename
119 char bits [ 8 * 1024 ];
123 // prelim .. if a pnd file, and no offset found, discovery code didn't locate icon.. so bail.
124 if ( ( p -> object_type == pnd_object_type_pnd ) &&
125 ( ! p -> pnd_icon_pos ) )
127 return ( 0 ); // discover code didn't find it, so FAIL
130 // determine filename for target
131 sprintf ( buffer, "%s/%s.png", targetpath, p -> unique_id ); // target
133 /* first.. open the source file, by type of application:
134 * are we looking through a pnd file or a dir?
136 if ( p -> object_type == pnd_object_type_directory ) {
137 sprintf ( from, "%s/%s", p -> object_path, p -> icon );
138 } else if ( p -> object_type == pnd_object_type_pnd ) {
139 sprintf ( from, "%s/%s", p -> object_path, p -> object_filename );
142 pnd = fopen ( from, "r" );
150 target = fopen ( buffer, "wb" );
157 fseek ( pnd, 0, SEEK_END );
159 //fseek ( pnd, 0, SEEK_SET );
161 fseek ( pnd, p -> pnd_icon_pos, SEEK_SET );
163 len -= p -> pnd_icon_pos;
167 if ( len > (8*1024) ) {
173 if ( fread ( bits, bitlen, 1, pnd ) != 1 ) {
180 if ( fwrite ( bits, bitlen, 1, target ) != 1 ) {