| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- ///////////////////////////////////////////////////////////////////////
- // DiscFormatDataEvent.cpp
- //
- // Wrapper for DDiscFormat2DataEvents Interface Events
- //
- // Written by Eric Haddan
- //
- #include "stdafx.h"
- #include "DiscFormatDataEvent.h"
- #include "DiscFormatData.h"
- // CDiscFormatDataEvent
- IMPLEMENT_DYNAMIC(CDiscFormatDataEvent, CCmdTarget)
- BEGIN_INTERFACE_MAP(CDiscFormatDataEvent, CCmdTarget)
- INTERFACE_PART(CDiscFormatDataEvent, IID_IDispatch, FormatDataEvents)
- INTERFACE_PART(CDiscFormatDataEvent, IID_DDiscFormat2DataEvents, FormatDataEvents)
- END_INTERFACE_MAP()
- CDiscFormatDataEvent::CDiscFormatDataEvent()
- : m_hNotifyWnd(NULL)
- , m_ptinfo(NULL)
- , m_dwCookie(0)
- , m_pUnkSink(0)
- , m_pUnkSrc(0)
- {
- }
- CDiscFormatDataEvent::~CDiscFormatDataEvent()
- {
- if (m_dwCookie && (m_pUnkSrc != NULL) && (m_pUnkSink != NULL))
- {
- AfxConnectionUnadvise(m_pUnkSrc, IID_DDiscFormat2DataEvents, m_pUnkSink,
- TRUE, m_dwCookie);
- }
- }
- BEGIN_MESSAGE_MAP(CDiscFormatDataEvent, CCmdTarget)
- END_MESSAGE_MAP()
- // CDiscFormatDataEvent message handlers
- ULONG FAR EXPORT CDiscFormatDataEvent::XFormatDataEvents::AddRef()
- {
- METHOD_PROLOGUE(CDiscFormatDataEvent, FormatDataEvents)
- return pThis->ExternalAddRef();
- }
- ULONG FAR EXPORT CDiscFormatDataEvent::XFormatDataEvents::Release()
- {
- METHOD_PROLOGUE(CDiscFormatDataEvent, FormatDataEvents)
- return pThis->ExternalRelease();
- }
- STDMETHODIMP CDiscFormatDataEvent::XFormatDataEvents::QueryInterface(REFIID riid,
- LPVOID FAR* ppvObj)
- {
- METHOD_PROLOGUE(CDiscFormatDataEvent, FormatDataEvents)
- return (HRESULT)pThis->ExternalQueryInterface(&riid, ppvObj);
- }
- STDMETHODIMP
- CDiscFormatDataEvent::XFormatDataEvents::GetTypeInfoCount(UINT FAR* pctinfo)
- {
- METHOD_PROLOGUE(CDiscFormatDataEvent, FormatDataEvents)
- *pctinfo = 1;
- return NOERROR;
- }
- STDMETHODIMP CDiscFormatDataEvent::XFormatDataEvents::GetTypeInfo(
- UINT itinfo,
- LCID lcid,
- ITypeInfo FAR* FAR* pptinfo)
- {
- METHOD_PROLOGUE(CDiscFormatDataEvent, FormatDataEvents)
- *pptinfo = NULL;
- if(itinfo != 0)
- return ResultFromScode(DISP_E_BADINDEX);
- pThis->m_ptinfo->AddRef();
- *pptinfo = pThis->m_ptinfo;
- return NOERROR;
- }
- STDMETHODIMP CDiscFormatDataEvent::XFormatDataEvents::GetIDsOfNames(
- REFIID riid,
- OLECHAR FAR* FAR* rgszNames,
- UINT cNames,
- LCID lcid,
- DISPID FAR* rgdispid)
- {
- METHOD_PROLOGUE(CDiscFormatDataEvent, FormatDataEvents)
- return DispGetIDsOfNames(pThis->m_ptinfo, rgszNames, cNames, rgdispid);
- }
- STDMETHODIMP CDiscFormatDataEvent::XFormatDataEvents::Invoke(
- DISPID dispidMember,
- REFIID riid,
- LCID lcid,
- WORD wFlags,
- DISPPARAMS FAR* pdispparams,
- VARIANT FAR* pvarResult,
- EXCEPINFO FAR* pexcepinfo,
- UINT FAR* puArgErr)
- {
- METHOD_PROLOGUE(CDiscFormatDataEvent, FormatDataEvents)
- return DispInvoke(&pThis->m_xFormatDataEvents, pThis->m_ptinfo,
- dispidMember, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
- }
- ///////////////////////////////////////////////////////////////////////
- //
- // CDiscFormatDataEvent::CreateEventSink
- //
- // Description:
- // Establishes a link between the CDiscFormatData(IDiscFormat2Data)
- // and the CDiscFormatDataEvent(DDiscFormat2DataEvents) so
- // CDiscFormatDataEvent can receive Update messages
- //
- CDiscFormatDataEvent* CDiscFormatDataEvent::CreateEventSink()
- {
- // Create the event sink
- CDiscFormatDataEvent* pDiscFormatDataEvent = new CDiscFormatDataEvent();
- pDiscFormatDataEvent->EnableAutomation();
- pDiscFormatDataEvent->ExternalAddRef();
- return pDiscFormatDataEvent;
- }
- ///////////////////////////////////////////////////////////////////////
- //
- // CDiscFormatDataEvent::ConnectDiscFormatData
- //
- // Description:
- // Establishes a link between the CDiscFormatData(IDiscFormat2Data)
- // and the CDiscFormatDataEvent(DDiscFormat2DataEvents) so
- // CDiscFormatDataEvent can receive Update messages
- //
- bool CDiscFormatDataEvent::ConnectDiscFormatData(CDiscFormatData* pDiscFormatData)
- {
- m_pUnkSink = GetIDispatch(FALSE);
- m_pUnkSrc = pDiscFormatData->GetInterface();
- LPTYPELIB ptlib = NULL;
- HRESULT hr = LoadRegTypeLib(LIBID_IMAPILib2,
- IMAPILib2_MajorVersion, IMAPILib2_MinorVersion,
- LOCALE_SYSTEM_DEFAULT, &ptlib);
- if (FAILED(hr))
- {
- return false;
- }
- hr = ptlib->GetTypeInfoOfGuid(IID_DDiscFormat2DataEvents, &m_ptinfo);
- ptlib->Release();
- if (FAILED(hr))
- {
- return false;
- }
- BOOL bRet = AfxConnectionAdvise(m_pUnkSrc, IID_DDiscFormat2DataEvents, m_pUnkSink,
- TRUE, &m_dwCookie);
- if (bRet)
- {
- return true;
- }
- return false;
- }
- ///////////////////////////////////////////////////////////////////////
- //
- // CDiscFormatDataEvent::Update
- //
- // Description:
- // Receives update notifications from IDiscFormat2Data
- //
- STDMETHODIMP_(HRESULT) CDiscFormatDataEvent::XFormatDataEvents::Update(IDispatch* objectDispatch, IDispatch* progressDispatch)
- {
- METHOD_PROLOGUE(CDiscFormatDataEvent, FormatDataEvents)
- IDiscFormat2DataEventArgs* progress = NULL;
- HRESULT hr = progressDispatch->QueryInterface(IID_PPV_ARGS(&progress));
- IDiscFormat2Data* discFormatData = NULL;
- hr = objectDispatch->QueryInterface(IID_PPV_ARGS(&discFormatData));
- IMAPI_FORMAT2_DATA_WRITE_ACTION currentAction = IMAPI_FORMAT2_DATA_WRITE_ACTION_VALIDATING_MEDIA;
- hr = progress->get_CurrentAction(¤tAction);
- ASSERT(SUCCEEDED(hr));
- if (FAILED(hr))
- {
- return S_OK;
- }
- IMAPI_STATUS imapiStatus = {0};
- if ((currentAction == IMAPI_FORMAT2_DATA_WRITE_ACTION_WRITING_DATA) ||
- (currentAction == IMAPI_FORMAT2_DATA_WRITE_ACTION_FINALIZATION))
- {
- progress->get_ElapsedTime(&imapiStatus.elapsedTime);
- progress->get_RemainingTime(&imapiStatus.remainingTime);
- progress->get_TotalTime(&imapiStatus.totalTime);
- if (currentAction == IMAPI_FORMAT2_DATA_WRITE_ACTION_WRITING_DATA)
- {
- progress->get_StartLba(&imapiStatus.startLba);
- progress->get_SectorCount(&imapiStatus.sectorCount);
- progress->get_LastReadLba(&imapiStatus.lastReadLba);
- progress->get_LastWrittenLba(&imapiStatus.lastWrittenLba);
- progress->get_TotalSystemBuffer(&imapiStatus.totalSystemBuffer);
- progress->get_UsedSystemBuffer(&imapiStatus.usedSystemBuffer);
- progress->get_FreeSystemBuffer(&imapiStatus.freeSystemBuffer);
- }
- }
- LRESULT ret = ::SendMessage(pThis->m_hNotifyWnd, WM_IMAPI_UPDATE, currentAction, (LPARAM)(LPVOID)&imapiStatus);
- if (ret == RETURN_CANCEL_WRITE)
- {
- discFormatData->CancelWrite();
- }
- return S_OK;
- }
|