windows-nt/Source/XPSP1/NT/inetsrv/query/web/dll/wqlocale.cxx

164 lines
5.2 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//+---------------------------------------------------------------------------
//
// Copyright (C) 1996, Microsoft Corporation.
//
// File: wqlocale.cxx
//
// Contents: WEB Query locale parsers
//
// History: 96/May/2 DwightKr Created
//
//----------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
//+---------------------------------------------------------------------------
//
// Function: GetBrowserLCID - public
//
// Synposis: Determines the locale from the browser's HTTP_ACCEPT_LANGUAGE
// Note that the browser may not send a language, in which case
// we will default to the web servers default language.
//
// Arguments: [webServer] the web service which can return the environment
// variable HTTP_ACCEPT_LANGUAGE.
// [wcsHttpLanguage] - buffer to accept the language
//
// History: 20-Jan-96 DwightKr Created
// 11-Jun-97 KyleP Initialize ccHttpLanguage!
//
//----------------------------------------------------------------------------
LCID GetBrowserLCID( CWebServer & webServer, XArray<WCHAR> & wcsHttpLanguage )
{
//
// Don't look it up twice!
//
if ( webServer.IsLCIDValid() )
{
wcsHttpLanguage.Init( webServer.LocaleSize() );
RtlCopyMemory( wcsHttpLanguage.GetPointer(),
webServer.GetLocale(),
webServer.LocaleSize() * sizeof(WCHAR) );
return webServer.GetLCID();
}
//
// Try the hard way...
//
CHAR aszHttpLanguage[512];
ULONG ccHttpLanguage = sizeof(aszHttpLanguage);
if ( !webServer.GetCGIVariable( "HTTP_ACCEPT_LANGUAGE",
aszHttpLanguage,
&ccHttpLanguage) )
{
ciGibDebugOut(( DEB_ITRACE,
"GetBrowserLCID: HTTP_ACCEPT_LANGAUGE was not set in the environment; using lcid=0x%x\n",
GetSystemDefaultLCID() ));
LCID locale = GetSystemDefaultLCID();
WCHAR wcsLocale[100];
GetStringFromLCID( locale, wcsLocale );
ULONG cwcLocale = wcslen(wcsLocale) + 1;
wcsHttpLanguage.Init( cwcLocale );
RtlCopyMemory( wcsHttpLanguage.GetPointer(),
wcsLocale,
cwcLocale*sizeof(WCHAR) );
webServer.SetLCID( locale, wcsLocale, cwcLocale );
return locale;
}
//
// Use the system's ANSI code page here since we're trying to figure
// out which code page to use. The default code page is likely
// correct since all of the locale names are simple strings containing
// only characters A-Z.
//
unsigned cwcLocale = MultiByteToXArrayWideChar( (BYTE const *) aszHttpLanguage,
ccHttpLanguage,
GetACP(),
wcsHttpLanguage );
LCID lcid = GetLCIDFromString( wcsHttpLanguage.GetPointer() );
if ( InvalidLCID == lcid )
lcid = GetSystemDefaultLCID();
webServer.SetLCID( lcid,
wcsHttpLanguage.GetPointer(),
cwcLocale + 1 );
return lcid;
}
//+---------------------------------------------------------------------------
//
// Function: GetQueryLocale - public
//
// Synposis: Determines the locale in both a string and LCID form
//
// Arguments: [wcsCiLocale] - locale string from a IDQ/IDA file
// [variableSet] - set of replaceable parameters
// [outputFormat] - format for replaceable parameters
// [xLocale] - the string representation of the locale
//
// History: 02-May-96 DwightKr Created
// 11-Jun-97 KyleP Use web server from output format
//
//----------------------------------------------------------------------------
LCID GetQueryLocale( WCHAR const * wcsCiLocale,
CVariableSet & variableSet,
COutputFormat & outputFormat,
XArray<WCHAR> & xLocale )
{
ULONG cwcLocale;
WCHAR * wcsLocale = ReplaceParameters( wcsCiLocale,
variableSet,
outputFormat,
cwcLocale );
LCID locale = InvalidLCID;
//
// If a locale was specified by the IDQ file, load its numeric
// representation here.
//
if ( 0 != wcsLocale )
{
xLocale.Set( cwcLocale+1, wcsLocale );
locale = GetLCIDFromString( xLocale.GetPointer() );
if ( InvalidLCID == locale )
{
delete xLocale.Acquire();
outputFormat.LoadNumberFormatInfo( GetBrowserLCID( outputFormat, xLocale ) );
THROW( CIDQException(MSG_CI_IDQ_INVALID_LOCALE, 0) );
}
}
else
{
//
// If no locale was found in the IDQ file read the locale from
// the browser. If the browser did not specify a locale, we'll
// use the system's locale.
//
locale = GetBrowserLCID( outputFormat, xLocale );
}
return locale;
}