VPatch 2.0 final

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@2798 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
joostverburg 2003-08-11 16:42:41 +00:00
parent 2449fbc6bd
commit 6dd280b24f
22 changed files with 3566 additions and 14 deletions

Binary file not shown.

View file

@ -0,0 +1,31 @@
unit AboutForm;
interface
uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,
Buttons, ExtCtrls;
type
TfrmAbout = class(TForm)
Panel1: TPanel;
ProgramIcon: TImage;
ProductName: TLabel;
Version: TLabel;
Copyright: TLabel;
Comments: TLabel;
OKButton: TButton;
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmAbout: TfrmAbout;
implementation
{$R *.dfm}
end.

View file

@ -0,0 +1,53 @@
unit DLLWrapper;
interface
uses Classes, SysUtils;
function DoGenerate(const Source, Target: String; Stream: TStream; Config: String): Integer; forward;
implementation
uses PatchGenerator;
function DoGenerate(const Source, Target: String; Stream: TStream; Config: String): Integer;
var
PG: TPatchGenerator;
a: Integer;
begin
WriteLn('Generating '+ExtractFileName(Source)+' to '+ExtractFileName(Target)+'...');
PG:=TPatchGenerator.Create;
PG.StartBlockSize:=512;
PG.MinimumBlockSize:=512;
PG.BlockDivider:=2;
PG.StepSize:=256;
try
a:=Pos(',',Config);
if(a=0) then a:=Length(Config)+1;
PG.StartBlockSize:=StrToInt(Copy(Config,1,a-1));
Config:=Copy(Config,a+1,Length(Config));
a:=Pos(',',Config);
if(a=0) then a:=Length(Config)+1;
PG.MinimumBlockSize:=StrToInt(Copy(Config,1,a-1));
Config:=Copy(Config,a+1,Length(Config));
a:=Pos(',',Config);
if(a=0) then a:=Length(Config)+1;
PG.BlockDivider:=StrToInt(Copy(Config,1,a-1));
Config:=Copy(Config,a+1,Length(Config));
a:=Pos(',',Config);
if(a=0) then a:=Length(Config)+1;
PG.StepSize:=StrToInt(Copy(Config,1,a-1));
finally
end;
Result:=PG.CreatePatch(Source,Target);
PG.WriteToStream(Stream);
PG.Free;
WriteLn(ExtractFileName(Source)+' -> '+ExtractFileName(Target)+': '+IntToStr(Result)+' bytes');
end;
end.

View file

