1 /************************************************************************/
2 /*									*/
3 /*  Application: manage resources and settings.				*/
4 /*									*/
5 /************************************************************************/
6 
7 #   include	"appFrameConfig.h"
8 
9 #   include	<stddef.h>
10 #   include	<stdlib.h>
11 #   include	<stdio.h>
12 #   include	<string.h>
13 
14 #   include	<appSystem.h>
15 #   include	<utilTree.h>
16 #   include	<utilProperties.h>
17 #   include	<utilMemoryBufferPrintf.h>
18 
19 #   include	"appFrame.h"
20 
21 #   include	<appDebugon.h>
22 
23 /************************************************************************/
24 
appMakeSystemProperties(EditApplication * ea)25 static int appMakeSystemProperties(	EditApplication *	ea )
26     {
27     if  ( ! ea->eaSystemProperties )
28 	{
29 	const int	ownKeys= 1;
30 
31 	ea->eaSystemProperties= utilTreeMakeTree( ownKeys );
32 	if  ( ! ea->eaSystemProperties )
33 	    { XDEB(ea->eaSystemProperties); return -1;	}
34 	}
35 
36     return 0;
37     }
38 
appMakeUserProperties(EditApplication * ea)39 static int appMakeUserProperties(	EditApplication *	ea )
40     {
41     if  ( ! ea->eaUserProperties )
42 	{
43 	const int	ownKeys= 1;
44 
45 	ea->eaUserProperties= utilTreeMakeTree( ownKeys );
46 	if  ( ! ea->eaUserProperties )
47 	    { XDEB(ea->eaUserProperties); return -1;	}
48 	}
49 
50     return 0;
51     }
52 
53 /************************************************************************/
54 /*									*/
55 /*  Read properties from file.						*/
56 /*									*/
57 /************************************************************************/
58 
appReadProperties(void * properties,const MemoryBuffer * dir,const MemoryBuffer * relative)59 static int appReadProperties(	void *			properties,
60 				const MemoryBuffer *	dir,
61 				const MemoryBuffer *	relative )
62     {
63     int			rval= 0;
64 
65     const int		relativeIsFile= 0;
66 
67     MemoryBuffer	absolute;
68 
69     utilInitMemoryBuffer( &absolute );
70 
71     if  ( appAbsoluteName( &absolute, relative, relativeIsFile, dir ) < 0 )
72 	{ LDEB(1); rval= -1; goto ready; }
73 
74     if  ( appTestFileExists( &absolute ) )
75 	{ goto ready;	}
76 
77     if  ( utilPropertiesReadFile( properties, &absolute ) )
78 	{ LDEB(1); rval= -1; goto ready;	}
79 
80   ready:
81 
82     utilCleanMemoryBuffer( &absolute );
83 
84     return rval;
85     }
86 
87 /************************************************************************/
88 /*									*/
89 /*  Read user properties from file.					*/
90 /*									*/
91 /************************************************************************/
92 
appReadUserProperties(EditApplication * ea)93 int appReadUserProperties(	EditApplication *	ea )
94     {
95     int			rval= 0;
96 
97     MemoryBuffer	homeDirectory;
98     MemoryBuffer	relative;
99 
100     utilInitMemoryBuffer( &homeDirectory );
101     utilInitMemoryBuffer( &relative );
102 
103     if  ( appMakeUserProperties( ea ) )
104 	{ XDEB(ea->eaUserProperties); rval= -1; goto ready;	}
105 
106     if  ( utilMemoryBufferPrintf( &relative, ".%s.properties",
107 						ea->eaApplicationName ) < 1 )
108 	{ rval= -1; goto ready;	}
109 
110     if  ( appHomeDirectory( &homeDirectory ) < 0 )
111 	{ LDEB(1); rval= -1; goto ready;	}
112 
113     if  ( appReadProperties( ea->eaUserProperties, &homeDirectory, &relative ) )
114 	{ LDEB(1); rval= -1; goto ready;	}
115 
116   ready:
117 
118     utilCleanMemoryBuffer( &homeDirectory );
119     utilCleanMemoryBuffer( &relative );
120 
121     return rval;
122     }
123 
124 /************************************************************************/
125 /*									*/
126 /*  Read system properties from file.					*/
127 /*									*/
128 /************************************************************************/
129 
appReadSystemProperties(EditApplication * ea)130 int appReadSystemProperties(	EditApplication *	ea )
131     {
132     int			rval= 0;
133 
134     const int		relativeIsFile= 0;
135 
136     MemoryBuffer	pkgDirectory;
137     MemoryBuffer	appRelative;
138     MemoryBuffer	appDirectory;
139     MemoryBuffer	relative;
140 
141     utilInitMemoryBuffer( &pkgDirectory );
142     utilInitMemoryBuffer( &appRelative );
143     utilInitMemoryBuffer( &appDirectory );
144     utilInitMemoryBuffer( &relative );
145 
146     if  ( appMakeSystemProperties( ea ) )
147 	{ XDEB(ea->eaSystemProperties); rval= -1; goto ready;	}
148 
149     if  ( utilMemoryBufferSetString( &pkgDirectory, PKGDIR ) )
150 	{ rval= -1; goto ready;	}
151     if  ( utilMemoryBufferSetString( &appRelative, ea->eaApplicationName ) )
152 	{ rval= -1; goto ready;	}
153 
154     if  ( appAbsoluteName( &appDirectory, &appRelative,
155 					relativeIsFile, &pkgDirectory ) < 0 )
156 	{ SSDEB(ea->eaApplicationName,PKGDIR); rval= -1; goto ready; }
157 
158     if  ( utilMemoryBufferPrintf( &relative, "%s.properties",
159 						ea->eaApplicationName ) < 1 )
160 	{ rval= -1; goto ready;	}
161 
162     if  ( appReadProperties( ea->eaSystemProperties,
163 					    &appDirectory, &relative ) )
164 	{ LDEB(1); rval= -1; goto ready;	}
165 
166     if  ( ea->eaLocaleName )
167 	{
168 	char *	uscore= strchr( ea->eaLocaleName, '_' );
169 
170 	if  ( uscore )
171 	    {
172 	    if  ( utilMemoryBufferPrintf( &relative, "%s-%.*s.properties",
173 					    ea->eaApplicationName,
174 					    (int)( uscore- ea->eaLocaleName ),
175 					    ea->eaLocaleName ) < 1 )
176 		{ rval= -1; goto ready;	}
177 
178 	    if  ( appReadProperties( ea->eaSystemProperties,
179 					    &appDirectory, &relative ) )
180 		{ LDEB(1); rval= -1; goto ready;	}
181 	    }
182 
183 	if  ( utilMemoryBufferPrintf( &relative, "%s-%s.properties",
184 					    ea->eaApplicationName,
185 					    ea->eaLocaleName ) < 1 )
186 	    { rval= -1; goto ready;	}
187 
188 	if  ( appReadProperties( ea->eaSystemProperties,
189 					    &appDirectory, &relative ) )
190 	    { LDEB(1); rval= -1; goto ready;	}
191 	}
192 
193   ready:
194 
195     utilCleanMemoryBuffer( &pkgDirectory );
196     utilCleanMemoryBuffer( &appRelative );
197     utilCleanMemoryBuffer( &appDirectory );
198     utilCleanMemoryBuffer( &relative );
199 
200     return rval;
201     }
202 
203 /************************************************************************/
204 /*									*/
205 /*  Adapt default value of resources to values from the settings.	*/
206 /*									*/
207 /*  1)  Tolerate a '*' between the application name and the name of the	*/
208 /*	property to make it possible to reuse X11 resource files. Give	*/
209 /*	the more specific variant with a dot priority.			*/
210 /*  2)  First try system properties, then user properties to give the	*/
211 /*	user properties priority.					*/
212 /*									*/
213 /************************************************************************/
214 
appSetResourceDefault(EditApplication * ea,void * tree,char * scratch,AppConfigurableResource * acr)215 static void appSetResourceDefault(
216 				EditApplication *		ea,
217 				void *				tree,
218 				char *				scratch,
219 				AppConfigurableResource *	acr )
220     {
221     const char *	key;
222     void *		value;
223 
224     /*  1  */
225     sprintf( scratch, "%s*%s", ea->eaApplicationName, acr->acrResourceName );
226     value= utilTreeGetEQ( tree, &key, scratch );
227     if  ( value )
228 	{ acr->acrDefaultValue= (char *)value;	}
229 
230     sprintf( scratch, "%s.%s", ea->eaApplicationName, acr->acrResourceName );
231     value= utilTreeGetEQ( tree, &key, scratch );
232     if  ( value )
233 	{ acr->acrDefaultValue= (char *)value;	}
234 
235     return;
236     }
237 
appSetResourceDefaults(EditApplication * ea,AppConfigurableResource * acr,int acrCount)238 void appSetResourceDefaults(	EditApplication *		ea,
239 				AppConfigurableResource *	acr,
240 				int				acrCount )
241     {
242     int			i;
243     int			maxLen= 0;
244     char *		scratch= (char *)0;
245 
246     for ( i= 0; i < acrCount; i++ )
247 	{
248 	int	l= strlen( acr[i].acrResourceName );
249 
250 	if  ( maxLen < l )
251 	    { maxLen=  l;	}
252 	}
253 
254     maxLen= strlen( ea->eaApplicationName )+ 1+ maxLen+ 1;
255     scratch= malloc( maxLen );
256     if  ( ! scratch )
257 	{ LXDEB(maxLen,scratch); return;	}
258 
259     for ( i= 0; i < acrCount; i++ )
260 	{
261 	/*  2  */
262 	if  ( ea->eaSystemProperties )
263 	    {
264 	    appSetResourceDefault( ea, ea->eaSystemProperties,
265 							scratch, acr+ i );
266 	    }
267 
268 	if  ( ea->eaUserProperties )
269 	    {
270 	    appSetResourceDefault( ea, ea->eaUserProperties,
271 							scratch, acr+ i );
272 	    }
273 	}
274 
275     if  ( scratch )
276 	{ free( scratch );	}
277 
278     return;
279     }
280 
appSetProperty(EditApplication * ea,void * properties,const char * name,const char * value)281 static int appSetProperty(		EditApplication *	ea,
282 					void *			properties,
283 					const char *		name,
284 					const char *		value )
285     {
286     int			rval= 0;
287     int			maxLen;
288     char *		scratch= (char *)0;
289 
290     char *		savedValue= (char *)0;
291     void *		prevValue= (char *)0;
292 
293     maxLen= strlen( ea->eaApplicationName )+ 1+ strlen( name )+ 1;
294     scratch= malloc( maxLen );
295     if  ( ! scratch )
296 	{ LXDEB(maxLen,scratch); rval= -1; goto ready;	}
297 
298     sprintf( scratch, "%s.%s", ea->eaApplicationName, name );
299 
300     /*  8  */
301     savedValue= strdup( (char *)value );
302     if  ( ! savedValue )
303 	{ XDEB(savedValue); rval= -1; goto ready;	}
304 
305     if  ( utilTreeStoreValue( properties, &prevValue, (const char **)0,
306 						    scratch, savedValue ) )
307 	{
308 	free( savedValue );
309 	SSDEB(scratch,value); rval= -1; goto ready;
310 	}
311 
312     if  ( prevValue )
313 	{ free( prevValue );	}
314 
315   ready:
316 
317     if  ( scratch )
318 	{ free( scratch );	}
319 
320     return rval;
321     }
322 
appSetUserProperty(EditApplication * ea,const char * name,const char * value)323 int appSetUserProperty(		EditApplication *	ea,
324 				const char *		name,
325 				const char *		value )
326     {
327     if  ( appMakeUserProperties( ea ) )
328 	{ XDEB(ea->eaUserProperties); return -1;	}
329 
330     return appSetProperty( ea, ea->eaUserProperties, name, value );
331     }
332 
appSetSystemProperty(EditApplication * ea,const char * name,const char * value)333 int appSetSystemProperty(	EditApplication *	ea,
334 				const char *		name,
335 				const char *		value )
336     {
337     if  ( appMakeSystemProperties( ea ) )
338 	{ XDEB(ea->eaSystemProperties); return -1;	}
339 
340     return appSetProperty( ea, ea->eaSystemProperties, name, value );
341     }
342 
343