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, dispatch_semaphore_t>::const_iterator foundIter;
385 bool found = findCachedInfoForPort<dispatch_semaphore_t>(nodeSemaphoreForPort, compositionIdentifier, portIdentifier, foundIter);
387 return foundIter->second;
389 VUserLog(
"Couldn't find node semaphore for port %s", buildCompositionIdentifier(compositionIdentifier, portIdentifier).c_str());
398 map<string, unsigned long>::const_iterator foundIter;
399 bool found = findCachedInfoForPort<unsigned long>(nodeIndexForPort, compositionIdentifier, portIdentifier, foundIter);
401 return foundIter->second;
403 VUserLog(
"Couldn't find node index for port %s", buildCompositionIdentifier(compositionIdentifier, portIdentifier).c_str());
412 map<string, unsigned long>::const_iterator foundIter;
413 bool found = findCachedInfoForPort<unsigned long>(typeIndexForPort, compositionIdentifier, portIdentifier, foundIter);
415 return foundIter->second;
417 VUserLog(
"Couldn't find type index for port %s", buildCompositionIdentifier(compositionIdentifier, portIdentifier).c_str());
424 void VuoNodeRegistry::addPortIdentifier(
const char *compositionIdentifier,
const string &portIdentifier,
425 void *data, dispatch_semaphore_t nodeSemaphore,
unsigned long nodeIndex,
unsigned long typeIndex)
427 map<string, void *>::const_iterator foundIter;
428 bool found = findCachedInfoForPort<void *>(dataForPort, compositionIdentifier, portIdentifier, foundIter);
430 VUserLog(
"Cache overwritten for port %s", buildCompositionIdentifier(compositionIdentifier, portIdentifier).c_str());
432 dataForPort[compositionIdentifier][portIdentifier] = data;
433 nodeSemaphoreForPort[compositionIdentifier][portIdentifier] = nodeSemaphore;
434 nodeIndexForPort[compositionIdentifier][portIdentifier] = nodeIndex;
435 typeIndexForPort[compositionIdentifier][portIdentifier] = typeIndex;
441 void VuoNodeRegistry::removePortIdentifier(
const char *compositionIdentifier,
const string &portIdentifier)
444 map<string, void *>::const_iterator foundIter;
445 bool found = findCachedInfoForPort<void *>(dataForPort, compositionIdentifier, portIdentifier, foundIter);
448 dataForPort[compositionIdentifier].erase(portIdentifier);
450 if (dataForPort[compositionIdentifier].empty())
451 dataForPort.erase(compositionIdentifier);
454 VUserLog(
"Couldn't find data for port %s", buildCompositionIdentifier(compositionIdentifier, portIdentifier).c_str());
457 map<string, dispatch_semaphore_t>::const_iterator foundIter;
458 bool found = findCachedInfoForPort<dispatch_semaphore_t>(nodeSemaphoreForPort, compositionIdentifier, portIdentifier, foundIter);
461 nodeSemaphoreForPort[compositionIdentifier].erase(portIdentifier);
463 if (nodeSemaphoreForPort[compositionIdentifier].empty())
464 nodeSemaphoreForPort.erase(compositionIdentifier);
467 VUserLog(
"Couldn't find node semaphore for port %s", buildCompositionIdentifier(compositionIdentifier, portIdentifier).c_str());
470 map<string, unsigned long>::const_iterator foundIter;
471 bool found = findCachedInfoForPort<unsigned long>(nodeIndexForPort, compositionIdentifier, portIdentifier, foundIter);
474 nodeIndexForPort[compositionIdentifier].erase(portIdentifier);
476 if (nodeIndexForPort[compositionIdentifier].empty())
477 nodeIndexForPort.erase(compositionIdentifier);
480 VUserLog(
"Couldn't find node index for port %s", buildCompositionIdentifier(compositionIdentifier, portIdentifier).c_str());
483 map<string, unsigned long>::const_iterator foundIter;
484 bool found = findCachedInfoForPort<unsigned long>(typeIndexForPort, compositionIdentifier, portIdentifier, foundIter);
487 typeIndexForPort[compositionIdentifier].erase(portIdentifier);
489 if (typeIndexForPort[compositionIdentifier].empty())
490 typeIndexForPort.erase(compositionIdentifier);
493 VUserLog(
"Couldn't find type index for port %s", buildCompositionIdentifier(compositionIdentifier, portIdentifier).c_str());
500 void VuoNodeRegistry::relocatePortIdentifier(
const char *compositionIdentifier,
const string &portIdentifier)
503 map<string, void *>::const_iterator foundIter;
504 bool found = findCachedInfoForPort<void *>(dataForPort, compositionIdentifier, portIdentifier, foundIter);
506 carriedOverDataForPort[compositionIdentifier][portIdentifier] = foundIter->second;
508 VUserLog(
"Couldn't find data for port %s", buildCompositionIdentifier(compositionIdentifier, portIdentifier).c_str());
511 map<string, dispatch_semaphore_t>::const_iterator foundIter;
512 bool found = findCachedInfoForPort<dispatch_semaphore_t>(nodeSemaphoreForPort, compositionIdentifier, portIdentifier, foundIter);
514 carriedOverNodeSemaphoreForPort[compositionIdentifier][portIdentifier] = foundIter->second;
516 VUserLog(
"Couldn't find node semaphore for port %s", buildCompositionIdentifier(compositionIdentifier, portIdentifier).c_str());
519 map<string, unsigned long>::const_iterator foundIter;
520 bool found = findCachedInfoForPort<unsigned long>(nodeIndexForPort, compositionIdentifier, portIdentifier, foundIter);
522 carriedOverNodeIndexForPort[compositionIdentifier][portIdentifier] = foundIter->second;
524 VUserLog(
"Couldn't find node index for port %s", buildCompositionIdentifier(compositionIdentifier, portIdentifier).c_str());
527 map<string, unsigned long>::const_iterator foundIter;
528 bool found = findCachedInfoForPort<unsigned long>(typeIndexForPort, compositionIdentifier, portIdentifier, foundIter);
530 carriedOverTypeIndexForPort[compositionIdentifier][portIdentifier] = foundIter->second;
532 VUserLog(
"Couldn't find type index for port %s", buildCompositionIdentifier(compositionIdentifier, portIdentifier).c_str());
535 removePortIdentifier(compositionIdentifier, portIdentifier);
542 void VuoNodeRegistry::carryOverPortIdentifier(
const char *oldCompositionIdentifier,
const char *newCompositionIdentifier,
543 const string &portIdentifier,
unsigned long nodeIndex,
unsigned long typeIndex)
545 map<string, void *>::const_iterator foundIter;
546 bool found = findCachedInfoForPort<void *>(carriedOverDataForPort, oldCompositionIdentifier, portIdentifier, foundIter);
549 VUserLog(
"Couldn't find cache for port %s", buildCompositionIdentifier(oldCompositionIdentifier, portIdentifier).c_str());
553 dataForPort[newCompositionIdentifier][portIdentifier] = carriedOverDataForPort[oldCompositionIdentifier][portIdentifier];
554 nodeSemaphoreForPort[newCompositionIdentifier][portIdentifier] = carriedOverNodeSemaphoreForPort[oldCompositionIdentifier][portIdentifier];
555 nodeIndexForPort[newCompositionIdentifier][portIdentifier] = nodeIndex;
556 typeIndexForPort[newCompositionIdentifier][portIdentifier] = typeIndex;
558 removeCarriedOverPortIdentifier(oldCompositionIdentifier, portIdentifier);
565 void VuoNodeRegistry::carryOverPortIdentifiersForNode(
const char *oldCompositionIdentifier,
const char *newCompositionIdentifier,
566 const string &nodeIdentifier,
unsigned long nodeIndex,
567 const vector<string> &portIdentifiers,
const vector<unsigned long> typeIndexes)
569 for (
size_t j = 0; j < portIdentifiers.size(); ++j)
570 carryOverPortIdentifier(oldCompositionIdentifier, newCompositionIdentifier, portIdentifiers[j], nodeIndex, typeIndexes[j]);
576 void VuoNodeRegistry::removeCarriedOverPortIdentifier(
const char *compositionIdentifier,
const string &oldPortIdentifier)
578 map<string, void *>::const_iterator foundIter;
579 bool found = findCachedInfoForPort<void *>(carriedOverDataForPort, compositionIdentifier, oldPortIdentifier, foundIter);
582 VUserLog(
"Couldn't find cache for port %s", buildCompositionIdentifier(compositionIdentifier, oldPortIdentifier).c_str());
586 carriedOverDataForPort[compositionIdentifier].erase(oldPortIdentifier);
587 carriedOverNodeSemaphoreForPort[compositionIdentifier].erase(oldPortIdentifier);
588 carriedOverNodeIndexForPort[compositionIdentifier].erase(oldPortIdentifier);
589 carriedOverTypeIndexForPort[compositionIdentifier].erase(oldPortIdentifier);
591 if (carriedOverDataForPort[compositionIdentifier].empty())
592 carriedOverDataForPort.erase(compositionIdentifier);
593 if (carriedOverNodeSemaphoreForPort[compositionIdentifier].empty())
594 carriedOverNodeSemaphoreForPort.erase(compositionIdentifier);
595 if (carriedOverNodeIndexForPort[compositionIdentifier].empty())
596 carriedOverNodeIndexForPort.erase(compositionIdentifier);
597 if (carriedOverTypeIndexForPort[compositionIdentifier].empty())
598 carriedOverTypeIndexForPort.erase(compositionIdentifier);
606 void VuoNodeRegistry::carryOverPortData(
const char *oldCompositionIdentifier,
const char *newCompositionIdentifier,
607 const string &oldPortIdentifier,
const string &newPortIdentifier,
PortContext *newPortContext)
609 void *carriedOverData;
611 map<string, void *>::const_iterator foundIter;
612 bool found = findCachedInfoForPort<void *>(carriedOverDataForPort, oldCompositionIdentifier, oldPortIdentifier, foundIter);
615 VUserLog(
"Couldn't find data for carried-over port %s", buildCompositionIdentifier(oldCompositionIdentifier, oldPortIdentifier).c_str());
619 carriedOverData = foundIter->second;
625 map<string, void *>::const_iterator foundIter;
626 bool found = findCachedInfoForPort<void *>(dataForPort, newCompositionIdentifier, newPortIdentifier, foundIter);
629 VUserLog(
"Couldn't find data for port %s", buildCompositionIdentifier(newCompositionIdentifier, newPortIdentifier).c_str());
633 dataForPort[newCompositionIdentifier][newPortIdentifier] = carriedOverData;
644 unsigned long publishedOutputPortCount)
652 addNodeContext(compositionIdentifier, topLevelCompositionIndex, compositionContext);
656 carryOverNodeContext(compositionIdentifier, compositionIdentifier, topLevelCompositionIndex);
659 initContextsForCompositionContents(compositionState);
666 void VuoNodeRegistry::initContextsForCompositionContents(
VuoCompositionState *compositionState)
670 for (
size_t nodeIndex = 0; nodeIndex < nodeMetadatas[compositionIdentifier].size(); ++nodeIndex)
672 NodeMetadata nodeMetadata = nodeMetadatas[compositionIdentifier][nodeIndex];
677 nodeMetadata.identifier.c_str(),
683 NodeContext *nodeContext = nodeMetadata.compositionCreateContextForNode(nodeIndex);
684 addNodeContext(compositionIdentifier, nodeIndex, nodeContext);
688 for (
size_t portIndex = 0; portIndex < nodeMetadata.portMetadatas.size(); ++portIndex)
690 PortMetadata portMetadata = nodeMetadata.portMetadatas[portIndex];
694 addPortIdentifier(compositionIdentifier, portMetadata.identifier, portData, nodeSemaphore, nodeIndex, portMetadata.typeIndex);
697 for (
size_t portIndex = 0; portIndex < nodeMetadata.portMetadatas.size(); ++portIndex)
699 PortMetadata portMetadata = nodeMetadata.portMetadatas[portIndex];
705 string oldNodeIdentifier;
706 string oldPortIdentifier;
711 carryOverPortData(compositionIdentifier, compositionIdentifier, oldPortIdentifier, portMetadata.identifier, portContext);
714 removeCarriedOverPortIdentifier(compositionIdentifier, oldPortIdentifier);
719 nodeMetadata.compositionSetPortValue(compositionState, portMetadata.identifier.c_str(), portMetadata.initialValue.c_str(),
720 false,
false,
false,
false,
true);
727 string oldCompositionIdentifier = compositionIdentifier;
733 nodeContext = carryOverNodeContext(oldCompositionIdentifier.c_str(), compositionIdentifier, nodeIndex);
736 vector<string> portIdentifiers;
737 vector<unsigned long> typeIndexes;
738 for (
size_t portIndex = 0; portIndex < nodeMetadata.portMetadatas.size(); ++portIndex)
740 PortMetadata portMetadata = nodeMetadata.portMetadatas[portIndex];
741 portIdentifiers.push_back(portMetadata.identifier);
742 typeIndexes.push_back(portMetadata.typeIndex);
744 carryOverPortIdentifiersForNode(oldCompositionIdentifier.c_str(), compositionIdentifier, nodeMetadata.identifier, nodeIndex, portIdentifiers, typeIndexes);
750 for (
size_t portIndex = 0; portIndex < nodeMetadata.portMetadatas.size(); ++portIndex)
752 PortMetadata portMetadata = nodeMetadata.portMetadatas[portIndex];
754 string destinationCompositionIdentifier;
755 string destinationPortIdentifier;
757 destinationCompositionIdentifier, destinationPortIdentifier))
759 char *portValue =
getPortValue(compositionState, portMetadata.identifier.c_str(),
false);
761 const NodeMetadata *destinationPortMetadata = getNodeMetadataForPort(destinationCompositionIdentifier.c_str(), destinationPortIdentifier.c_str());
763 destinationPortMetadata->compositionSetPortValue(destinationCompositionState, destinationPortIdentifier.c_str(), portValue,
false,
false,
false,
true,
true);
769 json_object_put(replacementObj);
772 string subcompositionIdentifier = buildCompositionIdentifier(compositionIdentifier, nodeMetadata.identifier);
773 if (nodeMetadatas.find(subcompositionIdentifier) != nodeMetadatas.end())
776 initContextsForCompositionContents(subcompositionState);
796 removeNodeContext(compositionIdentifier, topLevelCompositionIndex);
801 relocateNodeContext(compositionIdentifier, topLevelCompositionIndex);
804 finiContextsForCompositionContents(compositionState);
806 nodeMetadatas.clear();
813 void VuoNodeRegistry::finiContextsForCompositionContents(
VuoCompositionState *compositionState)
817 for (
size_t nodeIndex = 0; nodeIndex < nodeMetadatas[compositionIdentifier].size(); ++nodeIndex)
819 NodeMetadata nodeMetadata = nodeMetadatas[compositionIdentifier][nodeIndex];
823 nodeMetadata.identifier.c_str(),
830 for (
size_t portIndex = 0; portIndex < nodeMetadata.portMetadatas.size(); ++portIndex)
832 PortMetadata portMetadata = nodeMetadata.portMetadatas[portIndex];
836 bool relocated =
false;
846 relocatePortIdentifier(compositionIdentifier, portMetadata.identifier);
852 nodeMetadata.compositionReleasePortData(portData, portMetadata.typeIndex);
859 removePortIdentifier(compositionIdentifier, portMetadata.identifier);
864 removeNodeContext(compositionIdentifier, nodeIndex);
869 for (
size_t portIndex = 0; portIndex < nodeMetadata.portMetadatas.size(); ++portIndex)
872 PortMetadata portMetadata = nodeMetadata.portMetadatas[portIndex];
873 relocatePortIdentifier(compositionIdentifier, portMetadata.identifier);
877 relocateNodeContext(compositionIdentifier, nodeIndex);
880 json_object_put(replacementObj);
882 string subcompositionIdentifier = buildCompositionIdentifier(compositionIdentifier, nodeMetadata.identifier);
883 if (nodeMetadatas.find(subcompositionIdentifier) != nodeMetadatas.end())
887 finiContextsForCompositionContents(subcompositionState);
901 const NodeMetadata *nm = getNodeMetadataForPort(compositionState->
compositionIdentifier, portIdentifier);
905 nm->compositionSetPortValue(compositionState, portIdentifier, valueAsString,
true,
true,
true,
true,
true);
916 const NodeMetadata *nm = getNodeMetadataForPort(compositionState->
compositionIdentifier, portIdentifier);
920 return nm->compositionGetPortValue(compositionState, portIdentifier, shouldUseInterprocessSerialization ? 2 : 1,
true);
931 const NodeMetadata *nm = getNodeMetadataForPort(compositionState->
compositionIdentifier, portIdentifier);
935 return nm->compositionGetPortValue(compositionState, portIdentifier, 0,
true);
946 const NodeMetadata *nm = getNodeMetadataForPort(compositionState->
compositionIdentifier, portIdentifier);
950 nm->compositionFireTriggerPortEvent(compositionState, portIdentifier);
956 void VuoNodeRegistry::print(
void)
958 const char *indent =
" ";
960 printf(
"=== node metadatas ===\n\n");
961 for (map<
string, vector<NodeMetadata> >::iterator i = nodeMetadatas.begin(); i != nodeMetadatas.end(); ++i)
963 printf(
"%s%s\n", indent, i->first.c_str());
964 for (
size_t j = 0; j < i->second.size(); ++j)
965 printf(
"%s%s%lu %s, %lu ports\n", indent, indent, j, i->second[j].identifier.c_str(), i->second[j].portMetadatas.size());
969 printf(
"=== node contexts ===\n\n");
970 for (map<
unsigned long, map<unsigned long, NodeContext *> >::iterator i = nodeContextForIndex.begin(); i != nodeContextForIndex.end(); ++i)
972 string compositionIdentifier = getCompositionIdentifierForHash(i->first);
973 printf(
"%s%s\n", indent, compositionIdentifier.c_str());
974 for (map<unsigned long, NodeContext *>::iterator j = i->second.begin(); j != i->second.end(); ++j)
975 printf(
"%s%s%s %p\n", indent, indent, getNodeIdentifierForIndex(compositionIdentifier.c_str(), j->first).c_str(), j->second);
979 printf(
"=== carried-over node contexts ===\n\n");
980 for (map<
string, map<string, NodeContext *> >::iterator i = carriedOverNodeContextForIdentifier.begin(); i != carriedOverNodeContextForIdentifier.end(); ++i)
982 printf(
"%s%s\n", indent, i->first.c_str());
983 for (map<string, NodeContext *>::iterator j = i->second.begin(); j != i->second.end(); ++j)
984 printf(
"%s%s%s %p\n", indent, indent, j->first.c_str(), j->second);
988 printf(
"=== cached ports ===\n\n");
989 for (map<
string, map<string, void *> >::iterator i = dataForPort.begin(); i != dataForPort.end(); ++i)
991 printf(
"%s%s\n", indent, i->first.c_str());
992 for (map<string, void *>::iterator j = i->second.begin(); j != i->second.end(); ++j)
993 printf(
"%s%s%s %p\n", indent, indent, j->first.c_str(), j->second);
997 printf(
"=== carried-over cached ports ===\n\n");
998 for (map<
string, map<string, void *> >::iterator i = carriedOverDataForPort.begin(); i != carriedOverDataForPort.end(); ++i)
1000 printf(
"%s%s\n", indent, i->first.c_str());
1001 for (map<string, void *>::iterator j = i->second.begin(); j != i->second.end(); ++j)
1002 printf(
"%s%s%s %p\n", indent, indent, j->first.c_str(), j->second);
1016 NodeContext *(*compositionCreateContextForNode)(
unsigned long),
1017 void (*compositionSetPortValue)(
VuoCompositionState *,
const char *,
const char *,
bool,
bool,
bool,
bool,
bool),
1020 void (*compositionReleasePortData)(
void *,
unsigned long))
1025 compositionCreateContextForNode, compositionSetPortValue,
1026 compositionGetPortValue, compositionFireTriggerPortEvent,
1027 compositionReleasePortData);
1034 unsigned long typeIndex,
const char *initialValue)