@ -0,0 +1,903 @@
object frmMain: TfrmMain
Left = 195
Top = 93
BorderIcons = [biSystemMenu, biMinimize]
BorderStyle = bsSingle
Caption = 'VG - VPatch GUI'
ClientHeight = 361
ClientWidth = 689
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
Menu = MainMenu
OldCreateOrder = False
Position = poScreenCenter
ShowHint = True
OnCreate = FormCreate
OnDestroy = FormDestroy
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 8
Top = 32
Width = 77
Height = 13
Caption = 'New versions'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = [fsBold]
ParentFont = False
end
object butAdd: TSpeedButton
Left = 24
Top = 328
Width = 89
Height = 25
Caption = 'Add &new version'
Flat = True
OnClick = butAddClick
end
object grpConfig: TGroupBox
Left = 232
Top = 43
Width = 441
Height = 278
Enabled = False
TabOrder = 0
object Label2: TLabel
Left = 16
Top = 24
Width = 71
Height = 13
Caption = 'New version'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = [fsBold]
ParentFont = False
end
object Label3: TLabel
Left = 16
Top = 80
Width = 71
Height = 13
Caption = 'Old versions'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = [fsBold]
ParentFont = False
end
object butOldAdd: TSpeedButton
Left = 368
Top = 96
Width = 49
Height = 25
Caption = '&Add'
Flat = True
OnClick = butOldAddClick
end
object butOldRemove: TSpeedButton
Left = 368
Top = 160
Width = 49
Height = 25
Caption = '&Remove'
Flat = True
OnClick = butOldRemoveClick
end
object butNewEdit: TSpeedButton
Left = 368
Top = 40
Width = 49
Height = 25
Caption = '&Edit'
Flat = True
OnClick = butNewEditClick
end
object Label4: TLabel
Left = 16
Top = 200
Width = 176
Height = 13
Caption = 'Patch generation configuration'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = [fsBold]
ParentFont = False
end
object Label5: TLabel
Left = 32
Top = 224
Width = 48
Height = 13
Hint = 'Smaller gives smaller patch files, but decreased speed'
Caption = 'Block size'
end
object Label6: TLabel
Left = 32
Top = 248
Width = 91
Height = 13
Caption = 'Minimum block size'
Visible = False
end
object Label7: TLabel
Left = 232
Top = 224
Width = 61
Height = 13
Caption = 'Block divider'
Visible = False
end
object Label8: TLabel
Left = 232
Top = 248
Width = 43
Height = 13
Caption = 'Step size'
Visible = False
end
object txtStartBlockSize: TLabel
Left = 136
Top = 224
Width = 65
Height = 17
Alignment = taCenter
AutoSize = False
end
object txtNew: TEdit
Left = 32
Top = 42
Width = 321
Height = 21
ReadOnly = True
TabOrder = 0
end
object lstOld: TListBox
Left = 32
Top = 96
Width = 321
Height = 89
ItemHeight = 13
TabOrder = 1
end
object txtMinimumBlockSize: TEdit
Left = 136
Top = 248
Width = 65
Height = 21
TabOrder = 2
Text = '16'
Visible = False
OnChange = txtMinimumBlockSizeChange
end
object UDMinimumBlockSize: TUpDown
Left = 201
Top = 248
Width = 15
Height = 21
Associate = txtMinimumBlockSize
Min = 16
Max = 4096
Increment = 16
Position = 16
TabOrder = 3
Visible = False
Wrap = False
end
object UDBlockDivider: TUpDown
Left = 401
Top = 224
Width = 15
Height = 21
Associate = txtBlockDivider
Min = 2
Max = 512
Increment = 2
Position = 16
TabOrder = 4
Visible = False
Wrap = False
end
object txtBlockDivider: TEdit
Left = 336
Top = 224
Width = 65
Height = 21
TabOrder = 5
Text = '16'
Visible = False
OnChange = txtBlockDividerChange
end
object UDStepSize: TUpDown
Left = 401
Top = 248
Width = 15
Height = 21
Associate = txtStepSize
Min = 16
Max = 4096
Increment = 16
Position = 16
TabOrder = 6
Visible = False
Wrap = False
end
object txtStepSize: TEdit
Left = 336
Top = 248
Width = 65
Height = 21
TabOrder = 7
Text = '16'
Visible = False
OnChange = txtStepSizeChange
end
object tbBlockSize: TTrackBar
Left = 200
Top = 224
Width = 161
Height = 25
Max = 12
Min = 4
Orientation = trHorizontal
Frequency = 1
Position = 6
SelEnd = 0
SelStart = 0
TabOrder = 8
TickMarks = tmBottomRight
TickStyle = tsAuto
OnChange = tbBlockSizeChange
end
end
object lstNew: TVirtualStringTree
Left = 24
Top = 48
Width = 193
Height = 273
Header.AutoSizeIndex = 0
Header.Font.Charset = DEFAULT_CHARSET
Header.Font.Color = clWindowText
Header.Font.Height = -11
Header.Font.Name = 'MS Sans Serif'
Header.Font.Style = []
Header.MainColumn = -1
Header.Options = [hoColumnResize, hoDrag]
HintAnimation = hatNone
Indent = 0
TabOrder = 1
TreeOptions.PaintOptions = [toHotTrack, toShowBackground, toShowButtons, toShowDropmark, toShowRoot, toThemeAware, toUseBlendedImages]
TreeOptions.SelectionOptions = [toFullRowSelect]
OnChange = lstNewChange
OnGetText = lstNewGetText
Columns = <>
end
object barCool: TCoolBar
Left = 0
Top = 0
Width = 689
Height = 44
AutoSize = True
Bands = <
item
BorderStyle = bsSingle
Control = barTool
ImageIndex = -1
MinHeight = 36
Width = 689
end>
EdgeBorders = [ebTop, ebBottom]
object barTool: TToolBar
Left = 9
Top = 2
Width = 676
Height = 36
AutoSize = True
ButtonHeight = 36
ButtonWidth = 90
Caption = 'barTool'
EdgeBorders = []
Flat = True
Images = IL
ShowCaptions = True
TabOrder = 0
object toolNew: TToolButton
Left = 0
Top = 0
Caption = '&New'
ImageIndex = 0
MenuItem = mnuNew
end
object toolOpen: TToolButton
Left = 90
Top = 0
Caption = '&Open'
ImageIndex = 1
MenuItem = mnuOpen
end
object toolSave: TToolButton
Left = 180
Top = 0
Caption = '&Save'
ImageIndex = 2
MenuItem = mnuSave
end
object ToolButton1: TToolButton
Left = 270
Top = 0
Width = 8
Caption = 'ToolButton1'
ImageIndex = 7
Style = tbsSeparator
end
object toolGenGo: TToolButton
Left = 278
Top = 0
Caption = '&Generate'
ImageIndex = 3
MenuItem = mnuGenGo
end
object toolCreateEXE: TToolButton
Left = 368
Top = 0
Caption = 'Create &EXE'
ImageIndex = 5
MenuItem = mnuCreateEXE
end
object toolCreateDLL: TToolButton
Left = 458
Top = 0
Caption = 'Create &DLL'
ImageIndex = 6
MenuItem = mnuCreateDLL
end
object toolCreatePAT: TToolButton
Left = 548
Top = 0
Caption = 'Create &patch file'
ImageIndex = 7
MenuItem = mnuCreatePAT
end
end
end
object chkDebug: TCheckBox
Left = 232
Top = 336
Width = 289
Height = 17
Caption = 'Show extended information during patch generation'
TabOrder = 3
OnClick = chkDebugClick
end
object MainMenu: TMainMenu
Images = IL
Left = 160
Top = 328
object mnuFile: TMenuItem
Caption = '&File'
object mnuNew: TMenuItem
Caption = '&New'
ImageIndex = 0
ShortCut = 16462
OnClick = mnuNewClick
end
object mnuOpen: TMenuItem
Caption = '&Open'
ImageIndex = 1
ShortCut = 16463
OnClick = mnuOpenClick
end
object mnuSave: TMenuItem
Caption = '&Save'
ImageIndex = 2
ShortCut = 16467
OnClick = mnuSaveClick
end
object mnuSaveas: TMenuItem
Caption = 'Save &as...'
OnClick = mnuSaveasClick
end
object N1: TMenuItem
Caption = '-'
end
object mnuExit: TMenuItem
Caption = 'E&xit'
OnClick = mnuExitClick
end
end
object mnuAction: TMenuItem
Caption = '&Action'
object mnuClearcachedpatches: TMenuItem
Caption = 'Empty &cache'
ImageIndex = 4
OnClick = mnuClearcachedpatchesClick
end
object mnuGenGo: TMenuItem
Caption = '&Generate'
ImageIndex = 3
OnClick = mnuGenGoClick
end
object mnuCreateEXE: TMenuItem
Caption = 'Create &EXE'
ImageIndex = 5
OnClick = mnuCreateEXEClick
end
object mnuCreateDLL: TMenuItem
Caption = 'Create &DLL'
ImageIndex = 6
OnClick = mnuCreateDLLClick
end
object mnuCreatePAT: TMenuItem
Caption = 'Create &patch file'
ImageIndex = 7
OnClick = mnuCreatePATClick
end
end
object mnuHelp: TMenuItem
Caption = '&Help'
object mnuAbout: TMenuItem
Caption = '&About'
OnClick = mnuAboutClick
end
end
end
object OD: TOpenDialog
Filter = 'All files (*.*)|*.*'
Options = [ofHideReadOnly, ofPathMustExist, ofFileMustExist, ofEnableSizing, ofDontAddToRecent]
Left = 128
Top = 328
end
object dlgOpen: TOpenDialog
DefaultExt = '.vpj'
Filter = 'VPatch ProJects (*.vpj)|*.vpj|All files (*.*)|*.*'
Options = [ofHideReadOnly, ofPathMustExist, ofFileMustExist, ofEnableSizing]
Left = 104
Top = 24
end
object dlgSave: TSaveDialog
DefaultExt = '.vpj'
Filter = 'VPatch ProJects (*.vpj)|*.vpj|All files (*.*)|*.*'
Options = [ofOverwritePrompt, ofHideReadOnly, ofPathMustExist, ofNoReadOnlyReturn, ofNoDereferenceLinks, ofEnableSizing]
Left = 136
Top = 24
end
object IL: TImageList
Left = 168
Top = 24
Bitmap = {
494C010108000900040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
0000000000003600000028000000400000003000000001002000000000000030
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000000000FF
FF00000000000000000000000000000000000000000000000000000000000000
000000FFFF000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000FFFF0000FF
FF0000FFFF0000000000000000000000000000000000000000000000000000FF
FF0000FFFF0000FFFF0000000000000000000000000000000000FF000000FF00
0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
0000FF000000FF000000FF00000000000000000000000000FF000000FF000000
FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
FF000000FF000000FF000000FF00000000000000000000000000008000000080
0000008000000080000000800000008000000080000000800000008000000080
00000080000000800000008000000000000000000000007F7F0000FFFF0000FF
FF0000FFFF0000FFFF000000000000000000000000000000000000FFFF0000FF
FF0000FFFF0000FFFF00007F7F00000000000000000000000000FF000000FFFF
FF00FFFFFF00FFFFFF00FF000000FFFFFF00FF000000FFFFFF00FF000000FFFF
FF00FFFFFF00FFFFFF00FF00000000000000000000000000FF00FFFFFF00FFFF
FF00FFFFFF000000FF000000FF00FFFFFF00FFFFFF00FFFFFF000000FF00FFFF
FF00FFFFFF00FFFFFF000000FF0000000000000000000000000000800000FFFF
FF00008000000080000000800000FFFFFF0000800000FFFFFF00008000000080
0000FFFFFF000080000000800000000000000000000000FFFF0000FFFF0000FF
FF0000FFFF0000FFFF00007F7F000000000000000000007F7F0000FFFF0000FF
FF0000FFFF0000FFFF0000FFFF00000000000000000000000000FF000000FFFF
FF00FF000000FF000000FF000000FFFFFF00FF000000FFFFFF00FF000000FFFF
FF00FF000000FF000000FF00000000000000000000000000FF00FFFFFF000000
FF000000FF00FFFFFF000000FF00FFFFFF000000FF000000FF000000FF00FFFF
FF000000FF000000FF000000FF0000000000000000000000000000800000FFFF
FF00008000000080000000800000FFFFFF0000800000FFFFFF00008000000080
0000FFFFFF000080000000800000000000000000000000FFFF0000FFFF0000FF
FF0000FFFF0000FFFF0000FFFF00000000000000000000FFFF0000FFFF0000FF
FF0000FFFF0000FFFF0000FFFF00000000000000000000000000FF000000FFFF
FF00FFFFFF00FFFFFF00FF000000FF000000FFFFFF00FF000000FF000000FFFF
FF00FFFFFF00FFFFFF00FF00000000000000000000000000FF00FFFFFF000000
FF000000FF00FFFFFF000000FF00FFFFFF000000FF000000FF000000FF00FFFF
FF000000FF000000FF000000FF0000000000000000000000000000800000FFFF
FF00FFFFFF00FFFFFF0000800000FFFFFF00FFFFFF00FFFFFF00008000000080
0000FFFFFF000080000000800000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000FF000000FFFF
FF00FF000000FF000000FF000000FFFFFF00FF000000FFFFFF00FF000000FFFF
FF00FF000000FF000000FF00000000000000000000000000FF00FFFFFF000000
FF000000FF00FFFFFF000000FF00FFFFFF000000FF000000FF000000FF00FFFF
FF000000FF000000FF000000FF0000000000000000000000000000800000FFFF
FF0000800000FFFFFF0000800000FFFFFF0000800000FFFFFF00008000000080
0000FFFFFF000080000000800000000000000000000000000000000000000000
000000000000000000000000000000FFFF0000FFFF0000000000000000000000
0000000000000000000000000000000000000000000000000000FF000000FFFF
FF00FFFFFF00FFFFFF00FF000000FFFFFF00FF000000FFFFFF00FF000000FFFF
FF00FFFFFF00FFFFFF00FF00000000000000000000000000FF00FFFFFF00FFFF
FF00FFFFFF000000FF000000FF00FFFFFF000000FF000000FF000000FF00FFFF
FF000000FF000000FF000000FF0000000000000000000000000000800000FFFF
FF00FFFFFF00FFFFFF0000800000FFFFFF00FFFFFF00FFFFFF0000800000FFFF
FF00FFFFFF00FFFFFF0000800000000000000000000000000000000000000000
000000000000000000000000000000FFFF0000FFFF0000000000000000000000
0000000000000000000000000000000000000000000000000000FF000000FF00
0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
0000FF000000FF000000FF00000000000000000000000000FF000000FF000000
FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
FF000000FF000000FF000000FF00000000000000000000000000008000000080
0000008000000080000000800000008000000080000000800000008000000080
0000008000000080000000800000000000000000000000000000000000000000
00000000000000000000007F7F0000FFFF0000FFFF00007F7F00000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000FFFF0000FFFF0000FFFF0000FFFF00000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000
00000000000000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF000000
0000000000000000000000000000000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF000000000000000000000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF000000000000000000000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF000000000000000000000000000000000000000000000000000000
000000000000007F7F0000FFFF0000FFFF0000FFFF0000FFFF00007F7F000000
0000000000000000000000000000000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF0000000000C0C0C000000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF0000000000C0C0C000000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF0000000000C0C0C000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000008080000080
8000000000000000000000000000000000000000000000000000C0C0C000C0C0
C000000000000080800000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF000000000000000000000000000000000000000000008080000080
8000008080000080800000808000008080000080800000808000008080000000
0000000000000000000000000000000000000000000000000000008080000080
8000000000000000000000000000000000000000000000000000C0C0C000C0C0
C000000000000080800000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF000000000000000000000000000000000000FFFF00000000000080
8000008080000080800000808000008080000080800000808000008080000080
8000000000000000000000000000000000000000000000000000008080000080
8000000000000000000000000000000000000000000000000000C0C0C000C0C0
C000000000000080800000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF0000000000000000000000000000000000FFFFFF0000FFFF000000
0000008080000080800000808000008080000080800000808000008080000080
8000008080000000000000000000000000000000000000000000008080000080
8000000000000000000000000000000000000000000000000000000000000000
0000000000000080800000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF000000000000000000000000000000000000FFFF00FFFFFF0000FF
FF00000000000080800000808000008080000080800000808000008080000080
8000008080000080800000000000000000000000000000000000008080000080
8000008080000080800000808000008080000080800000808000008080000080
8000008080000080800000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF0000000000000000000000000000000000FFFFFF0000FFFF00FFFF
FF0000FFFF000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000008080000080
8000000000000000000000000000000000000000000000000000000000000000
0000008080000080800000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF000000000000000000000000000000000000FFFF00FFFFFF0000FF
FF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00000000000000
0000000000000000000000000000000000000000000000000000008080000000
0000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0
C000000000000080800000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF0000000000000000000000000000000000FFFFFF0000FFFF00FFFF
FF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF00000000000000
0000000000000000000000000000000000000000000000000000008080000000
0000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0
C000000000000080800000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF000000000000000000000000000000000000FFFF00FFFFFF0000FF
FF00000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000008080000000
0000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0
C000000000000080800000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000008080000000
0000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0
C000000000000080800000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000FFFF
FF00000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000008080000000
0000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0
C000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000008080000000
0000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0
C00000000000C0C0C00000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000424D3E000000000000003E000000
2800000040000000300000000100010000000000800100000000000000000000
000000000000000000000000FFFFFF0000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000F81FE000E000E000E007E000E000E000
C003E000E000E000800180000000800080018000000080000000800000008000
0000800000008000000080000000800000008000000080000000800000008000
000080000000800080018000000080008001E000E000E000C003E000E000E000
E007E001E001E001F81FE003E003E003FFFFFFFFFFFFFFFFFFFFFFFFC001FFFF
E003001F8001FFFFE003000F8001FFFFE00300078001FDFFE00300038001FCFF
E00300018001FC7FE00300008001FC3FE003001F8001FC1FE003001F8001FC3F
E003001F8001FC7FE0038FF18001FCFFE007FFF98001FDFFE00FFF758001FFFF
E01FFF8F8001FFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000
000000000000}
end
object dlgSaveExe: TSaveDialog
DefaultExt = '.exe'
Filter = 'Executable files (*.exe)|*.exe|All files (*.*)|*.*'
Options = [ofOverwritePrompt, ofHideReadOnly, ofPathMustExist, ofNoReadOnlyReturn, ofNoDereferenceLinks, ofEnableSizing, ofDontAddToRecent]
Left = 384
Top = 56
end
object dlgSaveDLL: TSaveDialog
DefaultExt = '.dll'
Filter = 'DLL files (*.dll)|*.dll|All files (*.*)|*.*'
Options = [ofOverwritePrompt, ofHideReadOnly, ofPathMustExist, ofNoReadOnlyReturn, ofNoDereferenceLinks, ofEnableSizing, ofDontAddToRecent]
Left = 416
Top = 56
end
object dlgSavePAT: TSaveDialog
DefaultExt = '.pat'
Filter = 'Patch files (*.pat)|*.pat|All files (*.*)|*.*'
Options = [ofOverwritePrompt, ofHideReadOnly, ofPathMustExist, ofNoReadOnlyReturn, ofNoDereferenceLinks, ofEnableSizing, ofDontAddToRecent]
Left = 448
Top = 56
end
end

