// OutPage.cpp : implementation file // #include "stdafx.h" #include "pdlcnfig.h" #include "common.h" #include "OutPage.h" #ifndef _tsplitpath #if _MBCS #define _tsplitpath _splitpath #else #define _tsplitpath _wsplitpath #endif #endif #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // COutputPropPage property page IMPLEMENT_DYNCREATE(COutputPropPage, CPropertyPage) COutputPropPage::COutputPropPage() : CPropertyPage(COutputPropPage::IDD) { //{{AFX_DATA_INIT(COutputPropPage) m_OutputFileName = _T(""); m_RenameInterval = 0; m_BaseFileName = _T(""); m_AutoNameIndex = -1; m_LogFileTypeIndex = -1; m_RenameUnitsIndex = -1; m_szLogDirectory = _T(""); m_szCmdFilename = _T(""); m_ExecuteCmd = 0; //}}AFX_DATA_INIT m_hKeyLogSettingsDefault = NULL; m_hKeyLogSettings = NULL; m_hKeyLogService = NULL; m_bFileNameChanged = NULL; m_bInitialized = FALSE; } COutputPropPage::~COutputPropPage() { if (m_hKeyLogSettingsDefault != NULL) RegCloseKey(m_hKeyLogSettingsDefault); if (m_hKeyLogSettings != NULL) RegCloseKey(m_hKeyLogSettings); if (m_hKeyLogService != NULL) RegCloseKey(m_hKeyLogService); } void COutputPropPage::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(COutputPropPage) DDX_Text(pDX, IDC_OUTPUT_FILE_EDIT, m_OutputFileName); DDV_MaxChars(pDX, m_OutputFileName, 260); DDX_Text(pDX, IDC_RENAME_INTERVAL, m_RenameInterval); DDV_MinMaxDWord(pDX, m_RenameInterval, 0, 99999); DDX_Text(pDX, IDC_BASE_FILENAME_EDIT, m_BaseFileName); DDV_MaxChars(pDX, m_BaseFileName, 260); DDX_CBIndex(pDX, IDC_AUTO_NAME_COMBO, m_AutoNameIndex); DDX_CBIndex(pDX, IDC_LOG_FILETYPE, m_LogFileTypeIndex); DDX_CBIndex(pDX, IDC_RENAME_UNITS, m_RenameUnitsIndex); DDX_Text(pDX, IDC_LOG_DIRECTORY, m_szLogDirectory); DDV_MaxChars(pDX, m_szLogDirectory, 260); DDX_Text(pDX, IDC_CMD_FILENAME, m_szCmdFilename); DDV_MaxChars(pDX, m_szCmdFilename, 260); DDX_Check(pDX, IDC_EXECUTE_CHECK, m_ExecuteCmd); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(COutputPropPage, CPropertyPage) //{{AFX_MSG_MAP(COutputPropPage) ON_BN_CLICKED(IDC_AUTOMATIC_NAME, OnAutomaticName) ON_BN_CLICKED(IDC_MANUAL_NAME, OnManualName) ON_CBN_SELCHANGE(IDC_AUTO_NAME_COMBO, OnSelchangeAutoNameCombo) ON_EN_CHANGE(IDC_BASE_FILENAME_EDIT, OnChangeBaseFilenameEdit) ON_BN_CLICKED(IDC_BROWSE_OUTPUT_FILE, OnBrowseOutputFile) ON_CBN_SELCHANGE(IDC_LOG_FILETYPE, OnSelchangeLogFiletype) ON_CBN_SELCHANGE(IDC_RENAME_UNITS, OnSelchangeRenameUnits) ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_RENAME_INTERVAL, OnDeltaposSpinRenameInterval) ON_EN_CHANGE(IDC_OUTPUT_FILE_EDIT, OnChangeOutputFileEdit) ON_EN_CHANGE(IDC_RENAME_INTERVAL, OnChangeRenameInterval) ON_EN_UPDATE(IDC_BASE_FILENAME_EDIT, OnUpdateBaseFilenameEdit) ON_BN_CLICKED(IDC_BROWSE_FOLDER, OnBrowseFolder) ON_BN_CLICKED(IDC_EXECUTE_CHECK, OnExecuteCheck) ON_BN_CLICKED(IDC_BROWSE_CMD_FILE, OnBrowseCmdFile) ON_EN_CHANGE(IDC_CMD_FILENAME, OnChangeCmdFilename) //}}AFX_MSG_MAP ON_MESSAGE (PSM_QUERYSIBLINGS, OnQuerySiblings) END_MESSAGE_MAP() void COutputPropPage::InitDialogData (void) { LONG lStatus = ERROR_INVALID_FUNCTION; DWORD dwRegValType; DWORD dwRegValue; DWORD dwRegValueSize; CString csTempFilePath; TCHAR szRegString[MAX_PATH]; TCHAR szDriveName[MAX_PATH]; BOOL bAutoMode = FALSE; if (m_bInitialized) return; if (m_hKeyLogService == NULL) { // open registry key to service lStatus = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, TEXT("SYSTEM\\CurrentControlSet\\Services\\PerfDataLog"), 0, KEY_READ | KEY_WRITE, &m_hKeyLogService); } if ((m_hKeyLogSettings == NULL) && (m_hKeyLogService != NULL)) { // open registry to log query info lStatus = RegOpenKeyEx ( m_hKeyLogService, TEXT("Log Queries"), 0, KEY_READ | KEY_WRITE, &m_hKeyLogSettings); } if ((m_hKeyLogSettingsDefault == NULL) && (m_hKeyLogSettings != NULL)) { // open registry to default log query lStatus = RegOpenKeyEx ( m_hKeyLogSettings, TEXT("Default"), 0, KEY_READ | KEY_WRITE, &m_hKeyLogSettingsDefault); } if (lStatus != ERROR_SUCCESS) { return; // display error, close dialog and exit } // continue if (m_LogFileTypeIndex == -1) { // read log file format dwRegValType = 0; dwRegValue = 0; dwRegValueSize = sizeof(DWORD); lStatus = RegQueryValueEx ( m_hKeyLogSettingsDefault, TEXT("Log File Type"), NULL, &dwRegValType, (LPBYTE)&dwRegValue, &dwRegValueSize); if (lStatus != ERROR_SUCCESS) { // then apply default value dwRegValue = OPD_CSV_FILE; } m_LogFileTypeIndex = dwRegValue; } if (m_RenameInterval == 0) { // set default mode dwRegValType = 0; dwRegValue = 0; dwRegValueSize = sizeof(DWORD); lStatus = RegQueryValueEx ( m_hKeyLogSettingsDefault, TEXT("Auto Name Interval"), NULL, &dwRegValType, (LPBYTE)&dwRegValue, &dwRegValueSize); if (lStatus != ERROR_SUCCESS) { // then apply default value dwRegValue = 0; // manual naming is the default } else if (dwRegValType != REG_DWORD) { // then apply default value dwRegValue = 0; // manual naming is the default } // else assume it was OK if (dwRegValue == 0) { // initialize the rest of the manual name field(s) dwRegValType = 0; dwRegValueSize = MAX_PATH * sizeof(TCHAR); memset (szRegString, 0, dwRegValueSize); lStatus = RegQueryValueEx ( m_hKeyLogSettingsDefault, TEXT("Log Filename"), NULL, &dwRegValType, (LPBYTE)&szRegString[0], &dwRegValueSize); if (lStatus != ERROR_SUCCESS) { // apply default name lstrcpy (szRegString, TEXT("perfdata.")); switch (m_LogFileTypeIndex) { case OPD_TSV_FILE: lstrcat (szRegString, TEXT("tsv")); break; case OPD_BIN_FILE: lstrcat (szRegString, TEXT("blg")); break; case (OPD_CSV_FILE): default: lstrcat (szRegString, TEXT("csv")); break; } } // if the filename doesn't specify a directory, then use the csTempFilePath = szRegString; _tsplitpath ((LPCTSTR)csTempFilePath, szDriveName, szRegString, NULL, NULL); if ((lstrlen(szDriveName) == 0) && (lstrlen(szRegString) == 0)) { // default log file directory dwRegValType = 0; dwRegValueSize = MAX_PATH * sizeof(TCHAR); memset (szRegString, 0, dwRegValueSize); lStatus = RegQueryValueEx ( m_hKeyLogSettingsDefault, TEXT("Log Default Directory"), NULL, &dwRegValType, (LPBYTE)&szRegString[0], &dwRegValueSize); if (lStatus != ERROR_SUCCESS) { // try to use the general default dwRegValType = 0; dwRegValueSize = MAX_PATH * sizeof(TCHAR); memset (szRegString, 0, dwRegValueSize); lStatus = RegQueryValueEx ( m_hKeyLogSettings, TEXT("Log Default Directory"), NULL, &dwRegValType, (LPBYTE)&szRegString[0], &dwRegValueSize); if (lStatus != ERROR_SUCCESS) { // apply the default then since we can't find it // in the registry anywhere lstrcpy (szRegString, TEXT("c:\\perflogs")); } } // szRegString should have a valid path here m_szLogDirectory = szRegString; // load default dir for auto section m_OutputFileName = szRegString; m_OutputFileName += TEXT ("\\"); } else { m_szLogDirectory = szDriveName; // the file parsing function leaves the trailing backslash // so remove it before concatenating it. if (szRegString[lstrlen(szRegString)-1] == TEXT('\\')) { szRegString[lstrlen(szRegString)-1] = 0; } m_szLogDirectory += szRegString; m_OutputFileName.Empty(); } m_OutputFileName += csTempFilePath; // set auto combo boxes to default values m_BaseFileName = TEXT("perfdata"); m_AutoNameIndex = OPD_NAME_YYMMDD; m_RenameUnitsIndex = OPD_RENAME_DAYS; m_RenameInterval = 1; bAutoMode = FALSE; } else { m_RenameInterval = dwRegValue; // get values for controls dwRegValType = 0; dwRegValueSize = MAX_PATH * sizeof(TCHAR); memset (szRegString, 0, dwRegValueSize); lStatus = RegQueryValueEx ( m_hKeyLogSettingsDefault, TEXT("Log Default Directory"), NULL, &dwRegValType, (LPBYTE)&szRegString[0], &dwRegValueSize); if (lStatus != ERROR_SUCCESS) { // try to use the general default dwRegValType = 0; dwRegValueSize = MAX_PATH * sizeof(TCHAR); memset (szRegString, 0, dwRegValueSize); lStatus = RegQueryValueEx ( m_hKeyLogSettings, TEXT("Log Default Directory"), NULL, &dwRegValType, (LPBYTE)&szRegString[0], &dwRegValueSize); if (lStatus != ERROR_SUCCESS) { // apply the default then since we can't find it // in the registry anywhere lstrcpy (szRegString, TEXT("c:\\perflogs")); } } // szRegString should have a valid path here m_szLogDirectory = szRegString; // base filename dwRegValType = 0; dwRegValueSize = MAX_PATH * sizeof(TCHAR); memset (szRegString, 0, dwRegValueSize); lStatus = RegQueryValueEx ( m_hKeyLogSettingsDefault, TEXT("Base Filename"), NULL, &dwRegValType, (LPBYTE)&szRegString[0], &dwRegValueSize); if (lStatus != ERROR_SUCCESS) { // apply default name lstrcpy (szRegString, TEXT("perfdata")); } m_BaseFileName = szRegString; // get auto name format dwRegValType = 0; dwRegValue = 0; dwRegValueSize = sizeof(DWORD); lStatus = RegQueryValueEx ( m_hKeyLogSettingsDefault, TEXT("Log File Auto Format"), NULL, &dwRegValType, (LPBYTE)&dwRegValue, &dwRegValueSize); if (lStatus != ERROR_SUCCESS) { // then apply default value dwRegValue = OPD_NAME_YYMMDD; // manual naming is the default } // set update interval information m_AutoNameIndex = dwRegValue; dwRegValType = 0; dwRegValue = 0; dwRegValueSize = sizeof(DWORD); lStatus = RegQueryValueEx ( m_hKeyLogSettingsDefault, TEXT("Auto Rename Units"), NULL, &dwRegValType, (LPBYTE)&dwRegValue, &dwRegValueSize); if (lStatus != ERROR_SUCCESS) { // then apply default value dwRegValue = OPD_RENAME_DAYS; // manual naming is the default } m_RenameUnitsIndex = dwRegValue; dwRegValType = 0; dwRegValueSize = MAX_PATH * sizeof(TCHAR); memset (szRegString, 0, dwRegValueSize); lStatus = RegQueryValueEx ( m_hKeyLogSettingsDefault, TEXT("Command File"), NULL, &dwRegValType, (LPBYTE)&szRegString[0], &dwRegValueSize); if (lStatus != ERROR_SUCCESS) { // then apply default value m_ExecuteCmd = 0; m_szCmdFilename = _T(""); } else { // else use the one from the registry m_ExecuteCmd = 1; m_szCmdFilename = szRegString; } } } m_bInitialized = TRUE; return; } afx_msg LRESULT COutputPropPage::OnQuerySiblings (WPARAM wParam, LPARAM lParam) { switch (wParam) { case PDLCNFIG_PSM_QS_WILDCARD_LOG: switch (m_LogFileTypeIndex) { case -1: return PDLCNFIG_WILDCARD_LOG_DONT_KNOW; case OPD_BIN_FILE: return PDLCNFIG_WILDCARD_LOG_YES; case OPD_CSV_FILE: case OPD_TSV_FILE: default: return PDLCNFIG_WILDCARD_LOG_NO; } case PDLCNFIG_PSM_QS_ARE_YOU_READY: InitDialogData(); return 0; default: return 0; // to pass to the next property page } } BOOL COutputPropPage::IsDirPathValid (LPCTSTR szPath, BOOL bLastNameIsDirectory, BOOL bCreateMissingDirs) /*++ Routine Description: Creates the directory specified in szPath and any other "higher" directories in the specified path that don't exist. Arguments: IN LPCTSTR szPath directory path to create (assumed to be a DOS path, not a UNC) IN BOOL bLastNameIsDirectory TRUE when the last name in the path is a Directory and not a File FALSE if the last name is a file IN BOOL bCreateMissingDirs TRUE will create any dirs in the path that are not found FALSE will only test for existence and not create any missing dirs. Return Value: TRUE if the directory path now exists FALSE if error (GetLastError to find out why) --*/ { LPTSTR szLocalPath; LPTSTR szEnd; LONG lReturn = 0L; LPSECURITY_ATTRIBUTES lpSA = NULL; DWORD dwAttr; TCHAR cBackslash = TEXT('\\'); szLocalPath = (LPTSTR)HeapAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY, MAX_PATH * sizeof(TCHAR)); if (szLocalPath == NULL) { SetLastError (ERROR_OUTOFMEMORY); return FALSE; } else { // so far so good... SetLastError (ERROR_SUCCESS); // initialize error value to SUCCESS } if (GetFullPathName (szPath, MAX_PATH, szLocalPath, NULL) > 0) { szEnd = &szLocalPath[3]; if (*szEnd != 0) { // then there are sub dirs to create while (*szEnd != 0) { // go to next backslash while ((*szEnd != cBackslash) && (*szEnd != 0)) szEnd++; if (*szEnd == cBackslash) { // terminate path here and create directory *szEnd = 0; if (bCreateMissingDirs) { if (!CreateDirectory (szLocalPath, lpSA)) { // see what the error was and "adjust" it if necessary if (GetLastError() == ERROR_ALREADY_EXISTS) { // this is OK SetLastError (ERROR_SUCCESS); } else { lReturn = 0; } } else { // directory created successfully so update count lReturn++; } } else { if ((dwAttr = GetFileAttributes(szLocalPath)) != 0xFFFFFFFF) { // make sure it's a dir if ((dwAttr & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) { lReturn++; } else { // if any dirs fail, then clear the return value lReturn = 0; } } else { // if any dirs fail, then clear the return value lReturn = 0; } } // replace backslash and go to next dir *szEnd++ = cBackslash; } } // create last dir in path now if it's a dir name and not a filename if (bLastNameIsDirectory) { if (bCreateMissingDirs) { if (!CreateDirectory (szLocalPath, lpSA)) { // see what the error was and "adjust" it if necessary if (GetLastError() == ERROR_ALREADY_EXISTS) { // this is OK SetLastError (ERROR_SUCCESS); lReturn++; } else { lReturn = 0; } } else { // directory created successfully lReturn++; } } else { if ((dwAttr = GetFileAttributes(szLocalPath)) != 0xFFFFFFFF) { // make sure it's a dir if ((dwAttr & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) { lReturn++; } else { // if any dirs fail, then clear the return value lReturn = 0; } } else { // if any dirs fail, then clear the return value lReturn = 0; } } } } else { // else this is a root dir only so return success. lReturn = 1; } } if (szLocalPath != NULL) HeapFree (GetProcessHeap(), 0, szLocalPath); return lReturn; } void COutputPropPage::AutoManualEnable (BOOL bAutomatic) { BOOL bShowCmdFile; GetDlgItem(IDC_MANUAL_NAME_GROUP)->EnableWindow(!bAutomatic); GetDlgItem(IDC_OUTPUT_FILE_EDIT)->EnableWindow(!bAutomatic); GetDlgItem(IDC_BROWSE_OUTPUT_FILE)->EnableWindow(!bAutomatic); GetDlgItem(IDC_AUTO_NAME_GROUP)->EnableWindow(bAutomatic); GetDlgItem(IDC_RENAME_INTERVAL)->EnableWindow(bAutomatic); GetDlgItem(IDC_SPIN_RENAME_INTERVAL)->EnableWindow(bAutomatic); GetDlgItem(IDC_RENAME_UNITS)->EnableWindow(bAutomatic); GetDlgItem(IDC_BROWSE_FOLDER)->EnableWindow(bAutomatic); GetDlgItem(IDC_LOG_DIRECTORY)->EnableWindow(bAutomatic); GetDlgItem(IDC_BASE_NAME_CAPTION)->EnableWindow(bAutomatic); GetDlgItem(IDC_BASE_FILENAME_EDIT)->EnableWindow(bAutomatic); GetDlgItem(IDC_AUTO_NAME_CAPTION)->EnableWindow(bAutomatic); GetDlgItem(IDC_AUTO_NAME_COMBO)->EnableWindow(bAutomatic); GetDlgItem(IDC_SAMPLE_NAME)->EnableWindow(bAutomatic); GetDlgItem(IDC_SAMPLE_NAME_TEXT)->EnableWindow(bAutomatic); GetDlgItem(IDC_EXECUTE_CHECK)->EnableWindow(bAutomatic); bShowCmdFile = bAutomatic && m_ExecuteCmd; GetDlgItem(IDC_CMD_FILENAME)->EnableWindow(bShowCmdFile); GetDlgItem(IDC_BROWSE_CMD_FILE)->EnableWindow(bShowCmdFile); } void COutputPropPage::UpdateSampleFilename() { CString cCompositeName; CString cBaseName; CString cDateString; CString cFileTypeString; CTime cCurrentTime = CTime::GetCurrentTime(); LONG lAutoNameFormat; LONG lFileTypeIndex; BOOL bAutoName; bAutoName = IsDlgButtonChecked (IDC_AUTOMATIC_NAME); if (bAutoName) { // only update if the automatic button is checked // get base name text GetDlgItemText (IDC_BASE_FILENAME_EDIT, cBaseName); cBaseName += TEXT("_"); // get date/time/serial integer format cCurrentTime.GetCurrentTime(); lAutoNameFormat = ((CComboBox *)GetDlgItem(IDC_AUTO_NAME_COMBO))->GetCurSel(); switch (lAutoNameFormat) { case OPD_NAME_NNNNNN: cDateString = TEXT("000001"); break; case OPD_NAME_YYDDD: cDateString = cCurrentTime.Format (TEXT("%y%j")); break; case OPD_NAME_YYMM: cDateString = cCurrentTime.Format (TEXT("%y%m")); break; case OPD_NAME_YYMMDDHH: cDateString = cCurrentTime.Format (TEXT("%y%m%d%H")); break; case OPD_NAME_MMDDHH: cDateString = cCurrentTime.Format (TEXT("%m%d%H")); break; case OPD_NAME_YYMMDD: default: cDateString = cCurrentTime.Format (TEXT("%y%m%d")); break; } cCompositeName = cBaseName; cCompositeName += cDateString; } else { int nExtLoc; int nNameLen; // with a manual name, just update the extension // get the current filename if (GetDlgItemText (IDC_OUTPUT_FILE_EDIT, cBaseName) == 0) { // no name in the edit control, so make one up to use // as a default cCompositeName = TEXT("c:\\perflogs"); cCompositeName += TEXT("\\perfdata"); } else { //find last "." in string nExtLoc = cBaseName.ReverseFind (_T('.')); if (nExtLoc > 0) { // don't copy the "." cCompositeName = cBaseName.Left(nExtLoc); } } } // get file type lFileTypeIndex = ((CComboBox *)GetDlgItem(IDC_LOG_FILETYPE))->GetCurSel(); switch (lFileTypeIndex) { case OPD_TSV_FILE: cFileTypeString = TEXT(".TSV"); break; case OPD_BIN_FILE: cFileTypeString = TEXT(".BLG"); break; case OPD_CSV_FILE: default: cFileTypeString = TEXT(".CSV"); break; } cCompositeName += cFileTypeString; if (bAutoName) { SetDlgItemText (IDC_SAMPLE_NAME_TEXT, cCompositeName); } else { SetDlgItemText (IDC_OUTPUT_FILE_EDIT, cCompositeName); } } BOOL COutputPropPage::IsWildcardLogFileType (void) { switch (m_LogFileTypeIndex) { case OPD_BIN_FILE: return TRUE; case OPD_CSV_FILE: case OPD_TSV_FILE: default: return FALSE; } } ///////////////////////////////////////////////////////////////////////////// // COutputPropPage message handlers BOOL COutputPropPage::OnInitDialog() { BOOL bAutoMode; InitDialogData(); // now init other pages QuerySiblings (PDLCNFIG_PSM_QS_ARE_YOU_READY, 0); if (m_RenameInterval == 0) { // then manual naming has been selected: CheckRadioButton (IDC_MANUAL_NAME, IDC_AUTOMATIC_NAME, IDC_MANUAL_NAME); bAutoMode = FALSE; } else { CheckRadioButton (IDC_MANUAL_NAME, IDC_AUTOMATIC_NAME, IDC_AUTOMATIC_NAME); bAutoMode = TRUE; } CPropertyPage::OnInitDialog(); // now finish updating the controls in the property page UpdateSampleFilename(); // update control state to match selection AutoManualEnable (bAutoMode); SetModified(FALSE); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void COutputPropPage::OnAutomaticName() { AutoManualEnable(TRUE); UpdateSampleFilename(); SetModified(TRUE); } void COutputPropPage::OnManualName() { AutoManualEnable(FALSE); UpdateSampleFilename(); SetModified(TRUE); } void COutputPropPage::OnSelchangeAutoNameCombo() { // TODO: Add your control notification handler code here UpdateSampleFilename(); m_bFileNameChanged = TRUE; SetModified(TRUE); } void COutputPropPage::OnChangeBaseFilenameEdit() { // TODO: Add your control notification handler code here SetModified(TRUE); m_bFileNameChanged = TRUE; } void COutputPropPage::OnBrowseOutputFile() { OPENFILENAME ofn; CComboBox *cFileTypeCombo; CString csInitialDir; LONG lLogFileType; TCHAR szFileName[MAX_PATH]; CString csBaseFilename; TCHAR szDrive[MAX_PATH]; TCHAR szDir[MAX_PATH]; TCHAR szExt[MAX_PATH]; LPTSTR szDefExt = NULL; cFileTypeCombo = (CComboBox *)GetDlgItem(IDC_LOG_FILETYPE); lLogFileType = cFileTypeCombo->GetCurSel(); if (lLogFileType == CB_ERR) lLogFileType = OPD_NUM_FILE_TYPES; GetDlgItemText (IDC_OUTPUT_FILE_EDIT, csBaseFilename); _tsplitpath((LPCTSTR)csBaseFilename, szDrive, szDir, szFileName, szExt); csInitialDir = szDrive; csInitialDir += szDir; lstrcat (szFileName, szExt); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = m_hWnd; ofn.hInstance = GetModuleHandle(NULL); ofn.lpstrFilter = TEXT("CSV Files (*.csv)\0*.csv\0TSV Files (*.tsv)\0*.tsv\0BLG Files (*.blg)\0*.blg\0All Files (*.*)\0*.*\0"); ofn.lpstrCustomFilter = NULL; ofn.nMaxCustFilter = 0; ofn.nFilterIndex = lLogFileType + 1; // nFilterIndex is 1-based ofn.lpstrFile = szFileName; ofn.nMaxFile = MAX_PATH; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = (LPCTSTR)csInitialDir; ofn.lpstrTitle = TEXT("Select Log Filename"); ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY; ofn.nFileOffset = 0; ofn.nFileExtension = 0; ofn.lpstrDefExt = NULL; ofn.lCustData = 0; ofn.lpfnHook = NULL; ofn.lpTemplateName = NULL; if (GetOpenFileName (&ofn) == IDOK) { // Update the fields with the new information cFileTypeCombo->SetCurSel(ofn.nFilterIndex-1); // see if an file name extension needs to be added... if (ofn.nFileExtension == 0) { // then add the one that matches the current file type switch (ofn.nFilterIndex-1) { case OPD_CSV_FILE: szDefExt = TEXT(".csv"); break; case OPD_TSV_FILE: szDefExt = TEXT(".tsv"); break; case OPD_BIN_FILE: szDefExt = TEXT(".blg"); break; default: szDefExt = NULL; break; } } if (szDefExt != NULL) { lstrcat (szFileName, szDefExt); } SetDlgItemText (IDC_OUTPUT_FILE_EDIT, szFileName); } // else ignore if they canceled out } void COutputPropPage::OnSelchangeLogFiletype() { UpdateData(TRUE); UpdateSampleFilename(); if ((m_LogFileTypeIndex != OPD_BIN_FILE) && (QuerySiblings (PDLCNFIG_PSM_QS_LISTBOX_STARS, 0) == PDLCNFIG_LISTBOX_STARS_YES)) { AfxMessageBox (IDS_NOT_WILDCARD_FMT, MB_OK, 0); } m_bFileNameChanged = TRUE; SetModified(TRUE); } void COutputPropPage::OnSelchangeRenameUnits() { LONG lIndex; LONG lNewDefault; // Get new sample and update default extension based on rename // interval units lIndex = ((CComboBox *)GetDlgItem(IDC_RENAME_UNITS))->GetCurSel(); switch (lIndex) { case OPD_RENAME_HOURS: lNewDefault = OPD_NAME_YYMMDDHH; break; case OPD_RENAME_DAYS: lNewDefault = OPD_NAME_YYMMDD; break; case OPD_RENAME_MONTHS: lNewDefault = OPD_NAME_YYMM; break; case OPD_RENAME_KBYTES: case OPD_RENAME_MBYTES: default: lNewDefault = OPD_NAME_NNNNNN; break; } // update new default selection ((CComboBox *)GetDlgItem(IDC_AUTO_NAME_COMBO))->SetCurSel(lNewDefault); UpdateSampleFilename(); SetModified(TRUE); } void COutputPropPage::OnDeltaposSpinRenameInterval(NMHDR* pNMHDR, LRESULT* pResult) { TCHAR szStringValue[MAX_PATH]; DWORD dwNumValue; int nChange; NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR; // get current value from edit window GetDlgItemText (IDC_RENAME_INTERVAL, szStringValue, MAX_PATH); // convert to integer dwNumValue = _tcstoul (szStringValue, NULL, 10); // delta is opposite of arrow direction nChange = -pNMUpDown->iDelta; // apply value from spin control if (nChange < 0) { // 1 is the minimum // make sure we haven't hit bottom already if (dwNumValue > 1) { dwNumValue += nChange; } } else { dwNumValue += nChange; } // update edit window _ultot (dwNumValue, szStringValue, 10); SetDlgItemText(IDC_RENAME_INTERVAL, szStringValue); SetModified(TRUE); *pResult = 0; } void COutputPropPage::OnCancel() { // TODO: Add your specialized code here and/or call the base class CPropertyPage::OnCancel(); } void COutputPropPage::OnOK() { LONG lIndex; LONG lStatus; CString csFilename; DWORD dwAutoNameFormat; DWORD dwAutoChangeInterval; BOOL bManual; BOOL bBogus = FALSE; bManual = IsDlgButtonChecked (IDC_MANUAL_NAME); if (!bManual) { dwAutoNameFormat = ((CComboBox *)GetDlgItem(IDC_AUTO_NAME_COMBO))->GetCurSel(); dwAutoChangeInterval = ((CComboBox *)GetDlgItem(IDC_RENAME_UNITS))->GetCurSel(); } // save Log File Type lIndex = ((CComboBox *)GetDlgItem(IDC_LOG_FILETYPE))->GetCurSel(); lStatus = RegSetValueEx ( m_hKeyLogSettingsDefault, TEXT("Log File Type"), 0L, REG_DWORD, (LPBYTE)&lIndex, sizeof(lIndex)); ASSERT (lStatus == ERROR_SUCCESS); // is manual filename button pushed? if (bManual) { // YES: csFilename.Empty(); // write output filename frome edit box GetDlgItemText(IDC_OUTPUT_FILE_EDIT, csFilename); lStatus = RegSetValueEx ( m_hKeyLogSettingsDefault, TEXT("Log Filename"), 0L, REG_SZ, (LPBYTE)(LPCTSTR)csFilename, (csFilename.GetLength()+1)*sizeof(TCHAR)); ASSERT (lStatus == ERROR_SUCCESS); // write rename interval == 0 lIndex = 0; lStatus = RegSetValueEx ( m_hKeyLogSettingsDefault, TEXT("Auto Name Interval"), 0L, REG_DWORD, (LPBYTE)&lIndex, sizeof(lIndex)); ASSERT (lStatus == ERROR_SUCCESS); // clear auto rename entries: // Log File Auto Format RegDeleteValue (m_hKeyLogSettingsDefault, TEXT("Log File Auto Format")); // Log Auto Name Units RegDeleteValue (m_hKeyLogSettingsDefault, TEXT("Auto Rename Units")); // Log Base Filename RegDeleteValue (m_hKeyLogSettingsDefault, TEXT("Base Log Filename")); // Command File name RegDeleteValue (m_hKeyLogSettingsDefault, TEXT("Command File")); } else { // auto is pressed so: csFilename.Empty(); // save Log Default Directory GetDlgItemText (IDC_LOG_DIRECTORY, csFilename); lStatus = RegSetValueEx ( m_hKeyLogSettingsDefault, TEXT("Log Default Directory"), 0L, REG_SZ, (LPBYTE)(LPCTSTR)csFilename, (csFilename.GetLength()+1)*sizeof(TCHAR)); ASSERT (lStatus == ERROR_SUCCESS); // save Log Base Filename csFilename.Empty(); GetDlgItemText (IDC_BASE_FILENAME_EDIT, csFilename); lStatus = RegSetValueEx ( m_hKeyLogSettingsDefault, TEXT("Base Filename"), 0L, REG_SZ, (LPBYTE)(LPCTSTR)csFilename, (csFilename.GetLength()+1)*sizeof(TCHAR)); ASSERT (lStatus == ERROR_SUCCESS); // save Log Auto Name Format lStatus = RegSetValueEx ( m_hKeyLogSettingsDefault, TEXT("Log File Auto Format"), 0L, REG_DWORD, (LPBYTE)&dwAutoNameFormat, sizeof(DWORD)); ASSERT (lStatus == ERROR_SUCCESS); if (lIndex == OPD_NAME_NNNNNN) { if (m_bFileNameChanged) { // reset serial number counter to 1 lIndex = 1; lStatus = RegSetValueEx ( m_hKeyLogSettingsDefault, TEXT("Log File Serial Number"), 0L, REG_DWORD, (LPBYTE)&lIndex, sizeof(DWORD)); ASSERT (lStatus == ERROR_SUCCESS); } } else { // delete serial number entry lStatus = RegDeleteValue ( m_hKeyLogSettingsDefault, TEXT("Log File Serial Number")); // this may fail if the key is already // deleted. That's ok. } // save Log Rename Interval csFilename.Empty(); GetDlgItemText (IDC_RENAME_INTERVAL, csFilename); lIndex = _tcstol((LPCTSTR)csFilename, NULL, 10); lStatus = RegSetValueEx ( m_hKeyLogSettingsDefault, TEXT("Auto Name Interval"), 0L, REG_DWORD, (LPBYTE)&lIndex, sizeof(DWORD)); ASSERT (lStatus == ERROR_SUCCESS); // save Log Rename Units lStatus = RegSetValueEx ( m_hKeyLogSettingsDefault, TEXT("Auto Rename Units"), 0L, REG_DWORD, (LPBYTE)&dwAutoChangeInterval, sizeof(DWORD)); ASSERT (lStatus == ERROR_SUCCESS); if (m_ExecuteCmd != 0) { csFilename.Empty(); GetDlgItemText (IDC_CMD_FILENAME, csFilename); lStatus = RegSetValueEx ( m_hKeyLogSettingsDefault, TEXT("Command File"), 0L, REG_SZ, (LPBYTE)(LPCTSTR)csFilename, (csFilename.GetLength()+1)*sizeof(TCHAR)); ASSERT (lStatus == ERROR_SUCCESS); } else { // no command file to be executed RegDeleteValue (m_hKeyLogSettingsDefault, TEXT("Command File")); } // clear Manual entries // Log Filename RegDeleteValue (m_hKeyLogSettingsDefault, TEXT("Log Filename")); } CancelToClose(); } BOOL COutputPropPage::OnQueryCancel() { // TODO: Add your specialized code here and/or call the base class return CPropertyPage::OnQueryCancel(); } void COutputPropPage::OnChangeOutputFileEdit() { // TODO: Add your control notification handler code here SetModified(TRUE); } void COutputPropPage::OnChangeRenameInterval() { // TODO: Add your control notification handler code here SetModified(TRUE); } void COutputPropPage::OnUpdateBaseFilenameEdit() { // TODO: Add your control notification handler code here UpdateSampleFilename(); m_bFileNameChanged = TRUE; } void COutputPropPage::OnBrowseFolder() { OPENFILENAME ofn; CComboBox *cFileTypeCombo; CString csInitialDir; LONG lLogFileType; TCHAR szFileName[MAX_PATH]; CString csBaseFilename; LONG lFileNameLength; cFileTypeCombo = (CComboBox *)GetDlgItem(IDC_LOG_FILETYPE); lLogFileType = cFileTypeCombo->GetCurSel(); if (lLogFileType == CB_ERR) lLogFileType = OPD_NUM_FILE_TYPES; // should the default filename be the base or the synthesized one? GetDlgItemText (IDC_BASE_FILENAME_EDIT, szFileName, MAX_PATH); GetDlgItemText (IDC_LOG_DIRECTORY, csInitialDir); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = m_hWnd; ofn.hInstance = GetModuleHandle(NULL); ofn.lpstrFilter = TEXT("CSV Files (*.csv)\0*.csv\0TSV Files (*.tsv)\0*.tsv\0BLG Files (*.blg)\0*.blg\0All Files (*.*)\0*.*\0"); ofn.lpstrCustomFilter = NULL; ofn.nMaxCustFilter = 0; ofn.nFilterIndex = lLogFileType + 1; // nFilterIndex is 1 based ofn.lpstrFile = szFileName; ofn.nMaxFile = MAX_PATH; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = csInitialDir; ofn.lpstrTitle = TEXT("Select Log Folder and Base Filename"); ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY; ofn.nFileOffset = 0; ofn.nFileExtension = 0; ofn.lpstrDefExt = NULL; ofn.lCustData = 0; ofn.lpfnHook = NULL; ofn.lpTemplateName = NULL; if (GetOpenFileName (&ofn) == IDOK) { // Update the fields with the new information cFileTypeCombo->SetCurSel(ofn.nFilterIndex -1); lFileNameLength = lstrlen(szFileName); // truncate extension if ((ofn.nFileExtension < lFileNameLength) && (ofn.nFileExtension > 0)) { szFileName[ofn.nFileExtension-1] = 0; } if ((ofn.nFileOffset < lFileNameLength) && (ofn.nFileOffset >= 0)){ csBaseFilename = &szFileName[ofn.nFileOffset]; if (ofn.nFileOffset > 0) { szFileName[ofn.nFileOffset-1] = 0; } SetDlgItemText (IDC_BASE_FILENAME_EDIT, csBaseFilename); SetDlgItemText (IDC_LOG_DIRECTORY, szFileName); } UpdateSampleFilename(); } // else ignore if they canceled out } BOOL COutputPropPage::OnKillActive() { CString csFilename; int nMbReturn; DWORD dwAutoNameFormat; DWORD dwAutoChangeInterval; BOOL bManual; BOOL bBogus = FALSE; BOOL bPathHasFileName; BOOL bReturn = TRUE; // assume all is OK UpdateData(TRUE); bManual = IsDlgButtonChecked (IDC_MANUAL_NAME); if (!bManual) { dwAutoNameFormat = ((CComboBox *)GetDlgItem(IDC_AUTO_NAME_COMBO))->GetCurSel(); dwAutoChangeInterval = ((CComboBox *)GetDlgItem(IDC_RENAME_UNITS))->GetCurSel(); // check for valid interval/name combinations switch (dwAutoChangeInterval) { case OPD_RENAME_HOURS: if ((dwAutoNameFormat == OPD_NAME_YYDDD) || (dwAutoNameFormat == OPD_NAME_YYMM) || (dwAutoNameFormat == OPD_NAME_YYMMDD)) bBogus = TRUE; break; case OPD_RENAME_DAYS: if (dwAutoNameFormat == OPD_NAME_YYMM) bBogus = TRUE; break; case OPD_RENAME_MONTHS: break; case OPD_RENAME_KBYTES: case OPD_RENAME_MBYTES: default: if (dwAutoNameFormat != OPD_NAME_NNNNNN) bBogus = TRUE; break; } } if (bBogus) { // display warning if (AfxMessageBox (IDS_NAME_FORMAT_NOT_COMPATIBLE, MB_OKCANCEL, 0) == IDCANCEL) { // the user has selected to change it so this is not valid bReturn = FALSE; } } // is manual filename button pushed? if (bManual) { // YES: csFilename.Empty(); // write output filename frome edit box csFilename = m_OutputFileName; bPathHasFileName = TRUE; } else { // auto is pressed so: csFilename.Empty(); // save Log Default Directory csFilename = m_szLogDirectory; bPathHasFileName = FALSE; } // check to see if the dir path is valid if (!IsDirPathValid (csFilename, !bPathHasFileName, FALSE)) { nMbReturn = AfxMessageBox (IDS_DIR_NOT_FOUND, MB_YESNOCANCEL, 0); if (nMbReturn == IDYES) { // create the dir(s) if (!IsDirPathValid (csFilename, !bPathHasFileName, TRUE)) { // unable to create the dir, display message nMbReturn = AfxMessageBox (IDS_DIR_NOT_MADE, MB_OK, 0); bReturn = FALSE; } } else if (nMbReturn == IDCANCEL) { // then abort and return to the dialog bReturn = FALSE; } } // else the path is OK return bReturn; } void COutputPropPage::OnExecuteCheck() { BOOL bExecuteCmd; m_ExecuteCmd = IsDlgButtonChecked (IDC_EXECUTE_CHECK); bExecuteCmd = (m_ExecuteCmd != 0 ? TRUE : FALSE); GetDlgItem(IDC_CMD_FILENAME)->EnableWindow(bExecuteCmd); GetDlgItem(IDC_BROWSE_CMD_FILE)->EnableWindow(bExecuteCmd); SetModified(TRUE); } void COutputPropPage::OnBrowseCmdFile() { OPENFILENAME ofn; CComboBox *cFileTypeCombo; CString csInitialDir; LONG lLogFileType; TCHAR szFileName[MAX_PATH]; CString csBaseFilename; TCHAR szDrive[MAX_PATH]; TCHAR szDir[MAX_PATH]; TCHAR szExt[MAX_PATH]; LPTSTR szDefExt = NULL; GetDlgItemText (IDC_CMD_FILENAME, csBaseFilename); _tsplitpath((LPCTSTR)csBaseFilename, szDrive, szDir, szFileName, szExt); csInitialDir = szDrive; csInitialDir += szDir; lstrcat (szFileName, szExt); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = m_hWnd; ofn.hInstance = GetModuleHandle(NULL); ofn.lpstrFilter = TEXT("Command Files (*.bat, *.cmd)\0*.cmd;*.bat\0Executable Files (*.exe)\0*.exe\0All Files (*.*)\0*.*\0"); ofn.lpstrCustomFilter = NULL; ofn.nMaxCustFilter = 0; ofn.nFilterIndex = 1; // nFilterIndex is 1-based ofn.lpstrFile = szFileName; ofn.nMaxFile = MAX_PATH; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = (LPCTSTR)csInitialDir; ofn.lpstrTitle = TEXT("Select Command Filename"); ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY; ofn.nFileOffset = 0; ofn.nFileExtension = 0; ofn.lpstrDefExt = NULL; ofn.lCustData = 0; ofn.lpfnHook = NULL; ofn.lpTemplateName = NULL; if (GetOpenFileName (&ofn) == IDOK) { SetDlgItemText (IDC_CMD_FILENAME, szFileName); SetModified(TRUE); } // else ignore if they canceled out } void COutputPropPage::OnChangeCmdFilename() { SetModified(TRUE); }