10 EBinSizeError
= Class (Exception
);
12 TBinMemoryWriter
= Class (TObject
)
18 Procedure WriteVar(Var x
; varSize
: Cardinal);
19 Procedure ExtendMemory(addLen
: Cardinal);
22 Constructor Create(aSize
: Cardinal);
23 Destructor Destroy(); Override;
24 Procedure WriteByte(Var x
: Byte);
25 Procedure WriteWord(Var x
: Word);
26 Procedure WriteDWORD(Var x
: DWORD
);
27 Procedure WriteShortInt(Var x
: ShortInt);
28 Procedure WriteSmallInt(Var x
: SmallInt);
29 Procedure WriteInt(Var x
: Integer);
30 Procedure WriteSingle(Var x
: Single);
31 Procedure WriteBoolean(Var x
: Boolean);
32 Procedure WriteString(Var x
: String; aMaxLen
: Byte = 255);
33 Procedure WriteMemory(Var x
: Pointer; memSize
: Cardinal);
34 Procedure Fill(aLen
: Cardinal; aFillSym
: Byte);
35 Procedure SaveToFile(Var aFile
: File);
36 Procedure SaveToMemory(Var aMem
: TBinMemoryWriter
);
39 TBinMemoryReader
= Class (TObject
)
45 Procedure ReadVar(Var x
; varSize
: Cardinal);
49 Destructor Destroy(); Override;
50 Procedure ReadByte(Var x
: Byte);
51 Procedure ReadWord(Var x
: Word);
52 Procedure ReadDWORD(Var x
: DWORD
);
53 Procedure ReadShortInt(Var x
: ShortInt);
54 Procedure ReadSmallInt(Var x
: SmallInt);
55 Procedure ReadInt(Var x
: Integer);
56 Procedure ReadSingle(Var x
: Single);
57 Procedure ReadBoolean(Var x
: Boolean);
58 Procedure ReadString(Var x
: String);
59 Procedure ReadMemory(Var x
: Pointer; Var memSize
: Cardinal);
60 Procedure Skip(aLen
: Cardinal);
61 Procedure LoadFromFile(Var aFile
: File);
62 Procedure LoadFromMemory(Var aMem
: TBinMemoryReader
);
65 TBinFileWriter
= Class (TObject
)
72 Destructor Destroy(); Override;
73 Procedure OpenFile(Const aFileName
: String;
76 aOverWrite
: Boolean = True);
78 Procedure WriteMemory(Var aMemory
: TBinMemoryWriter
);
81 TBinFileReader
= Class (TObject
)
88 Destructor Destroy(); Override;
89 Function OpenFile(Const aFileName
: String;
91 aFileVer
: Byte): Boolean;
93 Procedure ReadMemory(Var aMemory
: TBinMemoryReader
);
96 procedure FillMemory(Dest
: Pointer; Len
: Cardinal; Ch
: Byte);
97 procedure CopyMemory(Dest
: Pointer; Src
: Pointer; Len
: Cardinal);
98 procedure ZeroMemory(Dest
: Pointer; Len
: Cardinal);
106 MAX_BIN_SIZE
= 4 * 1024 * 1024; // 4 MB
108 procedure CopyMemory(Dest
: Pointer; Src
: Pointer; Len
: Cardinal);
110 Move(Src
^, Dest
^, Len
);
113 procedure FillMemory(Dest
: Pointer; Len
: Cardinal; Ch
: Byte);
115 FillChar(Dest
^, Len
, Ch
);
118 procedure ZeroMemory(Dest
: Pointer; Len
: Cardinal);
120 FillChar(Dest
^, Len
, 0);
123 { T B i n M e m o r y W r i t e r : }
125 Constructor TBinMemoryWriter
.Create(aSize
: Cardinal);
131 if FSize
> MAX_BIN_SIZE
then
132 FSize
:= MAX_BIN_SIZE
;
134 GetMem(FData
, FSize
);
138 Destructor TBinMemoryWriter
.Destroy();
149 Procedure TBinMemoryWriter
.WriteVar(Var x
; varSize
: Cardinal);
151 if (FPosition
+ varSize
) > FSize
then
152 ExtendMemory(varSize
);
154 CopyMemory(Pointer(Cardinal(FData
) + FPosition
),
156 FPosition
:= FPosition
+ varSize
;
159 Procedure TBinMemoryWriter
.ExtendMemory(addLen
: Cardinal);
164 while ((FPosition
+ addLen
) > FSize
) and
165 (FSize
<= MAX_BIN_SIZE
) do
168 if FSize
> MAX_BIN_SIZE
then
170 raise EBinSizeError
.Create('TBinMemoryWriter.ExtendMemory: Tried to allocete more than 4 MB');
176 if FPosition
> 0 then
177 CopyMemory(tmp
, FData
, FPosition
);
182 e_WriteLog('Save Memory Extended: '+IntToStr(FSize
), MSG_NOTIFY
);
185 Procedure TBinMemoryWriter
.WriteByte(Var x
: Byte);
187 WriteVar(x
, SizeOf(Byte));
190 Procedure TBinMemoryWriter
.WriteWord(Var x
: Word);
192 WriteVar(x
, SizeOf(Word));
195 Procedure TBinMemoryWriter
.WriteDWORD(Var x
: DWORD
);
197 WriteVar(x
, SizeOf(DWORD
));
200 Procedure TBinMemoryWriter
.WriteShortInt(Var x
: ShortInt);
202 WriteVar(x
, SizeOf(ShortInt));
205 Procedure TBinMemoryWriter
.WriteSmallInt(Var x
: SmallInt);
207 WriteVar(x
, SizeOf(SmallInt));
210 Procedure TBinMemoryWriter
.WriteInt(Var x
: Integer);
212 WriteVar(x
, SizeOf(Integer));
215 Procedure TBinMemoryWriter
.WriteSingle(Var x
: Single);
217 WriteVar(x
, SizeOf(Single));
220 Procedure TBinMemoryWriter
.WriteBoolean(Var x
: Boolean);
230 WriteVar(y
, SizeOf(Byte));
233 Procedure TBinMemoryWriter
.WriteString(Var x
: String; aMaxLen
: Byte = 255);
238 len
:= Min(Length(x
), aMaxLen
);
240 if (FPosition
+ SizeOf(Byte) + len
) > FSize
then
241 ExtendMemory(SizeOf(Byte) + len
);
244 CopyMemory(Pointer(Cardinal(FData
) + FPosition
),
246 FPosition
:= FPosition
+ SizeOf(Byte);
250 CopyMemory(Pointer(Cardinal(FData
) + FPosition
),
252 FPosition
:= FPosition
+ len
;
256 Procedure TBinMemoryWriter
.WriteMemory(Var x
: Pointer; memSize
: Cardinal);
258 if (FPosition
+ SizeOf(Cardinal) + memSize
) > FSize
then
259 ExtendMemory(SizeOf(Cardinal) + memSize
);
261 // Äëèíà áëîêà ïàìÿòè:
262 CopyMemory(Pointer(Cardinal(FData
) + FPosition
),
263 @memSize
, SizeOf(Cardinal));
264 FPosition
:= FPosition
+ SizeOf(Cardinal);
268 CopyMemory(Pointer(Cardinal(FData
) + FPosition
),
270 FPosition
:= FPosition
+ memSize
;
274 Procedure TBinMemoryWriter
.Fill(aLen
: Cardinal; aFillSym
: Byte);
276 if (FPosition
+ aLen
) > FSize
then
281 FillMemory(Pointer(Cardinal(FData
) + FPosition
),
283 FPosition
:= FPosition
+ aLen
;
287 Procedure TBinMemoryWriter
.SaveToFile(Var aFile
: File);
293 BlockWrite(aFile
, FPosition
, SizeOf(Cardinal), nw
);
294 if nw
<> SizeOf(Cardinal) then
296 raise EInOutError
.Create('TBinMemoryWriter.SaveToFile: Writing Length');
301 BlockWrite(aFile
, FData
^, FPosition
, nw
);
302 if nw
<> FPosition
then
304 raise EInOutError
.Create('TBinMemoryWriter.SaveToFile: Writing Data');
309 Procedure TBinMemoryWriter
.SaveToMemory(Var aMem
: TBinMemoryWriter
);
313 aMem
.WriteMemory(FData
, FPosition
);
317 { T B i n M e m o r y R e a d e r : }
319 Constructor TBinMemoryReader
.Create();
326 Destructor TBinMemoryReader
.Destroy();
337 Procedure TBinMemoryReader
.ReadVar(Var x
; varSize
: Cardinal);
339 if (FPosition
+ varSize
) <= FSize
then
342 Pointer(Cardinal(FData
) + FPosition
),
344 FPosition
:= FPosition
+ varSize
;
347 raise EBinSizeError
.Create('TBinMemoryReader.ReadVar: End of Memory');
350 Procedure TBinMemoryReader
.ReadByte(Var x
: Byte);
352 ReadVar(x
, SizeOf(Byte));
355 Procedure TBinMemoryReader
.ReadWord(Var x
: Word);
357 ReadVar(x
, SizeOf(Word));
360 Procedure TBinMemoryReader
.ReadDWORD(Var x
: DWORD
);
362 ReadVar(x
, SizeOf(DWORD
));
365 Procedure TBinMemoryReader
.ReadShortInt(Var x
: ShortInt);
367 ReadVar(x
, SizeOf(ShortInt));
370 Procedure TBinMemoryReader
.ReadSmallInt(Var x
: SmallInt);
372 ReadVar(x
, SizeOf(SmallInt));
375 Procedure TBinMemoryReader
.ReadInt(Var x
: Integer);
377 ReadVar(x
, SizeOf(Integer));
380 Procedure TBinMemoryReader
.ReadSingle(Var x
: Single);
382 ReadVar(x
, SizeOf(Single));
385 Procedure TBinMemoryReader
.ReadBoolean(Var x
: Boolean);
390 ReadVar(y
, SizeOf(Byte));
398 Procedure TBinMemoryReader
.ReadString(Var x
: String);
403 if (FPosition
+ SizeOf(Byte)) <= FSize
then
407 Pointer(Cardinal(FData
) + FPosition
),
410 if (FPosition
+ SizeOf(Byte) + len
) <= FSize
then
412 FPosition
:= FPosition
+ SizeOf(Byte);
418 Pointer(Cardinal(FData
) + FPosition
),
420 FPosition
:= FPosition
+ len
;
426 raise EBinSizeError
.Create('TBinMemoryReader.ReadString: Too Long String');
429 raise EBinSizeError
.Create('TBinMemoryReader.ReadString: End of Memory');
432 Procedure TBinMemoryReader
.ReadMemory(Var x
: Pointer; Var memSize
: Cardinal);
434 if (FPosition
+ SizeOf(Cardinal)) <= FSize
then
436 // Äëèíà áëîêà ïàìÿòè:
438 Pointer(Cardinal(FData
) + FPosition
),
441 if (FPosition
+ SizeOf(Cardinal) + memSize
) <= FSize
then
443 FPosition
:= FPosition
+ SizeOf(Cardinal);
449 Pointer(Cardinal(FData
) + FPosition
),
451 FPosition
:= FPosition
+ memSize
;
457 raise EBinSizeError
.Create('TBinMemoryReader.ReadMemory: Too Long Memory');
460 raise EBinSizeError
.Create('TBinMemoryReader.ReadMemory: End of Memory');
463 Procedure TBinMemoryReader
.Skip(aLen
: Cardinal);
465 if (FPosition
+ aLen
) <= FSize
then
467 FPosition
:= FPosition
+ aLen
;
470 raise EBinSizeError
.Create('TBinMemoryReader.Skip: End of Memory');
473 Procedure TBinMemoryReader
.LoadFromFile(Var aFile
: File);
483 BlockRead(aFile
, aSize
, SizeOf(Cardinal), nr
);
484 if nr
<> SizeOf(Cardinal) then
486 raise EInOutError
.Create('TBinMemoryReader.LoadFromFile: Reading Length');
491 GetMem(FData
, FSize
);
494 BlockRead(aFile
, FData
^, FSize
, nr
);
497 raise EInOutError
.Create('TBinMemoryReader.LoadFromFile: Reading Data');
502 Procedure TBinMemoryReader
.LoadFromMemory(Var aMem
: TBinMemoryReader
);
509 aMem
.ReadMemory(FData
, FSize
);
514 { T B i n F i l e W r i t e r : }
516 Constructor TBinFileWriter
.Create();
521 Destructor TBinFileWriter
.Destroy();
528 Procedure TBinFileWriter
.OpenFile(Const aFileName
: String;
531 aOverWrite
: Boolean = True);
538 if (not FileExists(aFileName
)) or (aOverWrite
) then
540 AssignFile(FHandle
, aFileName
);
544 BlockWrite(FHandle
, aFileSig
, SizeOf(Cardinal), nw
);
545 if nw
<> SizeOf(Cardinal) then
547 raise EInOutError
.Create('TBinFileWriter.OpenFile: Writing File Signature');
552 BlockWrite(FHandle
, aFileVer
, SizeOf(Byte), nw
);
553 if nw
<> SizeOf(Byte) then
555 raise EInOutError
.Create('TBinFileWriter.OpenFile: Writing File Version');
565 Procedure TBinFileWriter
.Close();
569 System
.Close(FHandle
);
574 Procedure TBinFileWriter
.WriteMemory(Var aMemory
: TBinMemoryWriter
);
576 if (FOpened
) and (aMemory
<> nil) then
578 aMemory
.SaveToFile(FHandle
);
582 { T B i n F i l e R e a d e r : }
584 Constructor TBinFileReader
.Create();
589 Destructor TBinFileReader
.Destroy();
596 Function TBinFileReader
.OpenFile(Const aFileName
: String;
598 aFileVer
: Byte): Boolean;
609 if FileExists(aFileName
) then
611 AssignFile(FHandle
, aFileName
);
615 BlockRead(FHandle
, sig
, SizeOf(Cardinal), nr
);
616 if (nr
<> SizeOf(Cardinal)) then
618 raise EInOutError
.Create('TBinFileReader.OpenFile: Reading File Signature');
621 if (sig
<> aFileSig
) then
623 raise EInOutError
.Create('TBinFileReader.OpenFile: Wrong File Signature');
628 BlockRead(FHandle
, ver
, SizeOf(Byte), nr
);
629 if (nr
<> SizeOf(Byte)) then
631 raise EInOutError
.Create('TBinFileReader.OpenFile: Reading File Version');
634 if (ver
<> aFileVer
) then
636 raise EInOutError
.Create('TBinFileReader.OpenFile: Wrong File Version');
647 Procedure TBinFileReader
.Close();
651 System
.Close(FHandle
);
656 Procedure TBinFileReader
.ReadMemory(Var aMemory
: TBinMemoryReader
);
658 if (FOpened
) and (aMemory
<> nil) then
660 aMemory
.LoadFromFile(FHandle
);