windows-nt/Source/XPSP1/NT/inetsrv/query/qutil/querylib/cpid.cxx
2020-09-26 16:20:57 +08:00

153 lines
4.4 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997 - 1998.
//
// File: cpid.cxx
//
// Contents: codepage functions
//
// History: 97-Jun-09 t-elainc Created
//
//--------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include <gibralt.hxx>
#include <codepage.hxx>
#include <cphash.hxx>
#include <cpid.hxx>
//+---------------------------------------------------------------------------
//
// Function: GetBrowserCodepage - public
//
// Synposis: returns the ULONG value of the codepage determined by the
// query string
//
// Arguments: CWebServer & webServer, LCID locale
//
// History: 97-Jun-09 t-elainc Created
//
//----------------------------------------------------------------------------
ULONG GetBrowserCodepage( CWebServer & webServer, LCID locale )
{
ULONG cpval=0;
//first get value of CICodepage specified in the query string
CHAR acCPString[20];
//if a codepage string is specified
if ( GetCodepageValue( webServer, acCPString, sizeof(acCPString) ) )
{
WCHAR awcCPString[100];
unsigned int ccString = strlen( acCPString ) + 1;
unsigned int numconverted = MultiByteToWideChar(CP_ACP, 0, acCPString, ccString, awcCPString, 100);
//make sure everything was converted properly. Otherwise throw an exception
if (ccString != numconverted)
{
THROW ( CException () );
}
//Check to see if the string is one of the values in the code page hash table
BOOL valid = CCodePageTable::Lookup(awcCPString, wcslen(awcCPString), cpval);
//code page string is not in the hash table
if (!valid)
{
CHAR* pctmp;
cpval = strtoul(acCPString, &pctmp, 10);
//if the codepage value is not a number
if (!cpval)
{
LCID lcid = GetLCIDFromString(awcCPString);
//if the codepage value is not a legitimate lcid
if (InvalidLCID == lcid)
{
THROW ( CException (QUTIL_E_INVALID_CODEPAGE) );
}
//use the locale to determine the proper codepage
cpval = LocaleToCodepage(lcid);
}
}
}
else //no codepage string specified, use locale to determine proper codepage
{
//ciGibDebugOut((DEB_ITRACE, "No codepage specified. Using default codepage by locale."));
cpval = LocaleToCodepage(locale);
}
return cpval;
}
//+---------------------------------------------------------------------------
//
// Function: GetCodePageValue
//
// Synposis: Returns the string contained withing the Query String that
// specifies the codepage. If no string is there, returns 0.
//
// Arguments: [webServer] -- Web server
// [pcCPString] -- String containing CiCodepage returned here
// [ccCPString] -- Size (in chars) of [pcCPString]
//
// Returns: TRUE if a codepage parameter was found and fits in buffer.
//
// History: 97-Jun-11 t-elainc Created
//
//----------------------------------------------------------------------------
BOOL GetCodepageValue( CWebServer & webServer,
char * pcCPString,
unsigned ccCPString )
{
unsigned ccValue = 0xFFFFFFFF;
char* ISAPI_CI_CODEPAGE_A = "CICODEPAGE";
char const * pcStart = webServer.GetQueryString();
while ( 0 != pcStart && 0 != pcStart[0] )
{
if ( 0 == _strnicmp( pcStart,
ISAPI_CI_CODEPAGE_A,
strlen(ISAPI_CI_CODEPAGE_A) ) &&
'=' == pcStart[strlen(ISAPI_CI_CODEPAGE_A)] )
break;
pcStart = strchr( pcStart, '&' );
if ( 0 != pcStart )
pcStart++;
}
if ( 0 != pcStart && 0 != pcStart[0] )
{
pcStart += strlen(ISAPI_CI_CODEPAGE_A)+1; // sizeof includes null
char* pcEnd = strchr(pcStart, '&');
if (pcEnd)
ccValue = CiPtrToUint( pcEnd - pcStart );
else
ccValue = strlen( pcStart );
if ( ccValue < ccCPString )
{
strncpy( pcCPString, pcStart, ccValue );
pcCPString[ccValue] = 0;
}
}
return (ccValue < ccCPString);
}