Vitaliy Margolen : dinput: Implement GetObjectInfo[A|W] in base device class.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Jan 4 04:45:06 CST 2007


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

Author: Vitaliy Margolen <wine-patches at kievinfo.com>
Date:   Wed Jan  3 23:04:24 2007 -0700

dinput: Implement GetObjectInfo[A|W] in base device class.

---

 dlls/dinput/device.c |   79 +++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 72 insertions(+), 7 deletions(-)

diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c
index 944091c..460c7ee 100644
--- a/dlls/dinput/device.c
+++ b/dlls/dinput/device.c
@@ -294,6 +294,12 @@ void release_DataFormat(DataFormat * for
     format->user_df = NULL;
 }
 
+inline LPDIOBJECTDATAFORMAT dataformat_to_odf(LPCDIDATAFORMAT df, int idx)
+{
+    if (idx < 0 || idx >= df->dwNumObjs) return NULL;
+    return (LPDIOBJECTDATAFORMAT)((LPBYTE)df->rgodf + idx * df->dwObjSize);
+}
+
 /* Make all instances sequential */
 static void calculate_ids(LPDIDATAFORMAT df)
 {
@@ -971,10 +977,29 @@ HRESULT WINAPI IDirectInputDevice2AImpl_
 	DWORD dwObj,
 	DWORD dwHow)
 {
-    FIXME("(this=%p,%p,%d,0x%08x): stub!\n",
-	  iface, pdidoi, dwObj, dwHow);
-    
-    return DI_OK;
+    DIDEVICEOBJECTINSTANCEW didoiW;
+    HRESULT res;
+
+    if (!pdidoi ||
+        (pdidoi->dwSize != sizeof(DIDEVICEOBJECTINSTANCEA) &&
+         pdidoi->dwSize != sizeof(DIDEVICEOBJECTINSTANCE_DX3A)))
+        return DIERR_INVALIDPARAM;
+
+    didoiW.dwSize = sizeof(didoiW);
+    res = IDirectInputDevice2WImpl_GetObjectInfo((LPDIRECTINPUTDEVICE8W)iface, &didoiW, dwObj, dwHow);
+    if (res == DI_OK)
+    {
+        DWORD dwSize = pdidoi->dwSize;
+
+        memset(pdidoi, 0, pdidoi->dwSize);
+        pdidoi->dwSize   = dwSize;
+        pdidoi->guidType = didoiW.guidType;
+        pdidoi->dwOfs    = didoiW.dwOfs;
+        pdidoi->dwType   = didoiW.dwType;
+        pdidoi->dwFlags  = didoiW.dwFlags;
+    }
+
+    return res;
 }
 
 HRESULT WINAPI IDirectInputDevice2WImpl_GetObjectInfo(
@@ -983,9 +1008,49 @@ HRESULT WINAPI IDirectInputDevice2WImpl_
 	DWORD dwObj,
 	DWORD dwHow)
 {
-    FIXME("(this=%p,%p,%d,0x%08x): stub!\n",
-	  iface, pdidoi, dwObj, dwHow);
-    
+    IDirectInputDevice2AImpl *This = (IDirectInputDevice2AImpl *)iface;
+    DWORD dwSize = pdidoi->dwSize;
+    LPDIOBJECTDATAFORMAT odf;
+    int idx = -1;
+
+    TRACE("(%p) %d(0x%08x) -> %p\n", This, dwHow, dwObj, pdidoi);
+
+    if (!pdidoi ||
+        (pdidoi->dwSize != sizeof(DIDEVICEOBJECTINSTANCEW) &&
+         pdidoi->dwSize != sizeof(DIDEVICEOBJECTINSTANCE_DX3W)))
+        return DIERR_INVALIDPARAM;
+
+    switch (dwHow)
+    {
+    case DIPH_BYOFFSET:
+        if (!This->data_format.offsets) break;
+        for (idx = This->data_format.wine_df->dwNumObjs - 1; idx >= 0; idx--)
+            if (This->data_format.offsets[idx] == dwObj) break;
+        break;
+    case DIPH_BYID:
+        dwObj &= 0x00ffffff;
+        for (idx = This->data_format.wine_df->dwNumObjs - 1; idx >= 0; idx--)
+            if ((dataformat_to_odf(This->data_format.wine_df, idx)->dwType & 0x00ffffff) == dwObj)
+                break;
+        break;
+
+    case DIPH_BYUSAGE:
+        FIXME("dwHow = DIPH_BYUSAGE not implemented\n");
+        break;
+    default:
+        WARN("invalid parameter: dwHow = %08x\n", dwHow);
+        return DIERR_INVALIDPARAM;
+    }
+    if (idx < 0) return DIERR_OBJECTNOTFOUND;
+
+    odf = dataformat_to_odf(This->data_format.wine_df, idx);
+    memset(pdidoi, 0, pdidoi->dwSize);
+    pdidoi->dwSize   = dwSize;
+    pdidoi->guidType = *odf->pguid;
+    pdidoi->dwOfs    = This->data_format.offsets ? This->data_format.offsets[idx] : odf->dwOfs;
+    pdidoi->dwType   = odf->dwType;
+    pdidoi->dwFlags  = odf->dwFlags;
+
     return DI_OK;
 }
 




More information about the wine-cvs mailing list