Adaptive Framework  0.9.0
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
afw_application.c
Go to the documentation of this file.
1 // See the 'COPYING' file in the project root for licensing information.
2 /*
3  * Adaptive Framework Application
4  *
5  * Copyright (c) 2010-2023 Clemson University
6  *
7  */
8 
14 #include "afw_internal.h"
15 
16 
17 static afw_utf8_t
18 impl_s_a_onApplicationStartupComplete_source_location =
19  AFW_UTF8_LITERAL("Application/onApplicationStartupComplete");
20 
21 
22 /* Conf object callback. */
23 static afw_boolean_t
24 impl_conf_object_cb(
25  const afw_object_t *object,
26  void *context,
27  afw_xctx_t *xctx)
28 {
29  if (object) {
30  object = afw_object_view_create(object, NULL,
31  &afw_object_options_composite_normalize_defaults_required,
32  object->p, xctx);
33  object = afw_object_create_clone(object, object->p, xctx);
34  }
35 
36  *((const afw_object_t * *)context) = object;
37 
38  /* Return indicating not to short circuit */
39  return false;
40 }
41 
42 
43 /*
44  * Note: Make sure to update
45  * afw_application_internal_register_basic_application_context_type()
46  * with parallel changes to this function.
47  */
48 static const afw_value_t *
49 impl_current_get_variable_cb(
51  const afw_utf8_t *name,
52  afw_xctx_t *xctx)
53 {
54  const afw_value_t *result;
55  afw_integer_t pid;
56 
57  result = NULL;
58  if (afw_utf8_equal(name, &afw_s_mode)) {
59  result = xctx->mode;
60  }
61  else if (afw_utf8_equal(name, &afw_s_pid)) {
62  pid = afw_os_get_pid();
63  result = afw_value_create_integer(pid, xctx->p, xctx);
64  }
65  else if (afw_utf8_equal(name, &afw_s_xctxUUID)) {
66  result = afw_value_create_string(xctx->uuid, xctx->p, xctx);
67  }
68  else if (afw_utf8_equal(name, &afw_s_programName)) {
69  result = afw_value_create_string(
70  &xctx->env->program_name, xctx->p, xctx);
71  }
72 
73  return result;
74 }
75 
76 
77 
78 void
80 {
81  const afw_environment_t *env = xctx->env;
82 
83  /* Push current:: qualifier. */
84  afw_xctx_push_qualifier(&afw_s_current, NULL, true,
85  impl_current_get_variable_cb, NULL, xctx->p, xctx);
86 
87  /* If there is an application qualifier, push application qualifier. */
88  if (env->application_object) {
89  afw_xctx_push_qualifier_object(&afw_s_application,
90  env->application_object, true, xctx->p, xctx);
91  }
92 
93  /* If there are qualified application variables, push qualifiers. */
96  true, xctx->p, xctx);
97  }
98 }
99 
100 
101 
102 /*
103  * Set basic application context type
104  *
105  * Note: Make sure to update impl_current_get_variable_cb()
106  * with parallel changes to this function.
107  */
108 void
110  afw_xctx_t *xctx)
111 {
112  const afw_object_t *context_type_object;
113  const afw_object_t *variable_definitions;
114 
115  context_type_object = afw_context_type_create(
116  &afw_s_application, xctx->env->p, xctx);
117 
118  variable_definitions =
120  context_type_object, &afw_s_current, xctx);
121 
122  afw_context_variable_definition_add_z(variable_definitions,
123  &afw_s_mode, &afw_s_runtime,
125  "Authorization Mode",
126  "The current authorization mode.",
127  NULL, NULL,
128  xctx);
129 
130  afw_context_variable_definition_add_z(variable_definitions,
131  &afw_s_pid, &afw_s_runtime,
133  "Pid",
134  "The current processor id.",
135  NULL, NULL,
136  xctx);
137 
138  afw_context_variable_definition_add_z(variable_definitions,
139  &afw_s_programName, &afw_s_runtime,
141  "Program Name",
142  "The current program name.",
143  NULL, NULL,
144  xctx);
145 
146  afw_context_variable_definition_add_z(variable_definitions,
147  &afw_s_xctxUUID, &afw_s_runtime,
149  "XCTX UUID",
150  "The execution context (xctx) UUID which can normally be considered the UUID of the current request.",
151  NULL, NULL,
152  xctx);
153 
154  afw_environment_register_context_type(&afw_s_application,
155  context_type_object, xctx);
156 }
157 
158 
159 
160 void
162  const afw_utf8_t *type,
163  const afw_object_t *entry,
164  const afw_utf8_t *source_location,
165  const afw_pool_t *p, afw_xctx_t *xctx)
166 {
167  afw_environment_t *env = (afw_environment_t *)xctx->env;
168  const afw_utf8_t *application_id;
169  const afw_utf8_t *conf_adaptor_id;
170  const afw_adaptor_session_t *session;
171  const afw_iterator_t *iterator;
172  const afw_value_t *value;
173  const afw_value_t *entry_value;
174  const afw_utf8_t *property_name;
175  const afw_object_t *properties;
176  const afw_adaptor_t *layout_adaptor;
177  const afw_object_t *context_type_object;
178  const afw_object_t *variable_definitions_object;
179  const afw_list_t *default_flags;
180  const afw_utf8_t * const *extension_id;
181  const afw_utf8_t * const *module_path;
182  const afw_utf8_t *detail_source_location;
183  const afw_object_t *object;
184  const afw_utf8_t *s;
185  afw_boolean_t error;
186 
187  /* Only one application conf allowed. */
188  if (env->application_object) {
189  AFW_THROW_ERROR_FZ(general, xctx,
191  "type=application conf entry already specified.",
192  AFW_UTF8_FMT_ARG(source_location));
193  }
194 
195  /* Log application starting. */
196  AFW_LOG_Z(info, "Application starting.", xctx);
197 
198  /* Get optional confAdaptorId. */
199  conf_adaptor_id = afw_object_old_get_property_as_utf8(
200  entry, &afw_s_confAdaptorId, p, xctx);
201 
202  /* Get conf adaptor. It will not ever be released. */
203  if (conf_adaptor_id) {
204  AFW_LOG_FZ(debug, xctx,
205  "Application specified confAdaptorId %" AFW_UTF8_FMT
206  ".",
207  AFW_UTF8_FMT_ARG(conf_adaptor_id));
208  env->conf_adaptor = afw_adaptor_get_reference(conf_adaptor_id, xctx);
210  &afw_s__AdaptiveServiceConf_, true, true, xctx);
212  &afw_s__AdaptiveConf_application, true, true, xctx);
214  &afw_s__AdaptiveHybridProperties_, false, true, xctx);
215  }
216 
217  /* Get optional applicationId and default to "application". */
218  application_id = afw_object_old_get_property_as_utf8(entry,
219  &afw_s_applicationId, p, xctx);
220  if (!application_id) {
221  application_id = &afw_s_Adaptive;
223  &afw_s_applicationId, application_id, xctx);
224  }
225  ((afw_environment_t *)env)->application_id.len = application_id->len;
226  ((afw_environment_t *)env)->application_id.s = application_id->s;
227 
228  /*
229  * If conf adaptor, merge in the _AdaptiveConf_application application_id
230  * object to entry.
231  */
232  if (conf_adaptor_id) {
233  object = NULL;
234  error = false;
235  session = afw_adaptor_session_create(conf_adaptor_id, xctx);
236  AFW_TRY {
238  session, NULL,
239  &afw_s__AdaptiveConf_application, application_id,
240  (void *)&object, impl_conf_object_cb, NULL, p, xctx);
241  }
242 
243  AFW_CATCH(not_found) {
244  /* Okay, object is NULL. */
245  }
246 
248  error = true;
249  AFW_LOG_FZ(err, xctx,
251  "%s",
252  AFW_UTF8_FMT_ARG(source_location),
253  AFW_ERROR_THROWN->message_z);
254  }
255 
256  AFW_FINALLY{
257  afw_adaptor_session_release(session, xctx);
258  }
259 
260  AFW_ENDTRY;
261 
262  /* If there was an unexpected error, throw error. */
263  if (error) {
264  AFW_THROW_ERROR_FZ(general, xctx,
266  "error logged _AdaptiveService_",
267  AFW_UTF8_FMT_ARG(source_location));
268  }
269 
270  if (object) {
271  for (iterator = NULL;;) {
272  value = afw_object_get_next_property(object, &iterator,
273  &property_name, xctx);
274  if (!value) break;
275  entry_value = afw_object_get_property(entry,
276  property_name, xctx);
277  if (entry_value ||
278  afw_utf8_equal(property_name, &afw_s_confAdaptorId) ||
279  afw_utf8_equal(property_name, &afw_s_applicationId))
280  {
281  if (!afw_value_equal(value, entry_value, xctx)) {
282  AFW_LOG_FZ(warning, xctx,
284  "configuration type \"application\" ignored "
285  "/%" AFW_UTF8_FMT
286  "/_AdaptiveConf_application/%" AFW_UTF8_FMT
287  ".%" AFW_UTF8_FMT
288  " because it is allowWrite=false or specified "
289  " in the conf file.",
290  AFW_UTF8_FMT_ARG(source_location),
291  AFW_UTF8_FMT_ARG(conf_adaptor_id),
292  AFW_UTF8_FMT_ARG(application_id),
293  AFW_UTF8_FMT_ARG(property_name));
294  }
295  }
296  else {
297  afw_object_set_property(entry, property_name, value, xctx);
298  }
299  }
300  }
301  }
302 
303  /* Prepare/validate application conf. */
304  properties = afw_environment_prepare_conf_type_properties(entry, xctx);
305  env->application_object = properties;
307  &afw_s__AdaptiveApplication_, &afw_s_current, xctx);
309 
310  /* If extensions specified, load them. */
312  &afw_s_extensions, xctx);
313  if (value) {
314  for (extension_id = afw_value_as_array_of_utf8(value, p, xctx);
315  *extension_id;
316  extension_id++)
317  {
318  afw_environment_load_extension(*extension_id, NULL, NULL, xctx);
319  }
320  }
321 
322  /* If extensionModulePaths specified, load them. */
324  &afw_s_extensionModulePaths, xctx);
325  if (value) {
326  for (module_path = afw_value_as_array_of_utf8(value, p, xctx);
327  *module_path;
328  module_path++)
329  {
330  afw_environment_load_extension(NULL, *module_path, NULL, xctx);
331  }
332  }
333 
334  /* Make application context object. */
335  context_type_object = afw_environment_get_context_type(&afw_s_application,
336  xctx);
337 
338  /* application:: variable definitions. */
339  variable_definitions_object =
341  context_type_object, &afw_s_application, xctx);
343  variable_definitions_object, env->application_object, xctx);
344 
345  /* qualifiedVariables definitions. */
347  env->application_object, &afw_s_qualifiedVariables, xctx);
349  detail_source_location = afw_utf8_printf(
350  env->application_qualified_variables->p, xctx,
351  "%" AFW_UTF8_FMT "/%" AFW_UTF8_FMT,
352  AFW_UTF8_FMT_ARG(source_location),
353  AFW_UTF8_FMT_ARG(&afw_s_qualifiedVariables));
355  env->application_qualified_variables, p, xctx);
357  context_type_object, env->application_qualified_variables,
358  detail_source_location, xctx);
359  }
360 
361  /* rootFilePaths */
363  env->application_object, &afw_s_rootFilePaths, xctx);
364 
365  /* defaultFlags */
367  &afw_s_defaultFlags, xctx);
368  if (default_flags) {
369  afw_flag_set_default_flag_ids(default_flags, xctx);
370  }
371 
372  /* Get optional layoutAdaptorId. */
374  properties, &afw_s_layoutsAdaptorId, p, xctx);
375 
376  /* Set supported core object type in adaptor. */
377  if (env->layout_adaptor_id) {
378  AFW_LOG_FZ(debug, xctx,
379  "Application specified layoutAdaptorId %" AFW_UTF8_FMT
380  ".",
382  layout_adaptor = afw_adaptor_get_reference(env->layout_adaptor_id, xctx);
384  &afw_s__AdaptiveLayoutComponentType_, true, true, xctx);
386  &afw_s__AdaptiveLayoutComponent_, false, true, xctx);
387  afw_adaptor_release(layout_adaptor, xctx);
388  }
389 
390  /* Process authorizationControl*/
391  object = afw_object_old_get_property_as_object(properties,
392  &afw_s_authorizationControl, xctx);
393  afw_authorization_internal_set_control(object, xctx);
394 
395  /* If conf adaptor, start any services that are ready. */
396  if (conf_adaptor_id) {
397  afw_service_internal_start_initial_services(p, xctx);
398  }
399 
400  /* Push qualifiers on env xctx. */
402 
403  /*
404  * If onApplicationStartupComplete specified, run its script and terminate
405  * if it returns a non-nullish value of other than integer 0.
406  */
407  value = afw_object_get_property(properties,
408  &afw_s_onApplicationStartupComplete, xctx);
409  if (value) {
410  AFW_LOG_Z(info,
411  "Application onApplicationStartupComplete script being called.",
412  xctx);
413  value = afw_value_compile_and_evaluate(value,
414  &impl_s_a_onApplicationStartupComplete_source_location,
415  p, xctx);
416  if (!afw_value_is_nullish(value) &&
417  (!afw_value_is_integer(value) ||
418  ((afw_value_integer_t *)value)->internal != 0))
419  {
420  s = afw_value_as_casted_utf8(value, p, xctx);
421  AFW_THROW_ERROR_FZ(general, xctx,
422  "Application onApplicationStartupComplete script returned value "
423  "other than 0 - %" AFW_UTF8_FMT,
424  AFW_UTF8_FMT_ARG(s));
425  }
426  else {
427  AFW_LOG_Z(info,
428  "Application onApplicationStartupComplete script successfully completed.",
429  xctx);
430 
431  }
432  }
433 
434  /* Log application startup complete. */
435  AFW_LOG_FZ(info, xctx,
436  "%" AFW_UTF8_FMT " application startup complete.",
437  AFW_UTF8_FMT_ARG(application_id));
438 
439 }
Adaptive Framework Core Internal.
afw_adaptor_impl_set_supported_core_object_type(const afw_adaptor_t *adaptor, const afw_utf8_t *object_type_id, afw_boolean_t allow_entity, afw_boolean_t allow_write, afw_xctx_t *xctx)
Indicates support of a core object type.
#define afw_adaptor_session_get_object(instance, impl_request, object_type_id, object_id, context, callback, adaptor_type_specific, p, xctx)
Call method get_object of interface afw_adaptor_session.
afw_adaptor_session_release(const afw_adaptor_session_t *session, afw_xctx_t *xctx)
Release an adaptor session created by afw_adaptor_session_create().
Definition: afw_adaptor.c:282
afw_adaptor_session_create(const afw_utf8_t *adaptor_id, afw_xctx_t *xctx)
Create an adaptor session.
Definition: afw_adaptor.c:265
afw_adaptor_release(const afw_adaptor_t *instance, afw_xctx_t *xctx)
Release an adaptor accessed by afw_adaptor_get_reference().
Definition: afw_adaptor.c:221
afw_adaptor_get_reference(const afw_utf8_t *adaptor_id, afw_xctx_t *xctx)
Get an adaptor and make sure it is started.
Definition: afw_adaptor.c:143
void afw_application_internal_register_basic_application_context_type(afw_xctx_t *xctx)
Set basic application context type.
void afw_application_internal_push_qualifiers(afw_xctx_t *xctx)
Push application qualifiers on xctx's qualifier stack.
void afw_application_internal_application_conf_type_create_cede_p(const afw_utf8_t *type, const afw_object_t *entry, const afw_utf8_t *source_location, const afw_pool_t *p, afw_xctx_t *xctx)
type=application conf handler.
afw_value_evaluated_integer_inf
Unmanaged evaluated value inf for data type integer.
afw_value_create_integer(afw_integer_t internal, const afw_pool_t *p, afw_xctx_t *xctx)
Create function for unmanaged data type integer value.
#define afw_value_is_integer(A_VALUE)
Macro to determine if value is evaluated integer.
#define afw_object_old_get_property_as_list(object, property_name, xctx)
Get property function for data type list value.
#define afw_object_old_get_property_as_object(object, property_name, xctx)
Get property function for data type object value.
afw_value_create_string(const afw_utf8_t *internal, const afw_pool_t *p, afw_xctx_t *xctx)
Create function for unmanaged data type string value.
afw_value_evaluated_string_inf
Unmanaged evaluated value inf for data type string.
afw_object_set_property_as_string(const afw_object_t *object, const afw_utf8_t *property_name, const afw_utf8_t *internal, afw_xctx_t *xctx)
Set property function for data type string values.
#define AFW_UTF8_FMT_ARG(A_STRING)
Convenience Macro for use with AFW_UTF8_FMT to specify arg.
Definition: afw_common.h:605
#define AFW_UTF8_LITERAL(A_STRING)
String literal initializer.
Definition: afw_common.h:582
#define AFW_UTF8_CONTEXTUAL_LABEL_FMT
Format string used for source location.
Definition: afw_common.h:595
struct afw_iterator_s afw_iterator_t
_Bool afw_boolean_t
Definition: afw_common.h:373
#define AFW_UTF8_FMT
Format string specifier used for afw_utf8_t.
Definition: afw_common.h:588
apr_int64_t afw_integer_t
typedef for big signed int.
Definition: afw_common.h:321
afw_context_variable_definitions_add_based_on_object(const afw_object_t *variable_definitions, const afw_object_t *object, afw_xctx_t *xctx)
Add variable definitions based on object.
Definition: afw_context.c:315
afw_context_variable_definition_add_z(const afw_object_t *variable_definitions, const afw_utf8_t *variable_name, const afw_utf8_t *source, const afw_value_inf_t *value_inf, const afw_utf8_z_t *label_z, const afw_utf8_z_t *description_z, const afw_utf8_z_t *data_type_parameter_z, const afw_utf8_z_t *data_type_parameter_formatted_z, afw_xctx_t *xctx)
Add variable definition using 0 terminated label and description.
Definition: afw_context.c:190
afw_context_variable_definitions_compile_and_add_based_on_qualifiers_object(const afw_object_t *context_type_object, const afw_object_t *objects, const afw_utf8_t *source_location, afw_xctx_t *xctx)
Compile and add variable definitions based on AdaptiveHybridProperties object.
Definition: afw_context.c:542
afw_context_type_insure_variable_definitions_object_exists(const afw_object_t *context_type_object, const afw_utf8_t *qualifier_id, afw_xctx_t *xctx)
Insure variable definitions object exists for qualifier id.
Definition: afw_context.c:109
afw_context_type_create(const afw_utf8_t *context_type_id, const afw_pool_t *p, afw_xctx_t *xctx)
Create a context type object.
Definition: afw_context.c:64
void afw_environment_register_context_type(const afw_utf8_t *context_type_id, const afw_object_t *context_type_object, afw_xctx_t *xctx)
Register an context type.
const afw_object_t * afw_environment_prepare_conf_type_properties(const afw_object_t *properties, afw_xctx_t *xctx)
Prepare properties for a conf type.
afw_environment_load_extension(const afw_utf8_t *extension_id, const afw_utf8_t *module_path, const afw_object_t *properties, afw_xctx_t *xctx)
Load and initialize environment extension.
const afw_object_t * afw_environment_get_context_type(const afw_utf8_t *context_type_id, afw_xctx_t *xctx)
Get the afw_environment_context_type struct associated with a context type.
#define AFW_FINALLY
Always executed regardless of error.
Definition: afw_error.h:702
#define AFW_CATCH_UNHANDLED
Catch an unhandled error that occurs in a AFW_TRY block.
Definition: afw_error.h:684
#define AFW_ENDTRY
Ends an AFW try block.
Definition: afw_error.h:727
#define AFW_TRY
Begin an AFW TRY block.
Definition: afw_error.h:634
#define AFW_THROW_ERROR_FZ(code, xctx, format_z,...)
Macro used to set error and 0 rv in xctx and throw it.
Definition: afw_error.h:319
#define AFW_ERROR_THROWN
Access the thrown error. See AFW_TRY.
Definition: afw_error.h:554
#define AFW_CATCH(__CODE_)
Catch a particular error that occurs in a AFW_TRY block.
Definition: afw_error.h:668
afw_flag_set_default_flag_ids(const afw_list_t *default_flag_ids, afw_xctx_t *xctx)
Set a new default flags list.
Definition: afw_flag.c:823
#define AFW_LOG_FZ(priority, xctx, format_z,...)
Log an message to environment's log using a printf style format and parameters.
Definition: afw_log.h:192
#define AFW_LOG_Z(priority, message_z, xctx)
Log an afw_utf8_z_t message to environment's log.
Definition: afw_log.h:168
#define afw_object_get_property(instance, property_name, xctx)
Call method get_property of interface afw_object.
#define afw_object_get_next_property(instance, iterator, property_name, xctx)
Call method get_next_property of interface afw_object.
afw_object_meta_set_ids(const afw_object_t *instance, const afw_utf8_t *adaptor_id, const afw_utf8_t *object_type_id, const afw_utf8_t *object_id, afw_xctx_t *xctx)
Set object's ids.
afw_object_view_create(const afw_object_t *instance, const afw_utf8_t *entity_path, const afw_object_options_t *options, const afw_pool_t *p, afw_xctx_t *xctx)
Create an object view of an object in specified pool.
afw_object_create_clone(const afw_object_t *object, const afw_pool_t *p, afw_xctx_t *xctx)
Clone an object to a specified pool.
Definition: afw_memory.c:138
afw_object_old_get_property_as_utf8(const afw_object_t *instance, const afw_utf8_t *property_name, const afw_pool_t *p, afw_xctx_t *xctx)
Get an object's property value as a string in specified pool.
Definition: afw_object.c:531
afw_object_set_property(const afw_object_t *instance, const afw_utf8_t *property_name, const afw_value_t *value, afw_xctx_t *xctx)
Set the value of an object's property.
Definition: afw_object.c:46
afw_uint32_t afw_os_get_pid()
Return a process id or similar number.
Definition: win/afw_os.c:174
afw_runtime_env_set_object(const afw_object_t *object, afw_boolean_t overwrite, afw_xctx_t *xctx)
Set an object pointer in the environment's runtime objects.
Definition: afw_runtime.c:210
afw_boolean_t afw_utf8_equal(const afw_utf8_t *s1, const afw_utf8_t *s2)
Check to see if a string equals another string.
afw_utf8_printf(const afw_pool_t *p, afw_xctx_t *xctx, const afw_utf8_z_t *format,...)
Create a utf-8 string using a c format string in specified pool.
Definition: afw_utf8.c:459
afw_value_as_array_of_utf8(const afw_value_t *value, const afw_pool_t *p, afw_xctx_t *xctx)
Return a NULL terminated list of utf8 in a specified pool.
Definition: afw_value.c:827
afw_value_equal(const afw_value_t *value1, const afw_value_t *value2, afw_xctx_t *xctx)
Test whether two values are equal.
Definition: afw_value.c:851
afw_value_compile_and_evaluate(const afw_value_t *value, const afw_utf8_t *source_location, const afw_pool_t *p, afw_xctx_t *xctx)
Compile and evaluate a value.
Definition: afw_value.c:145
#define afw_value_is_nullish(A_VALUE)
Determine if value is undefined or null.
Definition: afw_value.h:422
afw_value_as_casted_utf8(const afw_value_t *value, const afw_pool_t *p, afw_xctx_t *xctx)
Convert value to casted utf8 in specified pool.
Definition: afw_value.c:334
afw_xctx_push_qualifier_object(const afw_utf8_t *qualifier_name, const afw_object_t *qualifier_object, afw_boolean_t secure, const afw_pool_t *p, afw_xctx_t *xctx)
Push qualifier object on to stack.
Definition: afw_xctx.c:406
afw_xctx_push_qualifiers_object(const afw_object_t *context_object, afw_boolean_t secure, const afw_pool_t *p, afw_xctx_t *xctx)
Push qualifiers object on to stack.
Definition: afw_xctx.c:336
afw_xctx_push_qualifier(const afw_utf8_t *qualifier, const afw_object_t *qualifier_object, afw_boolean_t secure, afw_xctx_get_variable_t get, void *data, const afw_pool_t *p, afw_xctx_t *xctx)
Push qualifier on to stack.
Definition: afw_xctx.c:359
Interface afw_adaptor public struct.
Interface afw_adaptor_session public struct.
Struct for typedef afw_environment_t defined in afw_common.h.
Definition: afw_common.h:1383
const afw_object_t * application_qualified_variables
Definition: afw_common.h:1410
const afw_pool_t * p
Pool used to hold environment.
Definition: afw_common.h:1386
const afw_object_t * application_object
Application object - /afw/_AdaptiveApplication_/current.
Definition: afw_common.h:1407
const afw_object_t * root_file_paths
rootFilePaths - /afw/_AdaptiveApplication_/current/rootFilePaths.
Definition: afw_common.h:1413
const afw_utf8_t * layout_adaptor_id
Custom layout adaptor or NULL.
Definition: afw_common.h:1416
const afw_adaptor_t * conf_adaptor
Adaptor for application.confAdaptorId or NULL.
Definition: afw_common.h:1401
Interface afw_list public struct.
Interface afw_object public struct.
Interface afw_pool public struct.
NFC normalized UTF-8 string.
Definition: afw_common.h:545
struct for data type integer values.
Interface afw_value public struct.
Definition: afw_xctx.h:352
Interface afw_xctx public struct.