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); }
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(); }
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(); }
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(); }
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("}}"); }
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(")"); }
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(); }