#include "Main.h" #include "WMCallback.h" #include #include "WMHandler.h" #include "util.h" #include #define CAST_TO(x) if (riid== IID_##x) { *ppvObject=static_cast(this); AddRef(); return S_OK; } #define CAST_TO_VIA(x,y) if (riid== IID_##x) { *ppvObject=static_cast(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; }