Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

369 lines
12 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: C O N N L I S T . H
//
// Contents: Connection list class -- subclass of the stl list<> code.
//
// Notes:
//
// Author: jeffspr 19 Feb 1998
//
//----------------------------------------------------------------------------
#pragma once
#ifndef _CONNLIST_H_
#define _CONNLIST_H_
// Icon ID to use for a connection that doesn't have a tray entry
//
#define BOGUS_TRAY_ICON_ID (UINT) -1
// #define VERYSTRICTCOMPILE
#ifdef VERYSTRICTCOMPILE
#define CONST_IFSTRICT const
#else
#define CONST_IFSTRICT
#endif
typedef HRESULT FNBALLOONCLICK(IN const GUID * pGUIDConn,
IN const BSTR pszConnectionName,
IN const BSTR szCookie);
typedef enum tagConnListEntryStateFlags
{
CLEF_NONE = 0x0000, // No special characteristics
CLEF_ACTIVATING = 0x0001, // In the process of connecting
CLEF_TRAY_ICON_LOCKED = 0x0002 // Tray icon state is being updated
} CONNLISTENTRYFLAGS;
// Define our structure that will be stored in the list<>
//
class CTrayIconData
{
private:
CTrayIconData* operator &() throw();
CTrayIconData& operator =(IN const CTrayIconData&) throw();
public:
explicit CTrayIconData(IN const CTrayIconData &) throw();
CTrayIconData(IN UINT uiTrayIconId,
IN NETCON_STATUS ncs,
IN IConnectionPoint * pcpStat,
IN INetStatisticsEngine * pnseStats,
IN CConnectionTrayStats * pccts) throw();
//private:
~CTrayIconData() throw();
public:
inline const UINT GetTrayIconId() const throw(){ return m_uiTrayIconId; }
inline const NETCON_STATUS GetConnected() const throw() { return m_ncs; }
inline CONST_IFSTRICT INetStatisticsEngine * GetNetStatisticsEngine() throw() { return m_pnseStats; }
inline CONST_IFSTRICT CConnectionTrayStats * GetConnectionTrayStats() throw() { return m_pccts; }
inline CONST_IFSTRICT IConnectionPoint * GetConnectionPoint() throw() { return m_pcpStat; }
inline const DWORD GetLastBalloonMessage() throw() { return m_dwLastBalloonMessage; }
inline FNBALLOONCLICK* GetLastBalloonFunction() throw() { return m_pfnBalloonFunction; }
inline const BSTR GetLastBalloonCookie() throw() { return m_szCookie; }
HRESULT SetBalloonInfo(DWORD dwLastBalloonMessage, BSTR szCookie, FNBALLOONCLICK* pfnBalloonFunction);
private:
UINT m_uiTrayIconId;
NETCON_STATUS m_ncs;
IConnectionPoint * m_pcpStat;
INetStatisticsEngine * m_pnseStats;
CONST_IFSTRICT CConnectionTrayStats * m_pccts;
DWORD m_dwLastBalloonMessage;
BSTR m_szCookie;
FNBALLOONCLICK * m_pfnBalloonFunction;
};
// typedef TRAYICONDATA * PTRAYICONDATA;
// typedef const TRAYICONDATA * PCTRAYICONDATA;
class ConnListEntry
{
public:
ConnListEntry& operator =(IN const ConnListEntry& ConnectionListEntry) throw();
explicit ConnListEntry(IN const ConnListEntry& ConnectionListEntry) throw();
ConnListEntry() throw();
~ConnListEntry() throw();
DWORD dwState; // bitmask of CONNLISTENTRYFLAGS
CONFOLDENTRY ccfe;
CONST_IFSTRICT CON_TRAY_MENU_DATA * pctmd;
CONST_IFSTRICT CON_BRANDING_INFO * pcbi;
inline CONST_IFSTRICT CTrayIconData* GetTrayIconData() const throw();
inline BOOL HasTrayIconData() const throw();
inline const BOOL GetCreationTime() const throw() { return m_CreationTime; };
inline void UpdateCreationTime() throw() { m_CreationTime = GetTickCount(); };
HRESULT SetTrayIconData(const CTrayIconData& TrayIconData);
HRESULT DeleteTrayIconData();
#ifdef DBG
DWORD dwLockingThreadId;
#endif
private:
CONST_IFSTRICT CTrayIconData * m_pTrayIconData;
DWORD m_CreationTime;
#ifdef VERYSTRICTCOMPILE
private:
const ConnListEntry* operator& ();
#endif
public:
BOOL empty() const;
void clear();
};
// This is the callback definition. Each find routine will be a separate
// callback function
//
// typedef HRESULT (CALLBACK *PFNCONNLISTICONREMOVALCB)(UINT);
// We are creating a list of Connection entries
//
typedef map<GUID, ConnListEntry> ConnListCore;
// Our find callbacks
//
// For ALGO find
bool operator==(IN const ConnListEntry& val, IN PCWSTR pszName) throw(); // HrFindCallbackConnName
bool operator==(IN const ConnListEntry& cle, IN const CONFOLDENTRY& cfe) throw(); // HrFindCallbackConFoldEntry
bool operator==(IN const ConnListEntry& cle, IN const UINT& uiIcon) throw(); // HrFindCallbackTrayIconId
// For map::find
bool operator < (IN const GUID& rguid1, IN const GUID& rguid2) throw(); // HrFindCallbackGuid
// Global connection list wrapper
//
#ifdef DBG
#define AcquireLock() if (FIsDebugFlagSet(dfidTraceFileFunc)) {TraceTag(ttidShellFolder, "Acquiring LOCK: %s, %s, %d", __FUNCTION__, __FILE__, __LINE__);} InternalAcquireLock();
#define ReleaseLock() if (FIsDebugFlagSet(dfidTraceFileFunc)) {TraceTag(ttidShellFolder, "Releasing LOCK: %s, %s, %d", __FUNCTION__, __FILE__, __LINE__);} InternalReleaseLock();
#else
#define AcquireLock() InternalAcquireLock();
#define ReleaseLock() InternalReleaseLock();
#endif
class CConnectionList : CNetCfgDebug<CConnectionList>
{
public:
// No constructor/destructor because we have a global instance of this
// object. Use manual Initialize/Uninitialize instead.
//
VOID Initialize(IN BOOL fTieToTray, IN BOOL fAdviseOnThis) throw();
VOID Uninitialize(IN BOOL fFinalUninitialize = FALSE) throw();
private:
template <class T>
HRESULT HrFindConnectionByType (IN const T& findbyType, IN ConnListEntry& cle)
{
HRESULT hr = S_FALSE;
if (m_pcclc)
{
AcquireLock();
// Try to find the connection
//
ConnListCore::const_iterator iter;
iter = find(m_pcclc->begin(), m_pcclc->end(), findbyType);
if (iter == m_pcclc->end())
{
hr = S_FALSE;
}
else
{
cle = iter->second;
Assert(!cle.ccfe.empty() );
if (!cle.ccfe.empty())
{
cle.UpdateCreationTime();
hr = S_OK;
}
else
{
hr = E_OUTOFMEMORY;
}
}
ReleaseLock();
}
else
{
return S_FALSE;
}
return hr;
}
ConnListCore* m_pcclc;
bool m_fPopulated;
CRITICAL_SECTION m_csMain;
DWORD m_dwAdviseCookie;
BOOL m_fTiedToTray;
BOOL m_fAdviseOnThis;
static DWORD NotifyThread(IN OUT LPVOID pConnectionList) throw();
static DWORD m_dwNotifyThread;
static HANDLE m_hNotifyThread;
// This is for debugging only -- can check the refcount while in the debugger.
#if DBG
DWORD m_dwCritSecRef;
DWORD m_dwWriteLockRef;
#endif
public:
CRITICAL_SECTION m_csWriteLock;
void AcquireWriteLock() throw();
void ReleaseWriteLock() throw();
private:
VOID InternalAcquireLock() throw();
VOID InternalReleaseLock() throw();
public:
HRESULT HrFindConnectionByGuid(
IN const GUID UNALIGNED *pguid,
OUT ConnListEntry& cle);
inline HRESULT HrFindConnectionByName(
IN PCWSTR pszName,
OUT ConnListEntry& cle);
inline HRESULT HrFindConnectionByConFoldEntry(
IN const CONFOLDENTRY& ccfe,
OUT ConnListEntry& cle);
inline HRESULT HrFindConnectionByTrayIconId(
IN UINT uiIcon,
OUT ConnListEntry& cle);
HRESULT HrFindRasServerConnection(
OUT ConnListEntry& cle);
inline BOOL IsInitialized() const throw() { return(m_pcclc != NULL); }
VOID FlushConnectionList() throw();
VOID FlushTrayIcons() throw(); // Flush just the tray icons
VOID EnsureIconsPresent() throw();
HRESULT HrRetrieveConManEntries(
OUT PCONFOLDPIDLVEC& apidlOut) throw();
HRESULT HrRefreshConManEntries();
HRESULT HrSuggestNameForDuplicate(
IN PCWSTR pszOriginal,
OUT PWSTR * ppszNew);
HRESULT HrInsert(
IN const CONFOLDENTRY& pccfe);
HRESULT HrRemoveByIter(
IN OUT ConnListCore::iterator clcIter,
OUT BOOL * pfFlushPosts);
HRESULT HrRemove(
IN OUT const CONFOLDENTRY& ccfe,
OUT BOOL * pfFlushPosts);
HRESULT HrInsertFromNetCon(
IN INetConnection * pNetCon,
OUT PCONFOLDPIDL & ppcfp);
HRESULT HrInsertFromNetConPropertiesEx(
IN const NETCON_PROPERTIES_EX& PropsEx,
OUT PCONFOLDPIDL & ppcfp);
HRESULT HrFindPidlByGuid(
IN const GUID * pguid,
OUT PCONFOLDPIDL& pidl);
HRESULT HrGetCurrentStatsForTrayIconId(
IN UINT uiIcon,
OUT STATMON_ENGINEDATA** ppData,
OUT tstring* pstrName);
HRESULT HrUpdateTrayIconDataByGuid(
IN const GUID * pguid,
IN CConnectionTrayStats * pccts,
IN IConnectionPoint * pcpStat,
IN INetStatisticsEngine * pnseStats,
IN UINT uiIcon);
HRESULT HrUpdateTrayBalloonInfoByGuid(
IN const GUID * pguid,
IN DWORD dwLastBalloonMessage,
IN BSTR szCookie,
IN FNBALLOONCLICK* pfnBalloonFunction);
HRESULT HrUpdateNameByGuid(
IN const GUID * pguid,
IN PCWSTR pszNewName,
OUT PCONFOLDPIDL & pidlOut,
IN BOOL fForce);
HRESULT HrUpdateConnectionByGuid(
IN const GUID * pguid,
IN const ConnListEntry& cle );
HRESULT HrUpdateTrayIconByGuid(
IN const GUID * pguid,
IN BOOL fBrieflyShowBalloon);
HRESULT HrGetBrandingInfo(
IN OUT ConnListEntry& cle);
HRESULT HrGetCachedPidlCopyFromPidl(
IN const PCONFOLDPIDL& pidl,
OUT PCONFOLDPIDL & pcfp);
HRESULT HrMapCMHiddenConnectionToOwner(
IN REFGUID guidHidden,
OUT GUID * pguidOwner);
HRESULT HrUnsetCurrentDefault(OUT PCONFOLDPIDL& cfpPreviousDefault);
HRESULT HasActiveIncomingConnections(OUT LPDWORD pdwCount);
// BOOL FExists(PWSTR pszName);
VOID EnsureConPointNotifyAdded() throw();
VOID EnsureConPointNotifyRemoved() throw();
#ifdef NCDBGEXT
IMPORT_NCDBG_FRIENDS
#endif
};
// Helper routines
//
HRESULT HrCheckForActivation(
IN const PCONFOLDPIDL& cfp,
IN const CONFOLDENTRY& ccfe,
OUT BOOL * pfActivating);
HRESULT HrSetActivationFlag(
IN const PCONFOLDPIDL& cfp,
IN const CONFOLDENTRY& ccfe,
IN BOOL fActivating);
HRESULT HrGetTrayIconLock(
IN const GUID * pguid,
OUT UINT * puiIcon,
OUT LPDWORD pdwLockingThreadId);
VOID ReleaseTrayIconLock(IN const GUID * pguid) throw();
#endif // _CONNLIST_H_