Пример #1
0
 private void WriteApplicationEnums(WindowsAccessBridgeModel model, StreamWriter writer, SourceCodeWriter sourceWriter)
 {
     model.Enums.ForEach(x => {
         WriteEnum(model, sourceWriter, x);
         writer.WriteLine();
     });
 }
Пример #2
0
        private void WriteApplicationEventHandler(WindowsAccessBridgeModel model, SourceCodeWriter sourceWriter, EventDefinition definition)
        {
            sourceWriter.WriteIndent();
            sourceWriter.Write("protected virtual ");
            WriteFunctionSignature(model, sourceWriter, definition.DelegateFunction, "On" + definition.Name);
            sourceWriter.Write(" {{");
            sourceWriter.WriteLine();
            sourceWriter.IncIndent();
            sourceWriter.WriteLine("var handler = _{0};", ToPascalCase(definition));
            sourceWriter.WriteLine("if (handler != null)");
            sourceWriter.IncIndent();
            sourceWriter.WriteIndent();
            sourceWriter.Write("handler(");
            var first = true;

            foreach (var p in definition.DelegateFunction.Parameters)
            {
                if (first)
                {
                    first = false;
                }
                else
                {
                    sourceWriter.Write(", ");
                }
                sourceWriter.Write("{0}", p.Name);
            }
            sourceWriter.Write(");");
            sourceWriter.WriteLine();
            sourceWriter.DecIndent();
            sourceWriter.DecIndent();
            sourceWriter.WriteLine("}}");
        }
Пример #3
0
 private void WriteLibraryClass(WindowsAccessBridgeModel model, SourceCodeWriter sourceWriter, ClassDefinition definition)
 {
     WriteStructLayoutAttributeLine(sourceWriter);
     sourceWriter.WriteLine("internal class {0} {{", sourceWriter.GetTypeName(definition.Name));
     WriteFields(model, sourceWriter, definition);
     sourceWriter.WriteLine("}}");
 }
Пример #4
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);
        }
Пример #5
0
 private void WriteApplicationClasses(WindowsAccessBridgeModel model, StreamWriter writer, SourceCodeWriter sourceWriter)
 {
     sourceWriter.IsNativeTypes = false;
     model.Classes.ForEach(x => {
         WriteApplicationClass(model, sourceWriter, x);
         writer.WriteLine();
     });
 }
Пример #6
0
 private void WriteLibrayrFunctionsDelegate(WindowsAccessBridgeModel model, SourceCodeWriter sourceWriter, FunctionDefinition function)
 {
     sourceWriter.WriteLine("[UnmanagedFunctionPointer(CallingConvention.Cdecl, CharSet = CharSet.Unicode)]");
     sourceWriter.WriteIndent();
     sourceWriter.Write("public delegate ");
     WriteFunctionSignature(model, sourceWriter, function, string.Format("{0}FP", function.Name));
     sourceWriter.Write(";");
     sourceWriter.WriteLine();
 }
Пример #7
0
 private void WriteApplicationFunction(WindowsAccessBridgeModel model, SourceCodeWriter sourceWriter, FunctionDefinition definition)
 {
     WriteXmlDocDefinition(sourceWriter, definition.XmlDocDefinition);
     sourceWriter.WriteIndent();
     sourceWriter.Write("public abstract ");
     WriteFunctionSignature(model, sourceWriter, definition);
     sourceWriter.Write(";");
     sourceWriter.WriteLine();
 }
Пример #8
0
 private void WriteApplicationClass(WindowsAccessBridgeModel model, SourceCodeWriter sourceWriter, ClassDefinition definition)
 {
     if (!model.ClassNeedsWrapper(definition))
     {
         WriteStructLayoutAttributeLine(sourceWriter);
     }
     sourceWriter.WriteLine("public class {0} {{", sourceWriter.GetTypeName(definition.Name));
     WriteFields(model, sourceWriter, definition);
     sourceWriter.WriteLine("}}");
 }
