Exemplo n.º 1
0
        private void WriteParameter(WindowsAccessBridgeModel model, SourceCodeWriter sourceWriter, ParameterDefinition parameterDefinition)
        {
            if (parameterDefinition.IsOutAttribute)
            {
                if (sourceWriter.IsNativeTypes || !model.IsClass(parameterDefinition.Type))
                {
                    sourceWriter.Write("[Out]");
                }
            }

            if (parameterDefinition.IsOut)
            {
                sourceWriter.Write("out ");
            }
            else if (parameterDefinition.IsOutAttribute && model.IsClass(parameterDefinition.Type) && !sourceWriter.IsNativeTypes)
            {
                sourceWriter.Write("out ");
            }
            else if (parameterDefinition.IsRef)
            {
                sourceWriter.Write("ref ");
            }
            if (sourceWriter.IsNativeTypes)
            {
                sourceWriter.WriteMashalAs(parameterDefinition.MarshalAs);
            }
            sourceWriter.WriteType(parameterDefinition.Type);
            sourceWriter.Write(" ");
            sourceWriter.Write(parameterDefinition.Name);
        }
Exemplo n.º 2
0
        private void WriteApplicationWrapStructFunctions(WindowsAccessBridgeModel model, SourceCodeWriter sourceWriter, TypeDefinition definition)
        {
            sourceWriter.WriteIndent();
            sourceWriter.Write("private ");
            sourceWriter.IsNativeTypes = false;
            sourceWriter.WriteType(definition.Name);
            sourceWriter.Write(" Wrap(int vmid, ");
            sourceWriter.IsNativeTypes = true;
            sourceWriter.WriteType(definition.Name);
            sourceWriter.Write(" info)");
            sourceWriter.Write(" {{");
            sourceWriter.WriteLine();
            sourceWriter.IncIndent();
            sourceWriter.IsNativeTypes = false;
            sourceWriter.WriteLine("var result = new {0}();", sourceWriter.GetTypeName(definition.Name));
            sourceWriter.IsNativeTypes = true;
            WriteCopyFields(model, sourceWriter, "info", "result", definition);
            sourceWriter.WriteLine("return result;");
            sourceWriter.DecIndent();
            sourceWriter.WriteLine("}}");
            sourceWriter.WriteLine();

            sourceWriter.WriteIndent();
            sourceWriter.Write("private ");
            sourceWriter.IsNativeTypes = true;
            sourceWriter.WriteType(definition.Name);
            sourceWriter.Write(" Unwrap(int vmid, ");
            sourceWriter.IsNativeTypes = false;
            sourceWriter.WriteType(definition.Name);
            sourceWriter.Write(" info)");
            sourceWriter.Write(" {{");
            sourceWriter.WriteLine();
            sourceWriter.IncIndent();
            sourceWriter.IsNativeTypes = true;
            sourceWriter.WriteLine("var result = new {0}();", sourceWriter.GetTypeName(definition.Name));
            sourceWriter.IsNativeTypes = false;
            WriteCopyFields(model, sourceWriter, "info", "result", definition);
            sourceWriter.WriteLine("return result;");
            sourceWriter.DecIndent();
            sourceWriter.WriteLine("}}");
            sourceWriter.WriteLine();
        }
Exemplo n.º 3
0
        private void WriteApplicationCopyClassFunctions(WindowsAccessBridgeModel model, SourceCodeWriter sourceWriter, TypeDefinition definition)
        {
            sourceWriter.WriteIndent();
            sourceWriter.Write("private void CopyWrap(int vmid, ");
            sourceWriter.IsNativeTypes = true;
            sourceWriter.WriteType(definition.Name);
            sourceWriter.Write(" infoSrc, ");
            sourceWriter.IsNativeTypes = false;
            sourceWriter.WriteType(definition.Name);
            sourceWriter.Write(" infoDest)");
            sourceWriter.Write(" {{");
            sourceWriter.WriteLine();
            sourceWriter.IncIndent();
            sourceWriter.IsNativeTypes = true;
            WriteCopyFields(model, sourceWriter, "infoSrc", "infoDest", definition);
            sourceWriter.DecIndent();
            sourceWriter.WriteLine("}}");
            sourceWriter.WriteLine();

            sourceWriter.WriteIndent();
            sourceWriter.Write("private void CopyUnwrap(int vmid, ");
            sourceWriter.IsNativeTypes = false;
            sourceWriter.WriteType(definition.Name);
            sourceWriter.Write(" infoSrc, ");
            sourceWriter.IsNativeTypes = true;
            sourceWriter.WriteType(definition.Name);
            sourceWriter.Write(" infoDest)");
            sourceWriter.Write(" {{");
            sourceWriter.WriteLine();
            sourceWriter.IncIndent();
            sourceWriter.IsNativeTypes = false;
            WriteCopyFields(model, sourceWriter, "infoSrc", "infoDest", definition);
            sourceWriter.DecIndent();
            sourceWriter.WriteLine("}}");
            sourceWriter.WriteLine();
        }
