private static IntPtr[] GetPtrs() { if (Multithread) { long[] Arr = Ptrs.ToArray(); IntPtr[] Rst = new IntPtr[Arr.LongLength]; for (long i = 0; i < Rst.LongLength; i++) { Rst[i] = new IntPtr(Arr[i]); } return(Rst); } PipeWriter.Write((byte)PipeCommands.GetPtrs); PipeWriter.Flush(); long Count = PipeReader.ReadInt64(); IntPtr[] RstPtrs = new IntPtr[Count]; for (long i = 0; i < Count; i++) { RstPtrs[i] = new IntPtr(PipeReader.ReadInt64()); } return(RstPtrs); }
private static void AddPtr(IntPtr Ptr) { long Pointer = Ptr.ToInt64(); if (Multithread) { if (!Ptrs.Contains(Pointer)) { Ptrs.Add(Pointer); } return; } PipeWriter.Write((byte)PipeCommands.AddPtr); PipeWriter.Write(Pointer); PipeWriter.Flush(); }
private static void Service(string ServiceName) { StrRld = CreateDictionary(); MskRld = CreateDictionary(); Missed = new List <string>(); NamedPipeServerStream Server = new NamedPipeServerStream(ServiceName, PipeDirection.InOut, 2, PipeTransmissionMode.Byte); Server.WaitForConnection(); BinaryReader Reader = new BinaryReader(Server); BinaryWriter Writer = new BinaryWriter(Server); bool OK = true; while (Server.IsConnected) { PipeCommands Command = (PipeCommands)Reader.ReadByte(); Log("Command Recived: {0}", true, Command.ToString()); switch (Command) { case PipeCommands.AddReload: OK = true; string Original = Reader.ReadString(); string Reloader = Reader.ReadString(); if (!StrRld.ContainsKey(Original) || AllowDuplicates) { StrRld.Add(Original, Reloader); } Log("Command Finished, In: {0}, Out: {1}", true, 2, 0); break; case PipeCommands.FindReload: OK = true; bool Enforce = Reader.ReadByte() == (byte)PipeCommands.True; string Key = Reader.ReadString(); if (StrRld.ContainsKey(Key)) { Writer.Write((byte)PipeCommands.True); } else if (Enforce) { Writer.Write((byte)PipeCommands.False); } else if ((from x in Databases where x.ContainsKey(Key) select x).Count() > 0) { Writer.Write((byte)PipeCommands.True); } else { Writer.Write((byte)PipeCommands.False); } Writer.Flush(); Log("Command Finished, In: {0}, Out: {1}", true, 2, 1); break; case PipeCommands.GetReload: OK = true; string RLD = Reader.ReadString(); try { string Rst = null; if (StrRld.ContainsKey(RLD)) { Rst = StrRld[RLD]; } else { for (DBID = 0; DBID < Databases.Count; DBID++) { if (StrRld.ContainsKey(RLD)) { Rst = StrRld[RLD]; break; } } } Writer.Write(Rst); } catch (Exception ex) { Writer.Write(RLD); Log("Exception Handled\n=================\n{0}\n{1}", true, ex.Message, ex.StackTrace); } Writer.Flush(); Log("Command Finished, In: {0}, Out: {1}", true, 1, 1); break; case PipeCommands.AddMissed: OK = true; try { Missed.Add(Reader.ReadString()); } catch { } Log("Command Finished, In: {0}, Out: {1}", true, 1, 1); break; case PipeCommands.FindMissed: OK = true; if (Missed.Contains(Reader.ReadString())) { Writer.Write((byte)PipeCommands.True); } else { Writer.Write((byte)PipeCommands.False); } Writer.Flush(); Log("Command Finished, In: {0}, Out: {1}", true, 1, 1); break; case PipeCommands.AddPtr: OK = true; try { Ptrs.Add(Reader.ReadInt64()); } catch { } Log("Command Finished, In: {0}, Out: {1}", true, 1, 0); break; case PipeCommands.GetPtrs: OK = true; uint Replys = 1; Writer.Write(Ptrs.Count); foreach (long Ptr in Ptrs) { Writer.Write(Ptr); Replys++; } Writer.Flush(); Log("Command Finished, In: {0}, Out: {1}", true, 1, Replys); break; case PipeCommands.EndPipe: OK = true; Log("Exit Command Recived...", true); Environment.Exit(0); break; case PipeCommands.AddMask: OK = true; string Input = Reader.ReadString(); string Reload = Reader.ReadString(); if (!MskRld.ContainsKey(Input) || AllowDuplicates) { MskRld.Add(Input, Reload); } Log("Command Finished, In {0}, Out: {1}", true, 2, 0); break; case PipeCommands.ChkMask: string String = Reader.ReadString(); string[] Result = (from x in MskRld.Keys where MaskMatch(x, String) select x).ToArray(); Writer.Write((byte)((Result.Length > 0) ? PipeCommands.True : PipeCommands.False)); Writer.Flush(); Log("Command Finished, In: {0}, Out: {1}", true, 1, 1); break; case PipeCommands.RldMask: string Ori = Reader.ReadString(); string Mask = (from x in MskRld.Keys where MaskMatch(x, Ori) select x).FirstOrDefault(); string Rld = MskRld[Mask]; Writer.Write(MaskReplace(Mask, Ori, Rld)); Writer.Flush(); Log("Command Finished, In: {0}, Out: {1}", true, 2, 1); break; case PipeCommands.AdvDB: if (DBID >= Databases.Count) { return; } LastDBID++; DBID = LastDBID; Log("Command Finished, In: {0}, Out: {1}", true, 1, 0); break; case PipeCommands.GetDBID: Writer.Write(DBID); Writer.Flush(); Log("Command Finished, In: {0}, Out: {1}", true, 1, 1); break; case PipeCommands.SetDBID: DBID = Reader.ReadInt32(); Log("Command Finished, In: {0}, Out: {1}", true, 2, 0); break; case PipeCommands.GetDBIndex: Writer.Write(((DuplicableDictionary <string, string>)StrRld).LastKeyIndex); Writer.Flush(); Log("Command Finished, In: {0}, Out: {1}", true, 1, 1); break; default: if (!OK) { MessageBox.Show("Recived Invalid Command to the pipe service...", "SRL Engine", MessageBoxButtons.OK, MessageBoxIcon.Error); } OK = false; break; } } Server.Close(); Reader.Close(); Writer.Close(); }