diff options
Diffstat (limited to 'indra/llcommon')
| -rw-r--r-- | indra/llcommon/llclickaction.h | 5 | ||||
| -rw-r--r-- | indra/llcommon/llsys.cpp | 129 | 
2 files changed, 110 insertions, 24 deletions
| diff --git a/indra/llcommon/llclickaction.h b/indra/llcommon/llclickaction.h index 8048724575..d4ffbf8634 100644 --- a/indra/llcommon/llclickaction.h +++ b/indra/llcommon/llclickaction.h @@ -33,7 +33,7 @@  #ifndef LL_LLCLICKACTION_H  #define LL_LLCLICKACTION_H - +// DO NOT CHANGE THE SEQUENCE OF THIS LIST!!  const U8 CLICK_ACTION_NONE = 0;  const U8 CLICK_ACTION_TOUCH = 0;  const U8 CLICK_ACTION_SIT = 1; @@ -42,5 +42,6 @@ const U8 CLICK_ACTION_PAY = 3;  const U8 CLICK_ACTION_OPEN = 4;  const U8 CLICK_ACTION_PLAY = 5;  const U8 CLICK_ACTION_OPEN_MEDIA = 6; - +const U8 CLICK_ACTION_ZOOM = 7; +// DO NOT CHANGE THE SEQUENCE OF THIS LIST!!  #endif diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index 3652eeba72..cba8cf85b0 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -76,6 +76,75 @@ extern int errno;  static const S32 CPUINFO_BUFFER_SIZE = 16383;  LLCPUInfo gSysCPU; +#if LL_WINDOWS +#ifndef DLLVERSIONINFO
 +typedef struct _DllVersionInfo
 +{
 +    DWORD cbSize;
 +    DWORD dwMajorVersion;
 +    DWORD dwMinorVersion;
 +    DWORD dwBuildNumber;
 +    DWORD dwPlatformID;
 +}DLLVERSIONINFO;
 +#endif
 +
 +#ifndef DLLGETVERSIONPROC
 +typedef int (FAR WINAPI *DLLGETVERSIONPROC) (DLLVERSIONINFO *);
 +#endif
 +
 +bool get_shell32_dll_version(DWORD& major, DWORD& minor, DWORD& build_number)
 +{
 +	bool result = false;
 +	const U32 BUFF_SIZE = 32767;
 +	WCHAR tempBuf[BUFF_SIZE];
 +	if(GetSystemDirectory((LPWSTR)&tempBuf, BUFF_SIZE))
 +	{
 +		
 +		std::basic_string<WCHAR> shell32_path(tempBuf);
 +
 +		// Shell32.dll contains the DLLGetVersion function. 
 +		// according to msdn its not part of the API
 +		// so you have to go in and get it.
 +		// http://msdn.microsoft.com/en-us/library/bb776404(VS.85).aspx
 +		shell32_path += TEXT("\\shell32.dll");
 +
 +		HMODULE hDllInst = LoadLibrary(shell32_path.c_str());   //load the DLL
 +		if(hDllInst) 
 +		{  // Could successfully load the DLL
 +			DLLGETVERSIONPROC pDllGetVersion;
 +			/*
 +			You must get this function explicitly because earlier versions of the DLL
 +			don't implement this function. That makes the lack of implementation of the
 +			function a version marker in itself.
 +			*/
 +			pDllGetVersion = (DLLGETVERSIONPROC) GetProcAddress(hDllInst, 
 +																"DllGetVersion");
 +
 +			if(pDllGetVersion) 
 +			{    
 +				// DLL supports version retrieval function
 +				DLLVERSIONINFO    dvi;
 +
 +				ZeroMemory(&dvi, sizeof(dvi));
 +				dvi.cbSize = sizeof(dvi);
 +				HRESULT hr = (*pDllGetVersion)(&dvi);
 +
 +				if(SUCCEEDED(hr)) 
 +				{ // Finally, the version is at our hands
 +					major = dvi.dwMajorVersion;
 +					minor = dvi.dwMinorVersion;
 +					build_number = dvi.dwBuildNumber;
 +					result = true;
 +				} 
 +			} 
 +
 +			FreeLibrary(hDllInst);  // Release DLL
 +		} 
 +	}
 +	return result;
 +}
 +#endif // LL_WINDOWS +  LLOSInfo::LLOSInfo() :  	mMajorVer(0), mMinorVer(0), mBuild(0)  { @@ -98,6 +167,11 @@ LLOSInfo::LLOSInfo() :  	mMinorVer = osvi.dwMinorVersion;  	mBuild = osvi.dwBuildNumber; +	DWORD shell32_major, shell32_minor, shell32_build; +	bool got_shell32_version = get_shell32_dll_version(shell32_major,  +													   shell32_minor,  +													   shell32_build); +  	switch(osvi.dwPlatformId)  	{  	case VER_PLATFORM_WIN32_NT: @@ -122,8 +196,22 @@ LLOSInfo::LLOSInfo() :  				 else  					 mOSStringSimple = "Microsoft Windows Server 2003 ";  			} -			else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0) +			else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion <= 1)  			{ +				if(osvi.dwMinorVersion == 0) +				{ +					mOSStringSimple = "Microsoft Windows Vista "; +				} +				else if(osvi.dwMinorVersion == 1) +				{ +					mOSStringSimple = "Microsoft Windows 7 "; +				} + +				if(osvi.wProductType != VER_NT_WORKSTATION) +				{ +					mOSStringSimple += "Server "; +				} +  				///get native system info if available..  				typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); ///function pointer for loading GetNativeSystemInfo  				SYSTEM_INFO si; //System Info object file contains architecture info @@ -141,32 +229,13 @@ LLOSInfo::LLOSInfo() :  				//of windows than this code does (in case it is needed for the future)  				if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 ) //check for 64 bit  				{ -					 if(osvi.wProductType == VER_NT_WORKSTATION) -						mOSStringSimple = "Microsoft Windows Vista 64-bit "; -					 else  -						mOSStringSimple = "Microsoft Windows Vista Server 64-bit "; +					mOSStringSimple += "64-bit ";  				}  				else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL )  				{ -					 if(osvi.wProductType == VER_NT_WORKSTATION) -						mOSStringSimple = "Microsoft Windows Vista 32-bit "; -					 else  -						mOSStringSimple = "Microsoft Windows Vista Server 32-bit "; -				} -				else // PROCESSOR_ARCHITECTURE_IA64 || PROCESSOR_ARCHITECTURE_UNKNOWN not checked -				{ -					 if(osvi.wProductType == VER_NT_WORKSTATION) -						mOSStringSimple = "Microsoft Windows Vista "; -					 else  -						mOSStringSimple = "Microsoft Windows Vista Server "; +					mOSStringSimple += "32-bit ";  				}  			} -			else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 1) -			{ -				 if(osvi.wProductType == VER_NT_WORKSTATION) -					mOSStringSimple = "Microsoft Windows 7 "; -				 else mOSStringSimple = "Microsoft Windows 7 Server "; -			}  			else   // Use the registry on early versions of Windows NT.  			{  				mOSStringSimple = "Microsoft Windows (unrecognized) "; @@ -211,6 +280,7 @@ LLOSInfo::LLOSInfo() :  								  csdversion.c_str(),  								  (osvi.dwBuildNumber & 0xffff));  			} +  			mOSString = mOSStringSimple + tmpstr;  		}  		break; @@ -240,6 +310,21 @@ LLOSInfo::LLOSInfo() :  		mOSString = mOSStringSimple;  		break;  	} + +	std::string compatibility_mode; +	if(got_shell32_version) +	{ +		if(osvi.dwMajorVersion != shell32_major  +			|| osvi.dwMinorVersion != shell32_minor) +		{ +			compatibility_mode = llformat(" compatibility mode. real ver: %d.%d (Build %d)",  +											shell32_major, +											shell32_minor, +											shell32_build); +		} +	} +	mOSString += compatibility_mode; +  #else  	struct utsname un;  	if(uname(&un) != -1) | 
