windows-nt/Source/XPSP1/NT/inetsrv/iis/iisrearc/iisplus/ulw3/w3handler.cxx
2020-09-26 16:20:57 +08:00

158 lines
3.3 KiB
C++

/*++
Copyright (c) 1999 Microsoft Corporation
Module Name :
w3handler.cxx
Abstract:
Common functionality of all handlers
Author:
Bilal Alam (balam) Sept-29-2000
Environment:
Win32 - User Mode
Project:
ULW3.DLL
--*/
#include "precomp.hxx"
CONTEXT_STATUS
W3_HANDLER::MainDoWork(
VOID
)
/*++
Routine Description:
Checks access and then calls handler routine
Return Value:
CONTEXT_STATUS_PENDING if async pending,
else CONTEXT_STATUS_CONTINUE
--*/
{
CONTEXT_STATUS contextStatus;
BOOL fAccessAllowed = FALSE;
W3_CONTEXT *pW3Context = QueryW3Context();
DBG_ASSERT( pW3Context != NULL );
//
// Check access
//
contextStatus = pW3Context->CheckAccess( FALSE, // not a completion
NO_ERROR,
&fAccessAllowed );
if ( contextStatus == CONTEXT_STATUS_PENDING )
{
return CONTEXT_STATUS_PENDING;
}
//
// Access check must be complete if we're here
//
DBG_ASSERT( pW3Context->QueryAccessChecked() );
if ( !fAccessAllowed )
{
//
// CheckAccess already sent error
//
return CONTEXT_STATUS_CONTINUE;
}
//
// Now we can execute the handler
//
return DoWork();
}
CONTEXT_STATUS
W3_HANDLER::MainOnCompletion(
DWORD cbCompletion,
DWORD dwCompletionStatus
)
/*++
Routine Description:
Continue access check if needed, then then when finished, call into
the handler start
If handler is already started, funnel the completion to the handler
Arguments:
cbCompletion - Bytes of completion
dwCompletionStatus - Status of completion
Return Value:
CONTEXT_STATUS_PENDING if async pending,
else CONTEXT_STATUS_CONTINUE
--*/
{
W3_CONTEXT * pW3Context;
CONTEXT_STATUS contextStatus;
BOOL fAccessAllowed = FALSE;
pW3Context = QueryW3Context();
DBG_ASSERT( pW3Context != NULL );
if ( !pW3Context->QueryAccessChecked() )
{
//
// If access hasn't been checked completely yet, then we should resume
// it
//
contextStatus = pW3Context->CheckAccess( TRUE, // completion
dwCompletionStatus,
&fAccessAllowed );
if ( contextStatus == CONTEXT_STATUS_PENDING )
{
return CONTEXT_STATUS_PENDING;
}
DBG_ASSERT( pW3Context->QueryAccessChecked() );
if ( !fAccessAllowed )
{
//
// CheckAccess already sent error
//
return CONTEXT_STATUS_CONTINUE;
}
//
// Now we can execute the original handler
//
return DoWork();
}
else
{
//
// Access checks have already been made. This must be a completion
// for the handler itself
//
return OnCompletion( cbCompletion,
dwCompletionStatus );
}
}