]> git.lizzy.rs Git - irrlicht.git/blob - source/Irrlicht/COSOperator.cpp
25b04ad88821285830da66cfc563ab6597e61dc5
[irrlicht.git] / source / Irrlicht / COSOperator.cpp
1 // Copyright (C) 2002-2012 Nikolaus Gebhardt\r
2 // This file is part of the "Irrlicht Engine".\r
3 // For conditions of distribution and use, see copyright notice in irrlicht.h\r
4 \r
5 #include "COSOperator.h"\r
6 \r
7 #ifdef _IRR_WINDOWS_API_\r
8 #include <windows.h>\r
9 #else\r
10 #include <string.h>\r
11 #include <unistd.h>\r
12 #ifndef _IRR_ANDROID_PLATFORM_\r
13 #include <sys/types.h>\r
14 #ifdef _IRR_OSX_PLATFORM_\r
15 #include <sys/sysctl.h>\r
16 #endif\r
17 #endif\r
18 #endif\r
19 \r
20 #if defined(_IRR_COMPILE_WITH_X11_DEVICE_)\r
21 #include "CIrrDeviceLinux.h"\r
22 #endif\r
23 #if defined(_IRR_COMPILE_WITH_OSX_DEVICE_)\r
24 #import <Cocoa/Cocoa.h>\r
25 #endif\r
26 \r
27 #include "fast_atof.h"\r
28 \r
29 namespace irr\r
30 {\r
31 \r
32 #if defined(_IRR_COMPILE_WITH_X11_DEVICE_)\r
33 // constructor  linux\r
34         COSOperator::COSOperator(const core::stringc& osVersion, CIrrDeviceLinux* device)\r
35 : OperatingSystem(osVersion), IrrDeviceLinux(device)\r
36 {\r
37 }\r
38 #endif\r
39 \r
40 // constructor\r
41 COSOperator::COSOperator(const core::stringc& osVersion) : OperatingSystem(osVersion)\r
42 {\r
43         #ifdef _DEBUG\r
44         setDebugName("COSOperator");\r
45         #endif\r
46 }\r
47 \r
48 \r
49 //! returns the current operating system version as string.\r
50 const core::stringc& COSOperator::getOperatingSystemVersion() const\r
51 {\r
52         return OperatingSystem;\r
53 }\r
54 \r
55 \r
56 //! copies text to the clipboard\r
57 //! \param text: text in utf-8\r
58 void COSOperator::copyToClipboard(const c8 *text) const\r
59 {\r
60         if (strlen(text)==0)\r
61                 return;\r
62 \r
63 // Windows version\r
64 #if defined(_IRR_WINDOWS_API_)\r
65         if (!OpenClipboard(NULL) || text == 0)\r
66                 return;\r
67 \r
68         EmptyClipboard();\r
69 \r
70         core::stringw tempbuffer;\r
71         core::multibyteToWString(tempbuffer, text);\r
72         const u32 size = (tempbuffer.size() + 1) * sizeof(wchar_t);\r
73 \r
74         HGLOBAL clipbuffer;\r
75         void * buffer;\r
76 \r
77         clipbuffer = GlobalAlloc(GMEM_MOVEABLE, size);\r
78         buffer = GlobalLock(clipbuffer);\r
79 \r
80         memcpy(buffer, tempbuffer.c_str(), size);\r
81 \r
82         GlobalUnlock(clipbuffer);\r
83         SetClipboardData(CF_UNICODETEXT, clipbuffer);\r
84         CloseClipboard();\r
85 \r
86 #elif defined(_IRR_COMPILE_WITH_OSX_DEVICE_)\r
87     NSString *str = nil;\r
88     NSPasteboard *board = nil;\r
89 \r
90     if ((text != NULL) && (strlen(text) > 0))\r
91     {\r
92         str = [NSString stringWithCString:text encoding:NSUTF8StringEncoding];\r
93         board = [NSPasteboard generalPasteboard];\r
94         [board declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:NSApp];\r
95         [board setString:str forType:NSStringPboardType];\r
96     }\r
97 \r
98 #elif defined(_IRR_COMPILE_WITH_X11_DEVICE_)\r
99     if ( IrrDeviceLinux )\r
100         IrrDeviceLinux->copyToClipboard(text);\r
101 #endif\r
102 }\r
103 \r
104 \r
105 //! gets text from the clipboard\r
106 //! \return Returns 0 if no string is in there, otherwise an utf-8 string.\r
107 const c8* COSOperator::getTextFromClipboard() const\r
108 {\r
109 #if defined(_IRR_WINDOWS_API_)\r
110         if (!OpenClipboard(NULL))\r
111                 return 0;\r
112 \r
113         wchar_t * buffer = 0;\r
114 \r
115         HANDLE hData = GetClipboardData( CF_UNICODETEXT );\r
116         buffer = (wchar_t*) GlobalLock( hData );\r
117 \r
118         core::wStringToMultibyte(ClipboardBuf, buffer);\r
119 \r
120         GlobalUnlock( hData );\r
121         CloseClipboard();\r
122 \r
123         return ClipboardBuf.c_str();\r
124 \r
125 #elif defined(_IRR_COMPILE_WITH_OSX_DEVICE_)\r
126     NSString* str = nil;\r
127     NSPasteboard* board = nil;\r
128     char* result = 0;\r
129 \r
130     board = [NSPasteboard generalPasteboard];\r
131     str = [board stringForType:NSStringPboardType];\r
132 \r
133     if (str != nil)\r
134         result = (char*)[str cStringUsingEncoding:NSUTF8StringEncoding];\r
135 \r
136     return (result);\r
137 \r
138 #elif defined(_IRR_COMPILE_WITH_X11_DEVICE_)\r
139     if ( IrrDeviceLinux )\r
140         return IrrDeviceLinux->getTextFromClipboard();\r
141     return 0;\r
142 \r
143 #else\r
144 \r
145         return 0;\r
146 #endif\r
147 }\r
148 \r
149 \r
150 bool COSOperator::getSystemMemory(u32* Total, u32* Avail) const\r
151 {\r
152 #if defined(_IRR_WINDOWS_API_)\r
153 \r
154         MEMORYSTATUSEX MemoryStatusEx;\r
155         MemoryStatusEx.dwLength = sizeof(MEMORYSTATUSEX);\r
156 \r
157         // cannot fail\r
158         GlobalMemoryStatusEx(&MemoryStatusEx);\r
159 \r
160         if (Total)\r
161                 *Total = (u32)(MemoryStatusEx.ullTotalPhys>>10);\r
162         if (Avail)\r
163                 *Avail = (u32)(MemoryStatusEx.ullAvailPhys>>10);\r
164         return true;\r
165 \r
166 #elif defined(_IRR_POSIX_API_) && defined(_SC_PHYS_PAGES) && defined(_SC_AVPHYS_PAGES)\r
167         long ps = sysconf(_SC_PAGESIZE);\r
168         long pp = sysconf(_SC_PHYS_PAGES);\r
169         long ap = sysconf(_SC_AVPHYS_PAGES);\r
170 \r
171         if (ps == -1 || (Total && pp == -1) || (Avail && ap == -1))\r
172                 return false;\r
173 \r
174         if (Total)\r
175                 *Total = (u32)((pp>>10)*ps);\r
176         if (Avail)\r
177                 *Avail = (u32)((ap>>10)*ps);\r
178         return true;\r
179 #elif defined(_IRR_OSX_PLATFORM_)\r
180         int mib[2];\r
181         int64_t physical_memory;\r
182         size_t length;\r
183 \r
184         // Get the Physical memory size\r
185         mib[0] = CTL_HW;\r
186         mib[1] = HW_MEMSIZE;\r
187         length = sizeof(int64_t);\r
188         sysctl(mib, 2, &physical_memory, &length, NULL, 0);\r
189 \r
190         if (Total)\r
191                 *Total = (u32)(physical_memory>>10);\r
192         if (Avail)\r
193                 *Avail = (u32)(physical_memory>>10); // we don't know better\r
194         return true;\r
195 #else\r
196         // TODO: implement for others\r
197         return false;\r
198 #endif\r
199 }\r
200 \r
201 \r
202 } // end namespace\r
203 \r