259 lines
7.5 KiB
C++
259 lines
7.5 KiB
C++
/************************************************************************
|
|
* *
|
|
* INTEL CORPORATION PROPRIETARY INFORMATION *
|
|
* *
|
|
* This software is supplied under the terms of a license *
|
|
* agreement or non-disclosure agreement with Intel Corporation *
|
|
* and may not be copied or disclosed except in accordance *
|
|
* with the terms of that agreement. *
|
|
* *
|
|
* Copyright (C) 1997 Intel Corp. All Rights Reserved *
|
|
* *
|
|
* $Archive: S:\sturgeon\src\gki\vcs\gki.cpv $
|
|
* *
|
|
* $Revision: 1.14 $
|
|
* $Date: 28 Feb 1997 15:46:46 $
|
|
* *
|
|
* $Author: CHULME $
|
|
* *
|
|
* $Log: S:\sturgeon\src\gki\vcs\gki.cpv $
|
|
//
|
|
// Rev 1.14 28 Feb 1997 15:46:46 CHULME
|
|
// In Cleanup - check pReg still valid before waiting for 2nd thread to exit
|
|
//
|
|
// Rev 1.13 14 Feb 1997 16:45:40 CHULME
|
|
// Wait for all threads to exit prior to returning from synchronous Cleanup ca
|
|
//
|
|
// Rev 1.12 12 Feb 1997 01:12:38 CHULME
|
|
// Redid thread synchronization to use Gatekeeper.Lock
|
|
//
|
|
// Rev 1.11 11 Feb 1997 15:35:32 CHULME
|
|
// Added GKI_CleanupRequest function to offload DLL_PROCESS_DETACH
|
|
//
|
|
// Rev 1.10 05 Feb 1997 19:28:18 CHULME
|
|
// Remove deletion code from PROCESS_DETACH
|
|
//
|
|
// Rev 1.9 05 Feb 1997 16:53:10 CHULME
|
|
//
|
|
// Rev 1.8 05 Feb 1997 15:25:12 CHULME
|
|
// Don't wait for retry thread to exit
|
|
//
|
|
// Rev 1.7 05 Feb 1997 13:50:24 CHULME
|
|
// On PROCESS_DETACH - close socket and let retry thread delete pReg
|
|
//
|
|
// Rev 1.6 17 Jan 1997 09:02:00 CHULME
|
|
// Changed reg.h to gkreg.h to avoid name conflict with inc directory
|
|
//
|
|
// Rev 1.5 13 Jan 1997 17:01:18 CHULME
|
|
// Moved error debug message to error condition
|
|
//
|
|
// Rev 1.4 13 Jan 1997 16:31:20 CHULME
|
|
// Changed debug string to 512 - Description can be 256 chars
|
|
//
|
|
// Rev 1.3 13 Jan 1997 14:25:54 EHOWARDX
|
|
// Increased size of szGKDebug debug string buffer from 80 to 128 bytes.
|
|
//
|
|
// Rev 1.2 10 Jan 1997 16:14:30 CHULME
|
|
// Removed MFC dependency
|
|
//
|
|
// Rev 1.1 22 Nov 1996 14:57:10 CHULME
|
|
// Changed the default spider flags, to quit logging raw PDU and XRS
|
|
*************************************************************************/
|
|
|
|
// gki.cpp : Defines the initialization routines for the DLL.
|
|
//
|
|
#include "precomp.h"
|
|
|
|
#include <winsock.h>
|
|
#include "dgkiexp.h"
|
|
#include "dspider.h"
|
|
#include "dgkilit.h"
|
|
#include "DGKIPROT.H"
|
|
#include "GATEKPR.H"
|
|
#include "gksocket.h"
|
|
#include "GKREG.H"
|
|
#include "h225asn.h"
|
|
#include "coder.hpp"
|
|
|
|
#if (defined(_DEBUG) || defined(PCS_COMPLIANCE))
|
|
// INTEROP
|
|
#include "interop.h"
|
|
#include "rasplog.h"
|
|
LPInteropLogger RasLogger;
|
|
#endif
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
DLL_EXPORT DWORD dwGKIDLLFlags = 0xff3f;
|
|
DLL_EXPORT BOOL fGKIEcho = FALSE;
|
|
DLL_EXPORT BOOL fGKIDontSend = FALSE;
|
|
|
|
char *pEchoBuff = 0;
|
|
int nEchoLen;
|
|
CRegistration *g_pReg = NULL;
|
|
Coder *g_pCoder = NULL;
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// The one and only CGatekeeper object
|
|
|
|
CGatekeeper *g_pGatekeeper = NULL;
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// DLLMain
|
|
|
|
|
|
extern "C" HRESULT DLL_EXPORT
|
|
GKI_Initialize(void)
|
|
{
|
|
HRESULT hr = GKI_OK;
|
|
int nRet;
|
|
WSADATA wsaData;
|
|
|
|
#ifdef _DEBUG
|
|
char szGKDebug[512];
|
|
#endif
|
|
|
|
#if (defined(_DEBUG) || defined(PCS_COMPLIANCE))
|
|
//INTEROP
|
|
RasLogger = InteropLoad(RASLOG_PROTOCOL); // found in rasplog.h
|
|
#endif
|
|
|
|
nRet = WSAStartup(MAKEWORD(WSVER_MAJOR, WSVER_MINOR), &wsaData);
|
|
if (nRet != 0)
|
|
{
|
|
SpiderWSErrDecode(nRet);
|
|
hr = GKI_NOT_INITIALIZED;
|
|
goto ERROR_EXIT;
|
|
}
|
|
|
|
if ((HIBYTE(wsaData.wVersion) != WSVER_MINOR) ||
|
|
(LOBYTE(wsaData.wVersion) != WSVER_MAJOR))
|
|
{
|
|
hr = GKI_NOT_INITIALIZED;
|
|
goto WSA_CLEANUP_EXIT;
|
|
}
|
|
g_pGatekeeper = new CGatekeeper;
|
|
|
|
if(!g_pGatekeeper)
|
|
{
|
|
hr = GKI_NO_MEMORY;
|
|
goto WSA_CLEANUP_EXIT;
|
|
}
|
|
g_pCoder = new Coder;
|
|
if(!g_pCoder)
|
|
{
|
|
hr = GKI_NO_MEMORY;
|
|
goto WSA_CLEANUP_EXIT;
|
|
}
|
|
// initialize the oss library
|
|
nRet = g_pCoder->InitCoder();
|
|
if (nRet)
|
|
{
|
|
hr = GKI_NOT_INITIALIZED;
|
|
goto WSA_CLEANUP_EXIT;
|
|
}
|
|
|
|
// Get the gatekeeper information from the registry
|
|
g_pGatekeeper->Read();
|
|
|
|
return hr;
|
|
|
|
WSA_CLEANUP_EXIT:
|
|
nRet = WSACleanup();
|
|
if (nRet != 0)
|
|
{
|
|
SpiderWSErrDecode(-1);
|
|
}
|
|
|
|
// fall out to ERROR_EXIT
|
|
ERROR_EXIT:
|
|
if(g_pGatekeeper)
|
|
delete g_pGatekeeper;
|
|
|
|
if(g_pCoder)
|
|
delete g_pCoder;
|
|
|
|
g_pGatekeeper = NULL;
|
|
g_pCoder = NULL;
|
|
return hr;
|
|
}
|
|
|
|
extern "C" HRESULT DLL_EXPORT
|
|
GKI_CleanupRequest(void)
|
|
{
|
|
// ABSTRACT: This function is exported. It is called by the client application
|
|
// as a precursor to unloading the DLL. This function is responsible
|
|
// for all cleanup - This allows us to basically do nothing in the
|
|
// DllMain DLL_PROCESS_DETACH, which doesn't appear to work as intended.
|
|
// AUTHOR: Colin Hulme
|
|
|
|
int nRet;
|
|
#ifdef _DEBUG
|
|
char szGKDebug[512];
|
|
#endif
|
|
|
|
SPIDER_TRACE(SP_FUNC, "GKI_CleanupRequest()\n", 0);
|
|
SPIDER_TRACE(SP_GKI, "GKI_CleanupRequest()\n", 0);
|
|
if(g_pGatekeeper) // if initialized
|
|
{
|
|
ASSERT(g_pCoder); // g_pGatekeeper and g_pCoder come and go as a unit
|
|
|
|
g_pGatekeeper->Lock();
|
|
if (g_pReg != 0)
|
|
{
|
|
g_pReg->m_pSocket->Close(); // Close socket will terminate the other threads
|
|
|
|
g_pGatekeeper->Unlock();
|
|
WaitForSingleObject(g_pReg->GetRcvThread(), TIMEOUT_THREAD);
|
|
#ifdef BROADCAST_DISCOVERY
|
|
if (g_pReg)
|
|
WaitForSingleObject(g_pReg->GetDiscThread(), TIMEOUT_THREAD);
|
|
#endif // #ifdef BROADCAST_DISCOVERY
|
|
g_pGatekeeper->Lock();
|
|
if (g_pReg != 0)
|
|
{
|
|
SPIDER_TRACE(SP_NEWDEL, "del g_pReg = %X\n", g_pReg);
|
|
delete g_pReg;
|
|
g_pReg = 0;
|
|
}
|
|
}
|
|
|
|
#if (defined(_DEBUG) || defined(PCS_COMPLIANCE))
|
|
//INTEROP
|
|
InteropUnload((LPInteropLogger)RasLogger);
|
|
#endif
|
|
|
|
SPIDER_TRACE(SP_WSOCK, "WSACleanup()\n", 0);
|
|
nRet = WSACleanup();
|
|
if (nRet != 0)
|
|
{
|
|
SpiderWSErrDecode(-1);
|
|
}
|
|
|
|
g_pGatekeeper->Unlock();
|
|
|
|
delete g_pGatekeeper;
|
|
delete g_pCoder; // see ASSERT abovr
|
|
g_pGatekeeper = NULL;
|
|
g_pCoder = NULL;
|
|
}
|
|
|
|
// GK_TermModule();
|
|
|
|
return (GKI_OK);
|
|
}
|
|
|
|
extern "C" VOID DLL_EXPORT
|
|
GKI_SetGKAddress(PSOCKADDR_IN pAddr)
|
|
{
|
|
if (!pAddr)
|
|
{
|
|
return;
|
|
}
|
|
g_pGatekeeper->SetSockAddr(pAddr);
|
|
}
|