123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785 |
- {
- $Id$
- This file is part of the Free Component Library (FCL)
- Copyright (c) 1999-2000 by Michael Van Canneyt and Florian Klaempfl
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- {**********************************************************************
- * Class implementations are in separate files. *
- **********************************************************************}
- {
- Include all message strings
- Add a language with IFDEF LANG_NAME
- just befor the final ELSE. This way English will always be the default.
- }
- {$IFDEF LANG_GERMAN}
- {$i constsg.inc}
- {$ELSE}
- {$IFDEF LANG_SPANISH}
- {$i constss.inc}
- {$ELSE}
- {$i constse.inc}
- {$ENDIF}
- {$ENDIF}
- { Utility routines }
- {$i util.inc}
- { TBits implementation }
- {$i bits.inc}
- { TReader implementation }
- { $i reader.inc}
- { TWriter implementations }
- {$i writer.inc}
- {$i twriter.inc}
- { TFiler implementation }
- {$i filer.inc}
- { All streams implementations: }
- { Tstreams THandleStream TFileStream TResourcseStreams TStringStream }
- { TCustomMemoryStream TMemoryStream }
- {$i streams.inc}
- { TParser implementation}
- {$i parser.inc}
- { TCollection and TCollectionItem implementations }
- {$i collect.inc}
- { TList and TThreadList implementations }
- {$i lists.inc}
- { TStrings and TStringList implementations }
- {$i stringl.inc}
- { TThread implementation }
- {$i thread.inc}
- { TPersistent implementation }
- {$i persist.inc }
- { TComponent implementation }
- {$i compon.inc}
- { Class and component registration routines }
- {$I cregist.inc}
- {**********************************************************************
- * Miscellaneous procedures and functions *
- **********************************************************************}
- { Point and rectangle constructors }
- function Point(AX, AY: Integer): TPoint;
- begin
- with Result do
- begin
- X := AX;
- Y := AY;
- end;
- end;
- function SmallPoint(AX, AY: SmallInt): TSmallPoint;
- begin
- with Result do
- begin
- X := AX;
- Y := AY;
- end;
- end;
- function Rect(ALeft, ATop, ARight, ABottom: Integer): TRect;
- begin
- with Result do
- begin
- Left := ALeft;
- Top := ATop;
- Right := ARight;
- Bottom := ABottom;
- end;
- end;
- function Bounds(ALeft, ATop, AWidth, AHeight: Integer): TRect;
- begin
- with Result do
- begin
- Left := ALeft;
- Top := ATop;
- Right := ALeft + AWidth;
- Bottom := ATop + AHeight;
- end;
- end;
- { Object filing routines }
- procedure RegisterIntegerConsts(IntegerType: Pointer; IdentToInt: TIdentToInt;
- IntToIdent: TIntToIdent);
- begin
- end;
- function IdentToInt(const Ident: string; var Int: Longint; const Map: array of TIdentMapEntry): Boolean;
- begin
- IdentToInt:=false;
- end;
- function IntToIdent(Int: Longint; var Ident: string; const Map: array of TIdentMapEntry): Boolean;
- begin
- IntToIdent:=false;
- end;
- function InitInheritedComponent(Instance: TComponent; RootAncestor: TClass): Boolean;
- begin
- InitInheritedComponent:=false;
- end;
- function InitComponentRes(const ResName: string; Instance: TComponent): Boolean;
- begin
- InitComponentRes:=false;
- end;
- function ReadComponentRes(const ResName: string; Instance: TComponent): TComponent;
- begin
- ReadComponentRes:=nil;
- end;
- function ReadComponentResEx(HInstance: THandle; const ResName: string): TComponent;
- begin
- ReadComponentResEx:=nil;
- end;
- function ReadComponentResFile(const FileName: string; Instance: TComponent): TComponent;
- begin
- ReadComponentResFile:=nil;
- end;
- procedure WriteComponentResFile(const FileName: string; Instance: TComponent);
- begin
- end;
- procedure GlobalFixupReferences;
- begin
- end;
- procedure GetFixupReferenceNames(Root: TComponent; Names: TStrings);
- begin
- end;
- procedure GetFixupInstanceNames(Root: TComponent;
- const ReferenceRootName: string; Names: TStrings);
- begin
- end;
- procedure RedirectFixupReferences(Root: TComponent; const OldRootName,
- NewRootName: string);
- begin
- end;
- procedure RemoveFixupReferences(Root: TComponent; const RootName: string);
- begin
- end;
- procedure RemoveFixups(Instance: TPersistent);
- begin
- end;
- procedure BeginGlobalLoading;
- begin
- end;
- procedure NotifyGlobalLoading;
- begin
- end;
- procedure EndGlobalLoading;
- begin
- end;
- function CollectionsEqual(C1, C2: TCollection): Boolean;
- begin
- CollectionsEqual:=false;
- end;
- { Object conversion routines }
- procedure ObjectBinaryToText(Input, Output: TStream);
- procedure OutStr(s: String);
- begin
- if Length(s) > 0 then
- Output.Write(s[1], Length(s));
- end;
- procedure OutLn(s: String);
- begin
- OutStr(s + #10);
- end;
- procedure OutString(s: String);
- var
- res, NewStr: String;
- i: Integer;
- InString, NewInString: Boolean;
- begin
- res := '';
- InString := False;
- for i := 1 to Length(s) do begin
- NewInString := InString;
- case s[i] of
- #0..#31: begin
- if InString then
- NewInString := False;
- NewStr := '#' + IntToStr(Ord(s[i]));
- end;
- '''':
- if InString then NewStr := ''''''
- else NewStr := '''''''';
- else begin
- if not InString then
- NewInString := True;
- NewStr := s[i];
- end;
- end;
- if NewInString <> InString then begin
- NewStr := '''' + NewStr;
- InString := NewInString;
- end;
- res := res + NewStr;
- end;
- if InString then res := res + '''';
- OutStr(res);
- end;
- function ReadInt(ValueType: TValueType): LongInt;
- begin
- case ValueType of
- vaInt8: Result := ShortInt(Input.ReadByte);
- vaInt16: Result := SmallInt(Input.ReadWord);
- vaInt32: Result := LongInt(Input.ReadDWord);
- end;
- end;
- function ReadInt: LongInt;
- begin
- Result := ReadInt(TValueType(Input.ReadByte));
- end;
- function ReadSStr: String;
- var
- len: Byte;
- begin
- len := Input.ReadByte;
- SetLength(Result, len);
- Input.Read(Result[1], len);
- end;
- procedure ReadPropList(indent: String);
- procedure ProcessValue(ValueType: TValueType; Indent: String);
- procedure Stop(s: String);
- begin
- WriteLn(s);
- Halt;
- end;
- procedure ProcessBinary;
- var
- ToDo, DoNow, i: LongInt;
- lbuf: array[0..31] of Byte;
- s: String;
- begin
- ToDo := Input.ReadDWord;
- OutLn('{');
- while ToDo > 0 do begin
- DoNow := ToDo;
- if DoNow > 32 then DoNow := 32;
- Dec(ToDo, DoNow);
- s := Indent + ' ';
- Input.Read(lbuf, DoNow);
- for i := 0 to DoNow - 1 do
- s := s + IntToHex(lbuf[i], 2);
- OutLn(s);
- end;
- OutLn(indent + '}');
- end;
- var
- s: String;
- len: LongInt;
- IsFirst: Boolean;
- ext: Extended;
- begin
- OutStr('(' + IntToStr(Ord(Valuetype)) + ') ');
- case ValueType of
- vaList: begin
- OutStr('(');
- IsFirst := True;
- while True do begin
- ValueType := TValueType(Input.ReadByte);
- if ValueType = vaNull then break;
- if IsFirst then begin
- OutLn('');
- IsFirst := False;
- end;
- OutStr(Indent + ' ');
- ProcessValue(ValueType, Indent + ' ');
- end;
- OutLn(Indent + ')');
- end;
- vaInt8: OutLn(IntToStr(ShortInt(Input.ReadByte)));
- vaInt16: OutLn( IntToStr(SmallInt(Input.ReadWord)));
- vaInt32: OutLn(IntToStr(LongInt(Input.ReadDWord)));
- vaExtended: begin
- Input.Read(ext, SizeOf(ext));
- OutLn(FloatToStr(ext));
- end;
- vaString: begin
- OutString(ReadSStr);
- OutLn('');
- end;
- vaIdent: OutLn(ReadSStr);
- vaFalse: OutLn('False');
- vaTrue: OutLn('True');
- vaBinary: ProcessBinary;
- vaSet: begin
- OutStr('[');
- IsFirst := True;
- while True do begin
- s := ReadSStr;
- if Length(s) = 0 then break;
- if not IsFirst then OutStr(', ');
- IsFirst := False;
- OutStr(s);
- end;
- OutLn(']');
- end;
- vaLString: Stop('!!LString!!');
- vaNil: Stop('nil');
- vaCollection: begin
- OutStr('<');
- while Input.ReadByte <> 0 do begin
- OutLn(Indent);
- Input.Seek(-1, soFromCurrent);
- OutStr(indent + ' item');
- ValueType := TValueType(Input.ReadByte);
- if ValueType <> vaList then
- OutStr('[' + IntToStr(ReadInt(ValueType)) + ']');
- OutLn('');
- ReadPropList(indent + ' ');
- OutStr(indent + ' end');
- end;
- OutLn('>');
- end;
- {vaSingle: begin OutLn('!!Single!!'); exit end;
- vaCurrency: begin OutLn('!!Currency!!'); exit end;
- vaDate: begin OutLn('!!Date!!'); exit end;
- vaWString: begin OutLn('!!WString!!'); exit end;}
- else
- Stop(IntToStr(Ord(ValueType)));
- end;
- end;
- begin
- while Input.ReadByte <> 0 do begin
- Input.Seek(-1, soFromCurrent);
- OutStr(indent + ReadSStr + ' = ');
- ProcessValue(TValueType(Input.ReadByte), Indent);
- end;
- end;
- procedure ReadObject(indent: String);
- var
- b: Byte;
- ObjClassName, ObjName: String;
- ChildPos: LongInt;
- begin
- // Check for FilerFlags
- b := Input.ReadByte;
- if (b and $f0) = $f0 then begin
- if (b and 2) <> 0 then ChildPos := ReadInt;
- end else begin
- b := 0;
- Input.Seek(-1, soFromCurrent);
- end;
- ObjClassName := ReadSStr;
- ObjName := ReadSStr;
- OutStr(Indent);
- if (b and 1) <> 0 then OutStr('inherited')
- else OutStr('object');
- OutStr(' ');
- if ObjName <> '' then
- OutStr(ObjName + ': ');
- OutStr(ObjClassName);
- if (b and 2) <> 0 then OutStr('[' + IntToStr(ChildPos) + ']');
- OutLn('');
- ReadPropList(indent + ' ');
- while Input.ReadByte <> 0 do begin
- Input.Seek(-1, soFromCurrent);
- ReadObject(indent + ' ');
- end;
- OutLn(indent + 'end');
- end;
- type
- PLongWord = ^LongWord;
- const
- signature: PChar = 'TPF0';
- begin
- if Input.ReadDWord <> PLongWord(Pointer(signature))^ then
- raise EReadError.Create('Illegal stream image' {###SInvalidImage});
- ReadObject('');
- end;
- procedure ObjectTextToBinary(Input, Output: TStream);
- var
- parser: TParser;
- procedure WriteString(s: String);
- begin
- Output.WriteByte(Length(s));
- Output.Write(s[1], Length(s));
- end;
- procedure WriteInteger(value: LongInt);
- begin
- if (value >= -128) and (value <= 127) then begin
- Output.WriteByte(Ord(vaInt8));
- Output.WriteByte(Byte(value));
- end else if (value >= -32768) and (value <= 32767) then begin
- Output.WriteByte(Ord(vaInt16));
- Output.WriteWord(Word(value));
- end else begin
- Output.WriteByte(ord(vaInt32));
- Output.WriteDWord(LongWord(value));
- end;
- end;
- procedure ProcessProperty; forward;
- procedure ProcessValue;
- var
- flt: Extended;
- s: String;
- stream: TMemoryStream;
- begin
- case parser.Token of
- toInteger: WriteInteger(parser.TokenInt);
- toFloat: begin
- Output.WriteByte(Ord(vaExtended));
- flt := Parser.TokenFloat;
- Output.Write(flt, SizeOf(flt));
- end;
- toString: begin
- s := parser.TokenString;
- while parser.NextToken = '+' do begin
- parser.NextToken; // Get next string fragment
- parser.CheckToken(toString);
- s := s + parser.TokenString;
- end;
- Output.WriteByte(Ord(vaString));
- WriteString(s);
- end;
- toSymbol:
- if CompareText(parser.TokenString, 'True') = 0 then
- Output.WriteByte(Ord(vaTrue))
- else if CompareText(parser.TokenString, 'False') = 0 then
- Output.WriteByte(Ord(vaFalse))
- else if CompareText(parser.TokenString, 'nil') = 0 then
- Output.WriteByte(Ord(vaNil))
- else begin
- Output.WriteByte(Ord(vaIdent));
- WriteString(parser.TokenString);
- end;
- // Set
- '[': begin
- parser.NextToken;
- Output.WriteByte(Ord(vaSet));
- if parser.Token <> ']' then
- while True do begin
- parser.CheckToken(toSymbol);
- WriteString(parser.TokenString);
- parser.NextToken;
- if parser.Token = ']' then break;
- parser.CheckToken(',');
- parser.NextToken;
- end;
- Output.WriteByte(0);
- end;
- // List
- '(': begin
- parser.NextToken;
- Output.WriteByte(Ord(vaList));
- while parser.Token <> ')' do ProcessValue;
- Output.WriteByte(0);
- end;
- // Collection
- '<': begin
- parser.NextToken;
- Output.WriteByte(Ord(vaCollection));
- while parser.Token <> '>' do begin
- parser.CheckTokenSymbol('item');
- parser.NextToken;
- // ConvertOrder
- Output.WriteByte(Ord(vaList));
- while not parser.TokenSymbolIs('end') do ProcessProperty;
- parser.NextToken; // Skip 'end'
- Output.WriteByte(0);
- end;
- Output.WriteByte(0);
- end;
- // Binary data
- '{': begin
- Output.WriteByte(Ord(vaBinary));
- stream := TMemoryStream.Create;
- try
- parser.HexToBinary(stream);
- Output.WriteDWord(stream.Size);
- Output.Write(Stream.Memory^, stream.Size);
- finally
- stream.Free;
- end;
- end;
- else WriteLn('Token: "', parser.Token, '" ', Ord(parser.Token));
- end;
- parser.NextToken;
- end;
- procedure ProcessProperty;
- var
- name: String;
- begin
- // Get name of property
- parser.CheckToken(toSymbol);
- name := parser.TokenString;
- while True do begin
- parser.NextToken;
- if parser.Token <> '.' then break;
- parser.NextToken;
- parser.CheckToken(toSymbol);
- name := name + '.' + parser.TokenString;
- end;
- // WriteLn(name);
- WriteString(name);
- parser.CheckToken('=');
- parser.NextToken;
- ProcessValue;
- end;
- procedure ProcessObject;
- var
- IsInherited: Boolean;
- ObjectName, ObjectType: String;
- begin
- if parser.TokenSymbolIs('OBJECT') then
- IsInherited := False
- else begin
- parser.CheckTokenSymbol('INHERITED');
- IsInherited := True;
- end;
- parser.NextToken;
- parser.CheckToken(toSymbol);
- ObjectName := '';
- ObjectType := parser.TokenString;
- parser.NextToken;
- if parser.Token = ':' then begin
- parser.NextToken;
- parser.CheckToken(toSymbol);
- ObjectName := ObjectType;
- ObjectType := parser.TokenString;
- parser.NextToken;
- end;
- WriteString(ObjectType);
- WriteString(ObjectName);
- // Convert property list
- while not (parser.TokenSymbolIs('END') or
- parser.TokenSymbolIs('OBJECT') or
- parser.TokenSymbolIs('INHERITED')) do
- ProcessProperty;
- Output.WriteByte(0); // Terminate property list
- // Convert child objects
- while not parser.TokenSymbolIs('END') do ProcessObject;
- parser.NextToken; // Skip end token
- Output.WriteByte(0); // Terminate property list
- end;
- const
- signature: PChar = 'TPF0';
- begin
- parser := TParser.Create(Input);
- try
- Output.Write(signature[0], 4);
- ProcessObject;
- finally
- parser.Free;
- end;
- end;
- procedure ObjectResourceToText(Input, Output: TStream);
- begin
- Input.ReadResHeader;
- ObjectBinaryToText(Input, Output);
- end;
- procedure ObjectTextToResource(Input, Output: TStream);
- var
- StartPos, SizeStartPos, BinSize: LongInt;
- parser: TParser;
- name: String;
- begin
- // Get form type name
- StartPos := Input.Position;
- parser := TParser.Create(Input);
- try
- if not parser.TokenSymbolIs('OBJECT') then parser.CheckTokenSymbol('INHERITED');
- parser.NextToken;
- parser.CheckToken(toSymbol);
- parser.NextToken;
- parser.CheckToken(':');
- parser.NextToken;
- parser.CheckToken(toSymbol);
- name := parser.TokenString;
- finally
- parser.Free;
- Input.Position := StartPos;
- end;
- // Write resource header
- name := UpperCase(name);
- Output.WriteByte($ff);
- Output.WriteByte(10);
- Output.WriteByte(0);
- Output.Write(name[1], Length(name) + 1); // Write null-terminated form type name
- Output.WriteWord($1030);
- SizeStartPos := Output.Position;
- Output.WriteDWord(0); // Placeholder for data size
- ObjectTextToBinary(Input, Output); // Convert the stuff!
- BinSize := Output.Position - SizeStartPos - 4;
- Output.Position := SizeStartPos;
- Output.WriteDWord(BinSize); // Insert real resource data size
- end;
- { Utility routines }
- function LineStart(Buffer, BufPos: PChar): PChar;
- begin
- Result := BufPos;
- while Result > Buffer do begin
- Dec(Result);
- if Result[0] = #10 then break;
- end;
- end;
- {
- $Log$
- Revision 1.16 2000-01-07 01:24:33 peter
- * updated copyright to 2000
- Revision 1.15 2000/01/06 01:20:32 peter
- * moved out of packages/ back to topdir
- Revision 1.2 2000/01/04 18:07:16 michael
- + Streaming implemented
- Revision 1.1 2000/01/03 19:33:06 peter
- * moved to packages dir
- Revision 1.13 1999/10/19 11:27:03 sg
- * Added DFM<->ASCII conversion procedures
- Revision 1.12 1999/09/30 19:31:42 fcl
- * Implemented LineStart (sg)
- Revision 1.11 1999/09/11 21:59:31 fcl
- * Moved class and registration functions to cregist.inc (sg)
- Revision 1.10 1999/04/13 08:52:29 michael
- + Moved strings.inc to stringl.inc, to avoid conflict with strings unit
- Revision 1.9 1999/04/08 10:18:50 peter
- * makefile updates
- }
|