Aric Stewart : msdmo: Implement DMOGetTypes.

Alexandre Julliard julliard at winehq.org
Fri Oct 5 04:55:59 CDT 2007


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

Author: Aric Stewart <aric at codeweavers.com>
Date:   Wed Oct  3 14:51:10 2007 -0500

msdmo: Implement DMOGetTypes.

---

 dlls/msdmo/dmoreg.c |  125 ++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 118 insertions(+), 7 deletions(-)

diff --git a/dlls/msdmo/dmoreg.c b/dlls/msdmo/dmoreg.c
index ff0440a..8dd2592 100644
--- a/dlls/msdmo/dmoreg.c
+++ b/dlls/msdmo/dmoreg.c
@@ -76,6 +76,12 @@ static const WCHAR szCat2Fmt[] =
     '%','s','\\','%','s',0
 };
 
+static const WCHAR szToGuidFmt[] =
+{
+    '{','%','s','}',0
+};
+
+
 typedef struct
 {
     const IEnumDMOVtbl         *lpVtbl;
@@ -439,6 +445,7 @@ static HRESULT WINAPI IEnumDMO_fnNext(
     FILETIME ft;
     HKEY hkey;
     WCHAR szNextKey[MAX_PATH];
+    WCHAR szGuidKey[64];
     WCHAR szKey[MAX_PATH];
     WCHAR szValue[MAX_PATH];
     DWORD len;
@@ -447,7 +454,7 @@ static HRESULT WINAPI IEnumDMO_fnNext(
 
     IEnumDMOImpl *This = (IEnumDMOImpl *)iface;
 
-    TRACE("%d\n", cItemsToFetch);
+    TRACE("--> (%p) %d %p %p %p\n", iface, cItemsToFetch, pCLSID, Names, pcItemsFetched);
 
     if (!pCLSID || !Names || !pcItemsFetched)
         return E_POINTER;
@@ -556,7 +563,8 @@ static HRESULT WINAPI IEnumDMO_fnNext(
 	    if (Names[count])
                 strcmpW(Names[count], szValue);
 	}
-        CLSIDFromString(szNextKey, &pCLSID[count]);
+        wsprintfW(szGuidKey,szToGuidFmt,szNextKey);
+        CLSIDFromString(szGuidKey, &pCLSID[count]);
 
         TRACE("found match %s %s\n", debugstr_w(szValue), debugstr_w(szNextKey));
         RegCloseKey(hkey);
@@ -567,6 +575,7 @@ static HRESULT WINAPI IEnumDMO_fnNext(
     if (*pcItemsFetched < cItemsToFetch)
         hres = S_FALSE;
 
+    TRACE("<-- %i found\n",count);
     return hres;
 }
  
@@ -650,11 +659,113 @@ static const IEnumDMOVtbl edmovt =
 };
 
 
-HRESULT WINAPI DMOGetTypes(REFCLSID a, ULONG b, ULONG* c,
-			   DMO_PARTIAL_MEDIATYPE* d, ULONG e,
-			   ULONG* f, DMO_PARTIAL_MEDIATYPE* g)
+HRESULT build_types(HKEY root, LPCWSTR key, ULONG *supplied, ULONG requested, DMO_PARTIAL_MEDIATYPE* types )
 {
-  FIXME("(%p,%u,%p,%p,%u,%p,%p),stub!\n",a,b,c,d,e,f,g);
+    HRESULT ret = S_OK;
+    HKEY hkey;
+    WCHAR szGuidKey[64];
 
-  return E_NOTIMPL;
+    *supplied = 0;
+    if (ERROR_SUCCESS == RegOpenKeyExW(root, key, 0, KEY_READ, &hkey))
+    {
+      int index = 0;
+      WCHAR szNextKey[MAX_PATH];
+      DWORD len;
+      LONG rc = ERROR_SUCCESS;
+
+      len = MAX_PATH;
+      while (rc == ERROR_SUCCESS)
+      {
+        len = MAX_PATH;
+        rc = RegEnumKeyExW(hkey, index, szNextKey, &len, NULL, NULL, NULL, NULL);
+        if (rc == ERROR_SUCCESS)
+        {
+          HKEY subk;
+          int sub_index = 0;
+          LONG rcs = ERROR_SUCCESS;
+          WCHAR szSubKey[MAX_PATH];
+
+          RegOpenKeyExW(hkey, szNextKey, 0, KEY_READ, &subk);
+          while (rcs == ERROR_SUCCESS)
+          {
+            len = MAX_PATH;
+            rcs = RegEnumKeyExW(subk, sub_index, szSubKey, &len, NULL, NULL, NULL, NULL);
+            if (rcs == ERROR_SUCCESS)
+            {
+              if (*supplied >= requested)
+              {
+                /* Bailing */
+                ret = S_FALSE;
+                rc = ERROR_MORE_DATA;
+                rcs = ERROR_MORE_DATA;
+                break;
+              }
+
+              wsprintfW(szGuidKey,szToGuidFmt,szNextKey);
+              CLSIDFromString(szGuidKey, &types[*supplied].type);
+              wsprintfW(szGuidKey,szToGuidFmt,szSubKey);
+              CLSIDFromString(szGuidKey, &types[*supplied].subtype);
+              TRACE("Adding type %s subtype %s at index %i\n",
+                debugstr_guid(&types[*supplied].type),
+                debugstr_guid(&types[*supplied].subtype),
+                *supplied);
+              (*supplied)++;
+            }
+            sub_index++;
+          }
+          index++;
+        }
+      }
+      RegCloseKey(hkey);
+    }
+    return ret;
+}
+
+
+HRESULT WINAPI DMOGetTypes(REFCLSID clsidDMO,
+               ULONG ulInputTypesRequested,
+               ULONG* pulInputTypesSupplied,
+               DMO_PARTIAL_MEDIATYPE* pInputTypes,
+               ULONG ulOutputTypesRequested,
+               ULONG* pulOutputTypesSupplied,
+               DMO_PARTIAL_MEDIATYPE* pOutputTypes)
+{
+  HKEY root,hkey;
+  HRESULT ret = S_OK;
+  WCHAR szguid[64];
+
+  TRACE ("(%s,%u,%p,%p,%u,%p,%p),stub!\n", debugstr_guid(clsidDMO),
+        ulInputTypesRequested, pulInputTypesSupplied, pInputTypes,
+        ulOutputTypesRequested, pulOutputTypesSupplied, pOutputTypes);
+
+  if (ERROR_SUCCESS != RegOpenKeyExW(HKEY_CLASSES_ROOT, szDMORootKey, 0,
+                                     KEY_READ, &root))
+    return E_FAIL;
+
+  if (ERROR_SUCCESS != RegOpenKeyExW(root,GUIDToString(szguid,clsidDMO) , 0,
+                                     KEY_READ, &hkey))
+  {
+    RegCloseKey(root);
+    return E_FAIL;
+  }
+
+  if (ulInputTypesRequested > 0)
+  {
+    ret = build_types(hkey, szDMOInputType, pulInputTypesSupplied, ulInputTypesRequested, pInputTypes );
+  }
+  else
+    *pulInputTypesSupplied = 0;
+
+  if (ulOutputTypesRequested > 0)
+  {
+    HRESULT ret2;
+    ret2 = build_types(hkey, szDMOOutputType, pulOutputTypesSupplied, ulOutputTypesRequested, pOutputTypes );
+
+    if (ret == S_OK)
+        ret = ret2;
+  }
+  else
+    *pulOutputTypesSupplied = 0;
+
+  return ret;
 }




More information about the wine-cvs mailing list