/// <summary> /// Resolves the reference. /// </summary> /// <param name = "reference">The reference.</param> /// <returns></returns> public IIBItem ResolveReference(IBReference reference) { if (this.references.ContainsKey(reference.Value)) { return this.references[reference.Value]; } return null; }
protected override void OnPropertyDeserialized (string name, object value) { if (name == "label") Label = (string) value; else if (name == "source") Source = (IBReference) value; else if (name == "destination") Destination = (IBReference) value; else base.OnPropertyDeserialized (name, value); }
static object ResolveIfReference(object o) { IBReference r = o as IBReference; if (r != null) { return(ResolveIfReference(r.Reference)); } else { return(o); } }
/// <summary> /// Visits the specified item. /// </summary> /// <param Name = "item">The item.</param> public void Visit(IBReference item) { }
public void Add (IBReference reference) { unresolvedReferences.Add (reference); }
static object DeserializeInner (XElement element, Dictionary<string, Func<IBObject>> constructors, IReferenceResolver resolver) { switch (element.Name.ToString ()) { case "int": return Int32.Parse (element.Value); case "integer": return Int32.Parse (element.Attribute ("value").Value); case "nil": return null; case "string": XAttribute typeAtt = element.Attribute ("type"); if (typeAtt != null) { switch (typeAtt.Value) { case "base64-UTF8": //FIXME: figure out the encoding they're using. why do we have to remove the last char to make it decode? string s = element.Value.Replace ("\n", "").Replace ("\r", ""); int last = (s.Length / 4 ) * 4; return Encoding.UTF8.GetString (Convert.FromBase64String (s.Substring (0, last))); default: throw new Exception (String.Format ("Unknown string encoding type {0}", typeAtt.Value)); } } return element.Value; case "characters": return element.Value; case "bool": return element.Value == "YES"; case "boolean": return element.Attribute ("value").Value == "YES"; case "double": return Double.Parse (element.Value); case "float": return float.Parse (element.Value); case "real": return float.Parse (element.Attribute ("value").Value); case "bytes": //FIXME: figure out the encoding they're using. it's not straight base 64 return new AppleEvilByteArrayEncoding (element.Value); case "reference": var refAtt = element.Attribute ("ref"); IBReference xibRef; if (refAtt != null) { xibRef = new IBReference (Int32.Parse (refAtt.Value)); resolver.Add (xibRef); } else { //FIXME: handle null references more robustly xibRef = new IBReference (Int32.MinValue); } return xibRef; case "object": string className = element.Attribute ("class").Value; Func<IBObject> constructor; IBObject obj; if (constructors.TryGetValue (className, out constructor)) obj = constructor (); else obj = new UnknownIBObject (className); return obj; default: throw new Exception (String.Format ("Cannot handle primitive type {0}", element.Name)); } }
/// <summary> /// Visits the specified item. /// </summary> /// <param Name = "item">The item.</param> public void Visit(IBReference item) { Console.WriteLine(item.ToString()); }