DiscFormatDataEvent.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. ///////////////////////////////////////////////////////////////////////
  2. // DiscFormatDataEvent.cpp
  3. //
  4. // Wrapper for DDiscFormat2DataEvents Interface Events
  5. //
  6. // Written by Eric Haddan
  7. //
  8. #include "stdafx.h"
  9. #include "DiscFormatDataEvent.h"
  10. #include "DiscFormatData.h"
  11. // CDiscFormatDataEvent
  12. IMPLEMENT_DYNAMIC(CDiscFormatDataEvent, CCmdTarget)
  13. BEGIN_INTERFACE_MAP(CDiscFormatDataEvent, CCmdTarget)
  14. INTERFACE_PART(CDiscFormatDataEvent, IID_IDispatch, FormatDataEvents)
  15. INTERFACE_PART(CDiscFormatDataEvent, IID_DDiscFormat2DataEvents, FormatDataEvents)
  16. END_INTERFACE_MAP()
  17. CDiscFormatDataEvent::CDiscFormatDataEvent()
  18. : m_ptinfo(NULL)
  19. // , m_hNotifyWnd(NULL)
  20. , m_dwCookie(0)
  21. , m_pUnkSink(0)
  22. , m_pUnkSrc(0)
  23. {
  24. }
  25. CDiscFormatDataEvent::~CDiscFormatDataEvent()
  26. {
  27. if (m_dwCookie && (m_pUnkSrc != NULL) && (m_pUnkSink != NULL))
  28. {
  29. AfxConnectionUnadvise(m_pUnkSrc, IID_DDiscFormat2DataEvents, m_pUnkSink,
  30. TRUE, m_dwCookie);
  31. }
  32. }
  33. BEGIN_MESSAGE_MAP(CDiscFormatDataEvent, CCmdTarget)
  34. END_MESSAGE_MAP()
  35. // CDiscFormatDataEvent message handlers
  36. ULONG FAR EXPORT CDiscFormatDataEvent::XFormatDataEvents::AddRef()
  37. {
  38. METHOD_PROLOGUE(CDiscFormatDataEvent, FormatDataEvents)
  39. return pThis->ExternalAddRef();
  40. }
  41. ULONG FAR EXPORT CDiscFormatDataEvent::XFormatDataEvents::Release()
  42. {
  43. METHOD_PROLOGUE(CDiscFormatDataEvent, FormatDataEvents)
  44. return pThis->ExternalRelease();
  45. }
  46. STDMETHODIMP CDiscFormatDataEvent::XFormatDataEvents::QueryInterface(REFIID riid,
  47. LPVOID FAR* ppvObj)
  48. {
  49. METHOD_PROLOGUE(CDiscFormatDataEvent, FormatDataEvents)
  50. return (HRESULT)pThis->ExternalQueryInterface(&riid, ppvObj);
  51. }
  52. STDMETHODIMP
  53. CDiscFormatDataEvent::XFormatDataEvents::GetTypeInfoCount(UINT FAR* pctinfo)
  54. {
  55. METHOD_PROLOGUE(CDiscFormatDataEvent, FormatDataEvents)
  56. *pctinfo = 1;
  57. return NOERROR;
  58. }
  59. STDMETHODIMP CDiscFormatDataEvent::XFormatDataEvents::GetTypeInfo(
  60. UINT itinfo,
  61. LCID lcid,
  62. ITypeInfo FAR* FAR* pptinfo)
  63. {
  64. METHOD_PROLOGUE(CDiscFormatDataEvent, FormatDataEvents)
  65. *pptinfo = NULL;
  66. if(itinfo != 0)
  67. return ResultFromScode(DISP_E_BADINDEX);
  68. pThis->m_ptinfo->AddRef();
  69. *pptinfo = pThis->m_ptinfo;
  70. return NOERROR;
  71. }
  72. STDMETHODIMP CDiscFormatDataEvent::XFormatDataEvents::GetIDsOfNames(
  73. REFIID riid,
  74. OLECHAR FAR* FAR* rgszNames,
  75. UINT cNames,
  76. LCID lcid,
  77. DISPID FAR* rgdispid)
  78. {
  79. METHOD_PROLOGUE(CDiscFormatDataEvent, FormatDataEvents)
  80. return DispGetIDsOfNames(pThis->m_ptinfo, rgszNames, cNames, rgdispid);
  81. }
  82. STDMETHODIMP CDiscFormatDataEvent::XFormatDataEvents::Invoke(
  83. DISPID dispidMember,
  84. REFIID riid,
  85. LCID lcid,
  86. WORD wFlags,
  87. DISPPARAMS FAR* pdispparams,
  88. VARIANT FAR* pvarResult,
  89. EXCEPINFO FAR* pexcepinfo,
  90. UINT FAR* puArgErr)
  91. {
  92. METHOD_PROLOGUE(CDiscFormatDataEvent, FormatDataEvents)
  93. return DispInvoke(&pThis->m_xFormatDataEvents, pThis->m_ptinfo,
  94. dispidMember, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
  95. }
  96. ///////////////////////////////////////////////////////////////////////
  97. //
  98. // CDiscFormatDataEvent::CreateEventSink
  99. //
  100. // Description:
  101. // Establishes a link between the CDiscFormatData(IDiscFormat2Data)
  102. // and the CDiscFormatDataEvent(DDiscFormat2DataEvents) so
  103. // CDiscFormatDataEvent can receive Update messages
  104. //
  105. CDiscFormatDataEvent* CDiscFormatDataEvent::CreateEventSink()
  106. {
  107. // Create the event sink
  108. CDiscFormatDataEvent* pDiscFormatDataEvent = new CDiscFormatDataEvent();
  109. pDiscFormatDataEvent->EnableAutomation();
  110. pDiscFormatDataEvent->ExternalAddRef();
  111. return pDiscFormatDataEvent;
  112. }
  113. ///////////////////////////////////////////////////////////////////////
  114. //
  115. // CDiscFormatDataEvent::ConnectDiscFormatData
  116. //
  117. // Description:
  118. // Establishes a link between the CDiscFormatData(IDiscFormat2Data)
  119. // and the CDiscFormatDataEvent(DDiscFormat2DataEvents) so
  120. // CDiscFormatDataEvent can receive Update messages
  121. //
  122. bool CDiscFormatDataEvent::ConnectDiscFormatData(CDiscFormatData* pDiscFormatData)
  123. {
  124. m_pUnkSink = GetIDispatch(FALSE);
  125. m_pUnkSrc = pDiscFormatData->GetInterface();
  126. LPTYPELIB ptlib = NULL;
  127. HRESULT hr = LoadRegTypeLib(LIBID_IMAPILib2,
  128. IMAPILib2_MajorVersion, IMAPILib2_MinorVersion,
  129. LOCALE_SYSTEM_DEFAULT, &ptlib);
  130. if (FAILED(hr))
  131. {
  132. return false;
  133. }
  134. hr = ptlib->GetTypeInfoOfGuid(IID_DDiscFormat2DataEvents, &m_ptinfo);
  135. ptlib->Release();
  136. if (FAILED(hr))
  137. {
  138. return false;
  139. }
  140. BOOL bRet = AfxConnectionAdvise(m_pUnkSrc, IID_DDiscFormat2DataEvents, m_pUnkSink,
  141. TRUE, &m_dwCookie);
  142. if (bRet)
  143. {
  144. return true;
  145. }
  146. return false;
  147. }
  148. ///////////////////////////////////////////////////////////////////////
  149. //
  150. // CDiscFormatDataEvent::Update
  151. //
  152. // Description:
  153. // Receives update notifications from IDiscFormat2Data
  154. //
  155. STDMETHODIMP_(HRESULT) CDiscFormatDataEvent::XFormatDataEvents::Update(IDispatch* objectDispatch, IDispatch* progressDispatch)
  156. {
  157. METHOD_PROLOGUE(CDiscFormatDataEvent, FormatDataEvents)
  158. IDiscFormat2DataEventArgs* progress = NULL;
  159. HRESULT hr = progressDispatch->QueryInterface(IID_PPV_ARGS(&progress));
  160. IDiscFormat2Data* discFormatData = NULL;
  161. hr = objectDispatch->QueryInterface(IID_PPV_ARGS(&discFormatData));
  162. IMAPI_FORMAT2_DATA_WRITE_ACTION currentAction = IMAPI_FORMAT2_DATA_WRITE_ACTION_VALIDATING_MEDIA;
  163. hr = progress->get_CurrentAction(&currentAction);
  164. ASSERT(SUCCEEDED(hr));
  165. if (FAILED(hr))
  166. {
  167. return S_OK;
  168. }
  169. IMAPI_STATUS imapiStatus = {0};
  170. if ((currentAction == IMAPI_FORMAT2_DATA_WRITE_ACTION_WRITING_DATA) ||
  171. (currentAction == IMAPI_FORMAT2_DATA_WRITE_ACTION_FINALIZATION))
  172. {
  173. progress->get_ElapsedTime(&imapiStatus.elapsedTime);
  174. progress->get_RemainingTime(&imapiStatus.remainingTime);
  175. progress->get_TotalTime(&imapiStatus.totalTime);
  176. if (currentAction == IMAPI_FORMAT2_DATA_WRITE_ACTION_WRITING_DATA)
  177. {
  178. progress->get_StartLba(&imapiStatus.startLba);
  179. progress->get_SectorCount(&imapiStatus.sectorCount);
  180. progress->get_LastReadLba(&imapiStatus.lastReadLba);
  181. progress->get_LastWrittenLba(&imapiStatus.lastWrittenLba);
  182. progress->get_TotalSystemBuffer(&imapiStatus.totalSystemBuffer);
  183. progress->get_UsedSystemBuffer(&imapiStatus.usedSystemBuffer);
  184. progress->get_FreeSystemBuffer(&imapiStatus.freeSystemBuffer);
  185. }
  186. }
  187. // LRESULT ret = ::SendMessage(pThis->m_hNotifyWnd, WM_IMAPI_UPDATE, currentAction, (LPARAM)(LPVOID)&imapiStatus);
  188. // if (ret == RETURN_CANCEL_WRITE)
  189. // {
  190. // discFormatData->CancelWrite();
  191. // }
  192. return S_OK;
  193. }