//=========================================================================== // 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() //=========================================================================== //=========================================================================== //=========================================================================== //=========================================================================== //=========================================================================== //=========================================================================== //=========================================================================== //===========================================================================