164 lines
5.2 KiB
C++
164 lines
5.2 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// 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;
|
||
|
}
|
||
|
|
||
|
|
||
|
|