Ejemplo n.º 1
0
            /// <summary>
            /// 任意类型处理
            /// </summary>
            /// <param name="type">类型</param>
            private void getFullName(Type type)
            {
                string value;

                if (!IsXml && TypeNames.TryGetValue(type, out value))
                {
                    NameStream.WriteNotNull(value);
                }
                else if (type.IsGenericParameter)
                {
                    NameStream.SimpleWriteNotNull(type.Name);
                }
                else if (type.IsArray)
                {
                    Array(type, true);
                }
                else if (type.IsGenericType)
                {
                    GenericFullName(type);
                }
                else
                {
                    Type reflectedType = type.ReflectedType;
                    if (reflectedType == null)
                    {
                        NameStream.WriteNotNull(type.Namespace);
                        NameStream.Write('.');
                        NameStream.SimpleWriteNotNull(type.Name);
                    }
                    else
                    {
                        this.ReflectedType(type, reflectedType);
                    }
                }
            }
Ejemplo n.º 2
0
        /// <summary>
        /// 根据类型获取代码名称
        /// </summary>
        /// <param name="type">类型</param>
        /// <returns>代码名称</returns>
        public static string GetFullName(Type type)
        {
            string value;

            if (TypeNames.TryGetValue(type, out value))
            {
                return(value);
            }
            if (type.IsGenericParameter)
            {
                return(type.Name);
            }
            return(new TypeNameBuilder().GetTypeFullName(type));
        }
Ejemplo n.º 3
0
        private void ExportStruct(StreamWriter writer, Type type)
        {
            writer.WriteLine("Public Type {0}", type.Name);

            BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;

            FieldInfo[] fields = type.GetFields(bindingFlags);

            foreach (FieldInfo field in fields)
            {
                StringBuilder declaration = new StringBuilder();

                Type   fieldType;
                string typeName;

                MarshalAsAttribute marshalAs = (MarshalAsAttribute)Attribute.GetCustomAttribute(field, typeof(MarshalAsAttribute), false);
                if (marshalAs != null)
                {
                    fieldType = GetUnmanagedType(marshalAs.Value);
                }
                else
                {
                    fieldType = field.FieldType;
                }

                if (!TypeNames.TryGetValue(fieldType, out typeName))
                {
                    typeName = fieldType.Name;
                }

                if (marshalAs != null && marshalAs.SizeConst > 0)
                {
                    if (typeName == "String")
                    {
                        writer.WriteLine("\t{0} As {1} * {2}", field.Name, typeName, marshalAs.SizeConst);
                    }
                    else
                    {
                        writer.WriteLine("\t{0}({1}) As {2}", field.Name, marshalAs.SizeConst, typeName);
                    }
                }
                else
                {
                    writer.WriteLine("\t{0} As {1}", field.Name, typeName);
                }
            }

            writer.WriteLine("End Type");
        }
Ejemplo n.º 4
0
        private void ExportStruct(StreamWriter writer, Type type)
        {
            writer.WriteLine("typedef struct");
            writer.WriteLine("{");

            BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;

            FieldInfo[] fields = type.GetFields(bindingFlags);

            foreach (FieldInfo field in fields)
            {
                StringBuilder declaration = new StringBuilder();

                Type   fieldType;
                string typeName;
                string arrayDeclaration;

                MarshalAsAttribute marshalAs = (MarshalAsAttribute)Attribute.GetCustomAttribute(field, typeof(MarshalAsAttribute), false);
                if (marshalAs != null)
                {
                    fieldType = GetUnmanagedType(marshalAs.Value);
                }
                else
                {
                    fieldType = field.FieldType;
                }

                if (!TypeNames.TryGetValue(fieldType, out typeName))
                {
                    typeName = fieldType.Name;
                }

                if (marshalAs != null && marshalAs.SizeConst > 0)
                {
                    arrayDeclaration = string.Format("[{0}]", marshalAs.SizeConst);
                }
                else
                {
                    arrayDeclaration = null;
                }

                writer.WriteLine("\t{0} {1}{2};", typeName, field.Name, arrayDeclaration);
            }

            writer.WriteLine("}} {0};", type.Name);
        }
