classesh.inc 82 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148
  1. {
  2. This file is part of the Free Pascal Run Time Library (rtl)
  3. Copyright (c) 1999-2008 by Michael Van Canneyt, Florian Klaempfl,
  4. and Micha Nelissen
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. {$H+}
  12. {$ifdef CLASSESINLINE}{$inline on}{$endif}
  13. type
  14. { extra types to compile with FPC }
  15. HRSRC = TFPResourceHandle deprecated;
  16. TComponentName = string;
  17. THandle = System.THandle;
  18. TPoint=Types.TPoint;
  19. TRect=Types.TRect;
  20. {$ifndef windows}
  21. TSmallPoint = record
  22. x,y : smallint;
  23. end;
  24. HMODULE = ptrint; // hmodule is handle on windows. Pointer eq.
  25. {$else}
  26. TSmallPoint = Windows.TSmallPoint;
  27. HModule = System.HModule;
  28. {$endif}
  29. const
  30. { Maximum TList size }
  31. {$ifdef cpu16}
  32. MaxListSize = {Maxint div 16}1024;
  33. {$else cpu16}
  34. MaxListSize = Maxint div 16;
  35. {$endif cpu16}
  36. { values for TShortCut }
  37. scShift = $2000;
  38. scCtrl = $4000;
  39. scAlt = $8000;
  40. scNone = 0;
  41. { TStream seek origins }
  42. const
  43. soFromBeginning = 0;
  44. soFromCurrent = 1;
  45. soFromEnd = 2;
  46. type
  47. TSeekOrigin = (soBeginning, soCurrent, soEnd);
  48. TDuplicates = Types.TDuplicates;
  49. // For Delphi and backwards compatibility.
  50. const
  51. dupIgnore = Types.dupIgnore;
  52. dupAccept = Types.dupAccept;
  53. dupError = Types.dupError;
  54. { TFileStream create mode }
  55. const
  56. fmCreate = $FF00;
  57. fmOpenRead = 0;
  58. fmOpenWrite = 1;
  59. fmOpenReadWrite = 2;
  60. { TParser special tokens }
  61. toEOF = Char(0);
  62. toSymbol = Char(1);
  63. toString = Char(2);
  64. toInteger = Char(3);
  65. toFloat = Char(4);
  66. toWString = Char(5);
  67. Const
  68. FilerSignature : Array[1..4] of char = 'TPF0';
  69. type
  70. { Text alignment types }
  71. TAlignment = (taLeftJustify, taRightJustify, taCenter);
  72. TLeftRight = taLeftJustify..taRightJustify;
  73. TBiDiMode = (bdLeftToRight,bdRightToLeft,bdRightToLeftNoAlign,bdRightToLeftReadingOnly);
  74. { Types used by standard events }
  75. TShiftStateEnum = (ssShift, ssAlt, ssCtrl,
  76. ssLeft, ssRight, ssMiddle, ssDouble,
  77. // Extra additions
  78. ssMeta, ssSuper, ssHyper, ssAltGr, ssCaps, ssNum,
  79. ssScroll,ssTriple,ssQuad,ssExtra1,ssExtra2);
  80. {$packset 1}
  81. TShiftState = set of TShiftStateEnum;
  82. {$packset default}
  83. THelpContext = -MaxLongint..MaxLongint;
  84. THelpType = (htKeyword, htContext);
  85. TShortCut = Low(Word)..High(Word);
  86. { Standard events }
  87. TNotifyEvent = procedure(Sender: TObject) of object;
  88. THelpEvent = function (Command: Word; Data: Longint;
  89. var CallHelp: Boolean): Boolean of object;
  90. TGetStrProc = procedure(const S: string) of object;
  91. { Exception classes }
  92. EStreamError = class(Exception);
  93. EFCreateError = class(EStreamError);
  94. EFOpenError = class(EStreamError);
  95. EFilerError = class(EStreamError);
  96. EReadError = class(EFilerError);
  97. EWriteError = class(EFilerError);
  98. EClassNotFound = class(EFilerError);
  99. EMethodNotFound = class(EFilerError);
  100. EInvalidImage = class(EFilerError);
  101. EResNotFound = class(Exception);
  102. {$ifdef FPC_TESTGENERICS}
  103. EListError = fgl.EListError;
  104. {$else}
  105. EListError = class(Exception);
  106. {$endif}
  107. EBitsError = class(Exception);
  108. EStringListError = class(Exception);
  109. EComponentError = class(Exception);
  110. EParserError = class(Exception);
  111. EOutOfResources = class(EOutOfMemory);
  112. EInvalidOperation = class(Exception);
  113. TExceptionClass = Class of Exception;
  114. { ---------------------------------------------------------------------
  115. Free Pascal Observer support
  116. ---------------------------------------------------------------------}
  117. Const
  118. SGUIDObserved = '{663C603C-3F3C-4CC5-823C-AC8079F979E5}';
  119. SGUIDObserver = '{BC7376EA-199C-4C2A-8684-F4805F0691CA}';
  120. Type
  121. // Notification operations :
  122. // Observer has changed, is freed, item added to/deleted from list, custom event.
  123. TFPObservedOperation = (ooChange,ooFree,ooAddItem,ooDeleteItem,ooCustom);
  124. {$INTERFACES CORBA}
  125. { IFPObserved }
  126. IFPObserved = Interface [SGUIDObserved]
  127. // attach a new observer
  128. Procedure FPOAttachObserver(AObserver : TObject);
  129. // Detach an observer
  130. Procedure FPODetachObserver(AObserver : TObject);
  131. // Notify all observers of a change.
  132. Procedure FPONotifyObservers(ASender : TObject; AOperation : TFPObservedOperation; Data : Pointer);
  133. end;
  134. { IFPObserver }
  135. IFPObserver = Interface [SGUIDObserver]
  136. // Called by observed when observers are notified.
  137. Procedure FPOObservedChanged(ASender : TObject; Operation : TFPObservedOperation; Data : Pointer);
  138. end;
  139. {$INTERFACES COM}
  140. EObserver = Class(Exception);
  141. { Forward class declarations }
  142. TStream = class;
  143. TFiler = class;
  144. TReader = class;
  145. TWriter = class;
  146. TComponent = class;
  147. { TFPList class }
  148. PPointerList = ^TPointerList;
  149. TPointerList = array[0..MaxListSize - 1] of Pointer;
  150. TListSortCompare = function (Item1, Item2: Pointer): Integer;
  151. TListCallback = Types.TListCallback;
  152. TListStaticCallback = Types.TListStaticCallback;
  153. {$IFNDEF FPC_TESTGENERICS}
  154. TListAssignOp = (laCopy, laAnd, laOr, laXor, laSrcUnique, laDestUnique);
  155. TFPList = class;
  156. TFPListEnumerator = class
  157. private
  158. FList: TFPList;
  159. FPosition: Integer;
  160. public
  161. constructor Create(AList: TFPList);
  162. function GetCurrent: Pointer;
  163. function MoveNext: Boolean;
  164. property Current: Pointer read GetCurrent;
  165. end;
  166. {$ifdef VER2_4}
  167. type
  168. TDirection = (FromBeginning, FromEnd);
  169. {$endif}
  170. TFPList = class(TObject)
  171. private
  172. FList: PPointerList;
  173. FCount: Integer;
  174. FCapacity: Integer;
  175. procedure CopyMove (aList : TFPList);
  176. procedure MergeMove (aList : TFPList);
  177. procedure DoCopy(ListA, ListB : TFPList);
  178. procedure DoSrcUnique(ListA, ListB : TFPList);
  179. procedure DoAnd(ListA, ListB : TFPList);
  180. procedure DoDestUnique(ListA, ListB : TFPList);
  181. procedure DoOr(ListA, ListB : TFPList);
  182. procedure DoXOr(ListA, ListB : TFPList);
  183. protected
  184. function Get(Index: Integer): Pointer; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
  185. procedure Put(Index: Integer; Item: Pointer); {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
  186. procedure SetCapacity(NewCapacity: Integer);
  187. procedure SetCount(NewCount: Integer);
  188. Procedure RaiseIndexError(Index: Integer);
  189. public
  190. Type
  191. TDirection = (FromBeginning, FromEnd);
  192. destructor Destroy; override;
  193. Procedure AddList(AList : TFPList);
  194. function Add(Item: Pointer): Integer; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
  195. procedure Clear;
  196. procedure Delete(Index: Integer); {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
  197. class procedure Error(const Msg: string; Data: PtrInt);
  198. procedure Exchange(Index1, Index2: Integer);
  199. function Expand: TFPList; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
  200. function Extract(Item: Pointer): Pointer;
  201. function First: Pointer;
  202. function GetEnumerator: TFPListEnumerator;
  203. function IndexOf(Item: Pointer): Integer;
  204. function IndexOfItem(Item: Pointer; Direction: TDirection): Integer;
  205. procedure Insert(Index: Integer; Item: Pointer); {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
  206. function Last: Pointer;
  207. procedure Move(CurIndex, NewIndex: Integer);
  208. procedure Assign (ListA: TFPList; AOperator: TListAssignOp=laCopy; ListB: TFPList=nil);
  209. function Remove(Item: Pointer): Integer;
  210. procedure Pack;
  211. procedure Sort(Compare: TListSortCompare);
  212. procedure ForEachCall(proc2call:TListCallback;arg:pointer);
  213. procedure ForEachCall(proc2call:TListStaticCallback;arg:pointer);
  214. property Capacity: Integer read FCapacity write SetCapacity;
  215. property Count: Integer read FCount write SetCount;
  216. property Items[Index: Integer]: Pointer read Get write Put; default;
  217. property List: PPointerList read FList;
  218. end;
  219. {$else}
  220. TFPPtrList = specialize TFPGList<Pointer>;
  221. TFPList = class(TFPPtrList)
  222. public
  223. procedure Assign(Source: TFPList);
  224. procedure Sort(Compare: TListSortCompare);
  225. procedure ForEachCall(Proc2call: TListCallback; Arg: Pointer);
  226. procedure ForEachCall(Proc2call: TListStaticCallback; Arg: Pointer);
  227. end;
  228. {$endif}
  229. { TList class}
  230. TListNotification = (lnAdded, lnExtracted, lnDeleted);
  231. TList = class;
  232. TListEnumerator = class
  233. private
  234. FList: TList;
  235. FPosition: Integer;
  236. public
  237. constructor Create(AList: TList);
  238. function GetCurrent: Pointer;
  239. function MoveNext: Boolean;
  240. property Current: Pointer read GetCurrent;
  241. end;
  242. TList = class(TObject,IFPObserved)
  243. private
  244. FList: TFPList;
  245. FObservers : TFPList;
  246. procedure CopyMove (aList : TList);
  247. procedure MergeMove (aList : TList);
  248. procedure DoCopy(ListA, ListB : TList);
  249. procedure DoSrcUnique(ListA, ListB : TList);
  250. procedure DoAnd(ListA, ListB : TList);
  251. procedure DoDestUnique(ListA, ListB : TList);
  252. procedure DoOr(ListA, ListB : TList);
  253. procedure DoXOr(ListA, ListB : TList);
  254. protected
  255. function Get(Index: Integer): Pointer;
  256. procedure Grow; virtual;
  257. procedure Put(Index: Integer; Item: Pointer);
  258. procedure Notify(Ptr: Pointer; Action: TListNotification); virtual;
  259. procedure SetCapacity(NewCapacity: Integer);
  260. function GetCapacity: integer;
  261. procedure SetCount(NewCount: Integer);
  262. function GetCount: integer;
  263. function GetList: PPointerList;
  264. public
  265. constructor Create;
  266. destructor Destroy; override;
  267. Procedure FPOAttachObserver(AObserver : TObject);
  268. Procedure FPODetachObserver(AObserver : TObject);
  269. Procedure FPONotifyObservers(ASender : TObject; AOperation : TFPObservedOperation; Data : Pointer);
  270. Procedure AddList(AList : TList);
  271. function Add(Item: Pointer): Integer;
  272. procedure Clear; virtual;
  273. procedure Delete(Index: Integer);
  274. class procedure Error(const Msg: string; Data: PtrInt); virtual;
  275. procedure Exchange(Index1, Index2: Integer);
  276. function Expand: TList;
  277. function Extract(item: Pointer): Pointer;
  278. function First: Pointer;
  279. function GetEnumerator: TListEnumerator;
  280. function IndexOf(Item: Pointer): Integer;
  281. procedure Insert(Index: Integer; Item: Pointer);
  282. function Last: Pointer;
  283. procedure Move(CurIndex, NewIndex: Integer);
  284. procedure Assign (ListA: TList; AOperator: TListAssignOp=laCopy; ListB: TList=nil);
  285. function Remove(Item: Pointer): Integer;
  286. procedure Pack;
  287. procedure Sort(Compare: TListSortCompare);
  288. property Capacity: Integer read GetCapacity write SetCapacity;
  289. property Count: Integer read GetCount write SetCount;
  290. property Items[Index: Integer]: Pointer read Get write Put; default;
  291. property List: PPointerList read GetList;
  292. end;
  293. { TThreadList class }
  294. TThreadList = class
  295. private
  296. FList: TList;
  297. FDuplicates: TDuplicates;
  298. FLock: TRTLCriticalSection;
  299. public
  300. constructor Create;
  301. destructor Destroy; override;
  302. procedure Add(Item: Pointer);
  303. procedure Clear;
  304. function LockList: TList;
  305. procedure Remove(Item: Pointer);
  306. procedure UnlockList;
  307. property Duplicates: TDuplicates read FDuplicates write FDuplicates;
  308. end;
  309. {TBits Class}
  310. const
  311. BITSHIFT = 5;
  312. MASK = 31; {for longs that are 32-bit in size}
  313. // to further increase, signed integer limits have to be researched.
  314. {$ifdef cpu16}
  315. MaxBitFlags = $7FE0;
  316. {$else cpu16}
  317. MaxBitFlags = $7FFFFFE0;
  318. {$endif cpu16}
  319. MaxBitRec = MaxBitFlags Div (SizeOf(cardinal)*8);
  320. type
  321. TBitArray = array[0..MaxBitRec - 1] of cardinal;
  322. TBits = class(TObject)
  323. private
  324. { Private declarations }
  325. FBits : ^TBitArray;
  326. FSize : longint; { total longints currently allocated }
  327. FBSize: longint; {total bits currently allocated}
  328. findIndex : longint;
  329. findState : boolean;
  330. { functions and properties to match TBits class }
  331. procedure SetBit(bit : longint; value : Boolean);
  332. procedure SetSize(value : longint);
  333. procedure CheckBitIndex (Bit : longint;CurrentSize : Boolean);
  334. public
  335. { Public declarations }
  336. constructor Create(TheSize : longint = 0); virtual;
  337. destructor Destroy; override;
  338. function GetFSize : longint;
  339. procedure SetOn(Bit : longint);
  340. procedure Clear(Bit : longint);
  341. procedure Clearall;
  342. procedure AndBits(BitSet : TBits);
  343. procedure OrBits(BitSet : TBits);
  344. procedure XorBits(BitSet : TBits);
  345. procedure NotBits(BitSet : TBits);
  346. function Get(Bit : longint) : boolean;
  347. procedure Grow(NBit : longint);
  348. function Equals(Obj : TObject): Boolean; override; overload;
  349. function Equals(BitSet : TBits) : Boolean; overload;
  350. procedure SetIndex(Index : longint);
  351. function FindFirstBit(State : boolean) : longint;
  352. function FindNextBit : longint;
  353. function FindPrevBit : longint;
  354. { functions and properties to match TBits class }
  355. function OpenBit: longint;
  356. property Bits[Bit: longint]: Boolean read get write SetBit; default;
  357. property Size: longint read FBSize write setSize;
  358. end;
  359. { TPersistent abstract class }
  360. {$M+}
  361. TPersistent = class(TObject,IFPObserved)
  362. private
  363. FObservers : TFPList;
  364. procedure AssignError(Source: TPersistent);
  365. protected
  366. procedure AssignTo(Dest: TPersistent); virtual;
  367. procedure DefineProperties(Filer: TFiler); virtual;
  368. function GetOwner: TPersistent; dynamic;
  369. public
  370. Destructor Destroy; override;
  371. procedure Assign(Source: TPersistent); virtual;
  372. Procedure FPOAttachObserver(AObserver : TObject);
  373. Procedure FPODetachObserver(AObserver : TObject);
  374. Procedure FPONotifyObservers(ASender : TObject; AOperation : TFPObservedOperation; Data : Pointer);
  375. function GetNamePath: string; virtual; {dynamic;}
  376. end;
  377. {$M-}
  378. { TPersistent class reference type }
  379. TPersistentClass = class of TPersistent;
  380. { TInterfaced Persistent }
  381. TInterfacedPersistent = class(TPersistent, IInterface)
  382. private
  383. FOwnerInterface: IInterface;
  384. protected
  385. { IInterface }
  386. function _AddRef: Integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  387. function _Release: Integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  388. public
  389. function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} IID: TGUID; out Obj): HResult; virtual; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  390. procedure AfterConstruction; override;
  391. end;
  392. { TRecall class }
  393. TRecall = class(TObject)
  394. private
  395. FStorage, FReference: TPersistent;
  396. public
  397. constructor Create(AStorage, AReference: TPersistent);
  398. destructor Destroy; override;
  399. procedure Store;
  400. procedure Forget;
  401. property Reference: TPersistent read FReference;
  402. end;
  403. { TCollection class }
  404. TCollection = class;
  405. TCollectionItem = class(TPersistent)
  406. private
  407. FCollection: TCollection;
  408. FID: Integer;
  409. FUpdateCount: Integer;
  410. function GetIndex: Integer;
  411. protected
  412. procedure SetCollection(Value: TCollection);virtual;
  413. procedure Changed(AllItems: Boolean);
  414. function GetOwner: TPersistent; override;
  415. function GetDisplayName: string; virtual;
  416. procedure SetIndex(Value: Integer); virtual;
  417. procedure SetDisplayName(const Value: string); virtual;
  418. property UpdateCount: Integer read FUpdateCount;
  419. public
  420. constructor Create(ACollection: TCollection); virtual;
  421. destructor Destroy; override;
  422. function GetNamePath: string; override;
  423. property Collection: TCollection read FCollection write SetCollection;
  424. property ID: Integer read FID;
  425. property Index: Integer read GetIndex write SetIndex;
  426. property DisplayName: string read GetDisplayName write SetDisplayName;
  427. end;
  428. TCollectionEnumerator = class
  429. private
  430. FCollection: TCollection;
  431. FPosition: Integer;
  432. public
  433. constructor Create(ACollection: TCollection);
  434. function GetCurrent: TCollectionItem;
  435. function MoveNext: Boolean;
  436. property Current: TCollectionItem read GetCurrent;
  437. end;
  438. TCollectionItemClass = class of TCollectionItem;
  439. TCollectionNotification = (cnAdded, cnExtracting, cnDeleting);
  440. TCollectionSortCompare = function (Item1, Item2: TCollectionItem): Integer;
  441. TCollection = class(TPersistent)
  442. private
  443. FItemClass: TCollectionItemClass;
  444. FItems: TFpList;
  445. FUpdateCount: Integer;
  446. FNextID: Integer;
  447. FPropName: string;
  448. function GetCount: Integer;
  449. function GetPropName: string;
  450. procedure InsertItem(Item: TCollectionItem);
  451. procedure RemoveItem(Item: TCollectionItem);
  452. procedure DoClear;
  453. protected
  454. { Design-time editor support }
  455. function GetAttrCount: Integer; dynamic;
  456. function GetAttr(Index: Integer): string; dynamic;
  457. function GetItemAttr(Index, ItemIndex: Integer): string; dynamic;
  458. procedure Changed;
  459. function GetItem(Index: Integer): TCollectionItem;
  460. procedure SetItem(Index: Integer; Value: TCollectionItem);
  461. procedure SetItemName(Item: TCollectionItem); virtual;
  462. procedure SetPropName; virtual;
  463. procedure Update(Item: TCollectionItem); virtual;
  464. procedure Notify(Item: TCollectionItem;Action: TCollectionNotification); virtual;
  465. property PropName: string read GetPropName write FPropName;
  466. property UpdateCount: Integer read FUpdateCount;
  467. public
  468. constructor Create(AItemClass: TCollectionItemClass);
  469. destructor Destroy; override;
  470. function Owner: TPersistent;
  471. function Add: TCollectionItem;
  472. procedure Assign(Source: TPersistent); override;
  473. procedure BeginUpdate; virtual;
  474. procedure Clear;
  475. procedure EndUpdate; virtual;
  476. procedure Delete(Index: Integer);
  477. function GetEnumerator: TCollectionEnumerator;
  478. function GetNamePath: string; override;
  479. function Insert(Index: Integer): TCollectionItem;
  480. function FindItemID(ID: Integer): TCollectionItem;
  481. procedure Exchange(Const Index1, index2: integer);
  482. procedure Sort(Const Compare : TCollectionSortCompare);
  483. property Count: Integer read GetCount;
  484. property ItemClass: TCollectionItemClass read FItemClass;
  485. property Items[Index: Integer]: TCollectionItem read GetItem write SetItem;
  486. end;
  487. TOwnedCollection = class(TCollection)
  488. private
  489. FOwner: TPersistent;
  490. protected
  491. Function GetOwner: TPersistent; override;
  492. public
  493. Constructor Create(AOwner: TPersistent;AItemClass: TCollectionItemClass);
  494. end;
  495. TStrings = class;
  496. { IStringsAdapter interface }
  497. { Maintains link between TStrings and IStrings implementations }
  498. IStringsAdapter = interface ['{739C2F34-52EC-11D0-9EA6-0020AF3D82DA}']
  499. procedure ReferenceStrings(S: TStrings);
  500. procedure ReleaseStrings;
  501. end;
  502. { TStringsEnumerator class }
  503. TStringsEnumerator = class
  504. private
  505. FStrings: TStrings;
  506. FPosition: Integer;
  507. public
  508. constructor Create(AStrings: TStrings);
  509. function GetCurrent: String;
  510. function MoveNext: Boolean;
  511. property Current: String read GetCurrent;
  512. end;
  513. { TStrings class }
  514. TStrings = class(TPersistent)
  515. private
  516. FSpecialCharsInited : boolean;
  517. FQuoteChar : Char;
  518. FDelimiter : Char;
  519. FNameValueSeparator : Char;
  520. FUpdateCount: Integer;
  521. FAdapter: IStringsAdapter;
  522. FLBS : TTextLineBreakStyle;
  523. FStrictDelimiter : Boolean;
  524. function GetCommaText: string;
  525. function GetName(Index: Integer): string;
  526. function GetValue(const Name: string): string;
  527. Function GetLBS : TTextLineBreakStyle;
  528. Procedure SetLBS (AValue : TTextLineBreakStyle);
  529. procedure ReadData(Reader: TReader);
  530. procedure SetCommaText(const Value: string);
  531. procedure SetStringsAdapter(const Value: IStringsAdapter);
  532. procedure SetValue(const Name, Value: string);
  533. procedure SetDelimiter(c:Char);
  534. procedure SetQuoteChar(c:Char);
  535. procedure SetNameValueSeparator(c:Char);
  536. procedure WriteData(Writer: TWriter);
  537. procedure DoSetTextStr(const Value: string; DoClear : Boolean);
  538. protected
  539. procedure DefineProperties(Filer: TFiler); override;
  540. procedure Error(const Msg: string; Data: Integer);
  541. procedure Error(const Msg: pstring; Data: Integer);
  542. function Get(Index: Integer): string; virtual; abstract;
  543. function GetCapacity: Integer; virtual;
  544. function GetCount: Integer; virtual; abstract;
  545. function GetObject(Index: Integer): TObject; virtual;
  546. function GetTextStr: string; virtual;
  547. procedure Put(Index: Integer; const S: string); virtual;
  548. procedure PutObject(Index: Integer; AObject: TObject); virtual;
  549. procedure SetCapacity(NewCapacity: Integer); virtual;
  550. procedure SetTextStr(const Value: string); virtual;
  551. procedure SetUpdateState(Updating: Boolean); virtual;
  552. property UpdateCount: Integer read FUpdateCount;
  553. Function DoCompareText(const s1,s2 : string) : PtrInt; virtual;
  554. Function GetDelimitedText: string;
  555. Procedure SetDelimitedText(Const AValue: string);
  556. Function GetValueFromIndex(Index: Integer): string;
  557. Procedure SetValueFromIndex(Index: Integer; const Value: string);
  558. Procedure CheckSpecialChars;
  559. public
  560. destructor Destroy; override;
  561. function Add(const S: string): Integer; virtual;
  562. function AddObject(const S: string; AObject: TObject): Integer; virtual;
  563. procedure Append(const S: string);
  564. procedure AddStrings(TheStrings: TStrings); overload; virtual;
  565. procedure AddStrings(const TheStrings: array of string); overload; virtual;
  566. Procedure AddText(Const S : String); virtual;
  567. procedure Assign(Source: TPersistent); override;
  568. procedure BeginUpdate;
  569. procedure Clear; virtual; abstract;
  570. procedure Delete(Index: Integer); virtual; abstract;
  571. procedure EndUpdate;
  572. function Equals(Obj: TObject): Boolean; override; overload;
  573. function Equals(TheStrings: TStrings): Boolean; overload;
  574. procedure Exchange(Index1, Index2: Integer); virtual;
  575. function GetEnumerator: TStringsEnumerator;
  576. function GetText: PChar; virtual;
  577. function IndexOf(const S: string): Integer; virtual;
  578. function IndexOfName(const Name: string): Integer; virtual;
  579. function IndexOfObject(AObject: TObject): Integer; virtual;
  580. procedure Insert(Index: Integer; const S: string); virtual; abstract;
  581. procedure InsertObject(Index: Integer; const S: string;
  582. AObject: TObject);
  583. procedure LoadFromFile(const FileName: string); virtual;
  584. procedure LoadFromStream(Stream: TStream); virtual;
  585. procedure Move(CurIndex, NewIndex: Integer); virtual;
  586. procedure SaveToFile(const FileName: string); virtual;
  587. procedure SaveToStream(Stream: TStream); virtual;
  588. procedure SetText(TheText: PChar); virtual;
  589. procedure GetNameValue(Index : Integer; Out AName,AValue : String);
  590. function ExtractName(Const S:String):String;
  591. Property TextLineBreakStyle : TTextLineBreakStyle Read GetLBS Write SetLBS;
  592. property Delimiter: Char read FDelimiter write SetDelimiter;
  593. property DelimitedText: string read GetDelimitedText write SetDelimitedText;
  594. Property StrictDelimiter : Boolean Read FStrictDelimiter Write FStrictDelimiter;
  595. property QuoteChar: Char read FQuoteChar write SetQuoteChar;
  596. Property NameValueSeparator : Char Read FNameValueSeparator Write SetNameValueSeparator;
  597. property ValueFromIndex[Index: Integer]: string read GetValueFromIndex write SetValueFromIndex;
  598. property Capacity: Integer read GetCapacity write SetCapacity;
  599. property CommaText: string read GetCommaText write SetCommaText;
  600. property Count: Integer read GetCount;
  601. property Names[Index: Integer]: string read GetName;
  602. property Objects[Index: Integer]: TObject read GetObject write PutObject;
  603. property Values[const Name: string]: string read GetValue write SetValue;
  604. property Strings[Index: Integer]: string read Get write Put; default;
  605. property Text: string read GetTextStr write SetTextStr;
  606. property StringsAdapter: IStringsAdapter read FAdapter write SetStringsAdapter;
  607. end;
  608. { TStringList class }
  609. TStringList = class;
  610. TStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer;
  611. {$IFNDEF FPC_TESTGENERICS}
  612. PStringItem = ^TStringItem;
  613. TStringItem = record
  614. FString: string;
  615. FObject: TObject;
  616. end;
  617. PStringItemList = ^TStringItemList;
  618. TStringItemList = array[0..MaxListSize] of TStringItem;
  619. TStringList = class(TStrings)
  620. private
  621. FList: PStringItemList;
  622. FCount: Integer;
  623. FCapacity: Integer;
  624. FOnChange: TNotifyEvent;
  625. FOnChanging: TNotifyEvent;
  626. FDuplicates: TDuplicates;
  627. FCaseSensitive : Boolean;
  628. FSorted: Boolean;
  629. FForceSort : Boolean;
  630. FOwnsObjects : Boolean;
  631. procedure ExchangeItems(Index1, Index2: Integer);
  632. procedure Grow;
  633. procedure InternalClear;
  634. procedure QuickSort(L, R: Integer; CompareFn: TStringListSortCompare);
  635. procedure SetSorted(Value: Boolean);
  636. procedure SetCaseSensitive(b : boolean);
  637. protected
  638. procedure Changed; virtual;
  639. procedure Changing; virtual;
  640. function Get(Index: Integer): string; override;
  641. function GetCapacity: Integer; override;
  642. function GetCount: Integer; override;
  643. function GetObject(Index: Integer): TObject; override;
  644. procedure Put(Index: Integer; const S: string); override;
  645. procedure PutObject(Index: Integer; AObject: TObject); override;
  646. procedure SetCapacity(NewCapacity: Integer); override;
  647. procedure SetUpdateState(Updating: Boolean); override;
  648. procedure InsertItem(Index: Integer; const S: string); virtual;
  649. procedure InsertItem(Index: Integer; const S: string; O: TObject); virtual;
  650. Function DoCompareText(const s1,s2 : string) : PtrInt; override;
  651. public
  652. destructor Destroy; override;
  653. function Add(const S: string): Integer; override;
  654. procedure Clear; override;
  655. procedure Delete(Index: Integer); override;
  656. procedure Exchange(Index1, Index2: Integer); override;
  657. function Find(const S: string; Out Index: Integer): Boolean; virtual;
  658. function IndexOf(const S: string): Integer; override;
  659. procedure Insert(Index: Integer; const S: string); override;
  660. procedure Sort; virtual;
  661. procedure CustomSort(CompareFn: TStringListSortCompare); virtual;
  662. property Duplicates: TDuplicates read FDuplicates write FDuplicates;
  663. property Sorted: Boolean read FSorted write SetSorted;
  664. property CaseSensitive: Boolean read FCaseSensitive write SetCaseSensitive;
  665. property OnChange: TNotifyEvent read FOnChange write FOnChange;
  666. property OnChanging: TNotifyEvent read FOnChanging write FOnChanging;
  667. property OwnsObjects : boolean read FOwnsObjects write FOwnsObjects;
  668. end;
  669. {$else}
  670. TFPStrObjMap = specialize TFPGMap<string, TObject>;
  671. TStringListTextCompare = function(const s1, s2: string): PtrInt of object;
  672. TStringList = class(TStrings)
  673. private
  674. FMap: TFPStrObjMap;
  675. FCaseSensitive: Boolean;
  676. FOnChange: TNotifyEvent;
  677. FOnChanging: TNotifyEvent;
  678. FOnCompareText: TStringListTextCompare;
  679. FOwnsObjects : Boolean;
  680. procedure SetCaseSensitive(NewSensitive: Boolean);
  681. protected
  682. procedure Changed; virtual;
  683. procedure Changing; virtual;
  684. function DefaultCompareText(const s1, s2: string): PtrInt;
  685. function DoCompareText(const s1, s2: string): PtrInt; override;
  686. function Get(Index: Integer): string; override;
  687. function GetCapacity: Integer; override;
  688. function GetDuplicates: TDuplicates;
  689. function GetCount: Integer; override;
  690. function GetObject(Index: Integer): TObject; override;
  691. function GetSorted: Boolean; {$ifdef CLASSESINLINE} inline; {$endif}
  692. function MapPtrCompare(Key1, Key2: Pointer): Integer;
  693. procedure Put(Index: Integer; const S: string); override;
  694. procedure PutObject(Index: Integer; AObject: TObject); override;
  695. procedure QuickSort(L, R: Integer; CompareFn: TStringListSortCompare);
  696. procedure SetCapacity(NewCapacity: Integer); override;
  697. procedure SetDuplicates(NewDuplicates: TDuplicates);
  698. procedure SetSorted(NewSorted: Boolean); {$ifdef CLASSESINLINE} inline; {$endif}
  699. procedure SetUpdateState(Updating: Boolean); override;
  700. public
  701. constructor Create;
  702. destructor Destroy; override;
  703. function Add(const S: string): Integer; override;
  704. procedure Clear; override;
  705. procedure Delete(Index: Integer); override;
  706. procedure Exchange(Index1, Index2: Integer); override;
  707. function Find(const S: string; var Index: Integer): Boolean; virtual;
  708. function IndexOf(const S: string): Integer; override;
  709. procedure Insert(Index: Integer; const S: string); override;
  710. procedure Sort; virtual;
  711. procedure CustomSort(CompareFn: TStringListSortCompare);
  712. property Duplicates: TDuplicates read GetDuplicates write SetDuplicates;
  713. property Sorted: Boolean read GetSorted write SetSorted;
  714. property CaseSensitive: Boolean read FCaseSensitive write SetCaseSensitive;
  715. property OnChange: TNotifyEvent read FOnChange write FOnChange;
  716. property OnChanging: TNotifyEvent read FOnChanging write FOnChanging;
  717. property OnCompareText: TStringListTextCompare read FOnCompareText write FOnCompareText;
  718. property OwnsObjects : boolean read FOwnsObjects write FOwnsObjects;
  719. end;
  720. {$endif}
  721. { TStream abstract class }
  722. TStream = class(TObject)
  723. private
  724. protected
  725. procedure InvalidSeek; virtual;
  726. procedure Discard(const Count: Int64);
  727. procedure DiscardLarge(Count: int64; const MaxBufferSize: Longint);
  728. procedure FakeSeekForward(Offset: Int64; const Origin: TSeekOrigin; const Pos: Int64);
  729. function GetPosition: Int64; virtual;
  730. procedure SetPosition(const Pos: Int64); virtual;
  731. function GetSize: Int64; virtual;
  732. procedure SetSize64(const NewSize: Int64); virtual;
  733. procedure SetSize(NewSize: Longint); virtual;overload;
  734. procedure SetSize(const NewSize: Int64); virtual;overload;
  735. procedure ReadNotImplemented;
  736. procedure WriteNotImplemented;
  737. public
  738. function Read(var Buffer; Count: Longint): Longint; virtual;
  739. function Write(const Buffer; Count: Longint): Longint; virtual;
  740. function Seek(Offset: Longint; Origin: Word): Longint; virtual; overload;
  741. function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; virtual; overload;
  742. procedure ReadBuffer(var Buffer; Count: Longint);
  743. procedure WriteBuffer(const Buffer; Count: Longint);
  744. function CopyFrom(Source: TStream; Count: Int64): Int64;
  745. function ReadComponent(Instance: TComponent): TComponent;
  746. function ReadComponentRes(Instance: TComponent): TComponent;
  747. procedure WriteComponent(Instance: TComponent);
  748. procedure WriteComponentRes(const ResName: string; Instance: TComponent);
  749. procedure WriteDescendent(Instance, Ancestor: TComponent);
  750. procedure WriteDescendentRes(const ResName: string; Instance, Ancestor: TComponent);
  751. procedure WriteResourceHeader(const ResName: string; {!!!:out} var FixupInfo: Integer);
  752. procedure FixupResourceHeader(FixupInfo: Integer);
  753. procedure ReadResHeader;
  754. function ReadByte : Byte;
  755. function ReadWord : Word;
  756. function ReadDWord : Cardinal;
  757. function ReadQWord : QWord;
  758. function ReadAnsiString : String;
  759. procedure WriteByte(b : Byte);
  760. procedure WriteWord(w : Word);
  761. procedure WriteDWord(d : Cardinal);
  762. procedure WriteQWord(q : QWord);
  763. Procedure WriteAnsiString (const S : String);
  764. property Position: Int64 read GetPosition write SetPosition;
  765. property Size: Int64 read GetSize write SetSize64;
  766. end;
  767. TProxyStream = class(TStream)
  768. private
  769. FStream: IStream;
  770. protected
  771. function GetIStream: IStream;
  772. public
  773. constructor Create(const Stream: IStream);
  774. function Read(var Buffer; Count: Longint): Longint; override;
  775. function Write(const Buffer; Count: Longint): Longint; override;
  776. function Seek(const Offset: int64; Origin: TSeekOrigin): int64; override;
  777. procedure Check(err:longint); virtual;
  778. end;
  779. { TOwnerStream }
  780. TOwnerStream = Class(TStream)
  781. Protected
  782. FOwner : Boolean;
  783. FSource : TStream;
  784. Public
  785. Constructor Create(ASource : TStream);
  786. Destructor Destroy; override;
  787. Property Source : TStream Read FSource;
  788. Property SourceOwner : Boolean Read Fowner Write FOwner;
  789. end;
  790. IStreamPersist = interface ['{B8CD12A3-267A-11D4-83DA-00C04F60B2DD}']
  791. procedure LoadFromStream(Stream: TStream);
  792. procedure SaveToStream(Stream: TStream);
  793. end;
  794. { THandleStream class }
  795. THandleStream = class(TStream)
  796. private
  797. FHandle: THandle;
  798. protected
  799. procedure SetSize(NewSize: Longint); override;
  800. procedure SetSize(const NewSize: Int64); override;
  801. public
  802. constructor Create(AHandle: THandle);
  803. function Read(var Buffer; Count: Longint): Longint; override;
  804. function Write(const Buffer; Count: Longint): Longint; override;
  805. function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override;
  806. property Handle: THandle read FHandle;
  807. end;
  808. { TFileStream class }
  809. TFileStream = class(THandleStream)
  810. Private
  811. FFileName : String;
  812. public
  813. constructor Create(const AFileName: string; Mode: Word);
  814. constructor Create(const AFileName: string; Mode: Word; Rights: Cardinal);
  815. destructor Destroy; override;
  816. property FileName : String Read FFilename;
  817. end;
  818. { TCustomMemoryStream abstract class }
  819. TCustomMemoryStream = class(TStream)
  820. private
  821. FMemory: Pointer;
  822. FSize, FPosition: PtrInt;
  823. protected
  824. Function GetSize : Int64; Override;
  825. function GetPosition: Int64; Override;
  826. procedure SetPointer(Ptr: Pointer; ASize: PtrInt);
  827. public
  828. function Read(var Buffer; Count: LongInt): LongInt; override;
  829. function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override;
  830. procedure SaveToStream(Stream: TStream);
  831. procedure SaveToFile(const FileName: string);
  832. property Memory: Pointer read FMemory;
  833. end;
  834. { TMemoryStream }
  835. TMemoryStream = class(TCustomMemoryStream)
  836. private
  837. FCapacity: PtrInt;
  838. procedure SetCapacity(NewCapacity: PtrInt);
  839. protected
  840. function Realloc(var NewCapacity: PtrInt): Pointer; virtual;
  841. property Capacity: PtrInt read FCapacity write SetCapacity;
  842. public
  843. destructor Destroy; override;
  844. procedure Clear;
  845. procedure LoadFromStream(Stream: TStream);
  846. procedure LoadFromFile(const FileName: string);
  847. procedure SetSize({$ifdef CPU64}const NewSize: Int64{$else}NewSize: LongInt{$endif}); override;
  848. function Write(const Buffer; Count: LongInt): LongInt; override;
  849. end;
  850. { TBytesStream }
  851. TBytesStream = class(TMemoryStream)
  852. private
  853. FBytes: TBytes;
  854. protected
  855. function Realloc(var NewCapacity: PtrInt): Pointer; override;
  856. public
  857. constructor Create(const ABytes: TBytes); overload;
  858. property Bytes: TBytes read FBytes;
  859. end;
  860. { TStringStream }
  861. TStringStream = class(TStream)
  862. private
  863. FDataString: string;
  864. FPosition: Integer;
  865. protected
  866. Function GetSize : Int64; Override;
  867. function GetPosition: Int64; Override;
  868. procedure SetSize(NewSize: Longint); override;
  869. public
  870. constructor Create(const AString: string);
  871. function Read(var Buffer; Count: Longint): Longint; override;
  872. function ReadString(Count: Longint): string;
  873. function Seek(Offset: Longint; Origin: Word): Longint; override;
  874. function Write(const Buffer; Count: Longint): Longint; override;
  875. procedure WriteString(const AString: string);
  876. property DataString: string read FDataString;
  877. end;
  878. { TResourceStream }
  879. {$ifdef FPC_OS_UNICODE}
  880. TResourceStream = class(TCustomMemoryStream)
  881. private
  882. Res: TFPResourceHandle;
  883. Handle: TFPResourceHGLOBAL;
  884. procedure Initialize(Instance: TFPResourceHMODULE; Name, ResType: PWideChar; NameIsID: Boolean);
  885. public
  886. constructor Create(Instance: TFPResourceHMODULE; const ResName: WideString; ResType: PWideChar);
  887. constructor CreateFromID(Instance: TFPResourceHMODULE; ResID: Integer; ResType: PWideChar);
  888. destructor Destroy; override;
  889. end;
  890. {$else}
  891. TResourceStream = class(TCustomMemoryStream)
  892. private
  893. Res: TFPResourceHandle;
  894. Handle: TFPResourceHGLOBAL;
  895. procedure Initialize(Instance: TFPResourceHMODULE; Name, ResType: PChar; NameIsID: Boolean);
  896. public
  897. constructor Create(Instance: TFPResourceHMODULE; const ResName: string; ResType: PChar);
  898. constructor CreateFromID(Instance: TFPResourceHMODULE; ResID: Integer; ResType: PChar);
  899. destructor Destroy; override;
  900. end;
  901. {$endif FPC_OS_UNICODE}
  902. { TStreamAdapter }
  903. TStreamOwnership = (soReference, soOwned);
  904. { Implements OLE IStream on TStream }
  905. TStreamAdapter = class(TInterfacedObject, IStream)
  906. private
  907. FStream : TStream;
  908. FOwnership : TStreamOwnership;
  909. m_bReverted: Boolean;
  910. public
  911. constructor Create(Stream: TStream; Ownership: TStreamOwnership = soReference);
  912. destructor Destroy; override;
  913. function Read(pv: Pointer; cb: DWORD; pcbRead: PDWORD): HResult; virtual; stdcall;
  914. function Write(pv: Pointer; cb: DWORD; pcbWritten: PDWORD): HResult; virtual; stdcall;
  915. function Seek(dlibMove: Largeint; dwOrigin: Longint; out libNewPosition: Largeint): HResult; virtual; stdcall;
  916. function SetSize(libNewSize: Largeint): HResult; virtual; stdcall;
  917. function CopyTo(stm: IStream; cb: Largeint; out cbRead: Largeint; out cbWritten: Largeint): HResult; virtual; stdcall;
  918. function Commit(grfCommitFlags: Longint): HResult; virtual; stdcall;
  919. function Revert: HResult; virtual; stdcall;
  920. function LockRegion(libOffset: Largeint; cb: Largeint; dwLockType: Longint): HResult; virtual; stdcall;
  921. function UnlockRegion(libOffset: Largeint; cb: Largeint; dwLockType: Longint): HResult; virtual; stdcall;
  922. function Stat(out statstg: TStatStg; grfStatFlag: Longint): HResult; virtual; stdcall;
  923. function Clone(out stm: IStream): HResult; virtual; stdcall;
  924. property Stream: TStream read FStream;
  925. property StreamOwnership: TStreamOwnership read FOwnership write FOwnership;
  926. end;
  927. { TFiler }
  928. TValueType = (vaNull, vaList, vaInt8, vaInt16, vaInt32, vaExtended,
  929. vaString, vaIdent, vaFalse, vaTrue, vaBinary, vaSet, vaLString,
  930. vaNil, vaCollection, vaSingle, vaCurrency, vaDate, vaWString, vaInt64,
  931. vaUTF8String, vaUString, vaQWord);
  932. TFilerFlag = (ffInherited, ffChildPos, ffInline);
  933. TFilerFlags = set of TFilerFlag;
  934. TReaderProc = procedure(Reader: TReader) of object;
  935. TWriterProc = procedure(Writer: TWriter) of object;
  936. TStreamProc = procedure(Stream: TStream) of object;
  937. TFiler = class(TObject)
  938. private
  939. FRoot: TComponent;
  940. FLookupRoot: TComponent;
  941. FAncestor: TPersistent;
  942. FIgnoreChildren: Boolean;
  943. protected
  944. procedure SetRoot(ARoot: TComponent); virtual;
  945. public
  946. procedure DefineProperty(const Name: string;
  947. ReadData: TReaderProc; WriteData: TWriterProc;
  948. HasData: Boolean); virtual; abstract;
  949. procedure DefineBinaryProperty(const Name: string;
  950. ReadData, WriteData: TStreamProc;
  951. HasData: Boolean); virtual; abstract;
  952. property Root: TComponent read FRoot write SetRoot;
  953. property LookupRoot: TComponent read FLookupRoot;
  954. property Ancestor: TPersistent read FAncestor write FAncestor;
  955. property IgnoreChildren: Boolean read FIgnoreChildren write FIgnoreChildren;
  956. end;
  957. { TComponent class reference type }
  958. TComponentClass = class of TComponent;
  959. { TReader }
  960. TAbstractObjectReader = class
  961. public
  962. function NextValue: TValueType; virtual; abstract;
  963. function ReadValue: TValueType; virtual; abstract;
  964. procedure BeginRootComponent; virtual; abstract;
  965. procedure BeginComponent(var Flags: TFilerFlags; var AChildPos: Integer;
  966. var CompClassName, CompName: String); virtual; abstract;
  967. function BeginProperty: String; virtual; abstract;
  968. //Please don't use read, better use ReadBinary whenever possible
  969. procedure Read(var Buf; Count: LongInt); virtual; abstract;
  970. { All ReadXXX methods are called _after_ the value type has been read! }
  971. procedure ReadBinary(const DestData: TMemoryStream); virtual; abstract;
  972. {$ifndef FPUNONE}
  973. function ReadFloat: Extended; virtual; abstract;
  974. function ReadSingle: Single; virtual; abstract;
  975. function ReadDate: TDateTime; virtual; abstract;
  976. {$endif}
  977. function ReadCurrency: Currency; virtual; abstract;
  978. function ReadIdent(ValueType: TValueType): String; virtual; abstract;
  979. function ReadInt8: ShortInt; virtual; abstract;
  980. function ReadInt16: SmallInt; virtual; abstract;
  981. function ReadInt32: LongInt; virtual; abstract;
  982. function ReadInt64: Int64; virtual; abstract;
  983. function ReadSet(EnumType: Pointer): Integer; virtual; abstract;
  984. function ReadStr: String; virtual; abstract;
  985. function ReadString(StringType: TValueType): String; virtual; abstract;
  986. function ReadWideString: WideString;virtual;abstract;
  987. function ReadUnicodeString: UnicodeString;virtual;abstract;
  988. procedure SkipComponent(SkipComponentInfos: Boolean); virtual; abstract;
  989. procedure SkipValue; virtual; abstract;
  990. end;
  991. { TBinaryObjectReader }
  992. TBinaryObjectReader = class(TAbstractObjectReader)
  993. protected
  994. FStream: TStream;
  995. FBuffer: Pointer;
  996. FBufSize: Integer;
  997. FBufPos: Integer;
  998. FBufEnd: Integer;
  999. function ReadWord : word; {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}
  1000. function ReadDWord : longword; {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}
  1001. function ReadQWord : qword; {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}
  1002. {$ifndef FPUNONE}
  1003. function ReadExtended : extended; {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}
  1004. {$endif}
  1005. procedure SkipProperty;
  1006. procedure SkipSetBody;
  1007. public
  1008. constructor Create(Stream: TStream; BufSize: Integer);
  1009. destructor Destroy; override;
  1010. function NextValue: TValueType; override;
  1011. function ReadValue: TValueType; override;
  1012. procedure BeginRootComponent; override;
  1013. procedure BeginComponent(var Flags: TFilerFlags; var AChildPos: Integer;
  1014. var CompClassName, CompName: String); override;
  1015. function BeginProperty: String; override;
  1016. //Please don't use read, better use ReadBinary whenever possible
  1017. procedure Read(var Buf; Count: LongInt); override;
  1018. procedure ReadBinary(const DestData: TMemoryStream); override;
  1019. {$ifndef FPUNONE}
  1020. function ReadFloat: Extended; override;
  1021. function ReadSingle: Single; override;
  1022. function ReadDate: TDateTime; override;
  1023. {$endif}
  1024. function ReadCurrency: Currency; override;
  1025. function ReadIdent(ValueType: TValueType): String; override;
  1026. function ReadInt8: ShortInt; override;
  1027. function ReadInt16: SmallInt; override;
  1028. function ReadInt32: LongInt; override;
  1029. function ReadInt64: Int64; override;
  1030. function ReadSet(EnumType: Pointer): Integer; override;
  1031. function ReadStr: String; override;
  1032. function ReadString(StringType: TValueType): String; override;
  1033. function ReadWideString: WideString;override;
  1034. function ReadUnicodeString: UnicodeString;override;
  1035. procedure SkipComponent(SkipComponentInfos: Boolean); override;
  1036. procedure SkipValue; override;
  1037. end;
  1038. TFindMethodEvent = procedure(Reader: TReader; const MethodName: string;
  1039. var Address: CodePointer; var Error: Boolean) of object;
  1040. TSetMethodPropertyEvent = procedure(Reader: TReader; Instance: TPersistent;
  1041. PropInfo: PPropInfo; const TheMethodName: string;
  1042. var Handled: boolean) of object;
  1043. TSetNameEvent = procedure(Reader: TReader; Component: TComponent;
  1044. var Name: string) of object;
  1045. TReferenceNameEvent = procedure(Reader: TReader; var Name: string) of object;
  1046. TAncestorNotFoundEvent = procedure(Reader: TReader; const ComponentName: string;
  1047. ComponentClass: TPersistentClass; var Component: TComponent) of object;
  1048. TReadComponentsProc = procedure(Component: TComponent) of object;
  1049. TReaderError = procedure(Reader: TReader; const Message: string;
  1050. var Handled: Boolean) of object;
  1051. TPropertyNotFoundEvent = procedure(Reader: TReader; Instance: TPersistent;
  1052. var PropName: string; IsPath: boolean; var Handled, Skip: Boolean) of object;
  1053. TFindComponentClassEvent = procedure(Reader: TReader; const ClassName: string;
  1054. var ComponentClass: TComponentClass) of object;
  1055. TCreateComponentEvent = procedure(Reader: TReader;
  1056. ComponentClass: TComponentClass; var Component: TComponent) of object;
  1057. TReadWriteStringPropertyEvent = procedure(Sender:TObject;
  1058. const Instance: TPersistent; PropInfo: PPropInfo;
  1059. var Content:string) of object;
  1060. { TReader }
  1061. TReader = class(TFiler)
  1062. private
  1063. FDriver: TAbstractObjectReader;
  1064. FOwner: TComponent;
  1065. FParent: TComponent;
  1066. FFixups: TObject;
  1067. FLoaded: TFpList;
  1068. FOnFindMethod: TFindMethodEvent;
  1069. FOnSetMethodProperty: TSetMethodPropertyEvent;
  1070. FOnSetName: TSetNameEvent;
  1071. FOnReferenceName: TReferenceNameEvent;
  1072. FOnAncestorNotFound: TAncestorNotFoundEvent;
  1073. FOnError: TReaderError;
  1074. FOnPropertyNotFound: TPropertyNotFoundEvent;
  1075. FOnFindComponentClass: TFindComponentClassEvent;
  1076. FOnCreateComponent: TCreateComponentEvent;
  1077. FPropName: string;
  1078. FCanHandleExcepts: Boolean;
  1079. FOnReadStringProperty:TReadWriteStringPropertyEvent;
  1080. procedure DoFixupReferences;
  1081. function FindComponentClass(const AClassName: string): TComponentClass;
  1082. protected
  1083. function Error(const Message: string): Boolean; virtual;
  1084. function FindMethod(ARoot: TComponent; const AMethodName: string): CodePointer; virtual;
  1085. procedure ReadProperty(AInstance: TPersistent);
  1086. procedure ReadPropValue(Instance: TPersistent; PropInfo: Pointer);
  1087. procedure PropertyError;
  1088. procedure ReadData(Instance: TComponent);
  1089. property PropName: string read FPropName;
  1090. property CanHandleExceptions: Boolean read FCanHandleExcepts;
  1091. function CreateDriver(Stream: TStream; BufSize: Integer): TAbstractObjectReader; virtual;
  1092. public
  1093. constructor Create(Stream: TStream; BufSize: Integer);
  1094. destructor Destroy; override;
  1095. procedure BeginReferences;
  1096. procedure CheckValue(Value: TValueType);
  1097. procedure DefineProperty(const Name: string;
  1098. AReadData: TReaderProc; WriteData: TWriterProc;
  1099. HasData: Boolean); override;
  1100. procedure DefineBinaryProperty(const Name: string;
  1101. AReadData, WriteData: TStreamProc;
  1102. HasData: Boolean); override;
  1103. function EndOfList: Boolean;
  1104. procedure EndReferences;
  1105. procedure FixupReferences;
  1106. function NextValue: TValueType;
  1107. //Please don't use read, better use ReadBinary whenever possible
  1108. //uuups, ReadBinary is protected ..
  1109. procedure Read(var Buf; Count: LongInt); virtual;
  1110. function ReadBoolean: Boolean;
  1111. function ReadChar: Char;
  1112. function ReadWideChar: WideChar;
  1113. function ReadUnicodeChar: UnicodeChar;
  1114. procedure ReadCollection(Collection: TCollection);
  1115. function ReadComponent(Component: TComponent): TComponent;
  1116. procedure ReadComponents(AOwner, AParent: TComponent;
  1117. Proc: TReadComponentsProc);
  1118. {$ifndef FPUNONE}
  1119. function ReadFloat: Extended;
  1120. function ReadSingle: Single;
  1121. function ReadDate: TDateTime;
  1122. {$endif}
  1123. function ReadCurrency: Currency;
  1124. function ReadIdent: string;
  1125. function ReadInteger: Longint;
  1126. function ReadInt64: Int64;
  1127. function ReadSet(EnumType: Pointer): Integer;
  1128. procedure ReadListBegin;
  1129. procedure ReadListEnd;
  1130. function ReadRootComponent(ARoot: TComponent): TComponent;
  1131. function ReadVariant: Variant;
  1132. function ReadString: string;
  1133. function ReadWideString: WideString;
  1134. function ReadUnicodeString: UnicodeString;
  1135. function ReadValue: TValueType;
  1136. procedure CopyValue(Writer: TWriter);
  1137. property Driver: TAbstractObjectReader read FDriver;
  1138. property Owner: TComponent read FOwner write FOwner;
  1139. property Parent: TComponent read FParent write FParent;
  1140. property OnError: TReaderError read FOnError write FOnError;
  1141. property OnPropertyNotFound: TPropertyNotFoundEvent read FOnPropertyNotFound write FOnPropertyNotFound;
  1142. property OnFindMethod: TFindMethodEvent read FOnFindMethod write FOnFindMethod;
  1143. property OnSetMethodProperty: TSetMethodPropertyEvent read FOnSetMethodProperty write FOnSetMethodProperty;
  1144. property OnSetName: TSetNameEvent read FOnSetName write FOnSetName;
  1145. property OnReferenceName: TReferenceNameEvent read FOnReferenceName write FOnReferenceName;
  1146. property OnAncestorNotFound: TAncestorNotFoundEvent read FOnAncestorNotFound write FOnAncestorNotFound;
  1147. property OnCreateComponent: TCreateComponentEvent read FOnCreateComponent write FOnCreateComponent;
  1148. property OnFindComponentClass: TFindComponentClassEvent read FOnFindComponentClass write FOnFindComponentClass;
  1149. property OnReadStringProperty: TReadWriteStringPropertyEvent read FOnReadStringProperty write FOnReadStringProperty;
  1150. end;
  1151. { TWriter }
  1152. TAbstractObjectWriter = class
  1153. public
  1154. { Begin/End markers. Those ones who don't have an end indicator, use
  1155. "EndList", after the occurrence named in the comment. Note that this
  1156. only counts for "EndList" calls on the same level; each BeginXXX call
  1157. increases the current level. }
  1158. procedure BeginCollection; virtual; abstract; { Ends with the next "EndList" }
  1159. procedure BeginComponent(Component: TComponent; Flags: TFilerFlags;
  1160. ChildPos: Integer); virtual; abstract; { Ends after the second "EndList" }
  1161. procedure BeginList; virtual; abstract;
  1162. procedure EndList; virtual; abstract;
  1163. procedure BeginProperty(const PropName: String); virtual; abstract;
  1164. procedure EndProperty; virtual; abstract;
  1165. //Please don't use write, better use WriteBinary whenever possible
  1166. procedure Write(const Buffer; Count: Longint); virtual;abstract;
  1167. procedure WriteBinary(const Buffer; Count: Longint); virtual; abstract;
  1168. procedure WriteBoolean(Value: Boolean); virtual; abstract;
  1169. // procedure WriteChar(Value: Char);
  1170. {$ifndef FPUNONE}
  1171. procedure WriteFloat(const Value: Extended); virtual; abstract;
  1172. procedure WriteSingle(const Value: Single); virtual; abstract;
  1173. procedure WriteDate(const Value: TDateTime); virtual; abstract;
  1174. {$endif}
  1175. procedure WriteCurrency(const Value: Currency); virtual; abstract;
  1176. procedure WriteIdent(const Ident: string); virtual; abstract;
  1177. procedure WriteInteger(Value: Int64); virtual; abstract;
  1178. procedure WriteUInt64(Value: QWord); virtual; abstract;
  1179. procedure WriteVariant(const Value: Variant); virtual; abstract;
  1180. procedure WriteMethodName(const Name: String); virtual; abstract;
  1181. procedure WriteSet(Value: LongInt; SetType: Pointer); virtual; abstract;
  1182. procedure WriteString(const Value: String); virtual; abstract;
  1183. procedure WriteWideString(const Value: WideString);virtual;abstract;
  1184. procedure WriteUnicodeString(const Value: UnicodeString);virtual;abstract;
  1185. end;
  1186. { TBinaryObjectWriter }
  1187. TBinaryObjectWriter = class(TAbstractObjectWriter)
  1188. protected
  1189. FStream: TStream;
  1190. FBuffer: Pointer;
  1191. FBufSize: Integer;
  1192. FBufPos: Integer;
  1193. FBufEnd: Integer;
  1194. FSignatureWritten: Boolean;
  1195. procedure WriteWord(w : word); {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}
  1196. procedure WriteDWord(lw : longword); {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}
  1197. procedure WriteQWord(qw : qword); {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}
  1198. {$ifndef FPUNONE}
  1199. procedure WriteExtended(e : extended); {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}
  1200. {$endif}
  1201. procedure FlushBuffer;
  1202. procedure WriteValue(Value: TValueType);
  1203. public
  1204. constructor Create(Stream: TStream; BufSize: Integer);
  1205. destructor Destroy; override;
  1206. procedure BeginCollection; override;
  1207. procedure BeginComponent(Component: TComponent; Flags: TFilerFlags;
  1208. ChildPos: Integer); override;
  1209. procedure BeginList; override;
  1210. procedure EndList; override;
  1211. procedure BeginProperty(const PropName: String); override;
  1212. procedure EndProperty; override;
  1213. //Please don't use write, better use WriteBinary whenever possible
  1214. procedure Write(const Buffer; Count: Longint); override;
  1215. procedure WriteBinary(const Buffer; Count: LongInt); override;
  1216. procedure WriteBoolean(Value: Boolean); override;
  1217. {$ifndef FPUNONE}
  1218. procedure WriteFloat(const Value: Extended); override;
  1219. procedure WriteSingle(const Value: Single); override;
  1220. procedure WriteDate(const Value: TDateTime); override;
  1221. {$endif}
  1222. procedure WriteCurrency(const Value: Currency); override;
  1223. procedure WriteIdent(const Ident: string); override;
  1224. procedure WriteInteger(Value: Int64); override;
  1225. procedure WriteUInt64(Value: QWord); override;
  1226. procedure WriteMethodName(const Name: String); override;
  1227. procedure WriteSet(Value: LongInt; SetType: Pointer); override;
  1228. procedure WriteStr(const Value: String);
  1229. procedure WriteString(const Value: String); override;
  1230. procedure WriteWideString(const Value: WideString); override;
  1231. procedure WriteUnicodeString(const Value: UnicodeString); override;
  1232. procedure WriteVariant(const VarValue: Variant);override;
  1233. end;
  1234. TTextObjectWriter = class(TAbstractObjectWriter)
  1235. end;
  1236. TFindAncestorEvent = procedure (Writer: TWriter; Component: TComponent;
  1237. const Name: string; var Ancestor, RootAncestor: TComponent) of object;
  1238. TWriteMethodPropertyEvent = procedure (Writer: TWriter; Instance: TPersistent;
  1239. PropInfo: PPropInfo;
  1240. const MethodValue, DefMethodValue: TMethod;
  1241. var Handled: boolean) of object;
  1242. TWriter = class(TFiler)
  1243. private
  1244. FDriver: TAbstractObjectWriter;
  1245. FDestroyDriver: Boolean;
  1246. FRootAncestor: TComponent;
  1247. FPropPath: String;
  1248. FAncestors: TStringList;
  1249. FAncestorPos: Integer;
  1250. FCurrentPos: Integer;
  1251. FOnFindAncestor: TFindAncestorEvent;
  1252. FOnWriteMethodProperty: TWriteMethodPropertyEvent;
  1253. FOnWriteStringProperty:TReadWriteStringPropertyEvent;
  1254. procedure AddToAncestorList(Component: TComponent);
  1255. procedure WriteComponentData(Instance: TComponent);
  1256. Procedure DetermineAncestor(Component: TComponent);
  1257. procedure DoFindAncestor(Component : TComponent);
  1258. protected
  1259. procedure SetRoot(ARoot: TComponent); override;
  1260. procedure WriteBinary(AWriteData: TStreamProc);
  1261. procedure WriteProperty(Instance: TPersistent; PropInfo: Pointer);
  1262. procedure WriteProperties(Instance: TPersistent);
  1263. procedure WriteChildren(Component: TComponent);
  1264. function CreateDriver(Stream: TStream; BufSize: Integer): TAbstractObjectWriter; virtual;
  1265. public
  1266. constructor Create(ADriver: TAbstractObjectWriter);
  1267. constructor Create(Stream: TStream; BufSize: Integer);
  1268. destructor Destroy; override;
  1269. procedure DefineProperty(const Name: string;
  1270. ReadData: TReaderProc; AWriteData: TWriterProc;
  1271. HasData: Boolean); override;
  1272. procedure DefineBinaryProperty(const Name: string;
  1273. ReadData, AWriteData: TStreamProc;
  1274. HasData: Boolean); override;
  1275. //Please don't use write, better use WriteBinary whenever possible
  1276. //uuups, WriteBinary is protected ..
  1277. procedure Write(const Buffer; Count: Longint); virtual;
  1278. procedure WriteBoolean(Value: Boolean);
  1279. procedure WriteCollection(Value: TCollection);
  1280. procedure WriteComponent(Component: TComponent);
  1281. procedure WriteChar(Value: Char);
  1282. procedure WriteWideChar(Value: WideChar);
  1283. procedure WriteDescendent(ARoot: TComponent; AAncestor: TComponent);
  1284. {$ifndef FPUNONE}
  1285. procedure WriteFloat(const Value: Extended);
  1286. procedure WriteSingle(const Value: Single);
  1287. procedure WriteDate(const Value: TDateTime);
  1288. {$endif}
  1289. procedure WriteCurrency(const Value: Currency);
  1290. procedure WriteIdent(const Ident: string);
  1291. procedure WriteInteger(Value: Longint); overload;
  1292. procedure WriteInteger(Value: Int64); overload;
  1293. procedure WriteSet(Value: LongInt; SetType: Pointer);
  1294. procedure WriteListBegin;
  1295. procedure WriteListEnd;
  1296. procedure WriteRootComponent(ARoot: TComponent);
  1297. procedure WriteString(const Value: string);
  1298. procedure WriteWideString(const Value: WideString);
  1299. procedure WriteUnicodeString(const Value: UnicodeString);
  1300. procedure WriteVariant(const VarValue: Variant);
  1301. property RootAncestor: TComponent read FRootAncestor write FRootAncestor;
  1302. property OnFindAncestor: TFindAncestorEvent read FOnFindAncestor write FOnFindAncestor;
  1303. property OnWriteMethodProperty: TWriteMethodPropertyEvent read FOnWriteMethodProperty write FOnWriteMethodProperty;
  1304. property OnWriteStringProperty: TReadWriteStringPropertyEvent read FOnWriteStringProperty write FOnWriteStringProperty;
  1305. property Driver: TAbstractObjectWriter read FDriver;
  1306. property PropertyPath: string read FPropPath;
  1307. end;
  1308. { TParser }
  1309. TParser = class(TObject)
  1310. private
  1311. fStream : TStream;
  1312. fBuf : pchar;
  1313. fBufLen : integer;
  1314. fPos : integer;
  1315. fDeltaPos : integer;
  1316. fFloatType : char;
  1317. fSourceLine : integer;
  1318. fToken : char;
  1319. fEofReached : boolean;
  1320. fLastTokenStr : string;
  1321. fLastTokenWStr : widestring;
  1322. function GetTokenName(aTok : char) : string;
  1323. procedure LoadBuffer;
  1324. procedure CheckLoadBuffer; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
  1325. procedure ProcessChar; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
  1326. function IsNumber : boolean; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
  1327. function IsHexNum : boolean; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
  1328. function IsAlpha : boolean; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
  1329. function IsAlphaNum : boolean; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
  1330. function GetHexValue(c : char) : byte; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
  1331. function GetAlphaNum : string;
  1332. procedure HandleNewLine;
  1333. procedure SkipBOM;
  1334. procedure SkipSpaces;
  1335. procedure SkipWhitespace;
  1336. procedure HandleEof;
  1337. procedure HandleAlphaNum;
  1338. procedure HandleNumber;
  1339. procedure HandleHexNumber;
  1340. function HandleQuotedString : string;
  1341. procedure HandleDecimalCharacter(var ascii : boolean;
  1342. out WideChr: widechar; out StringChr: char);
  1343. procedure HandleString;
  1344. procedure HandleMinus;
  1345. procedure HandleUnknown;
  1346. public
  1347. constructor Create(Stream: TStream);
  1348. destructor Destroy; override;
  1349. procedure CheckToken(T: Char);
  1350. procedure CheckTokenSymbol(const S: string);
  1351. procedure Error(const Ident: string);
  1352. procedure ErrorFmt(const Ident: string; const Args: array of const);
  1353. procedure ErrorStr(const Message: string);
  1354. procedure HexToBinary(Stream: TStream);
  1355. function NextToken: Char;
  1356. function SourcePos: Longint;
  1357. function TokenComponentIdent: string;
  1358. {$ifndef FPUNONE}
  1359. function TokenFloat: Extended;
  1360. {$endif}
  1361. function TokenInt: Int64;
  1362. function TokenString: string;
  1363. function TokenWideString: WideString;
  1364. function TokenSymbolIs(const S: string): Boolean;
  1365. property FloatType: Char read fFloatType;
  1366. property SourceLine: Integer read fSourceLine;
  1367. property Token: Char read fToken;
  1368. end;
  1369. { TThread }
  1370. EThread = class(Exception);
  1371. EThreadExternalException = class(EThread);
  1372. EThreadDestroyCalled = class(EThread);
  1373. TSynchronizeProcVar = procedure;
  1374. TThreadMethod = procedure of object;
  1375. TThreadPriority = (tpIdle, tpLowest, tpLower, tpNormal, tpHigher, tpHighest,
  1376. tpTimeCritical);
  1377. TThread = class
  1378. private type
  1379. PThreadQueueEntry = ^TThreadQueueEntry;
  1380. TThreadQueueEntry = record
  1381. Method: TThreadMethod;
  1382. // uncomment once closures are supported
  1383. //ThreadProc: TThreadProcedure;
  1384. Thread: TThread;
  1385. Exception: Exception;
  1386. SyncEvent: PRtlEvent;
  1387. Next: PThreadQueueEntry;
  1388. end;
  1389. public type
  1390. TSystemTimes = record
  1391. IdleTime: QWord;
  1392. UserTime: QWord;
  1393. KernelTime: QWord;
  1394. NiceTime: QWord;
  1395. end;
  1396. private
  1397. class var FProcessorCount: LongWord;
  1398. private
  1399. FHandle: TThreadID;
  1400. FTerminated: Boolean;
  1401. FFreeOnTerminate: Boolean;
  1402. FFinished: Boolean;
  1403. FSuspended: LongBool;
  1404. FReturnValue: Integer;
  1405. FOnTerminate: TNotifyEvent;
  1406. FFatalException: TObject;
  1407. FExternalThread: Boolean;
  1408. FSynchronizeEntry: PThreadQueueEntry;
  1409. class function GetCurrentThread: TThread; static;
  1410. class function GetIsSingleProcessor: Boolean; static; inline;
  1411. procedure CallOnTerminate;
  1412. function GetPriority: TThreadPriority;
  1413. procedure SetPriority(Value: TThreadPriority);
  1414. procedure SetSuspended(Value: Boolean);
  1415. function GetSuspended: Boolean;
  1416. procedure InitSynchronizeEvent;
  1417. procedure DoneSynchronizeEvent;
  1418. { these two need to be implemented per platform }
  1419. procedure SysCreate(CreateSuspended: Boolean;
  1420. const StackSize: SizeUInt);
  1421. procedure SysDestroy;
  1422. protected
  1423. FThreadID: TThreadID; // someone might need it for pthread_* calls
  1424. procedure DoTerminate; virtual;
  1425. procedure Execute; virtual; abstract;
  1426. procedure Synchronize(AMethod: TThreadMethod);
  1427. procedure Queue(aMethod: TThreadMethod);
  1428. property ReturnValue: Integer read FReturnValue write FReturnValue;
  1429. property Terminated: Boolean read FTerminated;
  1430. {$ifdef windows}
  1431. private
  1432. FInitialSuspended: boolean;
  1433. {$endif}
  1434. {$ifdef Unix}
  1435. private
  1436. // see tthread.inc, ThreadFunc and TThread.Resume
  1437. FSem: Pointer;
  1438. FInitialSuspended: boolean;
  1439. FSuspendedExternal: boolean;
  1440. FSuspendedInternal: longbool;
  1441. FThreadReaped: boolean;
  1442. {$endif}
  1443. {$ifdef netwlibc}
  1444. private
  1445. // see tthread.inc, ThreadFunc and TThread.Resume
  1446. FSem: Pointer;
  1447. FInitialSuspended: boolean;
  1448. FSuspendedExternal: boolean;
  1449. FPid: LongInt;
  1450. {$endif}
  1451. public
  1452. constructor Create(CreateSuspended: Boolean;
  1453. const StackSize: SizeUInt = DefaultStackSize);
  1454. destructor Destroy; override;
  1455. { Note: Once closures are supported aProc will be changed to TProc }
  1456. class function CreateAnonymousThread(aProc: TProcedure): TThread; static;
  1457. { Use HAS_TTHREAD_NAMETHREADFORDEBUGGING to implement a platform specific
  1458. variant of the UnicodeString method. The AnsiString method calls the
  1459. UnicodeString method. If your platform's API only supports AnsiString you
  1460. can additionally define THREADNAME_IS_ANSISTRING to swap the logic. Then
  1461. the UnicodeString variant will call the AnsiString variant which can be
  1462. implemented for a specific platform }
  1463. class procedure NameThreadForDebugging(aThreadName: UnicodeString; aThreadID: TThreadID = TThreadID(-1)); static;
  1464. class procedure NameThreadForDebugging(aThreadName: AnsiString; aThreadID: TThreadID = TThreadID(-1)); static; inline;
  1465. class procedure SetReturnValue(aValue: Integer); static;
  1466. class function CheckTerminated: Boolean; static;
  1467. class procedure Synchronize(AThread: TThread; AMethod: TThreadMethod);
  1468. class procedure Queue(aThread: TThread; aMethod: TThreadMethod); static;
  1469. class procedure RemoveQueuedEvents(aThread: TThread; aMethod: TThreadMethod); static;
  1470. class procedure RemoveQueuedEvents(aMethod: TThreadMethod); static;
  1471. class procedure RemoveQueuedEvents(aThread: TThread); static;
  1472. class procedure SpinWait(aIterations: LongWord); static;
  1473. class procedure Sleep(aMilliseconds: Cardinal); static;
  1474. class procedure Yield; static;
  1475. { use HAS_TTHREAD_GETSYSTEMTIMES to implement a platform specific variant
  1476. which does not return a zeroed record }
  1477. class procedure GetSystemTimes(out aSystemTimes: TSystemTimes); static;
  1478. class function GetTickCount: LongWord; static; deprecated 'Use TThread.GetTickCount64 instead';
  1479. class function GetTickCount64: QWord; static;
  1480. procedure AfterConstruction; override;
  1481. procedure Start;
  1482. procedure Resume; deprecated;
  1483. procedure Suspend; deprecated;
  1484. procedure Terminate;
  1485. function WaitFor: Integer;
  1486. class property CurrentThread: TThread read GetCurrentThread;
  1487. class property ProcessorCount: LongWord read FProcessorCount;
  1488. class property IsSingleProcessor: Boolean read GetIsSingleProcessor;
  1489. property FreeOnTerminate: Boolean read FFreeOnTerminate write FFreeOnTerminate;
  1490. property Handle: TThreadID read FHandle;
  1491. property ExternalThread: Boolean read FExternalThread;
  1492. property Priority: TThreadPriority read GetPriority write SetPriority;
  1493. property Suspended: Boolean read GetSuspended write SetSuspended;
  1494. property Finished: Boolean read FFinished;
  1495. property ThreadID: TThreadID read FThreadID;
  1496. property OnTerminate: TNotifyEvent read FOnTerminate write FOnTerminate;
  1497. property FatalException: TObject read FFatalException;
  1498. end;
  1499. { TComponent class }
  1500. TOperation = (opInsert, opRemove);
  1501. TComponentState = set of (csLoading, csReading, csWriting, csDestroying,
  1502. csDesigning, csAncestor, csUpdating, csFixups, csFreeNotification,
  1503. csInline, csDesignInstance);
  1504. TComponentStyle = set of (csInheritable, csCheckPropAvail, csSubComponent,
  1505. csTransient);
  1506. TGetChildProc = procedure (Child: TComponent) of object;
  1507. IVCLComObject = interface
  1508. ['{E07892A0-F52F-11CF-BD2F-0020AF0E5B81}']
  1509. function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
  1510. function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
  1511. function GetIDsOfNames(const IID: TGUID; Names: Pointer;
  1512. NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
  1513. function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
  1514. Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
  1515. function SafeCallException(ExceptObject: TObject; ExceptAddr: Pointer): HResult;
  1516. procedure FreeOnRelease;
  1517. end;
  1518. IInterfaceComponentReference = interface
  1519. ['{3FEEC8E1-E400-4A24-BCAC-1F01476439B1}']
  1520. function GetComponent:TComponent;
  1521. end;
  1522. IDesignerNotify = interface
  1523. ['{B971E807-E3A6-11D1-AAB1-00C04FB16FBC}']
  1524. procedure Modified;
  1525. procedure Notification(AnObject: TPersistent; Operation: TOperation);
  1526. end;
  1527. TComponentEnumerator = class
  1528. private
  1529. FComponent: TComponent;
  1530. FPosition: Integer;
  1531. public
  1532. constructor Create(AComponent: TComponent);
  1533. function GetCurrent: TComponent;
  1534. function MoveNext: Boolean;
  1535. property Current: TComponent read GetCurrent;
  1536. end;
  1537. TBasicAction = class;
  1538. { TComponent }
  1539. TComponent = class(TPersistent,IUnknown,IInterfaceComponentReference)
  1540. private
  1541. FOwner: TComponent;
  1542. FName: TComponentName;
  1543. FTag: Ptrint;
  1544. FComponents: TFpList;
  1545. FFreeNotifies: TFpList;
  1546. FDesignInfo: Longint;
  1547. FVCLComObject: Pointer;
  1548. FComponentState: TComponentState;
  1549. function GetComObject: IUnknown;
  1550. function GetComponent(AIndex: Integer): TComponent;
  1551. function GetComponentCount: Integer;
  1552. function GetComponentIndex: Integer;
  1553. procedure Insert(AComponent: TComponent);
  1554. procedure ReadLeft(Reader: TReader);
  1555. procedure ReadTop(Reader: TReader);
  1556. procedure Remove(AComponent: TComponent);
  1557. procedure RemoveNotification(AComponent: TComponent);
  1558. procedure SetComponentIndex(Value: Integer);
  1559. procedure SetReference(Enable: Boolean);
  1560. procedure WriteLeft(Writer: TWriter);
  1561. procedure WriteTop(Writer: TWriter);
  1562. protected
  1563. FComponentStyle: TComponentStyle;
  1564. procedure ChangeName(const NewName: TComponentName);
  1565. procedure DefineProperties(Filer: TFiler); override;
  1566. procedure GetChildren(Proc: TGetChildProc; Root: TComponent); dynamic;
  1567. function GetChildOwner: TComponent; dynamic;
  1568. function GetChildParent: TComponent; dynamic;
  1569. function GetOwner: TPersistent; override;
  1570. procedure Loaded; virtual;
  1571. procedure Loading; virtual;
  1572. procedure Notification(AComponent: TComponent;
  1573. Operation: TOperation); virtual;
  1574. procedure PaletteCreated; dynamic;
  1575. procedure ReadState(Reader: TReader); virtual;
  1576. procedure SetAncestor(Value: Boolean);
  1577. procedure SetDesigning(Value: Boolean; SetChildren : Boolean = True);
  1578. procedure SetDesignInstance(Value: Boolean);
  1579. procedure SetInline(Value: Boolean);
  1580. procedure SetName(const NewName: TComponentName); virtual;
  1581. procedure SetChildOrder(Child: TComponent; Order: Integer); dynamic;
  1582. procedure SetParentComponent(Value: TComponent); dynamic;
  1583. procedure Updating; dynamic;
  1584. procedure Updated; dynamic;
  1585. class procedure UpdateRegistry(Register: Boolean; const ClassID, ProgID: string); dynamic;
  1586. procedure ValidateRename(AComponent: TComponent;
  1587. const CurName, NewName: string); virtual;
  1588. procedure ValidateContainer(AComponent: TComponent); dynamic;
  1589. procedure ValidateInsert(AComponent: TComponent); dynamic;
  1590. { IUnknown }
  1591. function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} IID: TGUID; out Obj): Hresult; virtual; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  1592. function _AddRef: Integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  1593. function _Release: Integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  1594. function iicrGetComponent: TComponent;
  1595. { IDispatch }
  1596. function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
  1597. function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
  1598. function GetIDsOfNames(const IID: TGUID; Names: Pointer;
  1599. NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
  1600. function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
  1601. Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
  1602. public
  1603. //!! Moved temporary
  1604. // fpdoc doesn't handle this yet :(
  1605. {$ifndef fpdocsystem}
  1606. function IInterfaceComponentReference.GetComponent=iicrgetcomponent;
  1607. {$endif}
  1608. procedure WriteState(Writer: TWriter); virtual;
  1609. constructor Create(AOwner: TComponent); virtual;
  1610. destructor Destroy; override;
  1611. procedure BeforeDestruction; override;
  1612. procedure DestroyComponents;
  1613. procedure Destroying;
  1614. function ExecuteAction(Action: TBasicAction): Boolean; dynamic;
  1615. function FindComponent(const AName: string): TComponent;
  1616. procedure FreeNotification(AComponent: TComponent);
  1617. procedure RemoveFreeNotification(AComponent: TComponent);
  1618. procedure FreeOnRelease;
  1619. function GetEnumerator: TComponentEnumerator;
  1620. function GetNamePath: string; override;
  1621. function GetParentComponent: TComponent; dynamic;
  1622. function HasParent: Boolean; dynamic;
  1623. procedure InsertComponent(AComponent: TComponent);
  1624. procedure RemoveComponent(AComponent: TComponent);
  1625. function SafeCallException(ExceptObject: TObject;
  1626. ExceptAddr: Pointer): HResult; override;
  1627. procedure SetSubComponent(ASubComponent: Boolean);
  1628. function UpdateAction(Action: TBasicAction): Boolean; dynamic;
  1629. property ComObject: IUnknown read GetComObject;
  1630. function IsImplementorOf (const Intf:IInterface):boolean;
  1631. procedure ReferenceInterface(const intf:IInterface;op:TOperation);
  1632. property Components[Index: Integer]: TComponent read GetComponent;
  1633. property ComponentCount: Integer read GetComponentCount;
  1634. property ComponentIndex: Integer read GetComponentIndex write SetComponentIndex;
  1635. property ComponentState: TComponentState read FComponentState;
  1636. property ComponentStyle: TComponentStyle read FComponentStyle;
  1637. property DesignInfo: Longint read FDesignInfo write FDesignInfo;
  1638. property Owner: TComponent read FOwner;
  1639. property VCLComObject: Pointer read FVCLComObject write FVCLComObject;
  1640. published
  1641. property Name: TComponentName read FName write SetName stored False;
  1642. property Tag: PtrInt read FTag write FTag default 0;
  1643. end;
  1644. { TBasicActionLink }
  1645. TBasicActionLink = class(TObject)
  1646. private
  1647. FOnChange: TNotifyEvent;
  1648. protected
  1649. FAction: TBasicAction;
  1650. procedure AssignClient(AClient: TObject); virtual;
  1651. procedure Change; virtual;
  1652. function IsOnExecuteLinked: Boolean; virtual;
  1653. procedure SetAction(Value: TBasicAction); virtual;
  1654. procedure SetOnExecute(Value: TNotifyEvent); virtual;
  1655. public
  1656. constructor Create(AClient: TObject); virtual;
  1657. destructor Destroy; override;
  1658. function Execute(AComponent: TComponent = nil): Boolean; virtual;
  1659. function Update: Boolean; virtual;
  1660. property Action: TBasicAction read FAction write SetAction;
  1661. property OnChange: TNotifyEvent read FOnChange write FOnChange;
  1662. end;
  1663. TBasicActionLinkClass = class of TBasicActionLink;
  1664. { TBasicAction }
  1665. TBasicAction = class(TComponent)
  1666. private
  1667. FActionComponent: TComponent;
  1668. FOnChange: TNotifyEvent;
  1669. FOnExecute: TNotifyEvent;
  1670. FOnUpdate: TNotifyEvent;
  1671. protected
  1672. FClients: TFpList;
  1673. procedure Change; virtual;
  1674. procedure SetOnExecute(Value: TNotifyEvent); virtual;
  1675. property OnChange: TNotifyEvent read FOnChange write FOnChange;
  1676. public
  1677. constructor Create(AOwner: TComponent); override;
  1678. destructor Destroy; override;
  1679. function HandlesTarget(Target: TObject): Boolean; virtual;
  1680. procedure UpdateTarget(Target: TObject); virtual;
  1681. procedure ExecuteTarget(Target: TObject); virtual;
  1682. function Execute: Boolean; dynamic;
  1683. procedure RegisterChanges(Value: TBasicActionLink);
  1684. procedure UnRegisterChanges(Value: TBasicActionLink);
  1685. function Update: Boolean; virtual;
  1686. property ActionComponent: TComponent read FActionComponent write FActionComponent;
  1687. property OnExecute: TNotifyEvent read FOnExecute write SetOnExecute;
  1688. property OnUpdate: TNotifyEvent read FOnUpdate write FOnUpdate;
  1689. end;
  1690. { TBasicAction class reference type }
  1691. TBasicActionClass = class of TBasicAction;
  1692. { Component registration handlers }
  1693. TActiveXRegType = (axrComponentOnly, axrIncludeDescendants);
  1694. IInterfaceList = interface ['{285DEA8A-B865-11D1-AAA7-00C04FB17A72}']
  1695. function Get(i : Integer) : IUnknown;
  1696. function GetCapacity : Integer;
  1697. function GetCount : Integer;
  1698. procedure Put(i : Integer;item : IUnknown);
  1699. procedure SetCapacity(NewCapacity : Integer);
  1700. procedure SetCount(NewCount : Integer);
  1701. procedure Clear;
  1702. procedure Delete(index : Integer);
  1703. procedure Exchange(index1,index2 : Integer);
  1704. function First : IUnknown;
  1705. function IndexOf(item : IUnknown) : Integer;
  1706. function Add(item : IUnknown) : Integer;
  1707. procedure Insert(i : Integer;item : IUnknown);
  1708. function Last : IUnknown;
  1709. function Remove(item : IUnknown): Integer;
  1710. procedure Lock;
  1711. procedure Unlock;
  1712. property Capacity : Integer read GetCapacity write SetCapacity;
  1713. property Count : Integer read GetCount write SetCount;
  1714. property Items[index : Integer] : IUnknown read Get write Put;default;
  1715. end;
  1716. TInterfaceList = class;
  1717. TInterfaceListEnumerator = class
  1718. private
  1719. FList: TInterfaceList;
  1720. FPosition: Integer;
  1721. public
  1722. constructor Create(AList: TInterfaceList);
  1723. function GetCurrent: IUnknown;
  1724. function MoveNext: Boolean;
  1725. property Current: IUnknown read GetCurrent;
  1726. end;
  1727. TInterfaceList = class(TInterfacedObject,IInterfaceList)
  1728. private
  1729. FList : TThreadList;
  1730. protected
  1731. function Get(i : Integer) : IUnknown;
  1732. function GetCapacity : Integer;
  1733. function GetCount : Integer;
  1734. procedure Put(i : Integer;item : IUnknown);
  1735. procedure SetCapacity(NewCapacity : Integer);
  1736. procedure SetCount(NewCount : Integer);
  1737. public
  1738. constructor Create;
  1739. destructor Destroy; override;
  1740. procedure Clear;
  1741. procedure Delete(index : Integer);
  1742. procedure Exchange(index1,index2 : Integer);
  1743. function First : IUnknown;
  1744. function GetEnumerator: TInterfaceListEnumerator;
  1745. function IndexOf(item : IUnknown) : Integer;
  1746. function Add(item : IUnknown) : Integer;
  1747. procedure Insert(i : Integer;item : IUnknown);
  1748. function Last : IUnknown;
  1749. function Remove(item : IUnknown): Integer;
  1750. procedure Lock;
  1751. procedure Unlock;
  1752. function Expand : TInterfaceList;
  1753. property Capacity : Integer read GetCapacity write SetCapacity;
  1754. property Count : Integer read GetCount write SetCount;
  1755. property Items[Index : Integer] : IUnknown read Get write Put;default;
  1756. end;
  1757. { ---------------------------------------------------------------------
  1758. TDatamodule support
  1759. ---------------------------------------------------------------------}
  1760. TDataModule = class(TComponent)
  1761. private
  1762. FDPos: TPoint;
  1763. FDSize: TPoint;
  1764. FOnCreate: TNotifyEvent;
  1765. FOnDestroy: TNotifyEvent;
  1766. FOldOrder : Boolean;
  1767. Procedure ReadT(Reader: TReader);
  1768. Procedure WriteT(Writer: TWriter);
  1769. Procedure ReadL(Reader: TReader);
  1770. Procedure WriteL(Writer: TWriter);
  1771. Procedure ReadW(Reader: TReader);
  1772. Procedure WriteW(Writer: TWriter);
  1773. Procedure ReadH(Reader: TReader);
  1774. Procedure WriteH(Writer: TWriter);
  1775. protected
  1776. Procedure DoCreate; virtual;
  1777. Procedure DoDestroy; virtual;
  1778. Procedure DefineProperties(Filer: TFiler); override;
  1779. Procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
  1780. Function HandleCreateException: Boolean; virtual;
  1781. Procedure ReadState(Reader: TReader); override;
  1782. public
  1783. constructor Create(AOwner: TComponent); override;
  1784. Constructor CreateNew(AOwner: TComponent);
  1785. Constructor CreateNew(AOwner: TComponent; CreateMode: Integer); virtual;
  1786. destructor Destroy; override;
  1787. Procedure AfterConstruction; override;
  1788. Procedure BeforeDestruction; override;
  1789. property DesignOffset: TPoint read FDPos write FDPos;
  1790. property DesignSize: TPoint read FDSize write FDSize;
  1791. published
  1792. property OnCreate: TNotifyEvent read FOnCreate write FOnCreate;
  1793. property OnDestroy: TNotifyEvent read FOnDestroy write FOnDestroy;
  1794. property OldCreateOrder: Boolean read FOldOrder write FOldOrder;
  1795. end;
  1796. TDataModuleClass = Class of TDataModule;
  1797. var
  1798. // IDE hooks for TDatamodule support.
  1799. AddDataModule : procedure (DataModule: TDataModule) of object;
  1800. RemoveDataModule : procedure (DataModule: TDataModule) of object;
  1801. ApplicationHandleException : procedure (Sender: TObject) of object;
  1802. ApplicationShowException : procedure (E: Exception) of object;
  1803. { ---------------------------------------------------------------------
  1804. tthread helpers
  1805. ---------------------------------------------------------------------}
  1806. { function to be called when gui thread is ready to execute method
  1807. result is true if a method has been executed
  1808. }
  1809. function CheckSynchronize(timeout : longint=0) : boolean;
  1810. var
  1811. { method proc that is called to trigger gui thread to execute a
  1812. method }
  1813. WakeMainThread : TNotifyEvent = nil;
  1814. { ---------------------------------------------------------------------
  1815. General streaming and registration routines
  1816. ---------------------------------------------------------------------}
  1817. var
  1818. RegisterComponentsProc: procedure(const Page: string;
  1819. ComponentClasses: array of TComponentClass);
  1820. RegisterNoIconProc: procedure(ComponentClasses: array of TComponentClass);
  1821. {!!!! RegisterNonActiveXProc: procedure(ComponentClasses: array of TComponentClass;
  1822. AxRegType: TActiveXRegType) = nil;
  1823. CurrentGroup: Integer = -1;}
  1824. CreateVCLComObjectProc: procedure(Component: TComponent) = nil;
  1825. { Point and rectangle constructors }
  1826. function Point(AX, AY: Integer): TPoint;
  1827. function SmallPoint(AX, AY: SmallInt): TSmallPoint;
  1828. function Rect(ALeft, ATop, ARight, ABottom: Integer): TRect;
  1829. function Bounds(ALeft, ATop, AWidth, AHeight: Integer): TRect;
  1830. function PointsEqual(const P1, P2: TPoint): Boolean; {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}
  1831. function PointsEqual(const P1, P2: TSmallPoint): Boolean; {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}
  1832. function InvalidPoint(X, Y: Integer): Boolean;
  1833. function InvalidPoint(const At: TPoint): Boolean;
  1834. function InvalidPoint(const At: TSmallPoint): Boolean;
  1835. { Class registration routines }
  1836. procedure RegisterClass(AClass: TPersistentClass);
  1837. procedure RegisterClasses(AClasses: array of TPersistentClass);
  1838. procedure RegisterClassAlias(AClass: TPersistentClass; const Alias: string);
  1839. procedure UnRegisterClass(AClass: TPersistentClass);
  1840. procedure UnRegisterClasses(AClasses: array of TPersistentClass);
  1841. procedure UnRegisterModuleClasses(Module: HMODULE);
  1842. function FindClass(const AClassName: string): TPersistentClass;
  1843. function GetClass(const AClassName: string): TPersistentClass;
  1844. procedure StartClassGroup(AClass: TPersistentClass);
  1845. procedure GroupDescendentsWith(AClass, AClassGroup: TPersistentClass);
  1846. function ActivateClassGroup(AClass: TPersistentClass): TPersistentClass;
  1847. function ClassGroupOf(AClass: TPersistentClass): TPersistentClass;
  1848. function ClassGroupOf(Instance: TPersistent): TPersistentClass;
  1849. { Component registration routines }
  1850. procedure RegisterComponents(const Page: string;
  1851. ComponentClasses: array of TComponentClass);
  1852. procedure RegisterNoIcon(ComponentClasses: array of TComponentClass);
  1853. procedure RegisterNonActiveX(ComponentClasses: array of TComponentClass;
  1854. AxRegType: TActiveXRegType);
  1855. var
  1856. GlobalNameSpace: IReadWriteSync;
  1857. { Object filing routines }
  1858. type
  1859. TIdentMapEntry = record
  1860. Value: Integer;
  1861. Name: String;
  1862. end;
  1863. TIdentToInt = function(const Ident: string; var Int: Longint): Boolean;
  1864. TIntToIdent = function(Int: Longint; var Ident: string): Boolean;
  1865. TFindGlobalComponent = function(const Name: string): TComponent;
  1866. TInitComponentHandler = function(Instance: TComponent; RootAncestor : TClass): boolean;
  1867. var
  1868. MainThreadID: TThreadID;
  1869. procedure RegisterIntegerConsts(IntegerType: Pointer; IdentToIntFn: TIdentToInt;
  1870. IntToIdentFn: TIntToIdent);
  1871. function IdentToInt(const Ident: string; var Int: Longint; const Map: array of TIdentMapEntry): Boolean;
  1872. function IntToIdent(Int: Longint; var Ident: string; const Map: array of TIdentMapEntry): Boolean;
  1873. function FindIntToIdent(AIntegerType: Pointer): TIntToIdent;
  1874. function FindIdentToInt(AIntegerType: Pointer): TIdentToInt;
  1875. procedure RegisterFindGlobalComponentProc(AFindGlobalComponent: TFindGlobalComponent);
  1876. procedure UnregisterFindGlobalComponentProc(AFindGlobalComponent: TFindGlobalComponent);
  1877. function FindGlobalComponent(const Name: string): TComponent;
  1878. function InitInheritedComponent(Instance: TComponent; RootAncestor: TClass): Boolean;
  1879. function InitComponentRes(const ResName: string; Instance: TComponent): Boolean;
  1880. function ReadComponentRes(const ResName: string; Instance: TComponent): TComponent;
  1881. function ReadComponentResEx(HInstance: THandle; const ResName: string): TComponent;
  1882. function ReadComponentResFile(const FileName: string; Instance: TComponent): TComponent;
  1883. procedure WriteComponentResFile(const FileName: string; Instance: TComponent);
  1884. procedure RegisterInitComponentHandler(ComponentClass: TComponentClass; Handler: TInitComponentHandler);
  1885. procedure GlobalFixupReferences;
  1886. procedure GetFixupReferenceNames(Root: TComponent; Names: TStrings);
  1887. procedure GetFixupInstanceNames(Root: TComponent;
  1888. const ReferenceRootName: string; Names: TStrings);
  1889. procedure RedirectFixupReferences(Root: TComponent; const OldRootName,
  1890. NewRootName: string);
  1891. procedure RemoveFixupReferences(Root: TComponent; const RootName: string);
  1892. procedure RemoveFixups(Instance: TPersistent);
  1893. Function FindNestedComponent(Root : TComponent; APath : String; CStyle : Boolean = True) : TComponent;
  1894. procedure BeginGlobalLoading;
  1895. procedure NotifyGlobalLoading;
  1896. procedure EndGlobalLoading;
  1897. function CollectionsEqual(C1, C2: TCollection): Boolean;
  1898. function CollectionsEqual(C1, C2: TCollection; Owner1, Owner2: TComponent): Boolean;
  1899. { Object conversion routines }
  1900. type
  1901. TObjectTextEncoding = (
  1902. oteDFM,
  1903. oteLFM
  1904. );
  1905. procedure ObjectBinaryToText(Input, Output: TStream; Encoding: TObjectTextEncoding);
  1906. procedure ObjectBinaryToText(Input, Output: TStream);
  1907. procedure ObjectTextToBinary(Input, Output: TStream);
  1908. procedure ObjectResourceToText(Input, Output: TStream);
  1909. procedure ObjectTextToResource(Input, Output: TStream);
  1910. { Utility routines }
  1911. function LineStart(Buffer, BufPos: PChar): PChar;
  1912. procedure BinToHex(BinValue, HexValue: PChar; BinBufSize: Integer);
  1913. function HexToBin(HexValue, BinValue: PChar; BinBufSize: Integer): Integer;
  1914. function ExtractStrings(Separators, WhiteSpace: TSysCharSet; Content: PChar; Strings: TStrings): Integer;