// Copyright (C) 2002-2012 Nikolaus Gebhardt // This file is part of the "Irrlicht Engine". // For conditions of distribution and use, see copyright notice in irrlicht.h #include "COSOperator.h" #ifdef _IRR_WINDOWS_API_ #ifndef _IRR_XBOX_PLATFORM_ #include #endif #else #include #include #ifndef _IRR_ANDROID_PLATFORM_ #include #ifdef _IRR_OSX_PLATFORM_ #include #endif #endif #endif #if defined(_IRR_COMPILE_WITH_X11_DEVICE_) #include "CIrrDeviceLinux.h" #endif #if defined(_IRR_COMPILE_WITH_OSX_DEVICE_) #import #endif #include "fast_atof.h" namespace irr { #if defined(_IRR_COMPILE_WITH_X11_DEVICE_) // constructor linux COSOperator::COSOperator(const core::stringc& osVersion, CIrrDeviceLinux* device) : OperatingSystem(osVersion), IrrDeviceLinux(device) { } #endif // constructor COSOperator::COSOperator(const core::stringc& osVersion) : OperatingSystem(osVersion) { #ifdef _DEBUG setDebugName("COSOperator"); #endif } //! returns the current operating system version as string. const core::stringc& COSOperator::getOperatingSystemVersion() const { return OperatingSystem; } //! copies text to the clipboard void COSOperator::copyToClipboard(const c8* text) const { if (strlen(text)==0) return; // Windows version #if defined(_IRR_XBOX_PLATFORM_) #elif defined(_IRR_WINDOWS_API_) if (!OpenClipboard(NULL) || text == 0) return; EmptyClipboard(); HGLOBAL clipbuffer; char * buffer; clipbuffer = GlobalAlloc(GMEM_DDESHARE, strlen(text)+1); if ( clipbuffer ) { buffer = (char*)GlobalLock(clipbuffer); if ( buffer ) { strcpy(buffer, text); } GlobalUnlock(clipbuffer); SetClipboardData(CF_TEXT, clipbuffer); } CloseClipboard(); #elif defined(_IRR_COMPILE_WITH_OSX_DEVICE_) NSString *str = [NSString stringWithUTF8String:text]; NSPasteboard *board = [NSPasteboard generalPasteboard]; [board declareTypes:@[NSPasteboardTypeString] owner:NSApp]; [board setString:str forType:NSPasteboardTypeString]; #elif defined(_IRR_COMPILE_WITH_X11_DEVICE_) if ( IrrDeviceLinux ) IrrDeviceLinux->copyToClipboard(text); #else #endif } //! gets text from the clipboard //! \return Returns 0 if no string is in there. const c8* COSOperator::getTextFromClipboard() const { #if defined(_IRR_XBOX_PLATFORM_) return 0; #elif defined(_IRR_WINDOWS_API_) if (!OpenClipboard(NULL)) return 0; char * buffer = 0; HANDLE hData = GetClipboardData( CF_TEXT ); buffer = (char*)GlobalLock( hData ); GlobalUnlock( hData ); CloseClipboard(); return buffer; #elif defined(_IRR_COMPILE_WITH_OSX_DEVICE_) NSString* str = nil; NSPasteboard* board = nil; const char* result = 0; board = [NSPasteboard generalPasteboard]; str = [board stringForType:NSPasteboardTypeString]; if (str != nil) result = (char*)[str UTF8String]; return (result); #elif defined(_IRR_COMPILE_WITH_X11_DEVICE_) if ( IrrDeviceLinux ) return IrrDeviceLinux->getTextFromClipboard(); return 0; #else return 0; #endif } bool COSOperator::getProcessorSpeedMHz(u32* MHz) const { if (MHz) *MHz=0; #if defined(_IRR_WINDOWS_API_) && !defined(_WIN32_WCE ) && !defined (_IRR_XBOX_PLATFORM_) LONG Error; HKEY Key; Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE, __TEXT("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0"), 0, KEY_READ, &Key); if(Error != ERROR_SUCCESS) return false; DWORD Speed = 0; DWORD Size = sizeof(Speed); Error = RegQueryValueEx(Key, __TEXT("~MHz"), NULL, NULL, (LPBYTE)&Speed, &Size); RegCloseKey(Key); if (Error != ERROR_SUCCESS) return false; else if (MHz) *MHz = Speed; return true; #elif defined(_IRR_OSX_PLATFORM_) struct clockinfo CpuClock; size_t Size = sizeof(clockinfo); if (!sysctlbyname("kern.clockrate", &CpuClock, &Size, NULL, 0)) return false; else if (MHz) *MHz = CpuClock.hz; return true; #else // read from "/proc/cpuinfo" FILE* file = fopen("/proc/cpuinfo", "r"); if (file) { char buffer[1024]; size_t r = fread(buffer, 1, 1023, file); buffer[r] = 0; buffer[1023]=0; core::stringc str(buffer); s32 pos = str.find("cpu MHz"); if (pos != -1) { pos = str.findNext(':', pos); if (pos != -1) { while ( str[++pos] == ' ' ); *MHz = core::fast_atof(str.c_str()+pos); } } fclose(file); } return (MHz && *MHz != 0); #endif } bool COSOperator::getSystemMemory(u32* Total, u32* Avail) const { #if defined(_IRR_WINDOWS_API_) && !defined (_IRR_XBOX_PLATFORM_) #if (_WIN32_WINNT >= 0x0500) MEMORYSTATUSEX MemoryStatusEx; MemoryStatusEx.dwLength = sizeof(MEMORYSTATUSEX); // cannot fail GlobalMemoryStatusEx(&MemoryStatusEx); if (Total) *Total = (u32)(MemoryStatusEx.ullTotalPhys>>10); if (Avail) *Avail = (u32)(MemoryStatusEx.ullAvailPhys>>10); return true; #else MEMORYSTATUS MemoryStatus; MemoryStatus.dwLength = sizeof(MEMORYSTATUS); // cannot fail GlobalMemoryStatus(&MemoryStatus); if (Total) *Total = (u32)(MemoryStatus.dwTotalPhys>>10); if (Avail) *Avail = (u32)(MemoryStatus.dwAvailPhys>>10); return true; #endif #elif defined(_IRR_POSIX_API_) && defined(_SC_PHYS_PAGES) && defined(_SC_AVPHYS_PAGES) long ps = sysconf(_SC_PAGESIZE); long pp = sysconf(_SC_PHYS_PAGES); long ap = sysconf(_SC_AVPHYS_PAGES); if (ps == -1 || (Total && pp == -1) || (Avail && ap == -1)) return false; if (Total) *Total = (u32)((pp>>10)*ps); if (Avail) *Avail = (u32)((ap>>10)*ps); return true; #elif defined(_IRR_OSX_PLATFORM_) int mib[2]; int64_t physical_memory; size_t length; // Get the Physical memory size mib[0] = CTL_HW; mib[1] = HW_MEMSIZE; length = sizeof(int64_t); sysctl(mib, 2, &physical_memory, &length, NULL, 0); if (Total) *Total = (u32)(physical_memory>>10); if (Avail) *Avail = (u32)(physical_memory>>10); // we don't know better return true; #else // TODO: implement for others return false; #endif } } // end namespace