Example #1
0
        private FormKindSet(string names)
        {
            if (string.IsNullOrEmpty(names))
            {
                // Empty set if null or empty
                kinds = Enumerable.Empty <FormKind>();
            }
            else
            {
                if (names.Length % 4 != 0)
                {
                    throw new ArgumentException("The input length must be a multiple of four.");
                }

                if (names.Length == 4)
                {
                    // Single element array if single kind
                    kinds = new FormKind[] { FormKind.FromName(names) };
                }
                else
                {
                    // Sorted set if multiple kinds, also sort names to prevent duplicates
                    var split = Enumerable.Range(0, names.Length / 4).Select(i => names.Substring(i * 4, 4)).OrderBy(n => n);
                    kinds = new SortedSet <FormKind>(split.Select(s => FormKind.FromName(s)));
                }
            }
        }
Example #2
0
        public IFormCollection <TOther> Of <TOther>() where TOther : IForm
        {
            FormKind kind  = Provider.GetFormKindOfInterface(typeof(TOther));
            var      items = Items.Where(i => Provider.Engine.Context.Forms[i].FormKind == kind);

            return(Provider.CreateFormCollectionProxy <TOther>(Mode, items));
        }
Example #3
0
        internal void WriteRecord(GenericFormRecord record, uint formId)
        {
            if (header == null)
            {
                throw new InvalidOperationException("Header not yet written");
            }

            FormKind formKind = (FormKind)InfoProvider.GetRecordInfo(record.GetType()).Signature;

            if (formKind != currentGroupFormKind)
            {
                // End existing group if one has begun
                if (currentGroupFormKind != FormKind.Any)
                {
                    EndSegment();
                }

                currentGroupFormKind = formKind;
                BeginGroupSegment(currentGroupFormKind);
                numRecords++;
            }

            // Convert global context Form ID to local relative Form ID
            uint localFormId = ReferenceMapper.ContexToLocal(formId);

            DoWriteRecord(record, localFormId);
            numRecords++;
        }
Example #4
0
 public Form CreateForm(FormKind kind)
 {
     return(new Form()
     {
         FormKind = kind,
         Record = CreateGenericFormRecord(kind)
     });
 }
Example #5
0
        public virtual GenericFormRecord CreateGenericFormRecord(FormKind kind)
        {
            var recordType = GetRecordType(kind);
            var recinf     = InfoProvider.GetRecordInfo(recordType);
            var record     = recinf.CreateInstance();

            record.Version = recinf.Version > 0 ? (ushort)recinf.Version : GetLatestFormVersion();
            return(record);
        }
Example #6
0
 private void BeginGroupSegment(FormKind formKind)
 {
     BeginSegment(new GroupMetadata()
     {
         Signature = "GRUP",
         GroupType = GroupType.Top,
         FormKind  = formKind
     });
 }
Example #7
0
        private ProxyInfo GetFormProxyInfo(FormKind kind)
        {
            if (formKindMap.ContainsKey(kind))
            {
                return(proxies[formKindMap[kind]]);
            }

            //throw new InvalidProgramException("Proxy not found for form type " + formType);
            // Form proxy not found - not supported. Return DummyProxy info
            return(proxies[typeof(DummyFormProxy).FullName]);
        }
Example #8
0
 public Type GetInterface(FormKind kind)
 {
     if (kind == FormKind.Any)
     {
         return(typeof(object));
     }
     else
     {
         return(GetFormProxyInfo(kind).InterfaceType);
     }
 }
Example #9
0
        protected override IEnumerable <Form> GetHardcodedForms(byte pluginNumber)
        {
            if (pluginNumber > 0)
            {
                yield break;
            }

            // PlayerRef
            yield return(new Form()
            {
                FormId = 0x14,
                FormKind = FormKind.FromName(Names.REFR),
                Record = new DummyRecord()
                {
                    EditorId = "PlayerRef"
                }
            });
        }
Example #10
0
 private Type GetRecordType(FormKind kind)
 {
     return(IsSupportedFormKind(kind) ? formKindToRecordTypeMap[kind] : typeof(DummyRecord));
 }