Пример #9
0
        private void WriteEntryPointsClass(WindowsAccessBridgeModel model, SourceCodeWriter sourceWriter)
        {
            sourceWriter.IsNativeTypes = true;
            sourceWriter.WriteLine("/// <summary>");
            sourceWriter.WriteLine("/// Container of {0} WindowAccessBridge DLL entry points", GetLegacySuffix(sourceWriter));
            sourceWriter.WriteLine("/// </summary>");
            sourceWriter.WriteLine("internal class AccessBridgeEntryPoints{0} {{", GetLegacySuffix(sourceWriter));
            sourceWriter.IncIndent();

            sourceWriter.WriteLine("#region Functions");
            foreach (var function in model.Functions)
            {
                WriteLibraryFunctionProperty(sourceWriter, function);
            }
            sourceWriter.WriteLine("#endregion");
            sourceWriter.WriteLine();

            sourceWriter.WriteLine("#region Event functions");
            foreach (var eventDefinition in model.Events)
            {
                WriteLibraryEventProperty(sourceWriter, eventDefinition);
            }
            sourceWriter.WriteLine("#endregion");
            sourceWriter.WriteLine();

            sourceWriter.WriteLine("#region Function delegate types");
            foreach (var function in model.Functions)
            {
                WriteLibrayrFunctionsDelegate(model, sourceWriter, function);
            }
            sourceWriter.WriteLine("#endregion");
            sourceWriter.WriteLine();

            sourceWriter.WriteLine("#region Event delegate types");
            foreach (var definition in model.Events)
            {
                sourceWriter.WriteLine("[UnmanagedFunctionPointer(CallingConvention.Cdecl, CharSet = CharSet.Unicode)]");
                WriteDelegateType(model, sourceWriter, definition.DelegateFunction);
            }
            sourceWriter.WriteLine("#endregion");
            sourceWriter.WriteLine();

            sourceWriter.WriteLine("#region Event function delegate types");
            foreach (var eventDefinition in model.Events)
            {
                sourceWriter.WriteLine("[UnmanagedFunctionPointer(CallingConvention.Cdecl, CharSet = CharSet.Unicode)]");
                WriteLibraryEventDelegateType(sourceWriter, eventDefinition);
            }
            sourceWriter.WriteLine("#endregion");

            sourceWriter.DecIndent();
            sourceWriter.WriteLine("}}");
            sourceWriter.WriteLine();
        }
Пример #10
0
 private void WriteLibraryClasses(WindowsAccessBridgeModel model, StreamWriter writer, SourceCodeWriter sourceWriter)
 {
     sourceWriter.IsNativeTypes = true;
     model.Classes.ForEach(x => {
         if (model.ClassNeedsWrapper(x))
         {
             WriteLibraryClass(model, sourceWriter, x);
             writer.WriteLine();
         }
     });
 }
Пример #11
0
 private void WriteApplicationEventHandlerTypes(WindowsAccessBridgeModel model, SourceCodeWriter sourceWriter)
 {
     sourceWriter.IsNativeTypes = false;
     sourceWriter.WriteLine("#region Delegate types for events defined in AccessBridgeEvents");
     foreach (var eventDefinition in model.Events)
     {
         sourceWriter.WriteLine("/// <summary>Delegate type for <code>{0}</code> event</summary>", eventDefinition.Name);
         WriteEventHandlerType(model, sourceWriter, eventDefinition);
         sourceWriter.WriteLine();
     }
     sourceWriter.WriteLine("#endregion");
     sourceWriter.WriteLine();
 }
Пример #12
0
 // ReSharper disable once UnusedParameter.Local
 private void WriteEnumMembers(WindowsAccessBridgeModel model, SourceCodeWriter sourceWriter, EnumDefinition definition)
 {
     sourceWriter.IncIndent();
     definition.Members.ForEach(x => {
         sourceWriter.WriteIndent();
         sourceWriter.Write("{0}", x.Name);
         if (!string.IsNullOrEmpty(x.Value))
         {
             sourceWriter.Write(" = {0}", x.Value);
         }
         sourceWriter.Write(",");
         sourceWriter.WriteLine();
     });
     sourceWriter.DecIndent();
 }
