FILEOPEN.C
#include "perfmon.h" 
#include "cderr.h" 
 
#include "alert.h"      // for OpenAlert 
#include "fileutil.h"   // for FileOpen, FileRead 
#include "grafdata.h"   // for OpenChart 
#include "log.h"        // for OpenLog 
#include "report.h"     // for OpenReport 
#include "utils.h"      // for strempty 
#include "perfmops.h"   // for OpenWorkspace 
#include "pmhelpid.h"   // Help IDs 
#include <dlgs.h>       // for pshHelp 
 
#define OptionsOFNStyle \ 
   (OFN_HIDEREADONLY | OFN_SHOWHELP | OFN_OVERWRITEPROMPT | OFN_ENABLEHOOK) 
 
#define ExportOptionsOFNStyle                   \ 
   (OFN_ENABLETEMPLATE | OFN_HIDEREADONLY |     \ 
    OFN_SHOWHELP | OFN_ENABLEHOOK | OFN_OVERWRITEPROMPT) 
 
extern BOOL APIENTRY ExportOptionsHookProc (HWND hDlg, UINT iMessage,  
                                            WPARAM wParam, LPARAM lParam) ; 
 
BOOL APIENTRY FileOpenHookProc (HWND hDlg,  
                                UINT iMessage,  
                                WPARAM wParam,  
                                LPARAM lParam) 
{ 
   BOOL     bHandled = FALSE ; 
    
   // only intercept the Help button and bring up our WinHelp data 
   if (iMessage == WM_COMMAND && wParam == pshHelp) 
      { 
      CallWinHelp (dwCurrentDlgID) ; 
      bHandled = TRUE ; 
      } 
   else if (iMessage == WM_INITDIALOG) 
      { 
      WindowCenter (hDlg) ; 
      bHandled = TRUE ; 
      } 
 
   return (bHandled) ; 
} 
 
 
 
