|
|
/**MOD+**********************************************************************/ /* Module: Clxapi.cpp */ /* */ /* Purpose: Clx API functions */ /* */ /* Copyright(C) Microsoft Corporation 1997-1999 */ /* */ /****************************************************************************/
#include <adcg.h>
extern "C" { #define TRC_GROUP TRC_GROUP_CORE
#define TRC_FILE "clxapi"
#include <atrcapi.h>
#include <tchar.h>
#include <windowsx.h>
}
#include "autil.h"
#include "clx.h"
#include "nl.h"
#include "sl.h"
CCLX::CCLX(CObjs* objs) { _pClientObjects = objs; _pClx = NULL; }
CCLX::~CCLX() { }
//*************************************************************
//
// CLX_Alloc()
//
// Purpose: Allocates memory
//
// Parameters: IN [dwSize] - Size to allocate
//
// Return: Ptr to memory block - if successful
// NULL - if unsuccessful
//
// History: 09-30-97 BrianTa Created
//
//*************************************************************
PVOID CCLX::CLX_Alloc(IN DWORD dwSize) { #ifndef OS_WINCE
return (GlobalAllocPtr(GMEM_MOVEABLE, dwSize)); #else // OS_WINCE
return LocalAlloc(LMEM_FIXED, dwSize); #endif
}
//*************************************************************
//
// CLX_Free()
//
// Purpose: Frees previously alloc'ed memory
//
// Parameters: IN [lpMemory] - Ptr to memory to free
//
// Return: void
//
// History: 09-30-97 BrianTa Created
//
//*************************************************************
VOID CCLX::CLX_Free(IN PVOID lpMemory) { #ifndef OS_WINCE
GlobalFreePtr(lpMemory); #else
LocalFree(lpMemory); #endif
}
//*************************************************************
//
// CLX_SkipWhite()
//
// Purpose: Skips whitespace characters
//
// Parameters: IN [lpszCmdParam] - Ptr to string
//
// Return: Ptr string past whitespace
//
// History: 09-30-97 BrianTa Created
//
//*************************************************************
LPTSTR CCLX::CLX_SkipWhite(IN LPTSTR lpszCmdParam) { while (*lpszCmdParam) { if (*lpszCmdParam != ' ') break;
lpszCmdParam++; }
return (lpszCmdParam); }
//*************************************************************
//
// CLX_GetClx()
//
// Purpose: Returns PER INSTANCE pClx pointer
//
// Parameters: void
//
// Return: Ptr to per instance pClx - If successfull
// NULL - if not
//
// History: 09-30-97 BrianTa Created
//
//*************************************************************
PCLEXTENSION CCLX::CLX_GetClx(VOID) { if (_pClx == NULL) { _pClx = (PCLEXTENSION) CLX_Alloc(sizeof(CLEXTENSION));
if (_pClx) memset(_pClx, 0, sizeof(CLEXTENSION)); }
return (_pClx); }
//*************************************************************
//
// CLX_LoadProcs()
//
// Purpose: Loads proc addresses from clxdll
//
// Parameters: void
//
// Return: TRUE - if successfull
// FALSE - if not
//
// History: 09-30-97 BrianTa Created
//
//*************************************************************
BOOL CCLX::CLX_LoadProcs(void) { DC_BEGIN_FN("CLX_LoadProcs"); _pClx->pClxInitialize = (PCLX_INITIALIZE) GetProcAddress(_pClx->hInstance, CLX_INITIALIZE);
if (!_pClx->pClxInitialize) { TRC_ERR((TB,_T("CLX_Init() Could not find pClxInitialize entry point\n"))); }
_pClx->pClxConnect = (PCLX_CONNECT) GetProcAddress(_pClx->hInstance, CLX_CONNECT);
if (!_pClx->pClxConnect) { TRC_ERR((TB,_T("CLX_Init() Could not find pClxConnect entry point\n"))); }
_pClx->pClxEvent = (PCLX_EVENT) GetProcAddress(_pClx->hInstance, CLX_EVENT);
if (!_pClx->pClxEvent) { TRC_ERR((TB,_T("CLX_Init() Could not find pClxEvent entry point\n"))); }
_pClx->pClxDisconnect = (PCLX_DISCONNECT) GetProcAddress(_pClx->hInstance, CLX_DISCONNECT);
if (!_pClx->pClxDisconnect) { TRC_ERR((TB,_T("CLX_Init() Could not find pClxDisconnect entry point\n"))); }
_pClx->pClxTerminate = (PCLX_TERMINATE) GetProcAddress(_pClx->hInstance, CLX_TERMINATE);
if (!_pClx->pClxTerminate) { TRC_ERR((TB,_T("CLX_Init() Could not find pClxTerminate entry point\n"))); }
_pClx->pClxTextOut = (PCLX_TEXTOUT) GetProcAddress(_pClx->hInstance, CLX_TEXTOUT);
if (!_pClx->pClxTextOut) { TRC_ERR((TB,_T("CLX_Init() Could not find pClxTextOut entry point\n"))); }
_pClx->pClxTextPosOut = (PCLX_TEXTPOSOUT) GetProcAddress(_pClx->hInstance, CLX_TEXTPOSOUT);
if (!_pClx->pClxTextPosOut) { TRC_ERR((TB,_T("CLX_Init() Could not find pClxTextPosOut entry point\n"))); }
_pClx->pClxOffscrOut = (PCLX_OFFSCROUT) GetProcAddress(_pClx->hInstance, CLX_OFFSCROUT);
if (!_pClx->pClxOffscrOut) { TRC_ERR((TB,_T("CLX_Init() Could not find pClxOffscrOut entry point\n"))); }
_pClx->pClxGlyphOut = (PCLX_GLYPHOUT) GetProcAddress(_pClx->hInstance, CLX_GLYPHOUT);
if (!_pClx->pClxGlyphOut) { TRC_ERR((TB,_T("CLX_Init() Could not find pClxGlyphOut entry point\n"))); }
_pClx->pClxBitmap = (PCLX_BITMAP) GetProcAddress(_pClx->hInstance, CLX_BITMAP);
if (!_pClx->pClxGlyphOut) { TRC_ERR((TB,_T("CLX_Init() Could not find pClxBitmap entry point\n"))); }
_pClx->pClxDialog = (PCLX_DIALOG) GetProcAddress(_pClx->hInstance, CLX_DIALOG);
if (!_pClx->pClxDialog) { TRC_ERR((TB,_T("CLX_Init() Could not find pClxDialog entry point\n"))); }
_pClx->pClxPktDrawn = (PCLX_PKTDRAWN) GetProcAddress(_pClx->hInstance, CLX_PKTDRAWN);
if (!_pClx->pClxPktDrawn) { TRC_ERR((TB,_T("CLX_Init() Could not find pClxPktDrawn entry point\n"))); }
_pClx->pClxRedirectNotify = (PCLX_REDIRECTNOTIFY) GetProcAddress(_pClx->hInstance, CLX_REDIRECTNOTIFY);
if (!_pClx->pClxRedirectNotify) { TRC_ERR((TB,_T("CLX_Init() Could not find pClxRedirectNotify entry point\n"))); }
_pClx->pClxConnectEx = (PCLX_CONNECT_EX) GetProcAddress(_pClx->hInstance, CLX_CONNECT_EX);
if (!_pClx->pClxConnectEx) { TRC_ERR((TB,_T("CLX_Init() Could not find pClxConnectEx entry point\n"))); }
DC_END_FN(); return (_pClx->pClxInitialize && _pClx->pClxTerminate); }
//*************************************************************
//
// CLX_ClxLoaded()
//
// Purpose: Returns clx load status
//
// Parameters: void
//
// Return: TRUE - if loaded
// FALSE - if not
//
// History: 09-30-97 BrianTa Created
//
//*************************************************************
BOOL CCLX::CLX_Loaded(void) { return (_pClx ? TRUE : FALSE); }
//*************************************************************
//
// CLX_Init()
//
// Purpose: Loads / initializes the clx dll
//
// Parameters: IN [hwndMain] - Main client window handle
//
// Return: TRUE - if successfull
// FALSE - if not
//
// History: 09-30-97 BrianTa Created
//
//*************************************************************
#define CLX_DLL_NAME _T("clxtshar.dll")
BOOL CCLX::CLX_Init(HWND hwndMain, LPTSTR szCmdLine) { DC_BEGIN_FN("CLX_Init"); BOOL fLoaded; CLINFO clinfo; HINSTANCE hInstance; LPTSTR pszClxDll;
fLoaded = FALSE; hInstance = NULL;
_pClientObjects->AddObjReference(CLX_OBJECT_FLAG);
if(!szCmdLine || _T('\0') == szCmdLine[0]) { TRC_ALT((TB,_T("CLX_Init() NO CLX CMD Line Specified. Not loading CLX - %s\n"), CLX_DLL_NAME)); return FALSE; }
_pClx = CLX_GetClx();
if (_pClx) { TRC_NRM((TB,_T("CLX_Init() attempting to load (%s)\n"), CLX_DLL_NAME));
hInstance = LoadLibrary(CLX_DLL_NAME);
if (hInstance) { _pClx->hInstance = hInstance;
if (CLX_LoadProcs()) { clinfo.cbSize = sizeof(clinfo); clinfo.dwVersion = CLINFO_VERSION;
#ifdef UNICODE
if(_pClx->pszClxServer) { if (!WideCharToMultiByte(CP_ACP, 0, _pClx->pszClxServer, -1, _szAnsiClxServer, sizeof(_szAnsiClxServer), NULL, NULL)) { //Conv failed
TRC_ERR((TB, _T("Failed to convert pszClxServer to ANSI: 0x%x"), GetLastError())); return FALSE; } clinfo.pszServer = _szAnsiClxServer; } else { clinfo.pszServer = NULL; }
if(szCmdLine) { if (!WideCharToMultiByte(CP_ACP, 0, szCmdLine, -1, _szAnsiClxCmdLine, sizeof(_szAnsiClxCmdLine), NULL, NULL)) { //Conv failed
TRC_ERR((TB, _T("Failed to convert CLX szCmdLine to ANSI: 0x%x"), GetLastError())); return FALSE; } clinfo.pszCmdLine = _szAnsiClxCmdLine; } else { clinfo.pszCmdLine = NULL; } #else
//Data is already ANSI
clinfo.pszServer = _pClx->pszClxServer; clinfo.pszCmdLine = szCmdLine; #endif
clinfo.hwndMain = hwndMain; fLoaded = _pClx->pClxInitialize(&clinfo, &_pClx->pvClxContext);
TRC_NRM((TB,_T("CLX_Init() pClxInitialize() returned - %d\n"), fLoaded)); } } else { TRC_NRM((TB,_T("CLX_Init() Error %d loading (%s)\n"), GetLastError(), CLX_DLL_NAME)); }
// If we were able to load the ClxDll and successfull perform its
// base initialization, then tell it to go ahead and connect to the
// test server
if (fLoaded) fLoaded = CLX_ClxConnect();
if (!fLoaded) { if (hInstance) FreeLibrary(hInstance);
if (_pClx->pszClxDll) CLX_Free(_pClx->pszClxDll);
if (_pClx->pszClxServer) CLX_Free(_pClx->pszClxServer);
CLX_Free(_pClx);
_pClx = NULL; } }
DC_END_FN(); return (_pClx != NULL); }
//*************************************************************
//
// CLX_Term()
//
// Purpose: Sub-manager termination processing
//
// Parameters: void
//
// Return: void
//
// History: 09-30-97 BrianTa Created
//
//*************************************************************
VOID CCLX::CLX_Term(VOID) { if (_pClx) { CLX_ClxDisconnect(); CLX_ClxTerminate();
if (_pClx->hInstance) FreeLibrary(_pClx->hInstance);
if (_pClx->pszClxDll) CLX_Free(_pClx->pszClxDll);
if (_pClx->pszClxServer) CLX_Free(_pClx->pszClxServer);
CLX_Free(_pClx);
_pClx = NULL; } _pClientObjects->ReleaseObjReference(CLX_OBJECT_FLAG); }
//*************************************************************
//
// CLX_OnConnected()
//
// Purpose: OnConnected processing for the clx dll
//
// Parameters: void
//
// Return: void
//
// History: 09-30-97 BrianTa Created
//
//*************************************************************
VOID CCLX::CLX_OnConnected(VOID) { CLX_ClxEvent(CLX_EVENT_CONNECT, 0); }
//*************************************************************
//
// CLX_OnDisconnected()
//
// Purpose: OnDisconnected processing for the clx dll
//
// Parameters: IN [uDisconnect] -- Disconnection code
//
// Return: void
//
// History: 09-30-97 BrianTa Created
//
//*************************************************************
VOID CCLX::CLX_OnDisconnected(IN UINT uDisconnect) { UINT uResult;
switch (NL_GET_MAIN_REASON_CODE(uDisconnect)) { case NL_DISCONNECT_LOCAL: uResult = CLX_DISCONNECT_LOCAL; break;
case NL_DISCONNECT_REMOTE_BY_USER: uResult = CLX_DISCONNECT_BY_USER; break;
case NL_DISCONNECT_REMOTE_BY_SERVER: uResult = CLX_DISCONNECT_BY_SERVER; break;
case NL_DISCONNECT_ERROR: uResult = CLX_DISCONNECT_NL_ERROR; break;
case SL_DISCONNECT_ERROR: uResult = CLX_DISCONNECT_SL_ERROR; break;
default: uResult = CLX_DISCONNECT_UNKNOWN; break; }
CLX_ClxEvent(CLX_EVENT_DISCONNECT, uResult); }
//*************************************************************
//
// CLX_ClxConnect()
//
// Purpose: Connect processing for the clx dll
//
// Parameters: void
//
// Return: void
//
// History: 09-30-97 BrianTa Created
//
//*************************************************************
BOOL CCLX::CLX_ClxConnect(VOID) { BOOL fConnect;
fConnect = TRUE;
if (_pClx && _pClx->pClxConnect) fConnect = _pClx->pClxConnect(_pClx->pvClxContext, _pClx->pszClxServer);
return (fConnect); }
//*************************************************************
//
// CLX_ClxEvent()
//
// Purpose: Event processing for the clx dll
//
// Parameters: IN [ClxEvent] - Event type
// IN [ulParam] - Event specific param
//
// Return: void
//
// History: 09-30-97 BrianTa Created
//
//*************************************************************
VOID CCLX::CLX_ClxEvent(IN CLXEVENT ClxEvent, IN LPARAM ulParam) { if (_pClx && _pClx->pClxEvent) _pClx->pClxEvent(_pClx->pvClxContext, ClxEvent, ulParam); }
//*************************************************************
//
// CLX_Disconnect()
//
// Purpose: Disconnect processing for the clx dll
//
// Parameters: void
//
// Return: void
//
// History: 09-30-97 BrianTa Created
//
//*************************************************************
VOID CCLX::CLX_ClxDisconnect(VOID) { if (_pClx && _pClx->pClxDisconnect) _pClx->pClxDisconnect(_pClx->pvClxContext); }
//*************************************************************
//
// CLX_ClxTerminate()
//
// Purpose: Termination processing for the clx dll
//
// Parameters: void
//
// Return: void
//
// History: 09-30-97 BrianTa Created
//
//*************************************************************
VOID CCLX::CLX_ClxTerminate(VOID) { if (_pClx && _pClx->pClxTerminate) _pClx->pClxTerminate(_pClx->pvClxContext); }
//*************************************************************
//
// CLX_ClxDialog()
//
// Purpose: Let the clx dll know of the launched dialog
//
// Parameters: IN [hwnd] - Dialog hwnd
//
// Return: void
//
// History: 09-30-97 BrianTa Created
//
//*************************************************************
VOID CCLX::CLX_ClxDialog(HWND hwnd) { if (_pClx && _pClx->pClxDialog) _pClx->pClxDialog(_pClx->pvClxContext, hwnd); }
|