reman3/Rayman_X/cpa/tempgrp/ERO/Src/ErOReprt.cpp

571 lines
19 KiB
C++

// ErOReprt.cpp : implementation file
/////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "ErOReprt.hpp"
#include "ErO_Op.hpp"
#include "ErOTeam.hpp"
#include <mapi.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern HMODULE g_hModule;
extern CString g_csModuleName;
HINSTANCE h_MAPI_DLL = NULL;
/////////////////////////////////////////////////////////////////////////////
// ErrorOperator_DialogReport dialog
BEGIN_MESSAGE_MAP(ErrorOperator_DialogReport, CDialog)
//{{AFX_MSG_MAP(ErrorOperator_DialogReport)
ON_BN_CLICKED(IDC_BUTTON_FILE_BROWSE, OnButtonFileBrowse)
ON_BN_CLICKED(IDC_RADIO_REPORT_CLIPBOARD, OnRadioReportClipboard)
ON_BN_CLICKED(IDC_RADIO_REPORT_FILE, OnRadioReportFile)
ON_BN_CLICKED(IDC_RADIO_REPORT_PRINTER, OnRadioReportPrinter)
ON_BN_CLICKED(IDC_RADIO_REPORT_MAIL, OnRadioReportMail)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//***************************************************************************
ErrorOperator_DialogReport::ErrorOperator_DialogReport(CWnd* pParent /*=NULL*/)
: CDialog(IDD_DIALOG_REPORT, pParent)
{
//{{AFX_DATA_INIT(ErrorOperator_DialogReport)
m_iChosenReportType = 3;
m_csFileName = _T("");
m_bSendToMainProgrammer = TRUE;
m_bSendToSecondProgrammer = FALSE;
m_bSendToResponsible = FALSE;
m_bDeleteReport = FALSE;
m_csAddedComments = _T("");
//}}AFX_DATA_INIT
//Initializing file name
char a_cBuffer[MAX_PATH];
GetModuleFileName(g_hModule, a_cBuffer, MAX_PATH);
m_csFileName = a_cBuffer;
short wIndex = m_csFileName.ReverseFind('\\');
if ( wIndex != -1 )
m_csFileName = m_csFileName.Left(wIndex + 1);
if ( g_csModuleName.IsEmpty() )
m_csFileName += "Error_Report.txt";
else
{
//Computes date
SYSTEMTIME stSystemTime;
::GetLocalTime(&stSystemTime);
CTime cTime(stSystemTime);
CString csDate = cTime.Format("_%b_%d");
CString csFileName = CString("Rprt_") + g_csModuleName + csDate + ".txt";
m_csFileName += csFileName;
}
}
//***************************************************************************
void ErrorOperator_DialogReport::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(ErrorOperator_DialogReport)
DDX_Radio(pDX, IDC_RADIO_REPORT_FILE, m_iChosenReportType);
DDX_Text(pDX, IDC_EDIT_FILE_NAME, m_csFileName);
DDX_Check(pDX, IDC_CHECK_MAIN_PROGRAMMER, m_bSendToMainProgrammer);
DDX_Check(pDX, IDC_CHECK_SECOND_PROGRAMMER, m_bSendToSecondProgrammer);
DDX_Check(pDX, IDC_CHECK_RESPONSIBLE, m_bSendToResponsible);
DDX_Check(pDX, IDC_CHECK_DELETE_FILE, m_bDeleteReport);
DDX_Text(pDX, IDC_EDIT_USER_ADDS, m_csAddedComments);
//}}AFX_DATA_MAP
}
/////////////////////////////////////////////////////////////////////////////
// ErrorOperator_DialogReport message handlers
//***************************************************************************
BOOL ErrorOperator_DialogReport::OnInitDialog()
{
CDialog::OnInitDialog();
OnRadioReportMail();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
//***************************************************************************
void ErrorOperator_DialogReport::OnOK()
{
UpdateData(TRUE);
switch ( m_iChosenReportType )
{
case 0:
m_pri_fn_vSaveFile();
break;
case 1:
m_pri_fn_vPrint();
break;
case 2:
m_pri_fn_vCopyToClipboard();
break;
case 3:
m_pri_fn_vSendByMail();
break;
}
CDialog::OnOK();
}
// Private Functions
////////////////////////
//***************************************************************************
void ErrorOperator_DialogReport::m_pri_fn_vSaveFile()
{
CStdioFile clFile;
const CString csSpacing = " ";
const CString g_c_csUnknownn = "< Unknown >";
const CString g_c_csNone = "< None >";
if ( clFile.Open(m_csFileName, CFile::modeReadWrite | CFile::modeCreate | CFile::modeNoTruncate | CFile::typeText) )
{
clFile.WriteString("##################################\n");
clFile.WriteString("# Error Operator making a report #\n");
clFile.WriteString("##################################\n");
clFile.WriteString("\n");
//Computes date
SYSTEMTIME stSystemTime;
::GetLocalTime(&stSystemTime);
CTime cTime(stSystemTime);
CString csDate = cTime.Format("Date : %A, %B %d, %Y, %Hh%Mm \n");
clFile.WriteString(csDate);
clFile.WriteString("\n");
clFile.WriteString("Error has been detected in Module :\n");
CString csCurrentLine = csSpacing + (g_csModuleName.IsEmpty() ? g_c_csUnknownn : g_csModuleName) + "\n";
clFile.WriteString(csCurrentLine);
clFile.WriteString("Error level was :\n");
switch ( g_eErrorGravity )
{
case E_ERROR_GRAVITY_WARNING:
csCurrentLine = csSpacing + "Warning\n";
break;
case E_ERROR_GRAVITY_INSTABLE:
csCurrentLine = csSpacing + "Instable\n";
break;
case E_ERROR_GRAVITY_FATAL:
csCurrentLine = csSpacing + "Fatal\n";
break;
default:
csCurrentLine = csSpacing + g_c_csUnknownn + "\n";
break;
}
clFile.WriteString(csCurrentLine);
clFile.WriteString("\n");
clFile.WriteString("Current action was :\n");
csCurrentLine = csSpacing + (g_csCurrentAction.IsEmpty() ? g_c_csUnknownn : g_csCurrentAction) + "\n";
clFile.WriteString(csCurrentLine);
clFile.WriteString("\n");
clFile.WriteString("Calling function was :\n");
csCurrentLine = csSpacing + (g_csCurrentFunction.IsEmpty() ? g_c_csUnknownn : g_csCurrentFunction) + "\n";
clFile.WriteString(csCurrentLine);
clFile.WriteString("In source :\n");
csCurrentLine = csSpacing + (g_csCurrentFileName.IsEmpty() ? g_c_csUnknownn : g_csCurrentFileName) + "\n";
clFile.WriteString(csCurrentLine);
clFile.WriteString("At line :\n");
csCurrentLine.Format("%i", g_wCurrentFileLine);
csCurrentLine = csSpacing + (g_wCurrentFileLine < 0 ? g_c_csUnknownn : csCurrentLine) + "\n";
clFile.WriteString(csCurrentLine);
clFile.WriteString("\n");
clFile.WriteString("Additionnal informations were :\n");
csCurrentLine = csSpacing + (g_csAddedInfo.IsEmpty() ? g_c_csNone : g_csAddedInfo) + "\n";
clFile.WriteString(csCurrentLine);
clFile.WriteString("\n");
clFile.WriteString("Script in progress :\n");
csCurrentLine = csSpacing + (g_csCurrentScriptFileName.IsEmpty() ? g_c_csNone : g_csCurrentScriptFileName) + "\n";
clFile.WriteString(csCurrentLine);
clFile.WriteString("At line :\n");
csCurrentLine.Format("%i", g_wCurrentScriptLine);
csCurrentLine = csSpacing + (g_wCurrentScriptLine <= 0 ? g_c_csUnknownn : csCurrentLine) + "\n";
clFile.WriteString(csCurrentLine);
clFile.WriteString("\n");
clFile.WriteString("----------------------------------------------------------------------\n");
clFile.WriteString("\n");
clFile.Close();
}
else
MessageBox("Error Operator cannot open the file to write its report !", "Error Operator - Error", MB_OK|MB_ICONSTOP);
}
//***************************************************************************
void ErrorOperator_DialogReport::m_pri_fn_vPrint()
{
}
//***************************************************************************
void ErrorOperator_DialogReport::m_pri_fn_vCopyToClipboard()
{
const CString csSpacing = " ";
const CString g_c_csUnknownn = "< Unknown >";
const CString g_c_csNone = "< None >";
CString csGlobalText;
csGlobalText += "##################################\n";
csGlobalText += "# Error Operator making a report #\n";
csGlobalText += "##################################\n";
csGlobalText += "\n";
//Computes date
SYSTEMTIME stSystemTime;
::GetLocalTime(&stSystemTime);
CTime cTime(stSystemTime);
CString csDate = cTime.Format("Date : %A, %B %d, %Y, %Hh%Mm \n");
csGlobalText += csDate;
csGlobalText += "\n";
csGlobalText += "Error has been detected in Module :\n";
CString csCurrentLine = csSpacing + (g_csModuleName.IsEmpty() ? g_c_csUnknownn : g_csModuleName) + "\n";
csGlobalText += csCurrentLine;
csGlobalText += "Error level was :\n";
switch ( g_eErrorGravity )
{
case E_ERROR_GRAVITY_WARNING:
csCurrentLine = csSpacing + "Warning\n";
break;
case E_ERROR_GRAVITY_INSTABLE:
csCurrentLine = csSpacing + "Instable\n";
break;
case E_ERROR_GRAVITY_FATAL:
csCurrentLine = csSpacing + "Fatal\n";
break;
default:
csCurrentLine = csSpacing + g_c_csUnknownn + "\n";
break;
}
csGlobalText += csCurrentLine;
csGlobalText += "\n";
csGlobalText += "Current action was :\n";
csCurrentLine = csSpacing + (g_csCurrentAction.IsEmpty() ? g_c_csUnknownn : g_csCurrentAction) + "\n";
csGlobalText += csCurrentLine;
csGlobalText += "\n";
csGlobalText += "Calling function was :\n";
csCurrentLine = csSpacing + (g_csCurrentFunction.IsEmpty() ? g_c_csUnknownn : g_csCurrentFunction) + "\n";
csGlobalText += csCurrentLine;
csGlobalText += "In source :\n";
csCurrentLine = csSpacing + (g_csCurrentFileName.IsEmpty() ? g_c_csUnknownn : g_csCurrentFileName) + "\n";
csGlobalText += csCurrentLine;
csGlobalText += "At line :\n";
csCurrentLine.Format("%i", g_wCurrentFileLine);
csCurrentLine = csSpacing + (g_wCurrentFileLine < 0 ? g_c_csUnknownn : csCurrentLine) + "\n";
csGlobalText += csCurrentLine;
csGlobalText += "\n";
csGlobalText += "Additionnal informations were :\n";
csCurrentLine = csSpacing + (g_csAddedInfo.IsEmpty() ? g_c_csNone : g_csAddedInfo) + "\n";
csGlobalText += csCurrentLine;
csGlobalText += "\n";
csGlobalText += "Script in progress :\n";
csCurrentLine = csSpacing + (g_csCurrentScriptFileName.IsEmpty() ? g_c_csNone : g_csCurrentScriptFileName) + "\n";
csGlobalText += csCurrentLine;
csGlobalText += "At line :\n";
csCurrentLine.Format("%i", g_wCurrentScriptLine);
csCurrentLine = csSpacing + (g_wCurrentScriptLine <= 0 ? g_c_csUnknownn : csCurrentLine) + "\n";
csGlobalText += csCurrentLine;
csGlobalText += "\n";
csGlobalText += "----------------------------------------------------------------------\n";
csGlobalText += "\n";
m_pri_fn_vCopyIntoClipBoard(csGlobalText);
}
//***************************************************************************
void ErrorOperator_DialogReport::OnButtonFileBrowse()
{
CFileDialog cfFileDial(TRUE);
if ( cfFileDial.DoModal() == IDOK )
{
m_csFileName = cfFileDial.GetPathName();
UpdateData(FALSE);
}
}
//***************************************************************************
void ErrorOperator_DialogReport::OnRadioReportClipboard()
{
GetDlgItem(IDC_STATIC_FILE)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT_FILE_NAME)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_BUTTON_FILE_BROWSE)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_CHECK_MAIN_PROGRAMMER)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_CHECK_SECOND_PROGRAMMER)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_CHECK_RESPONSIBLE)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_CHECK_DELETE_FILE)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC_ADD_COMMENTS)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT_USER_ADDS)->ShowWindow(SW_HIDE);
}
//***************************************************************************
void ErrorOperator_DialogReport::OnRadioReportFile()
{
GetDlgItem(IDC_STATIC_FILE)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_EDIT_FILE_NAME)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_BUTTON_FILE_BROWSE)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_CHECK_MAIN_PROGRAMMER)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_CHECK_SECOND_PROGRAMMER)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_CHECK_RESPONSIBLE)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_CHECK_DELETE_FILE)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC_ADD_COMMENTS)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT_USER_ADDS)->ShowWindow(SW_HIDE);
}
//***************************************************************************
void ErrorOperator_DialogReport::OnRadioReportPrinter()
{
GetDlgItem(IDC_STATIC_FILE)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT_FILE_NAME)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_BUTTON_FILE_BROWSE)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_CHECK_MAIN_PROGRAMMER)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_CHECK_SECOND_PROGRAMMER)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_CHECK_RESPONSIBLE)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_CHECK_DELETE_FILE)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC_ADD_COMMENTS)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT_USER_ADDS)->ShowWindow(SW_HIDE);
}
//***************************************************************************
void ErrorOperator_DialogReport::OnRadioReportMail()
{
GetDlgItem(IDC_CHECK_MAIN_PROGRAMMER)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_CHECK_SECOND_PROGRAMMER)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_CHECK_RESPONSIBLE)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_CHECK_DELETE_FILE)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_STATIC_ADD_COMMENTS)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_EDIT_USER_ADDS)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_STATIC_FILE)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT_FILE_NAME)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_BUTTON_FILE_BROWSE)->ShowWindow(SW_HIDE);
}
//***************************************************************************
void ErrorOperator_DialogReport::m_pri_fn_vCopyIntoClipBoard(CString csText)
{
if( OpenClipboard() )
{
if( EmptyClipboard() )
{
long lSize=csText.GetLength();
HANDLE hText=GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE,lSize+1);
if( hText != NULL )
{
LPVOID pvText=GlobalLock(hText);
if( pvText != NULL )
{
CopyMemory(pvText, LPCTSTR(csText), lSize+1);
HANDLE hRes = SetClipboardData(CF_TEXT, hText);
if( hRes == NULL )
MessageBox("Can't set clipboard data");
GlobalUnlock(hText);
}
else
MessageBox("Can't lock memory for clipboard operation");
}
else
MessageBox("Can't alloc memory for clipboard");
}
else
MessageBox("Can't empty clipboard");
CloseClipboard();
}
}
//***************************************************************************
void ErrorOperator_DialogReport::m_pri_fn_vSendByMail()
{
AfxGetApp()->DoWaitCursor(1);
if ( h_MAPI_DLL == NULL )
{
h_MAPI_DLL = LoadLibrary("MAPI32.dll");
if ( h_MAPI_DLL == NULL )
MessageBox("No mail will be sent !", "ErO Module Error !!", MB_ICONSTOP);
}
if ( h_MAPI_DLL != NULL )
{
// Get the addresses of all the API's supported by this object
// m_MAPILogon = ( LPMAPILOGON ) GetProcAddress ( hlibMAPI, "MAPILogon" );
// m_MAPISendDocuments = ( LPMAPISENDDOCUMENTS ) GetProcAddress ( hlibMAPI, "MAPISendDocuments" );
// m_MAPIFindNext = ( LPMAPIFINDNEXT ) GetProcAddress ( hlibMAPI, "MAPIFindNext" );
// m_MAPIReadMail = ( LPMAPIREADMAIL ) GetProcAddress ( hlibMAPI, "MAPIReadMail" );
// m_MAPIAddress = ( LPMAPIADDRESS ) GetProcAddress ( hlibMAPI, "MAPIAddress" );
// m_MAPILogoff = ( LPMAPILOGOFF ) GetProcAddress ( hlibMAPI, "MAPILogoff" );
// m_MAPIFreeBuffer = ( LPMAPIFREEBUFFER ) GetProcAddress ( hlibMAPI, "MAPIFreeBuffer" );
// m_MAPIDetails = ( LPMAPIDETAILS ) GetProcAddress ( hlibMAPI, "MAPIDetails" );
// m_MAPISaveMail = ( LPMAPISAVEMAIL ) GetProcAddress ( hlibMAPI, "MAPISaveMail" );
LPMAPIRESOLVENAME p_fn_MAPIResolveName = (LPMAPIRESOLVENAME)GetProcAddress(h_MAPI_DLL, "MAPIResolveName");
LPMAPISENDMAIL p_fn_MAPISendMail = (LPMAPISENDMAIL)GetProcAddress(h_MAPI_DLL, "MAPISendMail");
//Builds Recipients list
MapiRecipDesc RecipientArray[4];
char c_cI = 0;
for (;c_cI < 4 ; c_cI ++)
{
RecipientArray[c_cI].ulReserved = 0L;
RecipientArray[c_cI].ulEIDSize = 0L;
RecipientArray[c_cI].lpEntryID = NULL;
RecipientArray[c_cI].lpszAddress = NULL;
}
c_cI = 0;
//Gets Team
ErrorOperator_Team *pclTeam = g_clListOfTeams.m_pub_fn_pclGetTeamFromModuleName(g_csModuleName);
if ( pclTeam != NULL )
{
if ( m_bSendToMainProgrammer && (!pclTeam->m_csMainProgrammerName.IsEmpty()) )
{
//First recipient = MAIN PROGRAMMER
RecipientArray[c_cI].ulRecipClass = MAPI_TO;
RecipientArray[c_cI].lpszName = (char *)LPCTSTR(pclTeam->m_csMainProgrammerName);
c_cI ++;
}
if ( m_bSendToSecondProgrammer && (!pclTeam->m_csSecondProgrammerName.IsEmpty()) )
{
//Second recipient = SECOND PROGRAMMER
RecipientArray[c_cI].ulRecipClass = MAPI_TO;
RecipientArray[c_cI].lpszName = (char *)LPCTSTR(pclTeam->m_csSecondProgrammerName);
c_cI ++;
}
if ( m_bSendToResponsible && (!pclTeam->m_csResponsibleName.IsEmpty()) )
{
//Third recipient = SECOND PROGRAMMER
RecipientArray[c_cI].ulRecipClass = MAPI_CC;
RecipientArray[c_cI].lpszName = (char *)LPCTSTR(pclTeam->m_csResponsibleName);
c_cI ++;
}
//Fourth recipient = it's alaways me !!
RecipientArray[c_cI].ulRecipClass = MAPI_BCC;
RecipientArray[c_cI].lpszName = "Yves Babitch";
c_cI ++;
}
//Builds attachment
//Saves file
m_pri_fn_vSaveFile();
MapiFileDesc attachment =
{ 0, // ulReserved, must be 0
0, // no flags; this is a data file
(ULONG)-1, // position not specified
(char *)LPCTSTR(m_csFileName), // pathname
(char *)LPCTSTR(m_csFileName), // original filename
NULL // MapiFileTagExt unused
};
CString csSubject = "ErO Automatic Mail sender >>> The Module '" + g_csModuleName + "' has invoked ErO while '" + g_csCurrentAction + "'!";
CString csText = "\nHere is the report on the Error raised in ErO.\n";
if ( !m_csAddedComments.IsEmpty() )
{
csText += "The user wanted to add :\n";
csText += m_csAddedComments;
}
MapiMessage message =
{ 0, // reserved, must be 0
(char *)LPCTSTR(csSubject), //subject
(char *)LPCTSTR(csText), //note text
NULL, // NULL = interpersonal message
NULL, // no date; MAPISendMail ignores it
NULL, // no conversation ID
0L, // no flags, MAPISendMail ignores it
NULL, // no originator, this is ignored too
c_cI, // Number of recipients
RecipientArray, // NULL recipient array
1, // one attachment
&attachment // the attachment structure
};
//Sends mail
ULONG ulErrorCode;
ulErrorCode = p_fn_MAPISendMail(0L, // use implicit session.
0L, // ulUIParam; 0 is always valid
&message, // the message being sent
0L, // allow the user to edit the message
0L); // reserved; must be 0
if ( ulErrorCode != SUCCESS_SUCCESS )
{
CString csMessage = "Unknown reason";
switch ( ulErrorCode )
{
case MAPI_E_FAILURE:
csMessage = "Messaging system internal failure";
break;
case MAPI_E_ATTACHMENT_NOT_FOUND:
csMessage = "Attachment not found";
break;
case MAPI_E_ATTACHMENT_OPEN_FAILURE:
csMessage = "Attachment could not be open";
break;
case MAPI_E_ATTACHMENT_WRITE_FAILURE:
csMessage = "Attachment could not be written";
break;
};
csMessage = "Ero was unable to send the message : " + csMessage;
MessageBox(csMessage, "ErO Module Error !!", MB_ICONEXCLAMATION);
}
if ( m_bDeleteReport )
{
CFile cfFile;
cfFile.Remove(m_csFileName);
}
}
AfxGetApp()->DoWaitCursor(-1);
}