Ejemplo n.º 1
0
        private void PlatformInterfaceMethod(SteamApiDefinition.MethodDef m)
        {
            var arguments = BuildArguments(m.Params);
            var ret       = new Argument("return", m.ReturnType, TypeDefs);

            var methodName = m.Name;

            if (LastMethodName == methodName)
            {
                methodName = methodName + "0";
            }

            var flatName = $"SteamAPI_{m.ClassName}_{methodName}";

            if (m.ClassName == "SteamApi")
            {
                flatName = methodName;
            }

            var argstring = string.Join(", ", arguments.Select(x => x.InteropParameter(true, true)));

            if (argstring != "")
            {
                argstring = $" {argstring} ";
            }

            WriteLine($"{ret.Return()} {m.ClassName}_{methodName}({argstring});");
            LastMethodName = m.Name;
        }
Ejemplo n.º 2
0
        private void CallPlatformClass(string classname, SteamApiDefinition.MethodDef m, List <string> argList, string returnVar)
        {
            if (classname == null)
            {
                classname = "SteamApi";
            }

            var methodName = m.Name;

            if (LastMethodName == methodName)
            {
                methodName += "0";
            }

            var args = string.Join(", ", argList);

            if (args != "")
            {
                args = $" {args} ";
            }

            var r = "";

            if (ReturnType != "void")
            {
                r = "return ";
            }

            if (returnVar != "")
            {
                r = returnVar + " = ";
            }

            BeforeLines.Add($"{r}platform.{classname}_{methodName}({args});");
        }
        private void WriteMarshalledFunction(SteamApiDefinition.MethodDef func)
        {
            var returnType = BaseType.Parse(func.ReturnType);

            returnType.Func = func.Name;

            if (func.Params == null)
            {
                func.Params = new SteamApiDefinition.MethodDef.ParamType[0];
            }

            var args = func.Params.Select(x =>
            {
                var bt  = BaseType.Parse(x.Type, x.Name);
                bt.Func = func.Name;
                return(bt);
            }).ToArray();
            var argstr         = string.Join(", ", args.Select(x => x.AsArgument()));
            var delegateargstr = string.Join(", ", args.Select(x => x.AsArgument()));

            WriteLine($"[DllImport( Platform.LibraryName, EntryPoint = \"{func.Name}\", CallingConvention = CallingConvention.Cdecl )]");

            if (returnType.ReturnAttribute != null)
            {
                WriteLine(returnType.ReturnAttribute);
            }

            WriteLine($"public static extern {(returnType.IsReturnedWeird ? "void" : returnType.TypeNameFrom)} {func.Name}( {delegateargstr} );");
            WriteLine();
        }
Ejemplo n.º 4
0
        private void ClassMethod(string classname, SteamApiDefinition.MethodDef m)
        {
            var argList  = BuildArguments(m.Params);
            var callargs = BuildArguments(m.Params);

            BeforeLines = new List <string>();
            AfterLines  = new List <string>();
            ReturnType  = ToManagedType(m.ReturnType);
            ReturnVar   = "";
            MethodDef   = m;
            ClassName   = classname;

            var statc = classname == null ? " static" : "";

            Detect_VectorReturn(argList, callargs);
            Detect_InterfaceReturn(argList, callargs);
            Detect_StringFetch(argList, callargs);
            Detect_StringReturn(argList, callargs);
            Detect_MatchmakingFilters(argList, callargs);
            Detect_ReturningStruct();
            Detect_IntPtrArgs(argList, callargs);
            Detect_MultiSizeArrayReturn(argList, callargs);
            Detect_StringArray(argList, callargs);
            Detect_CallResult(argList, callargs);

            var methodName = m.Name;

            if (LastMethodName == methodName)
            {
                methodName += MethodNameCount.ToString();
                MethodNameCount++;
            }
            else
            {
                MethodNameCount = 0;
            }

            var argString = string.Join(", ", argList.Select(x => x.ManagedParameter()));

            if (argString != "")
            {
                argString = " " + argString + " ";
            }
            StartBlock($"public{statc} {ReturnType} {methodName}({argString})");

            CallPlatformClass(classname, m, callargs.Select(x => x.InteropVariable(true)).ToList(), ReturnVar);

            WriteLines(BeforeLines);

            WriteLines(AfterLines);

            EndBlock();
            WriteLine();

            LastMethodName = m.Name;
        }
        private void WriteGlobalFunction(string cname, SteamApiDefinition.MethodDef func)
        {
            var cleanName = func.Name.Substring(cname.Length).Trim('_');

            var returnType = BaseType.Parse(func.ReturnType);

            returnType.Func = func.Name;

            if (func.Params == null)
            {
                func.Params = new SteamApiDefinition.MethodDef.ParamType[0];
            }

            var args = func.Params.Select(x =>
            {
                var bt  = BaseType.Parse(x.Type, x.Name);
                bt.Func = func.Name;
                return(bt);
            }).ToArray();
            var argstr         = string.Join(", ", args.Select(x => x.AsArgument()));
            var delegateargstr = string.Join(", ", args.Select(x => x.AsArgument()));

            if (returnType.IsReturnedWeird)
            {
                throw new System.Exception("TODO");
            }

            StartBlock($"static internal {returnType.ReturnType} {cleanName}( {argstr} )");
            {
                var callargs = string.Join(", ", args.Select(x => x.AsCallArgument()));

                if (returnType.IsReturnedWeird)
                {
                    WriteLine($"var retVal = default( {returnType.TypeName} );");
                    WriteLine($"Native.{func.Name}( ref retVal, {callargs} );");
                    WriteLine($"{returnType.Return( "retVal" )}");
                }
                else if (returnType.IsVoid)
                {
                    WriteLine($"Native.{func.Name}( {callargs} );");
                }
                else
                {
                    var v = $"Native.{func.Name}( {callargs} )";

                    WriteLine(returnType.Return(v));
                }
            }
            EndBlock();
        }
