windows-nt/Source/XPSP1/NT/enduser/troubleshoot/tshoot/localecb.cpp
2020-09-26 16:20:57 +08:00

221 lines
6.2 KiB
C++

//
// MODULE: LocalECB.H
//
// PURPOSE: Implementation of CLocalECB class, which implements CAbstractECB by emulating Win32's
// EXTENSION_CONTROL_BLOCK.
//
// PROJECT: Generic Troubleshooter DLL for Microsoft AnswerPoint - Local TS only
//
// COMPANY: Saltmine Creative, Inc. (206)-284-7511 support@saltmine.com
//
// AUTHOR: Joe Mabel
//
// ORIGINAL DATE: 01-07-99
//
// NOTES:
//
// Version Date By Comments
//--------------------------------------------------------------------
// V3.1 01-07-99 JM Original
//
#include "stdafx.h"
#include "LocalECB.h"
#include "RenderConnector.h"
#include "locale.h"
// >>> Warning: Possible redefinition
// should use #include "apgtscls.h"
// Oleg 01.12.99
#define CONT_TYPE_STR "application/x-www-form-urlencoded"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CLocalECB::CLocalECB(const VARIANT& name, const VARIANT& value, int count,
HANDLE hEvent, CString* pstrWriteClient,
CRenderConnector* pRenderConnector,
bool bSetLocale, CString& strLocaleSetting)
: CTSNameValueMgr(name, value, count),
m_dwHttpStatusCode(500),
m_hEvent(hEvent),
m_strWriteClient(*pstrWriteClient),
m_pRenderConnector(pRenderConnector),
m_bSetLocale( bSetLocale ),
m_strLocaleSetting( strLocaleSetting )
{
}
CLocalECB::CLocalECB(const CArrNameValue& arr, HANDLE hEvent,
CString* pstrWriteClient, CRenderConnector* pRenderConnector,
bool bSetLocale, CString& strLocaleSetting)
: CTSNameValueMgr(arr),
m_dwHttpStatusCode(500),
m_hEvent(hEvent),
m_strWriteClient(*pstrWriteClient),
m_pRenderConnector(pRenderConnector),
m_bSetLocale( bSetLocale ),
m_strLocaleSetting( strLocaleSetting )
{
}
CLocalECB::CLocalECB(CString* pstrWriteClient)
: CTSNameValueMgr(),
m_dwHttpStatusCode(500),
m_hEvent(NULL),
m_strWriteClient(*pstrWriteClient),
m_pRenderConnector(NULL),
m_bSetLocale( false )
{
}
CLocalECB::~CLocalECB()
{
}
// ConnID is irrelevant on Local TS, so we always return 0.
HCONN CLocalECB::GetConnID() const
{
return 0;
}
DWORD CLocalECB::SetHttpStatusCode(DWORD dwHttpStatusCode)
{
m_dwHttpStatusCode = dwHttpStatusCode;
return m_dwHttpStatusCode;
}
// We act as if Method is always "POST"
LPSTR CLocalECB::GetMethod() const
{
return "POST";
}
// Since we are always emulating "POST", there is no query string
LPSTR CLocalECB::GetQueryString() const
{
return "";
}
DWORD CLocalECB::GetBytesAvailable() const
{
return CTSNameValueMgr::GetData().GetLength();
}
LPBYTE CLocalECB::GetData() const
{
return (LPBYTE)(LPCTSTR)CTSNameValueMgr::GetData();
}
// always say it's valid content ("application/x-www-form-urlencoded")
LPSTR CLocalECB::GetContentType() const
{
return CONT_TYPE_STR;
}
// In Local TS, always return a null string.
BOOL CLocalECB::GetServerVariable
( /*HCONN hConn,*/
LPCSTR lpszVariableName,
LPVOID lpvBuffer,
LPDWORD lpdwSize )
{
if (CString(_T("SERVER_NAME")) == CString(lpszVariableName))
{
memset(lpvBuffer, 0, *lpdwSize);
_tcsncpy((LPTSTR)lpvBuffer, _T("Local TS - no IP address"), *lpdwSize-2); // -2 in case og unicode
return TRUE;
}
return FALSE;
}
BOOL CLocalECB::WriteClient
( /*HCONN ConnID,*/
LPCSTR Buffer, // EXTENSION_CONTROL_BLOCK::WriteClient uses LPVOID, but it should
// only be legit to pass SBCS text, so we're enforcing that.
// Also, we're adding const-ness. Clearly, this really is const,
// but EXTENSION_CONTROL_BLOCK::WriteClient fails to declare it so.
LPDWORD lpdwBytes
/* , DWORD dwReserved */
)
{
if (*lpdwBytes <= 0)
{
if (m_pRenderConnector)
m_pRenderConnector->Render(_T(""));
else
m_strWriteClient = _T("");
if (m_hEvent)
::SetEvent(m_hEvent);
return FALSE;
}
TCHAR* buf = new TCHAR[*lpdwBytes+1];
//[BC-03022001] - added check for NULL ptr to satisfy MS code analysis tool.
if(!buf)
return FALSE;
memcpy(buf, Buffer, *lpdwBytes);
buf[*lpdwBytes] = 0;
// Set the locale if requested.
CString strOrigLocale;
if (m_bSetLocale)
strOrigLocale= _tsetlocale( LC_CTYPE, m_strLocaleSetting );
if (m_pRenderConnector)
{
m_pRenderConnector->Render(buf);
m_pRenderConnector->SetLocked(false);
}
else
m_strWriteClient = buf;
// Restore the locale if requested.
if (m_bSetLocale)
strOrigLocale= _tsetlocale( LC_CTYPE, strOrigLocale );
if (m_hEvent)
::SetEvent(m_hEvent);
delete [] buf;
return TRUE;
}
// The 2 imaginably germane values of dwHSERRequest are:
// HSE_REQ_SEND_RESPONSE_HEADER:Sends a complete HTTP server response header, including the
// status, server version, message time, and MIME version. The ISAPI extension should
// append other HTTP headers such as the content type and content length, followed by
// an extra \r\n. This option allows the function to take only text, up to the first
// \0 terminator. The function with this parameter should only be called once per request.
// HSE_REQ_DONE_WITH_SESSION: Specifies that if the server extension holds on to the session
// because of extended processing requirements, the server must be notified when the
// session is finished so the server can close it and free its related structures.
// The parameters lpdwSize, and lpdwDataType are ignored.
// The lpvBuffer parameter may optionally point to a DWORD that contains HSE_STATUS codes.
// IIS recognizes HSE_STATUS_SUCCESS_WITH_KEEP_CONN for keeping the IIS connection alive
// if the client also requests to keep the connection alive.
// This parameter must be sent to the server if the HSE_IO_DISCONNECT_AFTER_SEND parameter
// has been included in the HSE_TF_INFO structure as part of a HSE_REQ_TRANSMIT_FILE request.
// This parameter will explicitly close the connection.
// >>> Have no idea how to emulate server's behavior in case of local troubleshooter.
// Oleg 01.13.99
BOOL CLocalECB::ServerSupportFunction
( /*HCONN hConn,*/
DWORD dwHSERRequest,
LPVOID lpvBuffer,
LPDWORD lpdwSize,
LPDWORD lpdwDataType )
{
return FALSE;
}
const CString& CLocalECB::GetWriteClient() const
{
return m_strWriteClient;
}