Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

135 lines
4.0 KiB

/**********************************************************************/
/** 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 <list>
// 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<ISdoMachine> 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<ISdoMachine> spServer;
CComPtr<IStream> 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<CSharedSdoServerImp*> 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__)