Пример #13
0
        private void WriteApplicationFunctionsClass(WindowsAccessBridgeModel model, SourceCodeWriter sourceWriter)
        {
            sourceWriter.IsNativeTypes = false;
            sourceWriter.WriteLine("/// <summary>");
            sourceWriter.WriteLine("/// Implementation of <see cref=\"AccessBridgeFunctions\"/> using <code>WindowsAccessBridge DLL</code>", GetLegacySuffix(sourceWriter));
            sourceWriter.WriteLine("/// entry points implemented in <see cref=\"AccessBridgeEntryPoints{0}\"/>", GetLegacySuffix(sourceWriter));
            sourceWriter.WriteLine("/// </summary>");
            sourceWriter.WriteLine("internal partial class AccessBridgeNativeFunctions{0} : AccessBridgeFunctions {{", GetLegacySuffix(sourceWriter));
            sourceWriter.IncIndent();

            sourceWriter.WriteLine();
            sourceWriter.WriteLine("#region Function implementations");
            sourceWriter.WriteLine();
            foreach (var function in model.Functions)
            {
                WriteApplicationFunctionImplementation(model, sourceWriter, function);
            }
            sourceWriter.WriteLine("#endregion");
            sourceWriter.WriteLine();

            sourceWriter.WriteLine("#region Wrap/Unwrap structs");
            sourceWriter.WriteLine();
            foreach (var definition in model.Structs)
            {
                if (model.StructNeedsWrapper(definition))
                {
                    WriteApplicationWrapStructFunctions(model, sourceWriter, definition);
                }
            }
            sourceWriter.WriteLine("#endregion");
            sourceWriter.WriteLine();

            sourceWriter.WriteLine("#region CopyWrap/CopyUnwrap classes");
            sourceWriter.WriteLine();
            foreach (var definition in model.Classes)
            {
                if (model.ClassNeedsWrapper(definition))
                {
                    WriteApplicationCopyClassFunctions(model, sourceWriter, definition);
                }
            }
            sourceWriter.WriteLine("#endregion");
            sourceWriter.WriteLine();

            sourceWriter.DecIndent();
            sourceWriter.WriteLine("}}");
            sourceWriter.WriteLine();
        }
Пример #14
0
 private void WriteApplicationFunctionsInterface(WindowsAccessBridgeModel model, SourceCodeWriter sourceWriter)
 {
     sourceWriter.IsNativeTypes = false;
     sourceWriter.WriteLine("/// <summary>");
     sourceWriter.WriteLine("/// Common (i.e. legacy and non-legacy) abstraction over <code>WindowsAccessBridge DLL</code> functions");
     sourceWriter.WriteLine("/// </summary>");
     sourceWriter.WriteLine("public abstract class AccessBridgeFunctions {{");
     sourceWriter.IncIndent();
     foreach (var function in model.Functions)
     {
         WriteApplicationFunction(model, sourceWriter, function);
     }
     sourceWriter.DecIndent();
     sourceWriter.WriteLine("}}");
     sourceWriter.WriteLine();
 }
Пример #15
0
 private void WriteCopyField(WindowsAccessBridgeModel model, SourceCodeWriter sourceWriter, string infosrc, string infodest, string fieldName, TypeReference type)
 {
     if (model.IsStruct(type))
     {
         sourceWriter.WriteLine("{0}{1} = {4}(vmid, {2}{3});", infodest, fieldName, infosrc, fieldName,
                                sourceWriter.IsNativeTypes ? "Wrap" : "Unwrap");
     }
     else if (model.IsClass(type))
     {
         sourceWriter.WriteLine("{4}(vmid, {0}{1}, {2}{3});", infosrc, fieldName, infodest, fieldName,
                                sourceWriter.IsNativeTypes ? "CopyWrap" : "CopyUnwrap");
     }
     else if (IsJavaObjectHandle(type))
     {
         sourceWriter.WriteLine("{0}{1} = {4}(vmid, {2}{3});", infodest, fieldName, infosrc, fieldName,
                                sourceWriter.IsNativeTypes ? "Wrap" : "Unwrap");
     }
     else if (type is ArrayTypeReference)
     {
         var elementType          = ((ArrayTypeReference)type).ElementType;
         var elementCountFiedName = ((ArrayTypeReference)type).ElementCountAttribute == null ? null : ((ArrayTypeReference)type).ElementCountAttribute.FieldName;
         sourceWriter.WriteLine("if ({0}{1} != null) {{", infosrc, fieldName);
         sourceWriter.IncIndent();
         if (elementCountFiedName == null)
         {
             sourceWriter.WriteLine("var count = {0}{1}.Length;", infosrc, fieldName);
         }
         else
         {
             sourceWriter.WriteLine("var count = {0}.{1};", infosrc, elementCountFiedName);
         }
         sourceWriter.IsNativeTypes = !sourceWriter.IsNativeTypes;
         sourceWriter.WriteLine("{0}{1} = new {2}[count];", infodest, fieldName, sourceWriter.GetTypeName(elementType));
         sourceWriter.IsNativeTypes = !sourceWriter.IsNativeTypes;
         sourceWriter.WriteLine("for(var i = 0; i < count; i++) {{");
         sourceWriter.IncIndent();
         WriteCopyField(model, sourceWriter, infosrc + fieldName, infodest + fieldName, "[i]", elementType);
         sourceWriter.DecIndent();
         sourceWriter.WriteLine("}}");
         sourceWriter.DecIndent();
         sourceWriter.WriteLine("}}");
     }
     else
     {
         sourceWriter.WriteLine("{0}{1} = {2}{3};", infodest, fieldName, infosrc, fieldName);
     }
 }
