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.

156 lines
3.9 KiB

  1. /*++
  2. Copyright (C) 1996-2001 Microsoft Corporation
  3. Module Name:
  4. Abstract:
  5. History:
  6. --*/
  7. #ifndef __SMRTMRSH_H__
  8. #define __SMRTMRSH_H__
  9. #include <wbemcli.h>
  10. #include <wstlallc.h>
  11. #include <wmimsg.h>
  12. #include <comutl.h>
  13. #include <sync.h>
  14. #include <unk.h>
  15. #include <map>
  16. #define HASHSIZE 16
  17. class CHash
  18. {
  19. BYTE m_achHash[HASHSIZE];
  20. public:
  21. CHash( PBYTE pHash ) { memcpy( m_achHash, pHash, HASHSIZE ); }
  22. bool operator < ( const CHash& rHash ) const
  23. {
  24. return memcmp( m_achHash, rHash.m_achHash, HASHSIZE ) < 0;
  25. }
  26. };
  27. /***************************************************************************
  28. CSmartObjectMarshaler
  29. ****************************************************************************/
  30. class CSmartObjectMarshaler
  31. : public CUnkBase< IWmiObjectMarshal, &IID_IWmiObjectMarshal >
  32. {
  33. CCritSec m_cs;
  34. std::map<CHash, BOOL, std::less<CHash>, wbem_allocator<BOOL> > m_SentMap;
  35. HRESULT GetMaxMarshalSize( IWbemClassObject* pObj,
  36. LPCWSTR wszNamespace,
  37. DWORD dwFlags,
  38. ULONG* pulSize );
  39. HRESULT InternalPack( IWbemClassObject* pObj,
  40. LPCWSTR wszNamespace,
  41. DWORD dwFlags,
  42. ULONG cBuff,
  43. PBYTE pBuff,
  44. ULONG* pcUsed );
  45. public:
  46. CSmartObjectMarshaler( CLifeControl* pCtl, IUnknown* pUnk = NULL )
  47. : CUnkBase< IWmiObjectMarshal, &IID_IWmiObjectMarshal >( pCtl )
  48. {
  49. }
  50. STDMETHOD(Pack)( IWbemClassObject* pObj,
  51. LPCWSTR wszNamespace,
  52. DWORD dwFlags,
  53. ULONG cBuff,
  54. PBYTE pBuff,
  55. ULONG* pcUsed );
  56. STDMETHOD(Unpack)( ULONG cBuff,
  57. PBYTE pBuff,
  58. DWORD dwFlags,
  59. IWbemClassObject** pObj,
  60. ULONG* pcUsed )
  61. {
  62. return WBEM_E_NOT_SUPPORTED;
  63. }
  64. STDMETHOD(Flush)();
  65. };
  66. /***************************************************************************
  67. CSmartObjectUnmarshaler
  68. ****************************************************************************/
  69. class CSmartObjectUnmarshaler
  70. : public CUnkBase< IWmiObjectMarshal, &IID_IWmiObjectMarshal >
  71. {
  72. CCritSec m_cs;
  73. ULONG m_ulMaxCacheSize;
  74. ULONG m_ulCacheSize;
  75. CWbemPtr<IMarshal> m_pUnmrsh;
  76. CWbemPtr<IWbemLocator> m_pLocator;
  77. CWbemPtr<IWbemClassObject> m_pEmptyClass;
  78. struct CacheRecord
  79. {
  80. DWORD m_dwClassSize;
  81. DWORD m_dwLastUsedTime;
  82. CWbemPtr<IWbemClassObject> m_pClassPart;
  83. };
  84. typedef std::map< CHash,
  85. CacheRecord,
  86. std::less<CHash>,
  87. wbem_allocator<CacheRecord> > ClassPartMap;
  88. ClassPartMap m_Cache;
  89. void MakeRoomInCache( DWORD dwSize );
  90. HRESULT EnsureInitialized();
  91. HRESULT CacheClassPart(PBYTE pHash, DWORD dwSize, IWbemClassObject* pInst);
  92. HRESULT FindClassPart( PBYTE pClassPartHash,
  93. LPCWSTR wszClassPath,
  94. IWbemClassObject** ppClassPart );
  95. public:
  96. CSmartObjectUnmarshaler( CLifeControl* pCtl, IUnknown* pUnk = NULL )
  97. : CUnkBase< IWmiObjectMarshal, &IID_IWmiObjectMarshal >( pCtl ),
  98. m_ulMaxCacheSize(0x500000), m_ulCacheSize(0) { }
  99. STDMETHOD(Pack)( IWbemClassObject* pObj,
  100. LPCWSTR wszNamespace,
  101. DWORD dwFlags,
  102. ULONG cBuff,
  103. PBYTE pBuff,
  104. ULONG* pcUsed )
  105. {
  106. return WBEM_E_NOT_SUPPORTED;
  107. }
  108. STDMETHOD(Unpack)( ULONG cBuff,
  109. PBYTE pBuff,
  110. DWORD dwFlags,
  111. IWbemClassObject** pObj,
  112. ULONG* pcUsed );
  113. STDMETHOD(Flush)();
  114. };
  115. #endif __SMRTMRSH_H__