private static void ReadCallback(IAsyncResult ar) { // Retrieve the state object and the handler socket // from the asynchronous state object. var state = (StateObject)ar.AsyncState; var handler = state.WorkSocket; // Read data from the client socket. var bytesRead = handler.EndReceive(ar); if (bytesRead <= 0) { return; } if (state.BufferSize == -1) { if (bytesRead != StateObject.HeaderBufferSize || state.RecvCount != 0) { throw new Exception("AGGGRRR"); } var cmd = BitConverter.ToInt32(state.HeaderBuffer, 0); if (cmd <= 0) { return; } state.BufferSize = cmd; Program.WriteLine("[AGENT] Buffer size is " + state.BufferSize); state.Buffer = new byte[state.BufferSize]; // Not all data received. Get more. handler.BeginReceive(state.Buffer, 0, state.BufferSize, 0, ReadCallback, state); //if (cmd == -1) //{ // Program.WriteLine("[AGENT] command newpatch"); // if (Directory.Exists("newpatch")) // { // PATCHER.patch("newpatch"); // PATCHER.restartall(); // } //} } else { state.RecvCount += bytesRead; if (state.RecvCount < state.BufferSize) { // Not all data received. Get more. handler.BeginReceive(state.Buffer, state.RecvCount, state.BufferSize - state.RecvCount, 0, ReadCallback, state); } else if (AcceptPatches) { var formatter = new BinaryFormatter(); var buffer = new MemoryStream(state.Buffer); var patch = (object[][])formatter.Deserialize(buffer); object[] currentomi; // get a copy of current omi to update it using (var source = File.OpenRead(@"versioning\current\Res-Tex\omi.tex")) currentomi = FormatterOmi.Read(source); DBstuff.UpdateDB(patch, currentomi[0] as object[][]); Patcher.EmptyFolder("temp"); Directory.CreateDirectory(@"temp\Res-Tex"); using (var dest = File.OpenWrite(@"temp\Res-Tex\omi.tex")) FormatterOmi.Write(dest, currentomi); Patcher.AddNewPatch(new DirectoryInfo("temp")); Patcher.RestartAll(); Send(handler, new byte[] { 0xFF, 0xFF, 0xFF, 0xFF }); } else { Send(handler, new byte[] { 0xFF, 0xFF, 0, 0 }); } } }
private static void Exec(string cmd) { if (cmd.Length <= 0) { return; } switch (cmd) { case "newpatch": { var di = new DirectoryInfo("newpatch"); if (di.Exists) { Patcher.AddNewPatch(di); Patcher.RestartAll(); } else { WriteLine("newpatch directory does not exit"); } break; } case "forcepatch": { var di = new DirectoryInfo("newpatch"); if (di.Exists) { Patcher.AddNewPatch(di, true); Patcher.RestartAll(); } else { WriteLine("newpatch directory does not exit"); } break; } case "restartall": Patcher.RestartAll(); break; case "killall": Patcher.KillAll(); break; default: if (cmd.StartsWith("setversion:")) { Patcher.ChangeVersion(Patcher.StrToVer(cmd.Substring("setversion:".Length))); } else if (cmd.StartsWith("tcpserver:")) { bool opt; if (bool.TryParse(cmd.Substring("tcpserver:".Length), out opt)) { WriteLine("TCP server is " + (opt ? "enabled." : "disabled.")); Server.AcceptPatches = opt; } } else if (cmd == "version") { WriteLine(Patcher.VerToStr(Patcher.Version)); } else { WriteLine("Doing nothing, unknown command."); } break; } }