diff options
Diffstat (limited to 'Src/Plugins/Input/in_wmvdrm/WMCallback.cpp')
-rw-r--r-- | Src/Plugins/Input/in_wmvdrm/WMCallback.cpp | 294 |
1 files changed, 294 insertions, 0 deletions
diff --git a/Src/Plugins/Input/in_wmvdrm/WMCallback.cpp b/Src/Plugins/Input/in_wmvdrm/WMCallback.cpp new file mode 100644 index 00000000..cc92ce70 --- /dev/null +++ b/Src/Plugins/Input/in_wmvdrm/WMCallback.cpp @@ -0,0 +1,294 @@ +#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; +}
\ No newline at end of file |