You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
213 lines
6.9 KiB
213 lines
6.9 KiB
|
|
//***********************************************************************
|
|
// export.cpp
|
|
//
|
|
// This file contains the implementation of the CDlgExport class. This class
|
|
// puts up the "Export Events" dialog and handles writing the events out
|
|
// to an export file in the user-selected format.
|
|
//
|
|
// Author: Larry A. French
|
|
//
|
|
// History:
|
|
// 1-Mar-1996 Larry A. French
|
|
// Wrote it.
|
|
//
|
|
// 14-May-1996 Larry A. French
|
|
// Fixed a problem where the defines for the file extension included
|
|
// a "." prefix instead of just the base extension. This caused various
|
|
// problems such as generting file names such as "foo..cnf" when the
|
|
// user just entered "foo".
|
|
//
|
|
// Copyright (C) 1995, 1996 Microsoft Corporation. All rights reserved.
|
|
//
|
|
//************************************************************************
|
|
|
|
|
|
#include "stdafx.h"
|
|
#include "busy.h"
|
|
#include "export.h"
|
|
#include "globals.h"
|
|
#include "trapreg.h"
|
|
//#include "smsnames.h"
|
|
|
|
//**************************************************************************
|
|
// CDlgExport::CDlgExport
|
|
//
|
|
// Constructor for the CDlgExport class.
|
|
//
|
|
//**************************************************************************
|
|
CDlgExport::CDlgExport() : CFileDialog(FALSE)
|
|
{
|
|
// We need to strip off the "." prefix for the filename extensions
|
|
// so that it is easier to use them. Ideally we would just change
|
|
// the defines for these extension strings, but since their definitions
|
|
// are in a global file, we will just fix the problem here.
|
|
m_ofn.Flags |= OFN_PATHMUSTEXIST;
|
|
m_sFileTitle.LoadString(IDS_EXPORT_DEFAULT_FILENAME);
|
|
}
|
|
|
|
//**************************************************************
|
|
// CDlgExport::GetFilters
|
|
//
|
|
// Get the filter strings that will be used in CFileDialog.
|
|
// These are the filter strings that appear in the drop-down
|
|
// file-type combo. Each filter is described by a pair of
|
|
// adjacent strings. The first string of each pair specifies the
|
|
// "type" string that the user sees. The second string of each
|
|
// pair specifies the file extension associated with the file type.
|
|
//
|
|
// For more information, please see the CFileDialog documentation.
|
|
//
|
|
// Parameters:
|
|
// LPTSTR pszDst
|
|
// Pointer to the destination buffer. The size of this
|
|
// buffer should be MAX_STRING, so there will be plenty
|
|
// of room for the filter strings since they are relatively
|
|
// short. Note that no bounds checking is done on the
|
|
// buffer size.
|
|
//
|
|
// Returns:
|
|
// The filter strings are returned in the buffer pointed to
|
|
// by pszDst.
|
|
//
|
|
//****************************************************************
|
|
void CDlgExport::GetFilters(LPTSTR pszDst)
|
|
{
|
|
CString sText;
|
|
|
|
// Set the type1 filter
|
|
sText.LoadString(IDS_EXPORT_CNF_FILTER);
|
|
_tcscpy(pszDst, (LPCTSTR) sText);
|
|
pszDst += sText.GetLength() + 1;
|
|
|
|
// Set the type1 extension
|
|
_tcscpy(pszDst, FILE_DEF_EXT);
|
|
pszDst += _tcslen(FILE_DEF_EXT) + 1;
|
|
|
|
*pszDst = 0;
|
|
}
|
|
|
|
//*************************************************************************
|
|
// CDlgExport::ExportEvents
|
|
//
|
|
// Write the events to the specified file in the specified file format.
|
|
//
|
|
// Parameters:
|
|
// CXEventArray& aEvents
|
|
// The array of events to be written to the file.
|
|
//
|
|
// CString& sPath
|
|
// The output file's pathname.
|
|
//
|
|
// LONG iFileType
|
|
// The output file's format type. This may be EXPORT_TYPE1 or
|
|
// EXPORT_TYPE2.
|
|
//
|
|
// Returns:
|
|
// SCODE
|
|
// S_OK if everything was successfule, otherwise E_FAIL.
|
|
//
|
|
//***************************************************************************
|
|
SCODE CDlgExport::ExportEvents(CXEventArray& aEvents, CString& sPath, LONG iFileType)
|
|
{
|
|
CBusy busy;
|
|
FILE* pfile;
|
|
|
|
// Create the export file
|
|
while (TRUE) {
|
|
pfile = _tfopen(sPath, _T("w"));
|
|
if (pfile != NULL) {
|
|
break;
|
|
}
|
|
|
|
CString sText;
|
|
sText.LoadString(IDS_ERR_CANT_CREATE_FILE);
|
|
sText = sText + sPath;
|
|
if (AfxMessageBox(sText, MB_RETRYCANCEL) == IDRETRY) {
|
|
continue;
|
|
}
|
|
return E_FAIL;
|
|
}
|
|
|
|
// Write the events to the file in the requested format.
|
|
LONG nEvents = aEvents.GetSize();
|
|
for (LONG iEvent = 0; iEvent < nEvents; ++iEvent)
|
|
{
|
|
CXEvent* pEvent = aEvents[iEvent];
|
|
CXEventSource* pEventSource = pEvent->m_pEventSource;
|
|
CXEventLog* pEventLog = pEventSource->m_pEventLog;
|
|
|
|
_ftprintf(pfile, _T("#pragma add %s \"%s\" %lu %lu %lu\n"),
|
|
(LPCTSTR) pEventLog->m_sName,
|
|
(LPCTSTR) pEventSource->m_sName,
|
|
pEvent->m_message.m_dwId,
|
|
pEvent->m_dwCount,
|
|
pEvent->m_dwTimeInterval
|
|
);
|
|
}
|
|
|
|
fclose(pfile);
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//*************************************************************************************
|
|
// CDlgExport::DoModal
|
|
//
|
|
// This is the only public method for CDlgExport. It displays the "Export Events" dialog
|
|
// and does everthing necessary to write out the event file in the proper format.
|
|
//
|
|
// Parameters:
|
|
// CXEventArray& aEvents
|
|
// The events that the user wants to export.
|
|
//
|
|
// Returns:
|
|
// int
|
|
// IDOK if the user exported the events and everything went OK.
|
|
// IDCANCEL if the user canceled the export or an error occurred writing
|
|
// the export file.
|
|
//
|
|
//**************************************************************************************
|
|
INT_PTR CDlgExport::DoModal(CXEventArray& aEvents)
|
|
{
|
|
ASSERT(aEvents.GetSize() > 0);
|
|
|
|
// Put up a custom CFileDialog with a title of "Export Events"
|
|
CString sTitle;
|
|
sTitle.LoadString(IDS_EXPORT_DIALOG_TITLE);
|
|
m_ofn.lpstrTitle = sTitle;
|
|
|
|
// The value to initialize the filename edit item to. A temporary
|
|
// string is used because we only want to save the file title and
|
|
// not its full path.
|
|
CString sFile = m_sFileTitle;
|
|
m_ofn.lpstrFile = sFile.GetBuffer(MAX_STRING);
|
|
m_ofn.nMaxFile = MAX_STRING - 1;
|
|
|
|
// Set the file title, so that when the user clicks OK, its
|
|
// value will be set.
|
|
m_ofn.lpstrFileTitle = m_sFileTitle.GetBuffer(MAX_STRING);
|
|
m_ofn.nMaxFileTitle = MAX_STRING - 1;
|
|
|
|
// Set the filters for the different file types.
|
|
TCHAR szFilters[MAX_STRING];
|
|
GetFilters(szFilters);
|
|
m_ofn.lpstrFilter = (LPCTSTR) (void*) szFilters;
|
|
|
|
// Put up the dialog.
|
|
INT_PTR iStat = CFileDialog::DoModal();
|
|
m_sFileTitle.ReleaseBuffer();
|
|
sFile.ReleaseBuffer();
|
|
|
|
sFile = GetPathName();
|
|
|
|
// If the user selected "OK", write out the event file in the selected format.
|
|
if (iStat == IDOK)
|
|
{
|
|
SCODE sc = ExportEvents(aEvents, sFile, m_ofn.nFilterIndex);
|
|
if (FAILED(sc)) {
|
|
iStat = IDCANCEL;
|
|
}
|
|
}
|
|
return iStat;
|
|
}
|