Ejemplo n.º 6
0
        private void InteropClassMethod(string library, string classname, SteamApiDefinition.MethodDef methodDef)
        {
            var arguments = BuildArguments(methodDef.Params);
            var ret       = new Argument("return", methodDef.ReturnType, TypeDefs);

            var methodName = methodDef.Name;

            if (LastMethodName == methodName)
            {
                methodName = methodName + "0";
            }

            var flatName = $"SteamAPI_{classname}_{methodName}";

            if (classname == "SteamApi")
            {
                flatName = methodName;
            }

            var argstring = string.Join(", ", arguments.Select(x => x.InteropParameter(LargePack, true)));

            if (methodDef.NeedsSelfPointer)
            {
                argstring = "IntPtr " + classname + (argstring.Length > 0 ? ", " : "") + argstring;
            }

            if (argstring != "")
            {
                argstring = $" {argstring} ";
            }

            if (X86)
            {
                Write($"[DllImport( \"{library}\", CallingConvention = CallingConvention.Cdecl )] ");
            }
            else
            {
                Write($"[DllImport( \"{library}\" )] ");
            }

            if (ret.Return() == "bool")
            {
                WriteLine("[return: MarshalAs(UnmanagedType.U1)]");
            }

            WriteLine($"internal static extern {ret.Return()} {flatName}({argstring});");
            LastMethodName = methodDef.Name;
        }
Ejemplo n.º 7
0
        private void PlatformClassMethod(string classname, SteamApiDefinition.MethodDef methodDef)
        {
            var arguments = BuildArguments(methodDef.Params);

            var ret = new Argument("return", methodDef.ReturnType, TypeDefs);

            var methodName = methodDef.Name;

            if (LastMethodName == methodName)
            {
                methodName = methodName + "0";
            }

            var flatName = $"SteamAPI_{classname}_{methodName}";

            if (classname == "SteamApi")
            {
                flatName = methodName;
            }

            var argstring = string.Join(", ", arguments.Select(x => x.InteropParameter(true, true)));

            if (argstring != "")
            {
                argstring = $" {argstring} ";
            }

            StartBlock($"public virtual {ret.Return()} {classname}_{methodName}({argstring})");
            {
                //  var vars = string.Join( " + \",\" + ", arguments.Where( x => !x.InteropParameter( true, true ).StartsWith( "out " ) ).Select( x => x.Name ) );
                //   if ( vars != "" ) vars = "\" + " + vars + " + \"";
                //   WriteLine( $"Console.WriteLine( \"{classname}_{methodName}( {vars} )\" );" );

                if (methodDef.NeedsSelfPointer)
                {
                    WriteLine($"if ( _ptr == IntPtr.Zero ) throw new System.Exception( \"{classname} _ptr is null!\" );");
                    WriteLine();
                }

                var retcode = "";
                if (ret.NativeType != "void")
                {
                    retcode = "return ";
                }

                AfterLines = new List <string>();

                foreach (var a in arguments)
                {
                    if (a.InteropParameter(LargePack).Contains(".PackSmall"))
                    {
                        WriteLine($"var {a.Name}_ps = new {a.ManagedType.Trim( '*' )}.PackSmall();");
                        AfterLines.Add($"{a.Name} = {a.Name}_ps;");
                        a.Name = "ref " + a.Name + "_ps";

                        if (retcode != "")
                        {
                            retcode = "var ret = ";
                        }
                    }
                }

                argstring = string.Join(", ", arguments.Select(x => x.InteropVariable(false)));

                if (methodDef.NeedsSelfPointer)
                {
                    argstring = "_ptr" + (argstring.Length > 0 ? ", " : "") + argstring;
                }

                WriteLine($"{retcode}Native.{flatName}({argstring});");

                WriteLines(AfterLines);

                if (retcode.StartsWith("var"))
                {
                    WriteLine("return ret;");
                }
            }
            EndBlock();

            LastMethodName = methodDef.Name;
        }