2025-04-27 07:49:33 -04:00

177 lines
4.3 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1995-1996 Microsoft Corporation
Module Name :
cpecbobj.cpp
Abstract:
This module defines the functions for CcpECB Object
Author:
Murali R. Krishnan ( MuraliK ) 1-Aug-1996
Project:
Internet Application Server DLL
--*/
/************************************************************
* Include Headers
************************************************************/
#include "stdafx.h"
#include "cpecb.h"
#include "cpecbobj.h"
// # include <vipmem.h>
#include <iisext.h>
# include "dbgutil.h"
extern CRITICAL_SECTION g_csInitLock;
/************************************************************
* Functions
************************************************************/
CcpECBObject::CcpECBObject()
: m_pfnServerSupportFunc( NULL),
m_pfnReadClient ( NULL),
m_pfnWriteClient ( NULL),
m_pfnGetServerVariable( NULL),
m_fValid ( FALSE)
{
IF_DEBUG( OBJECT) {
DBGPRINTF(( DBG_CONTEXT, "creating CcpECBObject() ==>%08x\n",
this));
}
} // CcpECBObject::CcpECBObject()
CcpECBObject::~CcpECBObject()
{
IF_DEBUG( OBJECT) {
DBGPRINTF(( DBG_CONTEXT, "deleting CcpECBObject() ==>%08x\n",
this));
}
} // CcpECBObject::~CcpECBObject()
STDMETHODIMP
CcpECBObject::SetECB(
IN int cbSize,
IN unsigned char* pBuf)
{
HRESULT hr = S_OK;
if (cbSize != sizeof(EXTENSION_CONTROL_BLOCK))
return E_INVALIDARG;
if ( !m_fValid) {
//
// This is the first call for initialization. Do a good job of init.
//
EnterCriticalSection( &g_csInitLock);
if ( !m_fValid) {
EXTENSION_CONTROL_BLOCK * pecb = (EXTENSION_CONTROL_BLOCK *) pBuf;
// initialize if only no other thread has done initiatlization yet
m_pfnServerSupportFunc = pecb->ServerSupportFunction;
m_pfnReadClient = pecb->ReadClient;
m_pfnWriteClient = pecb->WriteClient;
m_pfnGetServerVariable = pecb->GetServerVariable;
m_fValid = TRUE;
}
LeaveCriticalSection( &g_csInitLock);
}
IF_DEBUG( OBJECT) {
DBGPRINTF(( DBG_CONTEXT, "%08x::SetECB(%08x) return %08x\n",
this, pBuf, hr));
}
return hr;
} // CcpECBObject::SetECB()
STDMETHODIMP CcpECBObject::GetECB(
OUT int* cbSize,
OUT unsigned char* pBuf)
{
HRESULT hr = (m_fValid) ? S_OK : E_POINTER;
if ( m_fValid ) {
// There is no ECB to fill out. just return failure for these calls
// the IcpECB object has become the Isapi Sink object (08/27/96)
hr = E_FAIL;
}
IF_DEBUG( OBJECT) {
DBGPRINTF(( DBG_CONTEXT, "%08x::GetECB(%08x) return %08x\n",
this, pBuf, hr));
}
return hr;
} // CcpECBObject::GetECB()
STDMETHODIMP
CcpECBObject::WriteClient(
IN long ConnID,
IN int cbSize,
IN unsigned char* pBuf,
IN long dwReserved)
/*++
This function forwards all the calls
to the Original ISAPI WriteClient callback (from ECB)
Arguments:
ConnID - connection ID for identifying the connection
cbSize - count of bytes to send to the client
pBuf - pointer to Buffer containing data
dwReserved - DWORD containing additional flags for transmission of data.
Returns:
HRESULT - indicating success/failure.
--*/
{
HRESULT hr = S_OK;
if ( !m_fValid || !(m_pfnWriteClient)((LPVOID) ConnID,
pBuf, (LPDWORD)&cbSize,
(DWORD ) dwReserved)
) {
hr = E_FAIL;
}
IF_DEBUG( OBJECT) {
DBGPRINTF(( DBG_CONTEXT, "%08x::WriteClient(%08x, cb=%d) => %08x\n",
this, pBuf, cbSize, hr));
}
return (hr);
} // CcpECBObject::WriteClient()
/************************ End of File ***********************/