Release 6.15.
[wine.git] / dlls / dinput / ansi.c
blobcbc9dbc973373a41b5032705f1f9536db200417c
1 /*
2 * Direct Input ANSI interface wrappers
4 * Copyright 2021 RĂ©mi Bernon for CodeWeavers
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include <stdarg.h>
22 #include <string.h>
24 #include "windef.h"
25 #include "winbase.h"
26 #include "winreg.h"
27 #include "winuser.h"
28 #include "winerror.h"
29 #include "dinput.h"
31 #include "device_private.h"
32 #include "dinput_private.h"
34 #include "wine/debug.h"
36 static IDirectInputDeviceImpl *impl_from_IDirectInputDevice8A( IDirectInputDevice8A *iface )
38 return CONTAINING_RECORD( iface, IDirectInputDeviceImpl, IDirectInputDevice8A_iface );
41 static IDirectInputDevice8W *IDirectInputDevice8W_from_impl( IDirectInputDeviceImpl *impl )
43 return &impl->IDirectInputDevice8W_iface;
46 static inline IDirectInputDevice8A *IDirectInputDevice8A_from_IDirectInputDevice8W( IDirectInputDevice8W *iface )
48 if (!iface) return NULL;
49 return &CONTAINING_RECORD( iface, IDirectInputDeviceImpl, IDirectInputDevice8W_iface )->IDirectInputDevice8A_iface;
52 static inline IDirectInputDeviceA *IDirectInputDeviceA_from_IDirectInputDeviceW( IDirectInputDeviceW *iface )
54 return (IDirectInputDeviceA *)IDirectInputDevice8A_from_IDirectInputDevice8W( (IDirectInputDevice8W *)iface );
57 static IDirectInputImpl *impl_from_IDirectInput7A( IDirectInput7A *iface )
59 return CONTAINING_RECORD( iface, IDirectInputImpl, IDirectInput7A_iface );
62 static IDirectInput7W *IDirectInput7W_from_impl( IDirectInputImpl *impl )
64 return &impl->IDirectInput7W_iface;
67 static IDirectInputImpl *impl_from_IDirectInput8A( IDirectInput8A *iface )
69 return CONTAINING_RECORD( iface, IDirectInputImpl, IDirectInput8A_iface );
72 static IDirectInput8W *IDirectInput8W_from_impl( IDirectInputImpl *impl )
74 return &impl->IDirectInput8W_iface;
77 static void dideviceobjectinstance_wtoa( const DIDEVICEOBJECTINSTANCEW *in, DIDEVICEOBJECTINSTANCEA *out )
79 out->guidType = in->guidType;
80 out->dwOfs = in->dwOfs;
81 out->dwType = in->dwType;
82 out->dwFlags = in->dwFlags;
83 WideCharToMultiByte( CP_ACP, 0, in->tszName, -1, out->tszName, sizeof(out->tszName), NULL, NULL );
85 if (out->dwSize <= FIELD_OFFSET( DIDEVICEOBJECTINSTANCEA, dwFFMaxForce )) return;
87 out->dwFFMaxForce = in->dwFFMaxForce;
88 out->dwFFForceResolution = in->dwFFForceResolution;
89 out->wCollectionNumber = in->wCollectionNumber;
90 out->wDesignatorIndex = in->wDesignatorIndex;
91 out->wUsagePage = in->wUsagePage;
92 out->wUsage = in->wUsage;
93 out->dwDimension = in->dwDimension;
94 out->wExponent = in->wExponent;
95 out->wReportId = in->wReportId;
98 static void dideviceinstance_wtoa( const DIDEVICEINSTANCEW *in, DIDEVICEINSTANCEA *out )
100 out->guidInstance = in->guidInstance;
101 out->guidProduct = in->guidProduct;
102 out->dwDevType = in->dwDevType;
103 WideCharToMultiByte( CP_ACP, 0, in->tszInstanceName, -1, out->tszInstanceName,
104 sizeof(out->tszInstanceName), NULL, NULL );
105 WideCharToMultiByte( CP_ACP, 0, in->tszProductName, -1, out->tszProductName,
106 sizeof(out->tszProductName), NULL, NULL );
108 if (out->dwSize <= FIELD_OFFSET( DIDEVICEINSTANCEA, guidFFDriver )) return;
110 out->guidFFDriver = in->guidFFDriver;
111 out->wUsagePage = in->wUsagePage;
112 out->wUsage = in->wUsage;
115 static void dieffectinfo_wtoa( const DIEFFECTINFOW *in, DIEFFECTINFOA *out )
117 out->guid = in->guid;
118 out->dwEffType = in->dwEffType;
119 out->dwStaticParams = in->dwStaticParams;
120 out->dwDynamicParams = in->dwDynamicParams;
121 WideCharToMultiByte( CP_ACP, 0, in->tszName, -1, out->tszName, sizeof(out->tszName), NULL, NULL );
124 static HRESULT string_atow( const char *in, WCHAR **out )
126 int len;
128 *out = NULL;
129 if (!in) return DI_OK;
131 len = MultiByteToWideChar( CP_ACP, 0, in, -1, NULL, 0 );
132 if (!(*out = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ))) return DIERR_OUTOFMEMORY;
134 MultiByteToWideChar( CP_ACP, 0, in, -1, *out, len );
135 return DI_OK;
138 static void diactionformat_wtoa( const DIACTIONFORMATW *in, DIACTIONFORMATA *out )
140 DWORD i;
142 out->dwDataSize = in->dwDataSize;
143 out->dwNumActions = in->dwNumActions;
145 for (i = 0; i < in->dwNumActions; ++i)
147 out->rgoAction[i].uAppData = in->rgoAction[i].uAppData;
148 out->rgoAction[i].dwSemantic = in->rgoAction[i].dwSemantic;
149 out->rgoAction[i].dwFlags = in->rgoAction[i].dwFlags;
150 out->rgoAction[i].guidInstance = in->rgoAction[i].guidInstance;
151 out->rgoAction[i].dwObjID = in->rgoAction[i].dwObjID;
152 out->rgoAction[i].dwHow = in->rgoAction[i].dwHow;
153 out->rgoAction[i].lptszActionName = 0;
156 out->guidActionMap = in->guidActionMap;
157 out->dwGenre = in->dwGenre;
158 out->dwBufferSize = in->dwBufferSize;
159 out->lAxisMin = in->lAxisMin;
160 out->lAxisMax = in->lAxisMax;
161 out->hInstString = in->hInstString;
162 out->ftTimeStamp = in->ftTimeStamp;
163 out->dwCRC = in->dwCRC;
165 WideCharToMultiByte( CP_ACP, 0, in->tszActionMap, -1, out->tszActionMap,
166 sizeof(out->tszActionMap), NULL, NULL );
169 static HRESULT diactionformat_atow( const DIACTIONFORMATA *in, DIACTIONFORMATW *out, BOOL convert_names )
171 HRESULT hr = DI_OK;
172 DWORD i;
174 out->dwDataSize = in->dwDataSize;
175 out->dwNumActions = in->dwNumActions;
177 for (i = 0; i < out->dwNumActions && SUCCEEDED(hr); ++i)
179 out->rgoAction[i].uAppData = in->rgoAction[i].uAppData;
180 out->rgoAction[i].dwSemantic = in->rgoAction[i].dwSemantic;
181 out->rgoAction[i].dwFlags = in->rgoAction[i].dwFlags;
182 out->rgoAction[i].guidInstance = in->rgoAction[i].guidInstance;
183 out->rgoAction[i].dwObjID = in->rgoAction[i].dwObjID;
184 out->rgoAction[i].dwHow = in->rgoAction[i].dwHow;
185 if (!convert_names) out->rgoAction[i].lptszActionName = 0;
186 else if (in->hInstString) out->rgoAction[i].uResIdString = in->rgoAction[i].uResIdString;
187 else hr = string_atow( in->rgoAction[i].lptszActionName, (WCHAR **)&out->rgoAction[i].lptszActionName );
190 for (; i < out->dwNumActions; ++i) out->rgoAction[i].lptszActionName = 0;
192 out->guidActionMap = in->guidActionMap;
193 out->dwGenre = in->dwGenre;
194 out->dwBufferSize = in->dwBufferSize;
195 out->lAxisMin = in->lAxisMin;
196 out->lAxisMax = in->lAxisMax;
197 out->hInstString = in->hInstString;
198 out->ftTimeStamp = in->ftTimeStamp;
199 out->dwCRC = in->dwCRC;
201 MultiByteToWideChar( CP_ACP, 0, in->tszActionMap, -1, out->tszActionMap,
202 sizeof(out->tszActionMap) / sizeof(WCHAR) );
204 return hr;
207 static void dideviceimageinfo_wtoa( const DIDEVICEIMAGEINFOW *in, DIDEVICEIMAGEINFOA *out )
209 WideCharToMultiByte( CP_ACP, 0, in->tszImagePath, -1, out->tszImagePath,
210 sizeof(out->tszImagePath), NULL, NULL );
212 out->dwFlags = in->dwFlags;
213 out->dwViewID = in->dwViewID;
214 out->rcOverlay = in->rcOverlay;
215 out->dwObjID = in->dwObjID;
216 out->dwcValidPts = in->dwcValidPts;
217 out->rgptCalloutLine[0] = in->rgptCalloutLine[0];
218 out->rgptCalloutLine[1] = in->rgptCalloutLine[1];
219 out->rgptCalloutLine[2] = in->rgptCalloutLine[2];
220 out->rgptCalloutLine[3] = in->rgptCalloutLine[3];
221 out->rgptCalloutLine[4] = in->rgptCalloutLine[4];
222 out->rcCalloutRect = in->rcCalloutRect;
223 out->dwTextAlign = in->dwTextAlign;
226 static void dideviceimageinfoheader_wtoa( const DIDEVICEIMAGEINFOHEADERW *in, DIDEVICEIMAGEINFOHEADERA *out )
228 DWORD i;
230 out->dwcViews = in->dwcViews;
231 out->dwcButtons = in->dwcButtons;
232 out->dwcAxes = in->dwcAxes;
233 out->dwcPOVs = in->dwcPOVs;
234 out->dwBufferUsed = 0;
236 for (i = 0; i < in->dwBufferUsed / sizeof(DIDEVICEIMAGEINFOW); ++i)
238 dideviceimageinfo_wtoa( &in->lprgImageInfoArray[i], &out->lprgImageInfoArray[i] );
239 out->dwBufferUsed += sizeof(DIDEVICEIMAGEINFOA);
243 static HRESULT diconfiguredevicesparams_atow( const DICONFIGUREDEVICESPARAMSA *in, DICONFIGUREDEVICESPARAMSW *out )
245 const char *name_a = in->lptszUserNames;
246 DWORD len_w, len_a;
248 if (!in->lptszUserNames) out->lptszUserNames = NULL;
249 else
251 while (name_a[0] && name_a[1]) ++name_a;
252 len_a = name_a - in->lptszUserNames + 1;
253 len_w = MultiByteToWideChar( CP_ACP, 0, in->lptszUserNames, len_a, NULL, 0 );
255 out->lptszUserNames = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, len_w * sizeof(WCHAR) );
256 if (!out->lptszUserNames) return DIERR_OUTOFMEMORY;
258 MultiByteToWideChar( CP_ACP, 0, in->lptszUserNames, len_a, out->lptszUserNames, len_w );
261 out->dwcUsers = in->dwcUsers;
262 out->dwcFormats = in->dwcFormats;
263 out->hwnd = in->hwnd;
264 out->dics = in->dics;
265 out->lpUnkDDSTarget = in->lpUnkDDSTarget;
267 return DI_OK;
270 static HRESULT WINAPI dinput_device_a_QueryInterface( IDirectInputDevice8A *iface_a, REFIID iid, void **out )
272 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
273 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
274 return IDirectInputDevice8_QueryInterface( iface_w, iid, out );
277 static ULONG WINAPI dinput_device_a_AddRef( IDirectInputDevice8A *iface_a )
279 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
280 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
281 return IDirectInputDevice8_AddRef( iface_w );
284 static ULONG WINAPI dinput_device_a_Release( IDirectInputDevice8A *iface_a )
286 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
287 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
288 return IDirectInputDevice8_Release( iface_w );
291 static HRESULT WINAPI dinput_device_a_GetCapabilities( IDirectInputDevice8A *iface_a, DIDEVCAPS *caps )
293 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
294 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
295 return IDirectInputDevice8_GetCapabilities( iface_w, caps );
298 struct enum_objects_wtoa_params
300 LPDIENUMDEVICEOBJECTSCALLBACKA callback;
301 void *ref;
304 static BOOL CALLBACK enum_objects_wtoa_callback( const DIDEVICEOBJECTINSTANCEW *instance_w, void *ref )
306 struct enum_objects_wtoa_params *params = ref;
307 DIDEVICEOBJECTINSTANCEA instance_a = {sizeof(instance_a)};
309 dideviceobjectinstance_wtoa( instance_w, &instance_a );
310 return params->callback( &instance_a, params->ref );
313 static HRESULT WINAPI dinput_device_a_EnumObjects( IDirectInputDevice8A *iface_a, LPDIENUMDEVICEOBJECTSCALLBACKA callback,
314 void *ref, DWORD flags )
316 struct enum_objects_wtoa_params params = {callback, ref};
317 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
318 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
320 if (!callback) return DIERR_INVALIDPARAM;
322 return IDirectInputDevice8_EnumObjects( iface_w, enum_objects_wtoa_callback, &params, flags );
325 static HRESULT WINAPI dinput_device_a_GetProperty( IDirectInputDevice8A *iface_a, REFGUID guid, DIPROPHEADER *header )
327 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
328 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
329 return IDirectInputDevice8_GetProperty( iface_w, guid, header );
332 static HRESULT WINAPI dinput_device_a_SetProperty( IDirectInputDevice8A *iface_a, REFGUID guid, const DIPROPHEADER *header )
334 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
335 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
336 return IDirectInputDevice8_SetProperty( iface_w, guid, header );
339 static HRESULT WINAPI dinput_device_a_Acquire( IDirectInputDevice8A *iface_a )
341 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
342 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
343 return IDirectInputDevice8_Acquire( iface_w );
346 static HRESULT WINAPI dinput_device_a_Unacquire( IDirectInputDevice8A *iface_a )
348 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
349 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
350 return IDirectInputDevice8_Unacquire( iface_w );
353 static HRESULT WINAPI dinput_device_a_GetDeviceState( IDirectInputDevice8A *iface_a, DWORD count, void *data )
355 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
356 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
357 return IDirectInputDevice8_GetDeviceState( iface_w, count, data );
360 static HRESULT WINAPI dinput_device_a_GetDeviceData( IDirectInputDevice8A *iface_a, DWORD data_size, DIDEVICEOBJECTDATA *data,
361 DWORD *entries, DWORD flags )
363 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
364 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
365 return IDirectInputDevice8_GetDeviceData( iface_w, data_size, data, entries, flags );
368 static HRESULT WINAPI dinput_device_a_SetDataFormat( IDirectInputDevice8A *iface_a, const DIDATAFORMAT *format )
370 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
371 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
372 return IDirectInputDevice8_SetDataFormat( iface_w, format );
375 static HRESULT WINAPI dinput_device_a_SetEventNotification( IDirectInputDevice8A *iface_a, HANDLE event )
377 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
378 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
379 return IDirectInputDevice8_SetEventNotification( iface_w, event );
382 static HRESULT WINAPI dinput_device_a_SetCooperativeLevel( IDirectInputDevice8A *iface_a, HWND window, DWORD flags )
384 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
385 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
386 return IDirectInputDevice8_SetCooperativeLevel( iface_w, window, flags );
389 static HRESULT WINAPI dinput_device_a_GetObjectInfo( IDirectInputDevice8A *iface_a, DIDEVICEOBJECTINSTANCEA *instance_a,
390 DWORD obj, DWORD how )
392 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
393 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
394 DIDEVICEOBJECTINSTANCEW instance_w = {sizeof(instance_w)};
395 HRESULT hr;
397 if (!instance_a) return E_POINTER;
398 if (instance_a->dwSize != sizeof(DIDEVICEOBJECTINSTANCEA) &&
399 instance_a->dwSize != sizeof(DIDEVICEOBJECTINSTANCE_DX3A))
400 return DIERR_INVALIDPARAM;
402 hr = IDirectInputDevice8_GetObjectInfo( iface_w, &instance_w, obj, how );
403 dideviceobjectinstance_wtoa( &instance_w, instance_a );
405 return hr;
408 static HRESULT WINAPI dinput_device_a_GetDeviceInfo( IDirectInputDevice8A *iface_a, DIDEVICEINSTANCEA *instance_a )
410 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
411 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
412 DIDEVICEINSTANCEW instance_w = {sizeof(instance_w)};
413 HRESULT hr;
415 if (!instance_a) return E_POINTER;
416 if (instance_a->dwSize != sizeof(DIDEVICEINSTANCEA) && instance_a->dwSize != sizeof(DIDEVICEINSTANCE_DX3A))
417 return DIERR_INVALIDPARAM;
419 hr = IDirectInputDevice8_GetDeviceInfo( iface_w, &instance_w );
420 dideviceinstance_wtoa( &instance_w, instance_a );
422 return hr;
425 static HRESULT WINAPI dinput_device_a_RunControlPanel( IDirectInputDevice8A *iface_a, HWND owner, DWORD flags )
427 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
428 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
429 return IDirectInputDevice8_RunControlPanel( iface_w, owner, flags );
432 static HRESULT WINAPI dinput_device_a_Initialize( IDirectInputDevice8A *iface_a, HINSTANCE instance, DWORD version, REFGUID guid )
434 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
435 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
436 return IDirectInputDevice8_Initialize( iface_w, instance, version, guid );
439 static HRESULT WINAPI dinput_device_a_CreateEffect( IDirectInputDevice8A *iface_a, REFGUID guid, const DIEFFECT *effect,
440 IDirectInputEffect **out, IUnknown *outer )
442 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
443 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
444 return IDirectInputDevice8_CreateEffect( iface_w, guid, effect, out, outer );
447 struct enum_effects_wtoa_params
449 LPDIENUMEFFECTSCALLBACKA callback;
450 void *ref;
453 static BOOL CALLBACK enum_effects_wtoa_callback( const DIEFFECTINFOW *info_w, void *ref )
455 struct enum_effects_wtoa_params *params = ref;
456 DIEFFECTINFOA info_a = {sizeof(info_a)};
458 dieffectinfo_wtoa( info_w, &info_a );
459 return params->callback( &info_a, params->ref );
462 static HRESULT WINAPI dinput_device_a_EnumEffects( IDirectInputDevice8A *iface_a, LPDIENUMEFFECTSCALLBACKA callback,
463 void *ref, DWORD type )
465 struct enum_effects_wtoa_params params = {callback, ref};
466 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
467 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
469 if (!callback) return DIERR_INVALIDPARAM;
471 return IDirectInputDevice8_EnumEffects( iface_w, enum_effects_wtoa_callback, &params, type );
474 static HRESULT WINAPI dinput_device_a_GetEffectInfo( IDirectInputDevice8A *iface_a, DIEFFECTINFOA *info_a, REFGUID guid )
476 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
477 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
478 DIEFFECTINFOW info_w = {sizeof(info_w)};
479 HRESULT hr;
481 if (!info_a) return E_POINTER;
482 if (info_a->dwSize != sizeof(DIEFFECTINFOA)) return DIERR_INVALIDPARAM;
484 hr = IDirectInputDevice8_GetEffectInfo( iface_w, &info_w, guid );
485 dieffectinfo_wtoa( &info_w, info_a );
487 return hr;
490 static HRESULT WINAPI dinput_device_a_GetForceFeedbackState( IDirectInputDevice8A *iface_a, DWORD *state )
492 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
493 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
494 return IDirectInputDevice8_GetForceFeedbackState( iface_w, state );
497 static HRESULT WINAPI dinput_device_a_SendForceFeedbackCommand( IDirectInputDevice8A *iface_a, DWORD flags )
499 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
500 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
501 return IDirectInputDevice8_SendForceFeedbackCommand( iface_w, flags );
504 static HRESULT WINAPI dinput_device_a_EnumCreatedEffectObjects( IDirectInputDevice8A *iface_a, LPDIENUMCREATEDEFFECTOBJECTSCALLBACK callback,
505 void *ref, DWORD flags )
507 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
508 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
509 return IDirectInputDevice8_EnumCreatedEffectObjects( iface_w, callback, ref, flags );
512 static HRESULT WINAPI dinput_device_a_Escape( IDirectInputDevice8A *iface_a, DIEFFESCAPE *escape )
514 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
515 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
516 return IDirectInputDevice8_Escape( iface_w, escape );
519 static HRESULT WINAPI dinput_device_a_Poll( IDirectInputDevice8A *iface_a )
521 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
522 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
523 return IDirectInputDevice8_Poll( iface_w );
526 static HRESULT WINAPI dinput_device_a_SendDeviceData( IDirectInputDevice8A *iface_a, DWORD count, const DIDEVICEOBJECTDATA *data,
527 DWORD *inout, DWORD flags )
529 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
530 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
531 return IDirectInputDevice8_SendDeviceData( iface_w, count, data, inout, flags );
534 static HRESULT WINAPI dinput_device_a_EnumEffectsInFile( IDirectInputDevice8A *iface_a, const char *filename_a, LPDIENUMEFFECTSINFILECALLBACK callback,
535 void *ref, DWORD flags )
537 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
538 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
539 WCHAR buffer[MAX_PATH], *filename_w = buffer;
541 if (!filename_a) filename_w = NULL;
542 else MultiByteToWideChar( CP_ACP, 0, filename_a, -1, buffer, MAX_PATH );
544 return IDirectInputDevice8_EnumEffectsInFile( iface_w, filename_w, callback, ref, flags );
547 static HRESULT WINAPI dinput_device_a_WriteEffectToFile( IDirectInputDevice8A *iface_a, const char *filename_a, DWORD entries,
548 DIFILEEFFECT *file_effect, DWORD flags )
550 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
551 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
552 WCHAR buffer[MAX_PATH], *filename_w = buffer;
554 if (!filename_a) filename_w = NULL;
555 else MultiByteToWideChar( CP_ACP, 0, filename_a, -1, buffer, MAX_PATH );
557 return IDirectInputDevice8_WriteEffectToFile( iface_w, filename_w, entries, file_effect, flags );
560 static HRESULT WINAPI dinput_device_a_BuildActionMap( IDirectInputDevice8A *iface_a, DIACTIONFORMATA *format_a,
561 const char *username_a, DWORD flags )
563 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
564 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
565 DIACTIONFORMATW format_w = {sizeof(format_w), sizeof(DIACTIONW)};
566 HRESULT hr;
567 WCHAR *username_w;
569 if (!format_a) return E_POINTER;
570 if (format_a->dwSize != sizeof(DIACTIONFORMATA)) return DIERR_INVALIDPARAM;
571 if (format_a->dwActionSize != sizeof(DIACTIONA)) return DIERR_INVALIDPARAM;
572 if (FAILED(hr = string_atow( username_a, &username_w ))) return hr;
574 format_w.dwNumActions = format_a->dwNumActions;
575 format_w.rgoAction = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, format_a->dwNumActions * sizeof(DIACTIONW) );
576 if (!format_w.rgoAction) hr = DIERR_OUTOFMEMORY;
577 else
579 diactionformat_atow( format_a, &format_w, FALSE );
580 hr = IDirectInputDevice8_BuildActionMap( iface_w, &format_w, username_w, flags );
581 diactionformat_wtoa( &format_w, format_a );
582 HeapFree( GetProcessHeap(), 0, format_w.rgoAction );
585 HeapFree( GetProcessHeap(), 0, username_w );
586 return hr;
589 static HRESULT WINAPI dinput_device_a_SetActionMap( IDirectInputDevice8A *iface_a, DIACTIONFORMATA *format_a,
590 const char *username_a, DWORD flags )
592 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
593 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
594 DIACTIONFORMATW format_w = {sizeof(format_w), sizeof(DIACTIONW)};
595 HRESULT hr;
596 WCHAR *username_w;
598 if (!format_a) return E_POINTER;
599 if (format_a->dwSize != sizeof(DIACTIONFORMATA)) return DIERR_INVALIDPARAM;
600 if (format_a->dwActionSize != sizeof(DIACTIONA)) return DIERR_INVALIDPARAM;
601 if (FAILED(hr = string_atow( username_a, &username_w ))) return hr;
603 format_w.dwNumActions = format_a->dwNumActions;
604 format_w.rgoAction = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, format_a->dwNumActions * sizeof(DIACTIONW) );
605 if (!format_w.rgoAction) hr = DIERR_OUTOFMEMORY;
606 else
608 diactionformat_atow( format_a, &format_w, FALSE );
609 hr = IDirectInputDevice8_SetActionMap( iface_w, &format_w, username_w, flags );
610 diactionformat_wtoa( &format_w, format_a );
611 HeapFree( GetProcessHeap(), 0, format_w.rgoAction );
614 HeapFree( GetProcessHeap(), 0, username_w );
615 return hr;
618 static HRESULT WINAPI dinput_device_a_GetImageInfo( IDirectInputDevice8A *iface_a, DIDEVICEIMAGEINFOHEADERA *header_a )
620 IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8A( iface_a );
621 IDirectInputDevice8W *iface_w = IDirectInputDevice8W_from_impl( impl );
622 DIDEVICEIMAGEINFOHEADERW header_w = {sizeof(header_w), sizeof(DIDEVICEIMAGEINFOW)};
623 HRESULT hr;
625 if (!header_a) return E_POINTER;
626 if (header_a->dwSize != sizeof(DIDEVICEIMAGEINFOHEADERA)) return DIERR_INVALIDPARAM;
627 if (header_a->dwSizeImageInfo != sizeof(DIDEVICEIMAGEINFOA)) return DIERR_INVALIDPARAM;
629 header_w.dwBufferSize = (header_a->dwBufferSize / sizeof(DIDEVICEIMAGEINFOA)) * sizeof(DIDEVICEIMAGEINFOW);
630 header_w.lprgImageInfoArray = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, header_w.dwBufferSize );
631 if (!header_w.lprgImageInfoArray) return DIERR_OUTOFMEMORY;
633 hr = IDirectInputDevice8_GetImageInfo( iface_w, &header_w );
634 dideviceimageinfoheader_wtoa( &header_w, header_a );
635 HeapFree( GetProcessHeap(), 0, header_w.lprgImageInfoArray );
636 return hr;
639 const IDirectInputDevice8AVtbl dinput_device_a_vtbl =
641 /*** IUnknown methods ***/
642 dinput_device_a_QueryInterface,
643 dinput_device_a_AddRef,
644 dinput_device_a_Release,
645 /*** IDirectInputDeviceA methods ***/
646 dinput_device_a_GetCapabilities,
647 dinput_device_a_EnumObjects,
648 dinput_device_a_GetProperty,
649 dinput_device_a_SetProperty,
650 dinput_device_a_Acquire,
651 dinput_device_a_Unacquire,
652 dinput_device_a_GetDeviceState,
653 dinput_device_a_GetDeviceData,
654 dinput_device_a_SetDataFormat,
655 dinput_device_a_SetEventNotification,
656 dinput_device_a_SetCooperativeLevel,
657 dinput_device_a_GetObjectInfo,
658 dinput_device_a_GetDeviceInfo,
659 dinput_device_a_RunControlPanel,
660 dinput_device_a_Initialize,
661 /*** IDirectInputDevice2A methods ***/
662 dinput_device_a_CreateEffect,
663 dinput_device_a_EnumEffects,
664 dinput_device_a_GetEffectInfo,
665 dinput_device_a_GetForceFeedbackState,
666 dinput_device_a_SendForceFeedbackCommand,
667 dinput_device_a_EnumCreatedEffectObjects,
668 dinput_device_a_Escape,
669 dinput_device_a_Poll,
670 dinput_device_a_SendDeviceData,
671 /*** IDirectInputDevice7A methods ***/
672 dinput_device_a_EnumEffectsInFile,
673 dinput_device_a_WriteEffectToFile,
674 /*** IDirectInputDevice8A methods ***/
675 dinput_device_a_BuildActionMap,
676 dinput_device_a_SetActionMap,
677 dinput_device_a_GetImageInfo,
680 static HRESULT WINAPI dinput8_a_QueryInterface( IDirectInput8A *iface_a, REFIID iid, void **out )
682 IDirectInputImpl *impl = impl_from_IDirectInput8A( iface_a );
683 IDirectInput8W *iface_w = IDirectInput8W_from_impl( impl );
684 return IDirectInput8_QueryInterface( iface_w, iid, out );
687 static ULONG WINAPI dinput8_a_AddRef( IDirectInput8A *iface_a )
689 IDirectInputImpl *impl = impl_from_IDirectInput8A( iface_a );
690 IDirectInput8W *iface_w = IDirectInput8W_from_impl( impl );
691 return IDirectInput8_AddRef( iface_w );
694 static ULONG WINAPI dinput8_a_Release( IDirectInput8A *iface_a )
696 IDirectInputImpl *impl = impl_from_IDirectInput8A( iface_a );
697 IDirectInput8W *iface_w = IDirectInput8W_from_impl( impl );
698 return IDirectInput8_Release( iface_w );
701 static HRESULT WINAPI dinput8_a_CreateDevice( IDirectInput8A *iface_a, REFGUID guid, IDirectInputDevice8A **out, IUnknown *outer )
703 IDirectInputImpl *impl = impl_from_IDirectInput8A( iface_a );
704 IDirectInput8W *iface_w = IDirectInput8W_from_impl( impl );
705 IDirectInputDevice8W *outw;
706 HRESULT hr;
708 if (!out) return E_POINTER;
710 hr = IDirectInput8_CreateDevice( iface_w, guid, &outw, outer );
711 *out = IDirectInputDevice8A_from_IDirectInputDevice8W( outw );
712 return hr;
715 struct enum_devices_wtoa_params
717 LPDIENUMDEVICESCALLBACKA callback;
718 void *ref;
721 static BOOL CALLBACK enum_devices_wtoa_callback( const DIDEVICEINSTANCEW *instance_w, void *data )
723 struct enum_devices_wtoa_params *params = data;
724 DIDEVICEINSTANCEA instance_a = {sizeof(instance_a)};
726 dideviceinstance_wtoa( instance_w, &instance_a );
727 return params->callback( &instance_a, params->ref );
730 static HRESULT WINAPI dinput8_a_EnumDevices( IDirectInput8A *iface_a, DWORD type, LPDIENUMDEVICESCALLBACKA callback,
731 void *ref, DWORD flags )
733 struct enum_devices_wtoa_params params = {callback, ref};
734 IDirectInputImpl *impl = impl_from_IDirectInput8A( iface_a );
735 IDirectInput8W *iface_w = IDirectInput8W_from_impl( impl );
737 if (!callback) return DIERR_INVALIDPARAM;
739 return IDirectInput8_EnumDevices( iface_w, type, enum_devices_wtoa_callback, &params, flags );
742 static HRESULT WINAPI dinput8_a_GetDeviceStatus( IDirectInput8A *iface_a, REFGUID instance_guid )
744 IDirectInputImpl *impl = impl_from_IDirectInput8A( iface_a );
745 IDirectInput8W *iface_w = IDirectInput8W_from_impl( impl );
746 return IDirectInput8_GetDeviceStatus( iface_w, instance_guid );
749 static HRESULT WINAPI dinput8_a_RunControlPanel( IDirectInput8A *iface_a, HWND owner, DWORD flags )
751 IDirectInputImpl *impl = impl_from_IDirectInput8A( iface_a );
752 IDirectInput8W *iface_w = IDirectInput8W_from_impl( impl );
753 return IDirectInput8_RunControlPanel( iface_w, owner, flags );
756 static HRESULT WINAPI dinput8_a_Initialize( IDirectInput8A *iface_a, HINSTANCE instance, DWORD version )
758 IDirectInputImpl *impl = impl_from_IDirectInput8A( iface_a );
759 IDirectInput8W *iface_w = IDirectInput8W_from_impl( impl );
760 return IDirectInput8_Initialize( iface_w, instance, version );
763 static HRESULT WINAPI dinput8_a_FindDevice( IDirectInput8A *iface_a, REFGUID guid, const char *name_a, GUID *instance_guid )
765 IDirectInputImpl *impl = impl_from_IDirectInput8A( iface_a );
766 IDirectInput8W *iface_w = IDirectInput8W_from_impl( impl );
767 HRESULT hr;
768 WCHAR *name_w;
770 if (FAILED(hr = string_atow( name_a, &name_w ))) return hr;
772 hr = IDirectInput8_FindDevice( iface_w, guid, name_w, instance_guid );
773 HeapFree( GetProcessHeap(), 0, name_w );
774 return hr;
777 struct enum_devices_by_semantics_wtoa_params
779 LPDIENUMDEVICESBYSEMANTICSCBA callback;
780 void *ref;
783 static BOOL CALLBACK enum_devices_by_semantics_wtoa_callback( const DIDEVICEINSTANCEW *instance_w, IDirectInputDevice8W *iface_w,
784 DWORD flags, DWORD remaining, void *data )
786 struct enum_devices_by_semantics_wtoa_params *params = data;
787 IDirectInputDevice8A *iface_a = IDirectInputDevice8A_from_IDirectInputDevice8W( iface_w );
788 DIDEVICEINSTANCEA instance_a = {sizeof(instance_a)};
790 dideviceinstance_wtoa( instance_w, &instance_a );
791 return params->callback( &instance_a, iface_a, flags, remaining, params->ref );
794 static HRESULT WINAPI dinput8_a_EnumDevicesBySemantics( IDirectInput8A *iface_a, const char *username_a, DIACTIONFORMATA *format_a,
795 LPDIENUMDEVICESBYSEMANTICSCBA callback, void *ref, DWORD flags )
797 struct enum_devices_by_semantics_wtoa_params params = {callback, ref};
798 IDirectInputImpl *impl = impl_from_IDirectInput8A( iface_a );
799 DIACTIONFORMATW format_w = {sizeof(format_w), sizeof(DIACTIONW)};
800 IDirectInput8W *iface_w = IDirectInput8W_from_impl( impl );
801 HRESULT hr;
802 WCHAR *username_w;
804 if (!callback) return DIERR_INVALIDPARAM;
805 if (FAILED(hr = string_atow( username_a, &username_w ))) return hr;
807 format_w.dwNumActions = format_a->dwNumActions;
808 format_w.rgoAction = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, format_a->dwNumActions * sizeof(DIACTIONW) );
809 if (!format_w.rgoAction) hr = DIERR_OUTOFMEMORY;
810 else
812 diactionformat_atow( format_a, &format_w, FALSE );
813 hr = IDirectInput8_EnumDevicesBySemantics( iface_w, username_w, &format_w, enum_devices_by_semantics_wtoa_callback,
814 &params, flags );
815 HeapFree( GetProcessHeap(), 0, format_w.rgoAction );
818 HeapFree( GetProcessHeap(), 0, username_w );
819 return hr;
822 static HRESULT WINAPI dinput8_a_ConfigureDevices( IDirectInput8A *iface_a, LPDICONFIGUREDEVICESCALLBACK callback,
823 DICONFIGUREDEVICESPARAMSA *params_a, DWORD flags, void *ref )
825 IDirectInputImpl *impl = impl_from_IDirectInput8A( iface_a );
826 IDirectInput8W *iface_w = IDirectInput8W_from_impl( impl );
827 DICONFIGUREDEVICESPARAMSW params_w = {sizeof(params_w)};
828 DIACTIONFORMATA *format_a = params_a->lprgFormats;
829 DIACTIONFORMATW format_w = {sizeof(format_w), sizeof(DIACTIONW)};
830 HRESULT hr;
831 DWORD i;
833 if (!callback) return DIERR_INVALIDPARAM;
834 if (FAILED(hr = diconfiguredevicesparams_atow( params_a, &params_w ))) return hr;
836 format_w.dwNumActions = format_a->dwNumActions;
837 format_w.rgoAction = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, format_a->dwNumActions * sizeof(DIACTIONW) );
838 if (!format_w.rgoAction) hr = DIERR_OUTOFMEMORY;
839 else
841 hr = diactionformat_atow( format_a, &format_w, TRUE );
842 params_w.lprgFormats = &format_w;
844 if (SUCCEEDED(hr)) hr = IDirectInput8_ConfigureDevices( iface_w, callback, &params_w, flags, ref );
846 if (!format_w.hInstString) for (i = 0; i < format_w.dwNumActions; ++i) HeapFree( GetProcessHeap(), 0, (void *)format_w.rgoAction[i].lptszActionName );
847 HeapFree( GetProcessHeap(), 0, format_w.rgoAction );
850 HeapFree( GetProcessHeap(), 0, params_w.lptszUserNames );
851 return hr;
854 const IDirectInput8AVtbl dinput8_a_vtbl =
856 /*** IUnknown methods ***/
857 dinput8_a_QueryInterface,
858 dinput8_a_AddRef,
859 dinput8_a_Release,
860 /*** IDirectInput8A methods ***/
861 dinput8_a_CreateDevice,
862 dinput8_a_EnumDevices,
863 dinput8_a_GetDeviceStatus,
864 dinput8_a_RunControlPanel,
865 dinput8_a_Initialize,
866 dinput8_a_FindDevice,
867 dinput8_a_EnumDevicesBySemantics,
868 dinput8_a_ConfigureDevices,
871 static HRESULT WINAPI dinput7_a_QueryInterface( IDirectInput7A *iface_a, REFIID iid, void **out )
873 IDirectInputImpl *impl = impl_from_IDirectInput7A( iface_a );
874 IDirectInput7W *iface_w = IDirectInput7W_from_impl( impl );
875 return IDirectInput7_QueryInterface( iface_w, iid, out );
878 static ULONG WINAPI dinput7_a_AddRef( IDirectInput7A *iface_a )
880 IDirectInputImpl *impl = impl_from_IDirectInput7A( iface_a );
881 IDirectInput7W *iface_w = IDirectInput7W_from_impl( impl );
882 return IDirectInput7_AddRef( iface_w );
885 static ULONG WINAPI dinput7_a_Release( IDirectInput7A *iface_a )
887 IDirectInputImpl *impl = impl_from_IDirectInput7A( iface_a );
888 IDirectInput7W *iface_w = IDirectInput7W_from_impl( impl );
889 return IDirectInput7_Release( iface_w );
892 static HRESULT WINAPI dinput7_a_CreateDevice( IDirectInput7A *iface_a, REFGUID guid, IDirectInputDeviceA **out_a, IUnknown *outer )
894 IDirectInputImpl *impl = impl_from_IDirectInput7A( iface_a );
895 IDirectInput7W *iface_w = IDirectInput7W_from_impl( impl );
896 IDirectInputDeviceW *out_w;
897 HRESULT hr;
899 if (!out_a) return E_POINTER;
901 hr = IDirectInput7_CreateDevice( iface_w, guid, &out_w, outer );
902 *out_a = IDirectInputDeviceA_from_IDirectInputDeviceW( out_w );
903 return hr;
906 static HRESULT WINAPI dinput7_a_EnumDevices( IDirectInput7A *iface_a, DWORD type, LPDIENUMDEVICESCALLBACKA callback,
907 void *ref, DWORD flags )
909 struct enum_devices_wtoa_params params = {callback, ref};
910 IDirectInputImpl *impl = impl_from_IDirectInput7A( iface_a );
911 IDirectInput7W *iface_w = IDirectInput7W_from_impl( impl );
913 if (!callback) return DIERR_INVALIDPARAM;
915 return IDirectInput7_EnumDevices( iface_w, type, enum_devices_wtoa_callback, &params, flags );
918 static HRESULT WINAPI dinput7_a_GetDeviceStatus( IDirectInput7A *iface_a, REFGUID instance_guid )
920 IDirectInputImpl *impl = impl_from_IDirectInput7A( iface_a );
921 IDirectInput7W *iface_w = IDirectInput7W_from_impl( impl );
922 return IDirectInput7_GetDeviceStatus( iface_w, instance_guid );
925 static HRESULT WINAPI dinput7_a_RunControlPanel( IDirectInput7A *iface_a, HWND owner, DWORD flags )
927 IDirectInputImpl *impl = impl_from_IDirectInput7A( iface_a );
928 IDirectInput7W *iface_w = IDirectInput7W_from_impl( impl );
929 return IDirectInput7_RunControlPanel( iface_w, owner, flags );
932 static HRESULT WINAPI dinput7_a_Initialize( IDirectInput7A *iface_a, HINSTANCE instance, DWORD version )
934 IDirectInputImpl *impl = impl_from_IDirectInput7A( iface_a );
935 IDirectInput7W *iface_w = IDirectInput7W_from_impl( impl );
936 return IDirectInput7_Initialize( iface_w, instance, version );
939 static HRESULT WINAPI dinput7_a_FindDevice( IDirectInput7A *iface_a, REFGUID guid, const char *name_a, GUID *instance_guid )
941 IDirectInputImpl *impl = impl_from_IDirectInput7A( iface_a );
942 IDirectInput7W *iface_w = IDirectInput7W_from_impl( impl );
943 HRESULT hr;
944 WCHAR *name_w;
946 if (FAILED(hr = string_atow( name_a, &name_w ))) return hr;
948 hr = IDirectInput7_FindDevice( iface_w, guid, name_w, instance_guid );
949 HeapFree( GetProcessHeap(), 0, name_w );
950 return hr;
953 static HRESULT WINAPI dinput7_a_CreateDeviceEx( IDirectInput7A *iface_a, REFGUID guid, REFIID iid, void **out, IUnknown *outer )
955 IDirectInputImpl *impl = impl_from_IDirectInput7A( iface_a );
956 IDirectInput7W *iface_w = IDirectInput7W_from_impl( impl );
957 return IDirectInput7_CreateDeviceEx( iface_w, guid, iid, out, outer );
960 const IDirectInput7AVtbl dinput7_a_vtbl =
962 /*** IUnknown methods ***/
963 dinput7_a_QueryInterface,
964 dinput7_a_AddRef,
965 dinput7_a_Release,
966 /*** IDirectInputA methods ***/
967 dinput7_a_CreateDevice,
968 dinput7_a_EnumDevices,
969 dinput7_a_GetDeviceStatus,
970 dinput7_a_RunControlPanel,
971 dinput7_a_Initialize,
972 /*** IDirectInput2A methods ***/
973 dinput7_a_FindDevice,
974 /*** IDirectInput7A methods ***/
975 dinput7_a_CreateDeviceEx,