/**********************************************************************/ /** Microsoft Windows/NT **/ /** Copyright(c) Microsoft Corporation, 1997 - 1999 **/ /**********************************************************************/ /* sharesdo.h defines classes for sharing SdoServer among property pages for different users and snapins FILE HISTORY: */ ////////////////////////////////////////////////////////////////////// #if !defined(__SHARE_SDO_H__) #define __SHARE_SDO_H__ #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 #include // this class is used to build a map of the connected SDO servers being used // the consumer of the class may NOT call ISdoMachine::Connect directly, should use Connect function // defined in this class class CSharedSdoServerPool; class CSharedSdoServerImp; class CSharedSdoServer; // implementation class of shared server // used by CSdoServerPool and CMarshalSdoServer class CSharedSdoServerImp { friend class CSdoServerPool; friend class CMarshalSdoServer; protected: // only be used by friends and derived ones CSharedSdoServerImp(LPCTSTR machine, LPCTSTR user, LPCTSTR passwd); ~CSharedSdoServerImp() { // no longer check this, this could be different // ASSERT(threadId == GetCurrentThreadId()); spServer.Release(); }; // to make this class element of collection, provide following member functions bool IsFor(LPCTSTR machine, LPCTSTR user, LPCTSTR passwd) const; // CoCreate SdoServer object HRESULT CreateServer(); // get marshal stream, can specify, if immediate connection is required. HRESULT GetMarshalStream(LPSTREAM *ppStream, bool* pbConnect /* both input and output */); // Connect the server to the a machine HRESULT Connect(ISdoMachine* pMarshaledServer /* NULL, when calling from the same thread */); // Used by different thread, to retrived marshaled interface out of the stream static HRESULT GetServerNReleaseStream(LPSTREAM pStream, ISdoMachine** ppServer); private: CString strMachine; // name of the serve to connect to CString strUser; // user id used to connect CString strPasswd; // user's passwd CComPtr spServer; // ISdoInterface, created(not yet connected), or connected bool bConnected; CCriticalSection cs; DWORD threadId; // the thread ID of the creating thread }; // used between thread which managed the SdoServerPool and consumer of the pool class CMarshalSdoServer { friend CSdoServerPool; public: CMarshalSdoServer(); ~CMarshalSdoServer() { spServer.Release(); spStm.Release(); pImp = NULL; }; // if connection is needed, should call the connec of CSharedSdoServer, rather than ISdoMachine::Connect // this should be used by a different thread to get marshaled interface HRESULT GetServer(ISdoMachine** ppServer); // connect the sdo server HRESULT Connect(); // release the data members void Release(); protected: void SetInfo(IStream* pStream, CSharedSdoServerImp* pImp1) { spStm.Release(); spStm = pStream; pImp = pImp1; }; private: CComPtr spServer; CComPtr spStm; // CSharedSdoServerImp* pImp; // the pointer is kept in global list, no need to free it }; // class used to manage a shared SdoServerPool class CSdoServerPool { public: // find a server in the pool, if there isn't, create an entry in the pool // this need bo called in the main thread HRESULT GetMarshalServer(LPCTSTR machineName, LPCTSTR userName, LPCTSTR passwd, bool* pbConnect, CMarshalSdoServer* pServer); ~CSdoServerPool(); private: std::list listServers; CCriticalSection cs; }; // the server pool pointer used to share SdoServer among pages and snapins extern CSdoServerPool* g_pSdoServerPool; HRESULT ConnectToSdoServer(BSTR machineName, BSTR userName, BSTR passwd, ISdoMachine** ppServer); HRESULT GetSharedSdoServer(LPCTSTR machine, LPCTSTR user, LPCTSTR passwd, bool* pbConnect, CMarshalSdoServer* pServer); #endif // !defined(__SHARE_SDO_H__)