Ejemplo n.º 5
0
        private string GetMethodParamDeclaration(ParameterInfo param)
        {
            Type type    = param.ParameterType.IsArray ? param.ParameterType.GetElementType() : param.ParameterType;
            bool isByRef = type.IsByRef || param.IsRetval || param.IsOut;

            if (type.IsByRef)
            {
                type = type.GetElementType();
            }
            if (type.IsSubclassOf(typeof(Enum)))
            {
                type = typeof(int);
            }

            StringBuilder declaration = new StringBuilder();

            string typeName;

            if (!TypeNames.TryGetValue(type, out typeName))
            {
                typeName = type.Name;
            }

            if (type == typeof(StringBuilder))
            {
                declaration.Append(typeName);
            }
            else if (isByRef)
            {
                declaration.AppendFormat("{0}*", typeName);
            }
            else
            {
                declaration.AppendFormat("const {0}", typeName);
            }

            declaration.AppendFormat(" {0}", param.Name);

            if (param.ParameterType.IsArray)
            {
                declaration.Append("[]");
            }

            return(declaration.ToString());
        }
Ejemplo n.º 6
0
            /// <summary>
            /// 任意类型处理
            /// </summary>
            /// <param name="type">类型</param>
            private void getNameNoArray(Type type)
            {
                string value;

                if (!IsXml && TypeNames.TryGetValue(type, out value))
                {
                    NameStream.WriteNotNull(value);
                }
                else if (type.IsGenericParameter)
                {
                    NameStream.SimpleWriteNotNull(type.Name);
                }
                else if (type.IsGenericType)
                {
                    GenericName(type);
                }
                else
                {
                    NameStream.SimpleWriteNotNull(type.Name);
                }
            }
Ejemplo n.º 7
0
        private static string GetName <T>()
        {
            var type = typeof(T);
            var b    = TypeNames.TryGetValue(type, out var name);

            if (b)
            {
                return(name.Ns());
            }

            var value = type.Name;

            lock (TypeNames)
            {
                b = TypeNames.TryGetValue(type, out var _);
                if (!b)
                {
                    TypeNames.Add(type, value);
                }
            }
            return(value.Ns());
        }
