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.

243 lines
7.5 KiB

  1. ///////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Microsoft WMIOLE DB Provider
  4. // (C) Copyright 1999 Microsoft Corporation. All Rights Reserved.
  5. //
  6. // CTranOptions object implementation & ITransactionOptions interface implementation
  7. //
  8. //
  9. ///////////////////////////////////////////////////////////////////////////////////
  10. #include "headers.h"
  11. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  12. // Constructor
  13. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  14. CTranOptions::CTranOptions(IUnknown *pUnkOuter) : CBaseObj(BOT_TXNOPTIONS,pUnkOuter)
  15. {
  16. m_pITransOptions = NULL;
  17. m_xactOptions.ulTimeout = 0;
  18. memset(m_xactOptions.szDescription,0,MAX_TRAN_DESC * sizeof(unsigned char));
  19. InterlockedIncrement(&g_cObj);
  20. }
  21. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  22. // Destructor
  23. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  24. CTranOptions::~CTranOptions()
  25. {
  26. SAFE_DELETE_PTR(m_pITransOptions);
  27. SAFE_DELETE_PTR(m_pISupportErrorInfo);
  28. InterlockedDecrement(&g_cObj);
  29. }
  30. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  31. // IUnknown method AddRef
  32. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  33. STDMETHODIMP_(ULONG) CTranOptions::AddRef(void)
  34. {
  35. return InterlockedIncrement((long*)&m_cRef);
  36. }
  37. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  38. // IUnknown method Release
  39. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  40. STDMETHODIMP_(ULONG) CTranOptions::Release(void)
  41. {
  42. if (!InterlockedDecrement((long*)&m_cRef))
  43. {
  44. delete this;
  45. return 0;
  46. }
  47. return m_cRef;
  48. }
  49. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  50. // QueryInterface
  51. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  52. STDMETHODIMP CTranOptions::QueryInterface(REFIID riid, LPVOID *ppv)
  53. {
  54. HRESULT hr = S_OK;
  55. //======================================================
  56. // Check parameters, if not valid return
  57. //======================================================
  58. if (NULL == ppv)
  59. {
  60. hr = E_INVALIDARG ;
  61. }
  62. else
  63. {
  64. //======================================================
  65. // Place NULL in *ppv in case of failure
  66. //======================================================
  67. *ppv = NULL;
  68. if (riid == IID_IUnknown)
  69. {
  70. *ppv = (LPVOID) this;
  71. }
  72. else if (riid == IID_ITransactionOptions)
  73. {
  74. *ppv = (LPVOID)m_pITransOptions;
  75. }
  76. else if (riid == IID_ISupportErrorInfo)
  77. {
  78. *ppv = (LPVOID)m_pISupportErrorInfo;
  79. }
  80. //======================================================
  81. // If we're going to return an interface, AddRef first
  82. //======================================================
  83. if (*ppv)
  84. {
  85. ((LPUNKNOWN) *ppv)->AddRef();
  86. hr = S_OK ;
  87. }
  88. else
  89. {
  90. hr = E_NOINTERFACE;
  91. }
  92. }
  93. return hr;
  94. }
  95. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  96. // Initilization function for the object
  97. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  98. STDMETHODIMP CTranOptions::FInit()
  99. {
  100. HRESULT hr = S_OK;
  101. m_pITransOptions = new CImpITransactionOptions(this);
  102. m_pISupportErrorInfo = new CImpISupportErrorInfo(this);
  103. if(!m_pITransOptions || !m_pISupportErrorInfo)
  104. {
  105. hr = E_OUTOFMEMORY;
  106. }
  107. if(SUCCEEDED(hr))
  108. {
  109. hr = AddInterfacesForISupportErrorInfo();
  110. }
  111. return hr;
  112. }
  113. /////////////////////////////////////////////////////////////////////////////////////////////////////
  114. // Function to add interfaces to ISupportErrorInfo interface
  115. /////////////////////////////////////////////////////////////////////////////////////////////////////
  116. HRESULT CTranOptions::AddInterfacesForISupportErrorInfo()
  117. {
  118. HRESULT hr = S_OK;
  119. hr = m_pISupportErrorInfo->AddInterfaceID(IID_ITransactionOptions);
  120. return hr;
  121. }
  122. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  123. // Function to set the transactions options
  124. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  125. void CTranOptions::SetOptions(XACTOPT *pOpt)
  126. {
  127. m_xactOptions.ulTimeout = pOpt->ulTimeout;
  128. strcpy(m_xactOptions.szDescription,pOpt->szDescription);
  129. }
  130. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  131. // Function which returns pointer to transaction options structure pointer
  132. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  133. XACTOPT *CTranOptions::GetOptions()
  134. {
  135. return &m_xactOptions;
  136. }
  137. ////////////////////////////////////////////////////////////////////////////////////////////////////
  138. ////////////////////////////////////////////////////////////////////////////////////////////////////
  139. // CImpITransactionOptions class implementaions - ie ITransactionOptions interface implementation
  140. ////////////////////////////////////////////////////////////////////////////////////////////////////
  141. ////////////////////////////////////////////////////////////////////////////////////////////////////
  142. /////////////////////////////////////////////////////////////////////////////////////////////////
  143. //
  144. // Set transactions options
  145. //
  146. // Returns one of the following values:
  147. // S_OK Method Succeeded
  148. // E_FAIL a provider specific error occured
  149. // E_INVALIDARG pOptions is NULL
  150. //
  151. /////////////////////////////////////////////////////////////////////////////////////////////////
  152. STDMETHODIMP CImpITransactionOptions::SetOptions(XACTOPT * pOptions)
  153. {
  154. HRESULT hr = E_INVALIDARG;
  155. CSetStructuredExceptionHandler seh;
  156. TRY_BLOCK;
  157. // Seriliaze the object
  158. CAutoBlock cab(m_pObj->GetCriticalSection());
  159. // Clear Error information
  160. g_pCError->ClearErrorInfo();
  161. if(pOptions)
  162. {
  163. m_pObj->SetOptions(pOptions);
  164. hr = S_OK;
  165. }
  166. hr = hr == S_OK ? hr :g_pCError->PostHResult(hr,&IID_ITransactionOptions);
  167. CATCH_BLOCK_HRESULT(hr,L"ITransactionOptions::SetOptions");
  168. return hr;
  169. }
  170. /////////////////////////////////////////////////////////////////////////////////////////////////
  171. //
  172. // Get the current transactions options
  173. //
  174. // Returns one of the following values:
  175. // S_OK Method Succeeded
  176. // E_FAIL a provider specific error occured
  177. // E_INVALIDARG pOptions is NULL
  178. //
  179. /////////////////////////////////////////////////////////////////////////////////////////////////
  180. STDMETHODIMP CImpITransactionOptions::GetOptions(XACTOPT * pOptions)
  181. {
  182. HRESULT hr = E_INVALIDARG;
  183. CSetStructuredExceptionHandler seh;
  184. TRY_BLOCK;
  185. // Seriliaze the object
  186. CAutoBlock cab(m_pObj->GetCriticalSection());
  187. // Clear Error information
  188. g_pCError->ClearErrorInfo();
  189. if(pOptions)
  190. {
  191. XACTOPT *pOptTemp = m_pObj->GetOptions();
  192. pOptions->ulTimeout = pOptTemp->ulTimeout;
  193. strcpy(pOptions->szDescription,pOptTemp->szDescription);
  194. hr = S_OK;
  195. }
  196. hr = hr == S_OK ? hr :g_pCError->PostHResult(hr,&IID_ITransactionOptions);
  197. CATCH_BLOCK_HRESULT(hr,L"ITransactionOptions::SetOptions");
  198. return hr;
  199. }