Пример #16
0
 private void WriteDelegateType(WindowsAccessBridgeModel model, SourceCodeWriter sourceWriter, FunctionDefinition definition)
 {
     if (sourceWriter.IsNativeTypes)
     {
         if (definition.MarshalAs != null)
         {
             sourceWriter.WriteIndent();
             sourceWriter.WriteMashalAs(definition.MarshalAs);
             sourceWriter.WriteLine();
         }
     }
     sourceWriter.WriteIndent();
     sourceWriter.Write("public delegate ");
     WriteFunctionSignature(model, sourceWriter, definition);
     sourceWriter.Write(";");
     sourceWriter.WriteLine();
 }
Пример #17
0
 private void WriteApplicationEventsInterface(WindowsAccessBridgeModel model, SourceCodeWriter sourceWriter)
 {
     sourceWriter.IsNativeTypes = false;
     sourceWriter.WriteLine("/// <summary>");
     sourceWriter.WriteLine("/// Common (i.e. legacy and non-legacy)  abstraction over <code>WindowsAccessBridge DLL</code> events");
     sourceWriter.WriteLine("/// </summary>");
     sourceWriter.WriteLine("public abstract class AccessBridgeEvents : IDisposable {{");
     sourceWriter.IncIndent();
     foreach (var eventDefinition in model.Events)
     {
         WriteApplicationEvent(sourceWriter, eventDefinition);
     }
     sourceWriter.WriteLine();
     sourceWriter.WriteLine("public abstract void Dispose();");
     sourceWriter.DecIndent();
     sourceWriter.WriteLine("}}");
     sourceWriter.WriteLine();
 }
Пример #18
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();
 }
Пример #19
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("}}");
 }
Пример #20
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();
        }
Пример #21
0
        private void WriteApplicationEventForwarder(WindowsAccessBridgeModel model, SourceCodeWriter sourceWriter, EventDefinition definition)
        {
            sourceWriter.IsNativeTypes = true;
            sourceWriter.WriteIndent();
            sourceWriter.Write("private ");
            WriteFunctionSignature(model, sourceWriter, definition.DelegateFunction, "Forward" + definition.Name);
            sourceWriter.Write(" {{");
            sourceWriter.WriteLine();

            sourceWriter.IsNativeTypes = false;
            sourceWriter.IncIndent();
            sourceWriter.WriteIndent();
            sourceWriter.Write("On{0}(", definition.Name);
            var first = true;

            foreach (var p in definition.DelegateFunction.Parameters)
            {
                if (first)
                {
                    first = false;
                }
                else
                {
                    sourceWriter.Write(", ");
                }
                if (IsJavaObjectHandle(p.Type))
                {
                    sourceWriter.Write("Wrap(vmid, {0})", p.Name);
                }
                else
                {
                    sourceWriter.Write("{0}", p.Name);
                }
            }
            sourceWriter.Write(");");
            sourceWriter.WriteLine();
            sourceWriter.DecIndent();
            sourceWriter.WriteLine("}}");
        }
Пример #22
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(")");
        }
Пример #23
0
        private void WriteFile(WindowsAccessBridgeModel model)
        {
            using (var writer = File.CreateText(_options.PublicClassesOutputFileName)) {
                using (var sourceWriter = new SourceCodeWriter(writer, model)) {
                    WriteSourceFileHeader(sourceWriter);

                    sourceWriter.StartNamespace("WindowsAccessBridgeInterop");
                    WriteApplicationFunctionsInterface(model, sourceWriter);
                    WriteApplicationEventsInterface(model, sourceWriter);
                    WriteApplicationEventHandlerTypes(model, sourceWriter);
                    WriteApplicationEnums(model, writer, sourceWriter);
                    WriteApplicationStructs(model, sourceWriter, writer);
                    WriteApplicationClasses(model, writer, sourceWriter);
                    sourceWriter.EndNamespace();
                }
            }

            foreach (var legacy in new[] { false, true })
            {
                using (var writer = File.CreateText(legacy ? _options.InternalLegacyClassesOutputFileName : _options.InternalClassesOutputFileName)) {
                    using (var sourceWriter = new SourceCodeWriter(writer, model)) {
                        sourceWriter.IsLegacy = legacy;
                        WriteSourceFileHeader(sourceWriter);

                        sourceWriter.StartNamespace("WindowsAccessBridgeInterop");
                        WriteApplicationFunctionsClass(model, sourceWriter);
                        WriteApplicationEventsClass(model, sourceWriter);

                        sourceWriter.IsNativeTypes = true;
                        WriteEntryPointsClass(model, sourceWriter);
                        WriteLibraryStructs(model, sourceWriter, writer);
                        WriteLibraryClasses(model, writer, sourceWriter);
                        sourceWriter.EndNamespace();
                    }
                }
            }
        }