Ejemplo n.º 8
0
        public FormDefinition GetDefinition(string xml, bool freeze)
        {
            var document = XDocument.Parse(xml);

            if (document.Root == null)
            {
                throw new InvalidOperationException("Invalid XML document.");
            }

            void AddMetadata(IDictionary <string, string> dict, XElement xelement)
            {
                const int stroffset = 5; // "meta-".Length

                foreach (var attr in xelement.Attributes())
                {
                    if (attr.Name.LocalName.StartsWith("meta-", StringComparison.OrdinalIgnoreCase))
                    {
                        dict[attr.Name.LocalName.Substring(stroffset)] = attr.Value;
                    }
                }
            }

            FormElement WithMetadata(FormElement element, XElement xelement)
            {
                AddMetadata(element.Metadata, xelement);
                return(element);
            }

            ILayout Terminal(XElement element)
            {
                var         elementName = element.Name.LocalName.ToLower();
                FormElement formElement;

                switch (elementName)
                {
                case "layout":
                    return(Layout(element));

                case "input":
                case "textarea":
                case "toggle":
                case "password":
                {
                    var  typeName   = element.TryGetAttribute("type") ?? "string";
                    var  attributes = new List <Attribute>();
                    Type propertyType;
                    if (elementName == "input" && TypeConstructors.TryGetValue(typeName, out var constructor))
                    {
                        var data = constructor(new XmlConstructionContext(element));
                        propertyType = data.PropertyType;
                        attributes.AddRange(data.CustomAttributes);
                    }
                    else if (!TypeNames.TryGetValue(typeName, out propertyType))
                    {
                        throw new InvalidOperationException($"Type '{typeName}' not found.");
                    }

                    var fieldName = element.TryGetAttribute("name");
                    attributes.Add(Utilities.GetFieldAttributeFromElement(element));
                    attributes.Add(Utilities.GetBindingAttributeFromElement(element));

                    switch (elementName)
                    {
                    case "textarea":
                        attributes.Add(new MultiLineAttribute());
                        propertyType = typeof(string);
                        break;

                    case "toggle":
                        attributes.Add(new ToggleAttribute());
                        propertyType = typeof(bool);
                        break;

                    case "password":
                        attributes.Add(new PasswordAttribute());
                        propertyType = typeof(string);
                        break;
                    }

                    attributes.AddRange(Utilities.GetValidatorsFromElement(element));
                    var property     = new DynamicProperty(fieldName, propertyType, attributes.ToArray());
                    var deserializer = TryGetDeserializer(propertyType);
                    formElement = Build(property, deserializer);
                    if (formElement != null)
                    {
                        foreach (var initializer in FieldInitializers)
                        {
                            initializer.Initialize(formElement, property, deserializer);
                        }

                        formElement.LinePosition = (Position)(-1);
                    }

                    return(new FormElementLayout(WithMetadata(formElement, element)));
                }

                case "select":
                {
                    var    from = element.TryGetAttribute("from");
                    object itemsSource;
                    string typeName;
                    string displayPath;
                    string valuePath;
                    Type   propertyType = null;
                    if (!string.IsNullOrEmpty(from))
                    {
                        if (from.StartsWith("type:"))
                        {
                            var qualifiedType = from.Substring("type:".Length);
                            var nullable      = false;
                            if (qualifiedType.EndsWith("?"))
                            {
                                qualifiedType = qualifiedType.Substring(0, qualifiedType.Length - 1);
                                nullable      = true;
                            }

                            propertyType = Utilities.FindTypes(t => t.FullName == qualifiedType).FirstOrDefault();
                            itemsSource  = propertyType ?? throw new InvalidOperationException($"Could not find type '{qualifiedType}'.");

                            if (propertyType.IsValueType && nullable)
                            {
                                propertyType = typeof(Nullable <>).MakeGenericType(propertyType);
                                itemsSource  = propertyType;
                            }

                            typeName = element.TryGetAttribute("type");
                        }
                        else
                        {
                            itemsSource = from;
                            typeName    = element.TryGetAttribute("type") ?? "string";
                        }

                        displayPath = element.TryGetAttribute("displayPath");
                        valuePath   = element.TryGetAttribute("valuePath");
                    }
                    else
                    {
                        typeName    = "string";
                        displayPath = "Name";
                        valuePath   = "Value";
                        itemsSource = Utilities.GetSelectOptionsFromElement(element);
                    }

                    if (typeName != null && !TypeNames.TryGetValue(typeName, out propertyType))
                    {
                        throw new InvalidOperationException($"Type '{typeName}' not found.");
                    }

                    if (propertyType.IsValueType &&
                        element.TryGetAttribute("nullable") != null &&
                        (!propertyType.IsGenericType || propertyType.GetGenericTypeDefinition() != typeof(Nullable <>)))
                    {
                        propertyType = typeof(Nullable <>).MakeGenericType(propertyType);
                    }

                    var fieldName  = element.TryGetAttribute("name");
                    var attributes = new List <Attribute>
                    {
                        new SelectFromAttribute(itemsSource)
                        {
                            SelectionType    = Utilities.TryParse(element.TryGetAttribute("as"), SelectionType.ComboBox),
                            DisplayPath      = displayPath,
                            ValuePath        = valuePath,
                            ItemStringFormat = element.TryGetAttribute("itemStringFormat")
                        },
                        Utilities.GetFieldAttributeFromElement(element),
                        Utilities.GetBindingAttributeFromElement(element)
                    };

                    attributes.AddRange(Utilities.GetValidatorsFromElement(element));
                    var property     = new DynamicProperty(fieldName, propertyType, attributes.ToArray());
                    var deserializer = TryGetDeserializer(propertyType);
                    formElement = Build(property, deserializer);
                    if (formElement != null)
                    {
                        foreach (var initializer in FieldInitializers)
                        {
                            initializer.Initialize(formElement, property, deserializer);
                        }

                        formElement.LinePosition = (Position)(-1);
                    }

                    return(new FormElementLayout(WithMetadata(formElement, element)));
                }

                case "title":
                    formElement = new TitleAttribute(element.GetAttributeOrValue("content"))
                    {
                        Icon = element.TryGetAttribute("icon")
                    }
                    .WithBaseProperties(element)
                    .WithTextProperties(element)
                    .GetElement();
                    return(new FormElementLayout(WithMetadata(formElement, element)));

                case "heading":
                    formElement = new HeadingAttribute(element.GetAttributeOrValue("content"))
                    {
                        Icon = element.TryGetAttribute("icon")
                    }
                    .WithBaseProperties(element)
                    .WithTextProperties(element)
                    .GetElement();
                    return(new FormElementLayout(WithMetadata(formElement, element)));

                case "text":
                    formElement = new TextAttribute(element.GetAttributeOrValue("content"))
                                  .WithBaseProperties(element)
                                  .WithTextProperties(element)
                                  .GetElement();
                    return(new FormElementLayout(WithMetadata(formElement, element)));

                case "error":
                    formElement = new ErrorTextAttribute(element.GetAttributeOrValue("content"))
                                  .WithBaseProperties(element)
                                  .WithTextProperties(element)
                                  .GetElement();
                    return(new FormElementLayout(WithMetadata(formElement, element)));

                case "img":
                    formElement = new ImageAttribute(element.TryGetAttribute("src"))
                    {
                        Width  = element.TryGetAttribute("width"),
                        Height = element.TryGetAttribute("height"),
                        HorizontalAlignment = element.TryGetAttribute("align"),
                        VerticalAlignment   = element.TryGetAttribute("valign"),
                        Stretch             = element.TryGetAttribute("stretch"),
                        StretchDirection    = element.TryGetAttribute("direction")
                    }
                    .WithBaseProperties(element)
                    .GetElement();
                    return(new FormElementLayout(WithMetadata(formElement, element)));

                case "br":
                    formElement = new BreakAttribute
                    {
                        Height = element.TryGetAttribute("height")
                    }
                    .WithBaseProperties(element)
                    .GetElement();

                    return(new FormElementLayout(WithMetadata(formElement, element)));

                case "hr":
                    var hasMargin = element.TryGetAttribute("hasMargin");
                    formElement = (hasMargin != null
                            ? new DividerAttribute(bool.Parse(hasMargin))
                            : new DividerAttribute())
                                  .WithBaseProperties(element)
                                  .GetElement();

                    return(new FormElementLayout(WithMetadata(formElement, element)));

                case "action":
                    formElement = Utilities.GetAction(element)
                                  .WithBaseProperties(element)
                                  .GetElement();
                    return(new FormElementLayout(WithMetadata(formElement, element)));

                default:
                    throw new InvalidOperationException($"Unknown element '{element.Name.LocalName}'.");
                }
            }

            GridColumnLayout Column(XElement element)
            {
                var elements = element.Elements().ToList();
                var child    = elements.Count == 1
                    ? Row(elements[0])
                    : new Layout(elements.Select(Row));

                return(new GridColumnLayout(
                           child,
                           Utilities.ParseDouble(element.TryGetAttribute("width"), 1d),
                           Utilities.ParseDouble(element.TryGetAttribute("left"), 0d),
                           Utilities.ParseDouble(element.TryGetAttribute("right"), 0d)));
            }

            GridLayout Grid(XElement element)
            {
                return(new GridLayout(
                           element.Elements().Select(Column),
                           Utilities.ParseDouble(element.TryGetAttribute("top"), 0d),
                           Utilities.ParseDouble(element.TryGetAttribute("bottom"), 0d)));
            }

            InlineLayout Inline(XElement element)
            {
                return(new InlineLayout(
                           element.Elements().Select(Terminal),
                           Utilities.ParseDouble(element.TryGetAttribute("top"), 0d),
                           Utilities.ParseDouble(element.TryGetAttribute("bottom"), 0d)));
            }

            ILayout Row(XElement element)
            {
                if (!string.Equals(element.Name.LocalName, "row", StringComparison.OrdinalIgnoreCase))
                {
                    return(Terminal(element));
                }

                if (element
                    .Elements()
                    .All(e => string.Equals(e.Name.LocalName, "col", StringComparison.OrdinalIgnoreCase)))
                {
                    return(Grid(element));
                }

                return(Inline(element));
            }

            Layout Layout(XElement element)
            {
                return(new Layout(
                           element.Elements().Select(Row),
                           Utilities.ParseThickness(element.TryGetAttribute("margin")),
                           Utilities.TryParse(element.TryGetAttribute("valign"), VerticalAlignment.Stretch),
                           Utilities.TryParse(element.TryGetAttribute("align"), HorizontalAlignment.Stretch),
                           Utilities.ParseNullableDouble(element.TryGetAttribute("minHeight")),
                           Utilities.ParseNullableDouble(element.TryGetAttribute("maxHeight"))));
            }

            var form = new FormDefinition(null); // null indicates dynamic type

            AddMetadata(form.Metadata, document.Root);
            form.FormRows.Add(new FormRow(true, 1)
            {
                Elements = { new FormElementContainer(0, 1, Layout(document.Root)) }
            });

            if (freeze)
            {
                form.FreezeAll();
            }

            return(form);
        }
