Signed-off-by: Gijs Vermeulen gijsvrm@gmail.com --- dlls/qdvd/navigator.c | 453 ++++++++++++++++++++++++++++++++++++ dlls/qdvd/tests/navigator.c | 2 +- 2 files changed, 454 insertions(+), 1 deletion(-)
diff --git a/dlls/qdvd/navigator.c b/dlls/qdvd/navigator.c index 1e121dde60..00cb0af995 100644 --- a/dlls/qdvd/navigator.c +++ b/dlls/qdvd/navigator.c @@ -26,6 +26,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(qdvd); struct navigator { struct strmbase_filter filter; + IDvdControl2 IDvdControl2_iface; };
static inline struct navigator *impl_from_strmbase_filter(struct strmbase_filter *filter) @@ -33,6 +34,19 @@ static inline struct navigator *impl_from_strmbase_filter(struct strmbase_filter return CONTAINING_RECORD(filter, struct navigator, filter); }
+static HRESULT navigator_query_interface(struct strmbase_filter *iface, REFIID iid, void **out) +{ + struct navigator *filter = impl_from_strmbase_filter(iface); + + if (IsEqualGUID(iid, &IID_IDvdControl2)) + *out = &filter->IDvdControl2_iface; + else + return E_NOINTERFACE; + + IUnknown_AddRef((IUnknown *)*out); + return S_OK; +} + static struct strmbase_pin *navigator_get_pin(struct strmbase_filter *iface, unsigned int index) { return NULL; @@ -48,10 +62,448 @@ static void navigator_destroy(struct strmbase_filter *iface)
static const struct strmbase_filter_ops filter_ops = { + .filter_query_interface = navigator_query_interface, .filter_get_pin = navigator_get_pin, .filter_destroy = navigator_destroy, };
+static struct navigator *impl_from_IDvdControl2(IDvdControl2 *iface) +{ + return CONTAINING_RECORD(iface, struct navigator, IDvdControl2_iface); +} + +static HRESULT WINAPI dvd_control2_QueryInterface(IDvdControl2 *iface, REFIID iid, void **out) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + return IUnknown_QueryInterface(filter->filter.outer_unk, iid, out); +} + +static ULONG WINAPI dvd_control2_AddRef(IDvdControl2 *iface) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + return IUnknown_AddRef(filter->filter.outer_unk); +} + +static ULONG WINAPI dvd_control2_Release(IDvdControl2 *iface) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + return IUnknown_Release(filter->filter.outer_unk); +} + +static HRESULT WINAPI dvd_control2_PlayTitle(IDvdControl2 *iface, ULONG title, DWORD flags, IDvdCmd **cmd) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, title %u, flags %#x, cmd %p.\n", filter, title, flags, cmd); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_PlayChapterInTitle(IDvdControl2 *iface, ULONG title, ULONG chapter, + DWORD flags, IDvdCmd **cmd) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, title %u, chapter %u, flags %#x, cmd %p.\n", filter, title, chapter, flags, cmd); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_PlayTimeInTitle(IDvdControl2 *iface, ULONG title, DVD_HMSF_TIMECODE *time, + DWORD flags, IDvdCmd **cmd) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, title %u, time %p, flags %#x, cmd %p.\n", filter, title, time, flags, cmd); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_Stop(IDvdControl2 *iface) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p.\n", filter); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_ReturnFromSubmenu(IDvdControl2 *iface, DWORD flags, IDvdCmd **cmd) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, flags %#x, cmd %p.\n", filter, flags, cmd); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_PlayAtTime(IDvdControl2 *iface, DVD_HMSF_TIMECODE *time, DWORD flags, IDvdCmd **cmd) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, time %p, flags %#x, cmd %p.\n", filter, time, flags, cmd); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_PlayChapter(IDvdControl2 *iface, ULONG chapter, DWORD flags, IDvdCmd **cmd) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, chapter %u, flags %#x, cmd %p.\n", filter, chapter, flags, cmd); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_PlayPrevChapter(IDvdControl2 *iface, DWORD flags, IDvdCmd **cmd) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, flags %#x, cmd %p.\n", filter, flags, cmd); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_ReplayChapter(IDvdControl2 *iface, DWORD flags, IDvdCmd **cmd) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, flags %#x, cmd %p.\n", filter, flags, cmd); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_PlayNextChapter(IDvdControl2 *iface, DWORD flags, IDvdCmd **cmd) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, flags %#x, cmd %p.\n", filter, flags, cmd); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_PlayForwards(IDvdControl2 *iface, double speed, DWORD flags, IDvdCmd **cmd) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, speed %f, flags %#x, cmd %p.\n", filter, speed, flags, cmd); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_PlayBackwards(IDvdControl2 *iface, double speed, DWORD flags, IDvdCmd **cmd) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, speed %f, flags %#x, cmd %p.\n", filter, speed, flags, cmd); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_ShowMenu(IDvdControl2 *iface, DVD_MENU_ID id, DWORD flags, IDvdCmd **cmd) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, id %d, flags %#x, cmd %p.\n", filter, id, flags, cmd); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_Resume(IDvdControl2 *iface, DWORD flags, IDvdCmd **cmd) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, flags %#x, cmd %p.\n", filter, flags, cmd); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_SelectRelativeButton(IDvdControl2 *iface, DVD_RELATIVE_BUTTON button) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, button %d.\n", filter, button); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_ActivateButton(IDvdControl2 *iface) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p.\n", filter); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_SelectButton(IDvdControl2 *iface, ULONG button) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, button %u.\n", filter, button); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_SelectAndActivateButton(IDvdControl2 *iface, ULONG button) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, button %u.\n", filter, button); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_StillOff(IDvdControl2 *iface) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p.\n", filter); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_Pause(IDvdControl2 *iface, BOOL enable) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, enable %d.\n", filter, enable); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_SelectAudioStream(IDvdControl2 *iface, ULONG stream, DWORD flags, IDvdCmd **cmd) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, stream %u, flags %#x, cmd %p.\n", filter, stream, flags, cmd); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_SelectSubpictureStream(IDvdControl2 *iface, ULONG stream, DWORD flags, IDvdCmd **cmd) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, stream %u, flags %#x, cmd %p.\n", filter, stream, flags, cmd); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_SetSubpictureState(IDvdControl2 *iface, BOOL enable, DWORD flags, IDvdCmd **cmd) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, enable %d, flags %#x, cmd %p.\n", filter, enable, flags, cmd); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_SelectAngle(IDvdControl2 *iface, ULONG angle, DWORD flags, IDvdCmd **cmd) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, angle %u, flags %#x, cmd %p.\n", filter, angle, flags, cmd); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_SelectParentalLevel(IDvdControl2 *iface, ULONG level) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, level %u.\n", filter, level); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_SelectParentalCountry(IDvdControl2 *iface, BYTE country[2]) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, country %p.\n", filter, country); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_SelectKaraokeAudioPresentationMode(IDvdControl2 *iface, ULONG mode) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, mode %u.\n", filter, mode); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_SelectVideoModePreference(IDvdControl2 *iface, ULONG mode) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, mode %u.\n", filter, mode); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_SetDVDDirectory(IDvdControl2 *iface, const WCHAR *path) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, path %s.\n", filter, debugstr_w(path)); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_ActivateAtPosition(IDvdControl2 *iface, POINT point) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, point %s.\n", filter, wine_dbgstr_point(&point)); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_SelectAtPosition(IDvdControl2 *iface, POINT point) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, point %s.\n", filter, wine_dbgstr_point(&point)); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_PlayChaptersAutoStop(IDvdControl2 *iface, ULONG title, ULONG chapter, ULONG count, + DWORD flags, IDvdCmd **cmd) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, title %u, chapter %u, count %u, flags %#x, cmd %p.\n", filter, title, chapter, count, flags, cmd); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_AcceptParentalLevelChange(IDvdControl2 *iface, BOOL accept) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, accept %d.\n", filter, accept); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_SetOption(IDvdControl2 *iface, DVD_OPTION_FLAG flag, BOOL option) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, flag %d, option %d.\n", filter, flag, option); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_SetState(IDvdControl2 *iface, IDvdState *state, DWORD flags, IDvdCmd **cmd) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, state %p, flags %#x, cmd %p.\n", filter, state, flags, cmd); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_PlayPeriodInTitleAutoStop(IDvdControl2 *iface, ULONG title, + DVD_HMSF_TIMECODE *start_time, DVD_HMSF_TIMECODE *end_time, DWORD flags, IDvdCmd **cmd) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, title %u, start_time %p, end_time %p, flags %#x, cmd %p.\n", + filter, title, start_time, end_time, flags, cmd); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_SetGRPM(IDvdControl2 *iface, ULONG index, WORD value, DWORD flags, IDvdCmd **cmd) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, index %u, value %i, flags %#x, cmd %p.\n", filter, index, value, flags, cmd); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_SelectDefaultMenuLanguage(IDvdControl2 *iface, LCID language) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, language %#x.\n", filter, language); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_SelectDefaultAudioLanguage(IDvdControl2 *iface, LCID language, + DVD_AUDIO_LANG_EXT extension) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, language %#x, extension %d.\n", filter, language, extension); + + return E_NOTIMPL; +} + +static HRESULT WINAPI dvd_control2_SelectDefaultSubpictureLanguage(IDvdControl2 *iface, LCID language, + DVD_SUBPICTURE_LANG_EXT extension) +{ + struct navigator *filter = impl_from_IDvdControl2(iface); + + FIXME("filter %p, language %#x, extension %d.\n", filter, language, extension); + + return E_NOTIMPL; +} + +static const struct IDvdControl2Vtbl dvd_control2_vtbl = +{ + dvd_control2_QueryInterface, + dvd_control2_AddRef, + dvd_control2_Release, + dvd_control2_PlayTitle, + dvd_control2_PlayChapterInTitle, + dvd_control2_PlayTimeInTitle, + dvd_control2_Stop, + dvd_control2_ReturnFromSubmenu, + dvd_control2_PlayAtTime, + dvd_control2_PlayChapter, + dvd_control2_PlayPrevChapter, + dvd_control2_ReplayChapter, + dvd_control2_PlayNextChapter, + dvd_control2_PlayForwards, + dvd_control2_PlayBackwards, + dvd_control2_ShowMenu, + dvd_control2_Resume, + dvd_control2_SelectRelativeButton, + dvd_control2_ActivateButton, + dvd_control2_SelectButton, + dvd_control2_SelectAndActivateButton, + dvd_control2_StillOff, + dvd_control2_Pause, + dvd_control2_SelectAudioStream, + dvd_control2_SelectSubpictureStream, + dvd_control2_SetSubpictureState, + dvd_control2_SelectAngle, + dvd_control2_SelectParentalLevel, + dvd_control2_SelectParentalCountry, + dvd_control2_SelectKaraokeAudioPresentationMode, + dvd_control2_SelectVideoModePreference, + dvd_control2_SetDVDDirectory, + dvd_control2_ActivateAtPosition, + dvd_control2_SelectAtPosition, + dvd_control2_PlayChaptersAutoStop, + dvd_control2_AcceptParentalLevelChange, + dvd_control2_SetOption, + dvd_control2_SetState, + dvd_control2_PlayPeriodInTitleAutoStop, + dvd_control2_SetGRPM, + dvd_control2_SelectDefaultMenuLanguage, + dvd_control2_SelectDefaultAudioLanguage, + dvd_control2_SelectDefaultSubpictureLanguage, +}; + HRESULT navigator_create(IUnknown *outer, IUnknown **out) { struct navigator *object; @@ -60,6 +512,7 @@ HRESULT navigator_create(IUnknown *outer, IUnknown **out) return E_OUTOFMEMORY;
strmbase_filter_init(&object->filter, outer, &CLSID_DVDNavigator, &filter_ops); + object->IDvdControl2_iface.lpVtbl = &dvd_control2_vtbl;
TRACE("Created DVD Navigator filter %p.\n", object); *out = &object->filter.IUnknown_inner; diff --git a/dlls/qdvd/tests/navigator.c b/dlls/qdvd/tests/navigator.c index f01e428b4e..db2ba392dc 100644 --- a/dlls/qdvd/tests/navigator.c +++ b/dlls/qdvd/tests/navigator.c @@ -60,7 +60,7 @@ static void test_interfaces(void)
check_interface(filter, &IID_IBaseFilter, TRUE); todo_wine check_interface(filter, &IID_IDvdControl, TRUE); - todo_wine check_interface(filter, &IID_IDvdControl2, TRUE); + check_interface(filter, &IID_IDvdControl2, TRUE); todo_wine check_interface(filter, &IID_IDvdInfo, TRUE); todo_wine check_interface(filter, &IID_IDvdInfo2, TRUE); check_interface(filter, &IID_IMediaFilter, TRUE);