Use a PSPPointer in OSK to simplify things.

This commit is contained in:
Unknown W. Brackets 2013-06-02 14:33:23 -07:00
parent bc149a27a1
commit 9eb2238704
2 changed files with 28 additions and 63 deletions

View File

@ -124,34 +124,15 @@ PSPOskDialog::PSPOskDialog() : PSPDialog() {
PSPOskDialog::~PSPOskDialog() {
}
void PSPOskDialog::ConvertUCS2ToUTF8(std::string& _string, const u32 em_address)
void PSPOskDialog::ConvertUCS2ToUTF8(std::string& _string, const PSPPointer<wchar_t> em_address)
{
char stringBuffer[2048];
char *string = stringBuffer;
if (em_address == 0)
if (!em_address.Valid())
{
_string = "";
return;
}
u16 *src = (u16 *) Memory::GetPointer(em_address);
int c;
while (c = *src++)
{
if (c < 0x80)
*string++ = c;
else if (c < 0x800) {
*string++ = 0xC0 | (c >> 6);
*string++ = 0x80 | (c & 0x3F);
} else {
*string++ = 0xE0 | (c >> 12);
*string++ = 0x80 | ((c >> 6) & 0x3F);
*string++ = 0x80 | (c & 0x3F);
}
}
*string++ = '\0';
_string = stringBuffer;
ConvertUCS2ToUTF8(_string, &em_address[0]);
}
void PSPOskDialog::ConvertUCS2ToUTF8(std::string& _string, wchar_t* input)
@ -189,16 +170,16 @@ int PSPOskDialog::Init(u32 oskPtr)
return -1;
}
oskParams = Memory::GetStruct<SceUtilityOskParams>(oskPtr);
oskParams = oskPtr;
if (oskParams->base.size != sizeof(SceUtilityOskParams))
{
ERROR_LOG(HLE, "sceUtilityOskInitStart: invalid size (%d)", oskParams->base.size);
return SCE_ERROR_UTILITY_INVALID_PARAM_SIZE;
}
// Also seems to crash.
if (!Memory::IsValidAddress(oskParams->fieldPtr))
if (!oskParams->fields.Valid())
{
ERROR_LOG_REPORT(HLE, "sceUtilityOskInitStart: invalid field data (%08x)", oskParams->fieldPtr);
ERROR_LOG_REPORT(HLE, "sceUtilityOskInitStart: invalid field data (%08x)", oskParams->fields.ptr);
return -1;
}
@ -211,17 +192,16 @@ int PSPOskDialog::Init(u32 oskPtr)
selectedChar = 0;
currentKeyboard = OSK_KEYBOARD_LATIN_LOWERCASE;
Memory::ReadStruct(oskParams->fieldPtr, &oskData);
ConvertUCS2ToUTF8(oskDesc, oskData.descPtr);
ConvertUCS2ToUTF8(oskIntext, oskData.intextPtr);
ConvertUCS2ToUTF8(oskOuttext, oskData.outtextPtr);
ConvertUCS2ToUTF8(oskDesc, oskParams->fields[0].desc);
ConvertUCS2ToUTF8(oskIntext, oskParams->fields[0].intext);
ConvertUCS2ToUTF8(oskOuttext, oskParams->fields[0].outtext);
i_level = 0;
inputChars = L"";
if (oskData.intextPtr) {
u16 *src = (u16 *) Memory::GetPointer(oskData.intextPtr);
if (oskParams->fields[0].intext.Valid()) {
auto src = oskParams->fields[0].intext;
int c;
while (c = *src++)
{
@ -646,9 +626,9 @@ u32 PSPOskDialog::GetIndex(const wchar_t* src, wchar_t ch)
u32 PSPOskDialog::FieldMaxLength()
{
if (oskData.outtextlimit > oskData.outtextlength - 1 || oskData.outtextlimit == 0)
return oskData.outtextlength - 1;
return oskData.outtextlimit;
if (oskParams->fields[0].outtextlimit > oskParams->fields[0].outtextlength - 1 || oskParams->fields[0].outtextlimit == 0)
return oskParams->fields[0].outtextlength - 1;
return oskParams->fields[0].outtextlimit;
}
void PSPOskDialog::RenderKeyboard()
@ -835,33 +815,21 @@ int PSPOskDialog::Update()
status = SCE_UTILITY_STATUS_SHUTDOWN;
}
for (u32 i = 0; i < oskData.outtextlength; ++i)
wchar_t *outText = oskParams->fields[0].outtext;
for (u32 i = 0, end = oskParams->fields[0].outtextlength; i < end; ++i)
{
u16 value = 0;
if (i < inputChars.size())
value = inputChars[i];
Memory::Write_U16(value, oskData.outtextPtr + (2 * i));
outText[i] = inputChars[i];
outText[i] = value;
}
oskParams->base.result = 0;
oskData.result = PSP_UTILITY_OSK_RESULT_CHANGED;
Memory::WriteStruct(oskParams->fieldPtr, &oskData);
oskParams->fields[0].result = PSP_UTILITY_OSK_RESULT_CHANGED;
return 0;
}
template <typename T>
static void DoBasePointer(PointerWrap &p, T **ptr)
{
u32 addr = *ptr == NULL ? 0 : (u8 *) *ptr - Memory::base;
p.Do(addr);
if (addr == 0)
*ptr = NULL;
else
*ptr = Memory::GetStruct<T>(addr);
}
int PSPOskDialog::Shutdown(bool force)
{
if (status != SCE_UTILITY_STATUS_FINISHED && !force)
@ -875,8 +843,7 @@ int PSPOskDialog::Shutdown(bool force)
void PSPOskDialog::DoState(PointerWrap &p)
{
PSPDialog::DoState(p);
DoBasePointer(p, &oskParams);
p.Do(oskData);
p.Do(oskParams);
p.Do(oskDesc);
p.Do(oskIntext);
p.Do(oskOuttext);

View File

@ -94,7 +94,7 @@ enum SceUtilityOskInputType
/**
* OSK Field data
*/
typedef struct _SceUtilityOskData
struct SceUtilityOskData
{
/** Unknown. Pass 0. */
int unk_00;
@ -111,19 +111,18 @@ typedef struct _SceUtilityOskData
/** Unknown. Pass 0. */
int unk_24;
/** Description text */
u32 descPtr;
PSPPointer<wchar_t> desc;
/** Initial text */
u32 intextPtr;
PSPPointer<wchar_t> intext;
// Length, in unsigned shorts, including the terminator.
u32 outtextlength;
/** Pointer to the output text */
u32 outtextPtr;
PSPPointer<wchar_t> outtext;
/** Result. One of ::SceUtilityOskResult */
int result;
// Number of characters to allow, not including terminator (if less than outtextlength - 1.)
u32 outtextlimit;
} SceUtilityOskData;
};
// Parameters to sceUtilityOskInitStart
struct SceUtilityOskParams
@ -132,7 +131,7 @@ struct SceUtilityOskParams
// Number of fields.
int fieldCount;
// Pointer to an array of fields (see SceUtilityOskData.)
u32 fieldPtr;
PSPPointer<SceUtilityOskData> fields;
SceUtilityOskState state;
// Maybe just padding?
int unk_60;
@ -164,7 +163,7 @@ public:
virtual int Shutdown(bool force = false);
virtual void DoState(PointerWrap &p);
private:
void ConvertUCS2ToUTF8(std::string& _string, const u32 em_address);
void ConvertUCS2ToUTF8(std::string& _string, const PSPPointer<wchar_t> em_address);
void ConvertUCS2ToUTF8(std::string& _string, wchar_t* input);
void RenderKeyboard();
@ -175,8 +174,7 @@ private:
u32 FieldMaxLength();
u32 GetIndex(const wchar_t* src, wchar_t ch);
SceUtilityOskParams *oskParams;
SceUtilityOskData oskData;
PSPPointer<SceUtilityOskParams> oskParams;
std::string oskDesc;
std::string oskIntext;
std::string oskOuttext;