866 lines
23 KiB
C
866 lines
23 KiB
C
/*****************************************************************************
|
||
*
|
||
* DIGenX.c
|
||
*
|
||
* Copyright (c) 1996 Microsoft Corporation. All Rights Reserved.
|
||
*
|
||
* Abstract:
|
||
*
|
||
* Generic IDirectInputDevice callback for uninitialized devices.
|
||
*
|
||
* Contents:
|
||
*
|
||
* CNil_CreateInstance
|
||
*
|
||
*****************************************************************************/
|
||
|
||
#include "dinputpr.h"
|
||
|
||
/*****************************************************************************
|
||
*
|
||
* The sqiffle for this file.
|
||
*
|
||
*****************************************************************************/
|
||
|
||
#define sqfl sqflNil
|
||
|
||
/*****************************************************************************
|
||
*
|
||
* Note! This is not a normal refcounted interface. It is
|
||
* a static object whose sole purpose is to keep the seat warm
|
||
* until the IDirectInputDevice gets Initialize()d.
|
||
*
|
||
*****************************************************************************/
|
||
|
||
/*****************************************************************************
|
||
*
|
||
* @doc INTERNAL
|
||
*
|
||
* @method HRESULT | CNil | QueryInterface |
|
||
*
|
||
* Gives a client access to other interfaces on an object.
|
||
*
|
||
* We're not a real object, so we don't have any interfaces.
|
||
*
|
||
*
|
||
* @parm IN REFIID | riid |
|
||
*
|
||
* The requested interface's IID.
|
||
*
|
||
* @parm OUT LPVOID * | ppvObj |
|
||
*
|
||
* Receives a pointer to the obtained interface.
|
||
*
|
||
* @returns
|
||
*
|
||
* Returns a COM error code.
|
||
*
|
||
* @xref OLE documentation for <mf IUnknown::QueryInterface>.
|
||
*
|
||
*****************************************************************************/
|
||
|
||
STDMETHODIMP
|
||
CNil_QueryInterface(PDICB pdcb, REFIID riid, PPV ppvObj)
|
||
{
|
||
return E_NOTIMPL;
|
||
}
|
||
|
||
/*****************************************************************************
|
||
*
|
||
* @doc INTERNAL
|
||
*
|
||
* @method HRESULT | CNil | AddRef |
|
||
*
|
||
* Increments the reference count for the interface.
|
||
*
|
||
* We are always here, so the refcount is meaningless.
|
||
*
|
||
*****************************************************************************
|
||
*
|
||
* @doc INTERNAL
|
||
*
|
||
* @method HRESULT | CNil | Release |
|
||
*
|
||
* Increments the reference count for the interface.
|
||
*
|
||
* We are always here, so the refcount is meaningless.
|
||
*
|
||
*****************************************************************************/
|
||
|
||
STDMETHODIMP_(ULONG)
|
||
CNil_AddRefRelease(PDICB pdcb)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
#define CNil_AddRef CNil_AddRefRelease
|
||
#define CNil_Release CNil_AddRefRelease
|
||
|
||
/*****************************************************************************
|
||
*
|
||
* You might think we could just write a bunch of stubs,
|
||
* <f CNil_NotInit0>,
|
||
* <f CNil_NotInit4>,
|
||
* <f CNil_NotInit8>, and so on, one for each arity, and
|
||
* point all of the methods at the appropriate stub.
|
||
*
|
||
* However, you would be wrong. Some processors (especially
|
||
* the 68k series) have weird calling conventions which depend
|
||
* on things other than just the number of bytes of parameters.
|
||
*
|
||
*****************************************************************************/
|
||
|
||
/*****************************************************************************
|
||
*
|
||
* @doc INTERNAL
|
||
*
|
||
* @method HRESULT | CNil | GetInstance |
|
||
*
|
||
* Called by DirectInput to obtain the DirectInput instance
|
||
* handle that was created by the DirectInput device driver.
|
||
*
|
||
* @parm LPVOID * | ppvInst |
|
||
*
|
||
* Receives the DirectInput instance handle created by the
|
||
* DirectInput device driver. This instance handle is returned
|
||
* to the device-specific driver, which in turn is given to
|
||
* the device callback via a private mechanism.
|
||
*
|
||
* If the device callback does not use a device driver, then
|
||
* 0 is returned in this variable.
|
||
*
|
||
* @returns
|
||
*
|
||
* <c DIERR_NOTINITIALIZED> because we are the canonical
|
||
* uninitialized device.
|
||
*
|
||
*****************************************************************************/
|
||
|
||
STDMETHODIMP
|
||
CNil_GetInstance(PDICB pdcb, LPVOID *ppvInst)
|
||
{
|
||
/*
|
||
* This should never happen; we don't get called until we're sure
|
||
* it's okay.
|
||
*/
|
||
AssertF(0);
|
||
RPF("ERROR: IDirectInputDevice: Not initialized");
|
||
return DIERR_NOTINITIALIZED;
|
||
}
|
||
|
||
/****************************************************************************
|
||
*
|
||
* @doc INTERNAL
|
||
*
|
||
* @method HRESULT | CNil | GetDataFormat |
|
||
*
|
||
* Called by DirectInput to obtain the device's preferred
|
||
* data format.
|
||
*
|
||
* @parm OUT LPDIDATAFORMAT * | ppdidf |
|
||
*
|
||
* <t LPDIDEVICEFORMAT> to receive pointer to device format.
|
||
*
|
||
* @returns
|
||
*
|
||
* <c DIERR_NOTINITIALIZED> because we are the canonical
|
||
* uninitialized device.
|
||
*
|
||
****************************************************************************/
|
||
|
||
STDMETHODIMP
|
||
CNil_GetDataFormat(PDICB pdcb, LPDIDATAFORMAT *ppdidf)
|
||
{
|
||
/*
|
||
* This should never happen; we don't get called until we're sure
|
||
* it's okay.
|
||
*/
|
||
AssertF(0);
|
||
RPF("ERROR: IDirectInputDevice: Not initialized");
|
||
return DIERR_NOTINITIALIZED;
|
||
}
|
||
|
||
/****************************************************************************
|
||
*
|
||
* @doc INTERNAL
|
||
*
|
||
* @method HRESULT | CNil | GetObjectInfo |
|
||
*
|
||
* Obtain the friendly name of an object, passwed by index
|
||
* into the preferred data format.
|
||
*
|
||
* @parm IN LPCDIPROPINFO | ppropi |
|
||
*
|
||
* Information describing the object being accessed.
|
||
*
|
||
* @parm IN OUT LPDIDEVICEOBJECTINSTANCEW | pdidioiW |
|
||
*
|
||
* Structure to receive information. The
|
||
* <e DIDEVICEOBJECTINSTANCE.guidType>,
|
||
* <e DIDEVICEOBJECTINSTANCE.dwOfs>,
|
||
* and
|
||
* <e DIDEVICEOBJECTINSTANCE.dwType>
|
||
* fields have already been filled in.
|
||
*
|
||
* @returns
|
||
*
|
||
* <c DIERR_NOTINITIALIZED> because we are the canonical
|
||
* uninitialized device.
|
||
*
|
||
****************************************************************************/
|
||
|
||
STDMETHODIMP
|
||
CNil_GetObjectInfo(PDICB pdcb, LPCDIPROPINFO ppropi,
|
||
LPDIDEVICEOBJECTINSTANCEW pdidioiW)
|
||
{
|
||
/*
|
||
* This should never happen; didev.c validates the device
|
||
* before calling us.
|
||
*/
|
||
AssertF(0);
|
||
RPF("ERROR: IDirectInputDevice: Not initialized");
|
||
return DIERR_NOTINITIALIZED;
|
||
}
|
||
|
||
/****************************************************************************
|
||
*
|
||
* @doc INTERNAL
|
||
*
|
||
* @method HRESULT | CNil | GetCapabilities |
|
||
*
|
||
* Obtain device capabilities.
|
||
*
|
||
* @parm LPDIDEVCAPS | pdidc |
|
||
*
|
||
* Device capabilities structure to receive result.
|
||
*
|
||
* @returns
|
||
*
|
||
* <c DIERR_NOTINITIALIZED> because we are the canonical
|
||
* uninitialized device.
|
||
*
|
||
****************************************************************************/
|
||
|
||
STDMETHODIMP
|
||
CNil_GetCapabilities(PDICB pdcb, LPDIDEVCAPS pdidc)
|
||
{
|
||
/*
|
||
* This may legitimately be called, because it comes from
|
||
* a client calling IDirectInputDevice::GetCapabilities.
|
||
*/
|
||
RPF("ERROR: IDirectInputDevice: Not initialized");
|
||
return DIERR_NOTINITIALIZED;
|
||
}
|
||
|
||
/****************************************************************************
|
||
*
|
||
* @doc INTERNAL
|
||
*
|
||
* @method HRESULT | CNil | Acquire |
|
||
*
|
||
* Begin data acquisition.
|
||
*
|
||
* It is the caller's responsibility to have set the
|
||
* data format before obtaining acquisition.
|
||
*
|
||
* @returns
|
||
*
|
||
* <c DIERR_NOTINITIALIZED> because we are the canonical
|
||
* uninitialized device.
|
||
*
|
||
****************************************************************************/
|
||
|
||
STDMETHODIMP
|
||
CNil_Acquire(PDICB pdcb)
|
||
{
|
||
/*
|
||
* This should never happen; we don't get called until
|
||
* after the data format is set.
|
||
*/
|
||
AssertF(0);
|
||
RPF("ERROR: IDirectInputDevice: Not initialized");
|
||
return DIERR_NOTINITIALIZED;
|
||
}
|
||
|
||
/****************************************************************************
|
||
*
|
||
* @doc INTERNAL
|
||
*
|
||
* @method HRESULT | CNil | Unacquire |
|
||
*
|
||
* End data acquisition.
|
||
*
|
||
* It is the caller's responsibility to have set the
|
||
* data format before obtaining acquisition.
|
||
*
|
||
* @returns
|
||
*
|
||
* <c DIERR_NOTINITIALIZED> because we are the canonical
|
||
* uninitialized device.
|
||
*
|
||
***************************************************************************/
|
||
|
||
STDMETHODIMP
|
||
CNil_Unacquire(PDICB pdcb)
|
||
{
|
||
/*
|
||
* This should never happen; we don't get called until
|
||
* we've acquired, which never works.
|
||
*/
|
||
AssertF(0);
|
||
RPF("ERROR: IDirectInputDevice: Not initialized");
|
||
return DIERR_NOTINITIALIZED;
|
||
}
|
||
|
||
/****************************************************************************
|
||
*
|
||
* @doc INTERNAL
|
||
*
|
||
* @method HRESULT | CNil | GetDeviceState |
|
||
*
|
||
* Obtain instantaneous device state.
|
||
*
|
||
* @parm OUT LPVOID | lpvBuf |
|
||
*
|
||
* Buffer to receive device state.
|
||
*
|
||
* @returns
|
||
*
|
||
* <c DIERR_NOTINITIALIZED> because we are the canonical
|
||
* uninitialized device.
|
||
*
|
||
***************************************************************************/
|
||
|
||
STDMETHODIMP
|
||
CNil_GetDeviceState(PDICB pdcb, LPVOID lpvBuf)
|
||
{
|
||
/*
|
||
* This may legitimately be called, because it happens only
|
||
* when the device is already acquired, which never happens.
|
||
*/
|
||
AssertF(0);
|
||
RPF("ERROR: IDirectInputDevice: Not initialized");
|
||
return DIERR_NOTINITIALIZED;
|
||
}
|
||
|
||
/****************************************************************************
|
||
*
|
||
* @doc INTERNAL
|
||
*
|
||
* @method HRESULT | CNil | GetDeviceInfo |
|
||
*
|
||
* Obtain the product id.
|
||
*
|
||
* @parm LPDIDEVICEINSTANCEW | lpdidiW |
|
||
*
|
||
* (out) <t DEVICEINSTANCE> to be filled in. The
|
||
* <e DEVICEINSTANCE.dwSize> and <e DEVICEINSTANCE.guidInstance>
|
||
* have already been filled in.
|
||
*
|
||
* @returns
|
||
*
|
||
* <c DIERR_NOTINITIALIZED> because we are the canonical
|
||
* uninitialized device.
|
||
*
|
||
***************************************************************************/
|
||
|
||
STDMETHODIMP
|
||
CNil_GetDeviceInfo(PDICB pdcb, LPDIDEVICEINSTANCEW lpdidiW)
|
||
{
|
||
/*
|
||
* This may legitimately be called, because it comes from
|
||
* a client calling IDirectInputDevice::GetDeviceInfo.
|
||
*/
|
||
RPF("ERROR: IDirectInputDevice: Not initialized");
|
||
return DIERR_NOTINITIALIZED;
|
||
}
|
||
|
||
/****************************************************************************
|
||
*
|
||
* @doc INTERNAL
|
||
*
|
||
* @method HRESULT | CNil | GetProperty |
|
||
*
|
||
* Retrieve a device property.
|
||
*
|
||
* @parm IN LPCDIPROPINFO | ppropi |
|
||
*
|
||
* Information describing the property being retrieved.
|
||
*
|
||
* @parm OUT LPDIPROPHEADER | pdiph |
|
||
*
|
||
* Where to put the property value.
|
||
*
|
||
* @returns
|
||
*
|
||
* <c DIERR_NOTINITIALIZED> because we are the canonical
|
||
* uninitialized device.
|
||
*
|
||
*****************************************************************************/
|
||
|
||
STDMETHODIMP
|
||
CNil_GetProperty(PDICB pdcb, LPCDIPROPINFO ppropi, LPDIPROPHEADER lpdiph)
|
||
{
|
||
/*
|
||
* This may legitimately be called, because it comes from
|
||
* a client calling IDirectInputDevice::GetProperty.
|
||
*/
|
||
RPF("ERROR: IDirectInputDevice: Not initialized");
|
||
return DIERR_NOTINITIALIZED;
|
||
}
|
||
|
||
/****************************************************************************
|
||
*
|
||
* @doc INTERNAL
|
||
*
|
||
* @method HRESULT | CNil | SetProperty |
|
||
*
|
||
* Set a device property.
|
||
*
|
||
* @parm IN LPCDIPROPINFO | ppropi |
|
||
*
|
||
* Information describing the property being retrieved.
|
||
*
|
||
* @parm IN LPCDIPROPHEADER | pdiph |
|
||
*
|
||
* Value of property.
|
||
*
|
||
* @returns
|
||
*
|
||
* <c DIERR_NOTINITIALIZED> because we are the canonical
|
||
* uninitialized device.
|
||
*
|
||
***************************************************************************/
|
||
|
||
STDMETHODIMP
|
||
CNil_SetProperty(PDICB pdcb, LPCDIPROPINFO ppropi, LPCDIPROPHEADER lpdiph)
|
||
{
|
||
/*
|
||
* This should never happen; didev.c validates the device
|
||
* before calling us.
|
||
*/
|
||
AssertF(0);
|
||
RPF("ERROR: IDirectInputDevice: Not initialized");
|
||
return DIERR_NOTINITIALIZED;
|
||
}
|
||
|
||
/****************************************************************************
|
||
*
|
||
* @doc INTERNAL
|
||
*
|
||
* @method HRESULT | CNil | SetEventNotification |
|
||
*
|
||
* Set the handle associated with the device.
|
||
*
|
||
* @parm HANDLE | h |
|
||
*
|
||
* Handle to be signalled when new data arrives.
|
||
*
|
||
* @returns
|
||
*
|
||
* <c DIERR_NOTINITIALIZED> because we are the canonical
|
||
* uninitialized device.
|
||
*
|
||
*****************************************************************************/
|
||
|
||
STDMETHODIMP
|
||
CNil_SetEventNotification(PDICB pdcb, HANDLE h)
|
||
{
|
||
/*
|
||
* This may legitimately be called, because it comes from
|
||
* a client calling IDirectInputDevice::SetEventNotification.
|
||
*/
|
||
RPF("ERROR: IDirectInputDevice: Not initialized");
|
||
return DIERR_NOTINITIALIZED;
|
||
}
|
||
|
||
/****************************************************************************
|
||
*
|
||
* @doc INTERNAL
|
||
*
|
||
* @method HRESULT | CNil | SetCooperativeLevel |
|
||
*
|
||
* Set the device cooperativity level. Device callbacks
|
||
* typically need only respond to the <c DISCL_EXCLUSIVE> bit.
|
||
*
|
||
* @parm IN HWND | hwnd |
|
||
*
|
||
* The window handle.
|
||
*
|
||
* @parm IN DWORD | dwFlags |
|
||
*
|
||
* The cooperativity level.
|
||
*
|
||
* @returns
|
||
*
|
||
* <c DIERR_NOTINITIALIZED> because we are the canonical
|
||
* uninitialized device.
|
||
*
|
||
*****************************************************************************/
|
||
|
||
STDMETHODIMP
|
||
CNil_SetCooperativeLevel(PDICB pdcb, HWND hwnd, DWORD dwFlags)
|
||
{
|
||
/*
|
||
* This may legitimately be called, because it comes from
|
||
* a client calling IDirectInputDevice::SetCooperativeLevel.
|
||
*/
|
||
RPF("ERROR: IDirectInputDevice: Not initialized");
|
||
return DIERR_NOTINITIALIZED;
|
||
}
|
||
|
||
/****************************************************************************
|
||
*
|
||
* @doc INTERNAL
|
||
*
|
||
* @method HRESULT | CNil | RunControlPanel |
|
||
*
|
||
* Run the control panel for the device.
|
||
*
|
||
* @parm HWND | hwndOwner |
|
||
*
|
||
* Owner window (if modal).
|
||
*
|
||
* @parm DWORD | fl |
|
||
*
|
||
* Flags.
|
||
*
|
||
* @returns
|
||
*
|
||
* <c DIERR_NOTINITIALIZED> because we are the canonical
|
||
* uninitialized device.
|
||
*
|
||
***************************************************************************/
|
||
|
||
STDMETHODIMP
|
||
CNil_RunControlPanel(PDICB pdcb, HWND hwndOwner, DWORD fl)
|
||
{
|
||
/*
|
||
* This may legitimately be called, because it comes from
|
||
* a client calling IDirectInputDevice::RunControlPanel.
|
||
*/
|
||
RPF("ERROR: IDirectInputDevice: Not initialized");
|
||
return DIERR_NOTINITIALIZED;
|
||
}
|
||
|
||
|
||
/****************************************************************************
|
||
*
|
||
* @doc INTERNAL
|
||
*
|
||
* @method HRESULT | CNil | CookDeviceData |
|
||
*
|
||
* Cook a piece of device data that was obtained from the
|
||
* data buffer. This data does not pass through the device
|
||
* callback, so it needs to be cooked externally. In
|
||
* comparison, device state information is obtained via
|
||
* DIDM_GETDEVICESTATE, which the callback can cook before
|
||
* returning.
|
||
*
|
||
* If the callback returns E_NOTIMPL, then the caller is
|
||
* permitted to cache the result <y for the entire device>
|
||
* (not merely for the device object) until the next DIDM_ACQUIRE.
|
||
*
|
||
* @parm UINT | cdod |
|
||
*
|
||
* Number of objects to cook. This can be zero, in which case
|
||
* the caller is checking whether the device requires cooking.
|
||
*
|
||
* @parm LPDIDEVICEOBJECTDATA | rgdod |
|
||
*
|
||
* Array of object data to cook.
|
||
*
|
||
* Note, however, that the <e DIDEVICEOBJETCDATA.dwOfs> fields
|
||
* are not what you think. The low word contains the application
|
||
* data offset (which is not important to the callback); the
|
||
* high word contains the object ID (traditionally called the
|
||
* "device type" code).
|
||
*
|
||
* @returns
|
||
*
|
||
* <c DIERR_NOTINITIALIZED> because we are the canonical
|
||
* uninitialized device.
|
||
*
|
||
***************************************************************************/
|
||
|
||
STDMETHODIMP
|
||
CNil_CookDeviceData(PDICB pdcb, UINT cdod, LPDIDEVICEOBJECTDATA rgdod)
|
||
{
|
||
/*
|
||
* This should never happen; we don't get called until we're sure
|
||
* it's okay.
|
||
*/
|
||
AssertF(0);
|
||
RPF("ERROR: IDirectInputDevice: Not initialized");
|
||
return DIERR_NOTINITIALIZED;
|
||
}
|
||
|
||
/****************************************************************************
|
||
*
|
||
* @doc INTERNAL
|
||
*
|
||
* @method HRESULT | CNil | CreateEffect |
|
||
*
|
||
* Create an <i IDirectInputEffectDriver> callback.
|
||
*
|
||
* @parm LPDIRECTINPUTEFFECTSHEPHERD * | ppes |
|
||
*
|
||
* Receives the shepherd for the effect driver.
|
||
*
|
||
* @returns
|
||
*
|
||
* <c DIERR_NOTINITIALIZED> because we are the canonical
|
||
* uninitialized device.
|
||
*
|
||
***************************************************************************/
|
||
|
||
STDMETHODIMP
|
||
CNil_CreateEffect(PDICB pdcb, LPDIRECTINPUTEFFECTSHEPHERD *ppes)
|
||
{
|
||
/*
|
||
* This may legitimately be called, because it comes from
|
||
* a client calling a force feedback method.
|
||
*/
|
||
*ppes = 0;
|
||
RPF("ERROR: IDirectInputDevice: Not initialized");
|
||
return DIERR_NOTINITIALIZED;
|
||
}
|
||
|
||
/****************************************************************************
|
||
*
|
||
* @doc INTERNAL
|
||
*
|
||
* @method HRESULT | CNil | GetFFConfigKey |
|
||
*
|
||
* Returns a handle to the registry key which contains
|
||
* force feedback configuration information.
|
||
*
|
||
* @parm DWORD | sam |
|
||
*
|
||
* Security access mask.
|
||
*
|
||
* @parm PHKEY | phk |
|
||
*
|
||
* Receives key handle on success.
|
||
*
|
||
* @returns
|
||
*
|
||
* <c DIERR_NOTINITIALIZED> because we are the canonical
|
||
* uninitialized device.
|
||
*
|
||
***************************************************************************/
|
||
|
||
STDMETHODIMP
|
||
CNil_GetFFConfigKey(PDICB pdcb, DWORD sam, PHKEY phk)
|
||
{
|
||
/*
|
||
* This should never happen; we don't get called until we're sure
|
||
* it's okay.
|
||
*/
|
||
AssertF(0);
|
||
RPF("ERROR: IDirectInputDevice: Not initialized");
|
||
return DIERR_NOTINITIALIZED;
|
||
}
|
||
|
||
/*****************************************************************************
|
||
*
|
||
* @doc INTERNAL
|
||
*
|
||
* @method HRESULT | CNil | SendDeviceData |
|
||
*
|
||
* Spew some data to the device.
|
||
*
|
||
* @parm IN LPCDIDEVICEOBJECTDATA | rgdod |
|
||
*
|
||
* Array of <t DIDEVICEOBJECTDATA> structures.
|
||
*
|
||
* @parm INOUT LPDWORD | pdwInOut |
|
||
*
|
||
* Number of items actually sent.
|
||
*
|
||
* @parm DWORD | fl |
|
||
*
|
||
* Flags.
|
||
*
|
||
* @returns
|
||
*
|
||
* <c DIERR_NOTINITIALIZED> because we are the canonical
|
||
* uninitialized device.
|
||
*
|
||
*****************************************************************************/
|
||
|
||
STDMETHODIMP
|
||
CNil_SendDeviceData(PDICB pdcb, LPCDIDEVICEOBJECTDATA rgdod,
|
||
LPDWORD pdwInOut, DWORD fl)
|
||
{
|
||
/*
|
||
* This should never happen; we don't get called until we're sure
|
||
* it's okay.
|
||
*/
|
||
AssertF(0);
|
||
RPF("ERROR: IDirectInputDevice: Not initialized");
|
||
return DIERR_NOTINITIALIZED;
|
||
}
|
||
|
||
/****************************************************************************
|
||
*
|
||
* @doc INTERNAL
|
||
*
|
||
* @method HRESULT | CNil | Poll |
|
||
*
|
||
* Poll the device as necessary.
|
||
*
|
||
* @returns
|
||
*
|
||
* <c DIERR_NOTINITIALIZED> because we are the canonical
|
||
* uninitialized device.
|
||
*
|
||
***************************************************************************/
|
||
|
||
STDMETHODIMP
|
||
CNil_Poll(PDICB pdcb)
|
||
{
|
||
/*
|
||
* This should never happen; we don't get called until we're sure
|
||
* it's okay.
|
||
*/
|
||
AssertF(0);
|
||
RPF("ERROR: IDirectInputDevice: Not initialized");
|
||
return DIERR_NOTINITIALIZED;
|
||
}
|
||
|
||
/****************************************************************************
|
||
*
|
||
* @doc INTERNAL
|
||
*
|
||
* @method HRESULT | CNil | MapUsage |
|
||
*
|
||
* Given a usage and usage page (munged into a single
|
||
* <t DWORD>), find a device object that matches it.
|
||
*
|
||
* @returns
|
||
*
|
||
* <c DIERR_NOTINITIALIZED> because we are the canonical
|
||
* uninitialized device.
|
||
*
|
||
***************************************************************************/
|
||
|
||
STDMETHODIMP
|
||
CNil_MapUsage(PDICB pdcb, DWORD dwUsage, PINT piOut)
|
||
{
|
||
/*
|
||
* This should never happen; we don't get called until we're sure
|
||
* it's okay.
|
||
*/
|
||
AssertF(0);
|
||
RPF("ERROR: IDirectInputDevice: Not initialized");
|
||
return DIERR_NOTINITIALIZED;
|
||
}
|
||
|
||
/****************************************************************************
|
||
*
|
||
* @doc INTERNAL
|
||
*
|
||
* @method DWORD | CNil | GetUsage |
|
||
*
|
||
* Given an object index, return the usage and usage page,
|
||
* packed into a single <t DWORD>.
|
||
*
|
||
* @parm int | iobj |
|
||
*
|
||
* Object index to be converted.
|
||
*
|
||
* @returns
|
||
*
|
||
* Zero because we are the canonical
|
||
* uninitialized device.
|
||
*
|
||
***************************************************************************/
|
||
|
||
STDMETHODIMP_(DWORD)
|
||
CNil_GetUsage(PDICB pdcb, int iobj)
|
||
{
|
||
/*
|
||
* This should never happen; we don't get called until we're sure
|
||
* it's okay.
|
||
*/
|
||
AssertF(0);
|
||
RPF("ERROR: IDirectInputDevice: Not initialized");
|
||
return 0;
|
||
}
|
||
|
||
/****************************************************************************
|
||
*
|
||
* @doc INTERNAL
|
||
*
|
||
* @method DWORD | CNil | SetDIData |
|
||
*
|
||
* Set DirectInput version from CDIDev *.
|
||
*
|
||
* @parm DWORD | dwVer |
|
||
*
|
||
* DirectInput version
|
||
*
|
||
* @parm LPVOID | lpdihacks |
|
||
*
|
||
* AppHack data
|
||
*
|
||
* @returns
|
||
*
|
||
* Zero because we are the canonical
|
||
* uninitialized device.
|
||
*
|
||
***************************************************************************/
|
||
|
||
STDMETHODIMP
|
||
CNil_SetDIData(PDICB pdcb, DWORD dwVer, LPVOID lpdihacks)
|
||
{
|
||
/*
|
||
* This should never happen; we don't get called until we're sure
|
||
* it's okay.
|
||
*/
|
||
AssertF(0);
|
||
RPF("ERROR: IDirectInputDevice: Not initialized");
|
||
return 0;
|
||
}
|
||
|
||
/****************************************************************************
|
||
*
|
||
* Our VTBL for our static object
|
||
*
|
||
***************************************************************************/
|
||
|
||
#pragma BEGIN_CONST_DATA
|
||
|
||
IDirectInputDeviceCallbackVtbl c_vtblNil = {
|
||
CNil_QueryInterface,
|
||
CNil_AddRef,
|
||
CNil_Release,
|
||
CNil_GetInstance,
|
||
CDefDcb_GetVersions,
|
||
CNil_GetDataFormat,
|
||
CNil_GetObjectInfo,
|
||
CNil_GetCapabilities,
|
||
CNil_Acquire,
|
||
CNil_Unacquire,
|
||
CNil_GetDeviceState,
|
||
CNil_GetDeviceInfo,
|
||
CNil_GetProperty,
|
||
CNil_SetProperty,
|
||
CNil_SetEventNotification,
|
||
CNil_SetCooperativeLevel,
|
||
CNil_RunControlPanel,
|
||
CNil_CookDeviceData,
|
||
CNil_CreateEffect,
|
||
CNil_GetFFConfigKey,
|
||
CNil_SendDeviceData,
|
||
CNil_Poll,
|
||
CNil_GetUsage,
|
||
CNil_MapUsage,
|
||
CNil_SetDIData,
|
||
};
|
||
|
||
IDirectInputDeviceCallback c_dcbNil = {
|
||
&c_vtblNil,
|
||
};
|
||
|