mirror of
https://github.com/minetest/irrlicht.git
synced 2024-11-11 21:00:35 +01:00
296824e8b6
Before the value was checked, but not put into the return variables. Header update to show that information in kb not bytes (on all systems, was just documented wrong) Some cleanup of code. git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6369 dfc29bdd-3216-0410-991c-e03cc46cb475
280 lines
6.3 KiB
C++
280 lines
6.3 KiB
C++
// 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 <windows.h>
|
|
#endif
|
|
#else
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <sys/types.h>
|
|
#ifdef _IRR_OSX_PLATFORM_
|
|
#include <sys/sysctl.h>
|
|
#endif
|
|
#endif
|
|
|
|
#if defined(_IRR_COMPILE_WITH_X11_DEVICE_)
|
|
#include "CIrrDeviceLinux.h"
|
|
#endif
|
|
#if defined(_IRR_COMPILE_WITH_OSX_DEVICE_)
|
|
#import <Cocoa/Cocoa.h>
|
|
#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 = nil;
|
|
NSPasteboard *board = nil;
|
|
|
|
if ((text != NULL) && (strlen(text) > 0))
|
|
{
|
|
str = [NSString stringWithCString:text encoding:NSWindowsCP1252StringEncoding];
|
|
board = [NSPasteboard generalPasteboard];
|
|
[board declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:NSApp];
|
|
[board setString:str forType:NSStringPboardType];
|
|
}
|
|
|
|
#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;
|
|
char* result = 0;
|
|
|
|
board = [NSPasteboard generalPasteboard];
|
|
str = [board stringForType:NSStringPboardType];
|
|
|
|
if (str != nil)
|
|
result = (char*)[str cStringUsingEncoding:NSWindowsCP1252StringEncoding];
|
|
|
|
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
|
|
|