Files
firestorm/Gameleap/code/mw4/Code/mw4print/ChildView.cpp
T
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
Complete disaster-recovery snapshot: engine/game source, game data assets,
VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive.
Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false,
no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
2026-06-24 21:28:16 -05:00

551 lines
14 KiB
C++

// ChildView.cpp : implementation of the CChildView class
//
#include "stdafx.h"
#include "mw4print.h"
#include "ChildView.h"
#include "cspcfd.h"
#include "MechLabHeaders.h"
#include "GameTypes.h"
#include "mw4dummy.h"
#include "recscore.h"
typedef unsigned long UINT4;
typedef unsigned char* POINTER;
#include "logreport.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "mw4dummy.cpp"
#include "recscore.cpp"
#include "logreport.cpp"
#define IDT_TIMER 1000
BEGIN_MESSAGE_MAP(CChildView,CWnd )
//{{AFX_MSG_MAP(CChildView)
ON_WM_PAINT()
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_TIMER()
//}}AFX_MSG_MAP
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_COMMAND(ID_FILE_LOGREPORT, OnFileLogReport)
ON_COMMAND(ID_FILE_LOG2DATES, OnFileLog2Dates)
END_MESSAGE_MAP()
BEGIN_MESSAGE_MAP(CDlgGet2Dates, CDialog)
//{{AFX_MSG_MAP(CDlgGet2Dates)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
bool _stdcall RunExec(const CStr& strExec)
{
if (strExec.GetLength() > 0) {
CStr strDir;
int nStart = 0, nLen;
const char* pcszExec = strExec.String();
if (*pcszExec == '"') {
nStart++;
nLen = strExec.Find('"');
if (nLen != -1) {
nLen--;
}
} else {
nLen = strExec.Find(' ');
}
strDir.Assign(&pcszExec[nStart], nLen);
strDir.AsDirectory(TRUE);
char szBuf[512];
strcpy(szBuf, strExec.String());
STARTUPINFO si;
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
si.dwX = si.dwY = si.dwXSize = si.dwYSize = CW_USEDEFAULT;
PROCESS_INFORMATION pi;
return !!CreateProcess(NULL, szBuf, NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE | CREATE_NEW_PROCESS_GROUP | HIGH_PRIORITY_CLASS, NULL, strDir.String(), &si, &pi);
}
return false;
}
CMyPrintInfo::CMyPrintInfo(const char* pcszFile, bool bIncludeBot)
: m_strFile(pcszFile), m_bIncludeBot(bIncludeBot), m_bPrinted(false)
{
}
CLogInfo::CLogInfo()
{
m_nState = 1; // 0: no error(ok!!!), 1: (@err=1), error, 2: launched(@Launched=1)...
m_strTime = 0; // Time=%02d:%02d
m_nPlayerCount = 0; // Player Count=%d
}
CLogResult::CLogResult()
{
m_nTotalPlayers = 0;
m_nGames = 0;
m_nUnfinished = 0;
m_nErrGames = 0;
m_dwRet = 0;
}
void CLogResult::GetLogResult(const CString& str)
{
m_nGames = 0, m_nTotalPlayers = 0, m_nUnfinished = 0, m_nErrGames = 0;
m_dwRet = 0;
SLogReport* pRPT = SLogReport::OpenLogReport(str, *(SYSTEMTIME*)NULL, FALSE);
if (pRPT) {
SLogItem* pStart = pRPT->GetFirst();
SLogItem* pEnd = pRPT->GetLast();
while(pStart < pEnd)
{
if ((0 < pStart->m_nPlayers) && (pStart->m_nPlayers <= 16)) {
if (pStart->m_nLaunched) {
m_nUnfinished++;
} else if (pStart->m_nErr) {
m_nErrGames++;
} else {
m_nGames++;
m_nTotalPlayers += pStart->m_nPlayers;
}
}
pStart = pStart->GetNext();
}
} else {
CStr strFile(str);
strFile.ChangeExt(".log", TRUE);
int nBufferSize = (36 + 1) * 2000;
char* psz = (char*)malloc(nBufferSize);
DoLogReport(strFile, psz, nBufferSize);
free(psz);
}
if (pRPT) {
m_dwRet = pRPT->m_dwSigns;
SLogReport::FreeLogReport(pRPT);
}
}
void CLogResult::DoLogReport(const CStr& str, char* psz, int nBufferSize)
{
TARRAYREF(CLogInfo) aLogs;
char szBuf[256];
GetPrivateProfileString(NULL, NULL, "", psz, nBufferSize, str);
while(*psz)
{
int nPlayerCount = GetPrivateProfileInt(psz, "Player Count", 0, str);
if ((0 < nPlayerCount) && (nPlayerCount <= 16)) {
int nState;
if (GetPrivateProfileInt(psz, "@err", 0, str)) {
nState = 1;
} else if (GetPrivateProfileInt(psz, "@Launched", 0, str)) {
nState = 2;
} else {
nState = 0;
}
GetPrivateProfileString(psz, "Time", "", szBuf, sizeof(szBuf), str);
CLogInfo& log = aLogs.Add();
log.m_nState = nState;
log.m_strTime = szBuf;
log.m_nPlayerCount = nPlayerCount;
}
psz = &psz[strlen(psz) + 1];
}
int i, nSize = aLogs.GetSize();
for(i = 0; i < nSize; i++)
{
const CLogInfo& log = aLogs.GetAt(i);
if (log.m_nState == 2) {
m_nUnfinished++;
} else if (log.m_nState == 1) {
m_nErrGames++;
} else {
ASSERT(log.m_nState == 0);
m_nGames++;
m_nTotalPlayers += log.m_nPlayerCount;
}
}
}
CShortDate::CShortDate(const CTime& t)
{
m_nYear = t.GetYear();
m_nMonth = t.GetMonth();
m_nDay = t.GetDay();
}
int CShortDate::Compare(const CShortDate& that)
{
ASSERT(this && &that);
int nDif;
nDif = m_nYear - that.m_nYear;
if (nDif == 0) {
nDif = m_nMonth - that.m_nMonth;
if (nDif == 0) {
nDif = m_nDay - that.m_nDay;
}
}
return nDif;
}
void CShortDate::IncADay()
{
int nDayEnd = GetDayEnd(m_nYear, m_nMonth);
if (++m_nDay >= nDayEnd) {
m_nDay = 1;
if (++m_nMonth >= 12) {
m_nMonth = 1;
m_nYear++;
}
}
}
CDlgGet2Dates::CDlgGet2Dates(SYSTEMTIME& SysTime, CWnd* pParent /*=NULL*/)
: CDialog(CDlgGet2Dates::IDD, pParent), m_Start(SysTime), m_End(SysTime)
{
//{{AFX_DATA_INIT(CDlgGet2Dates)
//}}AFX_DATA_INIT
//m_Start = 0;
//m_End = 0;
}
void CDlgGet2Dates::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgGet2Dates)
//}}AFX_DATA_MAP
DDX_DateTimeCtrl(pDX, IDC_DNT_END, m_End);
DDX_DateTimeCtrl(pDX, IDC_DNT_START, m_Start);
}
BOOL CDlgGet2Dates::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
CChildView::CChildView()
{
m_uTimer = 0;
}
CChildView::~CChildView()
{
}
BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs)
{
if (!CWnd::PreCreateWindow(cs))
return FALSE;
cs.dwExStyle |= WS_EX_CLIENTEDGE;
cs.style &= ~WS_BORDER;
cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,
::LoadCursor(NULL, IDC_ARROW), HBRUSH(COLOR_WINDOW+1), NULL);
return TRUE;
}
void CChildView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CWnd::OnPaint() for painting messages
}
bool CChildView::DoCopyData(HWND hwnd, const MW4PRINT_COPYDATASTRUCT& cd)
{
hWindow = m_hWnd;
if ((cd.dwData == MW4PRINT_COPYDATA_META) && (cd.cbData == sizeof(cd) - sizeof(COPYDATASTRUCT)) && cd.lpData) {
const GUID& guid = *(const GUID*)cd.lpData; // do not use cd.m_GUID
const char* pcsz = (const char*)&(&guid)[1]; // do not use cd.m_szFile
#ifdef _DEBUG
g_bPRTest = true;
#else // _DEBUG
g_bPRTest = false;
#endif // _DEBUG
CMyPrintInfo* p = new CMyPrintInfo(pcsz, g_bPRTest);
m_lstMPIs.AddTail(p);
return true;
}
return false;
}
int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd ::OnCreate(lpCreateStruct) == -1)
return -1;
m_uTimer = SetTimer(IDT_TIMER, 1 * 1000, NULL);
if (!m_uTimer)
return -1;
return 0;
}
void CChildView::OnDestroy()
{
if (m_uTimer) {
KillTimer(m_uTimer);
m_uTimer = 0;
}
CWnd ::OnDestroy();
}
void CChildView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if (nIDEvent == IDT_TIMER) {
CMyPrintInfo* p = m_lstMPIs.GetHead();
while(p) {
if (!p->m_bPrinted) {
hWindow = m_hWnd;
g_bPRTest = p->m_bIncludeBot;
if (g_RSF.LoadPR(p->m_strFile)) {
int nErr = g_RSF.DoPrint();
if (nErr == 0) {
p->m_bPrinted = true;
m_lstMPIs.Cut(p);
delete p;
}
}
g_RSF.Reset();
break;
}
p = p->m_pNext;
}
}
CWnd ::OnTimer(nIDEvent);
}
void CChildView::OnFileOpen()
{
// TODO: Add your command handler code here
const char* pcszFilters = "Battle Tech Print File(*.pr)|*.pr|All Files(*.*)|*.*|";
CSpcFileDialog FD(TRUE, ".pr", NULL, OFN_HIDEREADONLY, pcszFilters, this);
FD.SetTitle("Open : *.Pr");
FD.SetFilterIndex(1);
FD.EnableHook("Include &Bot");
//FD.SetCustomFilter();
if (FD.DoModal() == IDOK) {
#ifdef _DEBUG
g_bPRTest = true;
#else // !_DEBUG
g_bPRTest = (FD.m_ofn.Flags & OFN_READONLY) ? true: false;
#endif // _DEBUG
CString str(FD.GetPathName());
CMyPrintInfo* p = new CMyPrintInfo(str, g_bPRTest);
m_lstMPIs.AddTail(p);
}
}
void CChildView::OnFileLogReport()
{
// TODO: Add your command handler code here
SYSTEMTIME SysTime;
GetLocalTime(&SysTime); // GetSystemTime
char szPath[MAX_PATH];
AdjustSysTimeForLog(SysTime);
sprintf(szPath, "c:\\mw4files\\%02d_%02d_%d.rpt", SysTime.wMonth, SysTime.wDay, SysTime.wYear);
const char* pcszFilters = "Battle Tech Report File(*.rpt)|*.rpt|All Files(*.*)|*.*|";
CSpcFileDialog FD(TRUE, ".rpt", szPath, OFN_HIDEREADONLY, pcszFilters, this);
FD.SetTitle("Open : *.Rpt");
FD.SetFilterIndex(1);
if (FD.DoModal() == IDOK) {
CString str(FD.GetPathName());
CLogResult lr;
lr.GetLogResult(str);
int nPos = str.ReverseFind('\\');
if (nPos == -1) {
nPos = str.ReverseFind('/');
}
CStr strFile(&((const char*)str)[nPos + 1]);
strFile.ChangeExt("", TRUE);
char szBuf[256 * 3];
sprintf(szBuf, "%s\n\n%d total players, %d Games", strFile.String(), lr.m_nTotalPlayers, lr.m_nGames);
if (lr.m_nUnfinished) {
sprintf(&szBuf[strlen(szBuf)], "\n\nUnfinished Games: %d", lr.m_nUnfinished);
}
if (lr.m_nErrGames) {
sprintf(&szBuf[strlen(szBuf)], "\n\nError Games: %d", lr.m_nErrGames);
}
if (lr.m_dwRet == LRPT_FILE_ERR)
strcat(szBuf, "\n\nPrevious LogData lost!!!");
else if (lr.m_dwRet == LRPT_FILE_ERR2)
strcat(szBuf, "\n\nLogData broken!!!");
MessageBox(szBuf, "Log Report");
}
}
void CChildView::OnFileLog2Dates()
{
SYSTEMTIME SysTime;
GetLocalTime(&SysTime); // GetSystemTime
CDlgGet2Dates dlg(SysTime, this);
BOOL bSuccess = FALSE;
while(dlg.DoModal() == IDOK)
{
CString str;
CShortDate Start(dlg.m_Start);
CShortDate End(dlg.m_End);
if (Start.Compare(End) > 0) {
MessageBox("Start date should be <= End Date");
continue;
}
if (Start.m_nYear < 2002) {
MessageBox("Start year should be >= 2002");
continue;
}
CStrArray aStrs;
BOOL bDone = false;
int nTotalPlayers = 0;
int nGames = 0;
int nUnfinished = 0;
int nErrGames = 0;
int nErr1 = 0;
int nErr2 = 0;
int nDays = 0;
do
{
if (Start.Compare(End) == 0)
bDone = TRUE;
CString strDate;
strDate.Format("c:\\mw4files\\%02d_%02d_%d.rpt", Start.m_nMonth, Start.m_nDay, Start.m_nYear);
CLogResult lr;
lr.GetLogResult(strDate);
nTotalPlayers += lr.m_nTotalPlayers;
nGames += lr.m_nGames;
nUnfinished += lr.m_nUnfinished;
nErrGames += lr.m_nErrGames;
int n1 = 0, n2 = 0;
if (lr.m_dwRet == LRPT_FILE_ERR) {
nErr1++;
n1++;
} else if (lr.m_dwRet == LRPT_FILE_ERR2) {
nErr2++;
n2++;
}
// comment out below if-block for off day!!!
CStr& str = aStrs.Add();
//if (lr.m_nTotalPlayers || lr.m_nGames || lr.m_nUnfinished || lr.m_nErrGames || n1 || n2) {
str.Format("%02d/%02d/%04d, %6d, %5d, %5d, %5d, %4d, %4d\r\n",
Start.m_nMonth, Start.m_nDay, Start.m_nYear,
lr.m_nTotalPlayers, lr.m_nGames, lr.m_nUnfinished, lr.m_nErrGames,
n1, n2);
//} else {
// str.Format("%02d/%02d/%04d no records\r\n", Start.m_nMonth, Start.m_nDay, Start.m_nYear);
//}
Start.IncADay();
nDays++;
} while(!bDone);
CStr& strD = aStrs.Add();
strD.Format("===================================================\r\n"
"mm/dd/year, #Plyrs, Games, Unfin, #Errs, Lost, Brkn\r\n");
CStr& strT = aStrs.Add();
strT.Format("%5d days, %6d, %5d, %5d, %5d, %4d, %4d\r\n",
nDays, nTotalPlayers, nGames, nUnfinished, nErrGames,
nErr1, nErr2);
int nTotal = aStrs.GetTotalLength();
HANDLE hMem = GlobalAlloc(GMEM_MOVEABLE, nTotal);
if (hMem) {
LPVOID p = GlobalLock(hMem);
if (p) {
char* psz = (char*)p;
CStr* pStart = &aStrs.GetAt(0);
CStr* pEnd = &pStart[aStrs.GetSize()];
while(pStart < pEnd)
{
strcpy(psz, pStart->String());
psz += pStart->GetLength();
pStart++;
}
*psz = '\0';
HANDLE handle = CreateFile("c:\\mw4files\\report.txt",
GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (handle) {
DWORD dwWritten;
WriteFile(handle, p, psz - (char*)p, &dwWritten, NULL);
CloseHandle(handle);
CStr strExec;
#if 0
//char szBuf[256];
//GetWindowsDirectory(szBuf, sizeof(szBuf));
//strExec.Format("\"%s\\system32\\notepad.exe\" /p c:\\mw4files\\report.txt", szBuf);
#else
strExec.Format("c:\\mw4files\\notepad.exe /p c:\\mw4files\\report.txt", AssetsDirectory1);
//strExec.Format("\"%s\\notepad.exe\" /p c:\\mw4files\\report.txt", AssetsDirectory1);
#endif
RunExec(strExec);
}
if (OpenClipboard()) {
EmptyClipboard();
if (SetClipboardData(CF_TEXT, hMem)) {
bSuccess = TRUE;
hMem = NULL;
}
CloseClipboard();
}
}
if (hMem) {
GlobalFree(hMem);
hMem = NULL;
}
}
if (bSuccess) {
MessageBox("LOG data is printed & placed in (CLIPBOARD & c:\\mw4files\\report.txt)");
} else {
//MessageBox("");
}
break;
}
}