// Created: 07.07.2006 (based on wxToolkitInfo)
// RCS-ID: $Id$
// Copyright: (c) 2006 Francesco Montorsi
-// License: wxWindows license
+// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
// ============================================================================
#pragma hdrstop
#endif
+#include "wx/platinfo.h"
+
#ifndef WX_PRECOMP
+ #include "wx/app.h"
#include "wx/utils.h"
#endif //WX_PRECOMP
-#include "wx/platinfo.h"
#include "wx/apptrait.h"
+// global object
+// VERY IMPORTANT: do not use the default constructor since it would
+// try to init the wxPlatformInfo instance using
+// gs_platInfo itself!
+static wxPlatformInfo gs_platInfo(wxPORT_UNKNOWN);
+
// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------
-static wxString wxOperatingSystemIdNames[] =
+static const wxChar* const wxOperatingSystemIdNames[] =
{
- _T("Apple Mac OS"),
- _T("Apple Mac OS X"),
+ wxT("Apple Mac OS"),
+ wxT("Apple Mac OS X"),
- _T("Microsoft Windows 9X"),
- _T("Microsoft Windows NT"),
- _T("Microsoft Windows Micro"),
- _T("Microsoft Windows CE"),
+ wxT("Microsoft Windows 9X"),
+ wxT("Microsoft Windows NT"),
+ wxT("Microsoft Windows Micro"),
+ wxT("Microsoft Windows CE"),
- _T("Linux"),
- _T("FreeBSD"),
- _T("OpenBSD"),
- _T("NetBSD"),
+ wxT("Linux"),
+ wxT("FreeBSD"),
+ wxT("OpenBSD"),
+ wxT("NetBSD"),
- _T("SunOS"),
- _T("AIX"),
- _T("HPUX"),
+ wxT("SunOS"),
+ wxT("AIX"),
+ wxT("HPUX"),
- _T("DOS"),
- _T("OS/2")
+ wxT("Other Unix"),
+ wxT("Other Unix"),
+
+ wxT("DOS"),
+ wxT("OS/2"),
};
-static wxString wxPortIdNames[] =
+static const wxChar* const wxPortIdNames[] =
{
- _T("wxBase"),
- _T("wxMSW"),
- _T("wxMotif"),
- _T("wxGTK"),
- _T("wxMGL"),
- _T("wxX11"),
- _T("wxOS2"),
- _T("wxMac"),
- _T("wxCocoa"),
- _T("wxWinCE"),
- _T("wxPalmOS")
+ wxT("wxBase"),
+ wxT("wxMSW"),
+ wxT("wxMotif"),
+ wxT("wxGTK"),
+ wxT("wxDFB"),
+ wxT("wxX11"),
+ wxT("wxOS2"),
+ wxT("wxMac"),
+ wxT("wxCocoa"),
+ wxT("wxWinCE"),
};
-static wxString wxArchitectureNames[] =
+static const wxChar* const wxArchitectureNames[] =
{
- _T("32 bit"),
- _T("64 bit")
+ wxT("32 bit"),
+ wxT("64 bit")
};
-static wxString wxEndiannessNames[] =
+static const wxChar* const wxEndiannessNames[] =
{
- _T("Big endian"),
- _T("Little endian"),
- _T("PDP endian")
+ wxT("Big endian"),
+ wxT("Little endian"),
+ wxT("PDP endian")
};
// ----------------------------------------------------------------------------
// local functions
// ----------------------------------------------------------------------------
-// returns log in base 2 of the value, this maps the enum values to the
-// corresponding indices
-static int wxGetIndexFromEnumValue(int value)
+// returns the logarithm in base 2 of 'value'; this maps the enum values to the
+// corresponding indexes of the string arrays above
+static unsigned wxGetIndexFromEnumValue(int value)
{
- wxCHECK_MSG( value, -1, _T("invalid enum value") );
+ wxCHECK_MSG( value, (unsigned)-1, wxT("invalid enum value") );
int n = 0;
while ( !(value & 1) )
n++;
}
- wxASSERT_MSG( value == 1, _T("more than one bit set in enum value") );
+ wxASSERT_MSG( value == 1, wxT("more than one bit set in enum value") );
return n;
}
wxPlatformInfo::wxPlatformInfo()
{
- // autodetect all informations
- const wxAppTraits * const traits = wxTheApp ? wxTheApp->GetTraits() : NULL;
- if ( !traits )
- {
- wxFAIL_MSG( _T("failed to initialize wxPlatformInfo") );
-
- m_port = wxPORT_UNKNOWN;
- m_tkVersionMajor =
- m_tkVersionMinor = 0;
- }
- else
- {
- m_port = traits->GetToolkitVersion(&m_tkVersionMajor, &m_tkVersionMinor);
- }
-
- m_os = wxGetOsVersion(&m_osVersionMajor, &m_osVersionMinor);
- m_endian = wxIsPlatformLittleEndian() ? wxENDIAN_LITTLE : wxENDIAN_BIG;
- m_arch = wxIsPlatform64Bit() ? wxARCH_64 : wxARCH_32;
+ // just copy platform info for currently running platform
+ *this = Get();
}
wxPlatformInfo::wxPlatformInfo(wxPortId pid, int tkMajor, int tkMinor,
wxOperatingSystemId id, int osMajor, int osMinor,
wxArchitecture arch,
- wxEndianness endian)
+ wxEndianness endian,
+ bool usingUniversal)
{
m_tkVersionMajor = tkMajor;
m_tkVersionMinor = tkMinor;
m_port = pid;
+ m_usingUniversal = usingUniversal;
m_os = id;
m_osVersionMajor = osMajor;
m_osVersionMajor == t.m_osVersionMajor &&
m_osVersionMinor == t.m_osVersionMinor &&
m_os == t.m_os &&
+ m_osDesc == t.m_osDesc &&
+ m_ldi == t.m_ldi &&
+ m_desktopEnv == t.m_desktopEnv &&
m_port == t.m_port &&
+ m_usingUniversal == t.m_usingUniversal &&
m_arch == t.m_arch &&
m_endian == t.m_endian;
}
+void wxPlatformInfo::InitForCurrentPlatform()
+{
+ // autodetect all informations
+ const wxAppTraits * const traits = wxTheApp ? wxTheApp->GetTraits() : NULL;
+ if ( !traits )
+ {
+ wxFAIL_MSG( wxT("failed to initialize wxPlatformInfo") );
+
+ m_port = wxPORT_UNKNOWN;
+ m_usingUniversal = false;
+ m_tkVersionMajor =
+ m_tkVersionMinor = 0;
+ }
+ else
+ {
+ m_port = traits->GetToolkitVersion(&m_tkVersionMajor, &m_tkVersionMinor);
+ m_usingUniversal = traits->IsUsingUniversalWidgets();
+ m_desktopEnv = traits->GetDesktopEnvironment();
+ }
+
+ m_os = wxGetOsVersion(&m_osVersionMajor, &m_osVersionMinor);
+ m_osDesc = wxGetOsDescription();
+ m_endian = wxIsPlatformLittleEndian() ? wxENDIAN_LITTLE : wxENDIAN_BIG;
+ m_arch = wxIsPlatform64Bit() ? wxARCH_64 : wxARCH_32;
+
+#ifdef __LINUX__
+ m_ldi = wxGetLinuxDistributionInfo();
+#endif
+ // else: leave m_ldi empty
+}
+
+/* static */
+const wxPlatformInfo& wxPlatformInfo::Get()
+{
+ static bool initialized = false;
+ if ( !initialized )
+ {
+ gs_platInfo.InitForCurrentPlatform();
+ initialized = true;
+ }
+
+ return gs_platInfo;
+}
+
+/* static */
+wxString wxPlatformInfo::GetOperatingSystemDirectory()
+{
+ return wxGetOSDirectory();
+}
+
+
+
// ----------------------------------------------------------------------------
// wxPlatformInfo - enum -> string conversions
// ----------------------------------------------------------------------------
wxString wxPlatformInfo::GetOperatingSystemFamilyName(wxOperatingSystemId os)
{
+ const wxChar* string = wxT("Unknown");
if ( os & wxOS_MAC )
- return _T("Macintosh");
+ string = wxT("Macintosh");
else if ( os & wxOS_WINDOWS )
- return _T("Windows");
+ string = wxT("Windows");
else if ( os & wxOS_UNIX )
- return _T("Unix");
+ string = wxT("Unix");
else if ( os == wxOS_DOS )
- return _T("DOS");
+ string = wxT("DOS");
else if ( os == wxOS_OS2 )
- return _T("OS/2");
+ string = wxT("OS/2");
- return _T("Unknown");
+ return string;
}
wxString wxPlatformInfo::GetOperatingSystemIdName(wxOperatingSystemId os)
{
- const int idx = wxGetIndexFromEnumValue(os);
+ const unsigned idx = wxGetIndexFromEnumValue(os);
wxCHECK_MSG( idx < WXSIZEOF(wxOperatingSystemIdNames), wxEmptyString,
- _T("invalid OS id") );
+ wxT("invalid OS id") );
return wxOperatingSystemIdNames[idx];
}
-wxString wxPlatformInfo::GetPortIdName(wxPortId port)
+wxString wxPlatformInfo::GetPortIdName(wxPortId port, bool usingUniversal)
{
- const int idx = wxGetIndexFromEnumValue(port);
+ const unsigned idx = wxGetIndexFromEnumValue(port);
wxCHECK_MSG( idx < WXSIZEOF(wxPortIdNames), wxEmptyString,
- _T("invalid port id") );
+ wxT("invalid port id") );
wxString ret = wxPortIdNames[idx];
- if ( IsUsingUniversalWidgets() )
+ if ( usingUniversal )
ret += wxT("/wxUniversal");
return ret;
}
-wxString wxPlatformInfo::GetPortIdShortName(wxPortId port)
+wxString wxPlatformInfo::GetPortIdShortName(wxPortId port, bool usingUniversal)
{
- const int idx = wxGetIndexFromEnumValue(port);
+ const unsigned idx = wxGetIndexFromEnumValue(port);
wxCHECK_MSG( idx < WXSIZEOF(wxPortIdNames), wxEmptyString,
- _T("invalid port id") );
+ wxT("invalid port id") );
wxString ret = wxPortIdNames[idx];
ret = ret.Mid(2).Lower(); // remove 'wx' prefix
- if ( IsUsingUniversalWidgets() )
+ if ( usingUniversal )
ret += wxT("univ");
return ret;
{
for ( size_t i = 0; i < WXSIZEOF(wxOperatingSystemIdNames); i++ )
{
- if ( wxOperatingSystemIdNames[i].CmpNoCase(str) == 0 )
+ if ( wxString(wxOperatingSystemIdNames[i]).CmpNoCase(str) == 0 )
return (wxOperatingSystemId)(1 << i);
}
{
wxPortId current = (wxPortId)(1 << i);
- if ( wxPortIdNames[i].CmpNoCase(str) == 0 )
- return current;
- if ( GetPortIdShortName(current).CmpNoCase(str) == 0 )
+ if ( wxString(wxPortIdNames[i]).CmpNoCase(str) == 0 ||
+ GetPortIdShortName(current, true).CmpNoCase(str) == 0 ||
+ GetPortIdShortName(current, false).CmpNoCase(str) == 0 )
return current;
}
wxEndianness wxPlatformInfo::GetEndianness(const wxString& end)
{
- wxString endl(end.Lower());
- if ( end.StartsWith(wxT("little")) )
+ const wxString endl(end.Lower());
+ if ( endl.StartsWith(wxT("little")) )
return wxENDIAN_LITTLE;
- if ( end.StartsWith(wxT("big")) )
+ if ( endl.StartsWith(wxT("big")) )
return wxENDIAN_BIG;
return wxENDIAN_INVALID;