diff options
Diffstat (limited to 'Minecraft.Client/Orbis/OrbisExtras/OrbisStubs.cpp')
| -rw-r--r-- | Minecraft.Client/Orbis/OrbisExtras/OrbisStubs.cpp | 790 |
1 files changed, 790 insertions, 0 deletions
diff --git a/Minecraft.Client/Orbis/OrbisExtras/OrbisStubs.cpp b/Minecraft.Client/Orbis/OrbisExtras/OrbisStubs.cpp new file mode 100644 index 00000000..d3a21ac4 --- /dev/null +++ b/Minecraft.Client/Orbis/OrbisExtras/OrbisStubs.cpp @@ -0,0 +1,790 @@ +#include "stdafx.h" +#include <sce_atomic.h> +#include <fios2.h> +#include <libsysmodule.h> +#include <perf.h> +#include <audioout.h> +#include <game_custom_data_dialog.h> +#include <system_service.h> +#include <error_dialog.h> +#include <message_dialog.h> + + +//#include <app_content.h> + +// These are required so that the heap will automatically expand - default is limited to 256KB +size_t sceLibcHeapSize = SCE_LIBC_HEAP_SIZE_EXTENDED_ALLOC_NO_LIMIT; +unsigned int sceLibcHeapExtendedAlloc = 1; + +//static char dirName[128]; +//static char contentInfoPath[128]; +static char usrdirPath[128]; +int32_t hBGMAudio; + +//static char sc_loadPath[] = {"/app0/"}; +//const char* getConsoleHomePath() { return sc_loadPath; } + +char* getUsrDirPath() +{ + return usrdirPath; +} + + +int _wcsicmp( const wchar_t * dst, const wchar_t * src ) +{ + wchar_t f,l; + + // validation section + // _VALIDATE_RETURN(dst != NULL, EINVAL, _NLSCMPERROR); + // _VALIDATE_RETURN(src != NULL, EINVAL, _NLSCMPERROR); + + do { + f = towlower(*dst); + l = towlower(*src); + dst++; + src++; + } while ( (f) && (f == l) ); + return (int)(f - l); +} + +size_t wcsnlen(const wchar_t *wcs, size_t maxsize) +{ + size_t n; + +// Note that we do not check if s == NULL, because we do not +// return errno_t... + + for (n = 0; n < maxsize && *wcs; n++, wcs++) + ; + + return n; +} + + +VOID GetSystemTime( LPSYSTEMTIME lpSystemTime) +{ + SceRtcDateTime dateTime; + int err = sceRtcGetCurrentClock(&dateTime, 0); + assert(err == SCE_OK); + + lpSystemTime->wYear = sceRtcGetYear(&dateTime); + lpSystemTime->wMonth = sceRtcGetMonth(&dateTime); + lpSystemTime->wDay = sceRtcGetDay(&dateTime); + lpSystemTime->wDayOfWeek = sceRtcGetDayOfWeek(lpSystemTime->wYear, lpSystemTime->wMonth, lpSystemTime->wDay); + lpSystemTime->wHour = sceRtcGetHour(&dateTime); + lpSystemTime->wMinute = sceRtcGetMinute(&dateTime); + lpSystemTime->wSecond = sceRtcGetSecond(&dateTime); + lpSystemTime->wMilliseconds = sceRtcGetMicrosecond(&dateTime)/1000; +} +BOOL FileTimeToSystemTime(CONST FILETIME *lpFileTime, LPSYSTEMTIME lpSystemTime) { ORBIS_STUBBED; return false; } +BOOL SystemTimeToFileTime(CONST SYSTEMTIME *lpSystemTime, LPFILETIME lpFileTime) { ORBIS_STUBBED; return false; } +VOID GetLocalTime(LPSYSTEMTIME lpSystemTime) +{ + SceRtcDateTime dateTime; + int err = sceRtcGetCurrentClockLocalTime(&dateTime); + assert(err == SCE_OK ); + + lpSystemTime->wYear = sceRtcGetYear(&dateTime); + lpSystemTime->wMonth = sceRtcGetMonth(&dateTime); + lpSystemTime->wDay = sceRtcGetDay(&dateTime); + lpSystemTime->wDayOfWeek = sceRtcGetDayOfWeek(lpSystemTime->wYear, lpSystemTime->wMonth, lpSystemTime->wDay); + lpSystemTime->wHour = sceRtcGetHour(&dateTime); + lpSystemTime->wMinute = sceRtcGetMinute(&dateTime); + lpSystemTime->wSecond = sceRtcGetSecond(&dateTime); + lpSystemTime->wMilliseconds = sceRtcGetMicrosecond(&dateTime)/1000; +} + +HANDLE CreateEvent(void* lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCSTR lpName) { ORBIS_STUBBED; return NULL; } +VOID Sleep(DWORD dwMilliseconds) +{ + C4JThread::Sleep(dwMilliseconds); +} + +BOOL SetThreadPriority(HANDLE hThread, int nPriority) { ORBIS_STUBBED; return FALSE; } +DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds) { ORBIS_STUBBED; return false; } + +LONG InterlockedCompareExchangeRelease(LONG volatile *Destination, LONG Exchange,LONG Comperand ) +{ + return sceAtomicCompareAndSwap32((int32_t*)Destination, (int32_t)Comperand, (int32_t)Exchange); +} + +LONG64 InterlockedCompareExchangeRelease64(LONG64 volatile *Destination, LONG64 Exchange, LONG64 Comperand) +{ + return sceAtomicCompareAndSwap64((int64_t*)Destination, (int64_t)Comperand, (int64_t)Exchange); +} + + +ScePthreadMutexattr mutexParams; +int64_t g_OpStorage[4*1024]; /* 32KiB */ +int64_t g_ChunkStorage[8*1024]; /* 64KiB */ +int64_t g_FHStorage[2*1024]; /* 16KiB */ +int64_t g_DHStorage[512]; /* 4KiB */ + +VOID OrbisInit() +{ + static bool initialised = false; + + if( initialised ) return; + initialised = true; + + sceSysmoduleLoadModule(SCE_SYSMODULE_PNG_ENC); + sceSysmoduleLoadModule(SCE_SYSMODULE_PNG_DEC); + sceSysmoduleLoadModule(SCE_SYSMODULE_APP_CONTENT); + sceSysmoduleLoadModule(SCE_SYSMODULE_SAVE_DATA_DIALOG); + sceSysmoduleLoadModule(SCE_SYSMODULE_IME_DIALOG); + sceSysmoduleLoadModule(SCE_SYSMODULE_RUDP); + sceSysmoduleLoadModule(SCE_SYSMODULE_NP_MATCHING2); + sceSysmoduleLoadModule(SCE_SYSMODULE_INVITATION_DIALOG); + sceSysmoduleLoadModule(SCE_SYSMODULE_NP_PARTY ); + sceSysmoduleLoadModule(SCE_SYSMODULE_GAME_CUSTOM_DATA_DIALOG ); + sceSysmoduleLoadModule(SCE_SYSMODULE_NP_SCORE_RANKING ); + sceSysmoduleLoadModule(SCE_SYSMODULE_NP_AUTH ); + sceSysmoduleLoadModule(SCE_SYSMODULE_NP_COMMERCE); + sceSysmoduleLoadModule(SCE_SYSMODULE_REMOTE_PLAY); + sceSysmoduleLoadModule(SCE_SYSMODULE_ERROR_DIALOG); + sceSysmoduleLoadModule(SCE_SYSMODULE_MESSAGE_DIALOG); + sceSysmoduleLoadModule(SCE_SYSMODULE_VOICE); + sceSysmoduleLoadModule(SCE_SYSMODULE_GAME_LIVE_STREAMING); + + SceFiosParams fiosParams = SCE_FIOS_PARAMS_INITIALIZER; + fiosParams.opStorage.pPtr = g_OpStorage; + fiosParams.opStorage.length = sizeof(g_OpStorage); + fiosParams.chunkStorage.pPtr = g_ChunkStorage; + fiosParams.chunkStorage.length = sizeof(g_ChunkStorage); + fiosParams.fhStorage.pPtr = g_FHStorage; + fiosParams.fhStorage.length = sizeof(g_FHStorage); + fiosParams.dhStorage.pPtr = g_DHStorage; + fiosParams.dhStorage.length = sizeof(g_DHStorage); + + int err = sceFiosInitialize(&fiosParams); + assert(err == SCE_FIOS_OK); + + scePthreadMutexattrInit(&mutexParams); + scePthreadMutexattrSettype(&mutexParams, SCE_PTHREAD_MUTEX_ADAPTIVE); +#ifdef USE_RAZOR + const int RAZOR_BUFFER_SIZE = 65536; + void *razorMem = malloc(RAZOR_BUFFER_SIZE); + err = sceRazorCpuInit(razorMem, RAZOR_BUFFER_SIZE); + assert(err == 0 ); +#endif + scePthreadSetaffinity(scePthreadSelf(), 1); + + sceAudioOutInit(); + hBGMAudio=sceAudioOutOpen( + SCE_USER_SERVICE_USER_ID_SYSTEM, + SCE_AUDIO_OUT_PORT_TYPE_BGM,0, + 256, + 48000, + 2); + + err = sceCommonDialogInitialize(); + //err = sceNpCommerceDialogInitialize(); + assert(err == SCE_OK); + + // 4J-PB - Can't keep this initialised as we monitor and handle the finished status in the main menu for patches +// err = sceErrorDialogInitialize(); +// assert(err == SCE_OK); + + // 4J-PB - can't init this here - it conflicts with the commerce dialog for dlc checkouts/PSPlus upsells. We need to init it when we use it, and then terminate it. + //err = sceMsgDialogInitialize(); + assert(err == SCE_OK); +} + +int32_t GetAudioBGMHandle() +{ + return hBGMAudio; +} + +VOID InitializeCriticalSection(PCRITICAL_SECTION CriticalSection) +{ + char name[1] = {0}; + + int err = scePthreadMutexInit(&CriticalSection->mutex, &mutexParams, name); + CriticalSection->m_cLock = 0; + assert(err == SCE_OK); +#ifdef _DEBUG + CriticalSection->m_pOwnerThread = NULL; +#endif + +} + + +VOID InitializeCriticalSectionAndSpinCount(PCRITICAL_SECTION CriticalSection, ULONG SpinCount) +{ + InitializeCriticalSection(CriticalSection); +} + +VOID DeleteCriticalSection(PCRITICAL_SECTION CriticalSection) +{ + int err = scePthreadMutexDestroy(&CriticalSection->mutex); + assert(err == SCE_OK); +} + +extern CRITICAL_SECTION g_singleThreadCS; + +VOID EnterCriticalSection(PCRITICAL_SECTION CriticalSection) +{ + int err = scePthreadMutexLock(&CriticalSection->mutex); + assert(err == SCE_OK || err == SCE_KERNEL_ERROR_EDEADLK ); + CriticalSection->m_cLock++; + +#ifdef _DEBUG + __thread static bool bRecursing = false; + if(bRecursing == false) + { + bRecursing = true; + CriticalSection->m_pOwnerThread = C4JThread::getCurrentThread(); + bRecursing = false; + } +#endif +} + + +VOID LeaveCriticalSection(PCRITICAL_SECTION CriticalSection) +{ + if(--CriticalSection->m_cLock == 0 ) + { + int err = scePthreadMutexUnlock(&CriticalSection->mutex); + assert(err == SCE_OK ); +#ifdef _DEBUG + CriticalSection->m_pOwnerThread = NULL; +#endif + + } +} + +ULONG TryEnterCriticalSection(PCRITICAL_SECTION CriticalSection) +{ + int err = scePthreadMutexTrylock(&CriticalSection->mutex); + if((err == SCE_OK || err == SCE_KERNEL_ERROR_EDEADLK )) + { + CriticalSection->m_cLock++; + return true; + } + return false; +} + +DWORD WaitForMultipleObjects(DWORD nCount, CONST HANDLE *lpHandles,BOOL bWaitAll,DWORD dwMilliseconds) { ORBIS_STUBBED; return 0; } + +BOOL CloseHandle(HANDLE hObject) +{ + sceFiosFHCloseSync(NULL,(SceFiosFH)((int64_t)hObject)); + return true; +// ORBIS_STUBBED; +// return false; +} + +BOOL SetEvent(HANDLE hEvent) { ORBIS_STUBBED; return false; } + +HMODULE GetModuleHandle(LPCSTR lpModuleName) { ORBIS_STUBBED; return 0; } + +DWORD GetCurrentThreadId(VOID) +{ + return 0; // TODO +} +DWORD WaitForMultipleObjectsEx(DWORD nCount,CONST HANDLE *lpHandles,BOOL bWaitAll,DWORD dwMilliseconds,BOOL bAlertable ) { ORBIS_STUBBED; return 0; } +BOOL GetExitCodeThread(HANDLE hThread, LPDWORD lpExitCode) { ORBIS_STUBBED; return false;} + +DWORD TlsAlloc(VOID) { return TLSStorageOrbis::Instance()->Alloc(); } +BOOL TlsFree(DWORD dwTlsIndex) { return TLSStorageOrbis::Instance()->Free(dwTlsIndex); } +LPVOID TlsGetValue(DWORD dwTlsIndex) { return TLSStorageOrbis::Instance()->GetValue(dwTlsIndex); } +BOOL TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue) { return TLSStorageOrbis::Instance()->SetValue(dwTlsIndex, lpTlsValue); } + + +// we have to manage our own virtual allocs here, so this class stores all the info for each of them +class OrbisVAlloc +{ +public: + class PageInfo + { + public: + off_t m_physAddr; + void* m_virtualAddr; + uint64_t m_size; + + PageInfo(off_t physAddr, void* virtualAddr, uint64_t size) + : m_physAddr(physAddr) + , m_virtualAddr(virtualAddr) + , m_size(size) + {} + }; + void* m_virtualAddr; + uint64_t m_virtualSize; + std::vector<PageInfo> m_pagesAllocated; + uint64_t m_allocatedSize; + + OrbisVAlloc(void* addr, uint64_t size) + : m_virtualAddr(addr) + , m_virtualSize(size) + , m_allocatedSize(0) + { + } + + ~OrbisVAlloc() + { + Decommit(); + int err = sceKernelMunmap(m_virtualAddr, m_virtualSize); + assert( err == SCE_OK ); + } + + void* Commit(uint64_t size) + { + uint64_t sizeToAdd = size - m_allocatedSize; // the extra memory size that we have to add on + assert(sizeToAdd >= 0); + + if(sizeToAdd == 0) + return m_virtualAddr; // nothing to add + + + off_t physAddr; + // Allocate the physical memory here + int err = sceKernelAllocateDirectMemory( 0, SCE_KERNEL_MAIN_DMEM_SIZE, sizeToAdd, 16*1024, SCE_KERNEL_WB_ONION, &physAddr); + if(err != SCE_OK) + { + assert(0); + return NULL; + } + // work out where the next page should be in virtual addr space, and pass that to the mapping function + void* pageVirtualAddr = ((char*)m_virtualAddr) + m_allocatedSize; + + void* inAddr = pageVirtualAddr; + err = sceKernelMapDirectMemory( + &inAddr, + sizeToAdd, + SCE_KERNEL_PROT_CPU_READ | SCE_KERNEL_PROT_CPU_WRITE, + SCE_KERNEL_MAP_FIXED, + physAddr, + 16*1024 ); + + if(inAddr != pageVirtualAddr) // make sure we actually get the virtual address that we requested + { + assert(0); + return NULL; + } + if(err != SCE_OK) + { + assert(0); + return NULL; + } + m_pagesAllocated.push_back(PageInfo(physAddr, pageVirtualAddr, sizeToAdd)); + m_allocatedSize += sizeToAdd; + return m_virtualAddr; + } + + + + void Decommit() + { + // spin round all the pages, unmapping and deallocating them + for(int i=0;i<m_pagesAllocated.size();i++) + { + int err = sceKernelMunmap(m_pagesAllocated[i].m_virtualAddr, m_pagesAllocated[i].m_size); + assert(err == SCE_OK); + err = sceKernelReleaseDirectMemory(m_pagesAllocated[i].m_physAddr, m_pagesAllocated[i].m_size); + assert(err == SCE_OK); + } + m_pagesAllocated.clear(); + m_allocatedSize = 0; + } + +}; + +// List of all virtual allocs that have been made +static std::vector<OrbisVAlloc*> s_orbisVAllocs; + + +LPVOID VirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect) +{ + if(lpAddress == NULL) + { + void *pAddr = (void*)SCE_KERNEL_APP_MAP_AREA_START_ADDR; + int err = sceKernelReserveVirtualRange(&pAddr, dwSize, 0, 16*1024); + if( err != SCE_OK ) + { + app.DebugPrintf("sceKernelReserveVirtualRange failed: 0x%08X\n", err); + return NULL; + } + s_orbisVAllocs.push_back(new OrbisVAlloc(pAddr, dwSize)); + return (LPVOID)pAddr; + } + else + { + if( flAllocationType & MEM_COMMIT ) + { + for(int i=0;i<s_orbisVAllocs.size();i++) + { + if(s_orbisVAllocs[i]->m_virtualAddr == lpAddress) + { + return s_orbisVAllocs[i]->Commit(dwSize); + } + } + assert(0); // failed to find the virtual alloc in our table + return NULL; + } + } + return NULL; +} + +BOOL VirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType) +{ + int idx = -1; + for(int i=0;i<s_orbisVAllocs.size();i++) + { + if(s_orbisVAllocs[i]->m_virtualAddr == lpAddress) + { + idx = i; + } + } + + assert(idx >= 0); + assert(dwSize == s_orbisVAllocs[idx]->m_virtualSize); // only supporting decommitting the entire memory size + + if(dwFreeType == MEM_DECOMMIT) + { + s_orbisVAllocs[idx]->Decommit(); + } + else if(dwFreeType == MEM_RELEASE) + { + delete s_orbisVAllocs[idx]; + s_orbisVAllocs.erase(s_orbisVAllocs.begin()+idx); + } + + return TRUE; +} + +DWORD GetFileSize( HANDLE hFile, LPDWORD lpFileSizeHigh ) +{ + SceFiosSize FileSize; + SceFiosFH fh = (SceFiosFH)((int64_t)hFile); + //DWORD FileSizeLow; + FileSize=sceFiosFHGetSize(fh); + if(lpFileSizeHigh) + *lpFileSizeHigh= (DWORD)(FileSize>>32); + else + { + assert(FileSize>>32 == 0); + } + + return (DWORD)FileSize; +} + +BOOL GetFileSizeEx(HANDLE hFile, PLARGE_INTEGER lpFileSize ) +{ + SceFiosSize FileSize; + SceFiosFH fh = (SceFiosFH)((int64_t)hFile); + + FileSize=sceFiosFHGetSize(fh); + lpFileSize->QuadPart=FileSize; + + return true; +} +BOOL WriteFile( + HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped ) +{ + SceFiosFH fh = (SceFiosFH)((int64_t)hFile); + // sceFiosFHReadSync - Non-negative values are the number of bytes read, 0 <= result <= length. Negative values are error codes. + SceFiosSize bytesRead = sceFiosFHWriteSync(NULL, fh, lpBuffer, (SceFiosSize)nNumberOfBytesToWrite); + if(bytesRead < 0) + { + // error + return FALSE; + } + else + { + *lpNumberOfBytesWritten = (DWORD)bytesRead; + return TRUE; + } +} + +BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped ) +{ + SceFiosFH fh = (SceFiosFH)((int64_t)hFile); + // sceFiosFHReadSync - Non-negative values are the number of bytes read, 0 <= result <= length. Negative values are error codes. + SceFiosSize bytesRead = sceFiosFHReadSync(NULL, fh, lpBuffer, (SceFiosSize)nNumberOfBytesToRead); + *lpNumberOfBytesRead = (DWORD)bytesRead; + if(bytesRead < 0) + { + // error + return FALSE; + } + else + { + return TRUE; + } +} + +BOOL SetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod) +{ + SceFiosFH fd = (SceFiosFH)((int64_t)hFile); + + uint64_t bitsToMove = (int64_t) lDistanceToMove; + SceFiosOffset pos = 0; + + if (lpDistanceToMoveHigh != NULL) + bitsToMove |= ((uint64_t) (*lpDistanceToMoveHigh)) << 32; + + SceFiosWhence whence = SCE_FIOS_SEEK_SET; + switch(dwMoveMethod) + { + case FILE_BEGIN: whence = SCE_FIOS_SEEK_SET; break; + case FILE_CURRENT: whence = SCE_FIOS_SEEK_CUR; break; + case FILE_END: whence = SCE_FIOS_SEEK_END; break; + }; + + pos = sceFiosFHSeek(fd, (int64_t) lDistanceToMove, whence); + + return (pos != -1); +} + + +HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) +{ + char filePath[256]; + std::string mountedPath = StorageManager.GetMountedPath(lpFileName); + if(mountedPath.length() > 0) + { + strcpy(filePath, mountedPath.c_str()); + } + else if(lpFileName[0] == '/') // already fully qualified path + strcpy(filePath, lpFileName ); + else + sprintf(filePath,"%s/%s",getUsrDirPath(), lpFileName ); + +#ifndef _CONTENT_PACKAGE + app.DebugPrintf("*** Opening %s\n",filePath); +#endif + + SceFiosFH fh; + SceFiosOpenParams openParams; + ZeroMemory(&openParams, sizeof(SceFiosOpenParams)); + + switch(dwDesiredAccess) + { + case GENERIC_READ: + openParams.openFlags = SCE_FIOS_O_RDONLY; break; + case GENERIC_WRITE: + openParams.openFlags = SCE_FIOS_O_WRONLY; break; + default: + openParams.openFlags = SCE_FIOS_O_READ | SCE_FIOS_O_WRITE; break; + } + + switch(dwCreationDisposition) + { + case CREATE_ALWAYS: + openParams.openFlags |= SCE_FIOS_O_CREAT; break; + case CREATE_NEW: + openParams.openFlags |= SCE_FIOS_O_CREAT; break; + case OPEN_ALWAYS: + openParams.openFlags |= SCE_FIOS_O_CREAT; break; + case OPEN_EXISTING: + break; + case TRUNCATE_EXISTING: + break; + } + int err = sceFiosFHOpenSync(NULL, &fh, filePath, &openParams); + + if(err != SCE_FIOS_OK) + { + return INVALID_HANDLE_VALUE; + } + //assert( err == SCE_FIOS_OK ); + + return (void*)fh; +} + +BOOL CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes){ ORBIS_STUBBED; return false; } +BOOL DeleteFileA(LPCSTR lpFileName) { ORBIS_STUBBED; return false; } + +// BOOL XCloseHandle(HANDLE a) +// { +// sceFiosFHCloseSync(NULL,(SceFiosFH)((int64_t)a)); +// return true; +// } + + +DWORD GetFileAttributesA(LPCSTR lpFileName) +{ + char filePath[256]; + std::string mountedPath = StorageManager.GetMountedPath(lpFileName); + if(mountedPath.length() > 0) + { + strcpy(filePath, mountedPath.c_str()); + } + else if(lpFileName[0] == '/') // already fully qualified path + strcpy(filePath, lpFileName ); + else + sprintf(filePath,"%s/%s",getUsrDirPath(), lpFileName ); // set to load from host + + // check if the file exists first + SceFiosStat statData; + if(sceFiosStatSync(NULL, filePath, &statData) != SCE_FIOS_OK) + { + app.DebugPrintf("*** sceFiosStatSync Failed\n"); + return -1; + } + if(statData.statFlags & SCE_FIOS_STATUS_DIRECTORY ) + return FILE_ATTRIBUTE_DIRECTORY; + else + return FILE_ATTRIBUTE_NORMAL; +} + + +BOOL MoveFileA(LPCSTR lpExistingFileName, LPCSTR lpNewFileName) { ORBIS_STUBBED; return false; } + + +DWORD GetLastError(VOID) { ORBIS_STUBBED; return 0; } +VOID GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer) +{ + SceLibcMallocManagedSize stat; + int err = malloc_stats(&stat); + if(err != 0) + { + app.DebugPrintf("Failed to get mem stats\n"); + } + + lpBuffer->dwTotalPhys = stat.maxSystemSize; + lpBuffer->dwAvailPhys = stat.maxSystemSize - stat.currentSystemSize; + lpBuffer->dwAvailVirtual = stat.maxSystemSize - stat.currentInuseSize; +} + +DWORD GetTickCount() +{ + // This function returns the current system time at this function is called. + // The system time is represented the time elapsed since the system starts up in microseconds. + uint64_t sysTime = sceKernelGetProcessTime(); + return (DWORD)(sysTime / 1000); +} + +// we should really use libperf for this kind of thing, but this will do for now. +BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency) +{ + // microseconds + lpFrequency->QuadPart = (1000 * 1000); + return false; +} +BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount) +{ + // microseconds + lpPerformanceCount->QuadPart = sceKernelGetProcessTime(); + return true; +} + +#ifndef _FINAL_BUILD + +VOID OutputDebugStringW(LPCWSTR lpOutputString) +{ + wprintf(lpOutputString); +} + +VOID OutputDebugStringA(LPCSTR lpOutputString) +{ + printf(lpOutputString); +} + +VOID OutputDebugString(LPCSTR lpOutputString) +{ + printf(lpOutputString); +} +#endif // _CONTENT_PACKAGE + +BOOL GetFileAttributesExA(LPCSTR lpFileName,GET_FILEEX_INFO_LEVELS fInfoLevelId,LPVOID lpFileInformation) +{ + ORBIS_STUBBED; + return false; +} +HANDLE FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData) { ORBIS_STUBBED; return 0;} +BOOL FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData) { ORBIS_STUBBED; return false;} + +errno_t _itoa_s(int _Value, char * _DstBuf, size_t _Size, int _Radix) { if(_Radix==10) sprintf(_DstBuf,"%d",_Value); else if(_Radix==16) sprintf(_DstBuf,"%lx",_Value); else return -1; return 0; } +errno_t _i64toa_s(__int64 _Val, char * _DstBuf, size_t _Size, int _Radix) { if(_Radix==10) sprintf(_DstBuf,"%lld",_Val); else return -1; return 0; } + +DWORD XGetLanguage() +{ + unsigned char ucLang = app.GetMinecraftLanguage(0); + int iLang; + + // check if we should override the system language or not + if(ucLang==MINECRAFT_LANGUAGE_DEFAULT) + { + sceSystemServiceParamGetInt(SCE_SYSTEM_SERVICE_PARAM_ID_LANG,&iLang); + } + else + { + return (DWORD)ucLang; + } + + switch(iLang) + { + case SCE_SYSTEM_PARAM_LANG_JAPANESE : return XC_LANGUAGE_JAPANESE; + case SCE_SYSTEM_PARAM_LANG_ENGLISH_US : return XC_LANGUAGE_ENGLISH; + case SCE_SYSTEM_PARAM_LANG_FRENCH : return XC_LANGUAGE_FRENCH; + + case SCE_SYSTEM_PARAM_LANG_SPANISH : return XC_LANGUAGE_SPANISH; + case SCE_SYSTEM_PARAM_LANG_SPANISH_LA : return XC_LANGUAGE_LATINAMERICANSPANISH; + + case SCE_SYSTEM_PARAM_LANG_GERMAN : return XC_LANGUAGE_GERMAN; + case SCE_SYSTEM_PARAM_LANG_ITALIAN : return XC_LANGUAGE_ITALIAN; + case SCE_SYSTEM_PARAM_LANG_PORTUGUESE_PT : return XC_LANGUAGE_PORTUGUESE; + + case SCE_SYSTEM_PARAM_LANG_RUSSIAN : return XC_LANGUAGE_RUSSIAN; + case SCE_SYSTEM_PARAM_LANG_KOREAN : return XC_LANGUAGE_KOREAN; + case SCE_SYSTEM_PARAM_LANG_CHINESE_T : return XC_LANGUAGE_TCHINESE; + case SCE_SYSTEM_PARAM_LANG_PORTUGUESE_BR : return XC_LANGUAGE_PORTUGUESE; + case SCE_SYSTEM_PARAM_LANG_ENGLISH_GB : return XC_LANGUAGE_ENGLISH; + + case SCE_SYSTEM_PARAM_LANG_DUTCH : return XC_LANGUAGE_DUTCH; + case SCE_SYSTEM_PARAM_LANG_FINNISH : return XC_LANGUAGE_FINISH; + case SCE_SYSTEM_PARAM_LANG_SWEDISH : return XC_LANGUAGE_SWEDISH; + case SCE_SYSTEM_PARAM_LANG_DANISH : return XC_LANGUAGE_DANISH; + case SCE_SYSTEM_PARAM_LANG_NORWEGIAN : return XC_LANGUAGE_BNORWEGIAN; + case SCE_SYSTEM_PARAM_LANG_POLISH : return XC_LANGUAGE_POLISH; + case SCE_SYSTEM_PARAM_LANG_TURKISH : return XC_LANGUAGE_TURKISH; + + + case SCE_SYSTEM_PARAM_LANG_CHINESE_S : return XC_LANGUAGE_SCHINESE; + + default : return XC_LANGUAGE_ENGLISH; + } + +} +DWORD XGetLocale() +{ + int iLang; + sceSystemServiceParamGetInt(SCE_SYSTEM_SERVICE_PARAM_ID_LANG,&iLang); + switch(iLang) + { + case SCE_SYSTEM_PARAM_LANG_JAPANESE : return XC_LOCALE_JAPAN; + case SCE_SYSTEM_PARAM_LANG_ENGLISH_US : return XC_LOCALE_UNITED_STATES; + case SCE_SYSTEM_PARAM_LANG_FRENCH : return XC_LOCALE_FRANCE; + + case SCE_SYSTEM_PARAM_LANG_SPANISH : return XC_LOCALE_SPAIN; + case SCE_SYSTEM_PARAM_LANG_SPANISH_LA : return XC_LOCALE_LATIN_AMERICA; + + case SCE_SYSTEM_PARAM_LANG_GERMAN : return XC_LOCALE_GERMANY; + case SCE_SYSTEM_PARAM_LANG_ITALIAN : return XC_LOCALE_ITALY; + case SCE_SYSTEM_PARAM_LANG_PORTUGUESE_PT : return XC_LOCALE_PORTUGAL; + + case SCE_SYSTEM_PARAM_LANG_RUSSIAN : return XC_LOCALE_RUSSIAN_FEDERATION; + case SCE_SYSTEM_PARAM_LANG_KOREAN : return XC_LOCALE_KOREA; + case SCE_SYSTEM_PARAM_LANG_CHINESE_T : return XC_LOCALE_CHINA; + case SCE_SYSTEM_PARAM_LANG_PORTUGUESE_BR : return XC_LOCALE_BRAZIL; + case SCE_SYSTEM_PARAM_LANG_ENGLISH_GB : return XC_LOCALE_GREAT_BRITAIN; + + case SCE_SYSTEM_PARAM_LANG_DUTCH : return XC_LOCALE_NETHERLANDS; + case SCE_SYSTEM_PARAM_LANG_FINNISH : return XC_LOCALE_FINLAND; + case SCE_SYSTEM_PARAM_LANG_SWEDISH : return XC_LOCALE_SWEDEN; + case SCE_SYSTEM_PARAM_LANG_DANISH : return XC_LOCALE_DENMARK; + case SCE_SYSTEM_PARAM_LANG_NORWEGIAN : return XC_LOCALE_NORWAY; + case SCE_SYSTEM_PARAM_LANG_POLISH : return XC_LOCALE_POLAND; + case SCE_SYSTEM_PARAM_LANG_TURKISH : return XC_LOCALE_TURKEY; + + + case SCE_SYSTEM_PARAM_LANG_CHINESE_S : return XC_LOCALE_CHINA; + default : return XC_LOCALE_UNITED_STATES; + } +} + +DWORD XEnableGuestSignin(BOOL fEnable) +{ + return 0; +}
\ No newline at end of file |
