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