| 1 | unit UProject;
|
|---|
| 2 |
|
|---|
| 3 | {$mode delphi}
|
|---|
| 4 |
|
|---|
| 5 | interface
|
|---|
| 6 |
|
|---|
| 7 | uses
|
|---|
| 8 | Classes, SysUtils, Contnrs, DOM, XMLRead, XMLWrite, UXMLUtils, UDriveScan,
|
|---|
| 9 | UPhysDrive;
|
|---|
| 10 |
|
|---|
| 11 | type
|
|---|
| 12 |
|
|---|
| 13 | { TProject }
|
|---|
| 14 |
|
|---|
| 15 | TProject = class
|
|---|
| 16 | private
|
|---|
| 17 | FCurrentScan: TDriveScan;
|
|---|
| 18 | function GetCurrentScan: TDriveScan;
|
|---|
| 19 | function GetSectorCount: Integer;
|
|---|
| 20 | public
|
|---|
| 21 | Name: string;
|
|---|
| 22 | FileName: string;
|
|---|
| 23 | Modified: Boolean;
|
|---|
| 24 | Scans: TDriveScanList;
|
|---|
| 25 | DriveInfo: TDriveInfo;
|
|---|
| 26 | ScanProfile: TDriveScanProfile;
|
|---|
| 27 | constructor Create;
|
|---|
| 28 | destructor Destroy; override;
|
|---|
| 29 | procedure LoadFromFile(FileName: string);
|
|---|
| 30 | procedure SaveToFile(FileName: string);
|
|---|
| 31 | property SectorCount: Integer read GetSectorCount;
|
|---|
| 32 | property CurrentScan: TDriveScan read FCurrentScan write FCurrentScan;
|
|---|
| 33 | end;
|
|---|
| 34 |
|
|---|
| 35 |
|
|---|
| 36 | implementation
|
|---|
| 37 |
|
|---|
| 38 | resourcestring
|
|---|
| 39 | SWrongFileFormat = 'Wrong file format';
|
|---|
| 40 |
|
|---|
| 41 |
|
|---|
| 42 | { TProject }
|
|---|
| 43 |
|
|---|
| 44 | function TProject.GetCurrentScan: TDriveScan;
|
|---|
| 45 | begin
|
|---|
| 46 | if Scans.Count > 0 then Result := TDriveScan(Scans[Scans.Count - 1])
|
|---|
| 47 | else Result := nil;
|
|---|
| 48 | end;
|
|---|
| 49 |
|
|---|
| 50 | function TProject.GetSectorCount: Integer;
|
|---|
| 51 | begin
|
|---|
| 52 | Result := DriveInfo.SectorCount;
|
|---|
| 53 | end;
|
|---|
| 54 |
|
|---|
| 55 | constructor TProject.Create;
|
|---|
| 56 | begin
|
|---|
| 57 | Scans := TDriveScanList.Create;
|
|---|
| 58 | DriveInfo := TDriveInfo.Create;
|
|---|
| 59 | ScanProfile := TDriveScanProfile.Create;
|
|---|
| 60 | end;
|
|---|
| 61 |
|
|---|
| 62 | destructor TProject.Destroy;
|
|---|
| 63 | begin
|
|---|
| 64 | FreeAndNil(ScanProfile);
|
|---|
| 65 | FreeAndNil(DriveInfo);
|
|---|
| 66 | FreeAndNil(Scans);
|
|---|
| 67 | inherited Destroy;
|
|---|
| 68 | end;
|
|---|
| 69 |
|
|---|
| 70 | procedure TProject.SaveToFile(FileName: string);
|
|---|
| 71 | var
|
|---|
| 72 | NewNode: TDOMNode;
|
|---|
| 73 | Doc: TXMLDocument;
|
|---|
| 74 | RootNode: TDOMNode;
|
|---|
| 75 | begin
|
|---|
| 76 | Self.FileName := FileName;
|
|---|
| 77 | Doc := TXMLDocument.Create;
|
|---|
| 78 | with Doc do try
|
|---|
| 79 | RootNode := CreateElement('CoolDiskProject');
|
|---|
| 80 | AppendChild(RootNode);
|
|---|
| 81 | with RootNode do begin
|
|---|
| 82 | WriteInteger(RootNode, 'SectorCount', DriveInfo.SectorCount);
|
|---|
| 83 | WriteInteger(RootNode, 'SectorSize', DriveInfo.SectorSize);
|
|---|
| 84 | WriteString(RootNode, 'DriveName', DriveInfo.Model);
|
|---|
| 85 | WriteString(RootNode, 'DrivePath', DriveInfo.Path);
|
|---|
| 86 | WriteInt64(RootNode, 'DriveSize', DriveInfo.Size);
|
|---|
| 87 |
|
|---|
| 88 | NewNode := OwnerDocument.CreateElement('ScanProfile');
|
|---|
| 89 | AppendChild(NewNode);
|
|---|
| 90 | WriteInteger(NewNode, 'SectorStart', ScanProfile.SectorStart);
|
|---|
| 91 | WriteInteger(NewNode, 'SectorEnd', ScanProfile.SectorEnd);
|
|---|
| 92 | WriteInteger(NewNode, 'WritePattern', ScanProfile.WritePattern);
|
|---|
| 93 | WriteInteger(NewNode, 'Mode', Integer(ScanProfile.Mode));
|
|---|
| 94 |
|
|---|
| 95 | NewNode := OwnerDocument.CreateElement('Scans');
|
|---|
| 96 | AppendChild(NewNode);
|
|---|
| 97 | Scans.SaveToNode(NewNode);
|
|---|
| 98 | end;
|
|---|
| 99 | ForceDirectories(ExtractFileDir(FileName));
|
|---|
| 100 | WriteXMLFile(Doc, FileName);
|
|---|
| 101 | finally
|
|---|
| 102 | Doc.Free;
|
|---|
| 103 | end;
|
|---|
| 104 | Modified := False;
|
|---|
| 105 | end;
|
|---|
| 106 |
|
|---|
| 107 | procedure TProject.LoadFromFile(FileName: string);
|
|---|
| 108 | var
|
|---|
| 109 | Doc: TXMLDocument;
|
|---|
| 110 | RootNode: TDOMNode;
|
|---|
| 111 | NewNode: TDOMNode;
|
|---|
| 112 | begin
|
|---|
| 113 | Modified := False;
|
|---|
| 114 | Self.FileName := FileName;
|
|---|
| 115 | ReadXMLFile(Doc, FileName);
|
|---|
| 116 | with Doc do try
|
|---|
| 117 | if Doc.DocumentElement.NodeName <> 'CoolDiskProject' then
|
|---|
| 118 | raise Exception.Create(SWrongFileFormat);
|
|---|
| 119 | RootNode := Doc.DocumentElement;
|
|---|
| 120 | with RootNode do begin
|
|---|
| 121 | DriveInfo.SectorSize := ReadInteger(RootNode, 'SectorSize', 4096);
|
|---|
| 122 | ScanProfile.SectorCount := DriveInfo.SectorCount;
|
|---|
| 123 | DriveInfo.Model := ReadString(RootNode, 'DriveName', '');
|
|---|
| 124 | DriveInfo.Path := ReadString(RootNode, 'DrivePath', '');
|
|---|
| 125 | DriveInfo.Size := ReadInt64(RootNode, 'DriveSize', 0);
|
|---|
| 126 |
|
|---|
| 127 | NewNode := FindNode('ScanProfile');
|
|---|
| 128 | if Assigned(NewNode) then begin
|
|---|
| 129 | ScanProfile.SectorStart := ReadInteger(NewNode, 'SectorStart', 0);
|
|---|
| 130 | ScanProfile.SectorEnd := ReadInteger(NewNode, 'SectorEnd', ScanProfile.SectorCount - 1);
|
|---|
| 131 | ScanProfile.WritePattern := ReadInteger(NewNode, 'WritePattern', 0);
|
|---|
| 132 | ScanProfile.Mode := TRunMode(ReadInteger(NewNode, 'Mode', 0));
|
|---|
| 133 | end;
|
|---|
| 134 |
|
|---|
| 135 | NewNode := FindNode('Scans');
|
|---|
| 136 | if Assigned(NewNode) then
|
|---|
| 137 | Scans.LoadFromNode(NewNode);
|
|---|
| 138 | end;
|
|---|
| 139 | finally
|
|---|
| 140 | Doc.Free;
|
|---|
| 141 | end;
|
|---|
| 142 | end;
|
|---|
| 143 |
|
|---|
| 144 |
|
|---|
| 145 | end.
|
|---|
| 146 |
|
|---|