BOOL FileOpen (HWND hWndParent, int nStringResourceID, LPTSTR lpInputFileName) 
   { 
   OPENFILENAME   ofn ; 
   TCHAR          szFileSpec [FilePathLen] ; 
   TCHAR          szFileTitle [FilePathLen] ; 
   TCHAR          szDialogTitle [FilePathLen] ; 
   HANDLE         hFile ; 
   PERFFILEHEADER FileHeader ; 
    
   TCHAR          aszOpenFilter[LongTextLen] ; 
   int            StringLength ; 
   BOOL           retCode ; 
   LPTSTR         pFileName = NULL ; 
 
   if (strempty(lpInputFileName)) 
      { 
 
      dwCurrentDlgID = HC_PM_idDlgFileOpen ; 
 
      // get the file extension strings 
      LoadString (hInstance, nStringResourceID, aszOpenFilter, 
         sizeof(aszOpenFilter) / sizeof(TCHAR)) ; 
      StringLength = lstrlen (aszOpenFilter) + 1 ; 
      LoadString (hInstance, nStringResourceID+1, 
         &aszOpenFilter[StringLength], 
         sizeof(aszOpenFilter) / sizeof(TCHAR) - StringLength) ; 
      StringLength += lstrlen (&aszOpenFilter[StringLength]) + 1 ; 
 
#ifdef ADVANCED_PERFMON 
      // get workspace file extension strings 
      LoadString (hInstance, IDS_WORKSPACEFILE,  
         &aszOpenFilter[StringLength], 
         sizeof(aszOpenFilter) / sizeof(TCHAR) - StringLength) ; 
      StringLength += lstrlen (&aszOpenFilter[StringLength]) + 1 ; 
      LoadString (hInstance, IDS_WORKSPACEFILEEXT, 
         &aszOpenFilter[StringLength], 
         sizeof(aszOpenFilter) / sizeof(TCHAR) - StringLength) ; 
      StringLength += lstrlen (&aszOpenFilter[StringLength]) + 1; 
#endif 
 
      // get all file extension strings 
      LoadString (hInstance, IDS_ALLFILES,  
         &aszOpenFilter[StringLength], 
         sizeof(aszOpenFilter) / sizeof(TCHAR) - StringLength) ; 
      StringLength += lstrlen (&aszOpenFilter[StringLength]) + 1 ; 
      LoadString (hInstance, IDS_ALLFILESEXT, 
         &aszOpenFilter[StringLength], 
         sizeof(aszOpenFilter) / sizeof(TCHAR) - StringLength) ; 
      StringLength += lstrlen (&aszOpenFilter[StringLength]) ; 
 
      // setup the end strings 
      aszOpenFilter[StringLength+1] = aszOpenFilter[StringLength+2] = TEXT('\0') ; 
 
      strclr (szFileSpec) ; 
      strclr (szFileTitle) ; 
 
      StringLoad (IDS_FILEOPEN_TITLE, szDialogTitle) ; 
      memset (&ofn, 0, sizeof(OPENFILENAME)) ; 
      ofn.lStructSize = sizeof(OPENFILENAME) ; 
      ofn.hwndOwner = hWndParent ; 
      ofn.hInstance = hInstance; 
      ofn.lpstrTitle = szDialogTitle ; 
      ofn.lpstrFilter = aszOpenFilter ; 
      ofn.nFilterIndex = 1L ; 
 
      ofn.lpstrFile = szFileSpec; 
      ofn.nMaxFile = sizeof(szFileSpec); 
      ofn.lpstrFileTitle = szFileTitle; 
      ofn.nMaxFileTitle = sizeof(szFileTitle); 
      ofn.Flags = OFN_HIDEREADONLY | OFN_SHOWHELP | OFN_FILEMUSTEXIST | OFN_ENABLEHOOK ; 
      ofn.lpfnHook = (LPOFNHOOKPROC) FileOpenHookProc ; 
 
      if (!GetOpenFileName(&ofn)) 
         { 
         dwCurrentDlgID = 0 ; 
         return (FALSE) ; 
         } 
 
      dwCurrentDlgID = 0 ; 
 
      hFile = FileHandleOpen (szFileSpec) ; 
      pFileName = szFileSpec ; 
 
      }  // NULL lpFileName 
 
   else 
      { 
      // open the input file 
      hFile = FileHandleOpen (lpInputFileName) ; 
      if (hFile && hFile != INVALID_HANDLE_VALUE && 
          SearchPath (NULL, lpInputFileName, NULL, 
            sizeof(szFileSpec)/sizeof(TCHAR) - 1, 
            szFileSpec, &pFileName)) 
         { 
         pFileName = szFileSpec ; 
         } 
      else 
         { 
         pFileName = NULL ; 
         } 
      } 
 
   if (!hFile || hFile == INVALID_HANDLE_VALUE) 
      { 
      return (FALSE) ; 
      } 
 
   if (!FileRead (hFile, &FileHeader, sizeof (FileHeader))) 
      { 
      CloseHandle (hFile) ; 
      if (strempty(lpInputFileName)) 
         { 
         DlgErrorBox (hWndParent, ERR_BAD_SETTING_FILE, pFileName) ; 
         } 
      return (FALSE) ; 
      } 
 
 
   //=============================// 
   // Chart File?                 // 
   //=============================// 
 
   if (strsame (FileHeader.szSignature, szPerfChartSignature)) 
      { 
      retCode = OpenChart (hWndGraph, 
                           hFile, 
                           FileHeader.dwMajorVersion, 
                           FileHeader.dwMinorVersion, 
                           TRUE) ; 
      if (retCode) 
         { 
         ChangeSaveFileName (pFileName, IDM_VIEWCHART) ; 
         } 
      else 
         { 
         goto ErrExit ; 
         } 
      return (retCode) ; 
      } 
 
#ifdef ADVANCED_PERFMON 
   //=============================// 
   // Alert File?                 // 
   //=============================// 
 
   if (strsame (FileHeader.szSignature, szPerfAlertSignature)) 
      { 
      retCode = OpenAlert (hWndAlert, 
                           hFile, 
                           FileHeader.dwMajorVersion, 
                           FileHeader.dwMinorVersion, 
                           TRUE) ; 
      if (retCode) 
         { 
         ChangeSaveFileName (pFileName, IDM_VIEWALERT) ; 
         } 
      else 
         { 
         goto ErrExit ; 
         } 
 
      return (retCode) ; 
      } 
 
 
   //=============================// 
   // Log File?                   // 
   //=============================// 
 
   if (strsame (FileHeader.szSignature, szPerfLogSignature)) 
      { 
      retCode = OpenLog (hWndLog, 
                         hFile, 
                         FileHeader.dwMajorVersion, 
                         FileHeader.dwMinorVersion, 
                         TRUE) ; 
      if (retCode) 
         { 
         ChangeSaveFileName (pFileName, IDM_VIEWLOG) ; 
         } 
      else 
         { 
         goto ErrExit ; 
         } 
 
      return (retCode) ; 
      } 
 
   //=============================// 
   // Report File?                // 
   //=============================// 
 
   if (strsame (FileHeader.szSignature, szPerfReportSignature)) 
      { 
      retCode = OpenReport (hWndReport, 
                            hFile, 
                            FileHeader.dwMajorVersion, 
                            FileHeader.dwMinorVersion, 
                            TRUE) ; 
      if (retCode) 
         { 
         ChangeSaveFileName (pFileName, IDM_VIEWREPORT) ; 
         } 
      else 
         { 
         goto ErrExit ; 
         } 
 
      return (retCode) ; 
      } 
 
   //=============================// 
   // Workspace File?             // 
   //=============================// 
 
   if (strsame (FileHeader.szSignature, szPerfWorkspaceSignature)) 
      { 
      retCode = OpenWorkspace (hFile, 
                               FileHeader.dwMajorVersion, 
                               FileHeader.dwMinorVersion) ; 
      if (retCode) 
         { 
         ChangeSaveFileName (pFileName, IDM_WORKSPACE) ; 
         return (TRUE) ; 
         } 
      else 
         { 
         goto ErrExit ; 
         } 
      } 
#endif 
 
   //=============================// 
   // Unknown file type           // 
   //=============================// 
   CloseHandle (hFile) ; 
 
ErrExit: 
 
   DlgErrorBox (hWndParent, ERR_BAD_SETTING_FILE, pFileName) ; 
   return (FALSE) ; 
   }  // FileOpen 
 
 
