Windows2003-3790/termsrv/newclient/core/clx.h
2020-09-30 16:53:55 +02:00

461 lines
13 KiB
C++

/**INC+**********************************************************************/
/* */
/* ClxApi.h */
/* */
/* Client extension header file */
/* */
/* Copyright(c) Microsoft 1997-1999 */
/* */
/* Notes: */
/* */
/* CLINFO_VERSION */
/* 1 Initial version */
/* 2 hwndMain added to CLINFO struct */
/* */
/****************************************************************************/
#ifndef _H_CLX_
#define _H_CLX_
extern "C" {
#include <extypes.h>
}
#include "objs.h"
#define CLINFO_VERSION 2
#define CLX_DISCONNECT_LOCAL 1
#define CLX_DISCONNECT_BY_USER 2
#define CLX_DISCONNECT_BY_SERVER 3
#define CLX_DISCONNECT_NL_ERROR 4
#define CLX_DISCONNECT_SL_ERROR 5
#define CLX_DISCONNECT_UNKNOWN 6
typedef struct _tag_CLINFO
{
DWORD cbSize; // Size of CLINFO structure (bytes)
DWORD dwVersion; // CLINFO_VERSION
//CLX expects ANSI strings here
LPSTR pszServer; // Test server name / address
LPSTR pszCmdLine; // /clxcmdline= switch data
HWND hwndMain; // Main window handle
} CLINFO, *PCLINFO;
#define VLADIMIS_NEW_CHANGE
typedef enum
{
CLX_EVENT_CONNECT, // Connect event
CLX_EVENT_DISCONNECT, // Disconnect event
CLX_EVENT_LOGON, // Logon event
CLX_EVENT_SHADOWBITMAP, // Shadow bitmap created
CLX_EVENT_SHADOWBITMAPDC, // -- " --
CLX_EVENT_PALETTE, // new color palette
} CLXEVENT;
#ifndef PVOID
typedef void * PVOID;
typedef unsigned long ULONG;
typedef char *PCHAR, *PCH, *LPSTR;
#endif
#ifndef DWORD
typedef unsigned long DWORD;
typedef char *LPSTR;
#endif
#ifndef IN
#define IN
#endif
#define CLX_INITIALIZE CE_WIDETEXT("ClxInitialize")
#define CLX_CONNECT CE_WIDETEXT("ClxConnect")
#define CLX_EVENT CE_WIDETEXT("ClxEvent")
#define CLX_DISCONNECT CE_WIDETEXT("ClxDisconnect")
#define CLX_TERMINATE CE_WIDETEXT("ClxTerminate")
#define CLX_TEXTOUT CE_WIDETEXT("ClxTextOut")
#define CLX_TEXTPOSOUT CE_WIDETEXT("ClxTextAndPosOut")
#define CLX_OFFSCROUT CE_WIDETEXT("ClxOffscrOut")
#define CLX_GLYPHOUT CE_WIDETEXT("ClxGlyphOut")
#define CLX_BITMAP CE_WIDETEXT("ClxBitmap")
#define CLX_DIALOG CE_WIDETEXT("ClxDialog")
#define CLX_PKTDRAWN CE_WIDETEXT("ClxPktDrawn")
#define CLX_REDIRECTNOTIFY CE_WIDETEXT("ClxRedirectNotify")
#define CLX_CONNECT_EX CE_WIDETEXT("ClxConnectEx")
#define CLXSERVER _T("CLXSERVER")
#define CLXDLL _T("CLXDLL")
#define CLXCMDLINE _T("CLXCMDLINE")
#ifdef ASSERT
#undef ASSERT
#endif // ASSERT
#ifdef ASSERTMSG
#undef ASSERTMSG
#endif // ASSERTMSG
#if DBG && WIN32
/////////////////////////////////////////////////////////////
extern "C" {
NTSYSAPI
VOID
NTAPI
RtlAssert(
PVOID FailedAssertion,
PVOID FileName,
ULONG LineNumber,
PCHAR Message
);
ULONG
_cdecl
DbgPrint(
PCH Format,
...
);
} //extern c
#ifdef OS_WINCE
#define KdPrint(_x_) \
NKDbgPrintfW _x_
#else // !OS_WINCE
#define KdPrint(_x_) \
DbgPrint _x_
#endif // OS_WINCE
#define ASSERT(exp) \
if (!(exp)) \
RtlAssert(#exp, __FILE__, __LINE__, NULL)
#define ASSERTMSG(msg, exp) \
if (!(exp)) \
RtlAssert(#exp, __FILE__, __LINE__, msg)
#else
#define KdPrint(_x_)
#define ASSERT(exp)
#define ASSERTMSG(msg, exp)
#endif // DBG
typedef BOOL (WINAPI * PCLX_INITIALIZE)(PCLINFO, PVOID);
typedef BOOL (WINAPI * PCLX_CONNECT)(PVOID, LPTSTR);
typedef VOID (WINAPI * PCLX_EVENT)(PVOID, CLXEVENT, LPARAM);
typedef VOID (WINAPI * PCLX_DISCONNECT)(PVOID);
typedef VOID (WINAPI * PCLX_TERMINATE)(PVOID);
typedef VOID (WINAPI * PCLX_TEXTOUT)(PVOID, PVOID, int);
typedef VOID (WINAPI * PCLX_TEXTPOSOUT)(PVOID, PVOID, int, PRECT, HANDLE);
typedef VOID (WINAPI * PCLX_OFFSCROUT)(PVOID, HANDLE, int, int);
typedef VOID (WINAPI * PCLX_GLYPHOUT)(PVOID, UINT, UINT, PVOID);
typedef VOID (WINAPI * PCLX_BITMAP)(PVOID, UINT, UINT, PVOID, UINT, PVOID);
typedef VOID (WINAPI * PCLX_DIALOG)(PVOID, HWND);
typedef VOID (WINAPI * PCLX_PKTDRAWN)(PVOID);
typedef VOID (WINAPI * PCLX_REDIRECTNOTIFY)(
RDP_SERVER_REDIRECTION_PACKET UNALIGNED *pRedirPacket,
UINT dataLen
);
typedef BOOL (WINAPI * PCLX_CONNECT_EX)(
LPTSTR szConnectAddress,
BOOL fAutoReconnecting,
BOOL fIsConnectedToCluster,
BSTR RedirectedLBInfo
);
typedef struct _tag_CLEXTENSION
{
LPTSTR pszClxServer;
LPTSTR pszClxDll;
LPTSTR pszClxCmdLine;
HINSTANCE hInstance;
PCLX_INITIALIZE pClxInitialize;
PCLX_CONNECT pClxConnect;
PCLX_EVENT pClxEvent;
PCLX_DISCONNECT pClxDisconnect;
PCLX_TERMINATE pClxTerminate;
PCLX_TEXTOUT pClxTextOut;
PCLX_TEXTPOSOUT pClxTextPosOut;
PCLX_OFFSCROUT pClxOffscrOut;
PCLX_GLYPHOUT pClxGlyphOut;
PCLX_BITMAP pClxBitmap;
PCLX_DIALOG pClxDialog;
PCLX_PKTDRAWN pClxPktDrawn;
PCLX_REDIRECTNOTIFY pClxRedirectNotify;
PCLX_CONNECT_EX pClxConnectEx;
PVOID pvClxContext;
} CLEXTENSION, *PCLEXTENSION;
class CCLX
{
public:
CCLX(CObjs* objs);
~CCLX();
public:
//
// API
//
PVOID CLX_Alloc(IN DWORD dwSize);
VOID CLX_Free(IN PVOID lpMemory);
VOID CLX_OnConnected(VOID);
VOID CLX_OnDisconnected(UINT uResult);
//
// Internal functions
//
LPTSTR CLX_SkipWhite(LPTSTR lpszCmdParam);
LPTSTR CLX_SkipNonWhite(LPTSTR lpszCmdParam);
PCLEXTENSION CLX_GetClx(VOID);
BOOL CLX_LoadProcs(VOID);
UINT CLX_GetSwitch_CLXSERVER(LPTSTR lpszCmdParam);
UINT CLX_GetSwitch_CLXCMDLINE(LPTSTR lpszCmdParam);
BOOL CLX_Init(HWND hwndMain, LPTSTR szCmdLine);
VOID CLX_Term(VOID);
BOOL CLX_ClxConnect(VOID);
VOID CLX_ClxEvent(CLXEVENT ClxEvent, LPARAM lParam);
VOID CLX_ClxDisconnect(VOID);
VOID CLX_ClxTerminate(VOID);
VOID CLX_ClxDialog(HWND hwnd);
BOOL CLX_Loaded(void);
PCLEXTENSION _pClx;
//*************************************************************
//
// CLX_ClxOffscrOut()
//
// Purpose: Notifies clx dll that an offscreen bitmap
// was drawn and specifies the position
//
// Parameters: IN [hBitmap] - handle of the bitmap that was drawn
// IN [left] - left drawing position
// IN [top] - top drawing position
//
// Return: void
//
// History: 04-15-01 CostinH Created
//
//*************************************************************
__inline VOID
CLX_ClxOffscrOut(HANDLE hBitmap,
int left,
int top)
{
if (_pClx && _pClx->pClxOffscrOut) {
_pClx->pClxOffscrOut(_pClx->pvClxContext, hBitmap, left, top);
}
}
//*************************************************************
//
// CLX_ClxTextOut()
//
// Purpose: Let the clx dll have a look-see at all
// test out orders
//
// Parameters: IN [pText] - ptr to text
// IN [textLength] - text length
// IN [hBitmap] - handle of the offscreen bitmap
// IN [left] - text position
// IN [right] - on the client screen
// IN [top] -
// IN [bottom] -
//
//
// Return: void
//
// History: 09-30-97 BrianTa Created
//
//*************************************************************
__inline VOID
CLX_ClxTextOut(PVOID pText,
int textLength,
HANDLE hBitmap,
LONG left,
LONG right,
LONG top,
LONG bottom)
{
if (_pClx) {
if (_pClx->pClxTextPosOut) {
RECT r;
r.left = left;
r.right = right;
r.top = top;
r.bottom = bottom;
_pClx->pClxTextPosOut(_pClx->pvClxContext, pText, textLength, &r, hBitmap);
}
else if (_pClx->pClxTextOut) {
_pClx->pClxTextOut(_pClx->pvClxContext, pText, textLength);
}
}
}
//*************************************************************
//
// CLX_ClxGlyphOut()
//
// Purpose: Let the clx dll have a look-see at all
// glyph out orders
//
// Parameters: IN [cxBits, cyBits] - Size of mono bitmap
// IN [pBitmap] - ptr to the bitmap data
//
// Return: void
//
// History: 5-01-98 VLADIMIS Created
//
//*************************************************************
__inline VOID
CLX_ClxGlyphOut(UINT cxBits, UINT cyBits, PVOID pBitmap)
{
if (_pClx && _pClx->pClxGlyphOut)
_pClx->pClxGlyphOut(_pClx->pvClxContext, cxBits, cyBits, pBitmap);
}
//*************************************************************
//
// CLX_ClxBitmap()
//
// Purpose: Let the clx dll have a look-see at all
// MemBlt orders
//
// Parameters: IN [cxSize, cySize] - Size of the bitmap
// IN [pBitmap] - ptr to the bitmap data
// IN [bmiSize] - size of pBmi
// IN [pBmi] - ptr to the bitmap info
//
// Return: void
//
// History: 5-01-98 VLADIMIS Created
//
//*************************************************************
__inline VOID
CLX_ClxBitmap(UINT cxSize, UINT cySize, PVOID pBitmap, UINT bmiSize, PVOID pBmi)
{
if (_pClx && _pClx->pClxBitmap)
_pClx->pClxBitmap(_pClx->pvClxContext,
cxSize, cySize,
pBitmap,
bmiSize,
pBmi);
}
//*************************************************************
//
// CLX_ClxPktDrawn()
//
// Purpose: Notifies the clx dll that a new received packet
// was drawn
//
// Return: void
//
// History: 5-14-01 COSTINH Created
//
//*************************************************************
__inline VOID
CLX_ClxPktDrawn()
{
if (_pClx && _pClx->pClxPktDrawn)
_pClx->pClxPktDrawn(_pClx->pvClxContext);
}
//
// Redirect notify - notify the CLX of the receipt of an SD
// redirection packet
//
__inline VOID
CLX_RedirectNotify(
RDP_SERVER_REDIRECTION_PACKET UNALIGNED *pRedirPacket,
UINT dataLen
)
{
if (_pClx && _pClx->pClxRedirectNotify) {
_pClx->pClxRedirectNotify(pRedirPacket, dataLen);
}
}
//
// ConnectEx - notify clx at connection time
//
// szConnectAddress - exact address we're connecting to,
// in redirect case this is redirection IP
// fAutoReconnecting - TRUE if this is an AutoReconnection
// fIsConnectedToCluster - TRUE if the connection is in response
// to a redirection request
// RedirectedLBInfo - Redirected LB info (cookie)
//
__inline VOID
CLX_ConnectEx(
LPTSTR szConnectAddress,
BOOL fAutoReconnecting,
BOOL fIsConnectedToCluster,
BSTR RedirectedLBInfo
)
{
if (_pClx && _pClx->pClxConnectEx) {
_pClx->pClxConnectEx(
szConnectAddress,
fAutoReconnecting,
fIsConnectedToCluster,
RedirectedLBInfo
);
}
}
private:
#ifdef UNICODE
CHAR _szAnsiClxServer[100];
CHAR _szAnsiClxCmdLine[MAX_PATH];
#endif
CObjs* _pClientObjects;
};
#endif // _H_CLX_