text: /****************************************************************************/
  // 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
  
  