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.
311 lines
7.3 KiB
C++
311 lines
7.3 KiB
C++
// PatchITDlg.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "PatchIT.h"
|
|
#include "PatchITDlg.h"
|
|
#include "FilePro.h"
|
|
#include "SpanFile.h"
|
|
#include "Insert.h"
|
|
#include "Delete.h"
|
|
#include "ProgDlg.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
CPatchOperation OpList;
|
|
CPatchOperation *LastNode=&OpList;
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAboutDlg dialog used for App About
|
|
|
|
class CAboutDlg : public CDialog
|
|
{
|
|
public:
|
|
CAboutDlg();
|
|
|
|
// Dialog Data
|
|
//{{AFX_DATA(CAboutDlg)
|
|
enum { IDD = IDD_ABOUTBOX };
|
|
//}}AFX_DATA
|
|
|
|
// ClassWizard generated virtual function overrides
|
|
//{{AFX_VIRTUAL(CAboutDlg)
|
|
protected:
|
|
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
|
|
//}}AFX_VIRTUAL
|
|
|
|
// Implementation
|
|
protected:
|
|
//{{AFX_MSG(CAboutDlg)
|
|
//}}AFX_MSG
|
|
DECLARE_MESSAGE_MAP()
|
|
};
|
|
|
|
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
|
|
{
|
|
//{{AFX_DATA_INIT(CAboutDlg)
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CAboutDlg)
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
|
|
//{{AFX_MSG_MAP(CAboutDlg)
|
|
// No message handlers
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CPatchITDlg dialog
|
|
|
|
CPatchITDlg::CPatchITDlg(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CPatchITDlg::IDD, pParent)
|
|
{
|
|
//{{AFX_DATA_INIT(CPatchITDlg)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
|
|
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
|
|
}
|
|
|
|
void CPatchITDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CPatchITDlg)
|
|
// NOTE: the ClassWizard will add DDX and DDV calls here
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CPatchITDlg, CDialog)
|
|
//{{AFX_MSG_MAP(CPatchITDlg)
|
|
ON_WM_SYSCOMMAND()
|
|
ON_WM_PAINT()
|
|
ON_WM_QUERYDRAGICON()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CPatchITDlg message handlers
|
|
|
|
BOOL CPatchITDlg::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
// Add "About..." menu item to system menu.
|
|
|
|
// IDM_ABOUTBOX must be in the system command range.
|
|
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
|
|
ASSERT(IDM_ABOUTBOX < 0xF000);
|
|
|
|
CMenu* pSysMenu = GetSystemMenu(FALSE);
|
|
if (pSysMenu != NULL)
|
|
{
|
|
CString strAboutMenu;
|
|
strAboutMenu.LoadString(IDS_ABOUTBOX);
|
|
if (!strAboutMenu.IsEmpty())
|
|
{
|
|
pSysMenu->AppendMenu(MF_SEPARATOR);
|
|
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
|
|
}
|
|
}
|
|
|
|
// Set the icon for this dialog. The framework does this automatically
|
|
// when the application's main window is not a dialog
|
|
SetIcon(m_hIcon, TRUE); // Set big icon
|
|
SetIcon(m_hIcon, FALSE); // Set small icon
|
|
|
|
// TODO: Add extra initialization here
|
|
Test();
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
}
|
|
|
|
void CPatchITDlg::Test()
|
|
{
|
|
|
|
CProgressDlg pdlg;
|
|
pdlg.Create(this);
|
|
pdlg.ShowWindow(SW_SHOW);
|
|
pdlg.SetRange(0,100);
|
|
DWORD starttime,endtime;
|
|
starttime=GetTickCount();
|
|
|
|
CSpanFile file1,file2;
|
|
|
|
//file1.Load("c:\\Test1.txt");
|
|
//file2.Load("c:\\Test2.txt");
|
|
//file1.MapFiles(file2,1);
|
|
|
|
file1.Load("c:\\Temp\\DFLWNew.exe");
|
|
file2.Load("c:\\Temp\\DFLWOrg.exe");
|
|
file1.MapFiles(file2,1024);
|
|
|
|
file1.BuildOps(file2,&OpList);
|
|
CString str,report;
|
|
report=file1.SpanReport(file2);
|
|
|
|
/*
|
|
CFilePro file1,file2;
|
|
file1.Open("c:\\Temp\\propsOld.mw4",CFile::modeRead);
|
|
file2.Open("c:\\Temp\\propsNew.mw4",CFile::modeRead);
|
|
//file1.Open("c:\\Temp\\DFLWOrg.exe",CFile::modeRead);
|
|
//file2.Open("c:\\Temp\\DFLWNew.exe",CFile::modeRead);
|
|
//file1.Open("c:\\Test1.txt",CFile::modeRead);
|
|
//file2.Open("c:\\Test2.txt",CFile::modeRead);
|
|
DWORD diffat;
|
|
|
|
DWORD dlgmax=file2.GetLength();
|
|
|
|
bool insres,delres;
|
|
DWORD inspos,delpos;
|
|
DWORD insdist,deldist;
|
|
DWORD f2pos;
|
|
|
|
DWORD loc,size;
|
|
|
|
do
|
|
{
|
|
|
|
diffat=file1.DifferAt(file2,&f2pos);
|
|
insres=file2.SyncedAt(file1,&inspos,64);
|
|
delres=file1.SyncedAt(file2,&delpos,64);
|
|
insdist=inspos-file2.GetPosition();
|
|
deldist=delpos-file1.GetPosition();
|
|
|
|
pdlg.SetPos((file2.GetPosition()*100)/dlgmax);
|
|
|
|
|
|
if((insres && delres && insdist<=deldist) || (insres&&(!delres)) )
|
|
{
|
|
//INsertion
|
|
LastNode->Next=new CInsert(diffat,insdist);
|
|
LastNode=LastNode->Next;
|
|
file2.Seek(insdist,CFile::current);
|
|
}
|
|
else if((insres && delres && insdist>=deldist) || ((!insres)&&delres) )
|
|
{ //Deletion
|
|
LastNode->Next=new CDelete(diffat,deldist);
|
|
LastNode=LastNode->Next;
|
|
file1.Seek(deldist,CFile::current);
|
|
}
|
|
|
|
}
|
|
while(insres || delres);
|
|
|
|
//These must have their order retained
|
|
//If These opertation are huge then this alg doesn't work.
|
|
|
|
if((file1.GetLength()-file1.GetPosition())>0)
|
|
{ // Extra Bytes at End Delete them
|
|
LastNode->Next=new CDelete(file1.GetPosition(),file1.GetLength()-file1.GetPosition());
|
|
LastNode=LastNode->Next;
|
|
loc=file1.GetPosition();
|
|
size=file1.GetLength()-file1.GetPosition();
|
|
file1.Seek(deldist,CFile::current);
|
|
}
|
|
|
|
if((file2.GetLength()-file2.GetPosition())>0)
|
|
{ // Extra Bytes at End Insert them
|
|
LastNode->Next=new CInsert(file1.GetPosition(),file2.GetLength()-file2.GetPosition());
|
|
LastNode=LastNode->Next;
|
|
file1.Seek(deldist,CFile::current);
|
|
}
|
|
*/
|
|
endtime=GetTickCount();
|
|
|
|
report="";
|
|
str.Format("Operations: %i\n",OpList.OpCount());
|
|
report+=str;
|
|
str.Format("Deleted Bytes: %i Bytes\n",OpList.DeletedBytes());
|
|
report+=str;
|
|
str.Format("Inserted Bytes: %i Bytes\n",OpList.InsertedBytes());
|
|
report+=str;
|
|
|
|
DWORD et,h,m,s;
|
|
et=(endtime-starttime)/1000;
|
|
s=et%60;
|
|
et-=s;
|
|
et/=60;
|
|
m=et%(60);
|
|
et-=m;
|
|
et/=60;
|
|
h=et;
|
|
|
|
str.Format("Time To Create %02i:%02i:%02i\n\n",h,m,s);
|
|
report+=str;
|
|
report+="Operations:\n";
|
|
|
|
LastNode=OpList.Next;
|
|
while(LastNode)
|
|
{
|
|
report+=LastNode->GetOpText();
|
|
LastNode=LastNode->Next;
|
|
}
|
|
|
|
/*
|
|
FILE *fl;
|
|
fl=fopen("c:\\Temp\\PatchRepB.txt","w");
|
|
fprintf(fl,"%s",report);
|
|
fclose(fl);
|
|
exit(1);
|
|
*/
|
|
}
|
|
|
|
|
|
void CPatchITDlg::OnSysCommand(UINT nID, LPARAM lParam)
|
|
{
|
|
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
|
|
{
|
|
CAboutDlg dlgAbout;
|
|
dlgAbout.DoModal();
|
|
}
|
|
else
|
|
{
|
|
CDialog::OnSysCommand(nID, lParam);
|
|
}
|
|
}
|
|
|
|
// If you add a minimize button to your dialog, you will need the code below
|
|
// to draw the icon. For MFC applications using the document/view model,
|
|
// this is automatically done for you by the framework.
|
|
|
|
void CPatchITDlg::OnPaint()
|
|
{
|
|
if (IsIconic())
|
|
{
|
|
CPaintDC dc(this); // device context for painting
|
|
|
|
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
|
|
|
|
// Center icon in client rectangle
|
|
int cxIcon = GetSystemMetrics(SM_CXICON);
|
|
int cyIcon = GetSystemMetrics(SM_CYICON);
|
|
CRect rect;
|
|
GetClientRect(&rect);
|
|
int x = (rect.Width() - cxIcon + 1) / 2;
|
|
int y = (rect.Height() - cyIcon + 1) / 2;
|
|
|
|
// Draw the icon
|
|
dc.DrawIcon(x, y, m_hIcon);
|
|
}
|
|
else
|
|
{
|
|
CDialog::OnPaint();
|
|
}
|
|
}
|
|
|
|
// The system calls this to obtain the cursor to display while the user drags
|
|
// the minimized window.
|
|
HCURSOR CPatchITDlg::OnQueryDragIcon()
|
|
{
|
|
return (HCURSOR) m_hIcon;
|
|
}
|