/*++ Copyright (c) 1995 Microsoft Corporation Module Name : isvcinfo.hxx Abstract: This header file declares the INTERNET SERVICES INFO object. This class serves as a base class for all the functions exported as part of commnon services DLL for Internet services. Author: Murali R. Krishnan ( MuraliK ) 28-July-1995 Environment: Win32 User Mode Project: Internet Services Common DLL Revision History: Murali R. Krishnan (MuraliK) 21-Dec-1995 Support for ISRPC component --*/ # ifndef _ISVC_INFO_HXX_ # define _ISVC_INFO_HXX_ /************************************************************ * Include Headers ************************************************************/ # include "string.hxx" # include "tsres.hxx" # include "eventlog.hxx" extern "C" { # include "inetcom.h" # include "inetinfo.h" # include "tcpsvcs.h" # include "rpc.h" # include "svcloc.h" }; # include "isrpc.hxx" # include "inetlog.h" #ifdef CHICAGO #undef ASSERT #define ASSERT TCP_ASSERT #endif // // Following constants are used for maintaining state of the log object // enum ILOG_STATES { ILOG_OFF = 0, // logging is shut down. ILOG_ACTIVE, // logging is active and working fine ILOG_SUSPENDED // logging is temporarily suspended. }; /************************************************************ * Type Definitions ************************************************************/ class ISVC_INFO; // these functions get called back with the pointer to isvcinfo object // along with supplied context parameter. typedef BOOL (*TS_PFN_SVC_ENUM)( IN ISVC_INFO * pIsvcInfo, IN PVOID pContext ); class ISVC_INFO { public: dllexp ISVC_INFO( IN DWORD dwServiceId, IN LPCTSTR lpszServiceName, IN LPCTSTR lpszModuleName, IN LPCTSTR lpszRegParamKey ); dllexp virtual ~ISVC_INFO(VOID); // // VIRTUAL methods // dllexp virtual BOOL IsValid(VOID) const { return (m_fValid); } dllexp virtual BOOL ReadParamsFromRegistry( IN FIELD_CONTROL fc); dllexp virtual BOOL SetConfiguration( IN PVOID pConfig); dllexp virtual BOOL GetConfiguration( IN OUT PVOID pConfig); dllexp virtual DWORD QueryCurrentServiceState( VOID) const // derived object should maintain state { return ( SERVICE_STOPPED); } // // Parameter access methods. Note that string or non-trivial admin data // items must have the read lock taken. // dllexp LIST_ENTRY & QueryListEntry( VOID) { return ( m_listEntry); } dllexp DWORD QueryServiceId( VOID ) const { return ( m_dwServiceId ); } dllexp LPCTSTR QueryServiceName(VOID) const { return (m_strServiceName.QueryStr()); } dllexp LPCTSTR QueryRegParamKey(VOID) const { return m_strParametersKey.QueryStr(); } dllexp LPCTSTR QueryAdminName(VOID) const { ASSERT( m_cReadLocks ); return m_strAdminName.QueryStr(); } dllexp LPCTSTR QueryAdminEmail(VOID) const { ASSERT( m_cReadLocks ); return m_strAdminEmail.QueryStr(); } dllexp LPCTSTR QueryServerComment(VOID) const { ASSERT( m_cReadLocks ); return m_strServerComment.QueryStr(); } dllexp DWORD QueryMaxConnections( VOID ) const { return m_dwMaxConnections; } dllexp DWORD QueryConnectionTimeout( VOID ) const { return m_dwConnectionTimeout; } dllexp LPCTSTR QueryModuleName( VOID) const { return ( m_strModuleName.QueryStr()); } dllexp EVENT_LOG * QueryEventLog(VOID) { return (&m_EventLog); } dllexp HMODULE QueryHandleForModule(VOID) const { return (m_hModule); } // // IPC related functions // dllexp VOID SetTcpsvcsGlobalData( IN PTCPSVCS_GLOBAL_DATA ptgData) { m_pTcpsvcsGlobalData = ptgData; } dllexp PTCPSVCS_GLOBAL_DATA QueryTcpsvcsGlobalData( VOID) const { return ( m_pTcpsvcsGlobalData); } dllexp DWORD InitializeIpc( IN UCHAR * pszProtseq, IN UCHAR * pszEndpoint, IN RPC_IF_HANDLE rpcIfHandle) { // standby function, till everyone changes the code over.... return ( InitializeIpc( rpcIfHandle)); } dllexp DWORD InitializeIpc( IN RPC_IF_HANDLE rpcIfHandle); dllexp DWORD CleanupIpc( IN RPC_IF_HANDLE rpcIfHandle); dllexp DWORD InitializeDiscovery( IN LPINET_BINDINGS pExtraInetBindings); dllexp DWORD TerminateDiscovery( VOID); // // Data access protection methods // dllexp VOID LockThisForRead( VOID ) { m_tslock.Lock( TSRES_LOCK_READ ); ASSERT( InterlockedIncrement( &m_cReadLocks ) > 0); } dllexp VOID LockThisForWrite( VOID ) { m_tslock.Lock( TSRES_LOCK_WRITE ); ASSERT( m_cReadLocks == 0); } dllexp VOID UnlockThis( VOID ) { #if DBG if ( m_cReadLocks ) // If non-zero, then this is a read unlock InterlockedDecrement( &m_cReadLocks ); #endif m_tslock.Unlock(); } // // Miscellaneous methods // dllexp BOOL LoadStr( OUT STR & str, IN DWORD dwResId) const; // // Event log related API // dllexp VOID LogEvent( IN DWORD idMessage, // id for log message IN WORD cSubStrings, // count of substrings IN const CHAR * apszSubStrings[], // substrings in the message IN DWORD errCode = 0 // error code if any ) { m_EventLog.LogEvent( idMessage, cSubStrings, apszSubStrings, errCode); } dllexp VOID LogEvent( IN DWORD idMessage, // id for log message IN WORD cSubStrings, // count of substrings IN WCHAR * apszSubStrings[], // substrings in the message IN DWORD errCode = 0 // error code if any ) { m_EventLog.LogEvent( idMessage, cSubStrings, apszSubStrings, errCode); } // // Logging related APIs. They call logging apis only if logging is on. // INETLOG_HANDLE QueryInetLog(VOID) const { return (m_hInetLog); } dllexp DWORD LogInformation( IN const INETLOG_INFORMATIONA * pInetLogInfo, OUT LPSTR pszErrorMessage, IN OUT LPDWORD lpcchErrorMessage); dllexp DWORD LogInformation( IN const INETLOG_INFORMATIONW * pInetLogInfo, OUT LPWSTR pszErrorMessage, IN OUT LPDWORD lpcchErrorMessage); dllexp BOOL TerminateLogging( VOID); # if DBG virtual VOID Print( VOID) const; # endif // DBG protected: LONG m_cReadLocks; // tracks number of outstanding reads private: BOOL m_fValid; // indicates if this object is valid DWORD m_fIpcStarted : 1; DWORD m_fSvcLocationDone : 1; BOOL m_fEnableSvcLocation; ISRPC m_isrpc; TS_RESOURCE m_tslock; // protects the service specific data PTCPSVCS_GLOBAL_DATA m_pTcpsvcsGlobalData; DWORD m_dwMaxConnections; DWORD m_dwConnectionTimeout; DWORD m_dwServiceId; // Id for the service STR m_strServiceName;// string with service name STR m_strModuleName; // (eg: foo.dll) for loading resources HMODULE m_hModule; // cached module handle // // location in registry where the parameters key containing common // service specific data may be found. // STR m_strParametersKey; STR m_strAdminName; STR m_strAdminEmail; STR m_strServerComment; EVENT_LOG m_EventLog; // eventlog object for logging events INETLOG_HANDLE m_hInetLog; // Request Log object BOOL m_fLoggingOn; // keeps track of status if logging is on // for use with InterlockedExchange, use following as LONG LONG m_lLoggingState; LIST_ENTRY m_listEntry; // to link all ISVC_INFO objects dllexp RPC_STATUS StartRpcServerListen( VOID) const { return m_pTcpsvcsGlobalData->StartRpcServerListen(); } dllexp RPC_STATUS StopRpcServerListen( VOID) const { return m_pTcpsvcsGlobalData->StopRpcServerListen(); } // // class STATIC data and member functions definitions // // Primarily keeps track of list of active services. // public: static BOOL InitializeServiceInfo(VOID); static VOID CleanupServiceInfo(VOID); // // EnumerateServiceInfo() is used for enumerating active services. // It calls the function pfnEnum for each running service that matches // services mask in dwServices. // static BOOL EnumerateServiceInfo( IN TS_PFN_SVC_ENUM pfnEnum, IN PVOID pContext, IN DWORD dwServices ); private: static LIST_ENTRY sm_ServiceInfoListHead; static DWORD sm_nServices; static BOOL sm_fInitialized; static CRITICAL_SECTION sm_csLock; // lock for list mods. static BOOL InsertInServiceInfoList(IN ISVC_INFO * pIsvcInfo); static BOOL RemoveFromServiceInfoList(IN ISVC_INFO * pIsvcInfo); }; // class ISVC_INFO typedef ISVC_INFO FAR * PISVC_INFO; typedef ISVC_INFO FAR * LPISVC_INFO; # endif // _ISVC_INFO_HXX_ /************************ End of File ***********************/