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