DiscFormatDataEvent.cpp 6.0 KB

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