Ejemplo n.º 9
0
        public IFormDefinition GetDefinition(string xml)
        {
            var document = XDocument.Parse(xml);
            var root     = document.Root;

            if (root == null)
            {
                throw new InvalidOperationException("Invalid XML document.");
            }

            var form = new FormDefinition(null) // null indicates dynamic type
            {
                Grid = Utilities.GetGridWidths(root.GetSingleOrDefaultAttribute("grid")?.Value) ?? new[] { 1d }
            };

            var gridLength = form.Grid.Length;

            void AddRow(FormElement formElement)
            {
                form.FormRows.Add(new FormRow
                {
                    Elements = { new FormElementContainer(0, gridLength, formElement) }
                });
            }

            var    actions     = new List <FormElement>();
            string elementName = null;

            foreach (var element in root.Elements())
            {
                elementName = element.Name.LocalName.ToLower();
                switch (elementName)
                {
                case "input":
                    var typeName = element.GetSingleOrDefaultAttribute("type")?.Value ?? "string";
                    if (!TypeNames.TryGetValue(typeName, out var propertyType))
                    {
                        throw new InvalidOperationException($"Type '{typeName}' not found.");
                    }

                    var fieldName  = element.GetSingleOrDefaultAttribute("name")?.Value;
                    var attributes = new List <Attribute>
                    {
                        Utilities.GetFieldAttributeFromElement(element),
                        Utilities.GetBindingAttributeFromElement(element)
                    };

                    attributes.AddRange(Utilities.GetValidatorsFromElement(element));
                    var property     = new DynamicProperty(fieldName, propertyType, attributes.ToArray());
                    var deserializer = TryGetDeserializer(propertyType);
                    var formElement  = Build(property, deserializer);
                    if (formElement != null)
                    {
                        AddRow(formElement);
                        foreach (var initializer in FieldInitializers)
                        {
                            initializer.Initialize(formElement, property, deserializer);
                        }
                    }

                    break;

                case "title":
                    AddRow(new TitleAttribute(element.GetAttributeOrValue("content"))
                    {
                        Icon = element.TryGetAttribute("icon")
                    }.GetElement());
                    break;

                case "heading":
                    AddRow(new HeadingAttribute(element.GetAttributeOrValue("content"))
                    {
                        Icon = element.TryGetAttribute("icon")
                    }.GetElement());
                    break;

                case "text":
                    AddRow(new TextAttribute(element.GetAttributeOrValue("content")).GetElement());
                    break;

                case "br":
                    AddRow(new BreakAttribute
                    {
                        Height = element.TryGetAttribute("height")
                    }.GetElement());
                    break;

                case "hr":
                    var hasMargin = element.TryGetAttribute("hasMargin");
                    AddRow((hasMargin != null
                            ? new DividerAttribute(bool.Parse(hasMargin))
                            : new DividerAttribute()).GetElement());
                    break;

                case "action":
                    actions.Add(Utilities.GetAction(element).GetElement());
                    break;
                }

                if (elementName != "action" && actions.Count != 0)
                {
                    form.FormRows.Add(new FormRow
                    {
                        Elements = { new FormElementContainer(0, gridLength, actions.ToList()) }
                    });

                    actions.Clear();
                }
            }

            if (elementName == "action" && actions.Count != 0)
            {
                form.FormRows.Add(new FormRow
                {
                    Elements = { new FormElementContainer(0, gridLength, actions.ToList()) }
                });

                actions.Clear();
            }

            form.Freeze();
            foreach (var element in form.FormRows.SelectMany(r => r.Elements).SelectMany(c => c.Elements))
            {
                element.Freeze();
            }

            return(form);
        }
