68 if (json_object_object_get_ex(details,
"default", &value))
69 return json_object_to_json_string_ext(value, JSON_C_TO_STRING_PLAIN);
83 json_object *coalescedDetails = json_object_new_object();
95 bool atLeastOneDataSourceCoalesced =
false;
98 for (vector<VuoCable *>::iterator i = connectedCables.begin(); i != connectedCables.end(); ++i)
100 VuoPort *connectedPort = (*i)->getToPort();
101 if (! (connectedPort && connectedPort->
hasCompiler()) )
105 if (connectedInputEventPortClass)
108 if (connectedInputDataClass)
115 if (json_object_object_get_ex(js,
"suggestedMin", &o))
118 if (!coalescedSuggestedMin)
119 coalescedSuggestedMin = o;
124 bool newIsBetter =
false;
125 if (typeName ==
"VuoInteger")
126 newIsBetter = json_object_get_int64(o) > json_object_get_int64(coalescedSuggestedMin);
127 else if (typeName ==
"VuoReal")
128 newIsBetter = json_object_get_double(o) > json_object_get_double(coalescedSuggestedMin);
129 else if (typeName ==
"VuoPoint2d" || typeName ==
"VuoPoint3d" || typeName ==
"VuoPoint4d")
131 double oldX=0,newX=0;
133 if (json_object_object_get_ex(coalescedSuggestedMin,
"x", &x))
134 oldX = json_object_get_double(x);
135 if (json_object_object_get_ex(o,
"x", &x))
136 newX = json_object_get_double(x);
137 newIsBetter = newX > oldX;
141 coalescedSuggestedMin = o;
145 if (json_object_object_get_ex(js,
"suggestedMax", &o))
148 if (!coalescedSuggestedMax)
149 coalescedSuggestedMax = o;
154 bool newIsBetter =
false;
155 if (typeName ==
"VuoInteger")
156 newIsBetter = json_object_get_int64(o) < json_object_get_int64(coalescedSuggestedMax);
157 else if (typeName ==
"VuoReal")
158 newIsBetter = json_object_get_double(o) < json_object_get_double(coalescedSuggestedMax);
159 else if (typeName ==
"VuoPoint2d" || typeName ==
"VuoPoint3d" || typeName ==
"VuoPoint4d")
161 double oldX=0,newX=0;
163 if (json_object_object_get_ex(coalescedSuggestedMax,
"x", &x))
164 oldX = json_object_get_double(x);
165 if (json_object_object_get_ex(o,
"x", &x))
166 newX = json_object_get_double(x);
167 newIsBetter = newX < oldX;
171 coalescedSuggestedMax = o;
175 if (json_object_object_get_ex(js,
"suggestedStep", &o))
178 if (!coalescedSuggestedStep)
179 coalescedSuggestedStep = o;
184 bool newIsBetter =
false;
185 if (typeName ==
"VuoInteger")
186 newIsBetter = json_object_get_int64(o) < json_object_get_int64(coalescedSuggestedStep);
187 else if (typeName ==
"VuoReal")
188 newIsBetter = json_object_get_double(o) < json_object_get_double(coalescedSuggestedStep);
189 else if (typeName ==
"VuoPoint2d" || typeName ==
"VuoPoint3d" || typeName ==
"VuoPoint4d")
191 double oldX=0,newX=0;
193 if (json_object_object_get_ex(coalescedSuggestedStep,
"x", &x))
194 oldX = json_object_get_double(x);
195 if (json_object_object_get_ex(o,
"x", &x))
196 newX = json_object_get_double(x);
197 newIsBetter = newX < oldX;
201 coalescedSuggestedStep = o;
205 if (json_object_object_get_ex(js,
"auto", &o))
208 if (!atLeastOneDataSourceCoalesced)
212 if (json_object_object_get_ex(js,
"autoSupersedesDefault", &o))
213 coalescedAutoSupersedesDefault = o;
215 else if (coalescedAuto != o)
217 coalescedAuto = NULL;
218 coalescedAutoSupersedesDefault = NULL;
223 coalescedAuto = NULL;
224 coalescedAutoSupersedesDefault = NULL;
227 if (json_object_object_get_ex(js,
"menuItems", &o))
230 if (!coalescedMenuItems)
231 coalescedMenuItems = o;
234 atLeastOneDataSourceCoalesced =
true;
239 if (coalescedSuggestedMin)
240 json_object_object_add(coalescedDetails,
"suggestedMin", coalescedSuggestedMin);
241 if (coalescedSuggestedMax)
242 json_object_object_add(coalescedDetails,
"suggestedMax", coalescedSuggestedMax);
243 if (coalescedSuggestedStep)
244 json_object_object_add(coalescedDetails,
"suggestedStep", coalescedSuggestedStep);
249 json_object_object_add(coalescedDetails,
"auto", coalescedAuto);
250 if (coalescedAutoSupersedesDefault)
251 json_object_object_add(coalescedDetails,
"autoSupersedesDefault", coalescedAutoSupersedesDefault);
253 if (!coalescedMenuItems)
258 string allowedValuesFunctionName = type->
getModuleKey() +
"_getAllowedValues";
259 typedef void *(*allowedValuesFunctionType)(void);
260 allowedValuesFunctionType allowedValuesFunction = (allowedValuesFunctionType)dlsym(RTLD_SELF, allowedValuesFunctionName.c_str());
262 string getJsonFunctionName = type->
getModuleKey() +
"_getJson";
263 typedef json_object *(*getJsonFunctionType)(int64_t);
264 getJsonFunctionType getJsonFunction = (getJsonFunctionType)dlsym(RTLD_SELF, getJsonFunctionName.c_str());
266 string summaryFunctionName = type->
getModuleKey() +
"_getSummary";
267 typedef char *(*summaryFunctionType)(int64_t);
268 summaryFunctionType summaryFunction = (summaryFunctionType)dlsym(RTLD_SELF, summaryFunctionName.c_str());
270 string listCountFunctionName =
"VuoListGetCount_" + type->
getModuleKey();
271 typedef unsigned long (*listCountFunctionType)(
void *);
272 listCountFunctionType listCountFunction = (listCountFunctionType)dlsym(RTLD_SELF, listCountFunctionName.c_str());
274 string listValueFunctionName =
"VuoListGetValue_" + type->
getModuleKey();
275 typedef int64_t (*listValueFunctionType)(
void *,
unsigned long);
276 listValueFunctionType listValueFunction = (listValueFunctionType)dlsym(RTLD_SELF, listValueFunctionName.c_str());
278 if (allowedValuesFunction && getJsonFunction && summaryFunction && listCountFunction && listValueFunction)
280 void *allowedValues = allowedValuesFunction();
282 unsigned long listCount = listCountFunction(allowedValues);
284 for (
unsigned long i = 1; i <= listCount; ++i)
286 int64_t value = listValueFunction(allowedValues, i);
288 if (!json_object_is_type(js, json_type_string))
290 const char *key = json_object_get_string(js);
291 char *summary = summaryFunction(value);
294 json_object_object_add(menuItem,
"value", json_object_new_string(key));
295 json_object_object_add(menuItem,
"name", json_object_new_string(summary));
296 json_object_array_add(menuItems, menuItem);
302 if (json_object_array_length(menuItems))
303 coalescedMenuItems = menuItems;
306 if (coalescedMenuItems)
307 json_object_object_add(coalescedDetails,
"menuItems", coalescedMenuItems);
309 json_object_get(coalescedSuggestedMin);
310 json_object_get(coalescedSuggestedMax);
311 json_object_get(coalescedSuggestedStep);
312 json_object_get(coalescedAuto);
313 json_object_get(coalescedAutoSupersedesDefault);
314 json_object_get(coalescedMenuItems);
323 json_object_object_foreach(details, key, val)
325 json_object_object_add(coalescedDetails, key, val);
326 json_object_get(val);
330 return coalescedDetails;
339 ostringstream output;
344 string typeName = type ? type->
getModuleKey() :
"event";
354 output << attributePrefix <<
"_type=\"" << escapedTypeName <<
"\"";
357 json_object_object_foreach(details, key, val)
359 string attributeSuffix;
360 if (strcmp(key,
"default") == 0)
365 attributeSuffix =
"";
368 attributeSuffix = string(
"_") + key;
370 string attributeValue = json_object_to_json_string_ext(val, JSON_C_TO_STRING_PLAIN);
373 output << attributePrefix << attributeSuffix <<
"=\"" << escapedAttributeValue <<
"\"";