47 string VuoCompositionDiff::joinPortIdentifier(
const string &nodeIdentifier,
const string &portName)
49 return nodeIdentifier +
":" + portName;
55 string VuoCompositionDiff::convertIdentifierToPath(
const char *compositionIdentifier,
const char *nodeIdentifier)
57 return string(compositionIdentifier) +
"/" + nodeIdentifier;
63 void VuoCompositionDiff::convertPathToIdentifier(
const char *nodePath,
string &compositionIdentifier,
string &nodeIdentifier)
65 string nodePathStr = nodePath;
66 size_t pos = nodePathStr.rfind(
"/");
67 if (pos == string::npos)
70 compositionIdentifier = nodePathStr.substr(0, pos);
71 nodeIdentifier = nodePathStr.substr(pos+1);
90 VUserLog(
"Couldn't parse the composition diff: %s", diff);
94 string nodePath = convertIdentifierToPath(compositionIdentifier, nodeIdentifier);
96 set<string> keysFound;
97 int numChanges = json_object_array_length(diffJson);
98 for (
int i = 0; i < numChanges; ++i)
100 json_object *change = json_object_array_get_idx(diffJson, i);
101 json_object_object_foreach(change, key, val)
103 if (! strcmp(nodePath.c_str(), json_object_get_string(val)))
105 keysFound.insert(key);
107 if (! strcmp(key,
"replace") || ! strcmp(key,
"with") || ! strcmp(key,
"move") || ! strcmp(key,
"to"))
109 json_object_get(change);
110 *replacementObj = change;
116 json_object_put(diffJson);
118 if (keysFound.find(
"add") != keysFound.end())
120 else if (keysFound.find(
"remove") != keysFound.end())
122 else if (keysFound.find(
"replace") != keysFound.end() || keysFound.find(
"with") != keysFound.end())
124 else if (keysFound.find(
"move") != keysFound.end() || keysFound.find(
"to") != keysFound.end())
139 enum ChangeType changeType =
findNode(compositionIdentifier, nodeIdentifier, replacementObj);
152 enum ChangeType changeType =
findNode(compositionIdentifier, nodeIdentifier, replacementObj);
164 if (json_object_object_get_ex(replacementObj,
"ports", &o))
165 portMappingArray = o;
167 if (! portMappingArray)
170 int numPortMappings = json_object_array_length(portMappingArray);
171 for (
int i = 0; i < numPortMappings; ++i)
173 json_object *portMapping = json_object_array_get_idx(portMappingArray, i);
176 if (json_object_object_get_ex(portMapping,
"map", &o) && ! strcmp(json_object_get_string(o), portName))
187 string &oldNodeIdentifier,
string &oldPortIdentifier)
193 if (json_object_object_get_ex(replacementObj,
"replace", &o))
195 const char *oldNodePath = json_object_get_string(o);
196 string oldCompositionIdentifier;
197 convertPathToIdentifier(oldNodePath, oldCompositionIdentifier, oldNodeIdentifier);
200 if (json_object_object_get_ex(replacementObj,
"ports", &o))
201 portMappingArray = o;
203 if (! portMappingArray)
207 bool foundPort =
false;
208 int numPortMappings = json_object_array_length(portMappingArray);
209 for (
int i = 0; i < numPortMappings; ++i)
211 json_object *portMapping = json_object_array_get_idx(portMappingArray, i);
214 if (json_object_object_get_ex(portMapping,
"to", &o) && ! strcmp(json_object_get_string(o), portName))
216 if (json_object_object_get_ex(portMapping,
"map", &o))
217 oldPortName = json_object_get_string(o);
226 oldPortIdentifier = joinPortIdentifier(oldNodeIdentifier, oldPortName);
234 string &oldCompositionIdentifier)
240 if (json_object_object_get_ex(replacementObj,
"move", &o))
241 moveFrom = json_object_get_string(o);
243 if (json_object_object_get_ex(replacementObj,
"to", &o))
244 moveTo = json_object_get_string(o);
246 if (moveTo == convertIdentifierToPath(newCompositionIdentifier, nodeIdentifier))
249 convertPathToIdentifier(moveFrom.c_str(), oldCompositionIdentifier, unused);
260 string &destinationCompositionIdentifier,
string &destinationPortIdentifier)
265 if (json_object_object_get_ex(replacementObj,
"ports", &o))
266 portMappingArray = o;
268 if (! portMappingArray)
271 int numPortMappings = json_object_array_length(portMappingArray);
272 for (
int i = 0; i < numPortMappings; ++i)
274 json_object *portMapping = json_object_array_get_idx(portMappingArray, i);
277 if (json_object_object_get_ex(portMapping,
"copy", &o) && ! strcmp(json_object_get_string(o), portName))
279 if (json_object_object_get_ex(portMapping,
"to", &o))
281 const char *destinationPortPath = json_object_get_string(o);
282 convertPathToIdentifier(destinationPortPath, destinationCompositionIdentifier, destinationPortIdentifier);
319 nodeIdentifier, replacementObj);
329 nodeIdentifier, replacementObj);