Ejemplo n.º 10
0
        private void ExportDelegate(StreamWriter writer, Type type)
        {
            MethodInfo method = type.GetMethod("Invoke");

            string returnValue;

            if (!TypeNames.TryGetValue(method.ReturnType, out returnValue))
            {
                returnValue = method.ReturnType.Name;
            }

            string functionName = type.Name;

            writer.Write("typedef {0} (*{1}) (", returnValue, functionName);

            ParameterInfo[] parameters = method.GetParameters();
            if (parameters.Length == 0)
            {
                writer.Write("void");
            }
            else
            {
                for (int i = 0; i < parameters.Length; i++)
                {
                    ParameterInfo param = parameters[i];

                    Type   fieldType;
                    string typeName;
                    string arrayDeclaration;
                    string pointer;

                    MarshalAsAttribute marshalAs = (MarshalAsAttribute)Attribute.GetCustomAttribute(param, typeof(MarshalAsAttribute), false);
                    if (marshalAs != null)
                    {
                        fieldType = GetUnmanagedType(marshalAs.Value);
                    }
                    else if (param.ParameterType.IsByRef)
                    {
                        fieldType = param.ParameterType.GetElementType();
                    }
                    else
                    {
                        fieldType = param.ParameterType;
                    }

                    if (!TypeNames.TryGetValue(fieldType, out typeName))
                    {
                        typeName = fieldType.Name;
                    }

                    if (marshalAs != null && marshalAs.SizeConst > 0)
                    {
                        arrayDeclaration = string.Format("[{0}]", marshalAs.SizeConst);
                    }
                    else
                    {
                        arrayDeclaration = null;
                    }

                    if (param.IsOut || param.IsRetval || param.ParameterType.IsByRef)
                    {
                        pointer = "*";
                    }
                    else
                    {
                        pointer = null;
                    }

                    if (i > 0)
                    {
                        writer.Write(",");
                    }
                    writer.Write("{0} {1}{2}{3}", typeName, pointer, param.Name, arrayDeclaration);
                }
            }

            writer.WriteLine(");");
        }
