[QCAP] EnumMedia fixes

Maarten Lankhorst m.b.lankhorst at gmail.com
Mon May 16 16:29:33 CDT 2005


Qcap used old enummedia (with bugs), this should take care of them, same 
bugfixes as in the enummedia of quartz..

changelog line:
Fixed qcap's inherited enummedia bugs
-------------- next part --------------
? .enummedia.c.rej.swp
? enummedia_qcap.patch
Index: enummedia.c
===================================================================
RCS file: /home/wine/wine/dlls/qcap/enummedia.c,v
retrieving revision 1.1
diff -u -p -r1.1 enummedia.c
--- enummedia.c	14 May 2005 11:03:44 -0000	1.1
+++ enummedia.c	16 May 2005 21:26:32 -0000
@@ -38,13 +38,14 @@ WINE_DEFAULT_DEBUG_CHANNEL(qcap);
 HRESULT CopyMediaType(AM_MEDIA_TYPE * pDest, const AM_MEDIA_TYPE *pSrc)
 {
     memcpy(pDest, pSrc, sizeof(AM_MEDIA_TYPE));
+    if (!pSrc->pbFormat) return S_OK;
     if (!(pDest->pbFormat = CoTaskMemAlloc(pSrc->cbFormat)))
         return E_OUTOFMEMORY;
     memcpy(pDest->pbFormat, pSrc->pbFormat, pSrc->cbFormat);
     return S_OK;
 }
 
-void DeleteMediaType(AM_MEDIA_TYPE * pMediaType)
+void FreeMediaType(AM_MEDIA_TYPE * pMediaType)
 {
     if (pMediaType->pbFormat)
     {
@@ -58,6 +59,12 @@ void DeleteMediaType(AM_MEDIA_TYPE * pMe
     }
 }
 
+void DeleteMediaType(AM_MEDIA_TYPE * pMediaType)
+{
+   FreeMediaType(pMediaType);
+   CoTaskMemFree(pMediaType);
+}
+
 BOOL CompareMediaTypes(const AM_MEDIA_TYPE * pmt1, const AM_MEDIA_TYPE * pmt2,
                        BOOL bWildcards)
 {
@@ -110,7 +117,11 @@ HRESULT IEnumMediaTypesImpl_Construct(co
     pEnumMediaTypes->enumMediaDetails.pMediaTypes =
                       CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE) * pDetails->cMediaTypes);
     for (i = 0; i < pDetails->cMediaTypes; i++)
-        pEnumMediaTypes->enumMediaDetails.pMediaTypes[i] = pDetails->pMediaTypes[i];
+        if (FAILED(CopyMediaType(&pEnumMediaTypes->enumMediaDetails.pMediaTypes[i], &pDetails->pMediaTypes[i]))) {
+           while (i--) CoTaskMemFree(pEnumMediaTypes->enumMediaDetails.pMediaTypes[i].pbFormat);
+           CoTaskMemFree(pEnumMediaTypes->enumMediaDetails.pMediaTypes);
+           return E_OUTOFMEMORY;
+        }
     *ppEnum = (IEnumMediaTypes *)(&pEnumMediaTypes->lpVtbl);
     return S_OK;
 }
@@ -158,13 +169,15 @@ static ULONG WINAPI IEnumMediaTypesImpl_
 
     if (!refCount)
     {
+        int i;
+        for (i = 0; i < This->enumMediaDetails.cMediaTypes; i++)
+           if (This->enumMediaDetails.pMediaTypes[i].pbFormat)
+              CoTaskMemFree(This->enumMediaDetails.pMediaTypes[i].pbFormat);
         CoTaskMemFree(This->enumMediaDetails.pMediaTypes);
         CoTaskMemFree(This);
         ObjectRefCount(FALSE);
-        return 0;
     }
-    else
-        return refCount;
+    return refCount;
 }
 
 static HRESULT WINAPI IEnumMediaTypesImpl_Next(IEnumMediaTypes * iface,
@@ -186,7 +199,13 @@ static HRESULT WINAPI IEnumMediaTypesImp
         ULONG i;
         *ppMediaTypes = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE) * cFetched);
         for (i = 0; i < cFetched; i++)
-            (*ppMediaTypes)[i] = This->enumMediaDetails.pMediaTypes[This->uIndex + i];
+            if (FAILED(CopyMediaType(&(*ppMediaTypes)[i], &This->enumMediaDetails.pMediaTypes[This->uIndex + i]))) {
+                while (i--)
+                    CoTaskMemFree((*ppMediaTypes)[i].pbFormat);
+                CoTaskMemFree(*ppMediaTypes);
+                *ppMediaTypes = NULL;
+                return E_OUTOFMEMORY;
+            }
     }
 
     if ((cMediaTypes != 1) || pcFetched)


More information about the wine-patches mailing list