Exemplo n.º 4
0
 private void WriteField(WindowsAccessBridgeModel model, SourceCodeWriter sourceWriter, TypeDefinition container, FieldDefinition definition)
 {
     if (sourceWriter.IsNativeTypes || !model.TypeDefinitionNeedsWrapper(container))
     {
         if (definition.MarshalAs != null)
         {
             sourceWriter.WriteIndent();
             sourceWriter.WriteMashalAs(definition.MarshalAs);
             sourceWriter.WriteLine();
         }
     }
     sourceWriter.WriteIndent();
     sourceWriter.Write("public ");
     sourceWriter.WriteType(definition.Type);
     sourceWriter.Write(" ");
     sourceWriter.Write("{0};", definition.Name);
     sourceWriter.WriteLine();
 }
Exemplo n.º 5
0
 private void WriteEnum(WindowsAccessBridgeModel model, SourceCodeWriter sourceWriter, EnumDefinition definition)
 {
     if (definition.IsFlags)
     {
         sourceWriter.WriteLine("[Flags]");
     }
     sourceWriter.WriteIndent();
     sourceWriter.Write("public enum {0}", definition.Name);
     if (definition.Type.Name != "int")
     {
         sourceWriter.Write(" : ");
         sourceWriter.WriteType(definition.Type);
     }
     sourceWriter.Write(" {{");
     sourceWriter.WriteLine();
     WriteEnumMembers(model, sourceWriter, definition);
     sourceWriter.WriteLine("}}");
 }
Exemplo n.º 6
0
        private void WriteFunctionSignature(WindowsAccessBridgeModel model, SourceCodeWriter sourceWriter, FunctionDefinition definition, string name)
        {
            sourceWriter.WriteType(definition.ReturnType);
            sourceWriter.Write(" ");
            sourceWriter.Write(name);
            sourceWriter.Write("(");
            bool first = true;

            foreach (var p in definition.Parameters)
            {
                if (first)
                {
                    first = false;
                }
                else
                {
                    sourceWriter.Write(", ");
                }
                WriteParameter(model, sourceWriter, p);
            }
            sourceWriter.Write(")");
        }
