windows-nt/Source/XPSP1/NT/inetsrv/query/qutil/querylib/gibralt.cxx

197 lines
6.6 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 2000.
//
// File: gibralt.cxx
//
// Contents: Abstraction of the interface to gibraltar
//
// History: 96/Jan/3 DwightKr Created
//
//----------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include <gibralt.hxx>
#include <cgiesc.hxx>
//+---------------------------------------------------------------------------
//
// Member: CWebServer::GetPhysicalPath - public
//
// Synopsis: Converts a virtual path to a physical path
//
// Arguments: [wcsVirtualPath] - virtual path to convert
// [wcsPhysicalPath] - resulting physical path
// [cwcPhysicalPath] - length of string
// [dwAccessMask] - HSE_URL_FLAGS_* required,
// or 0 for any access
//
// Returns: Flags for the virtual path (HSE_URL_FLAGS_*)
//
// History: 96/Feb/29 DwightKr Created.
//
//----------------------------------------------------------------------------
DWORD CWebServer::GetPhysicalPath(
WCHAR const * wcsVirtualPath,
WCHAR * wcsPhysicalPath,
ULONG cwcPhysicalPath,
DWORD dwAccessMask )
{
Win4Assert( 0 != wcsVirtualPath );
ULONG cwcVirtualPath = wcslen( wcsVirtualPath ) + 1;
//
// We only support paths up to MAX_PATH for now
//
if ( cwcVirtualPath >= ( MAX_PATH - 1 ) )
THROW( CException( QUTIL_E_CANT_CONVERT_VROOT ) );
CHAR pszVirtualPath[_MAX_PATH];
ULONG cbVirtualPath = _MAX_PATH;
ULONG cbConverted = ::WideCharToMultiByte( _codePage,
WC_COMPOSITECHECK,
wcsVirtualPath,
cwcVirtualPath,
(CHAR *) pszVirtualPath,
cbVirtualPath,
NULL,
NULL );
HSE_URL_MAPEX_INFO MapInfo;
DWORD cbMappedPath = sizeof pszVirtualPath;
//
// Note: if the mapped path is >= MAX_PATH the function succeeds and
// truncates the physical path without null-terminating it. But
// the mapped size is > MAX_PATH, so key off that to check for overflow.
//
if ( (0 == cbConverted) ||
( !_pEcb->ServerSupportFunction( _pEcb->ConnID,
HSE_REQ_MAP_URL_TO_PATH_EX,
pszVirtualPath,
&cbMappedPath,
(PDWORD) &MapInfo ) ) ||
( cbMappedPath >= ( _MAX_PATH - 1 ) ) ||
( ( 0 != dwAccessMask ) &&
( 0 == ( dwAccessMask & MapInfo.dwFlags ) ) )
)
{
//
// We could not translate the virtual path to a real path,
// or the access permissions didn't match, so this must be a
// bogus virtual path.
//
qutilDebugOut(( DEB_ERROR,
"Could not translate vpath=>ppath, mask 0x%x, flags 0x%x, '%ws'\n",
dwAccessMask, MapInfo.dwFlags, wcsVirtualPath ));
THROW( CException( QUTIL_E_CANT_CONVERT_VROOT ) );
}
if ( 0 == MultiByteToWideChar( _codePage,
0,
MapInfo.lpszPath,
strlen( MapInfo.lpszPath) + 1,
wcsPhysicalPath,
cwcPhysicalPath) )
{
//
// We could not translate the ASCII string to WCHAR
//
qutilDebugOut(( DEB_ERROR,
"Gibraltar could not convert ppath to unicode '%ws'\n",
wcsVirtualPath ));
THROW( CException( QUTIL_E_CANT_CONVERT_VROOT ) );
}
return MapInfo.dwFlags;
} //GetPhysicalPath
//+---------------------------------------------------------------------------
//
// Member: CWebServer::GetCGIVariable - public
//
// Synopsis: Gets the CHAR version of a CGI variable
//
// Arguments: [pszVariableName] - name of variable to lookup
// [wcsValue] - resulting variable
// [cwcValue] - length of variable
//
// History: 96/Feb/29 DwightKr Created.
//
//----------------------------------------------------------------------------
BOOL CWebServer::GetCGIVariable( CHAR const * pszVariableName,
XArray<WCHAR> & wcsValue,
ULONG & cwcValue )
{
Win4Assert ( IsValid() );
BYTE pbBuffer[512];
ULONG cbBuffer = sizeof( pbBuffer );
if ( !_pEcb->GetServerVariable( _pEcb->ConnID,
(char *) pszVariableName,
pbBuffer,
&cbBuffer ) )
{
return FALSE;
}
cwcValue = MultiByteToXArrayWideChar(
(BYTE * const) pbBuffer,
cbBuffer,
_codePage,
wcsValue );
return cwcValue > 0;
} //GetCGIVariable
//+---------------------------------------------------------------------------
//
// Member: CWebServer::GetCGIVariable - public
//
// Synopsis: Gets the WCHAR version of a CGI variable
//
// Arguments: [wcsVariableName] - name of variable to lookup
// [wcsValue] - resulting variable
// [cwcValue] - length of variable (out only)
//
// History: 96/Mar/29 DwightKr Created.
//
//----------------------------------------------------------------------------
BOOL CWebServer::GetCGIVariableW( WCHAR const * wcsVariableName,
XArray<WCHAR> & wcsValue,
ULONG & cwcBuffer )
{
ULONG cwcVariableName = wcslen( wcsVariableName ) + 1;
XArray<BYTE> pszVariableName( cwcVariableName*2 );
if ( 0 == WideCharToXArrayMultiByte( wcsVariableName,
cwcVariableName,
_codePage,
pszVariableName )
)
{
//
// We could not translate the WCHAR string to ASCII
//
return FALSE;
}
return GetCGIVariable( (const char *) pszVariableName.GetPointer(),
wcsValue,
cwcBuffer );
}