Ejemplo n.º 11
0
        private void ExportDelegate(StreamWriter writer, Type type)
        {
            MethodInfo method = type.GetMethod("Invoke");

            string returnValue;

            if (!TypeNames.TryGetValue(method.ReturnType, out returnValue))
            {
                returnValue = method.ReturnType.Name;
            }

            string functionName = type.Name;

            writer.WriteLine("\tpublic interface {0} extends com.sun.jna.Callback {{", functionName);
            writer.Write("\t\t{0} invoke(", returnValue);

            ParameterInfo[] parameters = method.GetParameters();
            if (parameters.Length > 0)
            {
                for (int i = 0; i < parameters.Length; i++)
                {
                    ParameterInfo param = parameters[i];

                    Type   fieldType;
                    string typeName;
                    string arrayDeclaration;

                    MarshalAsAttribute marshalAs = (MarshalAsAttribute)Attribute.GetCustomAttribute(param, typeof(MarshalAsAttribute), false);
                    if (marshalAs != null)
                    {
                        fieldType = GetUnmanagedType(marshalAs.Value);
                    }
                    else if (param.ParameterType.IsByRef)
                    {
                        fieldType = param.ParameterType.GetElementType();
                    }
                    else
                    {
                        fieldType = param.ParameterType;
                    }

                    if (fieldType.IsSubclassOf(typeof(Enum)))
                    {
                        fieldType = typeof(int);
                    }

                    bool isByRef = param.IsOut || param.IsRetval || param.ParameterType.IsByRef;

                    if (isByRef)
                    {
                        ByRefTypeNames.TryGetValue(fieldType, out typeName);
                    }
                    else
                    {
                        TypeNames.TryGetValue(fieldType, out typeName);
                    }

                    if (typeName == null)
                    {
                        typeName = string.Format("{0}.{1}", className, fieldType.Name);
                    }


                    if (marshalAs != null && marshalAs.SizeConst > 0)
                    {
                        arrayDeclaration = string.Format("[{0}]", marshalAs.SizeConst);
                    }
                    else
                    {
                        arrayDeclaration = null;
                    }


                    if (i > 0)
                    {
                        writer.Write(",");
                    }
                    writer.Write("{0} {1}{2}", typeName, param.Name, arrayDeclaration);
                }
            }

            writer.WriteLine(");");
            writer.WriteLine("\t}");
        }
