Add french translation to up-to-dating script
[ladish.git] / daemon / load.c
blobc7f8543a7ec05197f554867d5300b6c948f6d424
1 /* -*- Mode: C ; c-basic-offset: 2 -*- */
2 /*****************************************************************************
4 * DESCRIPTION:
5 *
7 * NOTES:
8 *
10 *****************************************************************************/
12 #include "load.h"
13 #include "limits.h"
14 #include "studio.h"
15 #include "../proxies/jmcore_proxy.h"
17 void ladish_dump_element_stack(struct ladish_parse_context * context_ptr)
19 signed int depth;
20 const char * descr;
22 log_info("depth=%d", context_ptr->depth);
24 for (depth = context_ptr->depth; depth >= 0; depth--)
26 switch (context_ptr->element[depth])
28 case PARSE_CONTEXT_ROOT:
29 descr = "root";
30 break;
31 case PARSE_CONTEXT_STUDIO:
32 descr = "studio";
33 break;
34 case PARSE_CONTEXT_JACK:
35 descr = "jack";
36 break;
37 case PARSE_CONTEXT_CONF:
38 descr = "conf";
39 break;
40 case PARSE_CONTEXT_PARAMETER:
41 descr = "parameter";
42 break;
43 case PARSE_CONTEXT_CLIENTS:
44 descr = "clients";
45 break;
46 case PARSE_CONTEXT_CLIENT:
47 descr = "client";
48 break;
49 case PARSE_CONTEXT_PORTS:
50 descr = "ports";
51 break;
52 case PARSE_CONTEXT_PORT:
53 descr = "port";
54 break;
55 case PARSE_CONTEXT_DICT:
56 descr = "dict";
57 break;
58 case PARSE_CONTEXT_KEY:
59 descr = "key";
60 break;
61 case PARSE_CONTEXT_CONNECTIONS:
62 descr = "connections";
63 break;
64 case PARSE_CONTEXT_CONNECTION:
65 descr = "connection";
66 break;
67 case PARSE_CONTEXT_APPLICATIONS:
68 descr = "applications";
69 break;
70 case PARSE_CONTEXT_APPLICATION:
71 descr = "application";
72 break;
73 case PARSE_CONTEXT_ROOMS:
74 descr = "rooms";
75 break;
76 case PARSE_CONTEXT_ROOM:
77 descr = "room";
78 break;
79 case PARSE_CONTEXT_PROJECT:
80 descr = "project";
81 break;
82 default:
83 descr = "?";
86 log_info("%d - %u (%s)", depth, context_ptr->element[depth], descr);
90 static const char * get_string_attribute_internal(const char * const * attr, const char * key, bool optional)
92 while (attr[0] != NULL)
94 ASSERT(attr[1] != NULL);
95 if (strcmp(attr[0], key) == 0)
97 return attr[1];
99 attr += 2;
102 if (!optional)
104 log_error("attribute \"%s\" is missing", key);
107 return NULL;
110 const char * ladish_get_string_attribute(const char * const * attr, const char * key)
112 return get_string_attribute_internal(attr, key, false);
115 const char * ladish_get_uuid_attribute(const char * const * attr, const char * key, uuid_t uuid, bool optional)
117 const char * value;
119 value = get_string_attribute_internal(attr, key, optional);
120 if (value == NULL)
122 return NULL;
125 if (uuid_parse(value, uuid) != 0)
127 log_error("cannot parse uuid \"%s\"", value);
128 return NULL;
131 return value;
134 const char * ladish_get_bool_attribute(const char * const * attr, const char * key, bool * bool_value_ptr)
136 const char * value_str;
138 value_str = ladish_get_string_attribute(attr, key);
139 if (value_str == NULL)
141 return NULL;
144 if (strcmp(value_str, "true") == 0)
146 *bool_value_ptr = true;
147 return value_str;
150 if (strcmp(value_str, "false") == 0)
152 *bool_value_ptr = false;
153 return value_str;
156 log_error("boolean XML attribute has value of \"%s\" but only \"true\" and \"false\" are valid", value_str);
157 return NULL;
160 const char * ladish_get_byte_attribute(const char * const * attr, const char * key, uint8_t * byte_value_ptr)
162 const char * value_str;
163 long int li_value;
164 char * end_ptr;
166 value_str = ladish_get_string_attribute(attr, key);
167 if (value_str == NULL)
169 return NULL;
172 errno = 0; /* To distinguish success/failure after call */
173 li_value = strtol(value_str, &end_ptr, 10);
174 if ((errno == ERANGE && (li_value == LONG_MAX || li_value == LONG_MIN)) || (errno != 0 && li_value == 0) || end_ptr == value_str)
176 log_error("value '%s' of attribute '%s' is not valid integer.", value_str, key);
177 return NULL;
180 if (li_value < 0 || li_value > 255)
182 log_error("value '%s' of attribute '%s' is not valid uint8.", value_str, key);
183 return NULL;
186 *byte_value_ptr = (uint8_t)li_value;
187 return value_str;
190 bool
191 ladish_get_name_and_uuid_attributes(
192 const char * element_description,
193 const char * const * attr,
194 const char ** name_str_ptr,
195 const char ** uuid_str_ptr,
196 uuid_t uuid)
198 const char * name_str;
199 const char * uuid_str;
201 name_str = ladish_get_string_attribute(attr, "name");
202 if (name_str == NULL)
204 log_error("%s \"name\" attribute is not available", element_description);
205 return false;
208 uuid_str = ladish_get_uuid_attribute(attr, "uuid", uuid, false);
209 if (uuid_str == NULL)
211 log_error("%s \"uuid\" attribute is not available. name=\"%s\"", element_description, name_str);
212 return false;
215 *name_str_ptr = name_str;
216 *uuid_str_ptr = uuid_str;
217 return true;
220 bool
221 ladish_parse_port_type_and_direction_attributes(
222 const char * element_description,
223 const char * const * attr,
224 uint32_t * type_ptr,
225 uint32_t * flags_ptr)
227 const char * type_str;
228 const char * direction_str;
230 type_str = ladish_get_string_attribute(attr, "type");
231 if (type_str == NULL)
233 log_error("%s \"type\" attribute is not available", element_description);
234 return false;
237 direction_str = ladish_get_string_attribute(attr, "direction");
238 if (direction_str == NULL)
240 log_error("%s \"direction\" attribute is not available", element_description);
241 return false;
244 if (strcmp(type_str, "midi") == 0)
246 *type_ptr = JACKDBUS_PORT_TYPE_MIDI;
248 else if (strcmp(type_str, "audio") == 0)
250 *type_ptr = JACKDBUS_PORT_TYPE_AUDIO;
252 else
254 log_error("%s \"type\" attribute contains unknown value \"%s\"", element_description, type_str);
255 return false;
258 if (strcmp(direction_str, "playback") == 0)
260 *flags_ptr = 0;
261 JACKDBUS_PORT_SET_INPUT(*flags_ptr);
263 else if (strcmp(direction_str, "capture") == 0)
265 *flags_ptr = 0;
266 JACKDBUS_PORT_SET_OUTPUT(*flags_ptr);
268 else
270 log_error("%s \"direction\" attribute contains unknown value \"%s\"", element_description, direction_str);
271 return false;
274 return true;
277 struct interlink_context
279 ladish_graph_handle vgraph;
280 ladish_app_supervisor_handle app_supervisor;
283 #define ctx_ptr ((struct interlink_context *)context)
285 static
286 bool
287 interlink_client(
288 void * context,
289 ladish_graph_handle graph_handle,
290 ladish_client_handle jclient,
291 const char * name,
292 void ** client_iteration_context_ptr_ptr)
294 uuid_t app_uuid;
295 uuid_t vclient_uuid;
296 ladish_client_handle vclient;
297 pid_t pid;
298 ladish_app_handle app;
299 bool interlinked;
300 bool jmcore;
302 if (strcmp(name, "system") == 0)
304 return true;
307 interlinked = ladish_client_get_interlink(jclient, vclient_uuid);
309 if (ladish_client_has_app(jclient))
311 ASSERT(interlinked); /* jclient has app associated but is not interlinked */
312 return true;
314 else if (interlinked)
316 ASSERT_NO_PASS; /* jclient has no app associated but is interlinked */
317 return true;
319 ASSERT(!interlinked);
321 pid = ladish_client_get_pid(jclient);
322 jmcore = pid != 0 && pid != jmcore_proxy_get_pid_cached();
323 if (jmcore)
325 return true;
328 app = ladish_app_supervisor_find_app_by_name(ctx_ptr->app_supervisor, name);
329 if (app == NULL)
331 log_info("JACK client \"%s\" not found in app supervisor", name);
332 return true;
335 vclient = ladish_graph_find_client_by_name(ctx_ptr->vgraph, name, true);
336 if (vclient == NULL)
338 log_error("JACK client '%s' has no vclient associated", name);
339 return true;
342 log_info("Interlinking clients of app '%s'", name);
343 ladish_client_interlink(jclient, vclient);
345 ladish_app_get_uuid(app, app_uuid);
346 ladish_client_set_app(jclient, app_uuid);
347 ladish_client_set_app(vclient, app_uuid);
349 ladish_client_set_vgraph(jclient, ctx_ptr->vgraph);
351 return true;
354 void ladish_interlink_clients(ladish_graph_handle vgraph, ladish_app_supervisor_handle app_supervisor)
356 struct interlink_context ctx;
358 ctx.vgraph = vgraph;
359 ctx.app_supervisor = app_supervisor;
361 ladish_graph_iterate_nodes(ladish_studio_get_jack_graph(), false, &ctx, interlink_client, NULL, NULL);