View file

@ -0,0 +1,539 @@
unit MainForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Buttons, StdCtrls, Menus, PatchClasses, VirtualTrees, VDSP_CRC,
ToolWin, ComCtrls, ImgList, ExtCtrls, PatchGenerator, Math;
const
UntitledFile='Untitled.vpj';
type
TfrmMain = class(TForm)
MainMenu: TMainMenu;
mnuFile: TMenuItem;
mnuNew: TMenuItem;
mnuOpen: TMenuItem;
mnuSave: TMenuItem;
mnuSaveas: TMenuItem;
N1: TMenuItem;
mnuExit: TMenuItem;
Label1: TLabel;
grpConfig: TGroupBox;
butAdd: TSpeedButton;
OD: TOpenDialog;
Label2: TLabel;
txtNew: TEdit;
Label3: TLabel;
mnuHelp: TMenuItem;
mnuAbout: TMenuItem;
lstOld: TListBox;
butOldAdd: TSpeedButton;
butOldRemove: TSpeedButton;
butNewEdit: TSpeedButton;
Label4: TLabel;
lstNew: TVirtualStringTree;
dlgOpen: TOpenDialog;
dlgSave: TSaveDialog;
IL: TImageList;
mnuAction: TMenuItem;
mnuGenGo: TMenuItem;
barTool: TToolBar;
toolNew: TToolButton;
toolOpen: TToolButton;
toolSave: TToolButton;
toolGenGo: TToolButton;
mnuCreateEXE: TMenuItem;
dlgSaveExe: TSaveDialog;
toolCreateEXE: TToolButton;
barCool: TCoolBar;
Label5: TLabel;
Label6: TLabel;
txtMinimumBlockSize: TEdit;
UDMinimumBlockSize: TUpDown;
UDBlockDivider: TUpDown;
txtBlockDivider: TEdit;
Label7: TLabel;
UDStepSize: TUpDown;
txtStepSize: TEdit;
Label8: TLabel;
chkDebug: TCheckBox;
tbBlockSize: TTrackBar;
txtStartBlockSize: TLabel;
mnuClearcachedpatches: TMenuItem;
mnuCreateDLL: TMenuItem;
mnuCreatePAT: TMenuItem;
toolCreateDLL: TToolButton;
ToolButton1: TToolButton;
toolCreatePAT: TToolButton;
dlgSaveDLL: TSaveDialog;
dlgSavePAT: TSaveDialog;
procedure butAddClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure mnuExitClick(Sender: TObject);
procedure UpdateStates;
procedure ReloadNewTree;
procedure SelectInNewTree(PatchIndex: Integer);
procedure butNewEditClick(Sender: TObject);
procedure lstNewChange(Sender: TBaseVirtualTree; Node: PVirtualNode);
procedure butOldAddClick(Sender: TObject);
procedure butOldRemoveClick(Sender: TObject);
procedure mnuNewClick(Sender: TObject);
procedure mnuOpenClick(Sender: TObject);
procedure mnuSaveClick(Sender: TObject);
procedure mnuSaveasClick(Sender: TObject);
procedure mnuGenGoClick(Sender: TObject);
procedure mnuAboutClick(Sender: TObject);
procedure mnuCreateEXEClick(Sender: TObject);
procedure lstNewGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType;
var CellText: WideString);
procedure txtStartBlockSizeChange(Sender: TObject);
procedure txtMinimumBlockSizeChange(Sender: TObject);
procedure txtBlockDividerChange(Sender: TObject);
procedure txtStepSizeChange(Sender: TObject);
procedure chkDebugClick(Sender: TObject);
procedure tbBlockSizeChange(Sender: TObject);
procedure mnuClearcachedpatchesClick(Sender: TObject);
procedure mnuCreateDLLClick(Sender: TObject);
procedure mnuCreatePATClick(Sender: TObject);
private
{ Private declarations }
// MS: TModeSelector;
dskName: String;
function DoSave(const FileName: String; const Prompt: Boolean): String;
procedure OpenAFile(FileName: String; AskSave: Boolean=True; PromptNew: Boolean=False);
function CollectConfig: String;
procedure SetConfigTextBoxes(Config: String);
procedure PrintDebug(S: String);
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
PP: TPatchProject = nil;
implementation
uses AboutForm;
{$R *.dfm}
procedure TfrmMain.butAddClick(Sender: TObject);
begin
OD.Options:=OD.Options-[ofAllowMultiSelect];
OD.Title:='Open the latest (new) version of a file...';
OD.FileName:='';
if OD.Execute then begin
PP.AddNewVersion(OD.FileName);
ReloadNewTree;
SelectInNewTree(PP.PatchFile(OD.FileName).Index);
butOldAdd.Click;
end;
end;
procedure TfrmMain.FormCreate(Sender: TObject);
begin
grpConfig.Tag:=-1;
dskName:=UntitledFile;
lstNew.NodeDataSize:=SizeOf(Integer);
OpenAFile('',False,False); //don't prompt for New! that'll bug things
ReloadNewTree;
UpdateStates;
end;
procedure TfrmMain.FormDestroy(Sender: TObject);
begin
PP.Free;
end;
procedure TfrmMain.mnuExitClick(Sender: TObject);
begin
Close;
end;
procedure TfrmMain.UpdateStates;
begin
Self.Caption:='VG - VPatch GUI - '+dskName;
// grpConfig.Enabled:=not (lstNew.Tag=-1);
// if not grpConfig.Enabled then grpConfig.Caption:='Select a file first';
grpConfig.Enabled:=(lstNew.SelectedCount>0);
if grpConfig.Tag=-1 then begin
txtNew.Enabled:=False;
butNewEdit.Enabled:=False;
butNewEdit.Font.Color:=clInactiveCaption;
butOldAdd.Enabled:=False;
butOldAdd.Font.Color:=clInactiveCaption;
butOldRemove.Enabled:=False;
butOldRemove.Font.Color:=clInactiveCaption;
end else begin
txtNew.Enabled:=True;
butNewEdit.Enabled:=True;
butNewEdit.Font.Color:=clWindowText;
butOldAdd.Enabled:=True;
butOldAdd.Font.Color:=clWindowText;
// butOldEdit.Enabled:=True;
butOldRemove.Enabled:=True;
butOldRemove.Font.Color:=clWindowText;
end;
end;
procedure TfrmMain.ReloadNewTree;
var
i: Integer;
Node: PVirtualNode;
begin
lstNew.BeginUpdate;
lstNew.Clear;
for i:=0 to PP.GetPatchCount - 1 do begin
Node:=lstNew.AddChild(nil);
PInteger(lstNew.GetNodeData(Node))^:=i;
end;
lstNew.EndUpdate;
end;
procedure TfrmMain.butNewEditClick(Sender: TObject);
var
i: Integer;
begin
OD.Options:=OD.Options-[ofAllowMultiSelect];
OD.Title:='Select new version of file...';
OD.FileName:=txtNew.Text;
if OD.Execute then begin
i:=grpConfig.Tag;
PP.PatchFile(i).NewVersion:=OD.FileName;
ReloadNewTree;
lstNew.Selected[lstNew.GetFirstVisible]:=True;
end;
end;
procedure TfrmMain.lstNewChange(Sender: TBaseVirtualTree;
Node: PVirtualNode);
var
i,j: Integer;
begin
case lstNew.SelectedCount of
0: Exit;
1: begin
if lstNew.Selected[Node] then begin
i:=PInteger(lstNew.GetNodeData(Node))^;
grpConfig.Caption:=ExtractFileName(PP.PatchFile(i).NewVersion);
grpConfig.Tag:=i;
txtNew.Text:=PP.PatchFile(i).NewVersion;
lstOld.Clear;
for j:=0 to PP.PatchFile(i).OldVersionCount - 1 do begin
lstOld.Items.Add(PP.PatchFile(i).OldVersions[j]);
end;
SetConfigTextBoxes(PP.PatchFile(i).Config);
end;
end;
else begin
grpConfig.Tag:=-1; //multiple files selected - only allow config changes
txtNew.Text:='(multiple files selected)';
lstOld.Clear;
end;
end;
UpdateStates;
end;
procedure TfrmMain.butOldAddClick(Sender: TObject);
var
i,j: Integer;
begin
OD.Options:=OD.Options+[ofAllowMultiSelect];
OD.Title:='Select old versions of '+grpConfig.Caption+'...';
OD.FileName:='';
if OD.Execute then begin
i:=grpConfig.Tag;
for j:=0 to OD.Files.Count - 1 do begin
PP.PatchFile(i).AddOldVersion(OD.Files[j]);
lstOld.Items.Add(OD.Files.Strings[j]);
end;
end;
end;
procedure TfrmMain.SelectInNewTree(PatchIndex: Integer);
var
Node: PVirtualNode;
begin
Node:=lstNew.GetFirstSelected;
while Node<>nil do begin
lstNew.Selected[Node]:=False;
Node:=lstNew.GetNextSelected(Node);
end;
Node:=lstNew.GetFirst;
while Node<>nil do begin
if PInteger(lstNew.GetNodeData(Node))^=PatchIndex then begin
lstNew.Selected[Node]:=True;
lstNewChange(lstNew,Node);
Exit;
end;
Node:=lstNew.GetNext(Node);
end;
end;
procedure TfrmMain.butOldRemoveClick(Sender: TObject);
begin
if lstOld.ItemIndex>=0 then begin
PP.PatchFile(grpConfig.Tag).RemoveOldVersion(lstOld.ItemIndex);
lstOld.Items.Delete(lstOld.ItemIndex);
end;
end;
procedure TfrmMain.OpenAFile(FileName: String; AskSave: Boolean=True; PromptNew: Boolean=False);
var
fs: TFileStream;
begin
PP.Free; //confirm saving first?
PP:=TPatchProject.Create;
ReloadNewTree;
if FileName<>'' then begin
fs:=nil;
try
fs:=TFileStream.Create(FileName,fmOpenRead);
PP.LoadFromStream(fs);
finally
dskName:=FileName;
ReloadNewTree;
fs.Free;
end;
end else begin
dskName:=UntitledFile;
if PromptNew then butAddClick(Self);
end;
UpdateStates;
end;
procedure TfrmMain.mnuNewClick(Sender: TObject);
begin
OpenAFile('',True,True);
end;
procedure TfrmMain.mnuOpenClick(Sender: TObject);
begin
if dlgOpen.Execute then begin
OpenAFile(dlgOpen.FileName,True);
end;
end;
procedure TfrmMain.mnuSaveClick(Sender: TObject);
begin
dskName:=DoSave(dskName,False);
UpdateStates;
end;
procedure TfrmMain.mnuSaveasClick(Sender: TObject);
begin
dskName:=DoSave(dskName,True);
UpdateStates;
end;
function TfrmMain.DoSave(const FileName: String; const Prompt: Boolean): String;
var
FN: String;
fs: TFileStream;
begin
DoSave:='';
FN:=FileName;
if Prompt or (CompareText(FileName,UntitledFile)=0) then begin
if dlgSave.Execute then begin
FN:=dlgSave.FileName;
if ExtractFileExt(FN)='' then
FN:=FN+'.vpj';
end else begin
DoSave:=FileName;
Exit;
end;
end;
//do actual saving to this file...
fs:=TFileStream.Create(FN,fmCreate);
PP.SaveToStream(fs);
fs.Free;
DoSave:=FN;
end;
procedure TfrmMain.mnuGenGoClick(Sender: TObject);
begin
Self.Visible:=False;
Cursor:=crHourGlass;
PP.Generate;
Cursor:=crDefault;
Self.Visible:=True;
SelectInNewTree(0);
end;
procedure TfrmMain.mnuAboutClick(Sender: TObject);
var
frmAbout: TfrmAbout;
begin
frmAbout:=TfrmAbout.Create(Self);
frmAbout.ShowModal;
frmAbout.Free;
end;
procedure TfrmMain.mnuCreateEXEClick(Sender: TObject);
var
fs: TFileStream;
fr: TFileStream;
begin
//first, select it on disk (where should the exe go?)
if dlgSaveExe.FileName='' then dlgSaveExe.FileName:='VPatch.exe';
if dlgSaveExe.Execute then begin
fs:=nil;
try
fs:=TFileStream.Create(dlgSaveExe.FileName,fmCreate);
fr:=nil;
try
fr:=TFileStream.Create(ExtractFilePath(Application.ExeName)+'vpatch.bin',fmOpenRead);
fs.CopyFrom(fr,fr.Size);
finally
fr.Free;
end;
PP.WritePatches(fs);
finally
fs.Free;
end;
end;
end;
procedure TfrmMain.mnuCreateDLLClick(Sender: TObject);
var
fs: TFileStream;
fr: TFileStream;
begin
//first, select it on disk (where should the exe go?)
if dlgSaveDLL.FileName='' then dlgSaveDLL.FileName:='VPatch.DLL';
if dlgSaveDLL.Execute then begin
fs:=nil;
try
fs:=TFileStream.Create(dlgSaveDLL.FileName,fmCreate);
fr:=nil;
try
fr:=TFileStream.Create(ExtractFilePath(Application.ExeName)+'vpatchdll.bin',fmOpenRead);
fs.CopyFrom(fr,fr.Size);
finally
fr.Free;
end;
PP.WritePatches(fs);
finally
fs.Free;
end;
end;
end;
procedure TfrmMain.mnuCreatePATClick(Sender: TObject);
var
fs: TFileStream;
begin
//first, select it on disk (where should the exe go?)
if dlgSavePAT.FileName='' then dlgSavePAT.FileName:='PatchData.pat';
if dlgSavePAT.Execute then begin
fs:=nil;
try
fs:=TFileStream.Create(dlgSavePAT.FileName,fmCreate);
PP.WritePatches(fs);
finally
fs.Free;
end;
end;
end;
procedure TfrmMain.lstNewGetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
var CellText: WideString);
var
i: Integer;
begin
i:=PInteger(lstNew.GetNodeData(Node))^;
CellText:=ExtractFileName(PP.PatchFile(i).NewVersion);
end;
procedure TfrmMain.txtStartBlockSizeChange(Sender: TObject);
begin
PP.PatchFile(grpConfig.Tag).Config:=CollectConfig;
end;
function TfrmMain.CollectConfig: String;
begin
Result:=txtStartBlockSize.Caption+','+txtMinimumBlockSize.Text+','+txtBlockDivider.Text+','+txtStepSize.Text;
end;
procedure TfrmMain.txtMinimumBlockSizeChange(Sender: TObject);
begin
PP.PatchFile(grpConfig.Tag).Config:=CollectConfig;
end;
procedure TfrmMain.txtBlockDividerChange(Sender: TObject);
begin
PP.PatchFile(grpConfig.Tag).Config:=CollectConfig;
end;
procedure TfrmMain.txtStepSizeChange(Sender: TObject);
begin
PP.PatchFile(grpConfig.Tag).Config:=CollectConfig;
end;
procedure TfrmMain.SetConfigTextBoxes(Config: String);
var
a,i: Integer;
begin
a:=Pos(',',Config);
if(a=0) then a:=Length(Config)+1;
txtStartBlockSize.Caption:=Copy(Config,1,a-1);
Config:=Copy(Config,a+1,Length(Config));
a:=StrToInt(txtStartBlockSize.Caption);
i:=-1;
while not (a=0) do begin
a:=a shr 1;
Inc(i);
end;
tbBlockSize.Position := i;
a:=Pos(',',Config);
if(a=0) then a:=Length(Config)+1;
txtMinimumBlockSize.Text:=Copy(Config,1,a-1);
Config:=Copy(Config,a+1,Length(Config));
a:=Pos(',',Config);
if(a=0) then a:=Length(Config)+1;
txtBlockDivider.Text:=Copy(Config,1,a-1);
Config:=Copy(Config,a+1,Length(Config));
a:=Pos(',',Config);
if(a=0) then a:=Length(Config)+1;
txtStepSize.Text:=Copy(Config,1,a-1);
end;
procedure TfrmMain.chkDebugClick(Sender: TObject);
begin
if chkDebug.State = cbUnchecked then
PatchGenerator.DebugEvent:=nil
else
PatchGenerator.DebugEvent:=PrintDebug;
end;
procedure TfrmMain.PrintDebug(S: String);
begin
WriteLn(S);
end;
procedure TfrmMain.tbBlockSizeChange(Sender: TObject);
begin
txtStartBlockSize.Caption:=IntToStr(1 shl tbBlockSize.Position);
PP.PatchFile(grpConfig.Tag).Config:=CollectConfig;
end;
procedure TfrmMain.mnuClearcachedpatchesClick(Sender: TObject);
begin
PP.ResetCache;
end;
initialization
PP:=TPatchProject.Create;
end.

