public override void FromAMF(FluorineFx.ASObject obj) { base.FromAMF(obj); if (obj.ContainsKey("giftSenderId")) _giftable = true; }
public virtual void FromAMF(FluorineFx.ASObject obj) { _fromObject = obj; Type objType = this.GetType(); List<FieldInfo> memberInfo = new List<FieldInfo>(); Type t = objType; if (!_fieldCache.ContainsKey(objType)) { while (t != typeof(AMFObject)) { memberInfo.AddRange(t.GetFields(BindingFlags.Instance | BindingFlags.NonPublic)); t = t.BaseType; } _fieldCache.Add(objType,memberInfo); } else memberInfo = _fieldCache[objType]; foreach (FieldInfo info in memberInfo) { object[] customAttributes; if (!_attributeCache.ContainsKey(info)) { customAttributes = info.GetCustomAttributes(true); _attributeCache.Add(info, customAttributes); } else customAttributes = _attributeCache[info]; try { foreach (object attr in customAttributes) { if (attr is AMFAttribute) { AMFAttribute attribute = attr as AMFAttribute; if (!obj.ContainsKey(attribute.Tag)) info.SetValue(this, null); else if (info.FieldType == typeof(string)) { info.SetValue(this, (string)obj[attribute.Tag]); } else if (info.FieldType == typeof(int?)) { info.SetValue(this, (int?)obj[attribute.Tag]); } else if (info.FieldType == typeof(float?)) { info.SetValue(this, (float?)obj[attribute.Tag]); } else if (info.FieldType == typeof(double?)) { if (obj[attribute.Tag] is double) info.SetValue(this, (double?)obj[attribute.Tag]); else if (obj[attribute.Tag] is int) info.SetValue(this, (double?)(int?)obj[attribute.Tag]); } else if (info.FieldType == typeof(bool?)) { info.SetValue(this, (bool?)obj[attribute.Tag]); } } else if (attr is AMFArrayAttribute) { AMFArrayAttribute attribute = attr as AMFArrayAttribute; if (attribute.ArrayType == typeof(string)) { List<string> array = new List<string>(); foreach (object aobj in (object[])obj[attribute.Tag]) array.Add((string)aobj); info.SetValue(this, array); } else if (attribute.ArrayType.IsSubclassOf(typeof(AMFObject))) { object list = info.FieldType.InvokeMember("", BindingFlags.CreateInstance, null, null, null); if (obj[attribute.Tag] != null) { foreach (object aobj in (object[])obj[attribute.Tag]) { FluorineFx.ASObject asobj = aobj as FluorineFx.ASObject; AMFObject amfobj = (AMFObject)attribute.ArrayType.InvokeMember("", BindingFlags.CreateInstance, null, null, null); amfobj.FromAMF(asobj); list.GetType().InvokeMember("Add", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod, null, list, new object[] { amfobj }); } } info.SetValue(this, list); } } else if (attr is AMFTypedObjectArrayAttribute) { AMFTypedObjectArrayAttribute attribute = attr as AMFTypedObjectArrayAttribute; object list = info.FieldType.InvokeMember("", BindingFlags.CreateInstance, null, null, null); foreach (object aobj in (object[])obj[attribute.Tag]) { FluorineFx.ASObject asobj = aobj as FluorineFx.ASObject; System.Text.RegularExpressions.Match match = System.Text.RegularExpressions.Regex.Match(asobj.TypeName, @"var.www.releases.release-([0-9]+)-([0-9]+)-([0-9]+).([0-9]+).includes.([A-Za-z0-9\-]+).class"); AMFObject amfobj = ObjectBuilder.Instance.BuildObject(match.Groups[5].Value, asobj); //AMFObject amfobj = (AMFObject)attribute.BaseType.InvokeMember("", BindingFlags.CreateInstance, null, null, null); amfobj.FromAMF(asobj); list.GetType().InvokeMember("Add", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod, null, list, new object[] { amfobj }); } info.SetValue(this, list); } else if (attr is AMFObjectAttribute) { AMFObjectAttribute attribute = attr as AMFObjectAttribute; AMFObject amfobj = (AMFObject)attribute.Type.InvokeMember("", BindingFlags.CreateInstance, null, null, null); amfobj.FromAMF((FluorineFx.ASObject)obj[attribute.Tag]); info.SetValue(this, amfobj); } else if (attr is AMFDictionaryAttribute) { AMFDictionaryAttribute attribute = attr as AMFDictionaryAttribute; if (attribute.ValueType == typeof(int?)) { Dictionary<string, int?> dict = new Dictionary<string, int?>(); FluorineFx.ASObject dictobj = (FluorineFx.ASObject)obj[attribute.Tag]; foreach (string key in dictobj.Keys) { object val = dictobj[key]; dict.Add(key, (int?)val); } info.SetValue(this, dict); } else if (attribute.ValueType == typeof(bool?)) { Dictionary<string, bool?> dict = new Dictionary<string, bool?>(); FluorineFx.ASObject dictobj = (FluorineFx.ASObject)obj[attribute.Tag]; foreach (string key in dictobj.Keys) { object val = dictobj[key]; dict.Add(key, (bool?)val); } info.SetValue(this, dict); } else if (attribute.ValueType == typeof(double?)) { Dictionary<string, double?> dict = new Dictionary<string, double?>(); FluorineFx.ASObject dictobj = (FluorineFx.ASObject)obj[attribute.Tag]; foreach (string key in dictobj.Keys) { object val = dictobj[key]; if (val is int) dict.Add(key, (double?)(int?)val); else dict.Add(key, (double?)val); } info.SetValue(this, dict); } } } } catch (Exception ex) { Console.WriteLine("Error setting member: " + info.Name + " " + this.GetType()); } } }