상속: IDisposable
예제 #1
0
        internal static Thread CreateReadingExecutingThread(int pid, string version)
        {
            Thread readAndExecuteThread = new Thread(() =>
            {
                try
                {
                    Program.serializer = new BinaryFormatter();
                    Program.serializer.Binder = new BinderHelper();
                    Program.engine = new Engine(pid, version);

                    while (true)
                    {
                        HandleInput();
                    }
                }
                catch (Exception e)
                {
                    if (Client.ClientStream.IsConnected)
                    {
                        Client.SendCriticalError(e.Message, e.Source, e.StackTrace, e.TargetSite.ToString());
                    }
                }
                finally
                {
                    if (Client.ClientStream.IsConnected)
                    {
                        Client.ShutDownServer(Client.ClientStream);
                        Client.ClientStream.Close();
                    }
                }
            });

            readAndExecuteThread.SetApartmentState(ApartmentState.STA);
            return readAndExecuteThread;
        }
예제 #2
0
 static void TestEngineDirectly(string Program , Languages Lang)
 {
     Engine engine = new Engine();
     InputData idata = new InputData()
     {
         Program = Program,
         Lang = Lang
     };
     var odata = engine.DoWork(idata);
     ShowData(odata);
 }
예제 #3
0
 static OutputData TestEngineDirectly(string Program, string Input, Languages Lang, string Args)
 {
     Engine engine = new Engine();
     InputData idata = new InputData()
     {
         Program = Program,
         Input = Input,
         Lang = Lang,
         Compiler_args = Args
     };
     return engine.DoWork(idata);
 }
예제 #4
0
        public Result DoWork(string Program, string Input, Languages Language, string user, string pass, string compiler_args = "", bool bytes = false, bool programCompressed = false, bool inputCompressed = false)
        {
            if(user != GlobalUtils.TopSecret.ServiceUser || pass != GlobalUtils.TopSecret.ServicePass)
            {
                return new Result()
                {
                    Errors = null,
                    Warnings = null,
                    Output = null,
                    Stats = null,
                    Exit_Status = null,
                    Exit_Code = null,
                    System_Error = "Not authorized."
                };
            }

            if(programCompressed)
                Program = Decompress(Program);
            if(inputCompressed)
                Input = Decompress(Input);

            if(!string.IsNullOrEmpty(Program) && Program.ToLower().Contains("setsid"))
            {
                return new Result()
                {
                    Errors = "setsid system call is not allowed."
                };
            }

            Engine engine = new Engine();
            InputData idata = new InputData()
            {
                Program = Program,
                Input = Input,
                Lang = Language,
                Compiler_args = compiler_args
            };

            var odata = engine.DoWork(idata);

            Regex r = new Regex(Engine.RootPath + @"\d+/source");
            if(Language == Languages.Javascript && !string.IsNullOrEmpty(odata.Output))
                odata.Output = r.Replace(odata.Output, "source_file");

            var res = new Result()
                {
                    Errors = !string.IsNullOrEmpty(odata.Errors) ? r.Replace(odata.Errors, "source_file") : odata.Errors,
                    Warnings = !string.IsNullOrEmpty(odata.Warnings) ? r.Replace(odata.Warnings, "source_file") : odata.Warnings,
                    Output = odata.Output,
                    Stats = odata.Stats,
                    Exit_Status = odata.Exit_Status,
                    Exit_Code = odata.ExitCode,
                    System_Error = odata.System_Error,
                    Files = odata.Files
                };
            if(!string.IsNullOrEmpty(odata.Output) && odata.Output.Length > 1000)
            {
                res.Output = Compress(odata.Output);
                res.IsOutputCompressed = true;
            }
            if(bytes)
            {
                if(!string.IsNullOrEmpty(res.Errors))
                {
                    res.Errors_Bytes =  System.Text.Encoding.Unicode.GetBytes(res.Errors);
                    res.Errors = null;
                }
                if(!string.IsNullOrEmpty(res.Warnings))
                {
                    res.Warnings_Bytes =  System.Text.Encoding.Unicode.GetBytes(res.Warnings);
                    res.Warnings = null;
                }
                if(!string.IsNullOrEmpty(res.Output))
                {
                    res.Output_Bytes =  System.Text.Encoding.Unicode.GetBytes(res.Output);
                    res.Output = null;
                }
            }
            return res;
        }