Vitaliy Margolen : dinput: Add user data format into base class. Implement SetDataFormat.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Dec 12 14:29:52 CST 2006


Module: wine
Branch: master
Commit: 3446caab56efa1ca6c038dcac7a80c026229f7b3
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3446caab56efa1ca6c038dcac7a80c026229f7b3

Author: Vitaliy Margolen <wine-patches at kievinfo.com>
Date:   Tue Dec 12 08:58:02 2006 -0700

dinput: Add user data format into base class. Implement SetDataFormat.

---

 dlls/dinput/device.c         |   46 +++++++++++++++++++++++++++++++++--------
 dlls/dinput/device_private.h |    6 +++-
 2 files changed, 41 insertions(+), 11 deletions(-)

diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c
index b6f675d..269fc06 100644
--- a/dlls/dinput/device.c
+++ b/dlls/dinput/device.c
@@ -288,6 +288,10 @@ void release_DataFormat(DataFormat * for
     format->dt = NULL;
     HeapFree(GetProcessHeap(), 0, format->offsets);
     format->offsets = NULL;
+    if (format->user_df)
+        HeapFree(GetProcessHeap(), 0, format->user_df->rgodf);
+    HeapFree(GetProcessHeap(), 0, format->user_df);
+    format->user_df = NULL;
 }
 
 /* Make all instances sequential */
@@ -332,7 +336,7 @@ static void calculate_ids(LPDIDATAFORMAT
     }
 }
 
-HRESULT create_DataFormat(LPCDIDATAFORMAT wine_format, LPDIDATAFORMAT asked_format, DataFormat *format)
+HRESULT create_DataFormat(LPCDIDATAFORMAT wine_format, LPCDIDATAFORMAT asked_format, DataFormat *format)
 {
     DataTransform *dt;
     unsigned int i, j;
@@ -348,6 +352,14 @@ HRESULT create_DataFormat(LPCDIDATAFORMA
     if (!(format->offsets = HeapAlloc(GetProcessHeap(), 0, wine_format->dwNumObjs * sizeof(int))))
         goto failed;
 
+    if (!(format->user_df = HeapAlloc(GetProcessHeap(), 0, asked_format->dwSize)))
+        goto failed;
+    memcpy(format->user_df, asked_format, asked_format->dwSize);
+
+    if (!(format->user_df->rgodf = HeapAlloc(GetProcessHeap(), 0, asked_format->dwNumObjs*asked_format->dwObjSize)))
+        goto failed;
+    memcpy(format->user_df->rgodf, asked_format->rgodf, asked_format->dwNumObjs*asked_format->dwObjSize);
+
     TRACE("Creating DataTransform :\n");
     
     for (i = 0; i < wine_format->dwNumObjs; i++) {
@@ -450,7 +462,7 @@ HRESULT create_DataFormat(LPCDIDATAFORMA
     HeapFree(GetProcessHeap(), 0, done);
 
     /* Last step - reset all instances of the new format */
-    calculate_ids(asked_format);
+    calculate_ids(format->user_df);
     return DI_OK;
 
 failed:
@@ -459,6 +471,10 @@ failed:
     format->dt = NULL;
     HeapFree(GetProcessHeap(), 0, format->offsets);
     format->offsets = NULL;
+    if (format->user_df)
+        HeapFree(GetProcessHeap(), 0, format->user_df->rgodf);
+    HeapFree(GetProcessHeap(), 0, format->user_df);
+    format->user_df = NULL;
 
     return DIERR_OUTOFMEMORY;
 }
@@ -570,6 +586,8 @@ HRESULT WINAPI IDirectInputDevice2AImpl_
     IDirectInputDevice2AImpl *This = (IDirectInputDevice2AImpl *)iface;
     HRESULT res;
 
+    if (!This->data_format.user_df) return DIERR_INVALIDPARAM;
+
     EnterCriticalSection(&This->crit);
     res = This->acquired ? S_FALSE : DI_OK;
     This->acquired = 1;
@@ -602,15 +620,25 @@ HRESULT WINAPI IDirectInputDevice2AImpl_
  */
 
 HRESULT WINAPI IDirectInputDevice2AImpl_SetDataFormat(
-	LPDIRECTINPUTDEVICE8A iface,LPCDIDATAFORMAT df
-) {
+        LPDIRECTINPUTDEVICE8A iface, LPCDIDATAFORMAT df)
+{
     IDirectInputDevice2AImpl *This = (IDirectInputDevice2AImpl *)iface;
-    
-    TRACE("(this=%p,%p)\n",This,df);
-    
+    HRESULT res = DI_OK;
+
+    if (!df) return E_POINTER;
+    TRACE("(%p) %p\n", This, df);
     _dump_DIDATAFORMAT(df);
-    
-    return DI_OK;
+
+    if (df->dwSize != sizeof(DIDATAFORMAT)) return DIERR_INVALIDPARAM;
+    if (This->acquired) return DIERR_ACQUIRED;
+
+    EnterCriticalSection(&This->crit);
+
+    release_DataFormat(&This->data_format);
+    res = create_DataFormat(This->data_format.wine_df, df, &This->data_format);
+
+    LeaveCriticalSection(&This->crit);
+    return res;
 }
 
 /******************************************************************************
diff --git a/dlls/dinput/device_private.h b/dlls/dinput/device_private.h
index fb5eac2..eb6aa8e 100644
--- a/dlls/dinput/device_private.h
+++ b/dlls/dinput/device_private.h
@@ -40,7 +40,9 @@ typedef struct
     int                         internal_format_size;
     DataTransform              *dt;
 
-    int                        *offsets;    /* object offsets */
+    int                        *offsets;     /* object offsets */
+    LPCDIDATAFORMAT             wine_df;     /* wine internal data format */
+    LPDIDATAFORMAT              user_df;     /* user defined data format */
 } DataFormat;
 
 /* Device implementation */
@@ -67,7 +69,7 @@ struct IDirectInputDevice2AImpl
 
 /* Routines to do DataFormat / WineFormat conversions */
 extern void fill_DataFormat(void *out, const void *in, DataFormat *df) ;
-extern HRESULT create_DataFormat(LPCDIDATAFORMAT wine_format, LPDIDATAFORMAT asked_format, DataFormat *format);
+extern HRESULT create_DataFormat(LPCDIDATAFORMAT wine_format, LPCDIDATAFORMAT asked_format, DataFormat *format);
 extern void release_DataFormat(DataFormat *df) ;
 extern void queue_event(LPDIRECTINPUTDEVICE8A iface, int ofs, DWORD data, DWORD time, DWORD seq);
 /* Helper functions to work with data format */




More information about the wine-cvs mailing list