private void childChanged(string key, ChangeSet data) { var obj = innerDictionary[key]; //todo: massive hack if (obj is IList <object> ) { data["type"] = new ChangeSetLeaf("Array"); } else { data["type"] = new ChangeSetLeaf("Object"); } mapSnapshotToObject(obj, data); }
private void ProcessInput(Responses.Response response) { //todo: process the input to ensure message re-sending //Console.WriteLine(data); if (response.Data.Action != null) { ChangeSet changeset = null; if (response.Data.Action == "d") { //the data here comes as an object JToken token = response.Data.Payload.Data as JToken; if (token == null) { changeset = new ChangeSetLeaf(response.Data.Payload.Data); } else { changeset = ChangeSet.FromJToken(token); } } else if (response.Data.Action == "m") { //the data here comes as a dictionary of path,value JToken token = response.Data.Payload.Data as JToken; changeset = ChangeSet.FromFlatJToken(token); } else { } //ensure that the changset is not mine. Dictionary <string, object> flattennedChangeset = changeset.Flatten(); //top of the queue should be the next message if it is mine. Dictionary <string, object> current = null; if (unconfirmedChangesets.TryPeek(out current)) { if (flattennedChangeset.All(kvp => current.ContainsKey(kvp.Key) && current[kvp.Key].Equals(kvp.Value))) { //My topmost unconfirmed changeset, did this exact modification, this should indicate that it is my echo // Console.WriteLine("Echo received"); } else { //now, what if this is not an echo, and invalidates any changeset that has not been commited yet? var conflicts = unconfirmedChangesets.Where(unconfirmed => flattennedChangeset.Any(kvp => unconfirmed.ContainsKey(kvp.Key) && unconfirmed[kvp.Key] == kvp.Value)); if (conflicts.Count() > 0) { //i have no idea what to do here Console.WriteLine("Collision detected"); } } } else { //no unconfirmed messages, i think mergeToLocalCache(response.Data.Payload.Path, changeset); handleCallbacks(response.Data.Payload.Path, changeset); } } }