[PATCH 5/6] dinput: Move IDirectInput8 WtoA wrappers to ansi.c.

Rémi Bernon rbernon at codeweavers.com
Fri May 28 04:41:30 CDT 2021


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/dinput/ansi.c           | 251 ++++++++++++++++++++++++-
 dlls/dinput/dinput_main.c    | 354 +----------------------------------
 dlls/dinput/dinput_private.h |   5 +-
 3 files changed, 249 insertions(+), 361 deletions(-)

diff --git a/dlls/dinput/ansi.c b/dlls/dinput/ansi.c
index 910940f3257..f60aa8c729d 100644
--- a/dlls/dinput/ansi.c
+++ b/dlls/dinput/ansi.c
@@ -43,6 +43,22 @@ static IDirectInputDevice8W *IDirectInputDevice8W_from_impl( IDirectInputDeviceI
     return &impl->IDirectInputDevice8W_iface;
 }
 
+static inline IDirectInputDevice8A *IDirectInputDevice8A_from_IDirectInputDevice8W( IDirectInputDevice8W *iface )
+{
+    if (!iface) return NULL;
+    return &CONTAINING_RECORD( iface, IDirectInputDeviceImpl, IDirectInputDevice8W_iface )->IDirectInputDevice8A_iface;
+}
+
+static IDirectInputImpl *impl_from_IDirectInput8A( IDirectInput8A *iface )
+{
+    return CONTAINING_RECORD( iface, IDirectInputImpl, IDirectInput8A_iface );
+}
+
+static IDirectInput8W *IDirectInput8W_from_impl( IDirectInputImpl *impl )
+{
+    return &impl->IDirectInput8W_iface;
+}
+
 static void dideviceobjectinstance_wtoa( const DIDEVICEOBJECTINSTANCEW *in, DIDEVICEOBJECTINSTANCEA *out )
 {
     out->guidType = in->guidType;
@@ -135,14 +151,15 @@ static void diactionformat_wtoa( const DIACTIONFORMATW *in, DIACTIONFORMATA *out
                          sizeof(out->tszActionMap), NULL, NULL );
 }
 
