/* This file is part of jpcsp. Jpcsp is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Jpcsp is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Jpcsp. If not, see <http://www.gnu.org/licenses/>. */ package jpcsp.HLE.kernel.types; public class SceUtilityOskParams extends pspUtilityBaseDialog { public int oskDataCount; // Number of input fields (PSPSDK). public int oskDataAddr; public SceUtilityOskData oskData; public int oskState; // SceUtilityOskState (PSPSDK): internal status of this OSK. public final static int PSP_UTILITY_OSK_STATE_NONE = 0; public final static int PSP_UTILITY_OSK_STATE_INITIALIZING = 1; public final static int PSP_UTILITY_OSK_STATE_INITIALIZED = 2; public final static int PSP_UTILITY_OSK_STATE_OPEN = 3; public final static int PSP_UTILITY_OSK_STATE_CLOSING = 4; public final static int PSP_UTILITY_OSK_STATE_CLOSED = 5; public int errorCode; public static class SceUtilityOskData extends pspAbstractMemoryMappedStructure { public int inputMode; // How to parse the input chars. public final static int PSP_UTILITY_OSK_DATA_INPUT_MODE_NONE = 0; public final static int PSP_UTILITY_OSK_DATA_INPUT_MODE_JPN_CONVERT = 1; public final static int PSP_UTILITY_OSK_DATA_INPUT_MODE_JPN_CHARS = 2; public final static int PSP_UTILITY_OSK_DATA_INPUT_MODE_LATIN_CHARS = 3; public int inputAttr; public int language; public final static int PSP_UTILITY_OSK_DATA_LANGUAGE_SYSTEM = 0; public final static int PSP_UTILITY_OSK_DATA_LANGUAGE_JAPANESE = 1; public final static int PSP_UTILITY_OSK_DATA_LANGUAGE_ENGLISH = 2; public final static int PSP_UTILITY_OSK_DATA_LANGUAGE_FRENCH = 3; public final static int PSP_UTILITY_OSK_DATA_LANGUAGE_SPANISH = 4; public final static int PSP_UTILITY_OSK_DATA_LANGUAGE_GERMAN = 5; public final static int PSP_UTILITY_OSK_DATA_LANGUAGE_ITALIAN = 6; public final static int PSP_UTILITY_OSK_DATA_LANGUAGE_DUTCH = 7; public final static int PSP_UTILITY_OSK_DATA_LANGUAGE_PORTUGUESE = 8; public final static int PSP_UTILITY_OSK_DATA_LANGUAGE_RUSSIAN = 9; public int hide; // Seems to be related to the visibility of the input field. public final static int PSP_UTILITY_OSK_DATA_SHOW = 0; public final static int PSP_UTILITY_OSK_DATA_HIDE = 1; public int inputAllowCharType; // ORed flag that specifies which char types can be accepted. public final static int PSP_UTILITY_OSK_DATA_CHAR_ALLOW_ALL = 0x0; public final static int PSP_UTILITY_OSK_DATA_CHAR_ALLOW_NUM = 0x1; public final static int PSP_UTILITY_OSK_DATA_CHAR_ALLOW_ENG = 0x2; public final static int PSP_UTILITY_OSK_DATA_CHAR_ALLOW_LOWERCASE = 0x4; public final static int PSP_UTILITY_OSK_DATA_CHAR_ALLOW_UPPERCASE = 0x8; public final static int PSP_UTILITY_OSK_DATA_CHAR_ALLOW_JPN_NUM = 0x100; public final static int PSP_UTILITY_OSK_DATA_CHAR_ALLOW_JPN = 0x200; public final static int PSP_UTILITY_OSK_DATA_CHAR_ALLOW_JPN_LOWERCASE = 0x400; public final static int PSP_UTILITY_OSK_DATA_CHAR_ALLOW_JPN_UPPERCASE = 0x800; public final static int PSP_UTILITY_OSK_DATA_CHAR_ALLOW_JPN_HIRAGANA = 0x1000; public final static int PSP_UTILITY_OSK_DATA_CHAR_ALLOW_JPN_HALF_KATAKANA = 0x2000; public final static int PSP_UTILITY_OSK_DATA_CHAR_ALLOW_JPN_KATAKANA = 0x4000; public final static int PSP_UTILITY_OSK_DATA_CHAR_ALLOW_JPN_KANJI = 0x8000; public final static int PSP_UTILITY_OSK_DATA_CHAR_ALLOW_CYRILLIC_LOWERCASE = 0x10000; public final static int PSP_UTILITY_OSK_DATA_CHAR_ALLOW_CYRILLIC_UPPERCASE = 0x20000; public final static int PSP_UTILITY_OSK_DATA_CHAR_ALLOW_URL = 0x80000; public int lines; public int showInputText; public int descAddr; public String desc; public int inTextAddr; public String inText; public int outTextLength; public int outTextAddr; public String outText; public int result; public final static int PSP_UTILITY_OSK_DATA_NOT_CHANGED = 0; public final static int PSP_UTILITY_OSK_DATA_CANCELED = 1; public final static int PSP_UTILITY_OSK_DATA_CHANGED = 2; public int outTextLimit; @Override protected void read() { inputMode = read32(); inputAttr = read32(); language = read32(); hide = read32(); inputAllowCharType = read32(); lines = read32(); showInputText = read32(); descAddr = read32(); desc = readStringUTF16Z(descAddr); inTextAddr = read32(); inText = readStringUTF16Z(inTextAddr); outTextLength = read32(); outTextAddr = read32(); outText = readStringUTF16Z(outTextAddr); result = read32(); outTextLimit = read32(); } private static void replaceFullWidthChar(StringBuilder s, int index, int codePointOffset) { int codePoint = s.codePointAt(index); char chars[] = new char[2]; if (Character.toChars(codePoint + codePointOffset, chars, 0) == 1) { s.setCharAt(index, chars[0]); } } @Override protected void write() { write32(inputMode); // Offset 0 write32(inputAttr); // Offset 4 write32(language); // Offset 8 write32(hide); // Offset 12 write32(inputAllowCharType); // Offset 16 write32(lines); // Offset 20 write32(showInputText); // Offset 24 write32(descAddr); // Offset 28 writeStringUTF16Z(descAddr, desc); write32(inTextAddr); // Offset 32 writeStringUTF16Z(inTextAddr, inText); int maxTextOutLength = outTextLength - 1; if (outTextLimit > 0 && outTextLimit < maxTextOutLength) { maxTextOutLength = outTextLimit; } int length = Math.min(outText.length(), maxTextOutLength); // When the following values are set for the inputAllowCharType flag set, // the characters returned in the output text field are full width letters/digits: // - PSP_UTILITY_OSK_DATA_CHAR_ALLOW_JPN // - PSP_UTILITY_OSK_DATA_CHAR_ALLOW_JPN_LOWERCASE // - PSP_UTILITY_OSK_DATA_CHAR_ALLOW_JPN_UPPERCASE if ((inputAllowCharType & (PSP_UTILITY_OSK_DATA_CHAR_ALLOW_JPN | PSP_UTILITY_OSK_DATA_CHAR_ALLOW_JPN_LOWERCASE | PSP_UTILITY_OSK_DATA_CHAR_ALLOW_JPN_UPPERCASE)) != 0) { StringBuilder s = new StringBuilder(outText); for (int i = 0; i < length; i++) { int codePoint = s.codePointAt(i); if (codePoint >= 65 && codePoint <= 90) { // A-Z replaceFullWidthChar(s, i, 0xFF21 - 65); } else if (codePoint >= 97 && codePoint <= 122) { // a-z replaceFullWidthChar(s, i, 0xFF41 - 97); } else if (codePoint >= 48 && codePoint <= 57) { // 0-9 replaceFullWidthChar(s, i, 0xFF10 - 48); } } outText = s.toString(); } writeStringUTF16Z(outTextAddr, outText.substring(0, length)); write32(outTextLength); // Offset 36 write32(outTextAddr); // Offset 40 write32(result); // Offset 44 write32(outTextLimit); // Offset 48 } @Override public int sizeof() { return 13 * 4; } } @Override protected void read() { base = new pspUtilityDialogCommon(); read(base); setMaxSize(base.totalSizeof()); oskDataCount = read32(); oskDataAddr = read32(); if (oskDataAddr != 0) { oskData = new SceUtilityOskData(); oskData.read(mem, oskDataAddr); } else { oskData = null; } oskState = read32(); errorCode = read32(); } @Override protected void write() { write(base); setMaxSize(base.totalSizeof()); write32(oskDataCount); write32(oskDataAddr); if (oskData != null && oskDataAddr != 0) { oskData.write(mem, oskDataAddr); } write32(oskState); write32(errorCode); } @Override public int sizeof() { return base.totalSizeof(); } @Override public String toString() { return String.format("desc='%s', inText='%s', outText='%s', inputMode=%d, inputAttr=0x%X, language=%d, hide=%d, inputAllowCharType=0x%X, lines=%d, showInputText=%d, outTextLength=%d, outTextLimit=%d", oskData.desc, oskData.inText, oskData.outText, oskData.inputMode, oskData.inputAttr, oskData.language, oskData.hide, oskData.inputAllowCharType, oskData.lines, oskData.showInputText, oskData.outTextLength, oskData.outTextLimit); } }