View file

@ -0,0 +1,548 @@
unit PatchClasses;
interface
uses Classes, sysutils, VDSP_CRC, DLLWrapper, Dialogs;
const
DEFAULT_CONFIG = '64,64,2,32';
type
TAbstractFile = record
FileName: String;
FriendlyName: String;
CRC32: LongWord; //the longword/integer sign is going to give problems again...
Size: Integer;
//not sure about this one yet...
Cached: Boolean; //True: we have cached the patch, using latest config
//False: a) we have nothing cached (size and start are -1)
// b) we still have cache (start>0 and size too), but it's not generated using the latest config (we can keep it of course because the new config might be worse)
Cache: TMemoryStream;
end;
TPatchFile = class (TObject)
private
FIndex: Integer;
ConfigID: String;
FNew: TAbstractFile;
FOld: Array of TAbstractFile;
protected
procedure SetNewFN(Value: String);
function GetNewFN: String;
procedure SetOldFN(i: Integer; FileName: String);
function GetOldFN(Index: Integer): String;
function GetOldVersionCount: Integer;
procedure ResetCache; overload;
procedure ResetCache(OldIndex: Integer); overload;
procedure InvalidateCache; overload;
procedure InvalidateCache(Index: Integer); overload;
function GetCached(Index: Integer): Boolean;
function GetConfig: String;
procedure SetConfig(Value: String);
public
constructor Create(Index: Integer; FileName: String); overload;
constructor Create(Index: Integer; Stream: TStream); overload;
destructor Destroy(); override;
procedure AddOldVersion(const FileName: String);
procedure RemoveOldVersion(const Index: Integer);
property OldVersions[Index: Integer]: String read GetOldFN write SetOldFN;
procedure Generate; overload;
procedure Generate(const Index: Integer); overload;
property Generated[Index: Integer]: Boolean read GetCached;
function GetPatchSize(Index: Integer): Integer;
procedure WritePatch(Index: Integer; Stream: TStream);
// LoadFromStream not supported: Use Create(Index,Stream) instead!
// procedure LoadFromStream(Stream: TStream);
procedure SaveToStream(Stream: TStream);
published
property NewVersion: String read GetNewFN write SetNewFN;
property OldVersionCount: Integer read GetOldVersionCount;
property Index: Integer read FIndex;
property Config: String read GetConfig write SetConfig;
end;
TPatchProject = class (TObject)
private
FPat: Array of TPatchFile;
public
procedure LoadFromStream(Stream: TStream);
procedure SaveToStream(Stream: TStream);
constructor Create();
destructor Destroy(); override;
procedure AddNewVersion(FileName: String);
function PatchFile(FileName: String): TPatchFile; overload;
function PatchFile(Index: Integer): TPatchFile; overload;
function GetPatchCount: Integer;
procedure WritePatches(Stream: TStream);
procedure Generate;
procedure ResetCache;
end;
implementation
function ReadStreamString(Stream: TStream): String;
var
Buf: Array[0..512] of Char;
i: LongInt;
S: String;
j: Integer;
begin
Stream.Read(i,SizeOf(i));
if i>512 then raise Exception.Create('VPJ damaged: String too long (>512)');
Stream.Read(Buf,i);
for j:=1 to i do
S:=S+Buf[j-1];
ReadStreamString:=S;
end;
//a private wrapper for the FileCRC function
function CalcCRC(FileName: String): Integer;
var
fs: TFileStream;
begin
CalcCRC:=0;
fs:=nil;
try
fs:=TFileStream.Create(FileName,fmOpenRead);
CalcCRC:=FileCRC(fs);
finally
fs.Free;
end;
end;
function GetFileSize(FileName: String): Integer;
var
fs: TFileStream;
begin
GetFileSize:=0;
fs:=nil;
try
fs:=TFileStream.Create(FileName,fmOpenRead);
GetFileSize:=fs.Size;
finally
fs.Free;
end;
end;
{ TPatchFile }
procedure TPatchFile.AddOldVersion(const FileName: String);
var
i: Integer;
// fs: TFileStream;
begin
i:=Length(FOld);
SetLength(FOld,i+1);
FOld[i].Cache:=TMemoryStream.Create;
SetOldFN(i,FileName);
end;
constructor TPatchFile.Create(Index: Integer; FileName: String);
//var
// fs: TFileStream;
begin
inherited Create();
FIndex:=Index;
SetLength(FOld,0);
FNew.CRC32:=0;
FNew.Size:=-1;
SetNewFN(FileName);
ConfigID:=DEFAULT_CONFIG;
//just to be on the safe side
//following is now done by SetNewFN :)
//no it's not - because that one resets the cache!!!
//doesn't matter, because we're not loading from stream!!!
{ FNew.FileName:=FileName;
FNew.FriendlyName:=ExtractFileName(FileName);
FNew.CRC32:=CalcCRC(FileName);
FNew.Size:=GetFileSize(FileName);}
end;
constructor TPatchFile.Create(Index: Integer; Stream: TStream);
var
i,q: LongInt;
CSize: Integer;
j: Integer;
begin
inherited Create();
FIndex:=Index;
SetLength(FOld,0);
FNew.CRC32:=0;
FNew.Size:=-1; //just to be on the safe side
//read configuration
ConfigID:=ReadStreamString(Stream);
//now load everything...
FNew.FileName:=ReadStreamString(Stream);
FNew.FriendlyName:=ReadStreamString(Stream);
Stream.Read(FNew.CRC32,SizeOf(FNew.CRC32));
Stream.Read(FNew.Size,SizeOf(FNew.Size));
Stream.Read(i,SizeOf(i));
SetLength(FOld,i);
for j:=0 to i - 1 do begin
FOld[j].FileName:=ReadStreamString(Stream);
FOld[j].FriendlyName:=ReadStreamString(Stream);
Stream.Read(FOld[j].CRC32,SizeOf(FOld[j].CRC32));
Stream.Read(FOld[j].Size,SizeOf(FOld[j].Size));
Stream.Read(q,SizeOf(q));
FOld[j].Cached:=not (q=0);
if FOld[j].Cached then begin
Stream.Read(CSize,SizeOf(CSize));
FOld[j].Cache:=TMemoryStream.Create;
FOld[j].Cache.CopyFrom(Stream,CSize);
end;
end;
end;
destructor TPatchFile.Destroy;
begin
SetLength(FOld,0);
inherited;
end;
function TPatchFile.GetNewFN: String;
begin
GetNewFN:=FNew.FileName;
end;
function TPatchFile.GetOldFN(Index: Integer): String;
begin
Result:=FOld[Index].FileName;
if FOld[Index].Cached then
if FOld[Index].Cache.Size>0 then begin
Result:=Result + ' ('+IntToStr(FOld[Index].Cache.Size)+' bytes)';
end;
end;
function TPatchFile.GetOldVersionCount: Integer;
begin
GetOldVersionCount:=Length(FOld);
end;
procedure TPatchFile.ResetCache;
var
i: Integer;
begin
for i:=0 to Length(FOld)-1 do
ResetCache(i);
end;
procedure TPatchFile.RemoveOldVersion(const Index: Integer);
var
i: Integer;
begin
FOld[Index].Cache.Free;
for i:=Index to Length(FOld)-2 do begin
FOld[i]:=FOld[i+1];
end;
SetLength(FOld,Length(FOld)-1);
end;
procedure TPatchFile.ResetCache(OldIndex: Integer);
begin
FOld[OldIndex].Cached:=False;
FOld[OldIndex].Size:=-1;
FOld[OldIndex].Cache.Clear;
end;
procedure TPatchFile.SaveToStream(Stream: TStream);
procedure WriteStreamString(Stream: TStream; const S: String);
var
i: LongInt;
j: Integer;
Buf: Array[0..512] of Char;
begin
i:=Length(S);
Stream.Write(i,SizeOf(i));
for j:=1 to i do
Buf[j-1]:=S[j];
Buf[i]:=#0;
Stream.Write(Buf,i);
end;
var
i,q: LongInt;
j: Integer;
tmp: Integer;
begin
//write config ID
WriteStreamString(Stream,ConfigID);
WriteStreamString(Stream,FNew.FileName);
WriteStreamString(Stream,FNew.FriendlyName);
Stream.Write(FNew.CRC32,SizeOf(FNew.CRC32));
Stream.Write(FNew.Size,SizeOf(FNew.Size));
i:=Length(FOld);
Stream.Write(i,SizeOf(i));
for j:=0 to i - 1 do begin
WriteStreamString(Stream,FOld[j].FileName);
WriteStreamString(Stream,FOld[j].FriendlyName);
Stream.Write(FOld[j].CRC32,SizeOf(FOld[j].CRC32));
Stream.Write(FOld[j].Size,SizeOf(FOld[j].Size));
if FOld[j].Cached then q:=1 else q:=0;
Stream.Write(q,SizeOf(q));
if FOld[j].Cached then begin
tmp:=FOld[j].Cache.Size;
Stream.Write(tmp,SizeOf(tmp));
FOld[j].Cache.Seek(0,soFromBeginning);
Stream.CopyFrom(FOld[j].Cache,tmp);
end;
end;
end;
procedure TPatchFile.SetNewFN(Value: String);
var
NewSize: Integer;
NewCRC: LongWord;
begin
FNew.FileName:=Value;
FNew.Friendlyname:=ExtractFileName(Value);
NewCRC:=CalcCRC(Value);
NewSize:=GetFileSize(Value);
//if any changes, then reset cache :)
if not ((FNew.CRC32=NewCRC) and (FNew.Size=NewSize)) then begin
FNew.CRC32:=NewCRC;
FNew.Size:=NewSize;
ResetCache;
end;
end;
procedure TPatchFile.SetOldFN(i: Integer; FileName: String);
begin
if((i>=0) and (i<Length(FOld))) then begin
FOld[i].FileName:=FileName;
FOld[i].FriendlyName:=ExtractFileName(FileName);
FOld[i].CRC32:=CalcCRC(FileName);
FOld[i].Size:=GetFileSize(FileName);
ResetCache(i);
end;
end;
procedure TPatchFile.Generate;
var
i: Integer;
begin
//generate all of them into the cache?
for i:=0 to OldVersionCount - 1 do
Generate(i);
end;
procedure TPatchFile.Generate(const Index: Integer);
var
Size: Integer;
fm: TMemoryStream;
begin
fm:=TMemoryStream.Create;
Size:=DoGenerate(FOld[Index].FileName,FNew.FileName,fm,ConfigID);
if not (Size=-1) then begin
if (FOld[Index].Cache.Size>Size) or (not FOld[Index].Cached) then begin //the new one is better
FOld[Index].Cache.Clear;
fm.Seek(8,soFromBeginning);
FOld[Index].Cache.CopyFrom(fm,fm.Size-8);
end;
FOld[Index].Cached:=True;
end;
fm.Free;
end;
function TPatchFile.GetCached(Index: Integer): Boolean;
begin
GetCached:=FOld[Index].Cached;
end;
function TPatchFile.GetConfig: String;
begin
GetConfig:=ConfigID;
end;
procedure TPatchFile.SetConfig(Value: String);
begin
if not Assigned(Self) then Exit;
if not SameText(Value,ConfigID) then begin
InvalidateCache; //configuration changed, invalidate cache
end;
ConfigID:=Value;
end;
function TPatchFile.GetPatchSize(Index: Integer): Integer;
begin
if Generated[Index] then begin
GetPatchSize:=FOld[Index].Cache.Size;
end else
GetPatchSize:=-1;
end;
procedure TPatchFile.InvalidateCache;
var
i: Integer;
begin
for i:=0 to Length(FOld)-1 do
InvalidateCache(i);
end;
procedure TPatchFile.InvalidateCache(Index: Integer);
begin
FOld[Index].Cached:=False;
end;
procedure TPatchFile.WritePatch(Index: Integer; Stream: TStream);
begin
if not FOld[Index].Cached then
Generate(Index);
if not FOld[Index].Cached then
raise Exception.Create('Writing of patch failed: Could not generate all patches');
FOld[Index].Cache.Seek(0,soFromBeginning);
Stream.CopyFrom(FOld[Index].Cache,FOld[Index].Cache.Size);
end;
{ TPatchProject }
procedure TPatchProject.AddNewVersion(FileName: String);
var
i: Integer;
begin
i:=Length(FPat);
SetLength(FPat,i+1);
FPat[i]:=TPatchFile.Create(i,FileName);
FPat[i].SetConfig(DEFAULT_CONFIG);
end;
constructor TPatchProject.Create;
begin
inherited;
SetLength(FPat,0);
end;
destructor TPatchProject.Destroy;
var
i: Integer;
begin
for i:=0 to Length(FPat)-1 do begin
FPat[i].Free;
end;
SetLength(FPat,0);
inherited;
end;
procedure TPatchProject.Generate;
var
i: Integer;
begin
for i:=0 to GetPatchCount - 1 do
FPat[i].Generate;
end;
function TPatchProject.GetPatchCount: Integer;
begin
GetPatchCount:=Length(FPat);
end;
procedure TPatchProject.LoadFromStream(Stream: TStream);
var
i: LongInt;
j: Integer;
begin
//first free all patchfiles
for j:=0 to Length(FPat)-1 do begin
FPat[j].Free;
FPat[j]:=nil;
end;
Stream.Read(i,SizeOf(i));
if(i=$1A4A5056) then begin //still read old files
Stream.Read(i,SizeOf(i)); //16 dummy bytes
Stream.Read(i,SizeOf(i));
Stream.Read(i,SizeOf(i));
Stream.Read(i,SizeOf(i));
Stream.Read(i,SizeOf(i));
end;
SetLength(FPat,i);
for j:=0 to i - 1 do begin
FPat[j]:=TPatchFile.Create(j,Stream);
end;
end;
function TPatchProject.PatchFile(FileName: String): TPatchFile;
var
i: Integer;
begin
PatchFile:=nil;
for i:=0 to Length(FPat) - 1 do begin
if(CompareText(FPat[i].FNew.FileName,FileName)=0) then begin
PatchFile:=FPat[i];
end;
end;
for i:=0 to Length(FPat) - 1 do begin
if(CompareText(FPat[i].FNew.FriendlyName,FileName)=0) then begin
PatchFile:=FPat[i];
end;
end;
end;
function TPatchProject.PatchFile(Index: Integer): TPatchFile;
begin
if (Index<Length(FPat)) and (Index>=0) then
PatchFile:=FPat[Index]
else
PatchFile:=nil;
end;
procedure TPatchProject.ResetCache;
var
i: Integer;
begin
for i:=0 to Pred(Length(FPat)) do
FPat[i].ResetCache;
end;
procedure TPatchProject.SaveToStream(Stream: TStream);
var
HeadID: Array[0..3] of Char;
i: LongInt;
j: Integer;
begin
HeadID:='VPJ'+#26;
Stream.Write(HeadID,SizeOf(HeadID));
//16 dummy bytes
i:=0;
Stream.Write(i,SizeOf(i));
Stream.Write(i,SizeOf(i));
Stream.Write(i,SizeOf(i));
Stream.Write(i,SizeOf(i));
i:=Length(FPat);
Stream.Write(i,SizeOf(i));
for j:=0 to i - 1 do begin
FPat[j].SaveToStream(Stream);
end;
end;
procedure TPatchProject.WritePatches(Stream: TStream);
var
i,j,k,o: LongInt;
begin
k:=$54415056;
o:=Stream.Position;
Stream.Write(k,SizeOf(k));
k:=0;
Stream.Write(k,SizeOf(k));
k:=0;
for i:=0 to Length(FPat)-1 do begin
for j:=0 to FPat[i].GetOldVersionCount - 1 do begin
FPat[i].WritePatch(j,Stream);
Inc(k);
end;
end;
Stream.Seek(o+4,soFromBeginning);
Stream.Write(k,SizeOf(k));
Stream.Seek(Stream.Size,soFromBeginning);
Stream.Write(o,SizeOf(o));
end;
end.

