136 lines
4 KiB
C++
136 lines
4 KiB
C++
/**********************************************************************/
|
|
/** 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__)
|
|
|
|
|
|
|