📄 afxisapi.h
字号:
#endif
#define ON_PARSE_COMMAND(FnName, mapClass, Args) \
{ _T(#FnName), (AFX_PISAPICMD) (mapClass##CALL)mapClass::FnName,\
Args, NULL },
#define ON_PARSE_COMMAND_PARAMS(Params) \
{ NULL, (AFX_PISAPICMD) NULL, Params, NULL },
#define DEFAULT_PARSE_COMMAND(FnName, mapClass) \
{ _T(#FnName), (AFX_PISAPICMD) (mapClass##CALL)mapClass::FnName,\
NULL, NULL },
#define END_PARSE_MAP(theClass) \
}; \
UINT PASCAL theClass::GetNumMapEntries() { \
return sizeof(theClass::_parseEntries) /\
sizeof(AFX_PARSEMAP_ENTRY); } \
///////////////////////////////////////////////////////////////////////
//
class CHttpServerContext
{
public:
CHttpServerContext(EXTENSION_CONTROL_BLOCK* pECB);
virtual ~CHttpServerContext();
// Operations
BOOL GetServerVariable(LPTSTR lpszVariableName,
LPVOID lpvBuffer, LPDWORD lpdwSize);
BOOL WriteClient(LPVOID lpvBuffer, LPDWORD lpdwBytes, DWORD dwReserved = 0);
BOOL ReadClient(LPVOID lpvBuffer, LPDWORD lpdwSize);
BOOL ServerSupportFunction(DWORD dwHSERRequest,
LPVOID lpvBuffer, LPDWORD lpdwSize, LPDWORD lpdwDataType);
BOOL TransmitFile(HANDLE hFile,
DWORD dwFlags = HSE_IO_DISCONNECT_AFTER_SEND,
LPVOID pstrHeader = NULL, DWORD dwHeaderLen = 0,
LPVOID pstrTrailer = NULL, DWORD dwTrailerLen = 0);
CHttpServerContext& operator<<(LPCTSTR psz);
CHttpServerContext& operator<<(long int dw);
CHttpServerContext& operator<<(short int w);
CHttpServerContext& operator<<(const CHtmlStream& stream);
CHttpServerContext& operator<<(double d);
CHttpServerContext& operator<<(float f);
#ifdef _AFX
CHttpServerContext& operator<<(const CLongBinary& blob);
CHttpServerContext& operator<<(const CByteArray& array);
#endif
DWORD SetChunkSize(DWORD dwNewSize);
DWORD GetChunkSize() const;
void Reset();
// Attributes
public:
BOOL m_bSendHeaders;
DWORD m_dwStatusCode;
EXTENSION_CONTROL_BLOCK* const m_pECB;
CHtmlStream* m_pStream;
DWORD m_dwEndOfHeaders;
#ifdef _DEBUG
DWORD m_dwOldEndOfHeaders;
#endif
// Implementation
DWORD m_dwBytesReceived;
DWORD m_dwChunkSize;
};
///////////////////////////////////////////////////////////////////////
// Internet Information Server Extension Support
class CHttpServer
{
public:
CHttpServer(TCHAR cDelimiter = '&');
virtual ~CHttpServer();
enum errors {
callOK = 0, // everything is fine
callParamRequired, // a required parameter was missing
callBadParamCount, // there were too many or too few parameters
callBadCommand, // the command name was not found
callNoStackSpace, // no stack space was available
callNoStream, // no CHtmlStream was available
callMissingQuote, // a parameter had a bad format
callMissingParams, // no parameters were available
callBadParam, // a paremeter had a bad format (ie, only one quote)
};
// overridables
virtual int CallFunction(CHttpServerContext* pCtxt,
LPTSTR pszQuery, LPTSTR pszCommand);
virtual BOOL OnParseError(CHttpServerContext* pCtxt, int nCause);
virtual BOOL OnWriteBody(CHttpServerContext* pCtxt, LPBYTE pbContent,
DWORD dwSize, DWORD dwReserved = 0);
// operations
virtual void EndContent(CHttpServerContext* pCtxt) const;
virtual void StartContent(CHttpServerContext* pCtxt) const;
virtual void WriteTitle(CHttpServerContext* pCtxt) const;
virtual LPCTSTR GetTitle() const;
void AddHeader(CHttpServerContext* pCtxt, LPCTSTR pszString) const;
virtual BOOL TerminateExtension(DWORD dwFlags);
virtual DWORD HttpExtensionProc(EXTENSION_CONTROL_BLOCK *pECB);
virtual BOOL GetExtensionVersion(HSE_VERSION_INFO *pVer);
virtual CHtmlStream* ConstructStream();
virtual BOOL InitInstance(CHttpServerContext* pCtxt);
// implementation
protected:
UINT PASCAL GetStackSize(const BYTE* pbParams);
int CallMemberFunc(CHttpServerContext* pCtxt,
const AFX_PARSEMAP_ENTRY* pEntry,
AFX_PARSEMAP_ENTRY* pParams, LPTSTR szParams);
LPTSTR GetQuery(CHttpServerContext* pCtxt, LPTSTR lpszQuery);
const AFX_PARSEMAP_ENTRY* LookUp(LPCTSTR szMethod,
const AFX_PARSEMAP*& pMap, AFX_PARSEMAP_ENTRY*& pParams,
AFX_PISAPICMD pCmdDefault = NULL);
int CountParams(LPCTSTR pszCommandLine, int& nCount);
int ParseDefaultParams(AFX_PARSEMAP_ENTRY* pParams,
int nParams, AFX_PARSEMAP_ENTRY_PARAMS*& pBlock,
const BYTE* pbTypes);
LPVOID PreprocessString(LPTSTR psz);
void BuildStatusCode(LPTSTR szResponse, DWORD dwCode);
#ifdef _PPC_
int PushDefaultStackArgs(BYTE* pStack,
CHttpServerContext* pCtxt, const BYTE* pbParams,
LPTSTR lpszParams, AFX_PARSEMAP_ENTRY_PARAMS* pDefParams,
int nSizeArgs);
int PushStackArgs(BYTE* pStack, CHttpServerContext* pCtxt,
const BYTE* pbParams, LPTSTR lpszParams, UINT nSizeArgs);
BYTE* StoreStackParameter(BYTE* pStack, BYTE nType,
LPTSTR pszCurParam, UINT nSizeArgs, BOOL bDoShadow);
BYTE* StoreRawStackParameter(BYTE* pStack, BYTE nType,
BYTE* pRawParam, int nSizeArgs);
#else
int PushDefaultStackArgs(BYTE* pStack,
CHttpServerContext* pCtxt, const BYTE* pbParams,
LPTSTR lpszParams, AFX_PARSEMAP_ENTRY_PARAMS* pDefParams);
int PushStackArgs(BYTE* pStack, CHttpServerContext* pCtxt,
const BYTE* pbParams, LPTSTR lpszParams);
BYTE* StoreStackParameter(BYTE* pStack, BYTE nType, LPTSTR pszParam);
BYTE* StoreRawStackParameter(BYTE* pStack, BYTE nType, BYTE* pRawParam);
#endif
LPCRITICAL_SECTION m_pCritSec;
const TCHAR m_cTokenDelimiter; // can't EVER change
DECLARE_PARSE_MAP()
};
extern "C" BOOL WINAPI GetExtensionVersion(HSE_VERSION_INFO *pVer);
extern "C" DWORD WINAPI HttpExtensionProc(EXTENSION_CONTROL_BLOCK *pECB);
struct AFX_PARSEMAP_ENTRY
{
LPTSTR pszFnName; // if default param entry, ptr to AFX_PARSEMAP_ENTRY_PARAMS
AFX_PISAPICMD pfn; // NULL if default param entry
LPCSTR pszArgs; // NULL if default function entry
LPSTR pszParamInfo; // copy of pszArgs for parsing
};
///////////////////////////////////////////////////////////////////////
// Constants to describe parameter types
#define ITS_EMPTY "\x06" // no parameters
#define ITS_I2 "\x01" // a 'short'
#define ITS_I4 "\x02" // a 'long'
#define ITS_R4 "\x03" // a 'float'
#define ITS_R8 "\x04" // a 'double'
#define ITS_PSTR "\x05" // a 'LPCTSTR'
#define ITS_RAW "\x07" // exactly as received
enum INETVARENUM
{
IT_I2 = 1,
IT_I4 = 2,
IT_R4 = 3,
IT_R8 = 4,
IT_PSTR = 5,
IT_EMPTY = 6,
IT_RAW = 7,
};
///////////////////////////////////////////////////////////////////////
// Internet Information Server Entry Points
extern "C" DWORD WINAPI HttpFilterProc(PHTTP_FILTER_CONTEXT pfc,
DWORD dwNotificationType, LPVOID pvNotification);
extern "C" BOOL WINAPI GetFilterVersion(PHTTP_FILTER_VERSION pVer);
///////////////////////////////////////////////////////////////////////
// Internet Information Server Filter Support
class CHttpFilterContext
{
public:
CHttpFilterContext(PHTTP_FILTER_CONTEXT pfc);
~CHttpFilterContext() { }
BOOL GetServerVariable(LPTSTR lpszVariableName, LPVOID lpvBuffer,
LPDWORD lpdwSize);
BOOL AddResponseHeaders(LPTSTR lpszHeaders, DWORD dwReserved = 0);
BOOL WriteClient(LPVOID lpvBuffer, LPDWORD lpdwBytes,
DWORD dwReserved = 0);
LPVOID AllocMem(DWORD cbSize, DWORD dwReserved = 0);
BOOL ServerSupportFunction(enum SF_REQ_TYPE sfReq,
LPVOID lpvBuffer, LPDWORD lpdwSize, LPDWORD lpdwDataType);
PHTTP_FILTER_CONTEXT const m_pFC;
};
///////////////////////////////////////////////////////////////////////
//
class CHttpFilter
{
public:
CHttpFilter();
~CHttpFilter();
protected:
public:
virtual DWORD HttpFilterProc(PHTTP_FILTER_CONTEXT pfc,
DWORD dwNotificationType, LPVOID pvNotification);
virtual BOOL GetFilterVersion(PHTTP_FILTER_VERSION pVer);
virtual DWORD OnReadRawData(CHttpFilterContext* pfc, PHTTP_FILTER_RAW_DATA pRawData);
virtual DWORD OnPreprocHeaders(CHttpFilterContext* pfc, PHTTP_FILTER_PREPROC_HEADERS pHeaders);
virtual DWORD OnAuthentication(CHttpFilterContext* pfc, PHTTP_FILTER_AUTHENT pAuthent);
virtual DWORD OnUrlMap(CHttpFilterContext* pfc, PHTTP_FILTER_URL_MAP pUrlMap);
virtual DWORD OnSendRawData(CHttpFilterContext* pfc, PHTTP_FILTER_RAW_DATA pRawData);
virtual DWORD OnLog(CHttpFilterContext* pfc, PHTTP_FILTER_LOG pLog);
virtual DWORD OnEndOfNetSession(CHttpFilterContext* pfc);
virtual DWORD OnEndOfRequest(CHttpFilterContext* pfc);
};
/////////////////////////////////////////////////////////////////////////////
// Alternate debugging suppot
#include <crtdbg.h>
#ifdef _AFX
#define ISAPIASSERT(expr) ASSERT(expr)
#define ISAPITRACE TRACE
#define ISAPITRACE0(str) TRACE0(str)
#define ISAPITRACE1(str, arg1) TRACE1(str, arg1)
#define ISAPITRACE2(str, arg1, arg2) TRACE2(str, arg1, arg2)
#define ISAPITRACE3(str, arg1, arg2, arg3) TRACE3(str, arg1, arg2, arg3)
#ifdef _DEBUG
#define ISAPIVERIFY(f) ASSERT(f)
#else
#define ISAPIVERIFY(f) ((void)(f))
#endif // _DEBUG
#else // !_AFX
#define ISAPIASSERT(expr) _ASSERTE(expr)
#define ISAPITRACE0(str) _RPT0(_CRT_WARN, str)
#define ISAPITRACE1(str, arg1) _RPT1(_CRT_WARN, str, arg1)
#define ISAPITRACE2(str, arg1, arg2) _RPT2(_CRT_WARN, str, arg1, arg2)
#define ISAPITRACE3(str, arg1, arg2, arg3) _RPT3(_CRT_WARN, arg1, arg2, arg3)
#ifdef _DEBUG
void AFXISAPI_CDECL AfxISAPITrace(LPCTSTR lpszFormat, ...);
#define ISAPIVERIFY(expr) _ASSERTE(expr)
#define ISAPITRACE AfxISAPITrace
#else
AFX_INLINE void AfxISAPITrace(LPCTSTR, ...) { }
#define ISAPIVERIFY(expr) ((void)(expr))
#define ISAPITRACE AfxISAPITrace
#endif // _DEBUG
#endif // _AFX
/////////////////////////////////////////////////////////////////////////////
// Inline function declarations
#ifdef _AFX_ENABLE_INLINES
#define _AFXISAPI_INLINE AFX_INLINE
#include <afxisapi.inl>
#endif
#undef AFX_DATA
#define AFX_DATA
#ifdef _AFX_MINREBUILD
#pragma component(minrebuild, on)
#endif
#ifndef _AFX_FULLTYPEINFO
#pragma component(mintypeinfo, off)
#endif
#endif // the whole file
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -