[PATCH 5/6] dinput: Factor out IDirectInputDevice_BuildActionMap WtoA conversions.

Rémi Bernon rbernon at codeweavers.com
Thu May 27 03:50:04 CDT 2021


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/dinput/ansi.c                | 105 ++++++++++++++++++++++++++++++
 dlls/dinput/device_private.h      |   2 +
 dlls/dinput/joystick.c            |  30 ---------
 dlls/dinput/joystick_linux.c      |   2 +-
 dlls/dinput/joystick_linuxinput.c |   2 +-
 dlls/dinput/joystick_osx.c        |   2 +-
 dlls/dinput/joystick_private.h    |   1 -
 dlls/dinput/keyboard.c            |  32 +--------
 dlls/dinput/mouse.c               |  32 +--------
 9 files changed, 112 insertions(+), 96 deletions(-)

diff --git a/dlls/dinput/ansi.c b/dlls/dinput/ansi.c
index a8e5256bfc6..cc29bf8f6a4 100644
--- a/dlls/dinput/ansi.c
+++ b/dlls/dinput/ansi.c
@@ -90,6 +90,82 @@ static void dieffectinfo_wtoa( const DIEFFECTINFOW *in, DIEFFECTINFOA *out )
     WideCharToMultiByte( CP_ACP, 0, in->tszName, -1, out->tszName, sizeof(out->tszName), NULL, NULL );
 }
 
+static HRESULT string_atow( const char *in, WCHAR **out )
+{
+    int len;
+
+    *out = NULL;
+    if (!in) return DI_OK;
+
+    len = MultiByteToWideChar( CP_ACP, 0, in, -1, NULL, 0 );
+    if (!(*out = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ))) return DIERR_OUTOFMEMORY;
+
+    MultiByteToWideChar( CP_ACP, 0, in, -1, *out, len );
+    return DI_OK;
+}
+
+static void diactionformat_wtoa( const DIACTIONFORMATW *in, DIACTIONFORMATA *out )
+{
+    DWORD i;
+
+    out->dwDataSize = in->dwDataSize;
+    out->dwNumActions = in->dwNumActions;
+
+    for (i = 0; i < in->dwNumActions; ++i)
+    {
+        out->rgoAction[i].uAppData = in->rgoAction[i].uAppData;
+        out->rgoAction[i].dwSemantic = in->rgoAction[i].dwSemantic;
+        out->rgoAction[i].dwFlags = in->rgoAction[i].dwFlags;
+        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;
+    }
+
+    out->guidActionMap = in->guidActionMap;
+    out->dwGenre = in->dwGenre;
+    out->dwBufferSize = in->dwBufferSize;
+    out->lAxisMin = in->lAxisMin;
+    out->lAxisMax = in->lAxisMax;
+    out->hInstString = in->hInstString;
+    out->ftTimeStamp = in->ftTimeStamp;
+    out->dwCRC = in->dwCRC;
+
+    WideCharToMultiByte( CP_ACP, 0, in->tszActionMap, -1, out->tszActionMap,
+                         sizeof(out->tszActionMap), NULL, NULL );
+}
+
+static void diactionformat_atow( const DIACTIONFORMATA *in, DIACTIONFORMATW *out )
+{
+    DWORD i;
+
+    out->dwDataSize = in->dwDataSize;
+    out->dwNumActions = in->dwNumActions;
+
+    for (i = 0; i < out->dwNumActions; ++i)
+    {
+        out->rgoAction[i].uAppData = in->rgoAction[i].uAppData;
+        out->rgoAction[i].dwSemantic = in->rgoAction[i].dwSemantic;
+        out->rgoAction[i].dwFlags = in->rgoAction[i].dwFlags;
+        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;
+    }
+
+    out->guidActionMap = in->guidActionMap;
+    out->dwGenre = in->dwGenre;
+    out->dwBufferSize = in->dwBufferSize;
+    out->lAxisMin = in->lAxisMin;
+    out->lAxisMax = in->lAxisMax;
+    out->hInstString = in->hInstString;
+    out->ftTimeStamp = in->ftTimeStamp;
+    out->dwCRC = in->dwCRC;
+
+    MultiByteToWideChar( CP_ACP, 0, in->tszActionMap, -1, out->tszActionMap,
+                         sizeof(out->tszActionMap) / sizeof(WCHAR) );
+}
+
 static void dideviceimageinfo_wtoa( const DIDEVICEIMAGEINFOW *in, DIDEVICEIMAGEINFOA *out )
 {
     WideCharToMultiByte( CP_ACP, 0, in->tszImagePath, -1, out->tszImagePath,
@@ -416,6 +492,35 @@ HRESULT WINAPI IDirectInputDevice7AImpl_WriteEffectToFile( IDirectInputDevice8A
     return IDirectInputDevice8_WriteEffectToFile( iface_w, filename_w, entries, file_effect, flags );
 }
 
+HRESULT WINAPI IDirectInputDevice8AImpl_BuildActionMap( IDirectInputDevice8A *iface_a, DIACTIONFORMATA *format_a,
+                                                        const char *username_a, DWORD flags )
+{
+    IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
+    IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
+    DIACTIONFORMATW format_w = {sizeof(format_w), sizeof(DIACTIONW)};
+    HRESULT hr;
+    WCHAR *username_w;
+
+    if (!format_a) return E_POINTER;
+    if (format_a->dwSize != sizeof(DIACTIONFORMATA)) return DIERR_INVALIDPARAM;
+    if (format_a->dwActionSize != sizeof(DIACTIONA)) 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 );
+        hr = IDirectInputDevice8_BuildActionMap( iface_w, &format_w, username_w, flags );
+        diactionformat_wtoa( &format_w, format_a );
+        HeapFree( GetProcessHeap(), 0, format_w.rgoAction );
+    }
+
+    HeapFree( GetProcessHeap(), 0, username_w );
+    return hr;
+}
+
 HRESULT WINAPI IDirectInputDevice8AImpl_GetImageInfo( IDirectInputDevice8A *iface_a, DIDEVICEIMAGEINFOHEADERA *header_a )
 {
     IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
diff --git a/dlls/dinput/device_private.h b/dlls/dinput/device_private.h
index 0bebc36076d..1e5a2e1b836 100644
--- a/dlls/dinput/device_private.h
+++ b/dlls/dinput/device_private.h
@@ -248,6 +248,8 @@ extern HRESULT WINAPI IDirectInputDevice8WImpl_BuildActionMap(LPDIRECTINPUTDEVIC
 							      LPDIACTIONFORMATW lpdiaf,
 							      LPCWSTR lpszUserName,
 							      DWORD dwFlags) DECLSPEC_HIDDEN;
+extern HRESULT WINAPI IDirectInputDevice8AImpl_BuildActionMap( LPDIRECTINPUTDEVICE8A iface, DIACTIONFORMATA *format,
+                                                               const char *username, DWORD flags ) DECLSPEC_HIDDEN;
 extern HRESULT WINAPI IDirectInputDevice8AImpl_GetImageInfo(LPDIRECTINPUTDEVICE8A iface,
 							    LPDIDEVICEIMAGEINFOHEADERA lpdiDevImageInfoHeader) DECLSPEC_HIDDEN;
 extern HRESULT WINAPI IDirectInputDevice8WImpl_GetImageInfo(LPDIRECTINPUTDEVICE8W iface,
diff --git a/dlls/dinput/joystick.c b/dlls/dinput/joystick.c
index d048e0f821f..708bee44857 100644
--- a/dlls/dinput/joystick.c
+++ b/dlls/dinput/joystick.c
@@ -773,36 +773,6 @@ HRESULT WINAPI JoystickWGenericImpl_BuildActionMap(LPDIRECTINPUTDEVICE8W iface,
     return IDirectInputDevice8WImpl_BuildActionMap(iface, lpdiaf, lpszUserName, dwFlags);
 }
 
-HRESULT WINAPI JoystickAGenericImpl_BuildActionMap(LPDIRECTINPUTDEVICE8A iface,
-                                                   LPDIACTIONFORMATA lpdiaf,
-                                                   LPCSTR lpszUserName,
-                                                   DWORD dwFlags)
-{
-    JoystickGenericImpl *This = impl_from_IDirectInputDevice8A(iface);
-    DIACTIONFORMATW diafW;
-    HRESULT hr;
-    WCHAR *lpszUserNameW = NULL;
-    int username_size;
-
-    diafW.rgoAction = HeapAlloc(GetProcessHeap(), 0, sizeof(DIACTIONW)*lpdiaf->dwNumActions);
-    _copy_diactionformatAtoW(&diafW, lpdiaf);
-
-    if (lpszUserName != NULL)
-    {
-        username_size = MultiByteToWideChar(CP_ACP, 0, lpszUserName, -1, NULL, 0);
-        lpszUserNameW = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*username_size);
-        MultiByteToWideChar(CP_ACP, 0, lpszUserName, -1, lpszUserNameW, username_size);
-    }
-
-    hr = JoystickWGenericImpl_BuildActionMap(&This->base.IDirectInputDevice8W_iface, &diafW, lpszUserNameW, dwFlags);
-
-    _copy_diactionformatWtoA(lpdiaf, &diafW);
-    HeapFree(GetProcessHeap(), 0, diafW.rgoAction);
-    HeapFree(GetProcessHeap(), 0, lpszUserNameW);
-
-    return hr;
-}
-
 HRESULT WINAPI JoystickWGenericImpl_SetActionMap(LPDIRECTINPUTDEVICE8W iface,
                                                  LPDIACTIONFORMATW lpdiaf,
                                                  LPCWSTR lpszUserName,
diff --git a/dlls/dinput/joystick_linux.c b/dlls/dinput/joystick_linux.c
index 8290eef0bcb..e0102ec1f4e 100644
--- a/dlls/dinput/joystick_linux.c
+++ b/dlls/dinput/joystick_linux.c
@@ -909,7 +909,7 @@ static const IDirectInputDevice8AVtbl JoystickAvt =
 	IDirectInputDevice2AImpl_SendDeviceData,
 	IDirectInputDevice7AImpl_EnumEffectsInFile,
 	IDirectInputDevice7AImpl_WriteEffectToFile,
-	JoystickAGenericImpl_BuildActionMap,
+	IDirectInputDevice8AImpl_BuildActionMap,
 	JoystickAGenericImpl_SetActionMap,
 	IDirectInputDevice8AImpl_GetImageInfo
 };
diff --git a/dlls/dinput/joystick_linuxinput.c b/dlls/dinput/joystick_linuxinput.c
index dd59976719a..0ef18de968e 100644
--- a/dlls/dinput/joystick_linuxinput.c
+++ b/dlls/dinput/joystick_linuxinput.c
@@ -1339,7 +1339,7 @@ static const IDirectInputDevice8AVtbl JoystickAvt =
 	IDirectInputDevice2AImpl_SendDeviceData,
 	IDirectInputDevice7AImpl_EnumEffectsInFile,
         IDirectInputDevice7AImpl_WriteEffectToFile,
-        JoystickAGenericImpl_BuildActionMap,
+        IDirectInputDevice8AImpl_BuildActionMap,
         JoystickAGenericImpl_SetActionMap,
         IDirectInputDevice8AImpl_GetImageInfo
 };