View file

@ -0,0 +1,102 @@
object frmProg: TfrmProg
Left = 328
Top = 266
BorderIcons = [biSystemMenu, biMinimize]
BorderStyle = bsSingle
Caption = 'Progress...'
ClientHeight = 193
ClientWidth = 385
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Position = poScreenCenter
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object lblStatus: TLabel
Left = 8
Top = 8
Width = 369
Height = 17
AutoSize = False
Transparent = True
end
object lblSize: TLabel
Left = 152
Top = 8
Width = 225
Height = 17
Alignment = taRightJustify
AutoSize = False
Transparent = True
end
object lblFile: TLabel
Left = 8
Top = 48
Width = 369
Height = 17
AutoSize = False
Caption = '(filename)'
end
object lblNewFile: TLabel
Left = 8
Top = 96
Width = 369
Height = 17
AutoSize = False
Caption = '(filename)'
end
object lblTotal: TLabel
Left = 8
Top = 144
Width = 369
Height = 17
AutoSize = False
Caption = 'Total progress'
end
object shpFull: TShape
Left = 8
Top = 24
Width = 369
Height = 17
Brush.Color = clGray
end
object shpLeft: TShape
Left = 8
Top = 24
Width = 369
Height = 17
Brush.Color = clRed
end
object prgFile: TProgressBar
Left = 8
Top = 64
Width = 369
Height = 25
Min = 0
Max = 100
TabOrder = 0
end
object prgNewFile: TProgressBar
Left = 8
Top = 112
Width = 369
Height = 25
Min = 0
Max = 100
TabOrder = 1
end
object prgAll: TProgressBar
Left = 8
Top = 160
Width = 369
Height = 25
Min = 0
Max = 100
TabOrder = 2
end
end

