/// <summary> /// Process IPC message and fire corresponding event. /// </summary> private void ProcessMessage(byte[] message) { Command command = (Command)message[0]; switch (command) { case Command.Ping: dPing ping = PingEvent; if (ping != null) { ThreadPool.QueueUserWorkItem(delegate { ping(0); }); } return; case Command.PingResponse: dPingResponse pingResponse = PingResponseEvent; if (pingResponse != null) { ThreadPool.QueueUserWorkItem(delegate { pingResponse(0); }); } return; case Command.SendPacket: dSendPacket sendPacket = SendPacketEvent; if (sendPacket != null) { int caveAddress = BitConverter.ToInt32(message, 3); PacketType packetType = (PacketType)message[7]; byte[] packet = new byte[message.Length - 8]; Buffer.BlockCopy(message, 8, packet, 0, packet.Length); ThreadPool.QueueUserWorkItem(delegate { sendPacket(caveAddress, packetType, packet); }); } return; case Command.AddSendFilter: dAddSendFilter addSendFilter = AddSendFilterEvent; if (addSendFilter != null) { ThreadPool.QueueUserWorkItem(delegate { addSendFilter(message[1]); }); } return; case Command.AddRecvFilter: dAddRecvFilter addRecvFilter = AddRecvFilterEvent; if (addRecvFilter != null) { ThreadPool.QueueUserWorkItem(delegate { addRecvFilter(message[1]); }); } return; case Command.RemoveRecvFilter: dRemoveRecvFilter removeRecvFilter = RemoveRecvFilterEvent; if (removeRecvFilter != null) { ThreadPool.QueueUserWorkItem(delegate { removeRecvFilter(message[1]); }); } return; case Command.RemoveSendFilter: dRemoveSendFilter removeSendFilter = RemoveSendFilterEvent; if (removeSendFilter != null) { ThreadPool.QueueUserWorkItem(delegate { removeSendFilter(message[1]); }); } return; case Command.ClearSendFilter: dClearSendFilter clearSendFilter = ClearSendFilterEvent; if (clearSendFilter != null) { ThreadPool.QueueUserWorkItem(delegate { clearSendFilter(); }); } return; case Command.ClearRecvFilter: dClearRecvFilter clearRecvFilter = ClearRecvFilterEvent; if (clearRecvFilter != null) { ThreadPool.QueueUserWorkItem(delegate { clearRecvFilter(); }); } return; case Command.InstallSendHook: dInstallSendHook installSendHook = InstallSendHookEvent; if (installSendHook != null) { ThreadPool.QueueUserWorkItem(delegate { installSendHook(); }); } return; case Command.InstallRecvHook: dInstallRecvHook installRecvHook = InstallRecvHookEvent; if (installRecvHook != null) { ThreadPool.QueueUserWorkItem(delegate { installRecvHook(); }); } return; case Command.UninstallSendHook: dUninstallSendHook uninstallSendHook = UninstallSendHookEvent; if (uninstallSendHook != null) { ThreadPool.QueueUserWorkItem(delegate { uninstallSendHook(); }); } return; case Command.UninstallRecvHook: dUninstallRecvHook uninstallRecvHook = UninstallRecvHookEvent; if (uninstallRecvHook != null) { ThreadPool.QueueUserWorkItem(delegate { uninstallRecvHook(); }); } return; } }
/// <summary> /// Process IPC message and fire corresponding event. /// </summary> /// <param name="message"> /// IPC message to process. /// </param> /// <param name="instance"> /// Instance of the IPC server that received the message. /// </param> /* Since there is one server for each client server instance = client instance */ private static void ProcessMessage(byte[] message, int instance) { Command command = (Command)message[0]; switch (command) { case Command.Ping: dPing ping = PingEvent; if (ping != null) { ThreadPool.QueueUserWorkItem(delegate { ping(instance); }); } return; case Command.PingResponse: dPingResponse pingResponse = PingResponseEvent; if (pingResponse != null) { ThreadPool.QueueUserWorkItem(delegate { pingResponse(instance); }); } return; case Command.Exception: dException exception = ExceptionEvent; if (exception != null) { string exceptionString = UnicodeEncoding.Unicode.GetString(message, 3, message.Length - 3); ThreadPool.QueueUserWorkItem(delegate { exception(instance, exceptionString); }); } return; case Command.Message: dMessage dmessage = MessageEvent; if (dmessage != null) { string messageString = UnicodeEncoding.Unicode.GetString(message, 3, message.Length - 3); ThreadPool.QueueUserWorkItem(delegate { dmessage(instance, messageString); }); } return; case Command.ClientID: dClientID clientid = ClientIDEvent; if (clientid != null) { int pid = BitConverter.ToInt32(message, 1); ThreadPool.QueueUserWorkItem(delegate { clientid(instance, pid); }); } return; case Command.ClientVersion: dClientVersion clientVersion = ClientVersionEvent; if (clientVersion != null) { int version = BitConverter.ToInt32(message, 1); ThreadPool.QueueUserWorkItem(delegate { clientVersion(instance, version); }); } return; case Command.FunctionPointer: dFunctionPointer functionPointer = FunctionPointerEvent; if (functionPointer != null) { uint address = BitConverter.ToUInt32(message, 1); ThreadPool.QueueUserWorkItem(delegate { functionPointer(instance, address, (FunctionType)message[5]); }); } return; case Command.KeyDown: dKeyDown keyDown = KeyDownEvent; if (keyDown != null) { int downCode = BitConverter.ToInt32(message, 1); ThreadPool.QueueUserWorkItem(delegate { keyDown(instance, (Keys)downCode); }); } return; case Command.KeyUp: dKeyUp keyUp = KeyUpEvent; if (keyUp != null) { int upCode = BitConverter.ToInt32(message, 1); ThreadPool.QueueUserWorkItem(delegate { keyUp(instance, (Keys)upCode); }); } return; case Command.MouseMove: dMouseMove mouseMove = MouseMoveEvent; if (mouseMove != null) { int x = BitConverter.ToInt32(message, 1); int y = BitConverter.ToInt32(message, 5); ThreadPool.QueueUserWorkItem(delegate { mouseMove(instance, x, y); }); } return; case Command.MouseWheel: dMouseWheel mouseWheel = MouseWheelEvent; if (mouseWheel != null) { int x = BitConverter.ToInt32(message, 1); int y = BitConverter.ToInt32(message, 5); ThreadPool.QueueUserWorkItem(delegate { mouseWheel(instance, x, y, (sbyte)message[9]); }); } return; case Command.MouseDblClick: dMouseDblClick mouseDblClick = MouseDblClickEvent; if (mouseDblClick != null) { int x = BitConverter.ToInt32(message, 1); int y = BitConverter.ToInt32(message, 5); MouseButtons button; switch (message[9]) { case 1: button = MouseButtons.Left; break; case 2: button = MouseButtons.Middle; break; case 3: button = MouseButtons.Right; break; default: //should never happen button = MouseButtons.None; break; } ThreadPool.QueueUserWorkItem(delegate { mouseDblClick(instance, x, y, button); }); } return; case Command.MouseClick: dMouseClick mouseClick = MouseClickEvent; if (mouseClick != null) { int x = BitConverter.ToInt32(message, 1); int y = BitConverter.ToInt32(message, 5); MouseButtons button; switch (message[9]) { case 1: button = MouseButtons.Left; break; case 2: button = MouseButtons.Middle; break; case 3: button = MouseButtons.Right; break; default: //should never happen button = MouseButtons.None; break; } ThreadPool.QueueUserWorkItem(delegate { mouseClick(instance, x, y, button); }); } return; case Command.MouseDown: dMouseDown mouseDown = MouseDownEvent; if (mouseDown != null) { int x = BitConverter.ToInt32(message, 1); int y = BitConverter.ToInt32(message, 5); MouseButtons button; switch (message[9]) { case 1: button = MouseButtons.Left; break; case 2: button = MouseButtons.Middle; break; case 3: button = MouseButtons.Right; break; default: //should never happen button = MouseButtons.None; break; } ThreadPool.QueueUserWorkItem(delegate { mouseDown(instance, x, y, button); }); } return; case Command.MouseUp: dMouseUp mouseUp = MouseUpEvent; if (mouseUp != null) { int x = BitConverter.ToInt32(message, 1); int y = BitConverter.ToInt32(message, 5); MouseButtons button; switch (message[9]) { case 1: button = MouseButtons.Left; break; case 2: button = MouseButtons.Middle; break; case 3: button = MouseButtons.Right; break; default: //should never happen button = MouseButtons.None; break; } ThreadPool.QueueUserWorkItem(delegate { mouseUp(instance, x, y, button); }); } return; case Command.IncomingPacket: dIncomingPacket incomingPacket = IncomingPacketEvent; if (incomingPacket != null) { byte[] inPacket = new byte[message.Length - 3]; Buffer.BlockCopy(message, 3, inPacket, 0, message.Length - 3); ThreadPool.QueueUserWorkItem(delegate { incomingPacket(instance, inPacket); }); } return; case Command.OutgoingPacket: dOutgoingPacket outgoingPacket = OutgoingPacketEvent; if (outgoingPacket != null) { byte[] outPacket = new byte[message.Length - 3]; Buffer.BlockCopy(message, 3, outPacket, 0, message.Length - 3); ThreadPool.QueueUserWorkItem(delegate { outgoingPacket(instance, outPacket); }); } return; default: return; } }