Added OS version for windows and distro-version for linux (not fully tested).
This commit is contained in:
parent
cb40f68229
commit
1c7a9229f2
@ -23,15 +23,26 @@
|
||||
#include "graphics/irr_driver.hpp"
|
||||
#include "online/http_request.hpp"
|
||||
#include "utils/random_generator.hpp"
|
||||
#include "utils/string_utils.hpp"
|
||||
|
||||
#ifdef __APPLE__
|
||||
# include <sys/sysctl.h>
|
||||
#endif
|
||||
|
||||
#include <fstream>
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
|
||||
namespace HardwareStats
|
||||
{
|
||||
|
||||
namespace Private
|
||||
{
|
||||
/** Stores the OS version, e.g. "Windows 7", or "Fedora 21". */
|
||||
static std::string m_os_version;
|
||||
} // namespace Private
|
||||
using namespace Private;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
/** Returns the amount of RAM in MB.
|
||||
@ -102,6 +113,105 @@ int getNumProcessors()
|
||||
return 0;
|
||||
} // getNumProcessors
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
/** Tries opening and parsing the specified release file in /etc to find
|
||||
* information about the distro used.
|
||||
* \param filename Full path of the file to open.
|
||||
* \return True if file could be read and valid information was paresed,
|
||||
* false otherwise.
|
||||
*/
|
||||
bool readEtcReleaseFile(const std::string &filename)
|
||||
{
|
||||
std::ifstream in(filename);
|
||||
std::string s, distro, version;
|
||||
int bits = 0;
|
||||
while( (distro.empty() || version.empty()) &&
|
||||
std::getline(in, s) )
|
||||
{
|
||||
std::vector<std::string> l = StringUtils::split(s, '=');
|
||||
if(l.size()==0) continue;
|
||||
if (l[0]=="NAME" ) distro = l[1];
|
||||
else if(l[0]=="VERSION_ID") version = l[1];
|
||||
}
|
||||
if(!distro.empty() && !version.empty())
|
||||
{
|
||||
m_os_version = distro + " " + version;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
} // readEtcReleaseFile
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
/** Identify more details about the OS, e.g. on linux which distro
|
||||
* and which verison; on windows the version number.
|
||||
* \param json Json data structure to store the os info in.
|
||||
*/
|
||||
void determineOSVersion()
|
||||
{
|
||||
std::string version, distro;
|
||||
|
||||
#ifdef __linux__
|
||||
// First try the standard /etc/os-release. Then check for older versions
|
||||
// e.g. /etc/fedora-release, /etc/SuSE-release, /etc/redhat-release
|
||||
if(readEtcReleaseFile("/etc/os-release")) return;
|
||||
|
||||
std::set<std::string> file_list;
|
||||
file_manager->listFiles(file_list, "./", true);
|
||||
for(std::set<std::string>::iterator i = file_list.begin();
|
||||
i != file_list.end(); i++)
|
||||
{
|
||||
// Only try reading /etc/*-release files
|
||||
if(StringUtils::hasSuffix(*i, "-release"))
|
||||
if (readEtcReleaseFile(*i)) return;
|
||||
}
|
||||
#endif
|
||||
#ifdef WIN32
|
||||
// (C) 2014 by Wildfire Games (0 A.D.), ported by Joerg Henrichs.
|
||||
|
||||
HKEY hKey;
|
||||
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
|
||||
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0,
|
||||
KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS)
|
||||
{
|
||||
m_os_version = "windows-unknown";
|
||||
return;
|
||||
}
|
||||
char windows_version_string[20];
|
||||
DWORD size = sizeof(windows_version_string);
|
||||
RegQueryValueEx(hKey, "CurrentVersion", 0, 0, (LPBYTE)windows_version_string, &size);
|
||||
unsigned major = 0, minor = 0;
|
||||
const int ret = sscanf_s(windows_version_string, "%u.%u", &major, &minor);
|
||||
int windows_version = (major << 8) | minor;
|
||||
RegCloseKey(hKey);
|
||||
|
||||
switch(windows_version)
|
||||
{
|
||||
case 0x0500: m_os_version="Windows 2000"; break;
|
||||
case 0x0501: m_os_version="Windows XP"; break;
|
||||
case 0x0502: m_os_version="Windows XP64"; break;
|
||||
case 0x0600: m_os_version="Windows Vista"; break;
|
||||
case 0x0601: m_os_version="Windows 7"; break;
|
||||
case 0x0602: m_os_version="Windows 8"; break;
|
||||
default: {
|
||||
m_os_version = StringUtils::insertValues("Windows %d",
|
||||
windows_version);
|
||||
break;
|
||||
}
|
||||
} // switch
|
||||
|
||||
#endif
|
||||
} // determineOSVersion
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
/** Returns the OS version, e.g.: "Windows 7", or "Fedora 21".
|
||||
*/
|
||||
const std::string& getOSVersion()
|
||||
{
|
||||
if(m_os_version.empty())
|
||||
determineOSVersion();
|
||||
return m_os_version;
|
||||
} // getOSVersion
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
/** If the configuration of this installation has not been reported for the
|
||||
* current version, collect the hardware statistics and send it to STK's
|
||||
@ -144,6 +254,8 @@ void reportHardwareStats()
|
||||
json.add("build_debug", 1);
|
||||
#endif
|
||||
|
||||
json.add("os_version", getOSVersion());
|
||||
|
||||
unsigned int ogl_version = irr_driver->getGLSLVersion();
|
||||
unsigned int major = ogl_version/100;
|
||||
unsigned int minor = ogl_version - 100*major;
|
||||
@ -195,7 +307,7 @@ void reportHardwareStats()
|
||||
int m_version;
|
||||
public:
|
||||
HWReportRequest(int version) : Online::HTTPRequest(/*manage memory*/true, 1)
|
||||
,m_version(version)
|
||||
, m_version(version)
|
||||
{}
|
||||
// --------------------------------------------------------------------
|
||||
/** Callback after the request has been executed.
|
||||
|
@ -25,11 +25,14 @@
|
||||
|
||||
#include "utils/no_copy.hpp"
|
||||
#include "utils/string_utils.hpp"
|
||||
|
||||
namespace HardwareStats
|
||||
{
|
||||
/** A class to manage json data. */
|
||||
class Json : public NoCopy
|
||||
{
|
||||
private:
|
||||
/** The accumulated json data. */
|
||||
std::string m_data;
|
||||
public:
|
||||
/** Constructor. */
|
||||
@ -78,6 +81,7 @@ namespace HardwareStats
|
||||
|
||||
// ========================================================================
|
||||
void reportHardwareStats();
|
||||
const std::string& getOSVersion();
|
||||
}; // HardwareStats
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user