View file

@ -0,0 +1,74 @@
unit ProgressForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ExtCtrls, Math;
type
TfrmProg = class(TForm)
prgFile: TProgressBar;
lblFile: TLabel;
lblNewFile: TLabel;
prgNewFile: TProgressBar;
lblTotal: TLabel;
prgAll: TProgressBar;
lblStatus: TLabel;
shpFull: TShape;
shpLeft: TShape;
lblSize: TLabel;
procedure GetStatusProc(S: PChar; Point, Total,
CurrentSavings: Integer); stdcall;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
FilePos,FileRange,AllPos,AllRange: Byte;
CTotal: Integer;
t2: TDateTime;
end;
var
frmProg: TfrmProg;
implementation
{$R *.dfm}
procedure TfrmProg.GetStatusProc(S: PChar; Point, Total, CurrentSavings: Integer); stdcall;
var
a,b: Integer;
j: Single;
begin
if Length(S)>0 then
lblStatus.Caption:=S;
if (Total<0) then begin
Total:=CTotal;
if (Now-t2)*24*3600*10<8 then Exit; //update only every 800 milliseconds
end;
if (Total>=0) then CTotal:=Total;
if (Total>=0) and (Point>=0) then begin
a:=(Point*100) div Total;
prgFile.Position:=a;
b:=FilePos+(a*FileRange) div 100;
prgNewFile.Position:=b;
prgAll.Position:=AllPos+(b*AllRange) div 100;
end;
if (CurrentSavings>=0) and (Total>=0) then begin
j:=(Total-CurrentSavings)*shpFull.Width/Total;
shpLeft.Width:=Max(Round(j),3);
lblSize.Caption:=IntToStr(Total-CurrentSavings)+' of '+IntToStr(Total)+' ('+IntToStr(CurrentSavings*100 div Total)+'%)';
end;
Refresh;
t2:=Now;
end;
procedure TfrmProg.FormCreate(Sender: TObject);
begin
FilePos:=0; FileRange:=100; AllPos:=0; AllRange:=100; CTotal:=-1;
t2:=0;
end;
end.

