Handle non-ASCII output from lsb_release in wxGetLinuxDistributionInfo().
Assume that lsb_release always output UTF-8 text as this seems to be the case right now for the only (common) Linux distribution which uses anything but ASCII for its code name (Fedora 19 "Schrödinger's Cat"). Closes #15492. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74800 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -914,9 +914,14 @@ wxString wxGetUserHome( const wxString &user )
|
|||||||
// network and user id routines
|
// network and user id routines
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
// private utility function which returns output of the given command, removing
|
// Private utility function which returns output of the given command, removing
|
||||||
// the trailing newline
|
// the trailing newline.
|
||||||
static wxString wxGetCommandOutput(const wxString &cmd)
|
//
|
||||||
|
// Note that by default use Latin-1 just to ensure that we never fail, but if
|
||||||
|
// the encoding is known (e.g. UTF-8 for lsb_release), it should be explicitly
|
||||||
|
// used instead.
|
||||||
|
static wxString
|
||||||
|
wxGetCommandOutput(const wxString &cmd, wxMBConv& conv = wxConvISO8859_1)
|
||||||
{
|
{
|
||||||
// Suppress stderr from the shell to avoid outputting errors if the command
|
// Suppress stderr from the shell to avoid outputting errors if the command
|
||||||
// doesn't exist.
|
// doesn't exist.
|
||||||
@@ -937,7 +942,7 @@ static wxString wxGetCommandOutput(const wxString &cmd)
|
|||||||
if ( !fgets(buf, sizeof(buf), f) )
|
if ( !fgets(buf, sizeof(buf), f) )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
s += wxString::FromAscii(buf);
|
s += wxString(buf, conv);
|
||||||
}
|
}
|
||||||
|
|
||||||
pclose(f);
|
pclose(f);
|
||||||
@@ -1078,23 +1083,38 @@ bool wxIsPlatform64Bit()
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __LINUX__
|
#ifdef __LINUX__
|
||||||
|
|
||||||
|
static bool
|
||||||
|
wxGetValueFromLSBRelease(wxString arg, const wxString& lhs, wxString* rhs)
|
||||||
|
{
|
||||||
|
// lsb_release seems to just read a global file which is always in UTF-8
|
||||||
|
// and hence its output is always in UTF-8 as well, regardless of the
|
||||||
|
// locale currently configured by our environment.
|
||||||
|
return wxGetCommandOutput(wxS("lsb_release ") + arg, wxConvUTF8)
|
||||||
|
.StartsWith(lhs, rhs);
|
||||||
|
}
|
||||||
|
|
||||||
wxLinuxDistributionInfo wxGetLinuxDistributionInfo()
|
wxLinuxDistributionInfo wxGetLinuxDistributionInfo()
|
||||||
{
|
{
|
||||||
const wxString id = wxGetCommandOutput(wxT("lsb_release --id"));
|
|
||||||
const wxString desc = wxGetCommandOutput(wxT("lsb_release --description"));
|
|
||||||
const wxString rel = wxGetCommandOutput(wxT("lsb_release --release"));
|
|
||||||
const wxString codename = wxGetCommandOutput(wxT("lsb_release --codename"));
|
|
||||||
|
|
||||||
wxLinuxDistributionInfo ret;
|
wxLinuxDistributionInfo ret;
|
||||||
|
|
||||||
id.StartsWith("Distributor ID:\t", &ret.Id);
|
if ( !wxGetValueFromLSBRelease(wxS("--id"), wxS("Distributor ID:\t"),
|
||||||
desc.StartsWith("Description:\t", &ret.Description);
|
&ret.Id) )
|
||||||
rel.StartsWith("Release:\t", &ret.Release);
|
{
|
||||||
codename.StartsWith("Codename:\t", &ret.CodeName);
|
// Don't bother to continue, lsb_release is probably not available.
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxGetValueFromLSBRelease(wxS("--description"), wxS("Description:\t"),
|
||||||
|
&ret.Description);
|
||||||
|
wxGetValueFromLSBRelease(wxS("--release"), wxS("Release:\t"),
|
||||||
|
&ret.Release);
|
||||||
|
wxGetValueFromLSBRelease(wxS("--codename"), wxS("Codename:\t"),
|
||||||
|
&ret.CodeName);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#endif
|
#endif // __LINUX__
|
||||||
|
|
||||||
// these functions are in src/osx/utilsexc_base.cpp for wxMac
|
// these functions are in src/osx/utilsexc_base.cpp for wxMac
|
||||||
#ifndef __DARWIN__
|
#ifndef __DARWIN__
|
||||||
|
Reference in New Issue
Block a user