SCM.h
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:7k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* SCM - Service Control Manager */
  2. /* Copyright (c) 1999 - 2001 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01q,06aug01,dbs  remove instance-creation from SCM
  7. 01p,03aug01,dbs  obj exp is a proper COM object
  8. 01o,13jul01,dbs  fix up includes
  9. 01n,18aug99,dbs  improve resilience by use of RC-ptr to ObjExp
  10. 01m,26jul99,dbs  move marshaling into exporter
  11. 01l,16jul99,dbs  convert map/set with long long key to use new macros
  12. 01k,15jul99,aim  serverAddress now in base class
  13. 01j,12jul99,aim  added timers
  14. 01i,09jul99,dbs  implement ping functionality in SCM now
  15. 01h,08jul99,dbs  add oxidResolve() method
  16. 01g,07jul99,aim  change from RpcBinding to RpcIfClient
  17. 01f,06jul99,dbs  simplify activation mechanism
  18. 01e,06jul99,dbs  make SCM create ObjectExporter at startup
  19. 01d,28jun99,dbs  remove defaultInstance method
  20. 01c,25jun99,dbs  use channel-ID to determine channel authn status
  21. 01b,08jun99,aim  rework
  22. 01a,27may99,aim  created
  23. */
  24. #ifndef __INCSCM_h
  25. #define __INCSCM_h
  26. #include "RpcIfServer.h"
  27. #include "RemoteSCM.h"
  28. #include "comObjLib.h"
  29. #include "dcomLib.h"
  30. #include "OxidResolver.h"
  31. #include "ObjectExporter.h"
  32. #include "DceDispatchTable.h"
  33. #include "orpc.h"
  34. class NTLMSSP;
  35. ////////////////////////////////////////////////////////////////////////////
  36. //
  37. // Default (current) protocol-sequence and endpoints for the SCM
  38. // itself. If we ever add more protocols, then we need to expand this
  39. // list somehow...
  40. //
  41. #define VXDCOM_SCM_ENDPOINT 135
  42. #define VXDCOM_SCM_PROTSEQ  NCACN_IP_TCP
  43. //////////////////////////////////////////////////////////////////////////
  44. //
  45. // SCM -- implements the 'Service Control Manager' for VxDCOM.
  46. //
  47. class SCM : public RpcIfServer
  48.     {
  49.     class PingTimer : public EventHandler
  50. {
  51.       public:
  52. virtual int handleTimeout (const TimeValue& tv);
  53. };
  54.     friend class PingTimer;
  55.     HRESULT instanceCreate
  56.         (
  57.         DWORD mode, // get-class-obj?
  58.         REFCLSID clsid, // CLSID to create
  59.         DWORD nInterfaces, // num i/f's to return
  60.         MULTI_QI* mqi // resulting itf ptrs
  61.         );
  62.     
  63.   public:
  64.     SCM (Reactor* r = Reactor::instance (), NTLMSSP* ssp = 0);
  65.     virtual ~SCM ();
  66.     // IPrivateSCM methods
  67.     HRESULT IndirectActivation
  68. (
  69.         LPWSTR                  pwszServerName, // PROTSEQ + server name 
  70. REFGUID clsid, // CLSID to activate
  71. DWORD mode, // all-1's == get-class-obj
  72. DWORD nItfs, // num of interfaces
  73. IID* pIIDs, // array of IIDs
  74. MInterfacePointer** ppItfData, // returned interface(s)
  75. HRESULT* pResults // returned results per i/f
  76. );
  77.     HRESULT AddOid (OID);
  78.     HRESULT DelOid (OID);
  79.     HRESULT GetNextOid (OID*);
  80.     HRESULT GetOxidResolverBinding
  81.         (
  82.         USHORT                  cProtseqs,
  83.         USHORT                  arProtseqs[],
  84.         DUALSTRINGARRAY**       ppdsaBindings
  85.         );
  86.     // SCM Singleton access
  87.     static SCM* theSCM ();
  88.     // called by dcomLibInit
  89.     static int startService ();
  90.     static int stopService ();
  91.     
  92.     // return next free Object ID / OXID
  93.     OXID nextOXID ();
  94.     OID  nextOid ();
  95.     static ObjectExporter* objectExporter ();
  96.     static NTLMSSP* ssp ();
  97.     HRESULT addressBinding (BSTR*);
  98.     void oidAdd (const RpcStringBinding& resAddr, OID oid);
  99.     void oidDel (const RpcStringBinding& resAddr, OID oid);
  100.     
  101.     // methods for registering / unregistering OXIDs and Object
  102.     // Exporters as they are created and destroyed...
  103.     void oxidRegister (OXID, ObjectExporter*);
  104.     void oxidUnregister (OXID);
  105.     // method to register DCE RPC interface with stub dispatch-table
  106.     HRESULT dceInterfaceRegister (REFIID, const VXDCOM_STUB_DISPTBL*);
  107.     // method to resolve an OXID (and a string-binding) into a
  108.     // RemoteOxid object (which contains a string-binding)...
  109.     HRESULT oxidResolve
  110. (
  111. OXID oxid,
  112. const RpcStringBinding& resAddr,
  113. SPRemoteOxid& remOxid
  114. );
  115.     
  116.     // IRemoteActivation method (called by remote clients)...
  117.     HRESULT RemoteActivation
  118. (
  119. int channelId,  // channel ID
  120. ORPCTHIS* pOrpcThis, // housekeeping
  121. ORPCTHAT* pOrpcThat, // returned housekeeping
  122. GUID* pClsid, // CLSID to activate
  123. OLECHAR* pwszObjName, // NULL
  124. MInterfacePointer* pObjStorage, // NULL
  125. DWORD clientImpLevel, // security
  126. DWORD mode, // all-1's == get-class-obj
  127. DWORD nItfs, // num of interfaces
  128. IID* pIIDs, // size_is (nItfs)
  129. USHORT cReqProtseqs, // num of protseqs
  130. USHORT arReqProtseqs[],// array of protseqs
  131. OXID* pOxid, // returned OXID
  132. DUALSTRINGARRAY** ppdsaOxidBindings,// returned bindings
  133. IPID* pipidRemUnknown,// returned IPID
  134. DWORD* pAuthnHint, // returned security info
  135. COMVERSION* pSvrVersion, // returned server version
  136. HRESULT* phr, // returned activation result
  137. MInterfacePointer** ppItfData, // returned interface(s)
  138. HRESULT* pResults // returned results per i/f
  139. );
  140.     
  141.     // IOXIDResolver methods - the method ResolveOxid() is not
  142.     // implemented directly as its functionality is contained in
  143.     // ResolveOxid2()...
  144.     
  145.     HRESULT SimplePing
  146. (
  147. SETID pSetid // [in] set ID
  148. );
  149.     HRESULT ComplexPing
  150. (
  151. SETID* pSetid, // [in,out] set ID
  152. USHORT SeqNum, // [in] sequence number
  153. USHORT cAddToSet, // [in]
  154. USHORT cDelFromSet, // [in]
  155. OID AddToSet [], // [in]
  156. OID DelFromSet [], // [in]
  157. USHORT* pPingBackoffFactor // [out]
  158. );
  159.     HRESULT ResolveOxid2
  160. (
  161. OXID oxid, // [in] OXID to resolve
  162. USHORT cReqProtseqs, // [in] num of protseqs
  163. USHORT arReqProtseqs[],// [in] array of protseqs
  164. DUALSTRINGARRAY* oxidBindings [],// [out] bindings
  165. IPID* pipidRemUnknown,// [out] IPID
  166. DWORD* pAuthnHint, // [out] security info
  167. COMVERSION* pComVersion // [out] COM version
  168. );
  169.   private:
  170.     void oxidBindingUpdate
  171. (
  172. OXID oxid,
  173. const RpcStringBinding& sbRemoteScm,
  174. REFIPID ipidRemUnk,
  175. const RpcStringBinding& sbRemoteOxid
  176. );
  177.     
  178.     HRESULT mqiMarshal (REFCLSID, const MULTI_QI&, MInterfacePointer**);
  179.     
  180.     enum { MAX_EXPORTERS=32 };
  181.     typedef CComPtr<ObjectExporter> ObjectExporterPtr;
  182.     
  183.     typedef STL_SET_LL OIDSET;
  184.     typedef STL_MAP_LL(OIDSET) OIDSETMAP;
  185.     typedef STL_MAP_LL(ObjectExporterPtr) OXIDMAP;
  186.     typedef STL_MAP(RpcStringBinding, SPRemoteSCM) REMOTESCMMAP;
  187.     
  188.     VxMutex m_mutex; // task-safety
  189.     OXIDMAP m_exporters; // object exporters
  190.     OIDSETMAP m_oidSets; // all OID sets
  191.     SETID m_nextSetid; // for OID sets
  192.     DceDispatchTable m_dispatchTable;
  193.     RpcDispatcher m_dispatcher;
  194.     NTLMSSP* m_ssp;
  195.     REMOTESCMMAP m_remoteScmTable;
  196.     
  197.     OXID m_nextOxid; // next free OX id
  198.     OID  m_nextOid; // next free object ID
  199.     static SCM* s_theSCM; // the one-and-only instance
  200.     
  201.     void tick (size_t);
  202.     void registerStdInterfaces ();
  203.     int  init (INETSockAddr&);
  204.     
  205.     HRESULT newObjectExporter (ObjectExporter**);
  206.     // unsupported
  207.     SCM (const SCM& other);
  208.     SCM& operator= (const SCM& rhs);
  209.     };
  210. #endif // __INCSCM_h