/*
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.modules;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import jpcsp.HLE.BufferInfo;
import jpcsp.HLE.BufferInfo.LengthInfo;
import jpcsp.HLE.BufferInfo.Usage;
import jpcsp.HLE.HLEFunction;
import jpcsp.HLE.HLEModule;
import jpcsp.HLE.HLEUnimplemented;
import jpcsp.HLE.Modules;
import jpcsp.HLE.TPointer;
import jpcsp.HLE.TPointer32;
import jpcsp.HLE.kernel.managers.SceUidManager;
import jpcsp.HLE.kernel.types.SceKernelErrors;
import jpcsp.HLE.modules.sceFont.FontRegistryEntry;
import jpcsp.settings.Settings;
import jpcsp.util.Utilities;
public class sceReg extends HLEModule {
public static Logger log = Modules.getLogger("sceReg");
protected static final int REG_TYPE_DIR = 1;
protected static final int REG_TYPE_INT = 2;
protected static final int REG_TYPE_STR = 3;
protected static final int REG_TYPE_BIN = 4;
protected static final int REG_MODE_READ_WRITE = 1;
protected static final int REG_MODE_READ_ONLY = 2;
private Map<Integer, RegistryHandle> registryHandles;
private Map<Integer, CategoryHandle> categoryHandles;
private Map<Integer, KeyHandle> keyHandles;
private String authName;
private String authKey;
private int networkLatestId;
private int wifiConnectCount;
private int usbConnectCount;
private int psnAccountCount;
private int oskVersionId;
private int oskDispLocale;
private int oskWritingLocale;
private int oskInputCharMask;
private int oskKeytopIndex;
private String npEnv;
private String adhocSsidPrefix;
private int themeCustomThemeCode;
private int themeColorMode;
private int themeWallpaperMode;
private int themeSystemColor;
private int musicVisualizerMode;
private int musicTrackInfoMode;
private String lockPassword;
private String browserHomeUri;
private String npAccountId;
private String npLoginId;
private String npPassword;
private int npAutoSignInEnable;
private String ownerName;
protected static class RegistryHandle {
private static final String registryHandlePurpose = "sceReg.RegistryHandle";
public int uid;
public int type;
public String name;
public int unknown1;
public int unknown2;
public RegistryHandle(int type, String name, int unknown1, int unknown2) {
this.type = type;
this.name = name;
this.unknown1 = unknown1;
this.unknown2 = unknown2;
uid = SceUidManager.getNewUid(registryHandlePurpose);
}
public void release() {
SceUidManager.releaseUid(uid, registryHandlePurpose);
uid = -1;
}
}
protected static class CategoryHandle {
private static final String categoryHandlePurpose = "sceReg.CategoryHandle";
public int uid;
public RegistryHandle registryHandle;
public String name;
public int mode;
public CategoryHandle(RegistryHandle registryHandle, String name, int mode) {
this.registryHandle = registryHandle;
this.name = name;
this.mode = mode;
uid = SceUidManager.getNewUid(categoryHandlePurpose);
}
public String getFullName() {
return registryHandle.name + name;
}
public void release() {
SceUidManager.releaseUid(uid, categoryHandlePurpose);
uid = -1;
}
}
protected static class KeyHandle {
private static int index = 0;
public int uid;
public String name;
public KeyHandle(String name) {
this.name = name;
uid = index++;
}
}
public String getAuthName() {
return authName;
}
public void setAuthName(String authName) {
this.authName = authName;
}
public String getAuthKey() {
return authKey;
}
public void setAuthKey(String authKey) {
this.authKey = authKey;
}
public int getNetworkLatestId() {
return networkLatestId;
}
public void setNetworkLatestId(int networkLatestId) {
this.networkLatestId = networkLatestId;
}
public String getNpLoginId() {
return npLoginId;
}
public String getNpPassword() {
return npPassword;
}
private int getKey(CategoryHandle categoryHandle, String name, TPointer32 ptype, TPointer32 psize, TPointer buf, int size) {
String fullName = categoryHandle.getFullName();
fullName = fullName.replace("flash1:/registry/system", "");
fullName = fullName.replace("flash1/registry/system", "");
fullName = fullName.replace("flash2/registry/system", "");
if ("/system/DATA/FONT".equals(fullName) || "/DATA/FONT".equals(fullName)) {
List<sceFont.FontRegistryEntry> fontRegistry = Modules.sceFontModule.getFontRegistry();
if ("path_name".equals(name)) {
ptype.setValue(REG_TYPE_STR);
psize.setValue(Modules.sceFontModule.getFontDirPath().length() + 1);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, Modules.sceFontModule.getFontDirPath());
}
} else if ("num_fonts".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(fontRegistry.size());
}
} else {
log.warn(String.format("Unknown font registry entry '%s'", name));
}
} else if (fullName.startsWith("/system/DATA/FONT/PROPERTY/INFO") || fullName.startsWith("/DATA/FONT/PROPERTY/INFO")) {
List<sceFont.FontRegistryEntry> fontRegistry = Modules.sceFontModule.getFontRegistry();
int index = Integer.parseInt(fullName.substring(fullName.indexOf("INFO") + 4));
if (index < 0 || index >= fontRegistry.size()) {
return -1;
}
FontRegistryEntry entry = fontRegistry.get(index);
if ("h_size".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(entry.h_size);
}
} else if ("v_size".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(entry.v_size);
}
} else if ("h_resolution".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(entry.h_resolution);
}
} else if ("v_resolution".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(entry.v_resolution);
}
} else if ("extra_attributes".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(entry.extra_attributes);
}
} else if ("weight".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(entry.weight);
}
} else if ("family_code".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(entry.family_code);
}
} else if ("style".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(entry.style);
}
} else if ("sub_style".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(entry.sub_style);
}
} else if ("language_code".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(entry.language_code);
}
} else if ("region_code".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(entry.region_code);
}
} else if ("country_code".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(entry.country_code);
}
} else if ("file_name".equals(name)) {
ptype.setValue(REG_TYPE_STR);
psize.setValue(entry.file_name == null ? 0 : entry.file_name.length() + 1);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, entry.file_name);
}
} else if ("font_name".equals(name)) {
ptype.setValue(REG_TYPE_STR);
psize.setValue(entry.font_name == null ? 0 : entry.font_name.length() + 1);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, entry.font_name);
}
} else if ("expire_date".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(entry.expire_date);
}
} else if ("shadow_option".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(entry.shadow_option);
}
} else {
log.warn(String.format("Unknown font registry entry '%s'", name));
}
} else if ("/CONFIG/DATE".equals(fullName)) {
if ("date_format".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(2);
}
} else if ("time_format".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("time_zone_offset".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("time_zone_area".equals(name)) {
String timeZoneArea = "united_kingdom";
ptype.setValue(REG_TYPE_STR);
psize.setValue(timeZoneArea.length() + 1);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, timeZoneArea);
}
} else if ("summer_time".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if ("/CONFIG/BROWSER".equals(fullName)) {
if ("flash_activated".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(1);
}
} else if ("home_uri".equals(name)) {
ptype.setValue(REG_TYPE_STR);
psize.setValue(0x200);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, browserHomeUri);
}
} else if ("cookie_mode".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(1);
}
} else if ("proxy_mode".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(2);
}
} else if ("proxy_address".equals(name)) {
ptype.setValue(REG_TYPE_STR);
psize.setValue(0x80);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, "");
}
} else if ("proxy_port".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("picture".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(1);
}
} else if ("animation".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("javascript".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(1);
}
} else if ("cache_size".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0x200); // Cache Size in KB
}
} else if ("char_size".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(1);
}
} else if ("disp_mode".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("flash_play".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(1);
}
} else if ("connect_mode".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("proxy_protect".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("proxy_autoauth".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("proxy_user".equals(name)) {
ptype.setValue(REG_TYPE_STR);
psize.setValue(0x80);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, "");
}
} else if ("proxy_password".equals(name)) {
ptype.setValue(REG_TYPE_STR);
psize.setValue(0x80);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, "");
}
} else if ("webpage_quality".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(1);
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if ("/CONFIG/BROWSER2".equals(fullName)) {
if ("tm_service".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("tm_ec_ttl".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("tm_ec_ttl_update_time".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if ("/CONFIG/NP".equals(fullName)) {
if ("account_id".equals(name)) {
ptype.setValue(REG_TYPE_BIN);
psize.setValue(16);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, npAccountId);
}
} else if ("login_id".equals(name)) {
ptype.setValue(REG_TYPE_STR);
psize.setValue(npLoginId.length() + 1);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, npLoginId);
}
} else if ("password".equals(name)) {
ptype.setValue(REG_TYPE_STR);
psize.setValue(npPassword.length() + 1);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, npPassword);
}
} else if ("auto_sign_in_enable".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(npAutoSignInEnable);
}
} else if ("nav_only".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("env".equals(name)) {
ptype.setValue(REG_TYPE_STR);
psize.setValue(npEnv.length() + 1);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, npEnv);
}
} else if ("guest_country".equals(name)) {
String guestCount = "";
ptype.setValue(REG_TYPE_STR);
psize.setValue(guestCount.length() + 1);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, guestCount);
}
} else if ("view_mode".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("check_drm".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if ("/CONFIG/PREMO".equals(fullName)) {
if ("ps3_mac".equals(name)) {
byte ps3Mac[] = new byte[6];
ps3Mac[0] = 0x11;
ps3Mac[1] = 0x22;
ps3Mac[2] = 0x33;
ps3Mac[3] = 0x44;
ps3Mac[4] = 0x55;
ps3Mac[5] = 0x66;
ptype.setValue(REG_TYPE_BIN);
psize.setValue(ps3Mac.length);
if (size > 0) {
buf.setArray(ps3Mac, ps3Mac.length);
}
} else if ("ps3_name".equals(name)) {
String ps3Name = "My PS3";
ptype.setValue(REG_TYPE_STR);
psize.setValue(ps3Name.length() + 1);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, ps3Name);
}
} else if ("guide_page".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("response".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("custom_video_buffer1".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("custom_video_bitrate1".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("setting_internet".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("custom_video_buffer2".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("custom_video_bitrate2".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("button_assign".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("ps3_keytype".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("ps3_key".equals(name)) {
ptype.setValue(REG_TYPE_BIN);
psize.setValue(16);
if (size >= 16) {
buf.clear(16);
}
} else if ("flags".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("account_id".equals(name)) {
ptype.setValue(REG_TYPE_BIN);
psize.setValue(16);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, npAccountId);
}
} else if ("login_id".equals(name)) {
ptype.setValue(REG_TYPE_STR);
psize.setValue(npLoginId.length() + 1);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, npLoginId);
}
} else if ("password".equals(name)) {
ptype.setValue(REG_TYPE_STR);
psize.setValue(npPassword.length() + 1);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, npPassword);
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if ("/CONFIG/SYSTEM".equals(fullName)) {
if ("exh_mode".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("umd_autoboot".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("usb_auto_connect".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(1);
}
} else if ("owner_mob".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("owner_dob".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("owner_name".equals(name)) {
ptype.setValue(REG_TYPE_STR);
psize.setValue(ownerName.length() + 1);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, ownerName);
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if ("/CONFIG/SYSTEM/SOUND".equals(fullName)) {
if ("dynamic_normalizer".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("operation_sound_mode".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(1);
}
} else if ("avls".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if ("/CONFIG/SYSTEM/CHARACTER_SET".equals(fullName)) {
if ("oem".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(5);
}
} else if ("ansi".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0x13);
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if ("/CONFIG/SYSTEM/XMB".equals(fullName)) {
if ("language".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(1);
}
} else if ("button_assign".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(1);
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if ("/CONFIG/SYSTEM/XMB/THEME".equals(fullName)) {
if ("wallpaper_mode".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(themeWallpaperMode);
}
} else if ("custom_theme_mode".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(themeCustomThemeCode);
}
} else if ("color_mode".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(themeColorMode);
}
} else if ("system_color".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(themeSystemColor);
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if ("/SYSPROFILE/RESOLUTION".equals(fullName)) {
if ("horizontal".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(8210);
}
} else if ("vertical".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(8210);
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if ("/CONFIG/ALARM".equals(fullName)) {
if (name.matches("alarm_\\d+_time")) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(-1);
}
} else if (name.matches("alarm_\\d+_property")) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if ("/CONFIG/NETWORK/GO_MESSENGER".equals(fullName)) {
if (name.equals("auth_name")) {
ptype.setValue(REG_TYPE_STR);
psize.setValue(authName.length() + 1);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, authName);
}
} else if (name.equals("auth_key")) {
ptype.setValue(REG_TYPE_STR);
psize.setValue(authKey.length() + 1);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, authKey);
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if ("/CONFIG/NETWORK/ADHOC".equals(fullName)) {
if (name.equals("ssid_prefix")) {
ptype.setValue(REG_TYPE_STR);
psize.setValue(adhocSsidPrefix.length() + 1);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, adhocSsidPrefix);
}
} else if (name.equals("channel")) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(sceUtility.getSystemParamAdhocChannel());
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if ("/CONFIG/NETWORK/INFRASTRUCTURE".equals(fullName)) {
if ("latest_id".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(networkLatestId);
}
} else if (name.equals("eap_md5")) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if (name.equals("auto_setting")) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if (name.equals("wifisvc_setting")) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if (fullName.matches("/CONFIG/NETWORK/INFRASTRUCTURE/\\d+")) {
String indexName = fullName.replace("/CONFIG/NETWORK/INFRASTRUCTURE/", "");
int index = Integer.parseInt(indexName);
if ("cnf_name".equals(name)) {
ptype.setValue(REG_TYPE_STR);
String cnfName = sceUtility.getNetParamName(index);
psize.setValue(cnfName.length() + 1);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, cnfName);
}
} else if ("ssid".equals(name)) {
ptype.setValue(REG_TYPE_STR);
String ssid = sceNetApctl.getSSID();
psize.setValue(ssid.length() + 1);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, ssid);
}
} else if ("auth_proto".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
// 0 is no security.
// 1 is WEP (64bit).
// 2 is WEP (128bit).
// 3 is WPA.
buf.setValue32(1);
}
} else if ("wep_key".equals(name)) {
ptype.setValue(REG_TYPE_BIN);
String wepKey = "XXXXXXXXXXXXX"; // Max length is 13
psize.setValue(wepKey.length());
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, wepKey);
}
} else if ("how_to_set_ip".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
// 0 is DHCP.
// 1 is static.
// 2 is PPPOE.
buf.setValue32(0);
}
} else if ("dns_flag".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
// 0 is auto.
// 1 is manual.
buf.setValue32(0);
}
} else if ("primary_dns".equals(name)) {
ptype.setValue(REG_TYPE_STR);
String dns = sceNetApctl.getPrimaryDNS();
psize.setValue(dns.length() + 1);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, dns);
}
} else if ("secondary_dns".equals(name)) {
ptype.setValue(REG_TYPE_STR);
String dns = sceNetApctl.getSecondaryDNS();
psize.setValue(dns.length() + 1);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, dns);
}
} else if ("http_proxy_flag".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
// 0 is to not use proxy.
// 1 is to use proxy.
buf.setValue32(0);
}
} else if ("version".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
// 0 is not used.
// 1 is old version.
// 2 is new version.
buf.setValue32(2);
}
} else if ("auth_8021x_type".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
// 0 is none.
// 1 is EAP (MD5).
buf.setValue32(0);
}
} else if ("browser_flag".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
// 0 is to not start the native browser.
// 1 is to start the native browser.
buf.setValue32(0);
}
} else if ("ip_address".equals(name)) {
ptype.setValue(REG_TYPE_STR);
String ip = sceNetApctl.getLocalHostIP();
psize.setValue(ip.length() + 1);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, ip);
}
} else if ("netmask".equals(name)) {
ptype.setValue(REG_TYPE_STR);
String netmask = sceNetApctl.getSubnetMask();
psize.setValue(netmask.length() + 1);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, netmask);
}
} else if ("default_route".equals(name)) {
ptype.setValue(REG_TYPE_STR);
String gateway = sceNetApctl.getGateway();
psize.setValue(gateway.length() + 1);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, gateway);
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if (fullName.matches("/CONFIG/NETWORK/INFRASTRUCTURE/\\d+/SUB1")) {
String indexName = fullName.replace("/CONFIG/NETWORK/INFRASTRUCTURE/", "");
int index = Integer.parseInt(indexName.substring(0, indexName.indexOf("/")));
if (log.isDebugEnabled()) {
log.debug(String.format("/CONFIG/NETWORK/INFRASTRUCTURE, index=%d, SUB1", index));
}
if ("last_leased_dhcp_addr".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if ("/DATA/COUNT".equals(fullName)) {
if ("wifi_connect_count".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(wifiConnectCount);
}
} else if (name.equals("usb_connect_count")) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(usbConnectCount);
}
} else if (name.equals("psn_access_count")) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(psnAccountCount);
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if ("/CONFIG/SYSTEM/LOCK".equals(fullName)) {
if ("parental_level".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("browser_start".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("password".equals(name)) {
ptype.setValue(REG_TYPE_BIN);
psize.setValue(lockPassword.length() + 1);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, lockPassword);
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if ("/CONFIG/SYSTEM/POWER_SAVING".equals(fullName)) {
if ("backlight_off_interval".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("suspend_interval".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("wlan_mode".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if ("/TOOL/CONFIG".equals(fullName)) {
if ("np_debug".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(1);
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if ("/REGISTRY".equals(fullName)) {
if ("category_version".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0x66);
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if ("/CONFIG/OSK".equals(fullName)) {
if ("version_id".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(oskVersionId);
}
} else if (name.equals("disp_locale")) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(oskDispLocale);
}
} else if (name.equals("writing_locale")) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(oskWritingLocale);
}
} else if (name.equals("input_char_mask")) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(oskInputCharMask);
}
} else if (name.equals("keytop_index")) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(oskKeytopIndex);
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if ("/CONFIG/MUSIC".equals(fullName)) {
if ("visualizer_mode".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(musicVisualizerMode);
}
} else if (name.equals("track_info_mode")) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(musicTrackInfoMode);
}
} else if (name.equals("wma_play")) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(1);
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if ("/CONFIG/PHOTO".equals(fullName)) {
if ("slideshow_speed".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(1);
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if ("/CONFIG/VIDEO".equals(fullName)) {
if ("lr_button_enable".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(1);
}
} else if ("list_play_mode".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(1);
}
} else if ("title_display_mode".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("sound_language".equals(name)) {
ptype.setValue(REG_TYPE_BIN);
psize.setValue(2);
if (size >= 2) {
buf.setValue8(0, (byte) '0');
buf.setValue8(1, (byte) '0');
}
} else if ("subtitle_language".equals(name)) {
ptype.setValue(REG_TYPE_BIN);
psize.setValue(2);
if (size >= 2) {
buf.setValue8(0, (byte) 'e');
buf.setValue8(1, (byte) 'n');
}
} else if ("menu_language".equals(name)) {
ptype.setValue(REG_TYPE_BIN);
psize.setValue(2);
if (size >= 2) {
buf.setValue8(0, (byte) 'e');
buf.setValue8(1, (byte) 'n');
}
} else if ("appended_volume".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if ("/CONFIG/INFOBOARD".equals(fullName)) {
if ("locale_lang".equals(name)) {
String localeLang = "en/en/rss.xml";
ptype.setValue(REG_TYPE_STR);
psize.setValue(localeLang.length() + 1);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, localeLang);
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if ("/CONFIG/CAMERA".equals(fullName)) {
if ("still_size".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(1);
}
} else if ("still_quality".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("movie_size".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(1);
}
} else if ("movie_quality".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("white_balance".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("exposure_bias".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("still_effect".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("file_folder".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0x65);
}
} else if ("file_number".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(1);
}
} else if ("movie_fps".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(1);
}
} else if ("shutter_sound_mode".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0);
}
} else if ("file_number_eflash".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(1);
}
} else if ("folder_number_eflash".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(0x65);
}
} else if ("msid".equals(name)) {
String msid = "";
ptype.setValue(REG_TYPE_BIN);
psize.setValue(16);
if (size > 0) {
Utilities.writeStringNZ(buf.getMemory(), buf.getAddress(), size, msid);
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if ("/CONFIG/RSS".equals(fullName)) {
if ("download_items".equals(name)) {
ptype.setValue(REG_TYPE_INT);
psize.setValue(4);
if (size >= 4) {
buf.setValue32(5);
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
return 0;
}
@Override
public void start() {
registryHandles = new HashMap<Integer, sceReg.RegistryHandle>();
categoryHandles = new HashMap<Integer, sceReg.CategoryHandle>();
keyHandles = new HashMap<Integer, sceReg.KeyHandle>();
// TODO Read these values from the configuration file
Settings settings = Settings.getInstance();
authName = "";
authKey = "";
networkLatestId = 0;
wifiConnectCount = 0;
usbConnectCount = 0;
oskVersionId = 0x226;
oskDispLocale = 0x1;
oskWritingLocale = 0x1;
oskInputCharMask = 0xF;
oskKeytopIndex = 0x5;
npEnv = "np"; // Max length 8
adhocSsidPrefix = "PSP"; // Must be of length 3
themeWallpaperMode = 0;
themeColorMode = 0;
themeCustomThemeCode = 0;
themeSystemColor = 0;
musicVisualizerMode = 0;
musicTrackInfoMode = 1;
lockPassword = "0000"; // 4-digit password
browserHomeUri = "";
npAccountId = settings.readString("registry.npAccountId");
npLoginId = settings.readString("registry.npLoginId");
npPassword = settings.readString("registry.npPassword");
npAutoSignInEnable = settings.readInt("registry.npAutoSignInEnable");
ownerName = sceUtility.getSystemParamNickname();
super.start();
}
@HLEFunction(nid = 0x92E41280, version = 150)
public int sceRegOpenRegistry(TPointer reg, int mode, @BufferInfo(usage=Usage.out) TPointer32 h) {
int regType = reg.getValue32(0);
int nameLen = reg.getValue32(260);
int unknown1 = reg.getValue32(264);
int unknown2 = reg.getValue32(268);
String name = Utilities.readStringNZ(reg.getAddress() + 4, nameLen);
if (log.isDebugEnabled()) {
log.debug(String.format("RegParam: regType=%d, name='%s'(len=%d), unknown1=%d, unknown2=%d", regType, name, nameLen, unknown1, unknown2));
}
RegistryHandle registryHandle = new RegistryHandle(regType, name, unknown1, unknown2);
registryHandles.put(registryHandle.uid, registryHandle);
h.setValue(registryHandle.uid);
return 0;
}
@HLEFunction(nid = 0xFA8A5739, version = 150)
public int sceRegCloseRegistry(int h) {
RegistryHandle registryHandle = registryHandles.get(h);
if (registryHandle == null) {
return -1;
}
registryHandle.release();
registryHandles.remove(h);
return 0;
}
@HLEUnimplemented
@HLEFunction(nid = 0xDEDA92BF, version = 150)
public int sceRegRemoveRegistry(TPointer reg) {
return 0;
}
@HLEFunction(nid = 0x1D8A762E, version = 150)
public int sceRegOpenCategory(int h, String name, int mode, @BufferInfo(usage=Usage.out) TPointer32 hd) {
RegistryHandle registryHandle = registryHandles.get(h);
if (registryHandle == null) {
return -1;
}
CategoryHandle categoryHandle = new CategoryHandle(registryHandle, name, mode);
categoryHandles.put(categoryHandle.uid, categoryHandle);
hd.setValue(categoryHandle.uid);
if (categoryHandle.getFullName().startsWith("/system/DATA/FONT/PROPERTY/INFO")) {
List<sceFont.FontRegistryEntry> fontRegistry = Modules.sceFontModule.getFontRegistry();
int index = Integer.parseInt(categoryHandle.getFullName().substring(31));
if (index < 0 || index >= fontRegistry.size()) {
if (mode != REG_MODE_READ_WRITE) {
return SceKernelErrors.ERROR_REGISTRY_NOT_FOUND;
}
}
} else if (categoryHandle.getFullName().startsWith("flash2/registry/system/CONFIG/NETWORK/INFRASTRUCTURE/")) {
String indexString = categoryHandle.getFullName().substring(53);
int sep = indexString.indexOf('/');
if (sep >= 0) {
indexString = indexString.substring(0, sep);
}
int index = Integer.parseInt(indexString);
// We do not return too many entries as some homebrew only support a limited number of entries.
if (index > sceUtility.PSP_NETPARAM_MAX_NUMBER_DUMMY_ENTRIES) {
return SceKernelErrors.ERROR_REGISTRY_NOT_FOUND;
}
}
return 0;
}
@HLEFunction(nid = 0x0CAE832B, version = 150)
public int sceRegCloseCategory(int hd) {
CategoryHandle categoryHandle = categoryHandles.get(hd);
if (categoryHandle == null) {
return -1;
}
categoryHandle.release();
categoryHandles.remove(hd);
return 0;
}
@HLEFunction(nid = 0x39461B4D, version = 150)
public int sceRegFlushRegistry(int h) {
RegistryHandle registryHandle = registryHandles.get(h);
if (registryHandle == null) {
return -1;
}
return 0;
}
@HLEUnimplemented
@HLEFunction(nid = 0x0D69BF40, version = 150)
public int sceRegFlushCategory(int hd) {
CategoryHandle categoryHandle = categoryHandles.get(hd);
if (categoryHandle == null) {
return -1;
}
return 0;
}
@HLEFunction(nid = 0x57641A81, version = 150)
public int sceRegCreateKey(int hd, String name, int type, int size) {
CategoryHandle categoryHandle = categoryHandles.get(hd);
if (categoryHandle == null) {
return -1;
}
if (categoryHandle.getFullName().startsWith("/system/DATA/FONT/PROPERTY/INFO")) {
List<sceFont.FontRegistryEntry> fontRegistry = Modules.sceFontModule.getFontRegistry();
int index = Integer.parseInt(categoryHandle.getFullName().substring(31));
if (index < 0 || index > fontRegistry.size()) {
return -1;
} else if (index == fontRegistry.size()) {
log.info(String.format("sceRegCreateKey creating a new font entry '%s'", categoryHandle.getFullName()));
FontRegistryEntry entry = new FontRegistryEntry();
fontRegistry.add(entry);
if ("h_size".equals(name) && size >= 4 && type == REG_TYPE_INT) {
// OK
} else if ("v_size".equals(name) && size >= 4 && type == REG_TYPE_INT) {
// OK
} else if ("h_resolution".equals(name) && size >= 4 && type == REG_TYPE_INT) {
// OK
} else if ("v_resolution".equals(name) && size >= 4 && type == REG_TYPE_INT) {
// OK
} else if ("extra_attributes".equals(name) && size >= 4 && type == REG_TYPE_INT) {
// OK
} else if ("weight".equals(name) && size >= 4 && type == REG_TYPE_INT) {
// OK
} else if ("family_code".equals(name) && size >= 4 && type == REG_TYPE_INT) {
// OK
} else if ("style".equals(name) && size >= 4 && type == REG_TYPE_INT) {
// OK
} else if ("sub_style".equals(name) && size >= 4 && type == REG_TYPE_INT) {
// OK
} else if ("language_code".equals(name) && size >= 4 && type == REG_TYPE_INT) {
// OK
} else if ("region_code".equals(name) && size >= 4 && type == REG_TYPE_INT) {
// OK
} else if ("country_code".equals(name) && size >= 4 && type == REG_TYPE_INT) {
// OK
} else if ("file_name".equals(name) && size >= 0 && type == REG_TYPE_STR) {
// OK
} else if ("font_name".equals(name) && size >= 0 && type == REG_TYPE_STR) {
// OK
} else if ("expire_date".equals(name) && size >= 4 && type == REG_TYPE_INT) {
// OK
} else if ("shadow_option".equals(name) && size >= 4 && type == REG_TYPE_INT) {
// OK
} else {
log.warn(String.format("Unknown font registry entry '%s' size=0x%X, type=%d", name, size, type));
}
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", categoryHandle.getFullName(), name));
}
return 0;
}
@HLEFunction(nid = 0x17768E14, version = 150)
public int sceRegSetKeyValue(int hd, String name, TPointer buf, int size) {
CategoryHandle categoryHandle = categoryHandles.get(hd);
if (categoryHandle == null) {
return -1;
}
if (log.isDebugEnabled()) {
log.debug(String.format("buf: %s", Utilities.getMemoryDump(buf.getAddress(), size)));
}
String fullName = categoryHandle.getFullName();
if (log.isDebugEnabled()) {
log.debug(String.format("sceRegSetKeyValue fullName='%s/%s'", fullName, name));
}
fullName = fullName.replace("flash1:/registry/system", "");
Settings settings = Settings.getInstance();
if ("/system/DATA/FONT".equals(fullName)) {
if ("path_name".equals(name)) {
String fontDirPath = buf.getStringNZ(size);
if (log.isInfoEnabled()) {
log.info(String.format("Setting font dir path to '%s'", fontDirPath));
}
Modules.sceFontModule.setFontDirPath(fontDirPath);
} else if ("num_fonts".equals(name) && size >= 4) {
List<sceFont.FontRegistryEntry> fontRegistry = Modules.sceFontModule.getFontRegistry();
int numFonts = buf.getValue32();
if (numFonts != fontRegistry.size()) {
if (log.isInfoEnabled()) {
log.info(String.format("Changing the number of fonts from %d to %d", fontRegistry.size(), numFonts));
}
}
} else {
log.warn(String.format("Unknown font registry entry '%s'", name));
}
} else if (fullName.startsWith("/system/DATA/FONT/PROPERTY/INFO")) {
List<sceFont.FontRegistryEntry> fontRegistry = Modules.sceFontModule.getFontRegistry();
int index = Integer.parseInt(fullName.substring(31));
if (index < 0 || index >= fontRegistry.size()) {
return -1;
}
FontRegistryEntry entry = fontRegistry.get(index);
if ("h_size".equals(name) && size >= 4) {
entry.h_size = buf.getValue32();
} else if ("v_size".equals(name) && size >= 4) {
entry.h_size = buf.getValue32();
} else if ("h_resolution".equals(name) && size >= 4) {
entry.h_size = buf.getValue32();
} else if ("v_resolution".equals(name) && size >= 4) {
entry.h_size = buf.getValue32();
} else if ("extra_attributes".equals(name) && size >= 4) {
entry.h_size = buf.getValue32();
} else if ("weight".equals(name) && size >= 4) {
entry.h_size = buf.getValue32();
} else if ("family_code".equals(name) && size >= 4) {
entry.h_size = buf.getValue32();
} else if ("style".equals(name) && size >= 4) {
entry.h_size = buf.getValue32();
} else if ("sub_style".equals(name) && size >= 4) {
entry.h_size = buf.getValue32();
} else if ("language_code".equals(name) && size >= 4) {
entry.h_size = buf.getValue32();
} else if ("region_code".equals(name) && size >= 4) {
entry.h_size = buf.getValue32();
} else if ("country_code".equals(name) && size >= 4) {
entry.h_size = buf.getValue32();
} else if ("file_name".equals(name)) {
entry.file_name = buf.getStringNZ(size);
} else if ("font_name".equals(name)) {
entry.font_name = buf.getStringNZ(size);
} else if ("expire_date".equals(name) && size >= 4) {
entry.h_size = buf.getValue32();
} else if ("shadow_option".equals(name) && size >= 4) {
entry.h_size = buf.getValue32();
} else {
log.warn(String.format("Unknown font registry entry '%s'", name));
}
} else if ("/DATA/COUNT".equals(fullName)) {
if ("wifi_connect_count".equals(name) && size >= 4) {
wifiConnectCount = buf.getValue32();
} else if ("usb_connect_count".equals(name) && size >= 4) {
usbConnectCount = buf.getValue32();
} else if ("psn_access_count".equals(name) && size >= 4) {
psnAccountCount = buf.getValue32();
} else {
log.warn(String.format("Unknown registry entry '%s'", name));
}
} else if ("/CONFIG/OSK".equals(fullName)) {
if ("version_id".equals(name) && size >= 4) {
oskVersionId = buf.getValue32();
} else if (name.equals("disp_locale") && size >= 4) {
oskDispLocale = buf.getValue32();
} else if (name.equals("writing_locale") && size >= 4) {
oskWritingLocale = buf.getValue32();
} else if (name.equals("input_char_mask") && size >= 4) {
oskInputCharMask = buf.getValue32();
} else if (name.equals("keytop_index") && size >= 4) {
oskKeytopIndex = buf.getValue32();
} else {
log.warn(String.format("Unknown registry entry '%s'", name));
}
} else if ("/CONFIG/NP".equals(fullName)) {
if ("env".equals(name)) {
npEnv = buf.getStringNZ(size);
} else if ("account_id".equals(name)) {
npAccountId = buf.getStringNZ(size);
settings.writeString("registry.npAccountId", npAccountId);
} else if ("login_id".equals(name)) {
npLoginId = buf.getStringNZ(size);
settings.writeString("registry.npLoginId", npLoginId);
} else if ("password".equals(name)) {
npPassword = buf.getStringNZ(size);
settings.writeString("registry.npPassword", npPassword);
} else if ("auto_sign_in_enable".equals(name) && size >= 4) {
npAutoSignInEnable = buf.getValue32();
settings.writeInt("registry.npAutoSignInEnable", npAutoSignInEnable);
} else {
log.warn(String.format("Unknown registry entry '%s'", name));
}
} else if ("/CONFIG/NETWORK/ADHOC".equals(fullName)) {
if ("ssid_prefix".equals(name)) {
adhocSsidPrefix = buf.getStringNZ(size);
} else {
log.warn(String.format("Unknown registry entry '%s'", name));
}
} else if ("/CONFIG/SYSTEM".equals(fullName)) {
if ("owner_name".equals(name)) {
ownerName = buf.getStringNZ(size);
}
} else if ("/CONFIG/SYSTEM/XMB/THEME".equals(fullName)) {
if ("custom_theme_mode".equals(name) && size >= 4) {
themeCustomThemeCode = buf.getValue32();
} else if ("color_mode".equals(name) && size >= 4) {
themeColorMode = buf.getValue32();
} else if ("wallpaper_mode".equals(name) && size >= 4) {
themeWallpaperMode = buf.getValue32();
} else if ("system_color".equals(name) && size >= 4) {
themeSystemColor = buf.getValue32();
} else {
log.warn(String.format("Unknown registry entry '%s'", name));
}
} else if ("/CONFIG/MUSIC".equals(fullName)) {
if ("visualizer_mode".equals(name) && size >= 4) {
musicVisualizerMode = buf.getValue32();
} else if (name.equals("track_info_mode") && size >= 4) {
musicTrackInfoMode = buf.getValue32();
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else if ("/CONFIG/CAMERA".equals(fullName)) {
if ("msid".equals(name) && size >= 0) {
String msid = buf.getStringNZ(16);
if (log.isDebugEnabled()) {
log.debug(String.format("sceRegSetKeyValue msid='%s'", msid));
}
} else if (name.equals("file_folder") && size >= 4) {
int fileFolder = buf.getValue32();
if (log.isDebugEnabled()) {
log.debug(String.format("sceRegSetKeyValue fileFolder=0x%X", fileFolder));
}
} else if (name.equals("file_number") && size >= 4) {
int fileNumber = buf.getValue32();
if (log.isDebugEnabled()) {
log.debug(String.format("sceRegSetKeyValue fileNumber=0x%X", fileNumber));
}
} else if (name.equals("movie_quality") && size >= 4) {
int movieQuality = buf.getValue32();
if (log.isDebugEnabled()) {
log.debug(String.format("sceRegSetKeyValue movieQuality=0x%X", movieQuality));
}
} else if (name.equals("movie_size") && size >= 4) {
int movieSize = buf.getValue32();
if (log.isDebugEnabled()) {
log.debug(String.format("sceRegSetKeyValue movieSize=0x%X", movieSize));
}
} else if (name.equals("movie_fps") && size >= 4) {
int movieFps = buf.getValue32();
if (log.isDebugEnabled()) {
log.debug(String.format("sceRegSetKeyValue movieFps=0x%X", movieFps));
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
} else {
log.warn(String.format("Unknown registry entry '%s/%s'", fullName, name));
}
return 0;
}
@HLEFunction(nid = 0xD4475AA8, version = 150)
public int sceRegGetKeyInfo(int hd, String name, TPointer32 hk, @BufferInfo(usage=Usage.out) TPointer32 ptype, @BufferInfo(usage=Usage.out) TPointer32 psize) {
CategoryHandle categoryHandle = categoryHandles.get(hd);
if (categoryHandle == null) {
return -1;
}
KeyHandle keyHandle = new KeyHandle(name);
keyHandles.put(keyHandle.uid, keyHandle);
hk.setValue(keyHandle.uid);
return getKey(categoryHandle, name, ptype, psize, TPointer.NULL, 0);
}
@HLEFunction(nid = 0x28A8E98A, version = 150)
public int sceRegGetKeyValue(int hd, int hk, @BufferInfo(lengthInfo=LengthInfo.nextParameter, usage=Usage.out) TPointer buf, int size) {
CategoryHandle categoryHandle = categoryHandles.get(hd);
if (categoryHandle == null) {
return -1;
}
KeyHandle keyHandle = keyHandles.get(hk);
if (keyHandle == null) {
return -1;
}
return getKey(categoryHandle, keyHandle.name, TPointer32.NULL, TPointer32.NULL, buf, size);
}
@HLEUnimplemented
@HLEFunction(nid = 0x2C0DB9DD, version = 150)
public int sceRegGetKeysNum(int hd, int num) {
CategoryHandle categoryHandle = categoryHandles.get(hd);
if (categoryHandle == null) {
return -1;
}
return 0;
}
@HLEUnimplemented
@HLEFunction(nid = 0x2D211135, version = 150)
public int sceRegGetKeys(int hd, TPointer buf, int num) {
CategoryHandle categoryHandle = categoryHandles.get(hd);
if (categoryHandle == null) {
return -1;
}
return 0;
}
@HLEUnimplemented
@HLEFunction(nid = 0x4CA16893, version = 150)
public int sceRegRemoveCategory(int h, String name) {
return 0;
}
@HLEFunction(nid = 0xC5768D02, version = 150)
public int sceRegGetKeyInfoByName(int hd, String name, @BufferInfo(usage=Usage.out) TPointer32 ptype, @BufferInfo(usage=Usage.out) TPointer32 psize) {
CategoryHandle categoryHandle = categoryHandles.get(hd);
if (categoryHandle == null) {
return -1;
}
if (log.isDebugEnabled()) {
log.debug(String.format("sceRegGetKeyInfoByName fullName='%s/%s'", categoryHandle.getFullName(), name));
}
return getKey(categoryHandle, name, ptype, psize, TPointer.NULL, 0);
}
@HLEFunction(nid = 0x30BE0259, version = 150)
public int sceRegGetKeyValueByName(int hd, String name, @BufferInfo(lengthInfo=LengthInfo.nextParameter, usage=Usage.out) TPointer buf, int size) {
CategoryHandle categoryHandle = categoryHandles.get(hd);
if (categoryHandle == null) {
return -1;
}
if (log.isDebugEnabled()) {
log.debug(String.format("sceRegGetKeyValueByName fullName='%s/%s'", categoryHandle.getFullName(), name));
}
return getKey(categoryHandle, name, TPointer32.NULL, TPointer32.NULL, buf, size);
}
@HLEFunction(nid = 0xDBA46704, version = 150)
public int sceRegOpenRegistry_660(TPointer reg, int mode, @BufferInfo(usage=Usage.out) TPointer32 h) {
return sceRegOpenRegistry(reg, mode, h);
}
@HLEFunction(nid = 0x4F471457, version = 150)
public int sceRegOpenCategory_660(int h, String name, int mode, @BufferInfo(usage=Usage.out) TPointer32 hd) {
return sceRegOpenCategory(h, name, mode, hd);
}
@HLEFunction(nid = 0x9980519F, version = 150)
public int sceRegGetKeyInfo_660(int hd, String name, TPointer32 hk, @BufferInfo(usage=Usage.out) TPointer32 ptype, @BufferInfo(usage=Usage.out) TPointer32 psize) {
return sceRegGetKeyInfo(hd, name, hk, ptype, psize);
}
@HLEFunction(nid = 0xF2619407, version = 150)
public int sceRegGetKeyInfoByName_660(int hd, String name, @BufferInfo(usage=Usage.out) TPointer32 ptype, @BufferInfo(usage=Usage.out) TPointer32 psize) {
return sceRegGetKeyInfoByName(hd, name, ptype, psize);
}
@HLEFunction(nid = 0xF4A3E396, version = 150)
public int sceRegGetKeyValue_660(int hd, int hk, @BufferInfo(lengthInfo=LengthInfo.nextParameter, usage=Usage.out) TPointer buf, int size) {
return sceRegGetKeyValue(hd, hk, buf, size);
}
@HLEFunction(nid = 0x38415B9F, version = 150)
public int sceRegGetKeyValueByName_660(int hd, String name, @BufferInfo(lengthInfo=LengthInfo.nextParameter, usage=Usage.out) TPointer buf, int size) {
return sceRegGetKeyValueByName(hd, name, buf, size);
}
@HLEFunction(nid = 0x3B6CA1E6, version = 150)
public int sceRegCreateKey_660(int hd, String name, int type, int size) {
return sceRegCreateKey(hd, name, type, size);
}
@HLEFunction(nid = 0x49C70163, version = 150)
public int sceRegSetKeyValue_660(int hd, String name, TPointer buf, int size) {
return sceRegSetKeyValue(hd, name, buf, size);
}
@HLEFunction(nid = 0x5FD4764A, version = 150)
public int sceRegFlushRegistry_660(int h) {
return sceRegFlushRegistry(h);
}
@HLEFunction(nid = 0xFC742751, version = 150)
public int sceRegCloseCategory_660(int hd) {
return sceRegCloseCategory(hd);
}
@HLEFunction(nid = 0x49D77D65, version = 150)
public int sceRegCloseRegistry_660(int h) {
return sceRegCloseRegistry(h);
}
@HLEUnimplemented
@HLEFunction(nid = 0x61DB9D06, version = 150)
public int sceRegRemoveCategory_660(int h, String name) {
return sceRegRemoveCategory(h, name);
}
@HLEUnimplemented
@HLEFunction(nid = 0xD743A608, version = 150)
public int sceRegFlushCategory_660(int hd) {
return sceRegFlushCategory(hd);
}
}