BOOL FileGetName (HWND hWndParent, int nStringResourceID, LPTSTR lpFileName) 
   { 
   OPENFILENAME   ofn ; 
   TCHAR          szFileSpec [FilePathLen] ; 
   TCHAR          szFileTitle [FilePathLen] ; 
   TCHAR          szDialogTitle [FilePathLen] ; 
   TCHAR          aszOpenFilter[LongTextLen] ; 
   int            StringLength ; 
 
   if (lpFileName) 
      { 
 
      if (nStringResourceID != IDS_EXPORTFILE) 
         { 
         // get the file extension strings 
         LoadString (hInstance, nStringResourceID, 
            aszOpenFilter, 
            sizeof(aszOpenFilter) / sizeof(TCHAR) ) ; 
         StringLength = lstrlen (aszOpenFilter) + 1 ; 
         LoadString (hInstance, nStringResourceID+1, 
            &aszOpenFilter[StringLength], 
            sizeof(aszOpenFilter) / sizeof(TCHAR) - StringLength) ; 
 
         StringLength += lstrlen (&aszOpenFilter[StringLength]) + 1 ; 
         // get all file extension strings 
         LoadString (hInstance, IDS_ALLFILES,  
            &aszOpenFilter[StringLength], 
            sizeof(aszOpenFilter) / sizeof(TCHAR) - StringLength) ; 
         StringLength += lstrlen (&aszOpenFilter[StringLength]) + 1 ; 
         LoadString (hInstance, IDS_ALLFILESEXT, 
            &aszOpenFilter[StringLength], 
            sizeof(aszOpenFilter) / sizeof(TCHAR) - StringLength) ; 
         } 
      else 
         { 
         // get the Export file extension based on the current delimiter 
         int   FirstExtensionID, SecondExtensionID ; 
 
         if (pDelimiter == TabStr) 
            { 
            FirstExtensionID = IDS_EXPORTFILETSV ; 
            SecondExtensionID = IDS_EXPORTFILE ; 
            } 
         else 
            { 
            FirstExtensionID = IDS_EXPORTFILE ; 
            SecondExtensionID = IDS_EXPORTFILETSV ; 
            } 
 
         LoadString (hInstance, FirstExtensionID, 
            aszOpenFilter, 
            sizeof(aszOpenFilter) / sizeof(TCHAR) ) ; 
         StringLength = lstrlen (aszOpenFilter) + 1 ; 
         LoadString (hInstance, FirstExtensionID+1, 
            &aszOpenFilter[StringLength], 
            sizeof(aszOpenFilter) / sizeof(TCHAR) - StringLength) ; 
 
         StringLength += lstrlen (&aszOpenFilter[StringLength]) + 1 ; 
         // get all file extension strings 
         LoadString (hInstance, SecondExtensionID,  
            &aszOpenFilter[StringLength], 
            sizeof(aszOpenFilter) / sizeof(TCHAR) - StringLength) ; 
         StringLength += lstrlen (&aszOpenFilter[StringLength]) + 1 ; 
         LoadString (hInstance, SecondExtensionID+1, 
            &aszOpenFilter[StringLength], 
            sizeof(aszOpenFilter) / sizeof(TCHAR) - StringLength) ; 
 
         } 
 
      // setup the end strings 
      StringLength += lstrlen (&aszOpenFilter[StringLength]) ; 
      aszOpenFilter[StringLength+1] = aszOpenFilter[StringLength+2] = TEXT('\0') ; 
 
      strclr (szFileSpec) ; 
      strclr (szFileTitle) ; 
 
      if (nStringResourceID == IDS_EXPORTFILE) 
         { 
         dwCurrentDlgID = HC_PM_idDlgFileExport ; 
         StringLoad (IDS_EXPORTAS_TITLE, szDialogTitle) ; 
         } 
      else if (nStringResourceID == IDS_WORKSPACEFILE) 
         { 
         dwCurrentDlgID = HC_PM_idDlgFileSaveWorkSpace ; 
         StringLoad (IDS_SAVEASW_TITLE, szDialogTitle) ; 
         } 
      else 
         { 
         dwCurrentDlgID = HC_PM_idDlgFileSaveAs ; 
         StringLoad (IDS_SAVEAS_TITLE, szDialogTitle) ; 
         } 
 
      memset (&ofn, 0, sizeof(OPENFILENAME)) ; 
      ofn.lStructSize = sizeof(OPENFILENAME) ; 
      ofn.hwndOwner = hWndParent ; 
      ofn.hInstance = hInstance; 
      ofn.lpstrTitle = szDialogTitle ; 
      ofn.lpstrFilter = aszOpenFilter ; 
      ofn.nFilterIndex = 1L ; 
 
      ofn.lpstrFile = szFileSpec; 
      ofn.nMaxFile = sizeof(szFileSpec); 
      ofn.lpstrFileTitle = szFileTitle; 
      ofn.nMaxFileTitle = sizeof(szFileTitle); 
 
      if (nStringResourceID == IDS_EXPORTFILE) 
         { 
         ofn.Flags = ExportOptionsOFNStyle ; 
         ofn.lpfnHook = (LPOFNHOOKPROC) ExportOptionsHookProc ; 
         ofn.lpTemplateName = idDlgExportOptions ; 
         } 
      else 
         { 
         ofn.Flags = OptionsOFNStyle ; 
         ofn.lpfnHook = (LPOFNHOOKPROC) FileOpenHookProc ; 
         } 
 
      if (!GetSaveFileName(&ofn)) 
         { 
         dwCurrentDlgID = 0 ; 
         return (FALSE) ; 
         } 
      dwCurrentDlgID = 0 ; 
      } 
   else 
      { 
      return (FALSE) ; 
      } 
 
   lstrcpy (lpFileName, ofn.lpstrFile) ; 
 
   return (TRUE) ; 
   } // FileGetName