Example #11
0
        // Created by engine
        internal ProxyProvider(RuleEngine engine)
        {
            this.engine = engine;

            string[] namespaces = new string[] { engine.Context.GameTitle, "Forms", "Fields" };

            var types = Assembly.GetExecutingAssembly().GetTypes().Where(t => typeof(Proxy).IsAssignableFrom(t) && !t.IsAbstract && !t.IsGenericType);

            foreach (Type type in types)
            {
                // Skip proxies outside the allowed namespaces
                if (!namespaces.Where(n => type.Namespace.EndsWith(n)).Any())
                {
                    continue;
                }

                // Fetch attribute
                ProxyAttribute a = (ProxyAttribute)type.GetCustomAttributes(typeof(ProxyAttribute), false).FirstOrDefault();
                if (a == null)
                {
                    throw new InvalidProgramException("Proxy type " + type.FullName + " is missing a ProxyAttribute");
                }

                Type backingRecordType = null;
                Type searchType        = type.BaseType;
                while (searchType != null)
                {
                    if (searchType.IsGenericType && searchType.GetGenericTypeDefinition() == typeof(FormProxy <>))
                    {
                        backingRecordType = type.BaseType.GetGenericArguments().Single();
                        break;
                    }

                    searchType = searchType.BaseType;
                }

                Type backingFieldType = null;
                searchType = type.BaseType;
                while (searchType != null)
                {
                    if (searchType.IsGenericType && searchType.GetGenericTypeDefinition() == typeof(FieldProxy <>))
                    {
                        backingFieldType = type.BaseType.GetGenericArguments().Single();
                        break;
                    }

                    searchType = searchType.BaseType;
                }

                FormKind backingFormKind = backingRecordType != null?engine.Context.GetRecordFormKind(backingRecordType) : FormKind.Any;

                Type implementationType = type;

                proxies.Add(implementationType.FullName, new ProxyInfo()
                {
                    ImplementationType = implementationType,
                    InterfaceType      = a.Interface,
                    BackingFormKind    = backingFormKind,
                    BackingRecordType  = backingRecordType,
                    BackingFieldType   = backingFieldType
                });

                interfaceMap.Add(a.Interface.FullName, implementationType.FullName);

                if (backingRecordType != null)
                {
                    formKindMap.Add(backingFormKind, implementationType.FullName);
                    backingRecordMap.Add(backingRecordType.FullName, implementationType.FullName);
                }
                else if (backingFieldType != null)
                {
                    backingFieldMap.Add(backingFieldType.FullName, implementationType.FullName);
                }
            }
        }
Example #12
0
 /// <summary>
 /// Creates a new proxy based on the specified FormType without loading a form.
 /// A form needs to be loaded with method WithForm() before the proxy can be used.
 /// </summary>
 /// <param name="kind"></param>
 /// <param name="mode"></param>
 /// <returns></returns>
 public FormProxy CreateFormProxy(FormKind kind, ProxyMode mode)
 {
     return(CreateProxy <FormProxy>(GetFormProxyInfo(kind), mode));
 }
Example #13
0
        /// <summary>
        /// Creates a new proxy based on the specified FormType without loading a form.
        /// A form needs to be loaded with method WithForm() before the proxy can be used.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="kind"></param>
        /// <param name="mode"></param>
        /// <returns></returns>
        public T CreateFormProxy <T>(FormKind kind, ProxyMode mode) where T : IForm
        {
            var proxy = CreateProxy <T>(GetFormProxyInfo(kind), mode);

            return(proxy);
        }
Example #14
0
 private void BeginGroupSegment(FormKind formKind)
 {
     BeginSegment(new GroupMetadata()
     {
         Signature = "GRUP",
         GroupType = GroupType.Top,
         FormKind = formKind
     });
 }
Example #15
0
 public virtual bool IsSupportedFormKind(FormKind kind)
 {
     return(formKindToRecordTypeMap.ContainsKey(kind));
 }
Example #16
0
 public bool Contains(FormKind kind)
 {
     return(kinds.Contains(kind));
 }
Example #17
0
 public bool Contains(FormKind kind)
 {
     return kinds.Contains(kind);
 }
Example #18
0
 public IEnumerable <Form> OfKind(FormKind kind)
 {
     return(formsByKind.ContainsKey(kind) ? formsByKind[kind].Select(i => i) : Enumerable.Empty <Form>());
 }
Example #19
0
        internal void WriteRecord(GenericFormRecord record, uint formId)
        {
            if (header == null)
                throw new InvalidOperationException("Header not yet written");

            FormKind formKind = (FormKind)InfoProvider.GetRecordInfo(record.GetType()).Signature;
            if (formKind != currentGroupFormKind)
            {
                // End existing group if one has begun
                if (currentGroupFormKind != FormKind.Any)
                {
                    EndSegment();
                }

                currentGroupFormKind = formKind;
                BeginGroupSegment(currentGroupFormKind);
                numRecords++;
            }

            // Convert global context Form ID to local relative Form ID
            uint localFormId = ReferenceMapper.ContexToLocal(formId);

            DoWriteRecord(record, localFormId);
            numRecords++;
        }