From: Aaryaman Vasishta Subject: [PATCH 1/7] d3drm: Use a table in CreateObject to create objects in a generic manner. Message-Id: <1466804973-82867-1-git-send-email-jem456.vasishta@gmail.com> Date: Sat, 25 Jun 2016 03:19:27 +0530 Signed-off-by: Aaryaman Vasishta --- 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)