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.

247 lines
5.5 KiB

  1. /*++
  2. Copyright (C) 1998-2001 Microsoft Corporation
  3. Module Name:
  4. Abstract:
  5. History:
  6. --*/
  7. //////////////////////////////////////////////////////////////////////
  8. //
  9. // Refresher.cpp: implementation of the CRefresher class.
  10. //
  11. //////////////////////////////////////////////////////////////////////
  12. #include "HiPerStress.h"
  13. #include "Refresher.h"
  14. //////////////////////////////////////////////////////////////////////
  15. //
  16. // CRefresher
  17. //
  18. //////////////////////////////////////////////////////////////////////
  19. CRefresher::CRefresher()
  20. {
  21. m_pRef = 0;
  22. m_pCfg = 0;
  23. m_lRefCount = 0;
  24. }
  25. CRefresher::~CRefresher()
  26. //////////////////////////////////////////////////////////////////////
  27. //
  28. // Remove all objects from the refresher, delete the objects, and
  29. // release the refresher & refresher manager
  30. //
  31. //////////////////////////////////////////////////////////////////////
  32. {
  33. int i;
  34. for (i = 0; i < m_apObj.GetSize(); i++)
  35. m_pCfg->Remove(m_apObj[i]->GetID(), 0);
  36. m_apObj.RemoveAll();
  37. for (i = 0; i < m_apRef.GetSize(); i++)
  38. m_pCfg->Remove(m_apRef[i]->GetID(), 0);
  39. m_apRef.RemoveAll();
  40. if (m_pRef)
  41. m_pRef->Release();
  42. if (m_pCfg)
  43. m_pCfg->Release();
  44. }
  45. BOOL CRefresher::Create()
  46. //////////////////////////////////////////////////////////////////////
  47. //
  48. // Create a refresher and refresher manager
  49. //
  50. // Returns TRUE if no error.
  51. //
  52. //////////////////////////////////////////////////////////////////////
  53. {
  54. // Create an empty refresher.
  55. DWORD dwRes = CoCreateInstance(CLSID_WbemRefresher, 0, CLSCTX_SERVER,
  56. IID_IWbemRefresher, (LPVOID *) &m_pRef);
  57. if (FAILED(dwRes))
  58. {
  59. printf("**ERROR** Failed to create the refresher.");
  60. return FALSE;
  61. }
  62. // Create the refresher manager.
  63. dwRes = m_pRef->QueryInterface(IID_IWbemConfigureRefresher,
  64. (LPVOID *) &m_pCfg);
  65. if (FAILED(dwRes))
  66. {
  67. printf("**ERROR** Failed to create the refresher manager.");
  68. m_pRef->Release();
  69. m_pRef = 0;
  70. return FALSE;
  71. }
  72. return TRUE;
  73. }
  74. BOOL CRefresher::Refresh()
  75. //////////////////////////////////////////////////////////////////////
  76. //
  77. // Refresh!
  78. //
  79. // Returns TRUE if no error.
  80. //
  81. //////////////////////////////////////////////////////////////////////
  82. {
  83. m_lRefCount++;
  84. if (m_pRef == 0)
  85. {
  86. printf("**ERROR** No active refresher!\n");
  87. return FALSE;
  88. }
  89. HRESULT hRes = m_pRef->Refresh(0);
  90. if (FAILED(hRes))
  91. {
  92. printf("**ERROR** Failed to refresh.");
  93. return FALSE;
  94. }
  95. return TRUE;
  96. }
  97. BOOL CRefresher::AddObject(WCHAR *wcsNameSpace, WCHAR *wcsName)
  98. //////////////////////////////////////////////////////////////////////
  99. //
  100. // Add an instance to the refresher
  101. //
  102. // Parameters:
  103. // <wcsNameSpace> A string identifying the namespace of the object
  104. // <wcsName> A string identifying the object
  105. //
  106. // Returns TRUE if no error.
  107. //
  108. //////////////////////////////////////////////////////////////////////
  109. {
  110. LONG lObjID;
  111. // Get the namespace service
  112. IWbemServices *pSvc = g_pLocator->GetService(wcsNameSpace);
  113. if (!pSvc)
  114. {
  115. printf("**ERROR** Failed to resolve namespace %S.\n", wcsNameSpace);
  116. return FALSE;
  117. }
  118. // Add the object to the refresher.
  119. IWbemClassObject *pRefreshableCopy = 0;
  120. HRESULT hRes = m_pCfg->AddObjectByPath(pSvc, wcsName, 0, 0,
  121. &pRefreshableCopy, &lObjID);
  122. if (hRes)
  123. {
  124. printf("**ERROR** Failed to add object %S\\%S to refresher. WBEM error code = 0x%X\n", wcsNameSpace, wcsName, hRes);
  125. pSvc->Release();
  126. return FALSE;
  127. }
  128. // Record the object and its id.
  129. CInstance *pInst = new CInstance(wcsNameSpace, wcsName, pRefreshableCopy, lObjID);
  130. m_apObj.Add(pInst);
  131. pRefreshableCopy->Release();
  132. pSvc->Release();
  133. return TRUE;
  134. }
  135. BOOL CRefresher::RemoveObject(int nIndex)
  136. {
  137. m_pCfg->Remove(m_apObj[nIndex]->GetID(), 0);
  138. m_apObj.RemoveAt(nIndex);
  139. return TRUE;
  140. }
  141. BOOL CRefresher::AddRefresher(CRefresher *pRef)
  142. //////////////////////////////////////////////////////////////////////
  143. //
  144. // Add a child refresher to the refresher
  145. //
  146. // Parameters:
  147. // <pRef> An existing refresher
  148. //
  149. // Returns TRUE if no error.
  150. //
  151. //////////////////////////////////////////////////////////////////////
  152. {
  153. // Add refresher
  154. HRESULT hRes = m_pCfg->AddRefresher(pRef->m_pRef, 0, &m_lID);
  155. if (FAILED(hRes))
  156. {
  157. printf("**ERROR** Failed to add refresher to refresher. WBEM error code = 0x%X\n", hRes);
  158. return FALSE;
  159. }
  160. m_apRef.Add(pRef);
  161. return TRUE;
  162. }
  163. BOOL CRefresher::RemoveRefresher(int nIndex)
  164. {
  165. m_pCfg->Remove(m_apRef[nIndex]->GetID(), 0);
  166. m_apRef.RemoveAt(nIndex);
  167. return TRUE;
  168. }
  169. void CRefresher::DumpTree(const WCHAR *wcsPrefix)
  170. //////////////////////////////////////////////////////////////////////
  171. //
  172. // Print out the contents of the refresher
  173. //
  174. // Parameters:
  175. // <wcsPrefix> A string representing the "branches" of the tree
  176. //
  177. //////////////////////////////////////////////////////////////////////
  178. {
  179. printf("%.*S+--Refresher\n", (wcslen(wcsPrefix)-1), wcsPrefix);
  180. int i;
  181. WCHAR wcsRefPrefix[1024];
  182. if (m_apRef.GetSize() > 0)
  183. swprintf(wcsRefPrefix, L"%s |", wcsPrefix);
  184. else
  185. swprintf(wcsRefPrefix, L"%s ", wcsPrefix);
  186. for (i = 0; i < m_apObj.GetSize(); i++)
  187. m_apObj[i]->DumpObject(wcsRefPrefix);
  188. for (i = 0; i < m_apRef.GetSize(); i++)
  189. {
  190. if (i == (m_apRef.GetSize() - 1))
  191. swprintf(wcsRefPrefix, L"%s ", wcsPrefix);
  192. printf("%S |\n", wcsPrefix);
  193. m_apRef[i]->DumpTree(wcsRefPrefix);
  194. }
  195. }
  196. void CRefresher::DumpStats()
  197. {
  198. int i;
  199. for (i = 0; i < m_apObj.GetSize(); i++)
  200. m_apObj[i]->DumpStats(m_lRefCount);
  201. for (i = 0; i < m_apRef.GetSize(); i++)
  202. m_apRef[i]->DumpStats();
  203. }