View file

@ -0,0 +1,87 @@
[FileVersion]
Version=6.0
[Compiler]
A=8
B=0
C=1
D=1
E=0
F=0
G=1
H=1
I=1
J=0
K=0
L=1
M=0
N=1
O=1
P=1
Q=0
R=0
S=0
T=0
U=0
V=1
W=0
X=1
Y=1
Z=1
ShowHints=1
ShowWarnings=1
UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
[Linker]
MapFile=0
OutputObjs=0
ConsoleApp=0
DebugInfo=0
RemoteSymbols=0
MinStackSize=16384
MaxStackSize=1048576
ImageBase=4194304
ExeDescription=
[Directories]
OutputDir=
UnitOutputDir=
PackageDLLOutputDir=
PackageDCPOutputDir=
SearchPath=
Packages=vcl;rtl;dbrtl;adortl;vcldb;vclx;bdertl;vcldbx;ibxpress;dsnap;cds;bdecds;qrpt;teeui;teedb;tee;dss;teeqr;visualclx;visualdbclx;dsnapcrba;dsnapcon;VclSmp;vclshlctrls;vclie;xmlrtl;inet;inetdbbde;inetdbxpress;nmfast;webdsnap;websnap;dbexpress;dbxcds;indy;dclOffice2k;VirtualTreesD6;packageTib;inetdb
Conditionals=
DebugSourceDirs=
UsePackages=0
[Parameters]
RunParams=
HostApplication=
Launcher=
UseLauncher=0
DebugCWD=
[Language]
ActiveLang=
ProjectLang=
RootDir=
[Version Info]
IncludeVerInfo=1
AutoIncBuild=1
MajorVer=2
MinorVer=0
Release=0
Build=10
Debug=0
PreRelease=0
Special=0
Private=0
DLL=0
Locale=1043
CodePage=1252
[Version Info Keys]
CompanyName=Van de Sande Productions
FileDescription=VG - VPatch GUI
FileVersion=2.0.0.10
InternalName=VPatchGUI
LegalCopyright=
LegalTrademarks=
OriginalFilename=
ProductName=
ProductVersion=2.0 final
Comments=

View file

@ -0,0 +1,19 @@
program VPatchGUI;
uses
Forms,
MainForm in 'MainForm.pas' {frmMain},
PatchClasses in 'PatchClasses.pas',
VDSP_CRC in '..\VDSP_CRC.pas',
DLLWrapper in 'DLLWrapper.pas',
AboutForm in 'AboutForm.pas' {frmAbout},
PatchGenerator in '..\PatchGenerator.pas',
TreeCode in '..\TreeCode.pas';
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TfrmMain, frmMain);
Application.Run;
end.

Binary file not shown.