Module: wine Branch: master Commit: d45241dd915d8e1425f9abbf71a9dc4bbf6102d2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d45241dd915d8e1425f9abbf71...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Dec 30 20:21:36 2013 +0100
qcap: Added IPersistPropertyBag::Load implementation.
---
dlls/qcap/Makefile.in | 2 +- dlls/qcap/avico.c | 37 ++++++++++++++++++++- dlls/qcap/tests/qcap.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 117 insertions(+), 3 deletions(-)
diff --git a/dlls/qcap/Makefile.in b/dlls/qcap/Makefile.in index 41871e3..f565855 100644 --- a/dlls/qcap/Makefile.in +++ b/dlls/qcap/Makefile.in @@ -1,5 +1,5 @@ MODULE = qcap.dll -IMPORTS = strmiids strmbase uuid ole32 gdi32 advapi32 +IMPORTS = strmiids strmbase uuid ole32 oleaut32 gdi32 advapi32
C_SRCS = \ avico.c \ diff --git a/dlls/qcap/avico.c b/dlls/qcap/avico.c index 70c3283..a155f00 100644 --- a/dlls/qcap/avico.c +++ b/dlls/qcap/avico.c @@ -23,6 +23,7 @@ #include "windef.h" #include "winbase.h" #include "dshow.h" +#include "aviriff.h"
#include "qcap_main.h"
@@ -36,6 +37,8 @@ typedef struct {
BaseInputPin *in; BaseOutputPin *out; + + DWORD fcc_handler; } AVICompressor;
static inline AVICompressor *impl_from_BaseFilter(BaseFilter *filter) @@ -234,8 +237,38 @@ static HRESULT WINAPI AVICompressorPropertyBag_InitNew(IPersistPropertyBag *ifac static HRESULT WINAPI AVICompressorPropertyBag_Load(IPersistPropertyBag *iface, IPropertyBag *pPropBag, IErrorLog *pErrorLog) { AVICompressor *This = impl_from_IPersistPropertyBag(iface); - FIXME("(%p)->(%p %p)\n", This, pPropBag, pErrorLog); - return E_NOTIMPL; + BSTR str; + VARIANT v; + HRESULT hres; + + static const WCHAR fcc_handlerW[] = {'F','c','c','H','a','n','d','l','e','r',0}; + + TRACE("(%p)->(%p %p)\n", This, pPropBag, pErrorLog); + + V_VT(&v) = VT_EMPTY; + hres = IPropertyBag_Read(pPropBag, fcc_handlerW, &v, NULL); + if(FAILED(hres)) { + WARN("Could not read FccHandler: %08x\n", hres); + return hres; + } + + if(V_VT(&v) != VT_BSTR) { + FIXME("Got vt %d\n", V_VT(&v)); + VariantClear(&v); + return E_FAIL; + } + + str = V_BSTR(&v); + TRACE("FccHandler = %s\n", debugstr_w(str)); + if(SysStringLen(str) != 4) { + FIXME("Invalid FccHandler len\n"); + SysFreeString(str); + return E_FAIL; + } + + This->fcc_handler = FCC(str[0], str[1], str[2], str[3]); + SysFreeString(str); + return S_OK; }
static HRESULT WINAPI AVICompressorPropertyBag_Save(IPersistPropertyBag *iface, IPropertyBag *pPropBag, diff --git a/dlls/qcap/tests/qcap.c b/dlls/qcap/tests/qcap.c index b053bbd..b403a74 100644 --- a/dlls/qcap/tests/qcap.c +++ b/dlls/qcap/tests/qcap.c @@ -59,6 +59,7 @@ DEFINE_EXPECT(ReceiveConnection); DEFINE_EXPECT(GetAllocatorRequirements); DEFINE_EXPECT(NotifyAllocator); DEFINE_EXPECT(Reconnect); +DEFINE_EXPECT(Read_FccHandler);
static const char *debugstr_guid(REFIID riid) { @@ -72,6 +73,28 @@ static const char *debugstr_guid(REFIID riid) return buf; }
+static int strcmp_wa(LPCWSTR strw, const char *stra) +{ + CHAR buf[512]; + WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), NULL, NULL); + return lstrcmpA(stra, buf); +} + +static BSTR a2bstr(const char *str) +{ + BSTR ret; + int len; + + if(!str) + return NULL; + + len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); + ret = SysAllocStringLen(NULL, len-1); + MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len); + + return ret; +} + static void test_smart_tee_filter(void) { HRESULT hr; @@ -1333,6 +1356,59 @@ static void test_AviMux(void) IBaseFilter_Release(avimux); }
+static HRESULT WINAPI PropertyBag_QueryInterface(IPropertyBag *iface, REFIID riid, void **ppv) +{ + if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IPropertyBag, riid)) { + *ppv = iface; + return S_OK; + } + + ok(0, "unexpected call %s\n", debugstr_guid(riid)); + *ppv = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI PropertyBag_AddRef(IPropertyBag *iface) +{ + return 2; +} + +static ULONG WINAPI PropertyBag_Release(IPropertyBag *iface) +{ + return 1; +} + +static HRESULT WINAPI PropertyBag_Read(IPropertyBag *iface, LPCOLESTR pszPropName, VARIANT *pVar, IErrorLog *pErrorLog) +{ + ok(!pErrorLog, "pErrorLog = %p\n", pErrorLog); + + if(!strcmp_wa(pszPropName, "FccHandler")) { + CHECK_EXPECT(Read_FccHandler); + V_VT(pVar) = VT_BSTR; + V_BSTR(pVar) = a2bstr("mrle"); + return S_OK; + } + + ok(0, "unexpected call: %s\n", wine_dbgstr_w(pszPropName)); + return E_NOTIMPL; +} + +static HRESULT WINAPI PropertyBag_Write(IPropertyBag *iface, LPCOLESTR pszPropName, VARIANT *pVar) +{ + ok(0, "unexpected call: %s\n", wine_dbgstr_w(pszPropName)); + return E_NOTIMPL; +} + +static const IPropertyBagVtbl PropertyBagVtbl = { + PropertyBag_QueryInterface, + PropertyBag_AddRef, + PropertyBag_Release, + PropertyBag_Read, + PropertyBag_Write +}; + +static IPropertyBag PropertyBag = { &PropertyBagVtbl }; + static void test_AviCo(void) { IPersistPropertyBag *persist_bag; @@ -1358,6 +1434,11 @@ static void test_AviCo(void) hres = IBaseFilter_QueryInterface(avico, &IID_IPersistPropertyBag, (void**)&persist_bag); ok(hres == S_OK, "QueryInterface(IID_IPersistPropertyBag) returned: %08x\n", hres);
+ SET_EXPECT(Read_FccHandler); + hres = IPersistPropertyBag_Load(persist_bag, &PropertyBag, NULL); + ok(hres == S_OK, "Load failed: %08x\n", hres); + CHECK_CALLED(Read_FccHandler); + IPersistPropertyBag_Release(persist_bag);
hres = IBaseFilter_EnumPins(avico, &enum_pins);