public SOEMessage GetFinalSOEMessage(SOEClient client) { // Are we a packet? if (!IsMessage) { // Yes, and there really isn't a nice way to deal with this.. client.Server.Log("[ERROR] Tried Calling 'GetFinalSOEMessage' on written SOEPacket. Returning null."); // Welp, goodbye world! :'( return(null); } // Make our message SOEMessage message = new SOEMessage(OpCode, GetRaw()); // Does this message have to be fragmented? if (Data.Count > client.GetBufferSize()) { // Setup a reader and keep track of our size SOEReader reader = new SOEReader(GetRaw()); int size = message.GetLength(); // While there are fragments to be added.. while (size > 0) { // Store the next fragment byte[] raw; // Is this fragment going to be smaller than the buffer size? if (size < client.GetBufferSize()) { raw = reader.ReadBytes(size); size = 0; } else { raw = reader.ReadBytes((int)client.GetBufferSize()); size -= (int)client.GetBufferSize(); } // Add the finalized fragment message.AddFragment(raw); } } // Return the message we made return(message); }
public void AddMessage(SOEMessage message) { if (IsMessage) { // Handle multi messages if (OpCode == (ushort)SOEOPCodes.MULTI_MESSAGE) { if (message.GetOpCode() == (ushort)SOEOPCodes.MULTI_MESSAGE) { // Setup a reader SOEReader reader = new SOEReader(message); // Get the messages and add them byte[] messages = reader.ReadToEnd(); AddBytes(messages); } else { // Get the size of the message int size = message.GetLength(); // Is the size bigger than 255? if (size > 0xFF) { // Do the stupid >255 thing AddByte(0xFF); size -= 0xFF; // Get how many bytes to add byte toAdd = (byte)((size / 0xFF) + (size % 0xFF) & 0xFF); AddByte(toAdd); // Add sizes until we're at a value of 0 while (size > 0) { // Do we not want to add 0xFF? if (size < 0xFF) { // Add the rest of the size AddByte((byte)size); size = 0; } else { // Add 0xFF AddByte(0xFF); size -= 0xFF; } } } else { // Just do the regular size adding AddByte((byte)(size & 0xFF)); } // Add the actual message AddBytes(message.GetRaw()); } } } else { // Just add the message AddBytes(message.GetRaw()); } }