/*==LICENSE==* CyanWorlds.com Engine - MMOG client, server and tools Copyright (C) 2011 Cyan Worlds, Inc. This program 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. This program 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 this program. If not, see . You can contact Cyan Worlds, Inc. by email legal@cyan.com or by snail mail at: Cyan Worlds, Inc. 14617 N Newport Hwy Mead, WA 99021 *==LICENSE==*/ #include "hsUtils.h" #if HS_BUILD_FOR_MAC #include #endif #if HS_BUILD_FOR_WIN32 extern "C" { #endif #include #include #if HS_BUILD_FOR_WIN32 }; #endif #if __MWERKS__ #include #endif #if HS_BUILD_FOR_PS2 #include #include "eekernel.h" #include "sifdev.h" #endif #if HS_BUILD_FOR_WIN32 #include #include #endif #include "hsStlUtils.h" #include "hsTemplates.h" char * hsFormatStr(const char * fmt, ...) { va_list args; va_start(args,fmt); char * result = hsFormatStrV(fmt,args); va_end(args); return result; } char * hsFormatStrV(const char * fmt, va_list args) { std::string buf; xtl::formatv(buf,fmt,args); return hsStrcpy(buf.c_str()); } static char hsStrBuf[100]; char *hsScalarToStr(hsScalar s) { #if !(HS_BUILD_FOR_REFERENCE) if (s == hsIntToScalar(hsScalarToInt(s))) sprintf(hsStrBuf, "%d", hsScalarToInt(s)); else #if HS_CAN_USE_FLOAT sprintf(hsStrBuf, "%f", hsScalarToFloat(s)); #else sprintf(hsStrBuf, "%d:%lu", hsFixedToInt(s), (UInt16)s); #endif #endif return hsStrBuf; } bool hsMessageBox_SuppressPrompts = false; int hsMessageBoxWithOwner(void * owner, const char message[], const char caption[], int kind, int icon) { if (hsMessageBox_SuppressPrompts) return hsMBoxOk; #if HS_BUILD_FOR_WIN32 UInt32 flags = 0; if (kind == hsMessageBoxNormal) flags |= MB_OK; else if (kind == hsMessageBoxAbortRetyIgnore) flags |= MB_ABORTRETRYIGNORE; else if (kind == hsMessageBoxOkCancel) flags |= MB_OKCANCEL; else if (kind == hsMessageBoxRetryCancel) flags |= MB_RETRYCANCEL; else if (kind == hsMessageBoxYesNo) flags |= MB_YESNO; else if (kind == hsMessageBoxYesNoCancel) flags |= MB_YESNOCANCEL; else flags |= MB_OK; if (icon == hsMessageBoxIconError) flags |= MB_ICONERROR; else if (icon == hsMessageBoxIconQuestion) flags |= MB_ICONQUESTION; else if (icon == hsMessageBoxIconExclamation) flags |= MB_ICONEXCLAMATION; else if (icon == hsMessageBoxIconAsterisk) flags |= MB_ICONASTERISK; else flags |= MB_ICONERROR; #ifdef CLIENT ErrorMinimizeAppWindow(); #endif int ans = MessageBox((HWND)owner, message, caption, flags); switch (ans) { case IDOK: return hsMBoxOk; case IDCANCEL: return hsMBoxCancel; case IDABORT: return hsMBoxAbort; case IDRETRY: return hsMBoxRetry; case IDIGNORE: return hsMBoxIgnore; case IDYES: return hsMBoxYes; case IDNO: return hsMBoxNo; default: return hsMBoxCancel; } #endif #if HS_BUILD_FOR_MACPPC DebugStr(message); #endif #if HS_BUILD_FOR_PS2 printf("Cap:%s Message:%s\n",caption, message); #endif } int hsMessageBoxWithOwner(void * owner, const wchar_t message[], const wchar_t caption[], int kind, int icon) { if (hsMessageBox_SuppressPrompts) return hsMBoxOk; #if HS_BUILD_FOR_WIN32 UInt32 flags = 0; if (kind == hsMessageBoxNormal) flags |= MB_OK; else if (kind == hsMessageBoxAbortRetyIgnore) flags |= MB_ABORTRETRYIGNORE; else if (kind == hsMessageBoxOkCancel) flags |= MB_OKCANCEL; else if (kind == hsMessageBoxRetryCancel) flags |= MB_RETRYCANCEL; else if (kind == hsMessageBoxYesNo) flags |= MB_YESNO; else if (kind == hsMessageBoxYesNoCancel) flags |= MB_YESNOCANCEL; else flags |= MB_OK; if (icon == hsMessageBoxIconError) flags |= MB_ICONERROR; else if (icon == hsMessageBoxIconQuestion) flags |= MB_ICONQUESTION; else if (icon == hsMessageBoxIconExclamation) flags |= MB_ICONEXCLAMATION; else if (icon == hsMessageBoxIconAsterisk) flags |= MB_ICONASTERISK; else flags |= MB_ICONERROR; #ifdef CLIENT ErrorMinimizeAppWindow(); #endif int ans = MessageBoxW((HWND)owner, message, caption, flags); switch (ans) { case IDOK: return hsMBoxOk; case IDCANCEL: return hsMBoxCancel; case IDABORT: return hsMBoxAbort; case IDRETRY: return hsMBoxRetry; case IDIGNORE: return hsMBoxIgnore; case IDYES: return hsMBoxYes; case IDNO: return hsMBoxNo; default: return hsMBoxCancel; } #endif #if HS_BUILD_FOR_MACPPC DebugStr(message); #endif #if HS_BUILD_FOR_PS2 printf("Cap:%s Message:%s\n",caption, message); #endif } int hsMessageBox(const char message[], const char caption[], int kind, int icon) { #if HS_BUILD_FOR_WIN32 return hsMessageBoxWithOwner(nil/*GetActiveWindow()*/,message,caption,kind,icon); #else return hsMessageBoxWithOwner(nil,message,caption,kind,icon); #endif } int hsMessageBox(const wchar_t message[], const wchar_t caption[], int kind, int icon) { #if HS_BUILD_FOR_WIN32 return hsMessageBoxWithOwner(nil/*GetActiveWindow()*/,message,caption,kind,icon); #else return hsMessageBoxWithOwner(nil,message,caption,kind,icon); #endif } /* Generic psuedo RNG used in ANSI C. */ static unsigned long SEED = 1; int hsRand() { register int temp; SEED = SEED * 1103515245 + 12345; temp = (int)((SEED/65536)&32767); return (temp); } void hsRandSeed(int seed) { SEED = seed; } /**************************************/ int hsStrlen(const char src[]) { if (src==nil) return 0; int i = 0; while (src[i]) i++; return i; } char* hsStrcpy(char dst[], const char src[]) { if (src) { if (dst == nil) { int count = hsStrlen(src); dst = (char *)ALLOC(count + 1); memcpy(dst, src, count); dst[count] = 0; return dst; } Int32 i; for (i = 0; src[i] != 0; i++) dst[i] = src[i]; dst[i] = 0; } return dst; } hsBool hsStrEQ(const char s1[], const char s2[]) { if (s1 && s2) { while (*s1) if(*s1++ != *s2++) return false; return *s2 == 0; } return (!s1 && !s2); } hsBool hsStrCaseEQ(const char* s1, const char* s2) { if (s1 && s2) { while (*s1) if(tolower(*s1++) != tolower(*s2++)) return false; return *s2 == 0; } return (!s1 && !s2); } void hsStrcat(char dst[], const char src[]) { if (src && dst) { dst += hsStrlen(dst); while(*src) *dst++ = *src++; *dst = 0; } } void hsStrLower(char *s) { if (s) { int i; for (i = 0; i < hsStrlen(s); i++) s[i] = tolower(s[i]); } } char* hsP2CString(const UInt8 pstring[], char cstring[]) { char* cstr = cstring; const UInt8* stop = &pstring[1] + pstring[0]; pstring += 1; // skip length byte while (pstring < stop) *cstr++ = *pstring++; *cstr = 0; return cstring; } UInt8* hsC2PString(const char cstring[], UInt8 pstring[]) { int i; for (i = 1; *cstring; i++) pstring[i] = *cstring++; pstring[0] = i - 1; return pstring; } //// IStringToWString ///////////////////////////////////////////////////////// // Converts a char * string to a wchar_t * string wchar_t *hsStringToWString( const char *str ) { // convert the char string to a wchar_t string int len = strlen(str); wchar_t *wideString = TRACKED_NEW wchar_t[len+1]; for (int i=0; i c2) return 1; if (c1 == '\0') return 0; } } return !s1 ? -1 : 1; } // Compare lexigraphically two strings up to a max length int hsStrncasecmp(const char *s1, const char *s2, int n) { if (s1 && s2) { int i; char c1, c2; for (i=0; i c2) return 1; if (!c1) return 0; } return 0; } return !s1 ? -1 : 1; } #endif // // Microsoft SAMPLE CODE // returns array of allocated version info strings or nil // char** DisplaySystemVersion() { #if HS_BUILD_FOR_WIN32 #ifndef VER_SUITE_PERSONAL #define VER_SUITE_PERSONAL 0x200 #endif hsTArray versionStrs; OSVERSIONINFOEX osvi; BOOL bOsVersionInfoEx; // Try calling GetVersionEx using the OSVERSIONINFOEX structure. // // If that fails, try using the OSVERSIONINFO structure. ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) ) { // If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO. osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) return FALSE; } switch (osvi.dwPlatformId) { case VER_PLATFORM_WIN32_NT: // Test for the product. if ( osvi.dwMajorVersion <= 4 ) versionStrs.Append(hsStrcpy("Microsoft Windows NT ")); if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 ) versionStrs.Append(hsStrcpy ("Microsoft Windows 2000 ")); if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 ) versionStrs.Append(hsStrcpy ("Microsoft Windows XP ")); // Test for product type. if( bOsVersionInfoEx ) { if ( osvi.wProductType == VER_NT_WORKSTATION ) { if( osvi.wSuiteMask & VER_SUITE_PERSONAL ) versionStrs.Append(hsStrcpy ( "Personal " )); else versionStrs.Append(hsStrcpy ( "Professional " )); } else if ( osvi.wProductType == VER_NT_SERVER ) { if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) versionStrs.Append(hsStrcpy ( "DataCenter Server " )); else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) versionStrs.Append(hsStrcpy ( "Advanced Server " )); else versionStrs.Append(hsStrcpy ( "Server " )); } } else { HKEY hKey; char szProductType[80]; DWORD dwBufLen; RegOpenKeyEx( HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\ProductOptions", 0, KEY_QUERY_VALUE, &hKey ); RegQueryValueEx( hKey, "ProductType", NULL, NULL, (LPBYTE) szProductType, &dwBufLen); RegCloseKey( hKey ); if ( lstrcmpi( "WINNT", szProductType) == 0 ) versionStrs.Append(hsStrcpy( "Professional " )); if ( lstrcmpi( "LANMANNT", szProductType) == 0 ) versionStrs.Append(hsStrcpy( "Server " )); if ( lstrcmpi( "SERVERNT", szProductType) == 0 ) versionStrs.Append(hsStrcpy( "Advanced Server " )); } // Display version, service pack (if any), and build number. if ( osvi.dwMajorVersion <= 4 ) { versionStrs.Append(hsStrcpy (xtl::format("version %d.%d %s (Build %d)\n", osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF).c_str())); } else { versionStrs.Append(hsStrcpy (xtl::format("%s (Build %d)\n", osvi.szCSDVersion, osvi.dwBuildNumber & 0xFFFF).c_str())); } break; case VER_PLATFORM_WIN32_WINDOWS: if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) { versionStrs.Append(hsStrcpy ("Microsoft Windows 95 ")); if ( osvi.szCSDVersion[1] == 'C' || osvi.szCSDVersion[1] == 'B' ) versionStrs.Append(hsStrcpy("OSR2 " )); } if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10) { versionStrs.Append(hsStrcpy ("Microsoft Windows 98 ")); if ( osvi.szCSDVersion[1] == 'A' ) versionStrs.Append(hsStrcpy("SE " )); } if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90) { versionStrs.Append(hsStrcpy ("Microsoft Windows Me ")); } break; case VER_PLATFORM_WIN32s: versionStrs.Append(hsStrcpy ("Microsoft Win32s ")); break; } versionStrs.Append(nil); // terminator return versionStrs.DetachArray(); #else return nil; #endif }