-static void diactionformat_atow( const DIACTIONFORMATA *in, DIACTIONFORMATW *out )
+static HRESULT diactionformat_atow( const DIACTIONFORMATA *in, DIACTIONFORMATW *out, BOOL convert_names )
 {
+    HRESULT hr = DI_OK;
     DWORD i;
 
     out->dwDataSize = in->dwDataSize;
     out->dwNumActions = in->dwNumActions;
 
-    for (i = 0; i < out->dwNumActions; ++i)
+    for (i = 0; i < out->dwNumActions && !FAILED(hr); ++i)
     {
         out->rgoAction[i].uAppData = in->rgoAction[i].uAppData;
         out->rgoAction[i].dwSemantic = in->rgoAction[i].dwSemantic;
@@ -150,9 +167,13 @@ static void diactionformat_atow( const DIACTIONFORMATA *in, DIACTIONFORMATW *out
         out->rgoAction[i].guidInstance = in->rgoAction[i].guidInstance;
         out->rgoAction[i].dwObjID = in->rgoAction[i].dwObjID;
         out->rgoAction[i].dwHow = in->rgoAction[i].dwHow;
-        out->rgoAction[i].lptszActionName = 0;
+        if (!convert_names) out->rgoAction[i].lptszActionName = 0;
+        else if (in->hInstString) out->rgoAction[i].uResIdString = in->rgoAction[i].uResIdString;
+        else hr = string_atow( in->rgoAction[i].lptszActionName, (WCHAR **)&out->rgoAction[i].lptszActionName );
     }
 
+    for (; i < out->dwNumActions; ++i) out->rgoAction[i].lptszActionName = 0;
+
     out->guidActionMap = in->guidActionMap;
     out->dwGenre = in->dwGenre;
     out->dwBufferSize = in->dwBufferSize;
@@ -164,6 +185,8 @@ static void diactionformat_atow( const DIACTIONFORMATA *in, DIACTIONFORMATW *out
 
     MultiByteToWideChar( CP_ACP, 0, in->tszActionMap, -1, out->tszActionMap,
                          sizeof(out->tszActionMap) / sizeof(WCHAR) );
+
+    return hr;
 }
 
 static void dideviceimageinfo_wtoa( const DIDEVICEIMAGEINFOW *in, DIDEVICEIMAGEINFOA *out )
@@ -202,6 +225,33 @@ static void dideviceimageinfoheader_wtoa( const DIDEVICEIMAGEINFOHEADERW *in, DI
     }
 }
 
+static HRESULT diconfiguredevicesparams_atow( const DICONFIGUREDEVICESPARAMSA *in, DICONFIGUREDEVICESPARAMSW *out )
+{
+    const char *name_a = in->lptszUserNames;
+    DWORD len_w, len_a;
+
+    if (!in->lptszUserNames) out->lptszUserNames = NULL;
+    else
+    {
+        while (name_a[0] && name_a[1]) ++name_a;
+        len_a = name_a - in->lptszUserNames + 1;
+        len_w = MultiByteToWideChar( CP_ACP, 0, in->lptszUserNames, len_a, NULL, 0 );
+
+        out->lptszUserNames = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, len_w * sizeof(WCHAR) );
+        if (!out->lptszUserNames) return DIERR_OUTOFMEMORY;
+
+        MultiByteToWideChar( CP_ACP, 0, in->lptszUserNames, len_a, out->lptszUserNames, len_w );
+    }
+
+    out->dwcUsers = in->dwcUsers;
+    out->dwcFormats = in->dwcFormats;
+    out->hwnd = in->hwnd;
+    out->dics = in->dics;
+    out->lpUnkDDSTarget = in->lpUnkDDSTarget;
+
+    return DI_OK;
+}
+
 static HRESULT WINAPI dinput_device_a_QueryInterface( IDirectInputDevice8A *iface_a, REFIID iid, void **out )
 {
     IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
@@ -511,7 +561,7 @@ static HRESULT WINAPI dinput_device_a_BuildActionMap( IDirectInputDevice8A *ifac
     if (!format_w.rgoAction) hr = DIERR_OUTOFMEMORY;
     else
     {
-        diactionformat_atow( format_a, &format_w );
+        diactionformat_atow( format_a, &format_w, FALSE );
         hr = IDirectInputDevice8_BuildActionMap( iface_w, &format_w, username_w, flags );
         diactionformat_wtoa( &format_w, format_a );
         HeapFree( GetProcessHeap(), 0, format_w.rgoAction );
@@ -540,7 +590,7 @@ static HRESULT WINAPI dinput_device_a_SetActionMap( IDirectInputDevice8A *iface_
     if (!format_w.rgoAction) hr = DIERR_OUTOFMEMORY;
     else
     {
-        diactionformat_atow( format_a, &format_w );
+        diactionformat_atow( format_a, &format_w, FALSE );
         hr = IDirectInputDevice8_SetActionMap( iface_w, &format_w, username_w, flags );
         diactionformat_wtoa( &format_w, format_a );
         HeapFree( GetProcessHeap(), 0, format_w.rgoAction );
@@ -611,3 +661,194 @@ const IDirectInputDevice8AVtbl dinput_device_a_vtbl =
     dinput_device_a_SetActionMap,
     dinput_device_a_GetImageInfo,
 };
+
+static HRESULT WINAPI dinput8_a_QueryInterface( IDirectInput8A *iface_a, REFIID iid, void **out )
+{
+    IDirectInputImpl *impl = impl_from_IDirectInput8A( iface_a );
+    IDirectInput8W *iface_w = IDirectInput8W_from_impl( impl );
+    return IDirectInput8_QueryInterface( iface_w, iid, out );
+}
+
+static ULONG WINAPI dinput8_a_AddRef( IDirectInput8A *iface_a )
+{
+    IDirectInputImpl *impl = impl_from_IDirectInput8A( iface_a );
+    IDirectInput8W *iface_w = IDirectInput8W_from_impl( impl );
+    return IDirectInput8_AddRef( iface_w );
+}
+
+static ULONG WINAPI dinput8_a_Release( IDirectInput8A *iface_a )
+{
+    IDirectInputImpl *impl = impl_from_IDirectInput8A( iface_a );
+    IDirectInput8W *iface_w = IDirectInput8W_from_impl( impl );
+    return IDirectInput8_Release( iface_w );
+}
+
+static HRESULT WINAPI dinput8_a_CreateDevice( IDirectInput8A *iface_a, REFGUID guid, IDirectInputDevice8A **out, IUnknown *outer )
+{
+    IDirectInputImpl *impl = impl_from_IDirectInput8A( iface_a );
+    IDirectInput8W *iface_w = IDirectInput8W_from_impl( impl );
+    IDirectInputDevice8W *outw;
+    HRESULT hr;
+
+    if (!out) return E_POINTER;
+
+    hr = IDirectInput8_CreateDevice( iface_w, guid, &outw, outer );
+    *out = IDirectInputDevice8A_from_IDirectInputDevice8W( outw );
+    return hr;
+}
+
+struct enum_devices_wtoa_params
+{
+    LPDIENUMDEVICESCALLBACKA callback;
+    void *ref;
+};
+
+static BOOL CALLBACK enum_devices_wtoa_callback( const DIDEVICEINSTANCEW *instance_w, void *data )
+{
+    struct enum_devices_wtoa_params *params = data;
+    DIDEVICEINSTANCEA instance_a = {sizeof(instance_a)};
+
+    dideviceinstance_wtoa( instance_w, &instance_a );
+    return params->callback( &instance_a, params->ref );
+}
+
+static HRESULT WINAPI dinput8_a_EnumDevices( IDirectInput8A *iface_a, DWORD type, LPDIENUMDEVICESCALLBACKA callback,
+                                            void *ref, DWORD flags )
+{
+    struct enum_devices_wtoa_params params = {callback, ref};
+    IDirectInputImpl *impl = impl_from_IDirectInput8A( iface_a );
+    IDirectInput8W *iface_w = IDirectInput8W_from_impl( impl );
+
+    if (!callback) return DIERR_INVALIDPARAM;
+
+    return IDirectInput8_EnumDevices( iface_w, type, enum_devices_wtoa_callback, &params, flags );
+}
+
+static HRESULT WINAPI dinput8_a_GetDeviceStatus( IDirectInput8A *iface_a, REFGUID instance_guid )
+{
+    IDirectInputImpl *impl = impl_from_IDirectInput8A( iface_a );
+    IDirectInput8W *iface_w = IDirectInput8W_from_impl( impl );
+    return IDirectInput8_GetDeviceStatus( iface_w, instance_guid );
+}
+
+static HRESULT WINAPI dinput8_a_RunControlPanel( IDirectInput8A *iface_a, HWND owner, DWORD flags )
+{
+    IDirectInputImpl *impl = impl_from_IDirectInput8A( iface_a );
+    IDirectInput8W *iface_w = IDirectInput8W_from_impl( impl );
+    return IDirectInput8_RunControlPanel( iface_w, owner, flags );
+}
+
+static HRESULT WINAPI dinput8_a_Initialize( IDirectInput8A *iface_a, HINSTANCE instance, DWORD version )
+{
+    IDirectInputImpl *impl = impl_from_IDirectInput8A( iface_a );
+    IDirectInput8W *iface_w = IDirectInput8W_from_impl( impl );
+    return IDirectInput8_Initialize( iface_w, instance, version );
+}
+
+static HRESULT WINAPI dinput8_a_FindDevice( IDirectInput8A *iface_a, REFGUID guid, const char *name_a, GUID *instance_guid )
+{
+    IDirectInputImpl *impl = impl_from_IDirectInput8A( iface_a );
+    IDirectInput8W *iface_w = IDirectInput8W_from_impl( impl );
+    HRESULT hr;
+    WCHAR *name_w;
+
+    if (FAILED(hr = string_atow( name_a, &name_w ))) return hr;
+
+    hr = IDirectInput8_FindDevice( iface_w, guid, name_w, instance_guid );
+    HeapFree( GetProcessHeap(), 0, name_w );
+    return hr;
+}
+
+struct enum_devices_by_semantics_wtoa_params
+{
+    LPDIENUMDEVICESBYSEMANTICSCBA callback;
+    void *ref;
+};
+
+static BOOL CALLBACK enum_devices_by_semantics_wtoa_callback( const DIDEVICEINSTANCEW *instance_w, IDirectInputDevice8W *iface_w,
+                                                              DWORD flags, DWORD remaining, void *data )
+{
+    struct enum_devices_by_semantics_wtoa_params *params = data;
+    IDirectInputDevice8A *iface_a = IDirectInputDevice8A_from_IDirectInputDevice8W( iface_w );
+    DIDEVICEINSTANCEA instance_a = {sizeof(instance_a)};
+
+    dideviceinstance_wtoa( instance_w, &instance_a );
+    return params->callback( &instance_a, iface_a, flags, remaining, params->ref );
+}
+
+static HRESULT WINAPI dinput8_a_EnumDevicesBySemantics( IDirectInput8A *iface_a, const char *username_a, DIACTIONFORMATA *format_a,
+                                                       LPDIENUMDEVICESBYSEMANTICSCBA callback, void *ref, DWORD flags )
+{
+    struct enum_devices_by_semantics_wtoa_params params = {callback, ref};
+    IDirectInputImpl *impl = impl_from_IDirectInput8A( iface_a );
+    DIACTIONFORMATW format_w = {sizeof(format_w), sizeof(DIACTIONW)};
+    IDirectInput8W *iface_w = IDirectInput8W_from_impl( impl );
+    HRESULT hr;
+    WCHAR *username_w;
+
+    if (!callback) return DIERR_INVALIDPARAM;
+    if (FAILED(hr = string_atow( username_a, &username_w ))) return hr;
+
+    format_w.dwNumActions = format_a->dwNumActions;
+    format_w.rgoAction = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, format_a->dwNumActions * sizeof(DIACTIONW) );
+    if (!format_w.rgoAction) hr = DIERR_OUTOFMEMORY;
+    else
+    {
+        diactionformat_atow( format_a, &format_w, FALSE );
+        hr = IDirectInput8_EnumDevicesBySemantics( iface_w, username_w, &format_w, enum_devices_by_semantics_wtoa_callback,
+                                                   &params, flags );
+        HeapFree( GetProcessHeap(), 0, format_w.rgoAction );
+    }
+
+    HeapFree( GetProcessHeap(), 0, username_w );
+    return hr;
+}
+
+static HRESULT WINAPI dinput8_a_ConfigureDevices( IDirectInput8A *iface_a, LPDICONFIGUREDEVICESCALLBACK callback,
+                                                 DICONFIGUREDEVICESPARAMSA *params_a, DWORD flags, void *ref )
+{
+    IDirectInputImpl *impl = impl_from_IDirectInput8A( iface_a );
+    IDirectInput8W *iface_w = IDirectInput8W_from_impl( impl );
+    DICONFIGUREDEVICESPARAMSW params_w = {sizeof(params_w)};
+    DIACTIONFORMATA *format_a = params_a->lprgFormats;
+    DIACTIONFORMATW format_w = {sizeof(format_w), sizeof(DIACTIONW)};
+    HRESULT hr;
+    DWORD i;
+
+    if (!callback) return DIERR_INVALIDPARAM;
+    if (FAILED(hr = diconfiguredevicesparams_atow( params_a, &params_w ))) return hr;
+
+    format_w.dwNumActions = format_a->dwNumActions;
+    format_w.rgoAction = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, format_a->dwNumActions * sizeof(DIACTIONW) );
+    if (!format_w.rgoAction) hr = DIERR_OUTOFMEMORY;
+    else
+    {
+        hr = diactionformat_atow( format_a, &format_w, TRUE );
+        params_w.lprgFormats = &format_w;
+
+        if (SUCCEEDED(hr)) hr = IDirectInput8_ConfigureDevices( iface_w, callback, &params_w, flags, ref );
+
+        if (!format_w.hInstString) for (i = 0; i < format_w.dwNumActions; ++i) HeapFree( GetProcessHeap(), 0, (void *)format_w.rgoAction[i].lptszActionName );
+        HeapFree( GetProcessHeap(), 0, format_w.rgoAction );
+    }
+
+    HeapFree( GetProcessHeap(), 0, params_w.lptszUserNames );
+    return hr;
+}
+
+const IDirectInput8AVtbl dinput8_a_vtbl =
+{
+    /*** IUnknown methods ***/
+    dinput8_a_QueryInterface,
+    dinput8_a_AddRef,
+    dinput8_a_Release,
+    /*** IDirectInput8A methods ***/
+    dinput8_a_CreateDevice,
+    dinput8_a_EnumDevices,
+    dinput8_a_GetDeviceStatus,
+    dinput8_a_RunControlPanel,
+    dinput8_a_Initialize,
+    dinput8_a_FindDevice,
+    dinput8_a_EnumDevicesBySemantics,
+    dinput8_a_ConfigureDevices,
+};
diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c
index 3b0de2fbde0..1591779544a 100644
--- a/dlls/dinput/dinput_main.c
+++ b/dlls/dinput/dinput_main.c
@@ -57,7 +57,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(dinput);
 
 static const IDirectInput7AVtbl ddi7avt;
 static const IDirectInput7WVtbl ddi7wvt;
-static const IDirectInput8AVtbl ddi8avt;
 static const IDirectInput8WVtbl ddi8wvt;
 static const IDirectInputJoyConfig8Vtbl JoyConfig8vt;
 
@@ -71,11 +70,6 @@ static inline IDirectInputImpl *impl_from_IDirectInput7W( IDirectInput7W *iface
     return CONTAINING_RECORD( iface, IDirectInputImpl, IDirectInput7W_iface );
 }
 
-static inline IDirectInputImpl *impl_from_IDirectInput8A( IDirectInput8A *iface )
-{
-    return CONTAINING_RECORD( iface, IDirectInputImpl, IDirectInput8A_iface );
-}
-
 static inline IDirectInputImpl *impl_from_IDirectInput8W( IDirectInput8W *iface )
 {
     return CONTAINING_RECORD( iface, IDirectInputImpl, IDirectInput8W_iface );
@@ -144,7 +138,7 @@ static HRESULT create_directinput_instance(REFIID riid, LPVOID *ppDI, IDirectInp
 
     This->IDirectInput7A_iface.lpVtbl = &ddi7avt;
     This->IDirectInput7W_iface.lpVtbl = &ddi7wvt;
-    This->IDirectInput8A_iface.lpVtbl = &ddi8avt;
+    This->IDirectInput8A_iface.lpVtbl = &dinput8_a_vtbl;
     This->IDirectInput8W_iface.lpVtbl = &ddi8wvt;
     This->IDirectInputJoyConfig8_iface.lpVtbl = &JoyConfig8vt;
 
@@ -321,110 +315,6 @@ static void _dump_EnumDevices_dwFlags(DWORD dwFlags)
     TRACE("\n");
 }
 
-static void _dump_diactionformatA(LPDIACTIONFORMATA lpdiActionFormat)
-{
-    unsigned int i;
-
-    TRACE("diaf.dwSize = %d\n", lpdiActionFormat->dwSize);
-    TRACE("diaf.dwActionSize = %d\n", lpdiActionFormat->dwActionSize);
-    TRACE("diaf.dwDataSize = %d\n", lpdiActionFormat->dwDataSize);
-    TRACE("diaf.dwNumActions = %d\n", lpdiActionFormat->dwNumActions);
-    TRACE("diaf.rgoAction = %p\n", lpdiActionFormat->rgoAction);
-    TRACE("diaf.guidActionMap = %s\n", debugstr_guid(&lpdiActionFormat->guidActionMap));
-    TRACE("diaf.dwGenre = 0x%08x\n", lpdiActionFormat->dwGenre);
-    TRACE("diaf.dwBufferSize = %d\n", lpdiActionFormat->dwBufferSize);
-    TRACE("diaf.lAxisMin = %d\n", lpdiActionFormat->lAxisMin);
-    TRACE("diaf.lAxisMax = %d\n", lpdiActionFormat->lAxisMax);
-    TRACE("diaf.hInstString = %p\n", lpdiActionFormat->hInstString);
-    TRACE("diaf.ftTimeStamp ...\n");
-    TRACE("diaf.dwCRC = 0x%x\n", lpdiActionFormat->dwCRC);
-    TRACE("diaf.tszActionMap = %s\n", debugstr_a(lpdiActionFormat->tszActionMap));
-    for (i = 0; i < lpdiActionFormat->dwNumActions; i++)
-    {
-        TRACE("diaf.rgoAction[%u]:\n", i);
-        TRACE("\tuAppData=0x%lx\n", lpdiActionFormat->rgoAction[i].uAppData);
-        TRACE("\tdwSemantic=0x%08x\n", lpdiActionFormat->rgoAction[i].dwSemantic);
-        TRACE("\tdwFlags=0x%x\n", lpdiActionFormat->rgoAction[i].dwFlags);
-        TRACE("\tszActionName=%s\n", debugstr_a(lpdiActionFormat->rgoAction[i].u.lptszActionName));
-        TRACE("\tguidInstance=%s\n", debugstr_guid(&lpdiActionFormat->rgoAction[i].guidInstance));
-        TRACE("\tdwObjID=0x%x\n", lpdiActionFormat->rgoAction[i].dwObjID);
-        TRACE("\tdwHow=0x%x\n", lpdiActionFormat->rgoAction[i].dwHow);
-    }
-}
-
-void _copy_diactionformatAtoW(LPDIACTIONFORMATW to, LPDIACTIONFORMATA from)
-{
-    int i;
-
-    to->dwSize = sizeof(DIACTIONFORMATW);
-    to->dwActionSize = sizeof(DIACTIONW);
-    to->dwDataSize = from->dwDataSize;
-    to->dwNumActions = from->dwNumActions;
-    to->guidActionMap = from->guidActionMap;
-    to->dwGenre = from->dwGenre;
-    to->dwBufferSize = from->dwBufferSize;
-    to->lAxisMin = from->lAxisMin;
-    to->lAxisMax = from->lAxisMax;
-    to->dwCRC = from->dwCRC;
-    to->ftTimeStamp = from->ftTimeStamp;
-
-    for (i=0; i < to->dwNumActions; i++)
-    {
-        to->rgoAction[i].uAppData = from->rgoAction[i].uAppData;
-        to->rgoAction[i].dwSemantic = from->rgoAction[i].dwSemantic;
-        to->rgoAction[i].dwFlags = from->rgoAction[i].dwFlags;
-        to->rgoAction[i].guidInstance = from->rgoAction[i].guidInstance;
-        to->rgoAction[i].dwObjID = from->rgoAction[i].dwObjID;
-        to->rgoAction[i].dwHow = from->rgoAction[i].dwHow;
-    }
-}
-
-void _copy_diactionformatWtoA(LPDIACTIONFORMATA to, LPDIACTIONFORMATW from)
-{
-    int i;
-
-    to->dwSize = sizeof(DIACTIONFORMATA);
-    to->dwActionSize = sizeof(DIACTIONA);
-    to->dwDataSize = from->dwDataSize;
-    to->dwNumActions = from->dwNumActions;
-    to->guidActionMap = from->guidActionMap;
-    to->dwGenre = from->dwGenre;
-    to->dwBufferSize = from->dwBufferSize;
-    to->lAxisMin = from->lAxisMin;
-    to->lAxisMax = from->lAxisMax;
-    to->dwCRC = from->dwCRC;
-    to->ftTimeStamp = from->ftTimeStamp;
-
-    for (i=0; i < to->dwNumActions; i++)
-    {
-        to->rgoAction[i].uAppData = from->rgoAction[i].uAppData;
-        to->rgoAction[i].dwSemantic = from->rgoAction[i].dwSemantic;
-        to->rgoAction[i].dwFlags = from->rgoAction[i].dwFlags;
-        to->rgoAction[i].guidInstance = from->rgoAction[i].guidInstance;
-        to->rgoAction[i].dwObjID = from->rgoAction[i].dwObjID;
-        to->rgoAction[i].dwHow = from->rgoAction[i].dwHow;
-    }
-}
-
-/* diactionformat_priority
- *
- *  Given a DIACTIONFORMAT structure and a DI genre, returns the enumeration
- *  priority. Joysticks should pass the game genre, and mouse or keyboard their
- *  respective DI*_MASK
- */
-static DWORD diactionformat_priorityA(LPDIACTIONFORMATA lpdiaf, DWORD genre)
-{
-    int i;
-    DWORD priorityFlags = 0;
-
-    /* If there's at least one action for the device it's priority 1 */
-    for(i=0; i < lpdiaf->dwNumActions; i++)
-        if ((lpdiaf->rgoAction[i].dwSemantic & genre) == genre)
-            priorityFlags |= DIEDBS_MAPPEDPRI1;
-
-    return priorityFlags;
-}
-
 static DWORD diactionformat_priorityW(LPDIACTIONFORMATW lpdiaf, DWORD genre)
 {
     int i;
@@ -910,49 +800,24 @@ static HRESULT WINAPI IDirectInputWImpl_CreateDevice(LPDIRECTINPUT7W iface, REFG
  *      DirectInput8
  */
 
-static ULONG WINAPI IDirectInput8AImpl_AddRef(LPDIRECTINPUT8A iface)
-{
-    IDirectInputImpl *This = impl_from_IDirectInput8A( iface );
-    return IDirectInput_AddRef( &This->IDirectInput7A_iface );
-}
-
 static ULONG WINAPI IDirectInput8WImpl_AddRef(LPDIRECTINPUT8W iface)
 {
     IDirectInputImpl *This = impl_from_IDirectInput8W( iface );
     return IDirectInput_AddRef( &This->IDirectInput7W_iface );
 }
 
-static HRESULT WINAPI IDirectInput8AImpl_QueryInterface(LPDIRECTINPUT8A iface, REFIID riid, LPVOID *ppobj)
-{
-    IDirectInputImpl *This = impl_from_IDirectInput8A( iface );
-    return IDirectInput_QueryInterface( &This->IDirectInput7A_iface, riid, ppobj );
-}
-
 static HRESULT WINAPI IDirectInput8WImpl_QueryInterface(LPDIRECTINPUT8W iface, REFIID riid, LPVOID *ppobj)
 {
     IDirectInputImpl *This = impl_from_IDirectInput8W( iface );
     return IDirectInput_QueryInterface( &This->IDirectInput7W_iface, riid, ppobj );
 }
 
-static ULONG WINAPI IDirectInput8AImpl_Release(LPDIRECTINPUT8A iface)
-{
-    IDirectInputImpl *This = impl_from_IDirectInput8A( iface );
-    return IDirectInput_Release( &This->IDirectInput7A_iface );
-}
-
 static ULONG WINAPI IDirectInput8WImpl_Release(LPDIRECTINPUT8W iface)
 {
     IDirectInputImpl *This = impl_from_IDirectInput8W( iface );
     return IDirectInput_Release( &This->IDirectInput7W_iface );
 }
 
-static HRESULT WINAPI IDirectInput8AImpl_CreateDevice(LPDIRECTINPUT8A iface, REFGUID rguid,
-                                                      LPDIRECTINPUTDEVICE8A* pdev, LPUNKNOWN punk)
-{
-    IDirectInputImpl *This = impl_from_IDirectInput8A( iface );
-    return IDirectInput7_CreateDeviceEx( &This->IDirectInput7A_iface, rguid, NULL, (LPVOID *)pdev, punk );
-}
-
 static HRESULT WINAPI IDirectInput8WImpl_CreateDevice(LPDIRECTINPUT8W iface, REFGUID rguid,
                                                       LPDIRECTINPUTDEVICE8W* pdev, LPUNKNOWN punk)
 {
@@ -960,13 +825,6 @@ static HRESULT WINAPI IDirectInput8WImpl_CreateDevice(LPDIRECTINPUT8W iface, REF
     return IDirectInput7_CreateDeviceEx( &This->IDirectInput7W_iface, rguid, NULL, (LPVOID *)pdev, punk );
 }
 
-static HRESULT WINAPI IDirectInput8AImpl_EnumDevices(LPDIRECTINPUT8A iface, DWORD dwDevType, LPDIENUMDEVICESCALLBACKA lpCallback,
-                                                     LPVOID pvRef, DWORD dwFlags)
-{
-    IDirectInputImpl *This = impl_from_IDirectInput8A( iface );
-    return IDirectInput_EnumDevices( &This->IDirectInput7A_iface, dwDevType, lpCallback, pvRef, dwFlags );
-}
-
 static HRESULT WINAPI IDirectInput8WImpl_EnumDevices(LPDIRECTINPUT8W iface, DWORD dwDevType, LPDIENUMDEVICESCALLBACKW lpCallback,
                                                      LPVOID pvRef, DWORD dwFlags)
 {
@@ -974,24 +832,12 @@ static HRESULT WINAPI IDirectInput8WImpl_EnumDevices(LPDIRECTINPUT8W iface, DWOR
     return IDirectInput_EnumDevices( &This->IDirectInput7W_iface, dwDevType, lpCallback, pvRef, dwFlags );
 }
 
-static HRESULT WINAPI IDirectInput8AImpl_GetDeviceStatus(LPDIRECTINPUT8A iface, REFGUID rguid)
-{
-    IDirectInputImpl *This = impl_from_IDirectInput8A( iface );
-    return IDirectInput_GetDeviceStatus( &This->IDirectInput7A_iface, rguid );
-}
-
 static HRESULT WINAPI IDirectInput8WImpl_GetDeviceStatus(LPDIRECTINPUT8W iface, REFGUID rguid)
 {
     IDirectInputImpl *This = impl_from_IDirectInput8W( iface );
     return IDirectInput_GetDeviceStatus( &This->IDirectInput7W_iface, rguid );
 }
 
-static HRESULT WINAPI IDirectInput8AImpl_RunControlPanel(LPDIRECTINPUT8A iface, HWND hwndOwner, DWORD dwFlags)
-{
-    IDirectInputImpl *This = impl_from_IDirectInput8A( iface );
-    return IDirectInput_RunControlPanel( &This->IDirectInput7A_iface, hwndOwner, dwFlags );
-}
-
 static HRESULT WINAPI IDirectInput8WImpl_RunControlPanel(LPDIRECTINPUT8W iface, HWND hwndOwner, DWORD dwFlags)
 {
     IDirectInputImpl *This = impl_from_IDirectInput8W( iface );
@@ -1016,18 +862,6 @@ static HRESULT WINAPI IDirectInput8WImpl_Initialize( IDirectInput8W *iface, HINS
     return initialize_directinput_instance(This, version);
 }
 
-static HRESULT WINAPI IDirectInput8AImpl_Initialize( IDirectInput8A *iface, HINSTANCE hinst, DWORD version )
-{
-    IDirectInputImpl *This = impl_from_IDirectInput8A( iface );
-    return IDirectInput8_Initialize( &This->IDirectInput8W_iface, hinst, version );
-}
-
-static HRESULT WINAPI IDirectInput8AImpl_FindDevice(LPDIRECTINPUT8A iface, REFGUID rguid, LPCSTR pszName, LPGUID pguidInstance)
-{
-    IDirectInputImpl *This = impl_from_IDirectInput8A( iface );
-    return IDirectInput2_FindDevice( &This->IDirectInput7A_iface, rguid, pszName, pguidInstance );
-}
-
 static HRESULT WINAPI IDirectInput8WImpl_FindDevice(LPDIRECTINPUT8W iface, REFGUID rguid, LPCWSTR pszName, LPGUID pguidInstance)
 {
     IDirectInputImpl *This = impl_from_IDirectInput8W( iface );
@@ -1075,130 +909,6 @@ static BOOL should_enumerate_device(const WCHAR *username, DWORD dwFlags,
     return should_enumerate;
 }
 
-static HRESULT WINAPI IDirectInput8AImpl_EnumDevicesBySemantics(
-      LPDIRECTINPUT8A iface, LPCSTR ptszUserName, LPDIACTIONFORMATA lpdiActionFormat,
-      LPDIENUMDEVICESBYSEMANTICSCBA lpCallback,
-      LPVOID pvRef, DWORD dwFlags
-)
-{
-    static REFGUID guids[2] = { &GUID_SysKeyboard, &GUID_SysMouse };
-    static const DWORD actionMasks[] = { DIKEYBOARD_MASK, DIMOUSE_MASK };
-    IDirectInputImpl *This = impl_from_IDirectInput8A( iface );
-    DIDEVICEINSTANCEA didevi;
-    LPDIRECTINPUTDEVICE8A lpdid;
-    DWORD callbackFlags;
-    int i, j;
-    int device_count = 0;
-    int remain;
-    DIDEVICEINSTANCEA *didevis = 0;
-    WCHAR *username_w = 0;
-
-    FIXME("(this=%p,%s,%p,%p,%p,%04x): semi-stub\n", This, debugstr_a(ptszUserName), lpdiActionFormat,
-          lpCallback, pvRef, dwFlags);
-#define X(x) if (dwFlags & x) FIXME("\tdwFlags |= "#x"\n");
-	X(DIEDBSFL_ATTACHEDONLY)
-	X(DIEDBSFL_THISUSER)
-	X(DIEDBSFL_FORCEFEEDBACK)
-	X(DIEDBSFL_AVAILABLEDEVICES)
-	X(DIEDBSFL_MULTIMICEKEYBOARDS)
-	X(DIEDBSFL_NONGAMINGDEVICES)
-#undef X
-
-    _dump_diactionformatA(lpdiActionFormat);
-
-    didevi.dwSize = sizeof(didevi);
-
-    if (ptszUserName)
-    {
-        int len = MultiByteToWideChar(CP_ACP, 0, ptszUserName, -1, 0, 0);
-
-        username_w = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*len);
-        MultiByteToWideChar(CP_ACP, 0, ptszUserName, -1, username_w, len);
-    }
-
-    /* Enumerate all the joysticks */
-    for (i = 0; i < ARRAY_SIZE(dinput_devices); i++)
-    {
-        HRESULT enumSuccess;
-
-        if (!dinput_devices[i]->enum_deviceA) continue;
-
-        for (j = 0, enumSuccess = S_OK; SUCCEEDED(enumSuccess); j++)
-        {
-            TRACE(" - checking device %u ('%s')\n", i, dinput_devices[i]->name);
-
-            /* Default behavior is to enumerate attached game controllers */
-            enumSuccess = dinput_devices[i]->enum_deviceA(DI8DEVCLASS_GAMECTRL, DIEDFL_ATTACHEDONLY | dwFlags, &didevi, This->dwVersion, j);
-            if (enumSuccess == S_OK &&
-                should_enumerate_device(username_w, dwFlags, &This->device_players, &didevi.guidInstance))
-            {
-                if (device_count++)
-                    didevis = HeapReAlloc(GetProcessHeap(), 0, didevis, sizeof(DIDEVICEINSTANCEA)*device_count);
-                else
-                    didevis = HeapAlloc(GetProcessHeap(), 0, sizeof(DIDEVICEINSTANCEA)*device_count);
-                didevis[device_count-1] = didevi;
-            }
-        }
-    }
-
-    remain = device_count;
-    /* Add keyboard and mouse to remaining device count */
-    if (!(dwFlags & DIEDBSFL_FORCEFEEDBACK))
-    {
-        for (i = 0; i < ARRAY_SIZE(guids); i++)
-        {
-            if (should_enumerate_device(username_w, dwFlags, &This->device_players, guids[i]))
-                remain++;
-        }
-    }
-
-    for (i = 0; i < device_count; i++)
-    {
-        callbackFlags = diactionformat_priorityA(lpdiActionFormat, lpdiActionFormat->dwGenre);
-        IDirectInput_CreateDevice(iface, &didevis[i].guidInstance, &lpdid, NULL);
-
-        if (lpCallback(&didevis[i], lpdid, callbackFlags, --remain, pvRef) == DIENUM_STOP)
-        {
-            IDirectInputDevice_Release(lpdid);
-            HeapFree(GetProcessHeap(), 0, didevis);
-            HeapFree(GetProcessHeap(), 0, username_w);
-            return DI_OK;
-        }
-        IDirectInputDevice_Release(lpdid);
-    }
-
-    HeapFree(GetProcessHeap(), 0, didevis);
-
-    if (dwFlags & DIEDBSFL_FORCEFEEDBACK)
-    {
-        HeapFree(GetProcessHeap(), 0, username_w);
-        return DI_OK;
-    }
-
-    /* Enumerate keyboard and mouse */
-    for (i = 0; i < ARRAY_SIZE(guids); i++)
-    {
-        if (should_enumerate_device(username_w, dwFlags, &This->device_players, guids[i]))
-        {
-            callbackFlags = diactionformat_priorityA(lpdiActionFormat, actionMasks[i]);
-
-            IDirectInput_CreateDevice(iface, guids[i], &lpdid, NULL);
-            IDirectInputDevice_GetDeviceInfo(lpdid, &didevi);
-
-            if (lpCallback(&didevi, lpdid, callbackFlags, --remain, pvRef) == DIENUM_STOP)
-            {
-                IDirectInputDevice_Release(lpdid);
-                HeapFree(GetProcessHeap(), 0, username_w);
-                return DI_OK;
-            }
-            IDirectInputDevice_Release(lpdid);
-        }
-    }
-
-    HeapFree(GetProcessHeap(), 0, username_w);
-    return DI_OK;
-}
-
 static HRESULT WINAPI IDirectInput8WImpl_EnumDevicesBySemantics(
       LPDIRECTINPUT8W iface, LPCWSTR ptszUserName, LPDIACTIONFORMATW lpdiActionFormat,
       LPDIENUMDEVICESBYSEMANTICSCBW lpCallback,
@@ -1304,54 +1014,6 @@ static HRESULT WINAPI IDirectInput8WImpl_ConfigureDevices(
     return _configure_devices(iface, lpdiCallback, lpdiCDParams, dwFlags, pvRefData);
 }
 
-static HRESULT WINAPI IDirectInput8AImpl_ConfigureDevices(
-      LPDIRECTINPUT8A iface, LPDICONFIGUREDEVICESCALLBACK lpdiCallback,
-      LPDICONFIGUREDEVICESPARAMSA lpdiCDParams, DWORD dwFlags, LPVOID pvRefData
-)
-{
-    IDirectInputImpl *This = impl_from_IDirectInput8A(iface);
-    DIACTIONFORMATW diafW;
-    DICONFIGUREDEVICESPARAMSW diCDParamsW;
-    HRESULT hr;
-    int i;
-
-     FIXME("(this=%p,%p,%p,%04x,%p): stub\n", This, lpdiCallback, lpdiCDParams, dwFlags, pvRefData);
-
-    /* Copy parameters */
-    diCDParamsW.dwSize = sizeof(DICONFIGUREDEVICESPARAMSW);
-    diCDParamsW.dwcFormats = lpdiCDParams->dwcFormats;
-    diCDParamsW.lprgFormats = &diafW;
-    diCDParamsW.hwnd = lpdiCDParams->hwnd;
-
-    diafW.rgoAction = HeapAlloc(GetProcessHeap(), 0, sizeof(DIACTIONW)*lpdiCDParams->lprgFormats->dwNumActions);
-    _copy_diactionformatAtoW(&diafW, lpdiCDParams->lprgFormats);
-
-    /* Copy action names */
-    for (i=0; i < diafW.dwNumActions; i++)
-    {
-        const char* from = lpdiCDParams->lprgFormats->rgoAction[i].u.lptszActionName;
-        int len = MultiByteToWideChar(CP_ACP, 0, from , -1, NULL , 0);
-        WCHAR *to = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*len);
-
-        MultiByteToWideChar(CP_ACP, 0, from , -1, to , len);
-        diafW.rgoAction[i].u.lptszActionName = to;
-    }
-
-    hr = IDirectInput8_ConfigureDevices( &This->IDirectInput8W_iface, lpdiCallback, &diCDParamsW, dwFlags, pvRefData );
-
-    /* Copy back configuration */
-    if (SUCCEEDED(hr))
-        _copy_diactionformatWtoA(lpdiCDParams->lprgFormats, &diafW);
-
-    /* Free memory */
-    for (i=0; i < diafW.dwNumActions; i++)
-        HeapFree(GetProcessHeap(), 0, (void*) diafW.rgoAction[i].u.lptszActionName);
-
-    HeapFree(GetProcessHeap(), 0, diafW.rgoAction);
-
-    return hr;
-}
-
 /*****************************************************************************
  * IDirectInputJoyConfig8 interface
  */
@@ -1539,20 +1201,6 @@ static const IDirectInput7WVtbl ddi7wvt = {
     IDirectInput7WImpl_CreateDeviceEx
 };
 
-static const IDirectInput8AVtbl ddi8avt = {
-    IDirectInput8AImpl_QueryInterface,
-    IDirectInput8AImpl_AddRef,
-    IDirectInput8AImpl_Release,
-    IDirectInput8AImpl_CreateDevice,
-    IDirectInput8AImpl_EnumDevices,
-    IDirectInput8AImpl_GetDeviceStatus,
-    IDirectInput8AImpl_RunControlPanel,
-    IDirectInput8AImpl_Initialize,
-    IDirectInput8AImpl_FindDevice,
-    IDirectInput8AImpl_EnumDevicesBySemantics,
-    IDirectInput8AImpl_ConfigureDevices
-};
-
 static const IDirectInput8WVtbl ddi8wvt = {
     IDirectInput8WImpl_QueryInterface,
     IDirectInput8WImpl_AddRef,
diff --git a/dlls/dinput/dinput_private.h b/dlls/dinput/dinput_private.h
index 3df20a424ab..a8087195f96 100644
--- a/dlls/dinput/dinput_private.h
+++ b/dlls/dinput/dinput_private.h
@@ -49,6 +49,8 @@ struct IDirectInputImpl
     struct list                 device_players; /* device instance guid to player name */
 };
 
+extern const IDirectInput8AVtbl dinput8_a_vtbl DECLSPEC_HIDDEN;
+
 /* Function called by all devices that Wine supports */
 struct dinput_device {
     const char *name;
@@ -79,9 +81,6 @@ extern void dinput_mouse_rawinput_hook( IDirectInputDevice8W *iface, WPARAM wpar
 extern void check_dinput_hooks(LPDIRECTINPUTDEVICE8W, BOOL) DECLSPEC_HIDDEN;
 extern void check_dinput_events(void) DECLSPEC_HIDDEN;
 
-extern void _copy_diactionformatAtoW(LPDIACTIONFORMATW, LPDIACTIONFORMATA) DECLSPEC_HIDDEN;
-extern void _copy_diactionformatWtoA(LPDIACTIONFORMATA, LPDIACTIONFORMATW) DECLSPEC_HIDDEN;
-
 extern HRESULT _configure_devices(IDirectInput8W *iface, LPDICONFIGUREDEVICESCALLBACK lpdiCallback, LPDICONFIGUREDEVICESPARAMSW lpdiCDParams, DWORD dwFlags, LPVOID pvRefData) DECLSPEC_HIDDEN;
 
 extern WCHAR* get_mapping_path(const WCHAR *device, const WCHAR *username) DECLSPEC_HIDDEN;
-- 
2.31.0




More information about the wine-devel mailing list