Ejemplo n.º 12
0
        private void ExportStruct(StreamWriter writer, Type type)
        {
            writer.WriteLine("\tpublic static class {0} extends Structure {{", type.Name);

            StringBuilder fieldNames = new StringBuilder();

            BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;

            FieldInfo[] fields = type.GetFields(bindingFlags);

            foreach (FieldInfo field in fields)
            {
                StringBuilder declaration = new StringBuilder();

                Type   fieldType;
                string typeName;

                MarshalAsAttribute marshalAs = (MarshalAsAttribute)Attribute.GetCustomAttribute(field, typeof(MarshalAsAttribute), false);
                if (marshalAs != null)
                {
                    fieldType = GetUnmanagedType(marshalAs.Value);
                }
                else
                {
                    fieldType = field.FieldType;
                }

                if (!TypeNames.TryGetValue(fieldType, out typeName))
                {
                    typeName = fieldType.Name;
                }

                if (marshalAs != null && marshalAs.SizeConst > 0)
                {
                    writer.WriteLine("\t\tpublic {0}[] {1} = new {0}[{2}];", (typeName.Equals("char") ? "byte" : typeName), field.Name, marshalAs.SizeConst);
                }
                else
                {
                    writer.WriteLine("\t\tpublic {0} {1};", typeName, field.Name);
                }

                if (fieldNames.Length > 0)
                {
                    fieldNames.Append(" , ");
                }
                fieldNames.AppendFormat("\"{0}\"", field.Name);
            }

            writer.WriteLine();

            writer.WriteLine("\t\t@Override");
            writer.WriteLine("\t\tprotected List<String> getFieldOrder() {");
            writer.WriteLine("\t\t\treturn Arrays.asList({0});", fieldNames);
            writer.WriteLine("\t\t}");
            writer.WriteLine();

            writer.WriteLine("\t\tpublic static class ByReference extends {0} implements Structure.ByReference {{ }}", type.Name);
            writer.WriteLine("\t\tpublic static class ByValue extends {0} implements Structure.ByValue {{ }}", type.Name);

            writer.WriteLine("\t}");
            writer.WriteLine();
        }