844 lines
26 KiB
C++
844 lines
26 KiB
C++
|
//===========================================================================
|
||
|
// dmttest.cpp
|
||
|
//
|
||
|
// Device test functionality
|
||
|
//
|
||
|
// Functions:
|
||
|
// dmttestRunIntegrated
|
||
|
// dmttestRunMapperCPL
|
||
|
//
|
||
|
// History:
|
||
|
// 08/27/1999 - davidkl - created
|
||
|
//===========================================================================
|
||
|
|
||
|
#include "dimaptst.h"
|
||
|
#include "dmtinput.h"
|
||
|
#include "dmtwrite.h"
|
||
|
#include "dmtfail.h"
|
||
|
#include "dmttest.h"
|
||
|
#include "d3d.h"
|
||
|
#include "assert.h"
|
||
|
#include <tchar.h>
|
||
|
#include <stdio.h>
|
||
|
#include <commdlg.h>
|
||
|
|
||
|
#define DIPROP_MAPFILE MAKEDIPROP(0xFFFD)
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
// file global variables
|
||
|
HANDLE ghthDeviceTest = NULL;
|
||
|
DIDEVICEOBJECTDATA *gpdidod = NULL;
|
||
|
HICON ghiButtonState[2];
|
||
|
HICON ghiPovState[9];
|
||
|
|
||
|
UINT_PTR g_NumSubGenres = 0;
|
||
|
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
//===========================================================================
|
||
|
// dmttestRunIntegrated
|
||
|
//
|
||
|
// Runs integrated device test, prompts for test results
|
||
|
//
|
||
|
// Parameters:
|
||
|
//
|
||
|
// Returns: HRESULT
|
||
|
//
|
||
|
// History:
|
||
|
// 08/27/1999 - davidkl - created
|
||
|
// 11/02/1999 - davidkl - now does all preparation and starts input timer
|
||
|
// 11/10/1999 - davidkl - now allocates and populates pdmtai->pan
|
||
|
//===========================================================================
|
||
|
HRESULT dmttestRunIntegrated(HWND hwnd)
|
||
|
{
|
||
|
HRESULT hRes = S_OK;
|
||
|
|
||
|
//JJ 64Bit Compat
|
||
|
INT_PTR nIdx = -1;
|
||
|
UINT u = 0;
|
||
|
DWORD dw = 0;
|
||
|
DMTDEVICE_NODE *pDevice = NULL;
|
||
|
DMTSUBGENRE_NODE *pSubGenre = NULL;
|
||
|
DMTMAPPING_NODE *pMapping = NULL;
|
||
|
DMTACTION_NODE *pAction = NULL;
|
||
|
DMT_APPINFO *pdmtai = NULL;
|
||
|
ACTIONNAME *pan = NULL;
|
||
|
DIACTIONA *pdia = NULL;
|
||
|
|
||
|
// get the app info structure
|
||
|
//JJ 64Bit Compat
|
||
|
pdmtai = (DMT_APPINFO*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
|
||
|
if(!pdmtai)
|
||
|
{
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
__try
|
||
|
{
|
||
|
// get the currently selected device
|
||
|
nIdx = SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_LIST),
|
||
|
CB_GETCURSEL,
|
||
|
0,
|
||
|
0L);
|
||
|
if(-1 == nIdx)
|
||
|
{
|
||
|
// this is bad
|
||
|
hRes = E_UNEXPECTED;
|
||
|
__leave;
|
||
|
}
|
||
|
pDevice = (DMTDEVICE_NODE*)SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_LIST),
|
||
|
CB_GETITEMDATA,
|
||
|
nIdx,
|
||
|
0L);
|
||
|
if(!pDevice)
|
||
|
{
|
||
|
// this is bad
|
||
|
hRes = E_UNEXPECTED;
|
||
|
__leave;
|
||
|
}
|
||
|
|
||
|
// get the currently selected genre
|
||
|
nIdx = SendMessageA(GetDlgItem(hwnd, IDC_SUBGENRES),
|
||
|
CB_GETCURSEL,
|
||
|
0,
|
||
|
0L);
|
||
|
if(-1 == nIdx)
|
||
|
{
|
||
|
// this is bad
|
||
|
hRes = E_UNEXPECTED;
|
||
|
__leave;
|
||
|
}
|
||
|
pSubGenre = (DMTSUBGENRE_NODE*)SendMessageA(GetDlgItem(hwnd, IDC_SUBGENRES),
|
||
|
CB_GETITEMDATA,
|
||
|
nIdx,
|
||
|
0L);
|
||
|
if(!pSubGenre)
|
||
|
{
|
||
|
// this is bad
|
||
|
hRes = E_UNEXPECTED;
|
||
|
__leave;
|
||
|
}
|
||
|
|
||
|
// match the device with the mapping node
|
||
|
pMapping = pSubGenre->pMappingList;
|
||
|
while(pMapping)
|
||
|
{
|
||
|
// is this our device's mapping info?
|
||
|
if(IsEqualGUID(pDevice->guidInstance, pMapping->guidInstance))
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// next mapping node
|
||
|
pMapping = pMapping->pNext;
|
||
|
}
|
||
|
if(!pMapping)
|
||
|
{
|
||
|
// no match found
|
||
|
hRes = E_UNEXPECTED;
|
||
|
__leave;
|
||
|
}
|
||
|
|
||
|
// allocate the app info's actionname list
|
||
|
if(pdmtai->pan)
|
||
|
{
|
||
|
// for some reason,
|
||
|
// we are attempting to clobber existing data!
|
||
|
// ISSUE-2001/03/29-timgill Need to raise an error code here
|
||
|
DebugBreak();
|
||
|
}
|
||
|
pdmtai->pan = (ACTIONNAME*)LocalAlloc(LMEM_FIXED, sizeof(ACTIONNAME) * pMapping->uActions);
|
||
|
if(!(pdmtai->pan))
|
||
|
{
|
||
|
hRes = E_UNEXPECTED;
|
||
|
__leave;
|
||
|
}
|
||
|
ZeroMemory((void*)(pdmtai->pan), sizeof(ACTIONNAME) * pMapping->uActions);
|
||
|
pdmtai->dwActions = (DWORD)(pMapping->uActions);
|
||
|
pan = pdmtai->pan;
|
||
|
|
||
|
|
||
|
// allocate data buffer
|
||
|
gpdidod = (DIDEVICEOBJECTDATA*)LocalAlloc(LMEM_FIXED,
|
||
|
DMTINPUT_BUFFERSIZE *
|
||
|
sizeof(DIDEVICEOBJECTDATA));
|
||
|
if(!gpdidod)
|
||
|
{
|
||
|
// nothing we can do if we are out of memory
|
||
|
DPF(0, "dmttestGetInput - unable to allocate data buffer (%d)",
|
||
|
GetLastError());
|
||
|
hRes = E_OUTOFMEMORY;
|
||
|
__leave;
|
||
|
}
|
||
|
|
||
|
// setup the device
|
||
|
hRes = dmtinputPrepDevice(hwnd,
|
||
|
pSubGenre->dwGenreId,
|
||
|
pDevice,
|
||
|
pMapping->uActions,
|
||
|
pMapping->pdia);
|
||
|
if(FAILED(hRes))
|
||
|
{
|
||
|
__leave;
|
||
|
}
|
||
|
|
||
|
// populate the actionname list
|
||
|
//
|
||
|
// match pdia->dwSemantic with pAction->dwActionId
|
||
|
// if found, copy pAction->szName to pdia->lptszActionName
|
||
|
pdia = pMapping->pdia;
|
||
|
for(u = 0; u < pMapping->uActions; u++)
|
||
|
{
|
||
|
(pan+u)->dw = (DWORD)/*JJ 64Bit*/(pdia+u)->uAppData;
|
||
|
lstrcpyA((pan+u)->sz, (pdia+u)->lptszActionName);
|
||
|
}
|
||
|
|
||
|
// start the input timer
|
||
|
DPF(4, "dmttestRunIntegrated - Starting input timer...");
|
||
|
// ISSUE-2001/03/29-timgill Should check return value here
|
||
|
SetTimer(hwnd,
|
||
|
ID_POLL_TIMER,
|
||
|
DMT_POLL_TIMEOUT,
|
||
|
NULL);
|
||
|
|
||
|
// en/disable appropriate ui elements
|
||
|
EnableWindow(GetDlgItem(hwnd, IDOK), FALSE);
|
||
|
EnableWindow(GetDlgItem(hwnd, IDCANCEL), TRUE);
|
||
|
EnableWindow(GetDlgItem(hwnd, IDC_GENRES_LABEL), FALSE);
|
||
|
EnableWindow(GetDlgItem(hwnd, IDC_DEVICE_GENRES), FALSE);
|
||
|
EnableWindow(GetDlgItem(hwnd, IDC_ENUM_DEVICES), FALSE);
|
||
|
EnableWindow(GetDlgItem(hwnd, IDC_DEVICES_LABEL), FALSE);
|
||
|
EnableWindow(GetDlgItem(hwnd, IDC_DEVICE_LIST), FALSE);
|
||
|
// EnableWindow(GetDlgItem(hwnd, IDC_CONFIGURE), FALSE);
|
||
|
EnableWindow(GetDlgItem(hwnd, IDC_LAUNCH_CPL_EDIT_MODE), FALSE);
|
||
|
// EnableWindow(GetDlgItem(hwnd, IDC_SAVE_STD), FALSE);
|
||
|
EnableWindow(GetDlgItem(hwnd, IDC_SAVE_HID), FALSE);
|
||
|
EnableWindow(GetDlgItem(hwnd, IDC_SAVE_BOTH), FALSE);
|
||
|
EnableWindow(GetDlgItem(hwnd, IDC_START_WITH_DEFAULTS), FALSE);
|
||
|
}
|
||
|
__finally
|
||
|
{
|
||
|
// if something failed
|
||
|
if(FAILED(hRes))
|
||
|
{
|
||
|
if(LocalFree((HLOCAL)(pdmtai->pan)))
|
||
|
{
|
||
|
// memory leak
|
||
|
// ISSUE-2001/03/29-timgill Needs error case handling
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// done
|
||
|
return S_OK;
|
||
|
|
||
|
} //*** end dmttestRunIntegrated()
|
||
|
|
||
|
BOOL CALLBACK EnumDeviceCallback(const DIDEVICEINSTANCE *lpdidi, LPDIRECTINPUTDEVICE8 lpDID, DWORD dwFlags, DWORD dwDeviceRemaining, LPVOID hwnd)
|
||
|
{
|
||
|
DIPROPSTRING dips;
|
||
|
HRESULT hr;
|
||
|
|
||
|
ZeroMemory(&dips, sizeof(dips));
|
||
|
dips.diph.dwSize = sizeof(dips);
|
||
|
dips.diph.dwHeaderSize = sizeof(DIPROPHEADER);
|
||
|
dips.diph.dwObj = 0;
|
||
|
dips.diph.dwHow = DIPH_DEVICE;
|
||
|
hr = lpDID->GetProperty(DIPROP_MAPFILE, &dips.diph);
|
||
|
if (hr == DIERR_OBJECTNOTFOUND)
|
||
|
{
|
||
|
// Map file not specified. Let the use specify it.
|
||
|
TCHAR tszMsg[MAX_PATH];
|
||
|
_stprintf(tszMsg, _T("INI path not specified for %s. You need to specify it now."), lpdidi->tszInstanceName);
|
||
|
MessageBox(NULL, tszMsg, _T("Error"), MB_OK);
|
||
|
// Obstain a file name
|
||
|
TCHAR tszFilePath[MAX_PATH] = _T("");
|
||
|
TCHAR tszFileName[MAX_PATH];
|
||
|
OPENFILENAME ofn;
|
||
|
ZeroMemory(&ofn, sizeof(ofn));
|
||
|
ofn.lStructSize = sizeof(ofn);
|
||
|
ofn.hwndOwner = (HWND)hwnd;
|
||
|
ofn.lpstrFilter = _T("INI Files (*.ini)\0*.ini\0All Files (*.*)\0*.*\0");
|
||
|
ofn.lpstrFile = tszFilePath;
|
||
|
ofn.nMaxFile = MAX_PATH;
|
||
|
ofn.lpstrTitle = _T("INI File Path");
|
||
|
ofn.Flags = OFN_FILEMUSTEXIST;
|
||
|
GetOpenFileName(&ofn);
|
||
|
// Obtain the registry key
|
||
|
LPDIRECTINPUT8 lpDI = NULL;
|
||
|
LPDIRECTINPUTJOYCONFIG8 lpDIJC = NULL;
|
||
|
DIJOYCONFIG jc;
|
||
|
DIPROPDWORD diPropDword;
|
||
|
HKEY hkType;
|
||
|
|
||
|
DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8, (LPVOID*)&lpDI, NULL);
|
||
|
if (lpDI)
|
||
|
{
|
||
|
lpDI->QueryInterface(IID_IDirectInputJoyConfig8, (LPVOID*)&lpDIJC);
|
||
|
lpDI->Release();
|
||
|
}
|
||
|
if (lpDIJC)
|
||
|
{
|
||
|
diPropDword.diph.dwSize = sizeof( diPropDword );
|
||
|
diPropDword.diph.dwHeaderSize = sizeof( diPropDword.diph );
|
||
|
diPropDword.diph.dwObj = 0;
|
||
|
diPropDword.diph.dwHow = DIPH_DEVICE;
|
||
|
lpDID->GetProperty( DIPROP_JOYSTICKID, &diPropDword.diph );
|
||
|
|
||
|
jc.dwSize = sizeof( jc );
|
||
|
lpDIJC->GetConfig( diPropDword.dwData, &jc, DIJC_REGHWCONFIGTYPE );
|
||
|
lpDIJC->SetCooperativeLevel((HWND)hwnd, DISCL_EXCLUSIVE|DISCL_BACKGROUND);
|
||
|
lpDIJC->Acquire();
|
||
|
|
||
|
dmtOpenTypeKey(jc.wszType, KEY_ALL_ACCESS, &hkType);
|
||
|
|
||
|
// Write the INI file name
|
||
|
RegSetValueEx(hkType, _T("OEMMapFile"), 0, REG_SZ, (LPBYTE)ofn.lpstrFile, (lstrlen(ofn.lpstrFile)+1) * sizeof(TCHAR));
|
||
|
|
||
|
RegCloseKey(hkType);
|
||
|
lpDIJC->Unacquire();
|
||
|
lpDIJC->Release();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return DIENUM_CONTINUE;
|
||
|
}
|
||
|
|
||
|
//===========================================================================
|
||
|
// ModifyDiactfrmDllPath
|
||
|
//
|
||
|
// Modifies the path of the diactfrm.dll COM server in the registry
|
||
|
// to same as the exe path.
|
||
|
//
|
||
|
// Parameters:
|
||
|
//
|
||
|
// Returns: TRUE if path is modified. FALSE if an error occurred.
|
||
|
//
|
||
|
// History:
|
||
|
// 08/02/2001 - jacklin - created
|
||
|
//===========================================================================
|
||
|
static BOOL ModifyDiactfrmDllPath()
|
||
|
{
|
||
|
const TCHAR tszFrmwrkPath[] = _T("SOFTWARE\\Classes\\CLSID\\{18AB439E-FCF4-40D4-90DA-F79BAA3B0655}\\InProcServer32");
|
||
|
const TCHAR tszPagePath[] = _T("SOFTWARE\\Classes\\CLSID\\{9F34AF20-6095-11D3-8FB2-00C04F8EC627}\\InProcServer32");
|
||
|
HKEY hKey;
|
||
|
LONG lResult;
|
||
|
|
||
|
// Construct the full path of the DLL using current exe path.
|
||
|
TCHAR tszNewPath[MAX_PATH];
|
||
|
if (!GetModuleFileName(NULL, tszNewPath, MAX_PATH))
|
||
|
{
|
||
|
return FALSE;
|
||
|
}
|
||
|
TCHAR *pcLastSlash;
|
||
|
pcLastSlash = _tcsrchr(tszNewPath, _T('\\'));
|
||
|
// Replace the exe name with diactfrm.dll
|
||
|
lstrcpy(pcLastSlash + 1, _T("diactfrm.dll"));
|
||
|
|
||
|
// Check that the DLL exists
|
||
|
HANDLE hDllFile = CreateFile(tszNewPath, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
|
||
|
FILE_ATTRIBUTE_NORMAL, NULL);
|
||
|
if (hDllFile == INVALID_HANDLE_VALUE)
|
||
|
return FALSE;
|
||
|
CloseHandle(hDllFile);
|
||
|
|
||
|
//// Modify the path for framework object
|
||
|
|
||
|
// Open the key for write access
|
||
|
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, tszFrmwrkPath, 0, KEY_WRITE, &hKey);
|
||
|
if (lResult != ERROR_SUCCESS)
|
||
|
{
|
||
|
// Cannot open the key. Most likely some bad error happened.
|
||
|
// We will do nothing in this case.
|
||
|
return FALSE;
|
||
|
}
|
||
|
// Write the new path to the default value
|
||
|
lResult = RegSetValue(hKey, NULL, REG_SZ, tszNewPath, lstrlen(tszNewPath));
|
||
|
RegCloseKey(hKey);
|
||
|
if (lResult != ERROR_SUCCESS)
|
||
|
{
|
||
|
// Error occurred while writing the value.
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
//// Modify the path for framework page object
|
||
|
|
||
|
// Open the key for write access
|
||
|
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, tszPagePath, 0, KEY_WRITE, &hKey);
|
||
|
if (lResult != ERROR_SUCCESS)
|
||
|
{
|
||
|
// Cannot open the key. Most likely some bad error happened.
|
||
|
// We will do nothing in this case.
|
||
|
return FALSE;
|
||
|
}
|
||
|
// Write the new path to the default value
|
||
|
lResult = RegSetValue(hKey, NULL, REG_SZ, tszNewPath, lstrlen(tszNewPath));
|
||
|
RegCloseKey(hKey);
|
||
|
if (lResult != ERROR_SUCCESS)
|
||
|
{
|
||
|
// Error occurred while writing the value.
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
//===========================================================================
|
||
|
// RestoreDiactfrmDllPath
|
||
|
//
|
||
|
// Restores the path of the diactfrm.dll COM server in the registry
|
||
|
// to the system directory, which should be the default.
|
||
|
//
|
||
|
// Parameters:
|
||
|
//
|
||
|
// Returns: TRUE if path is modified. FALSE if an error occurred.
|
||
|
//
|
||
|
// History:
|
||
|
// 08/02/2001 - jacklin - created
|
||
|
//===========================================================================
|
||
|
static BOOL RestoreDiactfrmDllPath()
|
||
|
{
|
||
|
const TCHAR tszFrmwrkPath[] = _T("SOFTWARE\\Classes\\CLSID\\{18AB439E-FCF4-40D4-90DA-F79BAA3B0655}\\InProcServer32");
|
||
|
const TCHAR tszPagePath[] = _T("SOFTWARE\\Classes\\CLSID\\{9F34AF20-6095-11D3-8FB2-00C04F8EC627}\\InProcServer32");
|
||
|
HKEY hKey;
|
||
|
LONG lResult;
|
||
|
|
||
|
// Construct the full path of the DLL using current exe path.
|
||
|
TCHAR tszNewPath[MAX_PATH];
|
||
|
if (!GetSystemDirectory(tszNewPath, MAX_PATH))
|
||
|
{
|
||
|
return FALSE;
|
||
|
}
|
||
|
lstrcat(tszNewPath, _T("\\diactfrm.dll"));
|
||
|
|
||
|
//// Modify the path for framework object
|
||
|
|
||
|
// Open the key for write access
|
||
|
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, tszFrmwrkPath, 0, KEY_WRITE, &hKey);
|
||
|
if (lResult != ERROR_SUCCESS)
|
||
|
{
|
||
|
// Cannot open the key. Most likely some bad error happened.
|
||
|
// We will do nothing in this case.
|
||
|
return FALSE;
|
||
|
}
|
||
|
// Write the new path to the default value
|
||
|
lResult = RegSetValue(hKey, NULL, REG_SZ, tszNewPath, lstrlen(tszNewPath));
|
||
|
RegCloseKey(hKey);
|
||
|
if (lResult != ERROR_SUCCESS)
|
||
|
{
|
||
|
// Error occurred while writing the value.
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
//// Modify the path for framework page object
|
||
|
|
||
|
// Open the key for write access
|
||
|
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, tszPagePath, 0, KEY_WRITE, &hKey);
|
||
|
if (lResult != ERROR_SUCCESS)
|
||
|
{
|
||
|
// Cannot open the key. Most likely some bad error happened.
|
||
|
// We will do nothing in this case.
|
||
|
return FALSE;
|
||
|
}
|
||
|
// Write the new path to the default value
|
||
|
lResult = RegSetValue(hKey, NULL, REG_SZ, tszNewPath, lstrlen(tszNewPath));
|
||
|
RegCloseKey(hKey);
|
||
|
if (lResult != ERROR_SUCCESS)
|
||
|
{
|
||
|
// Error occurred while writing the value.
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
//===========================================================================
|
||
|
// dmttestRunMapperCPL
|
||
|
//
|
||
|
// Launches DirectInput Mapper CPL, prompts for test results
|
||
|
//
|
||
|
// Parameters:
|
||
|
//
|
||
|
// Returns: HRESULT
|
||
|
//
|
||
|
// History:
|
||
|
// 08/27/1999 - davidkl - created
|
||
|
// 11/04/1999 - davidkl - added support for launching in IHV Edit Mode
|
||
|
//===========================================================================
|
||
|
HRESULT dmttestRunMapperCPL(HWND hwnd,
|
||
|
BOOL fEditMode)
|
||
|
{
|
||
|
HRESULT hRes = S_OK;
|
||
|
// int n = -1;
|
||
|
//JJ 64Bit Compat
|
||
|
INT_PTR n = -1;
|
||
|
UINT u = 0;
|
||
|
BOOL fUserMadeChanges = FALSE;
|
||
|
DMTDEVICE_NODE *pDevice = NULL;
|
||
|
DMTSUBGENRE_NODE *pSubGenre = NULL;
|
||
|
DMTMAPPING_NODE *pMapping = NULL;
|
||
|
IDirectInput8A *pdi = NULL;
|
||
|
char szBuf[MAX_PATH];
|
||
|
//DIACTIONFORMATA diaf;
|
||
|
//JJ Fix
|
||
|
DMTGENRE_NODE *pGenre = NULL;
|
||
|
DIACTIONFORMATA* pDiaf = NULL;
|
||
|
DMT_APPINFO *pdmtai = NULL;
|
||
|
ULONG i = 0;
|
||
|
//JJ TEST
|
||
|
DICONFIGUREDEVICESPARAMSA dicdp;
|
||
|
|
||
|
GUID guidActionMap;
|
||
|
DWORD dwMapUIMode = 0;
|
||
|
|
||
|
/////////////////THIS IS WHERE THE FIX FOR USING AN ACTION ARRAY STARTS////////////
|
||
|
|
||
|
//initialize appropriate mapper UI GUID and display mode
|
||
|
//RY fix for bug #35577
|
||
|
if(fEditMode)
|
||
|
{
|
||
|
guidActionMap = GUID_DIConfigAppEditLayout;
|
||
|
dwMapUIMode = DICD_EDIT;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
guidActionMap = GUID_DIMapTst;
|
||
|
dwMapUIMode = DICD_DEFAULT;
|
||
|
}
|
||
|
|
||
|
pdmtai = (DMT_APPINFO*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
|
||
|
if(!pdmtai)
|
||
|
{
|
||
|
// big problem
|
||
|
// this should NEVER happen
|
||
|
// ISSUE-2001/03/29-timgill Needs error case handling
|
||
|
}
|
||
|
|
||
|
__try
|
||
|
{
|
||
|
// pDevice = pdmtai->pDeviceList;
|
||
|
// get the currently selected device
|
||
|
n = SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_LIST),
|
||
|
CB_GETCURSEL,
|
||
|
0,
|
||
|
0L);
|
||
|
pDevice = (DMTDEVICE_NODE*)SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_LIST),
|
||
|
CB_GETITEMDATA,
|
||
|
n,
|
||
|
0L);
|
||
|
|
||
|
|
||
|
//JJ Fix 34157
|
||
|
if(CB_ERR == (INT_PTR)pDevice)
|
||
|
{
|
||
|
MessageBox(hwnd,
|
||
|
TEXT("Please install a gaming device"),
|
||
|
TEXT("NO DEVICES"),
|
||
|
0);
|
||
|
hRes = E_UNEXPECTED;
|
||
|
__leave;
|
||
|
}
|
||
|
|
||
|
|
||
|
if(fEditMode)
|
||
|
{
|
||
|
hRes = dmtwriteWriteFileHeader(hwnd, pDevice);
|
||
|
if(FAILED(hRes))
|
||
|
{
|
||
|
__leave;
|
||
|
}
|
||
|
|
||
|
if (S_FALSE == hRes)
|
||
|
{
|
||
|
hRes = S_OK;
|
||
|
__leave;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
//JJ FIX
|
||
|
// create a directinput object
|
||
|
hRes = dmtinputCreateDirectInput(ghinst,
|
||
|
&pdi);
|
||
|
if(FAILED(hRes))
|
||
|
{
|
||
|
hRes = DMT_E_INPUT_CREATE_FAILED;
|
||
|
__leave;
|
||
|
}
|
||
|
|
||
|
pGenre = pdmtai->pGenreList;
|
||
|
|
||
|
//Allocate out the array...
|
||
|
pDiaf = (DIACTIONFORMATA*)malloc(sizeof(DIACTIONFORMATA) * g_NumSubGenres);
|
||
|
|
||
|
ZeroMemory((void*)pDiaf, sizeof(DIACTIONFORMATA) * g_NumSubGenres);
|
||
|
|
||
|
while(pGenre)
|
||
|
{
|
||
|
|
||
|
pSubGenre = pGenre->pSubGenreList;
|
||
|
while(pSubGenre)
|
||
|
{
|
||
|
|
||
|
// find the mapping node for the selected device
|
||
|
pMapping = pSubGenre->pMappingList;
|
||
|
|
||
|
|
||
|
pMapping = pSubGenre->pMappingList;
|
||
|
while(pMapping)
|
||
|
{
|
||
|
if(IsEqualGUID(pDevice->guidInstance,
|
||
|
pMapping->guidInstance))
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// next mapping
|
||
|
pMapping = pMapping->pNext;
|
||
|
}
|
||
|
if(!pMapping)
|
||
|
{
|
||
|
// this should never happen
|
||
|
|
||
|
hRes = DMT_E_NO_MATCHING_MAPPING;
|
||
|
DebugBreak();
|
||
|
__leave;
|
||
|
}
|
||
|
|
||
|
// prepare the DIACTIONFORMAT structure
|
||
|
pDiaf[i].dwSize = sizeof(DIACTIONFORMAT);
|
||
|
pDiaf[i].dwActionSize = sizeof(DIACTIONA);
|
||
|
pDiaf[i].dwNumActions = (DWORD)(pMapping->uActions);
|
||
|
pDiaf[i].rgoAction = pMapping->pdia;
|
||
|
pDiaf[i].dwDataSize = 4 * pDiaf[i].dwNumActions;
|
||
|
pDiaf[i].dwGenre = pSubGenre->dwGenreId;
|
||
|
pDiaf[i].dwBufferSize = DMTINPUT_BUFFERSIZE;
|
||
|
|
||
|
|
||
|
//Set up the proper names
|
||
|
wsprintfA(szBuf, "%s: %s",
|
||
|
pSubGenre->szName, pSubGenre->szDescription);
|
||
|
pDiaf[i].guidActionMap = guidActionMap;
|
||
|
lstrcpyA(pDiaf[i].tszActionMap, szBuf);
|
||
|
|
||
|
//Increment the counter
|
||
|
i++;
|
||
|
|
||
|
//Next Subgenre
|
||
|
pSubGenre = pSubGenre->pNext;
|
||
|
|
||
|
}
|
||
|
|
||
|
//Next Genre
|
||
|
pGenre = pGenre->pNext;
|
||
|
}
|
||
|
|
||
|
assert(i == g_NumSubGenres);
|
||
|
|
||
|
// Enumerate the devices and check if INI path is set
|
||
|
pdi->EnumDevicesBySemantics(NULL, pDiaf, ::EnumDeviceCallback, (LPVOID)hwnd, DIEDBSFL_ATTACHEDONLY);
|
||
|
|
||
|
|
||
|
// prepare the configure devices params
|
||
|
ZeroMemory((void*)&dicdp, sizeof(DICONFIGUREDEVICESPARAMSA));
|
||
|
dicdp.dwSize = sizeof(DICONFIGUREDEVICESPARAMSA);
|
||
|
dicdp.dwcUsers = 0;
|
||
|
dicdp.lptszUserNames = NULL;
|
||
|
//dicdp.dwcFormats = 1;
|
||
|
dicdp.dwcFormats = i;//g_NumSubGenres;
|
||
|
dicdp.lprgFormats = pDiaf;//&diaf;
|
||
|
dicdp.hwnd = hwnd;
|
||
|
dicdp.lpUnkDDSTarget = NULL;
|
||
|
// colors
|
||
|
|
||
|
dicdp.dics.dwSize = sizeof(DICOLORSET);
|
||
|
/* dicdp.dics.cTextFore = D3DRGB(0,0,255);
|
||
|
dicdp.dics.cTextHighlight = D3DRGB(0,255,255);
|
||
|
dicdp.dics.cCalloutLine = D3DRGB(255,255,255);
|
||
|
dicdp.dics.cCalloutHighlight= D3DRGB(255,255,0);
|
||
|
dicdp.dics.cBorder = D3DRGB(0,128,255);
|
||
|
dicdp.dics.cControlFill = D3DRGB(128,128,255);
|
||
|
dicdp.dics.cHighlightFill = D3DRGB(255,0,0);
|
||
|
dicdp.dics.cAreaFill = D3DRGB(192,192,192); */
|
||
|
|
||
|
// display mapper cpl
|
||
|
///////////////////////////////END FIX///////////////////////////////////////
|
||
|
//JJ Fix34958
|
||
|
EnableWindow(hwnd,
|
||
|
FALSE);
|
||
|
|
||
|
// 8/2/2001 (jacklin): Modify the path of diactfrm.dll COM server to
|
||
|
// use the DDK version of the DLL.
|
||
|
BOOL bModified = ModifyDiactfrmDllPath();
|
||
|
|
||
|
hRes = pdi->ConfigureDevices(NULL,
|
||
|
&dicdp,
|
||
|
dwMapUIMode, // flags
|
||
|
NULL); // user data for callback fn
|
||
|
|
||
|
// 8/2/2001 (jacklin): Restore the path of diactfrm.dll COM server
|
||
|
if (bModified)
|
||
|
RestoreDiactfrmDllPath();
|
||
|
|
||
|
EnableWindow(hwnd,
|
||
|
TRUE);
|
||
|
|
||
|
if(FAILED(hRes))
|
||
|
{
|
||
|
DPF(0, "ConfigureDevices failed (%s == %08Xh)",
|
||
|
dmtxlatHRESULT(hRes), hRes);
|
||
|
__leave;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
__finally
|
||
|
{
|
||
|
// general cleanup
|
||
|
|
||
|
SAFE_RELEASE(pdi);
|
||
|
if(pDiaf)
|
||
|
{
|
||
|
free(pDiaf);
|
||
|
pDiaf = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// done
|
||
|
return hRes;
|
||
|
|
||
|
} //*** end dmttestRunMapperCPL()
|
||
|
|
||
|
|
||
|
//===========================================================================
|
||
|
// dmttestStopIntegrated
|
||
|
//
|
||
|
// Stops integrated device test
|
||
|
//
|
||
|
// Parameters:
|
||
|
// HWND hwnd - handle of app window
|
||
|
//
|
||
|
// Returns: BOOL
|
||
|
// TRUE - Passed
|
||
|
// FALSE - Failed
|
||
|
//
|
||
|
// History:
|
||
|
// 09/22/1999 - davidkl - created
|
||
|
// 11/02/1999 - davidkl - stops timer and performs cleanup
|
||
|
// 11/09/1999 - davidkl - added freeing of actionname allocation
|
||
|
//===========================================================================
|
||
|
BOOL dmttestStopIntegrated(HWND hwnd)
|
||
|
{
|
||
|
int n = 0;
|
||
|
DWORD dw = WAIT_ABANDONED;
|
||
|
BOOL fPassed = TRUE;
|
||
|
DMT_APPINFO *pdmtai = NULL;
|
||
|
|
||
|
// get the app info structure
|
||
|
//JJ 64Bit Compat
|
||
|
pdmtai = (DMT_APPINFO*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
|
||
|
if(!pdmtai)
|
||
|
{
|
||
|
// ISSUE-2001/03/29-timgill Needs error case handling
|
||
|
}
|
||
|
|
||
|
// stop the input timer
|
||
|
// ISSUE-2001/03/29-timgill Should check timer was set and return value
|
||
|
KillTimer(hwnd,
|
||
|
ID_POLL_TIMER);
|
||
|
|
||
|
// free the buffer
|
||
|
if(gpdidod)
|
||
|
{
|
||
|
if(LocalFree((HLOCAL)gpdidod))
|
||
|
{
|
||
|
// memory leak
|
||
|
// ISSUE-2001/03/29-timgill Needs error case handling
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// free the pdmtai actionname list
|
||
|
if(pdmtai->pan)
|
||
|
{
|
||
|
if(LocalFree((HLOCAL)(pdmtai->pan)))
|
||
|
{
|
||
|
// memory leak
|
||
|
// ISSUE-2001/03/29-timgill Needs error case handling
|
||
|
}
|
||
|
pdmtai->pan = NULL;
|
||
|
}
|
||
|
|
||
|
|
||
|
// prompt for test results
|
||
|
n = MessageBoxA(hwnd, "Were the correct semantics displayed\r\n"
|
||
|
"for each device control?",
|
||
|
"Test Results",
|
||
|
MB_YESNO);
|
||
|
if(IDNO == n)
|
||
|
{
|
||
|
// display dialog prompting for details
|
||
|
// ISSUE-2001/03/29-timgill Should test type (cpl/integrated)
|
||
|
DialogBoxParamA(ghinst,
|
||
|
MAKEINTRESOURCEA(IDD_FAILURE_DETAILS),
|
||
|
hwnd,
|
||
|
dmtfailDlgProc,
|
||
|
(LPARAM)NULL);
|
||
|
}
|
||
|
|
||
|
|
||
|
// en/disable appropriate ui elements
|
||
|
EnableWindow(GetDlgItem(hwnd, IDOK), TRUE);
|
||
|
EnableWindow(GetDlgItem(hwnd, IDCANCEL), FALSE);
|
||
|
EnableWindow(GetDlgItem(hwnd, IDC_GENRES_LABEL), TRUE);
|
||
|
EnableWindow(GetDlgItem(hwnd, IDC_DEVICE_GENRES), TRUE);
|
||
|
EnableWindow(GetDlgItem(hwnd, IDC_ENUM_DEVICES), TRUE);
|
||
|
EnableWindow(GetDlgItem(hwnd, IDC_DEVICES_LABEL), TRUE);
|
||
|
EnableWindow(GetDlgItem(hwnd, IDC_DEVICE_LIST), TRUE);
|
||
|
// EnableWindow(GetDlgItem(hwnd, IDC_CONFIGURE), TRUE);
|
||
|
EnableWindow(GetDlgItem(hwnd, IDC_LAUNCH_CPL_EDIT_MODE), TRUE);
|
||
|
// EnableWindow(GetDlgItem(hwnd, IDC_SAVE_STD), TRUE);
|
||
|
EnableWindow(GetDlgItem(hwnd, IDC_SAVE_HID), TRUE);
|
||
|
EnableWindow(GetDlgItem(hwnd, IDC_SAVE_BOTH), TRUE);
|
||
|
EnableWindow(GetDlgItem(hwnd, IDC_START_WITH_DEFAULTS), TRUE);
|
||
|
|
||
|
// done
|
||
|
return fPassed;
|
||
|
|
||
|
} //*** end dmttestStopIntegrated()
|
||
|
|
||
|
|
||
|
|
||
|
//===========================================================================
|
||
|
//===========================================================================
|
||
|
|
||
|
|
||
|
//===========================================================================
|
||
|
//===========================================================================
|
||
|
|
||
|
|
||
|
//===========================================================================
|
||
|
//===========================================================================
|
||
|
|
||
|
|
||
|
//===========================================================================
|
||
|
//===========================================================================
|
||
|
|
||
|
|
||
|
//===========================================================================
|
||
|
//===========================================================================
|
||
|
|
||
|
|
||
|
//===========================================================================
|
||
|
//===========================================================================
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|