diff options
Diffstat (limited to 'indra/llcommon')
| -rwxr-xr-x | indra/llcommon/llsd.cpp | 5 | ||||
| -rwxr-xr-x | indra/llcommon/llsd.h | 6 | ||||
| -rwxr-xr-x | indra/llcommon/llsys.cpp | 45 | 
3 files changed, 48 insertions, 8 deletions
| diff --git a/indra/llcommon/llsd.cpp b/indra/llcommon/llsd.cpp index 8276ec836a..f962485284 100755 --- a/indra/llcommon/llsd.cpp +++ b/indra/llcommon/llsd.cpp @@ -506,6 +506,8 @@ namespace  		LLSD::array_iterator beginArray() { return mData.begin(); }  		LLSD::array_iterator endArray() { return mData.end(); } +		LLSD::reverse_array_iterator rbeginArray() { return mData.rbegin(); } +		LLSD::reverse_array_iterator rendArray() { return mData.rend(); }  		virtual LLSD::array_const_iterator beginArray() const { return mData.begin(); }  		virtual LLSD::array_const_iterator endArray() const { return mData.end(); } @@ -947,6 +949,9 @@ LLSD::array_iterator		LLSD::endArray()		{ return makeArray(impl).endArray(); }  LLSD::array_const_iterator	LLSD::beginArray() const{ return safe(impl).beginArray(); }  LLSD::array_const_iterator	LLSD::endArray() const	{ return safe(impl).endArray(); } +LLSD::reverse_array_iterator	LLSD::rbeginArray()		{ return makeArray(impl).rbeginArray(); } +LLSD::reverse_array_iterator	LLSD::rendArray()		{ return makeArray(impl).rendArray(); } +  namespace llsd  { diff --git a/indra/llcommon/llsd.h b/indra/llcommon/llsd.h index 5eb69059ac..a3792c1f9d 100755 --- a/indra/llcommon/llsd.h +++ b/indra/llcommon/llsd.h @@ -320,11 +320,15 @@ public:  		typedef std::vector<LLSD>::iterator			array_iterator;  		typedef std::vector<LLSD>::const_iterator	array_const_iterator; -		 +		typedef std::vector<LLSD>::reverse_iterator reverse_array_iterator; +  		array_iterator			beginArray();  		array_iterator			endArray();  		array_const_iterator	beginArray() const;  		array_const_iterator	endArray() const; + +		reverse_array_iterator	rbeginArray(); +		reverse_array_iterator	rendArray();  	//@}  	/** @name Type Testing */ diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index 7267ba333e..3aa3445958 100755 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -113,6 +113,9 @@ static const F32 MEM_INFO_THROTTLE = 20;  static const F32 MEM_INFO_WINDOW = 10*60;  #if LL_WINDOWS +// We cannot trust GetVersionEx function on Win8.1 , we should check this value when creating OS string +static const U32 WINNT_WINBLUE = 0x0603; +  #ifndef DLLVERSIONINFO  typedef struct _DllVersionInfo  { @@ -213,6 +216,26 @@ static bool regex_search_no_exc(const S& string, M& match, const R& regex)      }  } +#if LL_WINDOWS +// GetVersionEx should not works correct with Windows 8.1 and the later version. We need to check this case  +static bool	check_for_version(WORD wMajorVersion, WORD wMinorVersion, WORD wServicePackMajor) +{ +    OSVERSIONINFOEXW osvi = { sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0 }; +    DWORDLONG        const dwlConditionMask = VerSetConditionMask( +        VerSetConditionMask( +        VerSetConditionMask( +            0, VER_MAJORVERSION, VER_GREATER_EQUAL), +               VER_MINORVERSION, VER_GREATER_EQUAL), +               VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL); + +    osvi.dwMajorVersion = wMajorVersion; +    osvi.dwMinorVersion = wMinorVersion; +    osvi.wServicePackMajor = wServicePackMajor; + +    return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, dwlConditionMask) != FALSE; +} +#endif +  LLOSInfo::LLOSInfo() :  	mMajorVer(0), mMinorVer(0), mBuild(0), mOSVersionString("")	  @@ -221,6 +244,7 @@ LLOSInfo::LLOSInfo() :  #if LL_WINDOWS  	OSVERSIONINFOEX osvi;  	BOOL bOsVersionInfoEx; +	BOOL bShouldUseShellVersion = false;  	// Try calling GetVersionEx using the OSVERSIONINFOEX structure.  	ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); @@ -283,10 +307,18 @@ LLOSInfo::LLOSInfo() :  				}  				else if(osvi.dwMinorVersion == 2)  				{ -					if(osvi.wProductType == VER_NT_WORKSTATION) -						mOSStringSimple = "Microsoft Windows 8 "; +					if (check_for_version(HIBYTE(WINNT_WINBLUE), LOBYTE(WINNT_WINBLUE), 0)) +					{ +						mOSStringSimple = "Microsoft Windows 8.1 "; +						bShouldUseShellVersion = true; // GetVersionEx failed, going to use shell version +					}  					else -						mOSStringSimple = "Windows Server 2012 "; +					{ +						if(osvi.wProductType == VER_NT_WORKSTATION) +							mOSStringSimple = "Microsoft Windows 8 "; +						else +							mOSStringSimple = "Windows Server 2012 "; +					}  				}  				///get native system info if available.. @@ -353,9 +385,8 @@ LLOSInfo::LLOSInfo() :  			}  			else  			{ -				tmpstr = llformat("%s (Build %d)", -								  csdversion.c_str(), -								  (osvi.dwBuildNumber & 0xffff)); +				tmpstr = !bShouldUseShellVersion ?  llformat("%s (Build %d)", csdversion.c_str(), (osvi.dwBuildNumber & 0xffff)): +					llformat("%s (Build %d)", csdversion.c_str(), shell32_build);  			}  			mOSString = mOSStringSimple + tmpstr; @@ -391,7 +422,7 @@ LLOSInfo::LLOSInfo() :  	std::string compatibility_mode;  	if(got_shell32_version)  	{ -		if(osvi.dwMajorVersion != shell32_major || osvi.dwMinorVersion != shell32_minor) +		if((osvi.dwMajorVersion != shell32_major || osvi.dwMinorVersion != shell32_minor) && !bShouldUseShellVersion)  		{  			compatibility_mode = llformat(" compatibility mode. real ver: %d.%d (Build %d)",   											shell32_major, | 
