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