diff --git a/dlls/dinput/joystick_osx.c b/dlls/dinput/joystick_osx.c
index b72322e0bd6..56886a6904d 100644
--- a/dlls/dinput/joystick_osx.c
+++ b/dlls/dinput/joystick_osx.c
@@ -1600,7 +1600,7 @@ static const IDirectInputDevice8AVtbl JoystickAvt =
     IDirectInputDevice2AImpl_SendDeviceData,
     IDirectInputDevice7AImpl_EnumEffectsInFile,
     IDirectInputDevice7AImpl_WriteEffectToFile,
-    JoystickAGenericImpl_BuildActionMap,
+    IDirectInputDevice8AImpl_BuildActionMap,
     JoystickAGenericImpl_SetActionMap,
     IDirectInputDevice8AImpl_GetImageInfo
 };
diff --git a/dlls/dinput/joystick_private.h b/dlls/dinput/joystick_private.h
index 235ec962fb8..d4dabcb5dbd 100644
--- a/dlls/dinput/joystick_private.h
+++ b/dlls/dinput/joystick_private.h
@@ -77,7 +77,6 @@ HRESULT WINAPI JoystickWGenericImpl_Poll(LPDIRECTINPUTDEVICE8W iface) DECLSPEC_H
 
 HRESULT WINAPI JoystickWGenericImpl_GetDeviceState(LPDIRECTINPUTDEVICE8W iface, DWORD len, LPVOID ptr) DECLSPEC_HIDDEN;
 
-HRESULT WINAPI JoystickAGenericImpl_BuildActionMap(LPDIRECTINPUTDEVICE8A iface, LPDIACTIONFORMATA lpdiaf, LPCSTR lpszUserName, DWORD dwFlags) DECLSPEC_HIDDEN;
 HRESULT WINAPI JoystickWGenericImpl_BuildActionMap(LPDIRECTINPUTDEVICE8W iface, LPDIACTIONFORMATW lpdiaf, LPCWSTR lpszUserName, DWORD dwFlags) DECLSPEC_HIDDEN;
 
 HRESULT WINAPI JoystickAGenericImpl_SetActionMap(LPDIRECTINPUTDEVICE8A iface, LPDIACTIONFORMATA lpdiaf, LPCSTR lpszUserName, DWORD dwFlags) DECLSPEC_HIDDEN;
diff --git a/dlls/dinput/keyboard.c b/dlls/dinput/keyboard.c
index d9c3f02e669..5143eb4752c 100644
--- a/dlls/dinput/keyboard.c
+++ b/dlls/dinput/keyboard.c
@@ -554,36 +554,6 @@ static HRESULT WINAPI SysKeyboardWImpl_BuildActionMap(LPDIRECTINPUTDEVICE8W ifac
     return  _build_action_map(iface, lpdiaf, lpszUserName, dwFlags, DIKEYBOARD_MASK, &c_dfDIKeyboard);
 }
 
-static HRESULT WINAPI SysKeyboardAImpl_BuildActionMap(LPDIRECTINPUTDEVICE8A iface,
-                                                      LPDIACTIONFORMATA lpdiaf,
-                                                      LPCSTR lpszUserName,
-                                                      DWORD dwFlags)
-{
-    SysKeyboardImpl *This = impl_from_IDirectInputDevice8A(iface);
-    DIACTIONFORMATW diafW;
-    HRESULT hr;
-    WCHAR *lpszUserNameW = NULL;
-    int username_size;
-
-    diafW.rgoAction = HeapAlloc(GetProcessHeap(), 0, sizeof(DIACTIONW)*lpdiaf->dwNumActions);
-    _copy_diactionformatAtoW(&diafW, lpdiaf);
-
-    if (lpszUserName != NULL)
-    {
-        username_size = MultiByteToWideChar(CP_ACP, 0, lpszUserName, -1, NULL, 0);
-        lpszUserNameW = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*username_size);
-        MultiByteToWideChar(CP_ACP, 0, lpszUserName, -1, lpszUserNameW, username_size);
-    }
-
-    hr = SysKeyboardWImpl_BuildActionMap(&This->base.IDirectInputDevice8W_iface, &diafW, lpszUserNameW, dwFlags);
-
-    _copy_diactionformatWtoA(lpdiaf, &diafW);
-    HeapFree(GetProcessHeap(), 0, diafW.rgoAction);
-    HeapFree(GetProcessHeap(), 0, lpszUserNameW);
-
-    return hr;
-}
-
 static HRESULT WINAPI SysKeyboardWImpl_SetActionMap(LPDIRECTINPUTDEVICE8W iface,
                                                     LPDIACTIONFORMATW lpdiaf,
                                                     LPCWSTR lpszUserName,
@@ -655,7 +625,7 @@ static const IDirectInputDevice8AVtbl SysKeyboardAvt =
     IDirectInputDevice2AImpl_SendDeviceData,
     IDirectInputDevice7AImpl_EnumEffectsInFile,
     IDirectInputDevice7AImpl_WriteEffectToFile,
-    SysKeyboardAImpl_BuildActionMap,
+    IDirectInputDevice8AImpl_BuildActionMap,
     SysKeyboardAImpl_SetActionMap,
     IDirectInputDevice8AImpl_GetImageInfo
 };
diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c
index f5f6bf2214a..62bc6b1f006 100644
--- a/dlls/dinput/mouse.c
+++ b/dlls/dinput/mouse.c
@@ -807,36 +807,6 @@ static HRESULT WINAPI SysMouseWImpl_BuildActionMap(LPDIRECTINPUTDEVICE8W iface,
     return _build_action_map(iface, lpdiaf, lpszUserName, dwFlags, DIMOUSE_MASK, &c_dfDIMouse2);
 }
 
-static HRESULT WINAPI SysMouseAImpl_BuildActionMap(LPDIRECTINPUTDEVICE8A iface,
-                                                   LPDIACTIONFORMATA lpdiaf,
-                                                   LPCSTR lpszUserName,
-                                                   DWORD dwFlags)
-{
-    SysMouseImpl *This = impl_from_IDirectInputDevice8A(iface);
-    DIACTIONFORMATW diafW;
-    HRESULT hr;
-    WCHAR *lpszUserNameW = NULL;
-    int username_size;
-
-    diafW.rgoAction = HeapAlloc(GetProcessHeap(), 0, sizeof(DIACTIONW)*lpdiaf->dwNumActions);
-    _copy_diactionformatAtoW(&diafW, lpdiaf);
-
-    if (lpszUserName != NULL)
-    {
-        username_size = MultiByteToWideChar(CP_ACP, 0, lpszUserName, -1, NULL, 0);
-        lpszUserNameW = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*username_size);
-        MultiByteToWideChar(CP_ACP, 0, lpszUserName, -1, lpszUserNameW, username_size);
-    }
-
-    hr = SysMouseWImpl_BuildActionMap(&This->base.IDirectInputDevice8W_iface, &diafW, lpszUserNameW, dwFlags);
-
-    _copy_diactionformatWtoA(lpdiaf, &diafW);
-    HeapFree(GetProcessHeap(), 0, diafW.rgoAction);
-    HeapFree(GetProcessHeap(), 0, lpszUserNameW);
-
-    return hr;
-}
-
 static HRESULT WINAPI SysMouseWImpl_SetActionMap(LPDIRECTINPUTDEVICE8W iface,
                                                  LPDIACTIONFORMATW lpdiaf,
                                                  LPCWSTR lpszUserName,
@@ -908,7 +878,7 @@ static const IDirectInputDevice8AVtbl SysMouseAvt =
     IDirectInputDevice2AImpl_SendDeviceData,
     IDirectInputDevice7AImpl_EnumEffectsInFile,
     IDirectInputDevice7AImpl_WriteEffectToFile,
-    SysMouseAImpl_BuildActionMap,
+    IDirectInputDevice8AImpl_BuildActionMap,
     SysMouseAImpl_SetActionMap,
     IDirectInputDevice8AImpl_GetImageInfo
 };
-- 
2.31.0




More information about the wine-devel mailing list