Пример #24
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();
        }
Пример #25
0
        private void WriteApplicationEventsClass(WindowsAccessBridgeModel model, SourceCodeWriter sourceWriter)
        {
            sourceWriter.IsNativeTypes = false;
            sourceWriter.WriteLine("/// <summary>");
            sourceWriter.WriteLine("/// Implementation of <see cref=\"AccessBridgeEvents\"/> over {0} WindowsAccessBridge entry points", GetLegacySuffix(sourceWriter));
            sourceWriter.WriteLine("/// </summary>");
            sourceWriter.WriteLine("internal partial class AccessBridgeNativeEvents{0} : AccessBridgeEvents {{", GetLegacySuffix(sourceWriter));
            sourceWriter.IncIndent();

            sourceWriter.WriteLine("#region Event fields");
            foreach (var eventDefinition in model.Events)
            {
                WriteApplicationEventField(sourceWriter, eventDefinition);
            }
            sourceWriter.WriteLine("#endregion");
            sourceWriter.WriteLine();

            sourceWriter.WriteLine("#region Native callback keep-alive fields");
            foreach (var eventDefinition in model.Events)
            {
                WriteApplicationEventKeepAliveField(sourceWriter, eventDefinition);
            }
            sourceWriter.WriteLine("#endregion");
            sourceWriter.WriteLine();

            sourceWriter.WriteLine("#region Event properties");
            foreach (var eventDefinition in model.Events)
            {
                WriteApplicationEventProperty(sourceWriter, eventDefinition);
            }
            sourceWriter.WriteLine("#endregion");
            sourceWriter.WriteLine();

            sourceWriter.WriteLine("#region Event handlers");
            foreach (var eventDefinition in model.Events)
            {
                WriteApplicationEventHandler(model, sourceWriter, eventDefinition);
            }
            sourceWriter.WriteLine("#endregion");
            sourceWriter.WriteLine();

            sourceWriter.WriteLine("private void DetachForwarders() {{");
            sourceWriter.IncIndent();
            foreach (var definition in model.Events)
            {
                sourceWriter.WriteLine("EntryPoints.Set{0}(null);", definition.Name);
                sourceWriter.WriteLine("_{0} = null;", ToPascalCase(definition));
                sourceWriter.WriteLine("_forward{0}KeepAlive = null;", definition.Name);
                sourceWriter.WriteLine();
            }
            sourceWriter.DecIndent();
            sourceWriter.WriteLine("}}");
            sourceWriter.WriteLine();

            sourceWriter.WriteLine("#region Event forwarders");
            foreach (var eventDefinition in model.Events)
            {
                WriteApplicationEventForwarder(model, sourceWriter, eventDefinition);
            }
            sourceWriter.WriteLine("#endregion");

            sourceWriter.DecIndent();
            sourceWriter.WriteLine("}}");
            sourceWriter.WriteLine();
        }
Пример #26
0
 private void WriteFields(WindowsAccessBridgeModel model, SourceCodeWriter sourceWriter, TypeDefinition definition)
 {
     sourceWriter.IncIndent();
     definition.Fields.ForEach(f => WriteField(model, sourceWriter, definition, f));
     sourceWriter.DecIndent();
 }
Пример #27
0
 private void WriteEventHandlerType(WindowsAccessBridgeModel model, SourceCodeWriter sourceWriter, EventDefinition definition)
 {
     WriteDelegateType(model, sourceWriter, definition.DelegateFunction);
 }
Пример #28
0
 private void WriteFunctionSignature(WindowsAccessBridgeModel model, SourceCodeWriter sourceWriter, FunctionDefinition definition)
 {
     WriteFunctionSignature(model, sourceWriter, definition, definition.Name);
 }
Пример #29
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();
        }
Пример #30
0
 private void WriteCopyFields(WindowsAccessBridgeModel model, SourceCodeWriter sourceWriter, string infosrc, string infodest, TypeDefinition definition)
 {
     definition.Fields.ForEach(field => {
         WriteCopyField(model, sourceWriter, infosrc, infodest, "." + field.Name, field.Type);
     });
 }