69 if (json_object_object_get_ex(details,
"default", &value))
70 return json_object_to_json_string_ext(value, JSON_C_TO_STRING_PLAIN);
84 json_object *coalescedDetails = json_object_new_object();
96 bool atLeastOneDataSourceCoalesced =
false;
99 for (vector<VuoCable *>::iterator i = connectedCables.begin(); i != connectedCables.end(); ++i)
101 VuoPort *connectedPort = (*i)->getToPort();
102 if (! (connectedPort && connectedPort->
hasCompiler()) )
106 if (connectedInputEventPortClass)
109 if (connectedInputDataClass)
116 if (json_object_object_get_ex(js,
"suggestedMin", &o))
119 if (!coalescedSuggestedMin)
120 coalescedSuggestedMin = o;
125 bool newIsBetter =
false;
126 if (typeName ==
"VuoInteger")
127 newIsBetter = json_object_get_int64(o) > json_object_get_int64(coalescedSuggestedMin);
128 else if (typeName ==
"VuoReal")
129 newIsBetter = json_object_get_double(o) > json_object_get_double(coalescedSuggestedMin);
130 else if (typeName ==
"VuoPoint2d" || typeName ==
"VuoPoint3d" || typeName ==
"VuoPoint4d")
132 double oldX=0,newX=0;
134 if (json_object_object_get_ex(coalescedSuggestedMin,
"x", &x))
135 oldX = json_object_get_double(x);
136 if (json_object_object_get_ex(o,
"x", &x))
137 newX = json_object_get_double(x);
138 newIsBetter = newX > oldX;
142 coalescedSuggestedMin = o;
146 if (json_object_object_get_ex(js,
"suggestedMax", &o))
149 if (!coalescedSuggestedMax)
150 coalescedSuggestedMax = o;
155 bool newIsBetter =
false;
156 if (typeName ==
"VuoInteger")
157 newIsBetter = json_object_get_int64(o) < json_object_get_int64(coalescedSuggestedMax);
158 else if (typeName ==
"VuoReal")
159 newIsBetter = json_object_get_double(o) < json_object_get_double(coalescedSuggestedMax);
160 else if (typeName ==
"VuoPoint2d" || typeName ==
"VuoPoint3d" || typeName ==
"VuoPoint4d")
162 double oldX=0,newX=0;
164 if (json_object_object_get_ex(coalescedSuggestedMax,
"x", &x))
165 oldX = json_object_get_double(x);
166 if (json_object_object_get_ex(o,
"x", &x))
167 newX = json_object_get_double(x);
168 newIsBetter = newX < oldX;
172 coalescedSuggestedMax = o;
176 if (json_object_object_get_ex(js,
"suggestedStep", &o))
179 if (!coalescedSuggestedStep)
180 coalescedSuggestedStep = o;
185 bool newIsBetter =
false;
186 if (typeName ==
"VuoInteger")
187 newIsBetter = json_object_get_int64(o) < json_object_get_int64(coalescedSuggestedStep);
188 else if (typeName ==
"VuoReal")
189 newIsBetter = json_object_get_double(o) < json_object_get_double(coalescedSuggestedStep);
190 else if (typeName ==
"VuoPoint2d" || typeName ==
"VuoPoint3d" || typeName ==
"VuoPoint4d")
192 double oldX=0,newX=0;
194 if (json_object_object_get_ex(coalescedSuggestedStep,
"x", &x))
195 oldX = json_object_get_double(x);
196 if (json_object_object_get_ex(o,
"x", &x))
197 newX = json_object_get_double(x);
198 newIsBetter = newX < oldX;
202 coalescedSuggestedStep = o;
206 if (json_object_object_get_ex(js,
"auto", &o))
209 if (!atLeastOneDataSourceCoalesced)
213 if (json_object_object_get_ex(js,
"autoSupersedesDefault", &o))
214 coalescedAutoSupersedesDefault = o;
216 else if (coalescedAuto != o)
218 coalescedAuto = NULL;
219 coalescedAutoSupersedesDefault = NULL;
224 coalescedAuto = NULL;
225 coalescedAutoSupersedesDefault = NULL;
228 if (json_object_object_get_ex(js,
"menuItems", &o))
231 if (!coalescedMenuItems)
232 coalescedMenuItems = o;
235 atLeastOneDataSourceCoalesced =
true;
240 if (coalescedSuggestedMin)
241 json_object_object_add(coalescedDetails,
"suggestedMin", coalescedSuggestedMin);
242 if (coalescedSuggestedMax)
243 json_object_object_add(coalescedDetails,
"suggestedMax", coalescedSuggestedMax);
244 if (coalescedSuggestedStep)
245 json_object_object_add(coalescedDetails,
"suggestedStep", coalescedSuggestedStep);
250 json_object_object_add(coalescedDetails,
"auto", coalescedAuto);
251 if (coalescedAutoSupersedesDefault)
252 json_object_object_add(coalescedDetails,
"autoSupersedesDefault", coalescedAutoSupersedesDefault);
254 if (!coalescedMenuItems)
259 string allowedValuesFunctionName = type->
getModuleKey() +
"_getAllowedValues";
260 typedef void *(*allowedValuesFunctionType)(void);
261 allowedValuesFunctionType allowedValuesFunction = (allowedValuesFunctionType)dlsym(RTLD_SELF, allowedValuesFunctionName.c_str());
263 string getJsonFunctionName = type->
getModuleKey() +
"_getJson";
264 typedef json_object *(*getJsonFunctionType)(int64_t);
265 getJsonFunctionType getJsonFunction = (getJsonFunctionType)dlsym(RTLD_SELF, getJsonFunctionName.c_str());
267 string summaryFunctionName = type->
getModuleKey() +
"_getSummary";
268 typedef char *(*summaryFunctionType)(int64_t);
269 summaryFunctionType summaryFunction = (summaryFunctionType)dlsym(RTLD_SELF, summaryFunctionName.c_str());
271 string listCountFunctionName =
"VuoListGetCount_" + type->
getModuleKey();
272 typedef unsigned long (*listCountFunctionType)(
void *);
273 listCountFunctionType listCountFunction = (listCountFunctionType)dlsym(RTLD_SELF, listCountFunctionName.c_str());
275 string listValueFunctionName =
"VuoListGetValue_" + type->
getModuleKey();
276 typedef int64_t (*listValueFunctionType)(
void *,
unsigned long);
277 listValueFunctionType listValueFunction = (listValueFunctionType)dlsym(RTLD_SELF, listValueFunctionName.c_str());
279 if (allowedValuesFunction && getJsonFunction && summaryFunction && listCountFunction && listValueFunction)
281 void *allowedValues = allowedValuesFunction();
283 unsigned long listCount = listCountFunction(allowedValues);
285 for (
unsigned long i = 1; i <= listCount; ++i)
287 int64_t value = listValueFunction(allowedValues, i);
289 if (!json_object_is_type(js, json_type_string))
291 const char *key = json_object_get_string(js);
292 char *summary = summaryFunction(value);
295 json_object_object_add(menuItem,
"value", json_object_new_string(key));
296 json_object_object_add(menuItem,
"name", json_object_new_string(summary));
297 json_object_array_add(menuItems, menuItem);
303 if (json_object_array_length(menuItems))
304 coalescedMenuItems = menuItems;
307 if (coalescedMenuItems)
308 json_object_object_add(coalescedDetails,
"menuItems", coalescedMenuItems);
310 json_object_get(coalescedSuggestedMin);
311 json_object_get(coalescedSuggestedMax);
312 json_object_get(coalescedSuggestedStep);
313 json_object_get(coalescedAuto);
314 json_object_get(coalescedAutoSupersedesDefault);
315 json_object_get(coalescedMenuItems);
324 json_object_object_foreach(details, key, val)
326 json_object_object_add(coalescedDetails, key, val);
327 json_object_get(val);
331 return coalescedDetails;
340 ostringstream output;
345 string typeName = type ? type->
getModuleKey() :
"event";
355 output << attributePrefix <<
"_type=\"" << escapedTypeName <<
"\"";
358 json_object_object_foreach(details, key, val)
360 string attributeSuffix;
361 if (strcmp(key,
"default") == 0)
366 attributeSuffix =
"";
369 attributeSuffix = string(
"_") + key;
371 string attributeValue = json_object_to_json_string_ext(val, JSON_C_TO_STRING_PLAIN);
374 output << attributePrefix << attributeSuffix <<
"=\"" << escapedAttributeValue <<
"\"";