Пример #1
0
 public override void FromAMF(FluorineFx.ASObject obj)
 {
     base.FromAMF(obj);
     if (obj.ContainsKey("giftSenderId"))
         _giftable = true;
 }
Пример #2
0
        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());
                    }
            }
        }