123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 |
- #include "Main.h"
- #include "WMCallback.h"
- #include <algorithm>
- #include "WMHandler.h"
- #include "util.h"
- #include <cassert>
- #define CAST_TO(x) if (riid== IID_##x) { *ppvObject=static_cast<x *>(this); AddRef(); return S_OK; }
- #define CAST_TO_VIA(x,y) if (riid== IID_##x) { *ppvObject=static_cast<y *>(this); AddRef(); return S_OK; }
- HRESULT WMCallback::QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject )
- {
- CAST_TO(IWMReaderCallback);
- CAST_TO_VIA(IUnknown, IWMReaderCallback);
- CAST_TO(IWMReaderCallbackAdvanced);
- #ifdef _DEBUG
- CAST_TO(IWMCredentialCallback);
- #endif
-
- *ppvObject = NULL;
- return E_NOINTERFACE;
- }
- ULONG WMCallback::AddRef()
- {
- return InterlockedIncrement(&refCount);
- }
- ULONG WMCallback::Release()
- {
- if (InterlockedDecrement(&refCount) == 0)
- {
- delete this;
- return 0;
- }
- return refCount;
- }
- HRESULT WMCallback::OnStatus(WMT_STATUS Status, HRESULT hr, WMT_ATTR_DATATYPE dwType,
- BYTE __RPC_FAR *pValue, void __RPC_FAR *pvContext)
- {
- if (!handler)
- return S_OK;
- switch (Status)
- {
- WMTCASE(WMT_INIT_PLAYLIST_BURN)
- handler->InitPlaylistBurn();
- break;
- WMTCASE(WMT_NO_RIGHTS)
- handler->NoRights((wchar_t *)pValue);
- break;
- WMTCASE(WMT_NO_RIGHTS_EX)
- handler->NoRightsEx((WM_GET_LICENSE_DATA *&)pValue);
- break;
- WMTCASE(WMT_NEEDS_INDIVIDUALIZATION)
- handler->Individualize();
- break;
- WMTCASE(WMT_END_OF_STREAMING)
- break;
- WMTCASE(WMT_LICENSEURL_SIGNATURE_STATE)
- handler->SignatureState((WMT_DRMLA_TRUST *&)pValue);
- break;
- WMTCASE(WMT_ACQUIRE_LICENSE)
- WMT_SHOW_HR_CODE(hr)
- switch (hr)
- {
- case NS_S_DRM_LICENSE_ACQUIRED:
- handler->LicenseAcquired();
- break;
- case NS_S_DRM_MONITOR_CANCELLED:
- handler->MonitorCancelled();
- break;
- case NS_S_DRM_ACQUIRE_CANCELLED:
- handler->SilentCancelled();
- break;
- default:
- handler->AcquireLicense((WM_GET_LICENSE_DATA *&)pValue);
- }
- break;
- WMTCASE(WMT_INDIVIDUALIZE)
- handler->IndividualizeStatus((WM_INDIVIDUALIZE_STATUS *)pValue);
- break;
- //the file has been opened
- WMTCASE(WMT_OPENED)
- if (SUCCEEDED(hr))
- handler->Opened();
- else
- {
- switch (hr)
- {
- WMTCASE(NS_E_DRM_APPCERT_REVOKED)
- WMTCASE(NS_E_DRM_LICENSE_APP_NOTALLOWED)
- handler->DRMExpired();
- WMTCASE(NS_E_LICENSE_REQUIRED)
- handler->LicenseRequired();
- break;
- WMTCASE(NS_E_DRM_NEEDS_INDIVIDUALIZATION)
- handler->NeedsIndividualization();
- break;
- WMTCASE(E_ACCESSDENIED)
- handler->AccessDenied();
- break;
- default:
- WMT_SHOW_HR_CODE(hr);
- handler->Error();
- return S_OK;
- }
- handler->OpenCalled();
- }
- break;
- // Playback of the opened file has begun.
- WMTCASE( WMT_STARTED)
- if (SUCCEEDED(hr))
- handler->Started();
- else
- {
- switch (hr)
- {
- WMTCASE(E_ABORT)
- //handler->OpenFailed();
- break;
- WMTCASE(NS_E_DRM_REOPEN_CONTENT)
- handler->Error();
- break;
- default:
- WMT_SHOW_HR_CODE(hr);
- handler->Error();
- break;
- }
- }
- break;
- WMTCASE( WMT_NEW_METADATA)
- if (SUCCEEDED(hr))
- handler->NewMetadata();
- break;
- // The previously playing reader has stopped.
- WMTCASE( WMT_STOPPED)
- if (SUCCEEDED(hr))
- handler->Stopped();
- else
- {
- WMT_SHOW_HR_CODE(hr);
- handler->Error();
- }
- break;
- // The previously playing reader has stopped.
- WMTCASE( WMT_CLOSED)
- if (SUCCEEDED(hr))
- handler->Closed();
- else
- {
- WMT_SHOW_HR_CODE(hr);
- handler->Error();
- }
- break;
- WMTCASE(WMT_ERROR)
- WMT_SHOW_HR_CODE(hr);
- //handler->Error();
- break;
- WMTCASE( WMT_BUFFERING_START)
- if (SUCCEEDED(hr))
- handler->BufferingStarted();
- break;
- WMTCASE( WMT_BUFFERING_STOP)
- if (SUCCEEDED(hr))
- handler->BufferingStopped();
- break;
- WMTCASE( WMT_EOF)
- WMT_SHOW_HR_CODE(hr);
- handler->EndOfFile();
- break;
- WMTCASE( WMT_LOCATING)
- handler->Locating();
- break;
- WMTCASE( WMT_CONNECTING)
- handler->Connecting();
- break;
- WMTCASE( WMT_PREROLL_READY)
- break;
- WMTCASE( WMT_PREROLL_COMPLETE)
- break;
- WMTCASE(WMT_NEW_SOURCEFLAGS)
- break;
- WMTCASE(WMT_MISSING_CODEC)
- WMT_SHOW_HR_CODE(hr);
- #ifdef DEBUG
- std::cerr << dwType << std::endl;
- std::wcerr << GuidString(*(GUID *)pValue) << std::endl;
- #endif
- break;
- default:
- #ifdef DEBUG
- std::cerr << "unknown message = " << Status << std::endl;
- #endif
- break;
- };
- return S_OK;
- }
- HRESULT WMCallback::OnStreamSelection(WORD wStreamCount, WORD *pStreamNumbers, WMT_STREAM_SELECTION *pSelections, void *pvContext)
- {
- #ifdef DEBUG
- std::cerr << "OnStreamSelection" << std::endl;
- #endif
- return E_NOTIMPL;
- }
- HRESULT WMCallback::OnOutputPropsChanged(DWORD dwOutputNum, WM_MEDIA_TYPE *pMediaType, void *pvContext)
- {
- #ifdef DEBUG
- std::cerr << "OnOutputPropsChanged" << std::endl;
- #endif
- return E_NOTIMPL;
- }
- HRESULT WMCallback::AllocateForStream(WORD wStreamNum, DWORD cbBuffer, INSSBuffer **ppBuffer, void *pvContext)
- {
- return E_NOTIMPL;
- }
- HRESULT WMCallback::AllocateForOutput(DWORD dwOutputNum, DWORD cbBuffer, INSSBuffer **ppBuffer, void *pvContext)
- {
- return E_NOTIMPL;
- }
- HRESULT WMCallback::OnStreamSample(WORD wStreamNum, QWORD cnsSampleTime, QWORD cnsSampleDuration, DWORD dwFlags, INSSBuffer *pSample, void *pvContext)
- {
- return E_NOTIMPL;
- }
- // 0x5A, 0xA5, 0x00, 0x03, 0x74, 0x00, 0x01, 0x01, 0x77,
- //------------------------------------------------------------------------------
- // Name: CWAPlugin::OnSample()
- // Desc: IWMReaderCallback method to process samples.
- //------------------------------------------------------------------------------
- HRESULT WMCallback::OnSample(DWORD dwOutputNum, QWORD cnsSampleTime,
- QWORD cnsSampleDuration, DWORD dwFlags,
- INSSBuffer __RPC_FAR *pSample, void __RPC_FAR *pvContext)
- {
- if (!handler)
- return S_OK;
- handler->SampleReceived(cnsSampleTime, cnsSampleDuration, dwOutputNum, dwFlags, pSample);
- return S_OK;
- }
- HRESULT WMCallback::OnTime(QWORD cnsCurrentTime, void *pvContext)
- {
- if (!handler)
- return S_OK;
- handler->TimeReached(cnsCurrentTime);
- return S_OK;
- }
- HRESULT WMCallback::AcquireCredentials(WCHAR* pwszRealm, WCHAR* pwszSite,
- WCHAR* pwszUser, DWORD cchUser,
- WCHAR* pwszPassword, DWORD cchPassword,
- HRESULT hrStatus, DWORD* pdwFlags)
- {
- #ifdef _DEBUG
- std::cout << "WMCallback::AcquireCredentials" << std::endl;
- std::wcout << pwszRealm << std::endl;
- std::wcout << pwszSite << std::endl;
- std::wcout << HRErrorCode(hrStatus) << std::endl;
- return S_OK;
- #endif
- return E_NOTIMPL;
- }
|