20 const unsigned long VuoNodeRegistry::topLevelCompositionIndex = ULONG_MAX;
21 const unsigned long VuoNodeRegistry::invalidCompositionIndex = ULONG_MAX - 1;
28 this->persistentState = persistentState;
29 vuoTopLevelCompositionIdentifier = NULL;
39 ostringstream errorMessage;
41 vuoTopLevelCompositionIdentifierType *vuoTopLevelCompositionIdentifierPtr = (vuoTopLevelCompositionIdentifierType *) dlsym(compositionBinaryHandle,
"vuoTopLevelCompositionIdentifier");
42 if (! vuoTopLevelCompositionIdentifierPtr)
44 errorMessage <<
"The composition couldn't be started because its vuoTopLevelCompositionIdentifier variable couldn't be found : " << dlerror();
47 vuoTopLevelCompositionIdentifier = *vuoTopLevelCompositionIdentifierPtr;
56 return (strlen(compositionIdentifier) > 0 ? compositionIdentifier : vuoTopLevelCompositionIdentifier);
66 void VuoNodeRegistry::splitCompositionIdentifier(
const string &compositionIdentifier,
string &parentCompositionIdentifier,
string &nodeIdentifier)
68 size_t pos = compositionIdentifier.rfind(
"/");
69 if (pos != string::npos)
71 parentCompositionIdentifier = compositionIdentifier.substr(0, pos);
72 nodeIdentifier = compositionIdentifier.substr(pos + strlen(
"/"));
76 parentCompositionIdentifier = compositionIdentifier;
84 string VuoNodeRegistry::buildCompositionIdentifier(
const string &parentCompositionIdentifier,
const string &nodeIdentifier)
86 return parentCompositionIdentifier +
"/" + nodeIdentifier;
94 void VuoNodeRegistry::splitPortIdentifier(
const string &portIdentifier,
string &nodeIdentifier,
string &portName)
96 size_t pos = portIdentifier.rfind(
":");
97 if (pos != string::npos)
99 nodeIdentifier = portIdentifier.substr(0, pos);
100 portName = portIdentifier.substr(pos + strlen(
":"));
111 NodeContext *(*compositionCreateContextForNode)(
unsigned long),
112 void (*compositionSetPortValue)(
VuoCompositionState *,
const char *,
const char *,
bool,
bool,
bool,
bool,
bool),
115 void (*compositionReleasePortData)(
void *,
unsigned long))
117 NodeMetadata nodeMetadata;
118 nodeMetadata.identifier = nodeIdentifier;
119 nodeMetadata.compositionCreateContextForNode = compositionCreateContextForNode;
120 nodeMetadata.compositionSetPortValue = compositionSetPortValue;
121 nodeMetadata.compositionGetPortValue = compositionGetPortValue;
122 nodeMetadata.compositionFireTriggerPortEvent = compositionFireTriggerPortEvent;
123 nodeMetadata.compositionReleasePortData = compositionReleasePortData;
124 nodeMetadatas[compositionIdentifier].push_back(nodeMetadata);
132 unsigned long typeIndex,
const char *initialValue)
134 PortMetadata portMetadata = { portIdentifier, portName, typeIndex, initialValue };
135 nodeMetadatas[compositionIdentifier].back().portMetadatas.push_back(portMetadata);
141 string VuoNodeRegistry::getNodeIdentifierForIndex(
const char *compositionIdentifier,
unsigned long nodeIndex)
143 if (nodeIndex == topLevelCompositionIndex)
146 map<string, vector<NodeMetadata> >::iterator iter1 = nodeMetadatas.find(compositionIdentifier);
147 if (iter1 != nodeMetadatas.end())
148 if (nodeIndex < iter1->second.size())
149 return iter1->second[nodeIndex].identifier;
151 VUserLog(
"Couldn't find identifier for node %s/%lu", compositionIdentifier, nodeIndex);
158 unsigned long VuoNodeRegistry::getNodeIndexForIdentifier(
const string &compositionIdentifier,
const string &nodeIdentifier)
160 if (nodeIdentifier.empty())
161 return topLevelCompositionIndex;
163 map<string, vector<NodeMetadata> >::iterator iter1 = nodeMetadatas.find(compositionIdentifier);
164 if (iter1 != nodeMetadatas.end())
165 for (
unsigned long i = 0; i < iter1->second.size(); ++i)
166 if (iter1->second[i].identifier == nodeIdentifier)
169 VUserLog(
"Couldn't find index for node %s", buildCompositionIdentifier(compositionIdentifier, nodeIdentifier).c_str());
170 return invalidCompositionIndex;
176 const VuoNodeRegistry::NodeMetadata * VuoNodeRegistry::getNodeMetadataForPort(
const string &compositionIdentifier,
const string &portIdentifier)
178 string nodeIdentifier, portName;
179 splitPortIdentifier(portIdentifier, nodeIdentifier, portName);
181 map<string, vector<NodeMetadata> >::iterator iter1 = nodeMetadatas.find(compositionIdentifier);
182 if (iter1 != nodeMetadatas.end())
183 for (
unsigned long i = 0; i < iter1->second.size(); ++i)
184 if (iter1->second[i].identifier == nodeIdentifier)
185 return &(iter1->second[i]);
187 VUserLog(
"Couldn't find node metadata for port %s", buildCompositionIdentifier(compositionIdentifier, portIdentifier).c_str());
194 string VuoNodeRegistry::getCompositionIdentifierForHash(
unsigned long compositionIdentifierHash)
196 map<unsigned long, string>::iterator iter1 = compositionIdentifierForHash.find(compositionIdentifierHash);
197 if (iter1 != compositionIdentifierForHash.end())
198 return iter1->second;
200 VUserLog(
"Couldn't find composition identifier for hash %lu", compositionIdentifierHash);
207 void VuoNodeRegistry::addNodeContext(
const char *compositionIdentifier,
unsigned long nodeIndex,
NodeContext *nodeContext)
211 map<unsigned long, map<unsigned long, NodeContext *> >::iterator iter1 = nodeContextForIndex.find(compositionIdentifierHash);
212 if (iter1 != nodeContextForIndex.end())
214 map<unsigned long, NodeContext *>::iterator iter2 = iter1->second.find(nodeIndex);
215 if (iter2 != iter1->second.end())
216 VUserLog(
"Context overwritten for node %s", buildCompositionIdentifier(compositionIdentifier, getNodeIdentifierForIndex(compositionIdentifier, nodeIndex)).c_str());
219 nodeContextForIndex[compositionIdentifierHash][nodeIndex] = nodeContext;
227 void VuoNodeRegistry::removeNodeContext(
const char *compositionIdentifier,
unsigned long nodeIndex)
231 map<unsigned long, map<unsigned long, NodeContext *> >::iterator iter1 = nodeContextForIndex.find(compositionIdentifierHash);
232 if (iter1 != nodeContextForIndex.end())
234 map<unsigned long, NodeContext *>::iterator iter2 = iter1->second.find(nodeIndex);
235 if (iter2 != iter1->second.end())
237 iter1->second.erase(iter2);
238 if (iter1->second.empty())
239 nodeContextForIndex.erase(iter1);
241 string nodeIdentifier = getNodeIdentifierForIndex(compositionIdentifier, nodeIndex);
242 string subcompositionIdentifier = buildCompositionIdentifier(compositionIdentifier, nodeIdentifier);
244 map<unsigned long, string>::iterator ciIter = compositionIdentifierForHash.find(subcompositionIdentifierHash);
245 if (ciIter != compositionIdentifierForHash.end())
246 compositionIdentifierForHash.erase(ciIter);
252 VUserLog(
"Couldn't find context for node %s", buildCompositionIdentifier(compositionIdentifier, getNodeIdentifierForIndex(compositionIdentifier, nodeIndex)).c_str());
258 void VuoNodeRegistry::relocateNodeContext(
const char *compositionIdentifier,
unsigned long nodeIndex)
262 map<unsigned long, map<unsigned long, NodeContext *> >::iterator iter1 = nodeContextForIndex.find(compositionIdentifierHash);
263 if (iter1 != nodeContextForIndex.end())
265 map<unsigned long, NodeContext *>::iterator iter2 = iter1->second.find(nodeIndex);
266 if (iter2 != iter1->second.end())
268 string nodeIdentifier = getNodeIdentifierForIndex(compositionIdentifier, nodeIndex);
269 carriedOverNodeContextForIdentifier[compositionIdentifier][nodeIdentifier] = iter2->second;
270 iter1->second.erase(iter2);
272 if (iter1->second.empty())
273 nodeContextForIndex.erase(iter1);
279 VUserLog(
"Couldn't find context for node %s", buildCompositionIdentifier(compositionIdentifier, getNodeIdentifierForIndex(compositionIdentifier, nodeIndex)).c_str());
286 NodeContext * VuoNodeRegistry::carryOverNodeContext(
const char *oldCompositionIdentifier,
const char *newCompositionIdentifier,
287 unsigned long nodeIndex)
290 string nodeIdentifier = getNodeIdentifierForIndex(newCompositionIdentifier, nodeIndex);
294 map<string, map<string, NodeContext *> >::iterator coIter1 = carriedOverNodeContextForIdentifier.find(oldCompositionIdentifier);
295 if (coIter1 != carriedOverNodeContextForIdentifier.end())
297 map<string, NodeContext *>::iterator coIter2 = coIter1->second.find(nodeIdentifier);
298 if (coIter2 != coIter1->second.end())
300 nodeContext = coIter2->second;
301 coIter1->second.erase(coIter2);
302 addNodeContext(newCompositionIdentifier, nodeIndex, nodeContext);
305 if (coIter1->second.empty())
306 carriedOverNodeContextForIdentifier.erase(coIter1);
311 VUserLog(
"Couldn't find context for node %s", buildCompositionIdentifier(oldCompositionIdentifier, nodeIdentifier).c_str());
324 map<unsigned long, map<unsigned long, NodeContext *> >::iterator iter1 = nodeContextForIndex.find(compositionIdentifierHash);
325 if (iter1 != nodeContextForIndex.end())
327 map<unsigned long, NodeContext *>::iterator iter2 = iter1->second.find(nodeIndex);
328 if (iter2 != iter1->second.end())
329 return iter2->second;
332 VUserLog(
"Couldn't find context for node %s", buildCompositionIdentifier(compositionIdentifier, getNodeIdentifierForIndex(compositionIdentifier, nodeIndex)).c_str());
341 string parentCompositionIdentifier, subcompositionNodeIdentifier;
342 splitCompositionIdentifier(compositionIdentifier, parentCompositionIdentifier, subcompositionNodeIdentifier);
343 unsigned long subcompositionNodeIndex = getNodeIndexForIdentifier(parentCompositionIdentifier, subcompositionNodeIdentifier);
344 return getNodeContext(parentCompositionIdentifier.c_str(), subcompositionNodeIndex);
351 bool VuoNodeRegistry::findCachedInfoForPort(
const map<
string, map<string, T> > &cachedInfoForPort,
const string &compositionIdentifier,
352 const string &portIdentifier,
typename map<string, T>::const_iterator &foundIter)
354 typename map<string, map<string, T> >::const_iterator compIter = cachedInfoForPort.find(compositionIdentifier);
355 if (compIter != cachedInfoForPort.end())
357 foundIter = compIter->second.find(portIdentifier);
358 if (foundIter != compIter->second.end())
370 map<string, void *>::const_iterator foundIter;
371 bool found = findCachedInfoForPort<void *>(dataForPort, compositionIdentifier, portIdentifier, foundIter);
373 return foundIter->second;
375 VUserLog(
"Couldn't find data for port %s", buildCompositionIdentifier(compositionIdentifier, portIdentifier).c_str());
384 map<string, unsigned long>::const_iterator foundIter;
385 bool found = findCachedInfoForPort<unsigned long>(nodeIndexForPort, compositionIdentifier, portIdentifier, foundIter);
387 return foundIter->second;
389 VUserLog(
"Couldn't find node index for port %s", buildCompositionIdentifier(compositionIdentifier, portIdentifier).c_str());
398 map<string, unsigned long>::const_iterator foundIter;
399 bool found = findCachedInfoForPort<unsigned long>(typeIndexForPort, compositionIdentifier, portIdentifier, foundIter);
401 return foundIter->second;
403 VUserLog(
"Couldn't find type index for port %s", buildCompositionIdentifier(compositionIdentifier, portIdentifier).c_str());
410 void VuoNodeRegistry::addPortIdentifier(
const char *compositionIdentifier,
const string &portIdentifier,
411 void *data,
unsigned long nodeIndex,
unsigned long typeIndex)
413 map<string, void *>::const_iterator foundIter;
414 bool found = findCachedInfoForPort<void *>(dataForPort, compositionIdentifier, portIdentifier, foundIter);
416 VUserLog(
"Cache overwritten for port %s", buildCompositionIdentifier(compositionIdentifier, portIdentifier).c_str());
418 dataForPort[compositionIdentifier][portIdentifier] = data;
419 nodeIndexForPort[compositionIdentifier][portIdentifier] = nodeIndex;
420 typeIndexForPort[compositionIdentifier][portIdentifier] = typeIndex;
426 void VuoNodeRegistry::removePortIdentifier(
const char *compositionIdentifier,
const string &portIdentifier)
429 map<string, void *>::const_iterator foundIter;
430 bool found = findCachedInfoForPort<void *>(dataForPort, compositionIdentifier, portIdentifier, foundIter);
433 dataForPort[compositionIdentifier].erase(portIdentifier);
435 if (dataForPort[compositionIdentifier].empty())
436 dataForPort.erase(compositionIdentifier);
439 VUserLog(
"Couldn't find data for port %s", buildCompositionIdentifier(compositionIdentifier, portIdentifier).c_str());
442 map<string, unsigned long>::const_iterator foundIter;
443 bool found = findCachedInfoForPort<unsigned long>(nodeIndexForPort, compositionIdentifier, portIdentifier, foundIter);
446 nodeIndexForPort[compositionIdentifier].erase(portIdentifier);
448 if (nodeIndexForPort[compositionIdentifier].empty())
449 nodeIndexForPort.erase(compositionIdentifier);
452 VUserLog(
"Couldn't find node index for port %s", buildCompositionIdentifier(compositionIdentifier, portIdentifier).c_str());
455 map<string, unsigned long>::const_iterator foundIter;
456 bool found = findCachedInfoForPort<unsigned long>(typeIndexForPort, compositionIdentifier, portIdentifier, foundIter);
459 typeIndexForPort[compositionIdentifier].erase(portIdentifier);
461 if (typeIndexForPort[compositionIdentifier].empty())
462 typeIndexForPort.erase(compositionIdentifier);
465 VUserLog(
"Couldn't find type index for port %s", buildCompositionIdentifier(compositionIdentifier, portIdentifier).c_str());
472 void VuoNodeRegistry::relocatePortIdentifier(
const char *compositionIdentifier,
const string &portIdentifier)
475 map<string, void *>::const_iterator foundIter;
476 bool found = findCachedInfoForPort<void *>(dataForPort, compositionIdentifier, portIdentifier, foundIter);
478 carriedOverDataForPort[compositionIdentifier][portIdentifier] = foundIter->second;
480 VUserLog(
"Couldn't find data for port %s", buildCompositionIdentifier(compositionIdentifier, portIdentifier).c_str());
483 map<string, unsigned long>::const_iterator foundIter;
484 bool found = findCachedInfoForPort<unsigned long>(nodeIndexForPort, compositionIdentifier, portIdentifier, foundIter);
486 carriedOverNodeIndexForPort[compositionIdentifier][portIdentifier] = foundIter->second;
488 VUserLog(
"Couldn't find node index for port %s", buildCompositionIdentifier(compositionIdentifier, portIdentifier).c_str());
491 map<string, unsigned long>::const_iterator foundIter;
492 bool found = findCachedInfoForPort<unsigned long>(typeIndexForPort, compositionIdentifier, portIdentifier, foundIter);
494 carriedOverTypeIndexForPort[compositionIdentifier][portIdentifier] = foundIter->second;
496 VUserLog(
"Couldn't find type index for port %s", buildCompositionIdentifier(compositionIdentifier, portIdentifier).c_str());
499 removePortIdentifier(compositionIdentifier, portIdentifier);
506 void VuoNodeRegistry::carryOverPortIdentifier(
const char *oldCompositionIdentifier,
const char *newCompositionIdentifier,
507 const string &portIdentifier,
unsigned long nodeIndex,
unsigned long typeIndex)
509 map<string, void *>::const_iterator foundIter;
510 bool found = findCachedInfoForPort<void *>(carriedOverDataForPort, oldCompositionIdentifier, portIdentifier, foundIter);
513 VUserLog(
"Couldn't find cache for port %s", buildCompositionIdentifier(oldCompositionIdentifier, portIdentifier).c_str());
517 dataForPort[newCompositionIdentifier][portIdentifier] = carriedOverDataForPort[oldCompositionIdentifier][portIdentifier];
518 nodeIndexForPort[newCompositionIdentifier][portIdentifier] = nodeIndex;
519 typeIndexForPort[newCompositionIdentifier][portIdentifier] = typeIndex;
521 removeCarriedOverPortIdentifier(oldCompositionIdentifier, portIdentifier);
528 void VuoNodeRegistry::carryOverPortIdentifiersForNode(
const char *oldCompositionIdentifier,
const char *newCompositionIdentifier,
529 const string &nodeIdentifier,
unsigned long nodeIndex,
530 const vector<string> &portIdentifiers,
const vector<unsigned long> typeIndexes)
532 for (
size_t j = 0; j < portIdentifiers.size(); ++j)
533 carryOverPortIdentifier(oldCompositionIdentifier, newCompositionIdentifier, portIdentifiers[j], nodeIndex, typeIndexes[j]);
539 void VuoNodeRegistry::removeCarriedOverPortIdentifier(
const char *compositionIdentifier,
const string &oldPortIdentifier)
541 map<string, void *>::const_iterator foundIter;
542 bool found = findCachedInfoForPort<void *>(carriedOverDataForPort, compositionIdentifier, oldPortIdentifier, foundIter);
545 VUserLog(
"Couldn't find cache for port %s", buildCompositionIdentifier(compositionIdentifier, oldPortIdentifier).c_str());
549 carriedOverDataForPort[compositionIdentifier].erase(oldPortIdentifier);
550 carriedOverNodeIndexForPort[compositionIdentifier].erase(oldPortIdentifier);
551 carriedOverTypeIndexForPort[compositionIdentifier].erase(oldPortIdentifier);
553 if (carriedOverDataForPort[compositionIdentifier].empty())
554 carriedOverDataForPort.erase(compositionIdentifier);
555 if (carriedOverNodeIndexForPort[compositionIdentifier].empty())
556 carriedOverNodeIndexForPort.erase(compositionIdentifier);
557 if (carriedOverTypeIndexForPort[compositionIdentifier].empty())
558 carriedOverTypeIndexForPort.erase(compositionIdentifier);
566 void VuoNodeRegistry::carryOverPortData(
const char *oldCompositionIdentifier,
const char *newCompositionIdentifier,
567 const string &oldPortIdentifier,
const string &newPortIdentifier,
PortContext *newPortContext)
569 void *carriedOverData;
571 map<string, void *>::const_iterator foundIter;
572 bool found = findCachedInfoForPort<void *>(carriedOverDataForPort, oldCompositionIdentifier, oldPortIdentifier, foundIter);
575 VUserLog(
"Couldn't find data for carried-over port %s", buildCompositionIdentifier(oldCompositionIdentifier, oldPortIdentifier).c_str());
579 carriedOverData = foundIter->second;
585 map<string, void *>::const_iterator foundIter;
586 bool found = findCachedInfoForPort<void *>(dataForPort, newCompositionIdentifier, newPortIdentifier, foundIter);
589 VUserLog(
"Couldn't find data for port %s", buildCompositionIdentifier(newCompositionIdentifier, newPortIdentifier).c_str());
593 dataForPort[newCompositionIdentifier][newPortIdentifier] = carriedOverData;
604 unsigned long publishedOutputPortCount)
612 addNodeContext(compositionIdentifier, topLevelCompositionIndex, compositionContext);
616 carryOverNodeContext(compositionIdentifier, compositionIdentifier, topLevelCompositionIndex);
619 initContextsForCompositionContents(compositionState);
626 void VuoNodeRegistry::initContextsForCompositionContents(
VuoCompositionState *compositionState)
630 for (
size_t nodeIndex = 0; nodeIndex < nodeMetadatas[compositionIdentifier].size(); ++nodeIndex)
632 NodeMetadata nodeMetadata = nodeMetadatas[compositionIdentifier][nodeIndex];
637 nodeMetadata.identifier.c_str(),
643 NodeContext *nodeContext = nodeMetadata.compositionCreateContextForNode(nodeIndex);
644 addNodeContext(compositionIdentifier, nodeIndex, nodeContext);
647 for (
size_t portIndex = 0; portIndex < nodeMetadata.portMetadatas.size(); ++portIndex)
649 PortMetadata portMetadata = nodeMetadata.portMetadatas[portIndex];
653 addPortIdentifier(compositionIdentifier, portMetadata.identifier, portData, nodeIndex, portMetadata.typeIndex);
656 for (
size_t portIndex = 0; portIndex < nodeMetadata.portMetadatas.size(); ++portIndex)
658 PortMetadata portMetadata = nodeMetadata.portMetadatas[portIndex];
664 string oldNodeIdentifier;
665 string oldPortIdentifier;
670 carryOverPortData(compositionIdentifier, compositionIdentifier, oldPortIdentifier, portMetadata.identifier, portContext);
673 removeCarriedOverPortIdentifier(compositionIdentifier, oldPortIdentifier);
678 nodeMetadata.compositionSetPortValue(compositionState, portMetadata.identifier.c_str(), portMetadata.initialValue.c_str(),
679 false,
false,
false,
false,
true);
686 string oldCompositionIdentifier = compositionIdentifier;
692 nodeContext = carryOverNodeContext(oldCompositionIdentifier.c_str(), compositionIdentifier, nodeIndex);
695 vector<string> portIdentifiers;
696 vector<unsigned long> typeIndexes;
697 for (
size_t portIndex = 0; portIndex < nodeMetadata.portMetadatas.size(); ++portIndex)
699 PortMetadata portMetadata = nodeMetadata.portMetadatas[portIndex];
700 portIdentifiers.push_back(portMetadata.identifier);
701 typeIndexes.push_back(portMetadata.typeIndex);
703 carryOverPortIdentifiersForNode(oldCompositionIdentifier.c_str(), compositionIdentifier, nodeMetadata.identifier, nodeIndex, portIdentifiers, typeIndexes);
709 for (
size_t portIndex = 0; portIndex < nodeMetadata.portMetadatas.size(); ++portIndex)
711 PortMetadata portMetadata = nodeMetadata.portMetadatas[portIndex];
713 string destinationCompositionIdentifier;
714 string destinationPortIdentifier;
716 destinationCompositionIdentifier, destinationPortIdentifier))
718 char *portValue =
getPortValue(compositionState, portMetadata.identifier.c_str(),
false);
720 const NodeMetadata *destinationPortMetadata = getNodeMetadataForPort(destinationCompositionIdentifier.c_str(), destinationPortIdentifier.c_str());
722 destinationPortMetadata->compositionSetPortValue(destinationCompositionState, destinationPortIdentifier.c_str(), portValue,
false,
false,
false,
true,
true);
728 json_object_put(replacementObj);
731 string subcompositionIdentifier = buildCompositionIdentifier(compositionIdentifier, nodeMetadata.identifier);
732 if (nodeMetadatas.find(subcompositionIdentifier) != nodeMetadatas.end())
735 initContextsForCompositionContents(subcompositionState);
755 removeNodeContext(compositionIdentifier, topLevelCompositionIndex);
760 relocateNodeContext(compositionIdentifier, topLevelCompositionIndex);
763 finiContextsForCompositionContents(compositionState);
765 nodeMetadatas.clear();
772 void VuoNodeRegistry::finiContextsForCompositionContents(
VuoCompositionState *compositionState)
776 for (
size_t nodeIndex = 0; nodeIndex < nodeMetadatas[compositionIdentifier].size(); ++nodeIndex)
778 NodeMetadata nodeMetadata = nodeMetadatas[compositionIdentifier][nodeIndex];
782 nodeMetadata.identifier.c_str(),
789 for (
size_t portIndex = 0; portIndex < nodeMetadata.portMetadatas.size(); ++portIndex)
791 PortMetadata portMetadata = nodeMetadata.portMetadatas[portIndex];
795 bool relocated =
false;
805 relocatePortIdentifier(compositionIdentifier, portMetadata.identifier);
811 nodeMetadata.compositionReleasePortData(portData, portMetadata.typeIndex);
818 removePortIdentifier(compositionIdentifier, portMetadata.identifier);
823 removeNodeContext(compositionIdentifier, nodeIndex);
828 for (
size_t portIndex = 0; portIndex < nodeMetadata.portMetadatas.size(); ++portIndex)
831 PortMetadata portMetadata = nodeMetadata.portMetadatas[portIndex];
832 relocatePortIdentifier(compositionIdentifier, portMetadata.identifier);
836 relocateNodeContext(compositionIdentifier, nodeIndex);
839 json_object_put(replacementObj);
841 string subcompositionIdentifier = buildCompositionIdentifier(compositionIdentifier, nodeMetadata.identifier);
842 if (nodeMetadatas.find(subcompositionIdentifier) != nodeMetadatas.end())
846 finiContextsForCompositionContents(subcompositionState);
860 const NodeMetadata *nm = getNodeMetadataForPort(compositionState->
compositionIdentifier, portIdentifier);
864 nm->compositionSetPortValue(compositionState, portIdentifier, valueAsString,
true,
true,
true,
true,
true);
875 const NodeMetadata *nm = getNodeMetadataForPort(compositionState->
compositionIdentifier, portIdentifier);
879 return nm->compositionGetPortValue(compositionState, portIdentifier, shouldUseInterprocessSerialization ? 2 : 1,
true);
890 const NodeMetadata *nm = getNodeMetadataForPort(compositionState->
compositionIdentifier, portIdentifier);
894 return nm->compositionGetPortValue(compositionState, portIdentifier, 0,
true);
905 const NodeMetadata *nm = getNodeMetadataForPort(compositionState->
compositionIdentifier, portIdentifier);
909 nm->compositionFireTriggerPortEvent(compositionState, portIdentifier);
915 void VuoNodeRegistry::print(
void)
917 const char *indent =
" ";
920 oss <<
"=== node metadatas ===" << endl << endl;
921 for (map<
string, vector<NodeMetadata> >::iterator i = nodeMetadatas.begin(); i != nodeMetadatas.end(); ++i)
923 oss << indent << i->first << endl;
924 for (
size_t j = 0; j < i->second.size(); ++j)
925 oss << indent << indent << j <<
" " << i->second[j].identifier <<
", " << i->second[j].portMetadatas.size() <<
" ports" << endl;
929 oss <<
"=== node contexts ===" << endl << endl;
930 for (map<
unsigned long, map<unsigned long, NodeContext *> >::iterator i = nodeContextForIndex.begin(); i != nodeContextForIndex.end(); ++i)
932 string compositionIdentifier = getCompositionIdentifierForHash(i->first);
933 oss << indent << compositionIdentifier << endl;
934 for (map<unsigned long, NodeContext *>::iterator j = i->second.begin(); j != i->second.end(); ++j)
935 oss << indent << indent << getNodeIdentifierForIndex(compositionIdentifier.c_str(), j->first) <<
" " << j->second << endl;
939 oss <<
"=== carried-over node contexts ===" << endl << endl;
940 for (map<
string, map<string, NodeContext *> >::iterator i = carriedOverNodeContextForIdentifier.begin(); i != carriedOverNodeContextForIdentifier.end(); ++i)
942 oss << indent << i->first << endl;
943 for (map<string, NodeContext *>::iterator j = i->second.begin(); j != i->second.end(); ++j)
944 oss << indent << indent << j->first <<
" " << j->second << endl;
948 oss <<
"=== cached ports ===" << endl << endl;
949 for (map<
string, map<string, void *> >::iterator i = dataForPort.begin(); i != dataForPort.end(); ++i)
951 oss << indent << i->first << endl;
952 for (map<string, void *>::iterator j = i->second.begin(); j != i->second.end(); ++j)
953 oss << indent << indent << j->first <<
" " << j->second << endl;
957 oss <<
"=== carried-over cached ports ===" << endl << endl;
958 for (map<
string, map<string, void *> >::iterator i = carriedOverDataForPort.begin(); i != carriedOverDataForPort.end(); ++i)
960 oss << indent << i->first << endl;
961 for (map<string, void *>::iterator j = i->second.begin(); j != i->second.end(); ++j)
962 oss << indent << indent << j->first <<
" " << j->second << endl;
966 VUserLog(
"\n%s", oss.str().c_str());
978 NodeContext *(*compositionCreateContextForNode)(
unsigned long),
979 void (*compositionSetPortValue)(
VuoCompositionState *,
const char *,
const char *,
bool,
bool,
bool,
bool,
bool),
982 void (*compositionReleasePortData)(
void *,
unsigned long))
987 compositionCreateContextForNode, compositionSetPortValue,
988 compositionGetPortValue, compositionFireTriggerPortEvent,
989 compositionReleasePortData);
996 unsigned long typeIndex,
const char *initialValue)