Jacek Caban : qcap: Added IPersistPropertyBag::Load implementation.

Alexandre Julliard julliard at winehq.org
Tue Dec 31 11:11:43 CST 2013


Module: wine
Branch: master
Commit: d45241dd915d8e1425f9abbf71a9dc4bbf6102d2
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d45241dd915d8e1425f9abbf71a9dc4bbf6102d2

Author: Jacek Caban <jacek at 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);




More information about the wine-cvs mailing list