Exemplo n.º 7
0
        private void WriteApplicationFunctionImplementation(WindowsAccessBridgeModel model, SourceCodeWriter sourceWriter, FunctionDefinition definition)
        {
            sourceWriter.WriteIndent();
            sourceWriter.Write("public override ");
            WriteFunctionSignature(model, sourceWriter, definition);
            sourceWriter.Write(" {{");
            sourceWriter.WriteLine();
            sourceWriter.IncIndent();

            //
            // Generate temporary local variables for out/ref parameters.
            //
            var javaOutObjects = definition.Parameters.Where(p => p.IsOut && IsJavaObjectHandle(p.Type)).ToList();
            var javaInObjects  = definition.Parameters.Where(p => !p.IsOut && IsJavaObjectHandle(p.Type)).ToList();

            foreach (var x in javaOutObjects)
            {
                sourceWriter.WriteIndent();
                sourceWriter.IsNativeTypes = true;
                sourceWriter.WriteType(x.Type);
                sourceWriter.IsNativeTypes = false;
                sourceWriter.Write(" {0}Temp;", x.Name);
                sourceWriter.WriteLine();
            }

            var outStructs = definition.Parameters.Where(p => (p.IsOut || p.IsRef || p.IsOutAttribute) && model.IsStruct(p.Type)).ToList();

            foreach (var x in outStructs)
            {
                if (model.TypeReferenceNeedsWrapper(x.Type))
                {
                    sourceWriter.WriteIndent();
                    sourceWriter.IsNativeTypes = true;
                    sourceWriter.WriteType(x.Type);
                    if (x.IsRef)
                    {
                        sourceWriter.Write(" {0}Temp = Unwrap(vmid, {0});", x.Name);
                    }
                    else
                    {
                        sourceWriter.Write(" {0}Temp;", x.Name);
                    }
                    sourceWriter.WriteLine();
                    sourceWriter.IsNativeTypes = false;
                }
            }
            var outClasses = definition.Parameters.Where(p => (p.IsOut || p.IsOutAttribute) && model.IsClass(p.Type)).ToList();

            foreach (var x in outClasses)
            {
                sourceWriter.WriteIndent();
                sourceWriter.IsNativeTypes = true;
                if (model.TypeReferenceNeedsWrapper(x.Type))
                {
                    sourceWriter.WriteType(x.Type);
                    sourceWriter.Write(" {0}Temp = new {1}();", x.Name, sourceWriter.GetTypeName(x.Type));
                }
                else
                {
                    sourceWriter.Write("{0} = new {1}();", x.Name, sourceWriter.GetTypeName(x.Type));
                }
                sourceWriter.WriteLine();
                sourceWriter.IsNativeTypes = false;
            }

            //
            // Generate function call
            //
            sourceWriter.WriteIndent();
            if (!IsVoid(definition.ReturnType))
            {
                sourceWriter.Write("var result = ");
            }
            sourceWriter.Write("EntryPoints.{0}(", definition.Name);
            var first = true;

            foreach (var p in definition.Parameters)
            {
                if (first)
                {
                    first = false;
                }
                else
                {
                    sourceWriter.Write(", ");
                }
                if (p.IsOut)
                {
                    sourceWriter.Write("out ");
                }
                else if (p.IsRef)
                {
                    sourceWriter.Write("ref ");
                }
                if (IsJavaObjectHandle(p.Type))
                {
                    if (p.IsOut)
                    {
                        sourceWriter.Write("{0}Temp", p.Name);
                    }
                    else
                    {
                        sourceWriter.Write("Unwrap(vmid, {0})", p.Name);
                    }
                }
                else if (outStructs.Contains(p) || outClasses.Contains(p))
                {
                    if (model.TypeReferenceNeedsWrapper(p.Type))
                    {
                        sourceWriter.Write("{0}Temp", p.Name);
                    }
                    else
                    {
                        sourceWriter.Write("{0}", p.Name);
                    }
                }
                else
                {
                    sourceWriter.Write(p.Name);
                }
            }
            sourceWriter.Write(");");
            sourceWriter.WriteLine();

            //
            // Generate code to keep handles alive for GC.
            //
            foreach (var x in javaInObjects)
            {
                sourceWriter.WriteLine("GC.KeepAlive({0});", x.Name);
            }

            //
            // Generate code to copy back temporary local variables to ref/out parameters.
            //
            foreach (var x in javaOutObjects)
            {
                var wrapExpression = string.Format("{0} = Wrap(vmid, {0}Temp)", x.Name);
                if (IsStatusResult(definition.ReturnType))
                {
                    sourceWriter.WriteLine("if (Succeeded(result)) {{");
                    sourceWriter.IncIndent();
                    sourceWriter.WriteLine("{0};", wrapExpression);
                    sourceWriter.DecIndent();
                    sourceWriter.WriteLine("}} else {{");
                    sourceWriter.IncIndent();
                    sourceWriter.IsNativeTypes = true;
                    sourceWriter.WriteLine("{0}Temp = default({1});", x.Name, sourceWriter.GetTypeName(x.Type));
                    sourceWriter.IsNativeTypes = false;
                    sourceWriter.WriteLine("{0};", wrapExpression);
                    sourceWriter.DecIndent();
                    sourceWriter.WriteLine("}}");
                }
                else
                {
                    sourceWriter.WriteLine("{0};", wrapExpression);
                }
            }

            foreach (var x in outStructs)
            {
                if (model.TypeReferenceNeedsWrapper(x.Type))
                {
                    var wrapExpression = string.Format("{0} = Wrap(vmid, {0}Temp)", x.Name);
                    if (IsStatusResult(definition.ReturnType))
                    {
                        sourceWriter.WriteLine("if (Succeeded(result))");
                        sourceWriter.IncIndent();
                        sourceWriter.WriteLine("{0};", wrapExpression);
                        sourceWriter.DecIndent();
                        if (x.IsOut)
                        {
                            sourceWriter.WriteLine("else");
                            sourceWriter.IncIndent();
                            sourceWriter.WriteLine("{0} = default({1});", x.Name, sourceWriter.GetTypeName(x.Type));
                            sourceWriter.DecIndent();
                        }
                    }
                    else
                    {
                        sourceWriter.WriteLine("{0};", wrapExpression);
                    }
                }
            }

            foreach (var x in outClasses)
            {
                if (model.TypeReferenceNeedsWrapper(x.Type))
                {
                    if (x.IsOutAttribute && !sourceWriter.IsNativeTypes)
                    {
                        sourceWriter.WriteLine("{0} = new {1}();", x.Name, sourceWriter.GetTypeName(x.Type));
                    }

                    var wrapExpression = string.Format("CopyWrap(vmid, {0}Temp, {0})", x.Name);
                    if (IsStatusResult(definition.ReturnType))
                    {
                        sourceWriter.WriteLine("if (Succeeded(result))");
                        sourceWriter.IncIndent();
                        sourceWriter.WriteLine("{0};", wrapExpression);
                        sourceWriter.DecIndent();
                        if (x.IsOut)
                        {
                            sourceWriter.WriteLine("else");
                            sourceWriter.IncIndent();
                            sourceWriter.WriteLine("{0} = default({1});", x.Name, sourceWriter.GetTypeName(x.Type));
                            sourceWriter.DecIndent();
                        }
                    }
                    else
                    {
                        sourceWriter.WriteLine("{0};", wrapExpression);
                    }
                }
            }

            if (!IsVoid(definition.ReturnType))
            {
                if (IsJavaObjectHandle(definition.ReturnType))
                {
                    sourceWriter.WriteLine("return Wrap(vmid, result);");
                }
                else if (IsBool(definition.ReturnType))
                {
                    sourceWriter.WriteLine("return ToBool(result);");
                }
                else if (IsStatusResult(definition.ReturnType))
                {
                    sourceWriter.WriteLine("return Succeeded(result);");
                }
                else
                {
                    sourceWriter.WriteLine("return result;");
                }
            }

            sourceWriter.DecIndent();
            sourceWriter.WriteLine("}}");
            sourceWriter.WriteLine();
        }