windows-nt/Source/XPSP1/NT/multimedia/directx/dinput/dimapcfg/dmtwrite.cpp
2020-09-26 16:20:57 +08:00

695 lines
19 KiB
C++

//===========================================================================
// dmtwrite.cpp
//
// File / code creation functionality
//
// Functions:
// dmtwriteBrowse
// dmtwriteWriteFileHeader
// dmtwriteReadMappingFile
// dmtwriteWriteDIHeader
// dmtwriteWriteDeviceHeader
// dmtwriteWriteObjectSection
// dmtwriteWriteAllObjectSections
// dmtwriteWriteGenreSection
// dmtwriteWriteAllGenreSections
// dmtwriteCreateDeviceShorthand
// dmtwriteDisplaySaveDialog
//
// History:
// 08/20/1999 - davidkl - created
//===========================================================================
#include "dimaptst.h"
#include "commdlg.h"
#include "cderr.h"
#include "dmtinput.h"
#include "dmtwrite.h"
//---------------------------------------------------------------------------
//===========================================================================
// dmtwriteWriteFileHeader
//
// Writes the semantic mapping file for the provided device
//
// Parameters:
//
// Returns: HRESULT
//
// History:
// 10/11/1999 - davidkl - stubbed
// 10/14/1999 - davidkl - renamed and tweaked
// 11/04/1999 - davidkl - reduced parameter list
// 12/01/1999 - davidkl - now registers file HERE
//===========================================================================
HRESULT dmtwriteWriteFileHeader(HWND hwnd,
DMTDEVICE_NODE *pDevice)
{
HRESULT hRes = S_OK;
DWORD dwGenres = 0;
HANDLE hDoesFileExist = NULL;
// validate pDevice
if(IsBadReadPtr((void*)pDevice, sizeof(DMTDEVICE_NODE)))
{
return E_POINTER;
}
__try
{
// prompt the user for where to save
//
// if we are handed a non-empty filename
// (not == ""), skip this step
// if(!lstrcmpA("", pDevice->szFilename))
{
// display the save dialog
hRes = dmtwriteDisplaySaveDialog(hwnd, pDevice);
if(FAILED(hRes))
{
__leave;
}
if(S_FALSE == hRes)
{
//user canceled
__leave;
}
}
// generate the device shorthand string
lstrcpyA(pDevice->szShorthandName, pDevice->szName);
/*
//02/21/2000 - taking this out for now
hRes = dmtwriteCreateDeviceShorthand(pDevice->szName,
pDevice->szShorthandName);
if(FAILED(hRes))
{
__leave;
}
*/
//JT - Fix for 38829 added create to check if file exists prior to writing all the header info back to the file.
hDoesFileExist = CreateFile(pDevice->szFilename,GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (INVALID_HANDLE_VALUE == hDoesFileExist)
{
DPF(0,"This file doesn't exist so we will write the header");
// write the DirectInput header
hRes = dmtwriteWriteDIHeader(pDevice->szFilename,
pDevice->szShorthandName,
dwGenres);
if(FAILED(hRes))
{
__leave;
}
// write the device header
hRes = dmtwriteWriteDeviceHeader(pDevice);
if(FAILED(hRes))
{
__leave;
}
// write the device object sections
hRes = dmtwriteWriteAllObjectSections(pDevice->szFilename,
pDevice->szShorthandName,
pDevice->pObjectList);
if(FAILED(hRes))
{
__leave;
}
}
else
{
//Otherwise the file does exist and we have to close the handle
CloseHandle(hDoesFileExist);
}
// update the registry
//
// this is needed so that dinput can find our new file
hRes = dmtinputRegisterMapFile(hwnd,
pDevice);
if(FAILED(hRes))
{
__leave;
}
}
__finally
{
// general cleanup
// nothing to do... yet
}
// done
return hRes;
} //*** end dmtwriteWriteFileHeader()
//===========================================================================
// dmtwriteWriteDIHeader
//
// Writes the DirectInput section of the device mapping ini file.
//
// Parameters:
//
// Returns:
//
// History:
// 10/12/1999 - davidkl - created
// 10/15/1999 - davidkl - tweaked section entries
//===========================================================================
HRESULT dmtwriteWriteDIHeader(PSTR szFilename,
PSTR szDeviceShorthand,
DWORD dwGenres)
{
HRESULT hRes = S_OK;
__try
{
// * di version
if(!WritePrivateProfileStringA("DirectInput",
"DirectXVersion",
DMT_DI_STRING_VER,
szFilename))
{
hRes = DMT_E_FILE_WRITE_FAILED;
__leave;
}
// * device
// ISSUE-2001/03/29-timgill Need to read original value and support multiple devices
if(!WritePrivateProfileStringA("DirectInput",
"Devices",
szDeviceShorthand,
szFilename))
{
hRes = DMT_E_FILE_WRITE_FAILED;
__leave;
}
}
__finally
{
// cleanup
// nothing to do... yet
}
// done
return hRes;
} //*** end dmtwriteWriteDIHeader()
//===========================================================================
// dmtwriteWriteDeviceHeader
//
// Writes the device summary section of the device mapping ini file.
//
// Parameters:
//
// Returns:
//
// History:
// 10/12/1999 - davidkl - created
// 11/01/1999 - davidkl - file size reduction changes
// 11/04/1999 - davidkl - reduced parameter list
//===========================================================================
HRESULT dmtwriteWriteDeviceHeader(DMTDEVICE_NODE *pDevice)
{
HRESULT hRes = S_OK;
DMTDEVICEOBJECT_NODE *pObjNode = NULL;
UINT uAxes = 0;
UINT uBtns = 0;
UINT uPovs = 0;
char szBuf[MAX_PATH];
// validate pDevice
if(IsBadReadPtr((void*)pDevice, sizeof(DMTDEVICE_NODE)))
{
return E_POINTER;
}
__try
{
// vendor id
//
// only write this if the vid is non-zero
if(0 != pDevice->wVendorId)
{
wsprintfA(szBuf, "%d", pDevice->wVendorId);
if(!WritePrivateProfileStringA(pDevice->szShorthandName,
"VID",
szBuf,
pDevice->szFilename))
{
hRes = DMT_E_FILE_WRITE_FAILED;
__leave;
}
}
// product id
//
// only write this if the pid is non-zero
if(0 != pDevice->wProductId)
{
wsprintfA(szBuf, "%d", pDevice->wProductId);
if(!WritePrivateProfileStringA(pDevice->szShorthandName,
"PID",
szBuf,
pDevice->szFilename))
{
hRes = DMT_E_FILE_WRITE_FAILED;
__leave;
}
}
// name
//
if(!WritePrivateProfileStringA(pDevice->szShorthandName,
"Name",
pDevice->szName,
pDevice->szFilename))
{
hRes = DMT_E_FILE_WRITE_FAILED;
__leave;
}
// control list
lstrcpyA(szBuf, "");
pObjNode = pDevice->pObjectList;
while(pObjNode)
{
DPF(0, "dmtwriteWriteDeviceHeader - pObjNode == %016Xh", pObjNode);
DPF(0, "dmtwriteWriteDeviceHeader - pObjNode->szName == %s", pObjNode->szName);
wsprintfA(szBuf, "%s%s,", szBuf, pObjNode->szName);
DPF(0, "dmtwriteWriteDeviceHeader - szBuf == %s", szBuf);
// next object
pObjNode = pObjNode->pNext;
}
if(!WritePrivateProfileStringA(pDevice->szShorthandName,
"Controls",
szBuf,
pDevice->szFilename))
{
DPF(0, "dmtwriteWriteDeviceHeader - writing controls == %s", szBuf);
hRes = DMT_E_FILE_WRITE_FAILED;
__leave;
}
}
__finally
{
// cleanup
// nothing to do... yet
}
// done
return hRes;
} //*** end dmtwriteWriteDeviceHeader()
//===========================================================================
// dmtwriteWriteObjectSection
//
// Writes an individual object section of the device mapping ini file.
//
// Parameters:
//
// Returns:
//
// History:
// 10/12/1999 - davidkl - stubbed
// 10/13/1999 - davidkl - initial implementation
// 10/15/1999 - davidkl - added name to section
// 11/01/1999 - davidkl - file size reduction changes
//===========================================================================
HRESULT dmtwriteWriteObjectSection(PSTR szFilename,
PSTR szDeviceShorthand,
PSTR szObjectName,
WORD wUsagePage,
WORD wUsage)
{
HRESULT hRes = S_OK;
char szBuf[MAX_PATH];
char szSection[MAX_PATH];
// construct section name
/*
wsprintfA(szSection, "%s.%s",
szDeviceShorthand,
*/
wsprintfA(szSection, "%s",
szObjectName);
// usage page
//
// only write this if it is non-zero
if(0 != wUsagePage)
{
wsprintfA(szBuf, "%d", wUsagePage);
if(!WritePrivateProfileStringA(szSection,
"UsagePage",
szBuf,
szFilename))
{
return DMT_E_FILE_WRITE_FAILED;
}
}
// usage
//
// only write this if it is non-zero
if(0 != wUsage)
{
wsprintfA(szBuf, "%d", wUsage);
if(!WritePrivateProfileStringA(szSection,
"Usage",
szBuf,
szFilename))
{
return DMT_E_FILE_WRITE_FAILED;
}
}
// name
//
// only write this if >both< wUsagePage and wUsage are zero
if((0 == wUsagePage) && (0 == wUsage))
{
if(!WritePrivateProfileStringA(szSection,
"Name",
szObjectName,
szFilename))
{
return DMT_E_FILE_WRITE_FAILED;
}
}
// done
return S_OK;
} //*** end dmtwriteWriteObjectSection()
//===========================================================================
// dmtwriteWriteAllObjectSections
//
// Writes all object sections of the device mapping ini file.
//
// Parameters:
//
// Returns:
//
// History:
// 10/12/1999 - davidkl - stubbed
// 10/13/1999 - davidkl - initial implementation
//===========================================================================
HRESULT dmtwriteWriteAllObjectSections(PSTR szFilename,
PSTR szDeviceShorthand,
DMTDEVICEOBJECT_NODE *pObjectList)
{
HRESULT hRes = S_OK;
DMTDEVICEOBJECT_NODE *pObject = NULL;
// validate pObjectList
if(IsBadReadPtr((void*)pObjectList, sizeof(DMTDEVICEOBJECT_NODE)))
{
return E_POINTER;
}
pObject = pObjectList;
while(pObject)
{
hRes = dmtwriteWriteObjectSection(szFilename,
szDeviceShorthand,
pObject->szName,
pObject->wUsagePage,
pObject->wUsage);
if(FAILED(hRes))
{
break;
}
// next object
pObject = pObject->pNext;
}
// done
return hRes;
} //*** end dmtwriteWriteAllObjectSections()
//===========================================================================
// dmtwriteDisplaySaveDialog
//
// Displays Save (As) dialog box promting the user for the filename
//
// Parameters:
// HWND hwnd - handle to owner of save dialog
// PSTR szFilename - receives selected filename (incl. drive & path)
// int cchFilename - count of characters in szFilename buffer
//
// Returns: HRESULT
//
// History:
// 10/14/1999 - davidkl - created
//===========================================================================
HRESULT dmtwriteDisplaySaveDialog(HWND hwnd,
DMTDEVICE_NODE *pDevice)
{
HRESULT hRes = S_OK;
USHORT nOffsetFilename = 0;
USHORT nOffsetExt = 0;
DWORD dw = 0;
OPENFILENAMEA ofn;
char szTitle[MAX_PATH];
// initialize Title Text
lstrcpyA(szTitle, "Select DirectInput(TM) Mapping File");
lstrcatA(szTitle, " for ");
lstrcatA(szTitle, pDevice->szName);
// initialize the ofn struct
ZeroMemory((void*)&ofn, sizeof(OPENFILENAMEA));
ofn.lStructSize = sizeof(OPENFILENAMEA);
ofn.hwndOwner = hwnd;
ofn.hInstance = (HINSTANCE)NULL; // not using dlg template
ofn.lpstrFilter = "DirectInput(TM) Mapping Files\0*.ini\0";
ofn.lpstrCustomFilter = (LPSTR)NULL; // don't save custom
ofn.nMaxCustFilter = 0; // ignored based on above
ofn.nFilterIndex = 1; // display first filter
ofn.lpstrFile = pDevice->szFilename; // filename w/ path
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFileTitle = (LPSTR)NULL; // filename w/o path
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = (LPSTR)NULL; // use default initial dir
ofn.lpstrTitle = szTitle;
ofn.Flags = OFN_CREATEPROMPT |
OFN_OVERWRITEPROMPT |
OFN_HIDEREADONLY |
OFN_NOREADONLYRETURN |
OFN_NOTESTFILECREATE;
ofn.nFileOffset = (WORD)nOffsetFilename;
ofn.nFileExtension = (WORD)nOffsetExt;
ofn.lpstrDefExt = "ini";
ofn.lCustData = NULL;
ofn.lpfnHook = NULL;
ofn.lpTemplateName = NULL;
// display the save dialog
if(!GetOpenFileNameA(&ofn))
{
// either something failed, or the user canceled
//
// find out which
dw = CommDlgExtendedError();
if( 0 == dw )
{
// user canceled
DPF(2, "dmtwriteDisplaySaveDialog - user canceled");
hRes = S_FALSE;
}
else
{
// failure
DPF(2, "dmtwriteDisplaySaveDialog - GetSaveFileNameA failed (%d)", dw);
hRes = E_UNEXPECTED;
}
}
// done
return hRes;
} //*** end dmtwriteDisplaySaveDialog()
//===========================================================================
// dmtwriteSaveConfDlgProc
//
// Save confirmation dialog processing function
//
// Parameters: (see SDK help for parameter details)
// HWND hwnd
// UINT uMsg
// WPARAM wparam
// LPARAM lparam
//
// Returns: (see SDK help for return value details)
// BOOL
//
// History:
// 10/18/1999 - davidkl - created
//===========================================================================
INT_PTR WINAPI CALLBACK dmtwriteSaveConfDlgProc(HWND hwnd,
UINT uMsg,
WPARAM wparam,
LPARAM lparam)
{
switch(uMsg)
{
case WM_INITDIALOG:
return dmtwriteSaveConfOnInitDialog(hwnd,
(HWND)wparam,
lparam);
case WM_COMMAND:
return dmtwriteSaveConfOnCommand(hwnd,
LOWORD(wparam),
(HWND)lparam,
HIWORD(wparam));
}
return FALSE;
} //*** end dmtwriteSaveConfDlgProc()
//===========================================================================
// dmtwriteSaveConfOnInitDialog
//
// Handle WM_INITDIALOG processing for the save confirmation box
//
// Parameters:
// HWND hwnd - handle to property page
// HWND hwndFocus - handle of ctrl with focus
// LPARAM lparam - user data (in this case, PROPSHEETPAGE*)
//
// Returns: BOOL
//
// History:
// 10/18/1999 - davidkl - created
//===========================================================================
BOOL dmtwriteSaveConfOnInitDialog(HWND hwnd,
HWND hwndFocus,
LPARAM lparam)
{
char szBuf[MAX_PATH];
wsprintfA(szBuf,
"Save genre group %s action map?",
(PSTR)lparam);
SetWindowTextA(hwnd, szBuf);
SetDlgItemTextA(hwnd,
IDC_GENRE_GROUP,
(PSTR)lparam);
// done
return TRUE;
} //*** end dmtwriteSaveConfOnInitDialog()
//===========================================================================
// dmtwriteSaveConfOnCommand
//
// Handle WM_COMMAND processing for the save confirmation box
//
// Parameters:
// HWND hwnd - handle to property page
// WORD wId - control identifier (LOWORD(wparam))
// HWND hwndCtrl - handle to control ((HWND)lparam)
// WORD wNotifyCode - notification code (HIWORD(wparam))
//
// Returns: BOOL
//
// History:
// 10/18/1999 - davidkl - created
//===========================================================================
BOOL dmtwriteSaveConfOnCommand(HWND hwnd,
WORD wId,
HWND hwndCtrl,
WORD wNotifyCode)
{
int nRet = -1;
switch(wId)
{
case IDOK:
EndDialog(hwnd, (int)IDYES);
break;
case IDC_DONT_SAVE:
EndDialog(hwnd, (int)IDNO);
break;
case IDCANCEL:
EndDialog(hwnd, (int)IDCANCEL);
break;
}
// done
return FALSE;
} //*** end dmtwriteSaveConfOnCommand()
//===========================================================================
//===========================================================================
//===========================================================================
//===========================================================================
//===========================================================================
//===========================================================================
//===========================================================================
//===========================================================================