[PATCH 1/7] d3drm: Use a table in CreateObject to create objects in a generic manner.

Aaryaman Vasishta jem456.vasishta at gmail.com
Fri Jun 24 16:49:27 CDT 2016


Signed-off-by: Aaryaman Vasishta <jem456.vasishta at gmail.com>
---
 dlls/d3drm/d3drm.c | 40 +++++++++++++++++++++++++++++++++-------
 1 file changed, 33 insertions(+), 7 deletions(-)

diff --git a/dlls/d3drm/d3drm.c b/dlls/d3drm/d3drm.c
index 8d054b5..7833d81 100644
--- a/dlls/d3drm/d3drm.c
+++ b/dlls/d3drm/d3drm.c
@@ -51,6 +51,19 @@ static const char* get_IID_string(const GUID* guid)
     return "?";
 }
 
+static HRESULT d3drm_create_texture_object(void **object, IDirect3DRM *d3drm)
+{
+    struct d3drm_texture *texture;
+    HRESULT hr;
+
+    if (FAILED(hr = d3drm_texture_create(&texture, d3drm)))
+        return hr;
+
+    *object = &texture->IDirect3DRMTexture_iface;
+
+    return hr;
+}
+
 struct d3drm
 {
     IDirect3DRM IDirect3DRM_iface;
@@ -1107,6 +1120,17 @@ static HRESULT WINAPI d3drm3_CreateObject(IDirect3DRM3 *iface,
     struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
     IUnknown *object;
     HRESULT hr;
+    int i;
+    static const struct
+    {
+        REFCLSID clsid;
+        HRESULT (*create_object)(void **object, IDirect3DRM *d3drm);
+    }
+    object_table[] =
+    {
+        { &CLSID_CDirect3DRMTexture, d3drm_create_texture_object },
+    };
+    int num_entries = sizeof(object_table) / sizeof(*object_table);
 
     TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
             iface, debugstr_guid(clsid), outer, debugstr_guid(iid), out);
@@ -1127,17 +1151,19 @@ static HRESULT WINAPI d3drm3_CreateObject(IDirect3DRM3 *iface,
         return E_NOTIMPL;
     }
 
-    if (IsEqualGUID(clsid, &CLSID_CDirect3DRMTexture))
+    for (i = 0; i < num_entries; ++i)
     {
-        struct d3drm_texture *texture;
-        if (FAILED(hr = d3drm_texture_create(&texture, &d3drm->IDirect3DRM_iface)))
+        if (IsEqualGUID(clsid, object_table[i].clsid))
         {
-            *out = NULL;
-            return hr;
+            if (FAILED(hr = object_table[i].create_object((void **)&object, &d3drm->IDirect3DRM_iface)))
+            {
+                *out = NULL;
+                return hr;
+            }
+            break;
         }
-        object = (IUnknown *)&texture->IDirect3DRMTexture3_iface;
     }
-    else
+    if (i == num_entries)
     {
         FIXME("%s not implemented. Returning CLASSFACTORY_E_FIRST.\n", debugstr_guid(clsid));
         *out = NULL;
-- 
2.3.2 (Apple Git-55)




More information about the wine-patches mailing list