windows-nt/Source/XPSP1/NT/multimedia/directx/dxvb/dx8vb/dinput1obj.cpp
2020-09-26 16:20:57 +08:00

268 lines
7.1 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1998 - 1999
//
// File: dinput1obj.cpp
//
//--------------------------------------------------------------------------
// dDrawColorControlObj.cpp : Implementation of CDirectApp and DLL registration.
// DHF_DS entire file
#include "stdafx.h"
#include "Direct.h"
#include "dms.h"
#include "dInput1Obj.h"
#include "dInputDeviceObj.h"
#include "dinput.h"
#include "DIEnumDevicesObj.h"
extern HRESULT BSTRtoGUID(LPGUID,BSTR);
extern HRESULT DINPUTBSTRtoGUID(LPGUID,BSTR);
CONSTRUCTOR(_dxj_DirectInput8, {});
DESTRUCTOR(_dxj_DirectInput8, {});
GETSET_OBJECT(_dxj_DirectInput8);
HRESULT FillRealActionFormat(DIACTIONFORMATW *real, DIACTIONFORMAT_CDESC *cover, SAFEARRAY **actionArray,long ActionCount );
STDMETHODIMP C_dxj_DirectInput8Object::createDevice(BSTR strGuid, I_dxj_DirectInputDevice8 **dev)
{
HRESULT hr = S_OK;
GUID rguid;
LPDIRECTINPUTDEVICE8W realdevice=NULL;
hr = DINPUTBSTRtoGUID(&rguid,strGuid);
if FAILED(hr) return hr;
hr=m__dxj_DirectInput8->CreateDevice(rguid,&realdevice,NULL);
if FAILED(hr) return hr;
INTERNAL_CREATE(_dxj_DirectInputDevice8,realdevice,dev);
if (*dev==NULL) {
realdevice->Release();
return E_OUTOFMEMORY;
}
if (0==_wcsicmp(strGuid,L"guid_syskeyboard")){
hr=realdevice->SetDataFormat(&c_dfDIKeyboard);
}
else if (0==_wcsicmp(strGuid,L"guid_sysmouse")){
hr=realdevice->SetDataFormat(&c_dfDIMouse);
}
else {
hr=realdevice->SetDataFormat(&c_dfDIJoystick2);
}
return hr;
}
#ifdef _WIN64
STDMETHODIMP C_dxj_DirectInput8Object::RunControlPanel( HWND hwndOwner )
#else
STDMETHODIMP C_dxj_DirectInput8Object::RunControlPanel( long hwndOwner )
#endif
{
HRESULT hr;
hr = m__dxj_DirectInput8->RunControlPanel((HWND)hwndOwner, (DWORD)0);
return hr;
}
STDMETHODIMP C_dxj_DirectInput8Object::GetDeviceStatus( BSTR strGuid, VARIANT_BOOL *status){
HRESULT hr;
GUID g;
hr = DINPUTBSTRtoGUID(&g,strGuid);
if FAILED(hr) return hr;
if (!status) return E_INVALIDARG;
hr = m__dxj_DirectInput8->GetDeviceStatus((REFGUID)g);
if (hr==DI_OK)
*status=VARIANT_TRUE;
else
*status=VARIANT_FALSE;
return S_OK;
}
STDMETHODIMP C_dxj_DirectInput8Object::getDIDevices(
long deviceType, long flags, I_dxj_DIEnumDevices8 **ppRet)
{
HRESULT hr;
hr = C_dxj_DIEnumDevicesObject::create(m__dxj_DirectInput8,deviceType,flags,ppRet);
return hr;
}
STDMETHODIMP C_dxj_DirectInput8Object::getDevicesBySemantics(
/* [in] */ BSTR str1,
/* [in] */ DIACTIONFORMAT_CDESC __RPC_FAR *format,
/* [in] */ long flags,
/* [retval][out] */ I_dxj_DIEnumDevices8 __RPC_FAR *__RPC_FAR *ret)
{
HRESULT hr;
hr = C_dxj_DIEnumDevicesObject::createSuitable(m__dxj_DirectInput8,str1,format,format->lActionCount,&format->ActionArray,flags,ret);
return hr;
}
BOOL CALLBACK DIConfigureDevicesCallback(
IUnknown FAR * lpDDSTarget,
LPVOID pvRef
)
{
HANDLE eventID=(HANDLE)pvRef;
::SetEvent((HANDLE)eventID); //CONSIDER 64 bit ramification of casting to a handle
return TRUE;
}
STDMETHODIMP C_dxj_DirectInput8Object::ConfigureDevices (
#ifdef _WIN64
HANDLE hEvent,
#else
long hEvent,
#endif
DICONFIGUREDEVICESPARAMS_CDESC *CDParams,
long flags
)
{
HRESULT hr;
BSTR bstr;
long lElements;
long i;
DICONFIGUREDEVICESPARAMSW RealCDParams;
if (CDParams->ActionFormats==0) return E_INVALIDARG;
ZeroMemory(&RealCDParams,sizeof(DICONFIGUREDEVICESPARAMSW));
RealCDParams.dwSize=sizeof(DICONFIGUREDEVICESPARAMSW);
RealCDParams.dwcUsers=CDParams->UserCount;
RealCDParams.dwcFormats=CDParams->FormatCount;
RealCDParams.hwnd=(HWND)CDParams->hwnd;
//CONSIDER if we need to ADDREF
RealCDParams.lpUnkDDSTarget=CDParams->DDSTarget;
memcpy(&RealCDParams.dics,&CDParams->dics,sizeof(DICOLORSET));
lElements=(long)CDParams->UserNames->rgsabound[0].cElements;
if (lElements==0){
RealCDParams.lptszUserNames=NULL;
}
else {
if (lElements < CDParams->UserCount) return E_INVALIDARG;
DWORD dwMemSize=MAX_PATH*sizeof(WCHAR)*CDParams->UserCount;
RealCDParams.lptszUserNames=(WCHAR*)malloc(dwMemSize);
if (!RealCDParams.lptszUserNames) return E_OUTOFMEMORY;
ZeroMemory(RealCDParams.lptszUserNames,dwMemSize);
WCHAR *pCharbuff=RealCDParams.lptszUserNames;
for (i=0;i<CDParams->UserCount;i++)
{
bstr=((BSTR*) (CDParams->UserNames->pvData))[i];
if (bstr) wcscpy(pCharbuff,(WCHAR*)bstr);
pCharbuff+=MAX_PATH; //advance 1024 wchars
}
}
lElements=(long)CDParams->ActionFormats->rgsabound[0].cElements;
if (lElements < CDParams->FormatCount) {
if ( RealCDParams.lptszUserNames) free(RealCDParams.lptszUserNames);
return E_INVALIDARG;
}
DIACTIONFORMATW *pRealActionFormats=(DIACTIONFORMATW*)malloc(CDParams->FormatCount*sizeof(DIACTIONFORMATW));
if (!pRealActionFormats) {
if ( RealCDParams.lptszUserNames) free(RealCDParams.lptszUserNames);
return E_OUTOFMEMORY;
}
RealCDParams.lprgFormats=pRealActionFormats;
DIACTIONFORMAT_CDESC *pCoverFormats=(DIACTIONFORMAT_CDESC *) (CDParams->ActionFormats->pvData);
if (!pCoverFormats) {
if (RealCDParams.lptszUserNames) free(RealCDParams.lptszUserNames);
if (pRealActionFormats) free (pRealActionFormats);
return E_INVALIDARG;
}
for (i=0;i<CDParams->FormatCount;i++)
{
FillRealActionFormat(
&(pRealActionFormats[i]),
&(pCoverFormats[i]),
&(pCoverFormats[i].ActionArray),
pCoverFormats[i].lActionCount);
}
if (hEvent)
{
hr = m__dxj_DirectInput8->ConfigureDevices(
DIConfigureDevicesCallback,
&RealCDParams,
(DWORD)flags,
(void*)hEvent);
}
else
{
hr = m__dxj_DirectInput8->ConfigureDevices(
NULL,
&RealCDParams,
(DWORD)flags,
NULL);
}
if ( RealCDParams.lptszUserNames) free(RealCDParams.lptszUserNames);
//TODO make sure action format info is deallocated correctly
if (pRealActionFormats) free (pRealActionFormats);
return hr;
}
HRESULT FillRealActionFormat(DIACTIONFORMATW *real, DIACTIONFORMAT_CDESC *cover, SAFEARRAY **actionArray,long ActionCount )
{
HRESULT hr;
ZeroMemory(real,sizeof(DIACTIONFORMATW));
real->dwSize=sizeof(DIACTIONFORMATW);
real->dwActionSize=sizeof(DIACTIONW);
real->dwDataSize=(DWORD)ActionCount*sizeof(DWORD);
real->dwGenre= (DWORD)cover->lGenre;
real->lAxisMin= cover->lAxisMin;
real->lAxisMax= cover->lAxisMax;
real->dwBufferSize= (DWORD)cover->lBufferSize;
real->dwNumActions=(DWORD)ActionCount;
real->rgoAction= ((LPDIACTIONW) (*actionArray)->pvData);
if (cover->ActionMapName)
{
wcscpy(real->tszActionMap,(WCHAR*)cover->ActionMapName);
}
hr=DINPUTBSTRtoGUID(&real->guidActionMap,cover->guidActionMap);
if FAILED(hr) return hr;
return S_OK;
}