windows-nt/Source/XPSP1/NT/com/mobile/syncmgr/exe/connobj.cpp
2020-09-26 16:20:57 +08:00

1350 lines
34 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: connobj.cpp
//
// Contents: ConnectionObject Implementation
//
// Classes: CCConnectObj
//
// Notes: Purpose is to globally keep track of Connections
// for a SyncMgr instance. and Open and Close Connections
// abstracted from LAN or RAS.
//
// History: 10-Feb-98 rogerg Created.
//
//--------------------------------------------------------------------------
#include "precomp.h"
extern HINSTANCE g_hInst; // current instance
CConnectionObj *g_pConnectionObj = NULL; // global pointer to ConnectionObject.
//+---------------------------------------------------------------------------
//
// Member: InitConnectionObjects, public
//
// Synopsis: Must be called to initialize the ConnectionObjects
// before any other functions are called.
//
// Arguments:
//
// Returns:
//
// Modifies:
//
// History: 05-Feb-98 rogerg Created.
//
//----------------------------------------------------------------------------
HRESULT InitConnectionObjects()
{
g_pConnectionObj = new CConnectionObj;
return g_pConnectionObj ? NOERROR : S_FALSE;
}
//+---------------------------------------------------------------------------
//
// Member: ReleaseConnectionObjects, public
//
// Synopsis: Called to Release the Connection Objects
//
// Arguments:
//
// Returns:
//
// Modifies:
//
// History: 05-Feb-98 rogerg Created.
//
//----------------------------------------------------------------------------
HRESULT ReleaseConnectionObjects()
{
if (g_pConnectionObj)
{
delete g_pConnectionObj;
g_pConnectionObj = NULL;
}
return NOERROR;
}
//+---------------------------------------------------------------------------
//
// Member: CConnectionObj::CConnectionObj, public
//
// Synopsis: Constructor
//
// Arguments:
//
// Returns:
//
// Modifies:
//
// History: 05-Feb-98 rogerg Created.
//
//----------------------------------------------------------------------------
CConnectionObj::CConnectionObj()
: m_pFirstConnectionObj(NULL),
m_fAutoDialConn(FALSE),
m_fForcedOnline(FALSE)
{
}
//+---------------------------------------------------------------------------
//
// Function: CConnectionObj::FindConnectionObj, public
//
// Synopsis: Sees if there is an existing Connection object for this
// Item and if there is incremements the refcount. If one
// isn't found and fCreate is true a new one is allocated
// and added to the list.
//
// Arguments: [pszConnectionName] - Name of the Connection.
// [fCreate] - Create a New Connection if one doesn't already exist
/// [pConnectionOb] - OutParam pointer to newly created connectionObj
//
// Returns: Appropriate status code
//
// Modifies:
//
// History: 05-Nov-97 rogerg Created.
//
//----------------------------------------------------------------------------
HRESULT CConnectionObj::FindConnectionObj(LPCWSTR pszConnectionName,
BOOL fCreate,CONNECTIONOBJ **pConnectionObj)
{
HRESULT hr = S_FALSE;
CONNECTIONOBJ *pCurConnectionObj;
BOOL fFoundMatch = FALSE;
CLock clockqueue(this);
TCHAR szBuf[MAX_PATH + 1];
*pConnectionObj = NULL;
Assert(pszConnectionName);
clockqueue.Enter();
// look for an existing match
pCurConnectionObj = m_pFirstConnectionObj;
while (pCurConnectionObj)
{
if (0 == lstrcmp(pszConnectionName,pCurConnectionObj->pwszConnectionName))
{
fFoundMatch = TRUE;
break;
}
pCurConnectionObj = pCurConnectionObj->pNextConnectionObj;
}
if (fFoundMatch)
{
++(pCurConnectionObj->cRefs);
*pConnectionObj = pCurConnectionObj;
hr = NOERROR;
}
else if (fCreate)
{
CONNECTIONOBJ *pNewConnectionObj;
// if we need to create a new connectionObj then
pNewConnectionObj = (CONNECTIONOBJ *) ALLOC(sizeof(CONNECTIONOBJ));
if (pNewConnectionObj)
{
memset(pNewConnectionObj,0,sizeof(CONNECTIONOBJ));
pNewConnectionObj->cRefs = 1;
Assert(pszConnectionName);
// setup the Connectoin Name
if (pszConnectionName)
{
DWORD cch = lstrlen(pszConnectionName);
DWORD cbAlloc = (cch + 1)*ARRAY_ELEMENT_SIZE(pNewConnectionObj->pwszConnectionName);
pNewConnectionObj->pwszConnectionName = (LPWSTR) ALLOC(cbAlloc);
if (pNewConnectionObj->pwszConnectionName)
{
lstrcpy(pNewConnectionObj->pwszConnectionName,pszConnectionName);
}
}
// for now if the name of the connection is our
// LAN connection name then set the ConnectionType to LAN,
// else set it to WAN. if convert to using hte connection
// manager should get from that.
LoadString(g_hInst, IDS_LAN_CONNECTION, szBuf, MAX_PATH);
if (NULL == pszConnectionName || 0 == lstrcmp(szBuf,pszConnectionName))
{
pNewConnectionObj->dwConnectionType = CNETAPI_CONNECTIONTYPELAN;
}
else
{
pNewConnectionObj->dwConnectionType = CNETAPI_CONNECTIONTYPEWAN;
}
}
// if everything went okay, add it to the list.
// must have a new connection obj and either not connection name
// was passed in or we successfully added a connection name.
if (pNewConnectionObj && (NULL == pszConnectionName
|| pNewConnectionObj->pwszConnectionName) )
{
// put at beginning of list
pNewConnectionObj->pNextConnectionObj = m_pFirstConnectionObj;
m_pFirstConnectionObj = pNewConnectionObj;
*pConnectionObj = pNewConnectionObj;
hr = NOERROR;
}
else
{
if (pNewConnectionObj)
{
FreeConnectionObj(pNewConnectionObj);
}
}
}
clockqueue.Leave();
return hr;
}
//+---------------------------------------------------------------------------
//
// Function: CConnectionObj::RemoveConnectionObj, public
//
// Synopsis: Removes the specified connections from the list.
//
// Arguments: [pszConnectionName] - Name of the Connection.
//
// Returns: Appropriate status code
//
// Modifies:
//
// History: 05-Nov-97 rogerg Created.
//
//----------------------------------------------------------------------------
void CConnectionObj::RemoveConnectionObj(CONNECTIONOBJ *pConnectionObj)
{
CONNECTIONOBJ *pCurConnection = m_pFirstConnectionObj;
ASSERT_LOCKHELD(this);
// remove from the list
if (m_pFirstConnectionObj == pConnectionObj)
{
m_pFirstConnectionObj = pConnectionObj->pNextConnectionObj;
}
else
{
while (pCurConnection)
{
if (pCurConnection->pNextConnectionObj == pConnectionObj)
{
pCurConnection->pNextConnectionObj = pConnectionObj->pNextConnectionObj;
break;
}
pCurConnection = pCurConnection->pNextConnectionObj;
}
}
FreeConnectionObj(pConnectionObj);
}
//+---------------------------------------------------------------------------
//
// Function: CConnectionObj::FreeConnectionObj, privte
//
// Synopsis: frees the memory associate with a conneciton Object.
//
// Arguments:
//
// Returns: nada
//
// Modifies:
//
// History: 05-Nov-97 rogerg Created.
//
//----------------------------------------------------------------------------
void CConnectionObj::FreeConnectionObj(CONNECTIONOBJ *pConnectionObj)
{
Assert(pConnectionObj);
if (pConnectionObj)
{
if (pConnectionObj->pwszConnectionName)
{
FREE(pConnectionObj->pwszConnectionName);
}
FREE(pConnectionObj);
}
}
//+---------------------------------------------------------------------------
//
// Member: CConnectionObj::IsConnectionAvailable, public
//
// Synopsis: Given a connection name sees if the connection is open
//
// Arguments:
//
// Returns: S_OK - Connection Open
// S_FALSE - Connection not Open
//
// Modifies:
//
// History: 05-Feb-98 rogerg Created.
//
//----------------------------------------------------------------------------
HRESULT CConnectionObj::IsConnectionAvailable(LPCWSTR pszConnectionName)
{
TCHAR szBuf[MAX_PATH + 1];
DWORD dwConnectionType;
LPNETAPI pNetApi = gSingleNetApiObj.GetNetApiObj();
HRESULT hr = S_FALSE;
if (NULL != pNetApi )
{
BOOL fConnected,fCanEstablishConnection;
// for now if the name of the connection is our
// LAN connection name then set the ConnectionType to LAN,
// else set it to WAN. if convert to Connection Manager
// should get type from those interfaces.
LoadString(g_hInst, IDS_LAN_CONNECTION, szBuf, MAX_PATH);
if (NULL == pszConnectionName || 0 == lstrcmp(szBuf,pszConnectionName))
{
dwConnectionType = CNETAPI_CONNECTIONTYPELAN;
}
else
{
dwConnectionType = CNETAPI_CONNECTIONTYPEWAN;
}
pNetApi->GetConnectionStatus(pszConnectionName,dwConnectionType,
&fConnected,&fCanEstablishConnection);
pNetApi->Release();
hr = (fConnected) ? S_OK: S_FALSE;
}
return hr;
}
//+---------------------------------------------------------------------------
//
// Member: CConnectionObj::RestoreWorkOffline, private
//
// Synopsis: If have force an online because of a dial then
// set system state back to Work Offline.
//
// Arguments:
//
// Returns:
//
// Modifies:
//
// History: 05-Apr-99 rogerg Created.
//
//----------------------------------------------------------------------------
void CConnectionObj::RestoreWorkOffline(LPNETAPI pNetApi)
{
if (!pNetApi)
{
Assert(pNetApi);
return;
}
if (m_fForcedOnline)
{
pNetApi->SetOffline(TRUE);
m_fForcedOnline = FALSE;
}
}
//+---------------------------------------------------------------------------
//
// Member: CConnectionObj::TurnOffWorkOffline, private
//
// Synopsis: If System is in WorkOffline state will force
// back to online.
//
// Arguments:
//
// Returns:
//
// Modifies:
//
// History: 05-Apr-99 rogerg Created.
//
//----------------------------------------------------------------------------
void CConnectionObj::TurnOffWorkOffline(LPNETAPI pNetApi)
{
if (!pNetApi)
{
Assert(pNetApi);
return;
}
if (pNetApi->IsGlobalOffline())
{
// if in offline state go ahead and switch to online
if (pNetApi->SetOffline(FALSE))
{
m_fForcedOnline = TRUE;
}
}
}
//+---------------------------------------------------------------------------
//
// Member: CConnectionObj::OpenConnection, public
//
// Synopsis: Given a connection sees if the connection is open
// and if it not and the fMakeConnection is true
// will then attempt to open the connection.
//
// Arguments:
//
// Returns:
//
// Modifies:
//
// History: 05-Feb-98 rogerg Created.
//
//----------------------------------------------------------------------------
HRESULT CConnectionObj::OpenConnection(CONNECTIONOBJ *pConnectionObj,BOOL fMakeConnection,CBaseDlg *pDlg)
{
#ifndef _RASDIAL
DWORD dwConnectionId;
#else
HRASCONN hRasConn;
#endif // _RASDIAL
LPNETAPI pNetApi = gSingleNetApiObj.GetNetApiObj();
BOOL fConnected = FALSE;
BOOL fCanEstablishConnection = FALSE;
if (NULL != pNetApi )
{
// See if the specified connection is active and if there is any
// Wan Activity.
Assert(pConnectionObj->dwConnectionType); // should have a connection type setup by now.
if (NOERROR == pNetApi->GetConnectionStatus(pConnectionObj->pwszConnectionName,
pConnectionObj->dwConnectionType,
&fConnected,
&fCanEstablishConnection))
{
// if there is no Wan Activity and there is not a connection
// then we can go ahead try to dial
if (!fConnected && fCanEstablishConnection
&& fMakeConnection && (pConnectionObj->pwszConnectionName))
{
DWORD dwErr;
TurnOffWorkOffline(pNetApi);
dwErr = pNetApi->InternetDialW(pDlg ? pDlg->GetHwnd() : NULL,
pConnectionObj->pwszConnectionName,
INTERNET_AUTODIAL_FORCE_ONLINE |INTERNET_AUTODIAL_FORCE_UNATTENDED,
&dwConnectionId,0);
if (0 == dwErr)
{
fConnected = TRUE;
pConnectionObj->dwConnectionId = dwConnectionId;
}
else
{
dwConnectionId = 0;
if (pDlg)
{
LogError(pNetApi,dwErr,pDlg);
}
}
}
}
}
if (pNetApi)
pNetApi->Release();
// review, don't handle all failure cases for Scheduling such as LAN connection
// not available or not allowed to make connection on RAS.
pConnectionObj->fConnectionOpen = fConnected;
return pConnectionObj->fConnectionOpen ? NOERROR : S_FALSE;
}
//+---------------------------------------------------------------------------
//
// Member: CConnectionObj::AutoDial
//
// Synopsis: Dials the default auto dial connection
//
// History: 28-Jul-98 SitaramR Created
//
//----------------------------------------------------------------------------
HRESULT CConnectionObj::AutoDial(DWORD dwFlags,CBaseDlg *pDlg)
{
HRESULT hr = NOERROR;
DWORD dwErr = -1;
LPNETAPI pNetApi = gSingleNetApiObj.GetNetApiObj();
// only allow one autodial at a time.
if (m_fAutoDialConn)
{
return NOERROR;
}
if ( NULL == pNetApi )
{
hr = E_OUTOFMEMORY;
}
else
{
TurnOffWorkOffline(pNetApi);
// if flags are force unattended then call InternetAutoDial
// if should prompt user call InternetDial without
// a connectoid to bringup choice
if (dwFlags & INTERNET_AUTODIAL_FORCE_UNATTENDED)
{
BOOL fOk = pNetApi->InternetAutodial(dwFlags,0);
if ( fOk )
{
m_fAutoDialConn = TRUE;
m_dwAutoConnID = 0;
dwErr = 0;
}
else
{
dwErr = GetLastError();
}
}
else
{
DWORD dwConnectionId;
dwErr = pNetApi->InternetDialW(pDlg ? pDlg->GetHwnd() : NULL,
NULL,
INTERNET_AUTODIAL_FORCE_ONLINE,
&dwConnectionId,0);
if (0 == dwErr)
{
m_fAutoDialConn = TRUE;
m_dwAutoConnID = dwConnectionId;
}
}
// if an error occured then log it.
if (0 != dwErr)
{
if (pDlg)
{
LogError(pNetApi,dwErr,pDlg);
}
}
hr = m_fAutoDialConn ? NOERROR : E_UNEXPECTED;
}
if ( pNetApi != NULL )
{
pNetApi->Release();
}
return hr;
}
//+---------------------------------------------------------------------------
//
// Member: CConnectionObj::AutoDial
//
// Synopsis: turns on or off work offline
//
// History: 14-April-99 rogerg Created
//
//----------------------------------------------------------------------------
HRESULT CConnectionObj::SetWorkOffline(BOOL fWorkOffline)
{
LPNETAPI pNetApi = gSingleNetApiObj.GetNetApiObj();
if (NULL == pNetApi)
{
return E_OUTOFMEMORY;
}
if (fWorkOffline)
{
RestoreWorkOffline(pNetApi); // Note: only sets back to workOffline if we turned it off.
}
else
{
TurnOffWorkOffline(pNetApi);
}
pNetApi->Release();
return NOERROR;
}
//+---------------------------------------------------------------------------
//
// Member: CConnectionObj::LogError, private
//
// Synopsis: Logs the dwErr to the dialog
//
// Arguments:
//
// Returns:
//
// Modifies:
//
// History: 08-Mar-99 rogerg Created.
//
//----------------------------------------------------------------------------
void CConnectionObj::LogError(LPNETAPI pNetApi,DWORD dwErr,CBaseDlg *pDlg)
{
BOOL fErrorString= FALSE;
WCHAR wszErrorString[RASERROR_MAXSTRING];
DWORD dwErrorStringLen = sizeof(wszErrorString)/sizeof(WCHAR);
MSGLogErrors msgLogError;
// don't log if success or no dialog
if (NULL == pDlg || 0 == dwErr)
{
Assert(0 != dwErr);
Assert(NULL != pDlg);
return;
}
// print out an error message if it falls within the range of RAS then
// get the raserror, else if a Win32 message get that, if -1 means the dll
// failed to load so use the unknown error.
if (dwErr >= RASBASE && dwErr <= RASBASEEND)
{
if (NOERROR ==
pNetApi->RasGetErrorStringProc(dwErr,wszErrorString,dwErrorStringLen) )
{
fErrorString = TRUE;
}
}
else if (-1 != dwErr) // try formatMessage
{
if (FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dwErr,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //The user default language
wszErrorString,
dwErrorStringLen,
NULL))
{
fErrorString = TRUE;
}
}
if (FALSE == fErrorString)
{
// just use the generic error.
if (LoadString(g_hInst, IDS_UNDEFINED_ERROR,wszErrorString,dwErrorStringLen))
{
fErrorString = TRUE;
}
}
if (fErrorString)
{
msgLogError.mask = 0;
msgLogError.dwErrorLevel = SYNCMGRLOGLEVEL_ERROR;
msgLogError.lpcErrorText = wszErrorString;
msgLogError.ErrorID = GUID_NULL;
msgLogError.fHasErrorJumps = FALSE;
pDlg->HandleLogError(NULL,0,&msgLogError);
}
}
//+---------------------------------------------------------------------------
//
// Member: CConnectionObj::CloseConnection, public
//
// Synopsis: closes the specified connection.
// Not an error if can't find Connection obj since under error
// conditions we still want to call this to clean up, object
// may or may not exist.
//
// Arguments:
//
// Returns:
//
// Modifies:
//
// History: 05-Feb-98 rogerg Created.
//
//----------------------------------------------------------------------------
HRESULT CConnectionObj::CloseConnection(CONNECTIONOBJ *pConnectionObj)
{
CLock clockqueue(this);
CONNECTIONOBJ FirstConnectObj;
CONNECTIONOBJ *pCurConnection = &FirstConnectObj;
clockqueue.Enter();
LPNETAPI pNetApi = gSingleNetApiObj.GetNetApiObj();
pCurConnection->pNextConnectionObj = m_pFirstConnectionObj;
while (pCurConnection->pNextConnectionObj)
{
CONNECTIONOBJ *pConnection = pCurConnection->pNextConnectionObj;
// if the connection is equal to what was passed in, then
// close it out.
if (pConnection
== pConnectionObj)
{
// If have a Completion Event to Set then
if (pConnection->hCompletionEvent)
{
SetEvent(pConnection->hCompletionEvent);
CloseHandle(pConnection->hCompletionEvent);
pConnection->hCompletionEvent = NULL;
}
// if have an open ras connection, hang it up.
// only time this should get connected is in the progress
// TODO: make this a class that keeps the netapi loaded
// until all connectoins have been closed.
#ifndef _RASDIAL
if (pConnection->dwConnectionId)
{
if ( NULL != pNetApi )
{
pNetApi->InternetHangUp(pConnection->dwConnectionId,0);
pConnection->dwConnectionId = 0; // even if hangup fails set to null.
}
}
#else
if (pConnection->hRasConn)
{
if ( NULL != pNetApi )
{
pNetApi->RasHangup(pConnection->hRasConn);
pConnection->hRasConn = NULL; // even if hangup fails set to null.
}
}
#endif // _RASDIAL
// if noone is holding onto this connection anymore get rid of it.
if (0 == pConnection->cRefs)
{
pCurConnection->pNextConnectionObj
= pConnection->pNextConnectionObj;
FreeConnectionObj(pConnection);
}
else
{
pCurConnection = pCurConnection->pNextConnectionObj;
}
break;
}
else
{
pCurConnection = pCurConnection->pNextConnectionObj;
}
}
m_pFirstConnectionObj = FirstConnectObj.pNextConnectionObj;
if ( pNetApi != NULL )
pNetApi->Release();
clockqueue.Leave();
return NOERROR;
}
//+---------------------------------------------------------------------------
//
// Member: CConnectionObj::CloseConnections, public
//
// Synopsis: Closes any open connections that have a refcount of zero.
//
// Arguments:
//
// Returns:
//
// Modifies:
//
// History: 05-Feb-98 rogerg Created.
//
//----------------------------------------------------------------------------
HRESULT CConnectionObj::CloseConnections()
{
CLock clockqueue(this);
CONNECTIONOBJ FirstConnectObj;
CONNECTIONOBJ *pCurConnection = &FirstConnectObj;
clockqueue.Enter();
pCurConnection->pNextConnectionObj = m_pFirstConnectionObj;
LPNETAPI pNetApi = gSingleNetApiObj.GetNetApiObj();
while (pCurConnection->pNextConnectionObj)
{
CONNECTIONOBJ *pConnection = pCurConnection->pNextConnectionObj;
// If have a Completion Event to Set then
if (pConnection->hCompletionEvent)
{
SetEvent(pConnection->hCompletionEvent);
CloseHandle(pConnection->hCompletionEvent);
pConnection->hCompletionEvent = NULL;
}
// if have an open ras connection, hang it up.
// only time this should get connected is in the progress
// TODO: make this a class that keeps the netapi loaded
// until all connectoins have been closed.
if (pConnection->dwConnectionId)
{
if ( NULL != pNetApi )
{
pNetApi->InternetHangUp(pConnection->dwConnectionId,0);
pConnection->dwConnectionId = 0; // even if hangup fails set to null.
}
}
// if noone is holding onto this connection anymore get rid of it.
if (0 == pConnection->cRefs)
{
pCurConnection->pNextConnectionObj
= pConnection->pNextConnectionObj;
FreeConnectionObj(pConnection);
}
else
{
pCurConnection = pCurConnection->pNextConnectionObj;
}
}
m_pFirstConnectionObj = FirstConnectObj.pNextConnectionObj;
//
// Check if auto dial connection needs to be turned off, ignore failure
//
if ( m_fAutoDialConn )
{
if ( NULL != pNetApi )
{
if (m_dwAutoConnID)
{
pNetApi->InternetHangUp(m_dwAutoConnID,0);
}
else
{
pNetApi->InternetAutodialHangup( 0 );
}
}
m_dwAutoConnID = FALSE;
m_fAutoDialConn = FALSE;
}
// if we turned off offline then turn it back on
RestoreWorkOffline(pNetApi);
if ( pNetApi != NULL )
pNetApi->Release();
clockqueue.Leave();
return NOERROR;
}
//+---------------------------------------------------------------------------
//
// Function: CConnectionObj::ReleaseConnectionObj, public
//
// Synopsis: Decrements the specified connectionObj
// If ther reference count goes to zero and there
// is not an open connection we go ahead and
// cleanup immediately.
//
// If there is a dialed connection we wait until
// CloseConnection is explicitly called.
//
// Arguments: [pConnectionObj] - Pointer to the Connection Obj to Release.
//
// Returns: Appropriate status code
//
// Modifies:
//
// History: 05-Nov-97 rogerg Created.
//
//----------------------------------------------------------------------------
DWORD CConnectionObj::ReleaseConnectionObj(CONNECTIONOBJ *pConnectionObj)
{
DWORD cRefs;
BOOL fConnectionOpen = FALSE;
CLock clockqueue(this);
clockqueue.Enter();
--pConnectionObj->cRefs;
cRefs = pConnectionObj->cRefs;
Assert( ((LONG) cRefs) >= 0);
#ifndef _RASDIAL
fConnectionOpen = pConnectionObj->dwConnectionId;
#else
fConnectionOpen = pConnectionObj->hRasConn;
#endif // _RASDIAL
if (0 == cRefs && !fConnectionOpen
&& NULL == pConnectionObj->hCompletionEvent)
{
RemoveConnectionObj(pConnectionObj);
}
clockqueue.Leave();
return cRefs;
}
//+---------------------------------------------------------------------------
//
// Function: CConnectionObj::AddRefConnectionObj, public
//
// Synopsis: Puts an AddRef on the specified connection obj
//
// Arguments: [pConnectionObj] - Pointer to the Connection Obj to Release.
//
// Returns: Appropriate status code
//
// Modifies:
//
// History: 05-Nov-97 rogerg Created.
//
//----------------------------------------------------------------------------
DWORD CConnectionObj::AddRefConnectionObj(CONNECTIONOBJ *pConnectionObj)
{
DWORD cRefs;
cRefs = InterlockedIncrement( (LONG *) &(pConnectionObj->cRefs));
return cRefs;
}
//+---------------------------------------------------------------------------
//
// Member: CConnectionObj::GetConnectionObjCompletionEvent, public
//
// Synopsis: caller has made a request for a completion event to be set up.
// !!! warning, on success the event won't be signalled until CloseConnections is Called.
//
//
// Arguments:
//
// Returns:
//
// Modifies:
//
// History: 05-Feb-98 rogerg Created.
//
//----------------------------------------------------------------------------
HRESULT CConnectionObj::GetConnectionObjCompletionEvent(CONNECTIONOBJ *pConnectionObj,HANDLE *phRasPendingEvent)
{
HRESULT hr = E_UNEXPECTED;
BOOL fFirstCreate = FALSE;
CLock clockqueue(this);
clockqueue.Enter();
if (NULL == pConnectionObj->hCompletionEvent)
{
pConnectionObj->hCompletionEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
fFirstCreate = TRUE;
}
if (pConnectionObj->hCompletionEvent)
{
HANDLE hCurThread;
HANDLE hProcess;
// if have a handle, duplicate it hand it out.
hCurThread = GetCurrentThread();
hProcess = GetCurrentProcess();
if (DuplicateHandle(hProcess,pConnectionObj->hCompletionEvent,hProcess,
phRasPendingEvent,
0,FALSE,DUPLICATE_SAME_ACCESS) )
{
hr = NOERROR;
}
else
{
*phRasPendingEvent = NULL;
// if event was just created, then also close this one
if (fFirstCreate)
{
CloseHandle(pConnectionObj->hCompletionEvent);
pConnectionObj->hCompletionEvent = NULL;
}
}
}
clockqueue.Leave();
return hr;
}
//+---------------------------------------------------------------------------
//
// Function: ConnectObj_OpenConnection, public
//
// Synopsis: wrapper function
//
// Arguments:
//
// Returns:
//
// Modifies:
//
// History: 05-Feb-98 rogerg Created.
//
//----------------------------------------------------------------------------
HRESULT ConnectObj_OpenConnection(CONNECTIONOBJ *pConnectionObj,BOOL fMakeConnection,CBaseDlg *pDlg)
{
Assert(g_pConnectionObj);
if (NULL == g_pConnectionObj)
return E_UNEXPECTED;
return g_pConnectionObj->OpenConnection(pConnectionObj,fMakeConnection,pDlg);
}
//+---------------------------------------------------------------------------
//
// Function: ConnectObj_CloseConnections, public
//
// Synopsis: wrapper function
//
// Arguments:
//
// Returns:
//
// Modifies:
//
// History: 05-Feb-98 rogerg Created.
//
//----------------------------------------------------------------------------
HRESULT ConnectObj_CloseConnections()
{
Assert(g_pConnectionObj);
if (NULL == g_pConnectionObj)
return E_UNEXPECTED;
return g_pConnectionObj->CloseConnections();
}
//+---------------------------------------------------------------------------
//
// Function: ConnectObj_CloseConnection, public
//
// Synopsis: wrapper function
//
// Arguments:
//
// Returns:
//
// Modifies:
//
// History: 05-Feb-98 rogerg Created.
//
//----------------------------------------------------------------------------
HRESULT ConnectObj_CloseConnection(CONNECTIONOBJ *pConnectionObj)
{
Assert(g_pConnectionObj);
if (NULL == g_pConnectionObj)
return E_UNEXPECTED;
return g_pConnectionObj->CloseConnection(pConnectionObj);
}
//+---------------------------------------------------------------------------
//
// Function: ConnectObj_FindConnectionObj, public
//
// Synopsis: wrapper function
//
// Arguments:
//
// Returns:
//
// Modifies:
//
// History: 05-Feb-98 rogerg Created.
//
//----------------------------------------------------------------------------
HRESULT ConnectObj_FindConnectionObj(LPCWSTR pszConnectionName,BOOL fCreate,CONNECTIONOBJ **pConnectionObj)
{
Assert(g_pConnectionObj);
if (NULL == g_pConnectionObj)
return E_UNEXPECTED;
return g_pConnectionObj->FindConnectionObj(pszConnectionName,
fCreate,pConnectionObj);
}
//+---------------------------------------------------------------------------
//
// Function: ConnectObj_AutoDial
//
// Synopsis: Wrapper function for auto dial
//
// History: 28-Jul-98 SitaramR Created
//
//----------------------------------------------------------------------------
HRESULT ConnectObj_AutoDial(DWORD dwFlags,CBaseDlg *pDlg)
{
Assert(g_pConnectionObj);
if (NULL == g_pConnectionObj)
return E_UNEXPECTED;
return g_pConnectionObj->AutoDial(dwFlags,pDlg);
}
//+---------------------------------------------------------------------------
//
// Function: ConnectObj_ReleaseConnectionObj, public
//
// Synopsis: wrapper function
//
// Arguments:
//
// Returns:
//
// Modifies:
//
// History: 05-Feb-98 rogerg Created.
//
//----------------------------------------------------------------------------
DWORD ConnectObj_ReleaseConnectionObj(CONNECTIONOBJ *pConnectionObj)
{
Assert(g_pConnectionObj);
if (NULL == g_pConnectionObj)
return 0;
return g_pConnectionObj->ReleaseConnectionObj(pConnectionObj);
}
//+---------------------------------------------------------------------------
//
// Function: ConnectObj_AddRefConnectionObj, public
//
// Synopsis: wrapper function
//
// Arguments:
//
// Returns:
//
// Modifies:
//
// History: 05-Feb-98 rogerg Created.
//
//----------------------------------------------------------------------------
DWORD ConnectObj_AddRefConnectionObj(CONNECTIONOBJ *pConnectionObj)
{
Assert(g_pConnectionObj);
if (NULL == g_pConnectionObj)
return 0;
return g_pConnectionObj->AddRefConnectionObj(pConnectionObj);
}
//+---------------------------------------------------------------------------
//
// Function: ConnectObj_GetConnectionObjCompletionEvent, public
//
// Synopsis: wrapper function
//
// Arguments:
//
// Returns:
//
// Modifies:
//
// History: 05-Feb-98 rogerg Created.
//
//----------------------------------------------------------------------------
HRESULT ConnectObj_GetConnectionObjCompletionEvent(CONNECTIONOBJ *pConnectionObj,HANDLE *phRasPendingEvent)
{
Assert(g_pConnectionObj);
if (NULL == g_pConnectionObj)
return E_UNEXPECTED;
return g_pConnectionObj->GetConnectionObjCompletionEvent(
pConnectionObj,phRasPendingEvent);
}
//+---------------------------------------------------------------------------
//
// Function: ConnectObj_IsConnectionAvailable, public
//
// Synopsis: wrapper function
//
// Arguments:
//
// Returns:
//
// Modifies:
//
// History: 30-Mar-99 rogerg Created.
//
//----------------------------------------------------------------------------
HRESULT ConnectObj_IsConnectionAvailable(LPCWSTR pszConnectionName)
{
Assert(g_pConnectionObj);
if (NULL == g_pConnectionObj)
return E_UNEXPECTED;
return g_pConnectionObj->IsConnectionAvailable(pszConnectionName);
}
//+---------------------------------------------------------------------------
//
// Function: ConnectObj_SetWorkOffline, public
//
// Synopsis: wrapper function
//
// Arguments:
//
// Returns:
//
// Modifies:
//
// History: 14-Apr-99 rogerg Created.
//
//----------------------------------------------------------------------------
HRESULT ConnectObj_SetWorkOffline(BOOL fWorkOffline)
{
Assert(g_pConnectionObj);
if (NULL == g_pConnectionObj)
return E_UNEXPECTED;
return g_pConnectionObj->SetWorkOffline(fWorkOffline);
}