| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298 |
- using System.IO;
- using System.Text;
- namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard
- {
- internal class InlineResponses
- {
- private const uint MaxStrLenUTF8 = 0x7D4;
- private const uint MaxStrLenUTF16 = 0x3EC;
- private static void BeginResponse(InlineKeyboardState state, InlineKeyboardResponse resCode, BinaryWriter writer)
- {
- writer.Write((uint)state);
- writer.Write((uint)resCode);
- }
- private static uint WriteString(string text, BinaryWriter writer, uint maxSize, Encoding encoding)
- {
- // Ensure the text fits in the buffer, but do not straight cut the bytes because
- // this may corrupt the encoding. Search for a cut in the source string that fits.
- byte[] bytes = null;
- for (int maxStr = text.Length; maxStr >= 0; maxStr--)
- {
- // This loop will probably will run only once.
- bytes = encoding.GetBytes(text.Substring(0, maxStr));
- if (bytes.Length <= maxSize)
- {
- break;
- }
- }
- writer.Write(bytes);
- writer.Seek((int)maxSize - bytes.Length, SeekOrigin.Current);
- writer.Write((uint)text.Length); // String size
- return (uint)text.Length; // Return the cursor position at the end of the text
- }
- private static void WriteStringWithCursor(string text, uint cursor, BinaryWriter writer, uint maxSize, Encoding encoding, bool padMiddle)
- {
- uint length = WriteString(text, writer, maxSize, encoding);
- if (cursor > length)
- {
- cursor = length;
- }
- if (padMiddle)
- {
- writer.Write((int)-1); // ?
- writer.Write((int)-1); // ?
- }
- writer.Write(cursor); // Cursor position
- }
- public static byte[] FinishedInitialize(InlineKeyboardState state)
- {
- uint resSize = 2 * sizeof(uint) + 0x1;
- using (MemoryStream stream = new MemoryStream(new byte[resSize]))
- using (BinaryWriter writer = new BinaryWriter(stream))
- {
- BeginResponse(state, InlineKeyboardResponse.FinishedInitialize, writer);
- writer.Write((byte)1); // Data (ignored by the program)
- return stream.ToArray();
- }
- }
- public static byte[] Default(InlineKeyboardState state)
- {
- uint resSize = 2 * sizeof(uint);
- using (MemoryStream stream = new MemoryStream(new byte[resSize]))
- using (BinaryWriter writer = new BinaryWriter(stream))
- {
- BeginResponse(state, InlineKeyboardResponse.Default, writer);
- return stream.ToArray();
- }
- }
- public static byte[] ChangedString(string text, uint cursor, InlineKeyboardState state)
- {
- uint resSize = 6 * sizeof(uint) + MaxStrLenUTF16;
- using (MemoryStream stream = new MemoryStream(new byte[resSize]))
- using (BinaryWriter writer = new BinaryWriter(stream))
- {
- BeginResponse(state, InlineKeyboardResponse.ChangedString, writer);
- WriteStringWithCursor(text, cursor, writer, MaxStrLenUTF16, Encoding.Unicode, true);
- return stream.ToArray();
- }
- }
- public static byte[] MovedCursor(string text, uint cursor, InlineKeyboardState state)
- {
- uint resSize = 4 * sizeof(uint) + MaxStrLenUTF16;
- using (MemoryStream stream = new MemoryStream(new byte[resSize]))
- using (BinaryWriter writer = new BinaryWriter(stream))
- {
- BeginResponse(state, InlineKeyboardResponse.MovedCursor, writer);
- WriteStringWithCursor(text, cursor, writer, MaxStrLenUTF16, Encoding.Unicode, false);
- return stream.ToArray();
- }
- }
- public static byte[] MovedTab(string text, uint cursor, InlineKeyboardState state)
- {
- // Should be the same as MovedCursor.
- uint resSize = 4 * sizeof(uint) + MaxStrLenUTF16;
- using (MemoryStream stream = new MemoryStream(new byte[resSize]))
- using (BinaryWriter writer = new BinaryWriter(stream))
- {
- BeginResponse(state, InlineKeyboardResponse.MovedTab, writer);
- WriteStringWithCursor(text, cursor, writer, MaxStrLenUTF16, Encoding.Unicode, false);
- return stream.ToArray();
- }
- }
- public static byte[] DecidedEnter(string text, InlineKeyboardState state)
- {
- uint resSize = 3 * sizeof(uint) + MaxStrLenUTF16;
- using (MemoryStream stream = new MemoryStream(new byte[resSize]))
- using (BinaryWriter writer = new BinaryWriter(stream))
- {
- BeginResponse(state, InlineKeyboardResponse.DecidedEnter, writer);
- WriteString(text, writer, MaxStrLenUTF16, Encoding.Unicode);
- return stream.ToArray();
- }
- }
- public static byte[] DecidedCancel(InlineKeyboardState state)
- {
- uint resSize = 2 * sizeof(uint);
- using (MemoryStream stream = new MemoryStream(new byte[resSize]))
- using (BinaryWriter writer = new BinaryWriter(stream))
- {
- BeginResponse(state, InlineKeyboardResponse.DecidedCancel, writer);
- return stream.ToArray();
- }
- }
- public static byte[] ChangedStringUtf8(string text, uint cursor, InlineKeyboardState state)
- {
- uint resSize = 6 * sizeof(uint) + MaxStrLenUTF8;
- using (MemoryStream stream = new MemoryStream(new byte[resSize]))
- using (BinaryWriter writer = new BinaryWriter(stream))
- {
- BeginResponse(state, InlineKeyboardResponse.ChangedStringUtf8, writer);
- WriteStringWithCursor(text, cursor, writer, MaxStrLenUTF8, Encoding.UTF8, true);
- return stream.ToArray();
- }
- }
- public static byte[] MovedCursorUtf8(string text, uint cursor, InlineKeyboardState state)
- {
- uint resSize = 4 * sizeof(uint) + MaxStrLenUTF8;
- using (MemoryStream stream = new MemoryStream(new byte[resSize]))
- using (BinaryWriter writer = new BinaryWriter(stream))
- {
- BeginResponse(state, InlineKeyboardResponse.MovedCursorUtf8, writer);
- WriteStringWithCursor(text, cursor, writer, MaxStrLenUTF8, Encoding.UTF8, false);
- return stream.ToArray();
- }
- }
- public static byte[] DecidedEnterUtf8(string text, InlineKeyboardState state)
- {
- uint resSize = 3 * sizeof(uint) + MaxStrLenUTF8;
- using (MemoryStream stream = new MemoryStream(new byte[resSize]))
- using (BinaryWriter writer = new BinaryWriter(stream))
- {
- BeginResponse(state, InlineKeyboardResponse.DecidedEnterUtf8, writer);
- WriteString(text, writer, MaxStrLenUTF8, Encoding.UTF8);
- return stream.ToArray();
- }
- }
- public static byte[] UnsetCustomizeDic(InlineKeyboardState state)
- {
- uint resSize = 2 * sizeof(uint);
- using (MemoryStream stream = new MemoryStream(new byte[resSize]))
- using (BinaryWriter writer = new BinaryWriter(stream))
- {
- BeginResponse(state, InlineKeyboardResponse.UnsetCustomizeDic, writer);
- return stream.ToArray();
- }
- }
- public static byte[] ReleasedUserWordInfo(InlineKeyboardState state)
- {
- uint resSize = 2 * sizeof(uint);
- using (MemoryStream stream = new MemoryStream(new byte[resSize]))
- using (BinaryWriter writer = new BinaryWriter(stream))
- {
- BeginResponse(state, InlineKeyboardResponse.ReleasedUserWordInfo, writer);
- return stream.ToArray();
- }
- }
- public static byte[] UnsetCustomizedDictionaries(InlineKeyboardState state)
- {
- uint resSize = 2 * sizeof(uint);
- using (MemoryStream stream = new MemoryStream(new byte[resSize]))
- using (BinaryWriter writer = new BinaryWriter(stream))
- {
- BeginResponse(state, InlineKeyboardResponse.UnsetCustomizedDictionaries, writer);
- return stream.ToArray();
- }
- }
- public static byte[] ChangedStringV2(string text, uint cursor, InlineKeyboardState state)
- {
- uint resSize = 6 * sizeof(uint) + MaxStrLenUTF16 + 0x1;
- using (MemoryStream stream = new MemoryStream(new byte[resSize]))
- using (BinaryWriter writer = new BinaryWriter(stream))
- {
- BeginResponse(state, InlineKeyboardResponse.ChangedStringV2, writer);
- WriteStringWithCursor(text, cursor, writer, MaxStrLenUTF16, Encoding.Unicode, true);
- writer.Write((byte)0); // Flag == 0
- return stream.ToArray();
- }
- }
- public static byte[] MovedCursorV2(string text, uint cursor, InlineKeyboardState state)
- {
- uint resSize = 4 * sizeof(uint) + MaxStrLenUTF16 + 0x1;
- using (MemoryStream stream = new MemoryStream(new byte[resSize]))
- using (BinaryWriter writer = new BinaryWriter(stream))
- {
- BeginResponse(state, InlineKeyboardResponse.MovedCursorV2, writer);
- WriteStringWithCursor(text, cursor, writer, MaxStrLenUTF16, Encoding.Unicode, false);
- writer.Write((byte)0); // Flag == 0
- return stream.ToArray();
- }
- }
- public static byte[] ChangedStringUtf8V2(string text, uint cursor, InlineKeyboardState state)
- {
- uint resSize = 6 * sizeof(uint) + MaxStrLenUTF8 + 0x1;
- using (MemoryStream stream = new MemoryStream(new byte[resSize]))
- using (BinaryWriter writer = new BinaryWriter(stream))
- {
- BeginResponse(state, InlineKeyboardResponse.ChangedStringUtf8V2, writer);
- WriteStringWithCursor(text, cursor, writer, MaxStrLenUTF8, Encoding.UTF8, true);
- writer.Write((byte)0); // Flag == 0
- return stream.ToArray();
- }
- }
- public static byte[] MovedCursorUtf8V2(string text, uint cursor, InlineKeyboardState state)
- {
- uint resSize = 4 * sizeof(uint) + MaxStrLenUTF8 + 0x1;
- using (MemoryStream stream = new MemoryStream(new byte[resSize]))
- using (BinaryWriter writer = new BinaryWriter(stream))
- {
- BeginResponse(state, InlineKeyboardResponse.MovedCursorUtf8V2, writer);
- WriteStringWithCursor(text, cursor, writer, MaxStrLenUTF8, Encoding.UTF8, false);
- writer.Write((byte)0); // Flag == 0
- return stream.ToArray();
- }
- }
- }
- }
|