mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-06-10 07:58:13 +02:00
improved DefineProperties to read/write endian independent
git-svn-id: trunk@5790 -
This commit is contained in:
parent
05cae27203
commit
2d80b0247f
@ -37,9 +37,10 @@ unit ComCtrls;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
SysUtils, Classes, Math, FPCAdds, LCLStrConsts, LCLIntf, LCLType, LCLProc,
|
SysUtils, Classes, Math, FPCAdds, LCLStrConsts, LResources, LCLIntf, LCLType,
|
||||||
AvgLvlTree, vclGlobals, LMessages, ImgList, ActnList, GraphType, Graphics,
|
LCLProc, AvgLvlTree, vclGlobals, LMessages, ImgList, ActnList, GraphType,
|
||||||
Menus, Controls, Forms, StdCtrls, ExtCtrls, ToolWin, CommCtrl, Buttons;
|
Graphics, Menus, Controls, Forms, StdCtrls, ExtCtrls, ToolWin, CommCtrl,
|
||||||
|
Buttons;
|
||||||
|
|
||||||
type
|
type
|
||||||
TStatusPanelStyle = (psText, psOwnerDraw);
|
TStatusPanelStyle = (psText, psOwnerDraw);
|
||||||
@ -2306,6 +2307,9 @@ end.
|
|||||||
{ =============================================================================
|
{ =============================================================================
|
||||||
|
|
||||||
$Log$
|
$Log$
|
||||||
|
Revision 1.142 2004/08/15 17:00:58 mattias
|
||||||
|
improved DefineProperties to read/write endian independent
|
||||||
|
|
||||||
Revision 1.141 2004/08/04 09:35:38 mattias
|
Revision 1.141 2004/08/04 09:35:38 mattias
|
||||||
implemented setting TTabSheet.TabIndex
|
implemented setting TTabSheet.TabIndex
|
||||||
|
|
||||||
|
@ -45,8 +45,8 @@ interface
|
|||||||
{$endif}
|
{$endif}
|
||||||
|
|
||||||
uses
|
uses
|
||||||
SysUtils, Classes, LCLStrConsts, LCLProc, Controls, Forms, StdCtrls,
|
SysUtils, Classes, LCLStrConsts, LCLProc, LResources, Controls, Forms,
|
||||||
vclGlobals, lMessages, GraphType, Graphics, LCLIntf, CustomTimer;
|
StdCtrls, vclGlobals, lMessages, GraphType, Graphics, LCLIntf, CustomTimer;
|
||||||
|
|
||||||
type
|
type
|
||||||
{ workaround problem with fcl }
|
{ workaround problem with fcl }
|
||||||
@ -967,6 +967,9 @@ end.
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
|
Revision 1.114 2004/08/15 17:00:58 mattias
|
||||||
|
improved DefineProperties to read/write endian independent
|
||||||
|
|
||||||
Revision 1.113 2004/08/04 09:57:17 mattias
|
Revision 1.113 2004/08/04 09:57:17 mattias
|
||||||
TStaticText.CanTab=false
|
TStaticText.CanTab=false
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ History
|
|||||||
- Add TCustomImageList.Assign()
|
- Add TCustomImageList.Assign()
|
||||||
- Add TCustomImageList.WriteData()
|
- Add TCustomImageList.WriteData()
|
||||||
- Add TCustomImageList.ReadData()
|
- Add TCustomImageList.ReadData()
|
||||||
- Add overrite TCustomImageList.DefineProperties()
|
- Add override TCustomImageList.DefineProperties()
|
||||||
Warning : the delphi or kylix format of datas is not compatible.
|
Warning : the delphi or kylix format of datas is not compatible.
|
||||||
- Modify Delete and Clear for preserve memory
|
- Modify Delete and Clear for preserve memory
|
||||||
}
|
}
|
||||||
@ -219,6 +219,9 @@ end.
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
|
Revision 1.23 2004/08/15 17:00:58 mattias
|
||||||
|
improved DefineProperties to read/write endian independent
|
||||||
|
|
||||||
Revision 1.22 2004/04/29 18:08:17 mattias
|
Revision 1.22 2004/04/29 18:08:17 mattias
|
||||||
fixed 1.0.10 compilation
|
fixed 1.0.10 compilation
|
||||||
|
|
||||||
|
@ -221,7 +221,7 @@ var
|
|||||||
i: Integer;
|
i: Integer;
|
||||||
v: Integer;
|
v: Integer;
|
||||||
begin
|
begin
|
||||||
Stream.ReadBuffer(ChecksCount, SizeOf(Integer));
|
ChecksCount:=ReadLRSInteger(Stream);
|
||||||
if ChecksCount>0 then begin
|
if ChecksCount>0 then begin
|
||||||
SetLength(Checks,ChecksCount);
|
SetLength(Checks,ChecksCount);
|
||||||
Stream.ReadBuffer(Checks[1], ChecksCount);
|
Stream.ReadBuffer(Checks[1], ChecksCount);
|
||||||
@ -241,7 +241,7 @@ var
|
|||||||
v: Integer;
|
v: Integer;
|
||||||
begin
|
begin
|
||||||
ChecksCount:=FItems.Count;
|
ChecksCount:=FItems.Count;
|
||||||
Stream.WriteBuffer(ChecksCount, SizeOf(Integer));
|
WriteLRSInteger(Stream,ChecksCount);
|
||||||
if ChecksCount>0 then begin
|
if ChecksCount>0 then begin
|
||||||
SetLength(Checks,ChecksCount);
|
SetLength(Checks,ChecksCount);
|
||||||
for i:=0 to ChecksCount-1 do begin
|
for i:=0 to ChecksCount-1 do begin
|
||||||
@ -278,6 +278,9 @@ end;
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
|
Revision 1.9 2004/08/15 17:00:58 mattias
|
||||||
|
improved DefineProperties to read/write endian independent
|
||||||
|
|
||||||
Revision 1.8 2004/07/16 21:49:00 mattias
|
Revision 1.8 2004/07/16 21:49:00 mattias
|
||||||
added RTTI controls
|
added RTTI controls
|
||||||
|
|
||||||
|
@ -792,7 +792,7 @@ begin
|
|||||||
AStream.Write(Signature,SizeOf(Signature));
|
AStream.Write(Signature,SizeOf(Signature));
|
||||||
|
|
||||||
//Count of image
|
//Count of image
|
||||||
AStream.WriteWord(Count);
|
WriteLRSWord(AStream,Count);
|
||||||
|
|
||||||
for i:=0 to Count-1 do
|
for i:=0 to Count-1 do
|
||||||
begin
|
begin
|
||||||
@ -805,9 +805,9 @@ begin
|
|||||||
AStream.Write(Signature,SizeOf(Signature));
|
AStream.Write(Signature,SizeOf(Signature));
|
||||||
|
|
||||||
//Count of image
|
//Count of image
|
||||||
AStream.WriteDWord(Count);
|
WriteLRSInteger(AStream,Count);
|
||||||
AStream.WriteDWord(Width);
|
WriteLRSInteger(AStream,Width);
|
||||||
AStream.WriteDWord(Height);
|
WriteLRSInteger(AStream,Height);
|
||||||
|
|
||||||
for i:=0 to Count-1 do
|
for i:=0 to Count-1 do
|
||||||
begin
|
begin
|
||||||
@ -842,7 +842,7 @@ var
|
|||||||
for i := 0 to NewCount - 1 do
|
for i := 0 to NewCount - 1 do
|
||||||
begin
|
begin
|
||||||
bmp := TBitMap.Create;
|
bmp := TBitMap.Create;
|
||||||
AStream.Read(Size, SizeOf(Size));
|
Size:=ReadLRSInteger(AStream);
|
||||||
bmp.ReadStream(AStream, True, Size);
|
bmp.ReadStream(AStream, True, Size);
|
||||||
bmp.Transparent := True;
|
bmp.Transparent := True;
|
||||||
AddDirect(bmp, nil);
|
AddDirect(bmp, nil);
|
||||||
@ -855,15 +855,15 @@ var
|
|||||||
bmp: TBitmap;
|
bmp: TBitmap;
|
||||||
begin
|
begin
|
||||||
//DebugLn('TCustomImageList.ReadData DoReadLaz2');
|
//DebugLn('TCustomImageList.ReadData DoReadLaz2');
|
||||||
NewCount := AStream.ReadDWord;
|
NewCount := ReadLRSCardinal(AStream);
|
||||||
Width := AStream.ReadDWord;
|
Width := ReadLRSCardinal(AStream);
|
||||||
Height := AStream.ReadDWord;
|
Height := ReadLRSCardinal(AStream);
|
||||||
//DebugLn('TCustomImageList.ReadData DoReadLaz2 NewCount=',NewCount,' Width=',Width,' Height=',Height);
|
//DebugLn('TCustomImageList.ReadData DoReadLaz2 NewCount=',NewCount,' Width=',Width,' Height=',Height);
|
||||||
for i := 0 to NewCount - 1 do
|
for i := 0 to NewCount - 1 do
|
||||||
begin
|
begin
|
||||||
bmp := TBitMap.Create;
|
bmp := TBitMap.Create;
|
||||||
//DebugLn('TCustomImageList.ReadData DoReadLaz2 i=',i,' ',AStream.Position);
|
//DebugLn('TCustomImageList.ReadData DoReadLaz2 i=',i,' ',AStream.Position);
|
||||||
AStream.Read(Size, SizeOf(Size));
|
Size:=ReadLRSCardinal(AStream);
|
||||||
//DebugLn('TCustomImageList.ReadData DoReadLaz2 Size=',Size,' ',AStream.Position);
|
//DebugLn('TCustomImageList.ReadData DoReadLaz2 Size=',Size,' ',AStream.Position);
|
||||||
bmp.ReadStream(AStream, True, Size);
|
bmp.ReadStream(AStream, True, Size);
|
||||||
AddDirect(bmp, nil);
|
AddDirect(bmp, nil);
|
||||||
@ -1004,17 +1004,17 @@ begin
|
|||||||
if Signature = SIG_D3
|
if Signature = SIG_D3
|
||||||
then begin
|
then begin
|
||||||
AStream.ReadWord; //Skip ?
|
AStream.ReadWord; //Skip ?
|
||||||
NewCount := AStream.ReadWord;
|
NewCount := ReadLRSWord(AStream);
|
||||||
//DebugLn('NewCount=',NewCount);
|
//DebugLn('NewCount=',NewCount);
|
||||||
AStream.ReadWord; //Skip Capacity
|
AStream.ReadWord; //Skip Capacity
|
||||||
AStream.ReadWord; //Skip Grow
|
AStream.ReadWord; //Skip Grow
|
||||||
FWidth := AStream.ReadWord;
|
FWidth := ReadLRSWord(AStream);
|
||||||
//DebugLn('NewWidth=',FWidth);
|
//DebugLn('NewWidth=',FWidth);
|
||||||
FHeight := AStream.ReadWord;
|
FHeight := ReadLRSWord(AStream);
|
||||||
//DebugLn('NewHeight=',FHeight);
|
//DebugLn('NewHeight=',FHeight);
|
||||||
FBKColor := TColor(AStream.ReadDWord);
|
FBKColor := TColor(ReadLRSInteger(AStream));
|
||||||
{$IFNDEF DisableFPImage}
|
{$IFNDEF DisableFPImage}
|
||||||
HasMask := (AStream.ReadWord and 1) = 1;
|
HasMask := (ReadLRSWord(AStream) and 1) = 1;
|
||||||
AStream.ReadDWord; //Skip ?
|
AStream.ReadDWord; //Skip ?
|
||||||
AStream.ReadDWord; //Skip ?
|
AStream.ReadDWord; //Skip ?
|
||||||
|
|
||||||
@ -1024,12 +1024,13 @@ begin
|
|||||||
else begin
|
else begin
|
||||||
// D2 has no signature, so restore original position
|
// D2 has no signature, so restore original position
|
||||||
AStream.Position := StreamPos;
|
AStream.Position := StreamPos;
|
||||||
AStream.ReadBuffer(Size, SizeOf(Size));
|
Size:=ReadLRSInteger(AStream);
|
||||||
AStream.ReadBuffer(NewCount, SizeOf(NewCount));
|
NewCount:=ReadLRSInteger(AStream);
|
||||||
|
|
||||||
{$IFNDEF DisableFPImage}
|
{$IFNDEF DisableFPImage}
|
||||||
ReadDelphiImageAndMask(false,NewCount);
|
ReadDelphiImageAndMask(false,NewCount);
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
AStream.Position := StreamPos+Size;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -1261,6 +1262,9 @@ end;
|
|||||||
{
|
{
|
||||||
|
|
||||||
$Log$
|
$Log$
|
||||||
|
Revision 1.40 2004/08/15 17:00:58 mattias
|
||||||
|
improved DefineProperties to read/write endian independent
|
||||||
|
|
||||||
Revision 1.39 2004/05/11 11:42:27 mattias
|
Revision 1.39 2004/05/11 11:42:27 mattias
|
||||||
replaced writeln by debugln
|
replaced writeln by debugln
|
||||||
|
|
||||||
|
@ -278,17 +278,25 @@ var
|
|||||||
begin
|
begin
|
||||||
Clear;
|
Clear;
|
||||||
//Flag:=False;
|
//Flag:=False;
|
||||||
Stream.ReadBuffer(Size, SizeOf(Integer));
|
Size:=ReadLRSInteger(Stream);
|
||||||
ItemHeader := AllocMem(Size);
|
ItemHeader := AllocMem(Size);
|
||||||
Owner.BeginUpdate;
|
Owner.BeginUpdate;
|
||||||
try
|
try
|
||||||
Stream.ReadBuffer(ItemHeader^.Count, Size - SizeOf(Integer));
|
ItemHeader^.Count:=ReadLRSInteger(Stream);
|
||||||
|
Stream.ReadBuffer(ItemHeader^.Items, Size - 8);
|
||||||
ItemInfo := @ItemHeader^.Items;
|
ItemInfo := @ItemHeader^.Items;
|
||||||
PStr := nil;
|
PStr := nil;
|
||||||
for I := 0 to ItemHeader^.Count - 1 do
|
for I := 0 to ItemHeader^.Count - 1 do
|
||||||
begin
|
begin
|
||||||
with Add do
|
with Add do
|
||||||
begin
|
begin
|
||||||
|
{$IFDEF Endian_BIG}
|
||||||
|
ReverseBytes(@ItemInfo^.ImageIndex,4);
|
||||||
|
ReverseBytes(@ItemInfo^.StateIndex,4);
|
||||||
|
ReverseBytes(@ItemInfo^.OverlayIndex,4);
|
||||||
|
ReverseBytes(@ItemInfo^.SubItemCount,4);
|
||||||
|
ReverseBytes(@ItemInfo^.Data,4);
|
||||||
|
{$ENDIF}
|
||||||
//Flag:=True;
|
//Flag:=True;
|
||||||
Caption := ItemInfo^.Caption;
|
Caption := ItemInfo^.Caption;
|
||||||
ImageIndex := ItemInfo^.ImageIndex;
|
ImageIndex := ItemInfo^.ImageIndex;
|
||||||
@ -317,6 +325,9 @@ begin
|
|||||||
then begin
|
then begin
|
||||||
for J := 0 to Item[I].SubItems.Count - 1 do
|
for J := 0 to Item[I].SubItems.Count - 1 do
|
||||||
begin
|
begin
|
||||||
|
{$ifdef Endian_Little}
|
||||||
|
ReverseBytes(@PInt,4);
|
||||||
|
{$endif}
|
||||||
Item[I].SubItemImages[J] := PInt^;
|
Item[I].SubItemImages[J] := PInt^;
|
||||||
Inc(PInt);
|
Inc(PInt);
|
||||||
end;
|
end;
|
||||||
@ -364,6 +375,10 @@ begin
|
|||||||
try
|
try
|
||||||
ItemHeader^.Size := Size;
|
ItemHeader^.Size := Size;
|
||||||
ItemHeader^.Count := Count;
|
ItemHeader^.Count := Count;
|
||||||
|
{$ifdef Endian_Little}
|
||||||
|
ReverseBytes(@ItemHeader^.Size,4);
|
||||||
|
ReverseBytes(@ItemHeader^.Count,4);
|
||||||
|
{$endif}
|
||||||
ItemInfo := @ItemHeader^.Items;
|
ItemInfo := @ItemHeader^.Items;
|
||||||
PStr := nil;
|
PStr := nil;
|
||||||
for I := 0 to Count - 1 do
|
for I := 0 to Count - 1 do
|
||||||
@ -372,10 +387,17 @@ begin
|
|||||||
begin
|
begin
|
||||||
ItemInfo^.Caption := Caption;
|
ItemInfo^.Caption := Caption;
|
||||||
ItemInfo^.ImageIndex := ImageIndex;
|
ItemInfo^.ImageIndex := ImageIndex;
|
||||||
ItemInfo^.OverlayIndex := -1 {OverlayIndex};
|
|
||||||
ItemInfo^.StateIndex := -1 {StateIndex};
|
ItemInfo^.StateIndex := -1 {StateIndex};
|
||||||
ItemInfo^.Data := Data;
|
ItemInfo^.OverlayIndex := -1 {OverlayIndex};
|
||||||
ItemInfo^.SubItemCount := SubItems.Count;
|
ItemInfo^.SubItemCount := SubItems.Count;
|
||||||
|
ItemInfo^.Data := Data;
|
||||||
|
{$IFDEF Endian_BIG}
|
||||||
|
ReverseBytes(@ItemInfo^.ImageIndex,4);
|
||||||
|
ReverseBytes(@ItemInfo^.StateIndex,4);
|
||||||
|
ReverseBytes(@ItemInfo^.OverlayIndex,4);
|
||||||
|
ReverseBytes(@ItemInfo^.SubItemCount,4);
|
||||||
|
ReverseBytes(@ItemInfo^.Data,4);
|
||||||
|
{$ENDIF}
|
||||||
PStr := @ItemInfo^.Caption;
|
PStr := @ItemInfo^.Caption;
|
||||||
Inc(Integer(PStr), Length(ItemInfo^.Caption) + 1);
|
Inc(Integer(PStr), Length(ItemInfo^.Caption) + 1);
|
||||||
Len := 0;
|
Len := 0;
|
||||||
@ -397,8 +419,11 @@ begin
|
|||||||
begin
|
begin
|
||||||
for J := 0 to Item[I].SubItems.Count - 1 do
|
for J := 0 to Item[I].SubItems.Count - 1 do
|
||||||
begin
|
begin
|
||||||
PInt^ := Item[I].SubItemImages[J];
|
PInt^ := Item[I].SubItemImages[J];
|
||||||
Inc(PInt);
|
{$ifdef Endian_Little}
|
||||||
|
ReverseBytes(@PInt,4);
|
||||||
|
{$endif}
|
||||||
|
Inc(PInt);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -411,6 +436,9 @@ end;
|
|||||||
{ =============================================================================
|
{ =============================================================================
|
||||||
|
|
||||||
$Log$
|
$Log$
|
||||||
|
Revision 1.24 2004/08/15 17:00:58 mattias
|
||||||
|
improved DefineProperties to read/write endian independent
|
||||||
|
|
||||||
Revision 1.23 2004/07/11 17:20:47 marc
|
Revision 1.23 2004/07/11 17:20:47 marc
|
||||||
* Implemented most of TListColoum/Item in the Ws for gtk and win32
|
* Implemented most of TListColoum/Item in the Ws for gtk and win32
|
||||||
|
|
||||||
|
@ -192,22 +192,59 @@ function FindLFMClassName(LFMStream: TStream):AnsiString;
|
|||||||
function CreateLFMFile(AComponent: TComponent; LFMStream: TStream): integer;
|
function CreateLFMFile(AComponent: TComponent; LFMStream: TStream): integer;
|
||||||
|
|
||||||
type
|
type
|
||||||
TDelphiStreamOriginalFormat = (sofUnknown, sofBinary, sofText);
|
TLRSStreamOriginalFormat = (sofUnknown, sofBinary, sofText);
|
||||||
|
|
||||||
procedure DelphiObjectBinaryToText(Input, Output: TStream);
|
procedure LRSObjectBinaryToText(Input, Output: TStream);
|
||||||
procedure DelphiObjectToText(Input, Output: TStream;
|
procedure LRSObjectToText(Input, Output: TStream;
|
||||||
var OriginalFormat: TDelphiStreamOriginalFormat);
|
var OriginalFormat: TLRSStreamOriginalFormat);
|
||||||
|
|
||||||
procedure DelphiObjectResourceToText(Input, Output: TStream);
|
procedure LRSObjectResourceToText(Input, Output: TStream);
|
||||||
procedure DelphiObjectResToText(Input, Output: TStream;
|
procedure LRSObjectResToText(Input, Output: TStream;
|
||||||
var OriginalFormat: TDelphiStreamOriginalFormat);
|
var OriginalFormat: TLRSStreamOriginalFormat);
|
||||||
|
|
||||||
function TestFormStreamFormat(Stream: TStream): TDelphiStreamOriginalFormat;
|
function TestFormStreamFormat(Stream: TStream): TLRSStreamOriginalFormat;
|
||||||
procedure FormDataToText(FormStream, TextStream: TStream);
|
procedure FormDataToText(FormStream, TextStream: TStream);
|
||||||
|
|
||||||
|
|
||||||
procedure ReverseBytes(p: Pointer; Count: integer);
|
procedure ReverseBytes(p: Pointer; Count: integer);
|
||||||
procedure ReverseByteOrderInWords(p: PWord; Count: integer);
|
procedure ReverseByteOrderInWords(p: PWord; Count: integer);
|
||||||
|
|
||||||
|
function ReadLRSWord(s: TStream): word;
|
||||||
|
function ReadLRSInteger(s: TStream): integer;
|
||||||
|
function ReadLRSCardinal(s: TStream): cardinal;
|
||||||
|
function ReadLRSInt64(s: TStream): int64;
|
||||||
|
function ReadLRSSingle(s: TStream): Single;
|
||||||
|
function ReadLRSDouble(s: TStream): Double;
|
||||||
|
function ReadLRSExtended(s: TStream): Extended;
|
||||||
|
{$ifdef HASCURRENCY}
|
||||||
|
function ReadLRSCurrency(s: TStream): Currency;
|
||||||
|
{$endif HASCURRENCY}
|
||||||
|
{$ifdef HASWIDESTRING}
|
||||||
|
function ReadLRSWideString(s: TStream): WideString;
|
||||||
|
{$endif HASWIDESTRING}
|
||||||
|
|
||||||
|
procedure WriteLRSWord(s: TStream; const w: word);
|
||||||
|
procedure WriteLRSInteger(s: TStream; const i: integer);
|
||||||
|
procedure WriteLRSCardinal(s: TStream; const c: cardinal);
|
||||||
|
procedure WriteLRSSingle(s: TStream; const si: Single);
|
||||||
|
procedure WriteLRSDouble(s: TStream; const d: Double);
|
||||||
|
procedure WriteLRSExtended(s: TStream; const e: extended);
|
||||||
|
procedure WriteLRSInt64(s: TStream; const i: int64);
|
||||||
|
{$ifdef HASCURRENCY}
|
||||||
|
procedure WriteLRSCurrency(s: TStream; const c: Currency);
|
||||||
|
{$endif HASCURRENCY}
|
||||||
|
{$ifdef HASWIDESTRING}
|
||||||
|
procedure WriteLRSWideStringContent(s: TStream; const w: WideString);
|
||||||
|
{$endif HASWIDESTRING}
|
||||||
|
|
||||||
|
procedure WriteLRSReversedWord(s: TStream; w: word);
|
||||||
|
procedure WriteLRS4BytesReversed(s: TStream; p: Pointer);
|
||||||
|
procedure WriteLRS8BytesReversed(s: TStream; p: Pointer);
|
||||||
|
procedure WriteLRS10BytesReversed(s: TStream; p: Pointer);
|
||||||
|
procedure WriteLRSNull(s: TStream; Count: integer);
|
||||||
|
procedure WriteLRSEndianBigDoubleAsEndianLittleExtended(s: TStream;
|
||||||
|
PPCDouble: PByte);
|
||||||
|
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
@ -1114,7 +1151,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure DelphiObjectBinaryToText(Input, Output: TStream);
|
procedure LRSObjectBinaryToText(Input, Output: TStream);
|
||||||
var
|
var
|
||||||
NestingLevel: Integer;
|
NestingLevel: Integer;
|
||||||
SaveSeparator: Char;
|
SaveSeparator: Char;
|
||||||
@ -1449,7 +1486,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TestFormStreamFormat(Stream: TStream): TDelphiStreamOriginalFormat;
|
function TestFormStreamFormat(Stream: TStream): TLRSStreamOriginalFormat;
|
||||||
var
|
var
|
||||||
Pos: TStreamSeekType;
|
Pos: TStreamSeekType;
|
||||||
Signature: Integer;
|
Signature: Integer;
|
||||||
@ -1470,8 +1507,8 @@ end;
|
|||||||
type
|
type
|
||||||
TObjectTextConvertProc = procedure (Input, Output: TStream);
|
TObjectTextConvertProc = procedure (Input, Output: TStream);
|
||||||
|
|
||||||
procedure InternalDelphiBinaryToText(Input, Output: TStream;
|
procedure InternalLRSBinaryToText(Input, Output: TStream;
|
||||||
var OriginalFormat: TDelphiStreamOriginalFormat;
|
var OriginalFormat: TLRSStreamOriginalFormat;
|
||||||
ConvertProc: TObjectTextConvertProc;
|
ConvertProc: TObjectTextConvertProc;
|
||||||
BinarySignature: Integer; SignatureLength: Byte);
|
BinarySignature: Integer; SignatureLength: Byte);
|
||||||
var
|
var
|
||||||
@ -1517,31 +1554,31 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure DelphiObjectToText(Input, Output: TStream;
|
procedure LRSObjectToText(Input, Output: TStream;
|
||||||
var OriginalFormat: TDelphiStreamOriginalFormat);
|
var OriginalFormat: TLRSStreamOriginalFormat);
|
||||||
begin
|
begin
|
||||||
InternalDelphiBinaryToText(Input, Output, OriginalFormat,
|
InternalLRSBinaryToText(Input, Output, OriginalFormat,
|
||||||
@DelphiObjectBinaryToText, Integer(FilerSignature), sizeof(Integer));
|
@LRSObjectBinaryToText, Integer(FilerSignature), sizeof(Integer));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure DelphiObjectResToText(Input, Output: TStream;
|
procedure LRSObjectResToText(Input, Output: TStream;
|
||||||
var OriginalFormat: TDelphiStreamOriginalFormat);
|
var OriginalFormat: TLRSStreamOriginalFormat);
|
||||||
begin
|
begin
|
||||||
InternalDelphiBinaryToText(Input, Output, OriginalFormat,
|
InternalLRSBinaryToText(Input, Output, OriginalFormat,
|
||||||
@DelphiObjectResourceToText, $FF, 1);
|
@LRSObjectResourceToText, $FF, 1);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure DelphiObjectResourceToText(Input, Output: TStream);
|
procedure LRSObjectResourceToText(Input, Output: TStream);
|
||||||
begin
|
begin
|
||||||
Input.ReadResHeader;
|
Input.ReadResHeader;
|
||||||
DelphiObjectBinaryToText(Input, Output);
|
LRSObjectBinaryToText(Input, Output);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure FormDataToText(FormStream, TextStream: TStream);
|
procedure FormDataToText(FormStream, TextStream: TStream);
|
||||||
begin
|
begin
|
||||||
case TestFormStreamFormat(FormStream) of
|
case TestFormStreamFormat(FormStream) of
|
||||||
sofBinary:
|
sofBinary:
|
||||||
DelphiObjectResourceToText(FormStream, TextStream);
|
LRSObjectResourceToText(FormStream, TextStream);
|
||||||
|
|
||||||
sofText:
|
sofText:
|
||||||
TextStream.CopyFrom(FormStream,FormStream.Size);
|
TextStream.CopyFrom(FormStream,FormStream.Size);
|
||||||
@ -1663,6 +1700,261 @@ begin
|
|||||||
Result:=TWriter.Create(Driver);
|
Result:=TWriter.Create(Driver);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function ReadLRSWord(s: TStream): word;
|
||||||
|
begin
|
||||||
|
s.Read(Result,2);
|
||||||
|
{$IFDEF Endian_BIG}
|
||||||
|
Result:=((Result and $ff) shl 8) or (Result shr 8);
|
||||||
|
{$ENDIF}
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ReadLRSInteger(s: TStream): integer;
|
||||||
|
begin
|
||||||
|
s.Read(Result,4);
|
||||||
|
{$IFDEF Endian_BIG}
|
||||||
|
ReverseBytes(@Result,4);
|
||||||
|
{$ENDIF}
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ReadLRSCardinal(s: TStream): cardinal;
|
||||||
|
begin
|
||||||
|
s.Read(Result,4);
|
||||||
|
{$IFDEF Endian_BIG}
|
||||||
|
ReverseBytes(@Result,4);
|
||||||
|
{$ENDIF}
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ReadLRSInt64(s: TStream): int64;
|
||||||
|
begin
|
||||||
|
s.Read(Result,8);
|
||||||
|
{$IFDEF Endian_BIG}
|
||||||
|
ReverseBytes(@Result,8);
|
||||||
|
{$ENDIF}
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ReadLRSSingle(s: TStream): Single;
|
||||||
|
begin
|
||||||
|
s.Read(Result,4);
|
||||||
|
{$IFDEF Endian_BIG}
|
||||||
|
ReverseBytes(@Result,4);
|
||||||
|
{$ENDIF}
|
||||||
|
end;
|
||||||
|
|
||||||
|
function ReadLRSDouble(s: TStream): Double;
|
||||||
|
begin
|
||||||
|
s.Read(Result,8);
|
||||||
|
{$IFDEF Endian_BIG}
|
||||||
|
ReverseBytes(@Result,8);
|
||||||
|
{$ENDIF}
|
||||||
|
end;
|
||||||
|
|
||||||
|
{$IFDEF CPUPowerPC}
|
||||||
|
function ReadLRSExtentedAndConvertToExtended(s: TStream): Extended;
|
||||||
|
// TODO - does not work
|
||||||
|
const
|
||||||
|
F: extended = 1.0/65536.0 ;
|
||||||
|
var
|
||||||
|
le: array [1..5] of word;
|
||||||
|
begin { Ignores NaN & Inf }
|
||||||
|
s.Read(le[1],10);
|
||||||
|
ReverseBytes(@le[1],10);
|
||||||
|
Result := 2.0 * (((le[2]*F+le[3])*F+le[4])*F+le[5])*F;
|
||||||
|
if le[1]>32767 then Result := -Result ;
|
||||||
|
Result:=intpower(2,integer(le[1] and $7fff)-$4000);
|
||||||
|
end;
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
function ReadLRSExtended(s: TStream): Extended;
|
||||||
|
begin
|
||||||
|
{$IFDEF CPUi386}
|
||||||
|
s.Read(Result,10);
|
||||||
|
{$ENDIF}
|
||||||
|
{$IFDEF CPUPowerPC}
|
||||||
|
Result:=ReadLRSExtentedAndConvertToExtended(s);
|
||||||
|
{$ENDIF}
|
||||||
|
end;
|
||||||
|
|
||||||
|
{$ifdef HASCURRENCY}
|
||||||
|
function ReadLRSCurrency(s: TStream): Currency;
|
||||||
|
begin
|
||||||
|
s.Read(Result,8);
|
||||||
|
{$IFDEF Endian_BIG}
|
||||||
|
ReverseBytes(@Result,8);
|
||||||
|
{$ENDIF}
|
||||||
|
end;
|
||||||
|
{$endif HASCURRENCY}
|
||||||
|
|
||||||
|
{$ifdef HASWIDESTRING}
|
||||||
|
function ReadLRSWideString(s: TStream): WideString;
|
||||||
|
var
|
||||||
|
Len: LongInt;
|
||||||
|
begin
|
||||||
|
Len:=ReadLRSInteger(s);
|
||||||
|
SetLength(Result,Len);
|
||||||
|
if Len>0 then begin
|
||||||
|
s.Read(Result[1],Len*2);
|
||||||
|
{$IFDEF Endian_BIG}
|
||||||
|
ReverseByteOrderInWords(PWord(@Result[1]),Len);
|
||||||
|
{$ENDIF}
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
{$endif HASWIDESTRING}
|
||||||
|
|
||||||
|
procedure WriteLRSReversedWord(s: TStream; w: word);
|
||||||
|
begin
|
||||||
|
w:=(w shr 8) or ((w and $ff) shl 8);
|
||||||
|
s.Write(w,2);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure WriteLRS4BytesReversed(s: TStream; p: Pointer);
|
||||||
|
var
|
||||||
|
a: array[0..3] of char;
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
for i:=0 to 3 do
|
||||||
|
a[i]:=PChar(p)[3-i];
|
||||||
|
s.Write(a[0],4);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure WriteLRS8BytesReversed(s: TStream; p: Pointer);
|
||||||
|
var
|
||||||
|
a: array[0..7] of char;
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
for i:=0 to 7 do
|
||||||
|
a[i]:=PChar(p)[7-i];
|
||||||
|
s.Write(a[0],8);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure WriteLRS10BytesReversed(s: TStream; p: Pointer);
|
||||||
|
var
|
||||||
|
a: array[0..9] of char;
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
for i:=0 to 9 do
|
||||||
|
a[i]:=PChar(p)[9-i];
|
||||||
|
s.Write(a[0],10);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure WriteLRSNull(s: TStream; Count: integer);
|
||||||
|
var
|
||||||
|
c: char;
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
c:=#0;
|
||||||
|
for i:=0 to Count-1 do
|
||||||
|
s.Write(c,1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure WriteLRSEndianBigDoubleAsEndianLittleExtended(s: TStream;
|
||||||
|
PPCDouble: PByte);
|
||||||
|
// TODO
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
i:=0;
|
||||||
|
s.Write(i,4);
|
||||||
|
s.Write(i,4);
|
||||||
|
s.Write(i,2);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure WriteLRSWord(s: TStream; const w: word);
|
||||||
|
begin
|
||||||
|
{$IFDEF Endian_Little}
|
||||||
|
s.Write(w,2);
|
||||||
|
{$ELSE}
|
||||||
|
WriteLRSReversedWord(s,w);
|
||||||
|
{$ENDIF}
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure WriteLRSInteger(s: TStream; const i: integer);
|
||||||
|
begin
|
||||||
|
{$IFDEF Endian_Little}
|
||||||
|
s.Write(i,4);
|
||||||
|
{$ELSE}
|
||||||
|
WriteLRS4BytesReversed(s,@i);
|
||||||
|
{$ENDIF}
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure WriteLRSCardinal(s: TStream; const c: cardinal);
|
||||||
|
begin
|
||||||
|
{$IFDEF Endian_Little}
|
||||||
|
s.Write(c,4);
|
||||||
|
{$ELSE}
|
||||||
|
WriteLRS4BytesReversed(s,@c);
|
||||||
|
{$ENDIF}
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure WriteLRSSingle(s: TStream; const si: Single);
|
||||||
|
begin
|
||||||
|
{$IFDEF Endian_Little}
|
||||||
|
s.Write(si,4);
|
||||||
|
{$ELSE}
|
||||||
|
WriteLRS4BytesReversed(s,@si);
|
||||||
|
{$ENDIF}
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure WriteLRSDouble(s: TStream; const d: Double);
|
||||||
|
begin
|
||||||
|
{$IFDEF Endian_Little}
|
||||||
|
s.Write(d,8);
|
||||||
|
{$ELSE}
|
||||||
|
WriteLRS8BytesReversed(s,@d);
|
||||||
|
{$ENDIF}
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure WriteLRSExtended(s: TStream; const e: extended);
|
||||||
|
begin
|
||||||
|
{$IFDEF CPUi386}
|
||||||
|
s.Write(e,10);
|
||||||
|
{$ENDIF}
|
||||||
|
{$IFDEF CPUPowerPC}
|
||||||
|
if SizeOf(e)=10 then
|
||||||
|
WriteLRS10BytesReversed(s,@e)
|
||||||
|
else if SizeOf(e)=8 then
|
||||||
|
WriteLRSEndianBigDoubleAsEndianLittleExtended(s,@e)
|
||||||
|
else begin
|
||||||
|
debugln('WARNING: WriteLRSExtended not implemented yet for PowerPC');
|
||||||
|
WriteLRSNull(s,10);
|
||||||
|
end;
|
||||||
|
{$ENDIF}
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure WriteLRSInt64(s: TStream; const i: int64);
|
||||||
|
begin
|
||||||
|
{$IFDEF Endian_Little}
|
||||||
|
s.Write(i,8);
|
||||||
|
{$ELSE}
|
||||||
|
WriteLRS8BytesReversed(s,@i);
|
||||||
|
{$ENDIF}
|
||||||
|
end;
|
||||||
|
|
||||||
|
{$ifdef HASCURRENCY}
|
||||||
|
procedure WriteLRSCurrency(s: TStream; const c: Currency);
|
||||||
|
begin
|
||||||
|
{$IFDEF Endian_Little}
|
||||||
|
s.Write(c,8);
|
||||||
|
{$ELSE}
|
||||||
|
WriteLRS8BytesReversed(s,@c);
|
||||||
|
{$ENDIF}
|
||||||
|
end;
|
||||||
|
{$endif HASCURRENCY}
|
||||||
|
|
||||||
|
{$ifdef HASWIDESTRING}
|
||||||
|
procedure WriteLRSWideStringContent(s: TStream; const w: WideString);
|
||||||
|
var
|
||||||
|
Size: Integer;
|
||||||
|
begin
|
||||||
|
Size:=length(w);
|
||||||
|
if Size=0 then exit;
|
||||||
|
{$IFDEF Endian_Little}
|
||||||
|
s.Write(w[1], Size * 2);
|
||||||
|
{$ELSE}
|
||||||
|
WriteLRSReversedWords(s,@w[1],Size);
|
||||||
|
{$ENDIF}
|
||||||
|
end;
|
||||||
|
{$endif HASWIDESTRING}
|
||||||
|
|
||||||
{ TLRSObjectReader }
|
{ TLRSObjectReader }
|
||||||
|
|
||||||
procedure TLRSObjectReader.Read(var Buf; Count: LongInt);
|
procedure TLRSObjectReader.Read(var Buf; Count: LongInt);
|
||||||
|
Loading…
Reference in New Issue
Block a user