197 lines
6.6 KiB
C++
197 lines
6.6 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// 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 );
|
|
}
|
|
|
|
|
|
|