|
|
/****************************************************************************/ // tssdjet.h
//
// Terminal Server Session Directory Interface Jet RPC provider header.
//
// Copyright (C) 2000 Microsoft Corporation
/****************************************************************************/ #ifndef __TSSDJET_H
#define __TSSDJET_H
#include <tchar.h>
#include "tssd.h"
#include "tssdcommon.h"
#include "tssdshrd.h"
#include "srvsetex.h"
#include "jetrpc.h"
#include "synch.h"
/****************************************************************************/ // Defines
/****************************************************************************/
/****************************************************************************/ // Types
/****************************************************************************/
// CTSSessionDirectory
//
// C++ class instantiation of ITSSessionDirectory.
class CTSSessionDirectory : public ITSSessionDirectory, public IExtendServerSettings, public ITSSessionDirectoryEx { private: long m_RefCount;
BOOL m_bConnected; HCLIENTINFO m_hCI; RPC_BINDING_HANDLE m_hRPCBinding; WCHAR m_StoreServerName[64]; WCHAR m_LocalServerAddress[64]; WCHAR m_ClusterName[64];
// Flags passed in from Termsrv
DWORD m_Flags;
// Private data for UI menus
BOOL m_fEnabled;
// Autorecovery variables
//
// Events
// * m_hSDServerDown - Event that is signalled to awaken recovery thread,
// which wakes up, polls the session directory until it comes back up,
// and then refreshes the database.
// * m_hTerminateRecovery - Recovery thread, when it enters waits, can be
// terminated by the use of this event
//
// Thread Information
// * m_hRecoveryThread - Handle to the recovery thread.
// * m_RecoveryTid - Thread identifier for recovery thread.
//
// Boolean
// * m_bSDIsUp - If this is on then we think the session directory is up.
// * m_sr - Protects m_SDIsUp.
//
// DWORD
// * m_RecoveryTimeout - time in ms between attempts to reestablish
// connection with the session directory.
//
// Function pointer
// * m_repopfn - pointer to the repopulation function in termsrv to call
// when we want an update.
OVERLAPPED m_OverLapped; HANDLE m_hIPChange; HANDLE m_NotifyIPChange;
HANDLE m_hSDServerDown; HANDLE m_hTerminateRecovery; uintptr_t m_hRecoveryThread;
unsigned m_RecoveryTid;
// m_sr protects SDIsUp flag
SHAREDRESOURCE m_sr; volatile LONG m_SDIsUp;
HANDLE m_hInRepopulate; // Signal if not in repopulate,
// non-signal if repopulate is in progress
LONG m_ConnectionEstablished;
// Flag for whether shared reader/writer lock init succeeded. If it doesn't
// succeed, we can't do anything.
BOOL m_LockInitializationSuccessful;
BOOL m_bStartRPCListener;
DWORD m_RecoveryTimeout;
DWORD (*m_repopfn)();
// Autorecovery thread
unsigned static __stdcall RecoveryThread(void *); VOID RecoveryThreadEx();
// Helper functions
DWORD RequestSessDirUpdate(); DWORD ReestablishSessionDirectoryConnection(); void Terminate(); void StartupSD(); void NotifySDServerDown(); boolean EnterSDRpc(); void LeaveSDRpc(); void DisableSDRpcs(); void EnableSDRpcs();
void SetSDConnectionDown() { InterlockedExchange( &m_ConnectionEstablished, FALSE ); }
void SetSDConnectionReady() { InterlockedExchange( &m_ConnectionEstablished, TRUE ); }
BOOL IsSDConnectionReady() { return (BOOL) InterlockedExchangeAdd( &m_ConnectionEstablished, 0 ); }
public: CTSSessionDirectory(); ~CTSSessionDirectory();
// Standard COM methods
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID, void **); ULONG STDMETHODCALLTYPE AddRef(); ULONG STDMETHODCALLTYPE Release();
// ITSSessionDirectory COM interface
HRESULT STDMETHODCALLTYPE Initialize(LPWSTR, LPWSTR, LPWSTR, LPWSTR, DWORD, DWORD (*)(), DWORD (*)(DWORD)); HRESULT STDMETHODCALLTYPE Update(LPWSTR, LPWSTR, LPWSTR, LPWSTR, DWORD, BOOL); HRESULT STDMETHODCALLTYPE GetUserDisconnectedSessions(LPWSTR, LPWSTR, DWORD __RPC_FAR *, TSSD_DisconnectedSessionInfo __RPC_FAR [TSSD_MaxDisconnectedSessions]); HRESULT STDMETHODCALLTYPE NotifyCreateLocalSession( TSSD_CreateSessionInfo __RPC_FAR *); HRESULT STDMETHODCALLTYPE NotifyDestroyLocalSession(DWORD); HRESULT STDMETHODCALLTYPE NotifyDisconnectLocalSession(DWORD, FILETIME);
HRESULT STDMETHODCALLTYPE NotifyReconnectLocalSession( TSSD_ReconnectSessionInfo __RPC_FAR *); HRESULT STDMETHODCALLTYPE NotifyReconnectPending(WCHAR *); HRESULT STDMETHODCALLTYPE Repopulate(DWORD, TSSD_RepopulateSessionInfo *); HRESULT STDMETHODCALLTYPE GetLoadBalanceInfo(LPWSTR, BSTR*); HRESULT STDMETHODCALLTYPE PingSD(PWCHAR pszServerName); HRESULT STDMETHODCALLTYPE WaitForRepopulate(DWORD dwTimeOut);
// IExtendServerSettings COM interface
STDMETHOD(GetAttributeName)(WCHAR *); STDMETHOD(GetDisplayableValueName)(WCHAR *); STDMETHOD(InvokeUI)(HWND,PDWORD); STDMETHOD(GetMenuItems)(int *, PMENUEXTENSION *); STDMETHOD(ExecMenuCmd)(UINT, HWND, PDWORD); STDMETHOD(OnHelp)(int *);
BOOL CTSSessionDirectory::CheckSessionDirectorySetting(WCHAR *Setting); BOOL CTSSessionDirectory::CheckIfSessionDirectoryNameEmpty(WCHAR *Setting); BOOL IsSessionDirectoryEnabled(); BOOL CTSSessionDirectory::IsSessionDirectoryExposeServerIPEnabled(); DWORD SetSessionDirectoryState(WCHAR *, BOOL); DWORD SetSessionDirectoryEnabledState(BOOL); DWORD SetSessionDirectoryExposeIPState(BOOL); void ErrorMessage(HWND hwnd , UINT res , DWORD); BOOL SDJETInitRPC(); public: TCHAR m_tchProvider[64]; TCHAR m_tchDataSource[64]; TCHAR m_tchUserId[64]; TCHAR m_tchPassword[64]; };
RPC_STATUS RPC_ENTRY JetRpcAccessCheck(RPC_IF_HANDLE idIF, void *Binding);
#endif // __TSSDJET_H
|