classesh.inc 121 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896
  1. {%MainUnit classes.pp}
  2. {
  3. This file is part of the Free Pascal Run Time Library (rtl)
  4. Copyright (c) 1999-2008 by Michael Van Canneyt, Florian Klaempfl,
  5. and Micha Nelissen
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. {$ifdef CLASSESINLINE}{$inline on}{$endif}
  13. {$MACRO ON}
  14. {$IFDEF FPC_DOTTEDUNITS}
  15. {$DEFINE TYU:=System.Types}
  16. {$ELSE}
  17. {$DEFINE TYU:=Types}
  18. {$ENDIF}
  19. type
  20. { extra types to compile with FPC }
  21. HRSRC = TFPResourceHandle deprecated;
  22. TComponentName = type string;
  23. THandle = System.THandle;
  24. TPoint=TYU.TPoint;
  25. TRect=TYU.TRect;
  26. TSmallPoint=TYU.TSmallPoint;
  27. {$ifndef FPC_HAS_FEATURE_DYNLIBS}
  28. HMODULE = ptrint;
  29. {$else}
  30. HModule = System.HModule;
  31. {$endif}
  32. const
  33. {$IF NOT DECLARED(NilHandle)}
  34. NilHandle = TFPResourceHMODULE(0);
  35. {$ENDIF}
  36. { Maximum TList size }
  37. {$ifdef cpu16}
  38. MaxListSize = {Maxint div 16}1024;
  39. {$else cpu16}
  40. MaxListSize = Maxint div 16;
  41. {$endif cpu16}
  42. { values for TShortCut }
  43. scShift = $2000;
  44. scCtrl = $4000;
  45. scAlt = $8000;
  46. scNone = 0;
  47. { TStream seek origins }
  48. const
  49. soFromBeginning = 0;
  50. soFromCurrent = 1;
  51. soFromEnd = 2;
  52. type
  53. TSeekOrigin = (soBeginning, soCurrent, soEnd);
  54. TStreamOriginalFormat = (sofUnknown, sofBinary, sofText, sofUTF8Text);
  55. TDuplicates = TYU.TDuplicates;
  56. // For Delphi and backwards compatibility.
  57. const
  58. dupIgnore = TYU.dupIgnore;
  59. dupAccept = TYU.dupAccept;
  60. dupError = TYU.dupError;
  61. { TFileStream create mode }
  62. const
  63. fmCreate = $FF00;
  64. fmOpenRead = 0;
  65. fmOpenWrite = 1;
  66. fmOpenReadWrite = 2;
  67. { TParser special tokens }
  68. toEOF = Char(0);
  69. toSymbol = Char(1);
  70. toString = Char(2);
  71. toInteger = Char(3);
  72. toFloat = Char(4);
  73. toWString = Char(5);
  74. Const
  75. FilerSignature : Array[1..4] of Ansichar = 'TPF0';
  76. FilerSignature1 : Array[1..4] of Ansichar = 'TPF1';
  77. type
  78. { Text alignment types }
  79. TAlignment = (taLeftJustify, taRightJustify, taCenter);
  80. TLeftRight = taLeftJustify..taRightJustify;
  81. TVerticalAlignment = (taAlignTop, taAlignBottom, taVerticalCenter);
  82. TTopBottom = taAlignTop..taAlignBottom;
  83. TBiDiMode = (bdLeftToRight,bdRightToLeft,bdRightToLeftNoAlign,bdRightToLeftReadingOnly);
  84. { Types used by standard events }
  85. TShiftStateEnum = (ssShift, ssAlt, ssCtrl,
  86. ssLeft, ssRight, ssMiddle, ssDouble,
  87. // Extra additions
  88. ssMeta, ssSuper, ssHyper, ssAltGr, ssCaps, ssNum,
  89. ssScroll,ssTriple,ssQuad,ssExtra1,ssExtra2,
  90. ssTouch, ssPen, ssHorizontal);
  91. {$packset 1}
  92. TShiftState = set of TShiftStateEnum;
  93. {$packset default}
  94. THelpContext = -MaxLongint..MaxLongint;
  95. THelpType = (htKeyword, htContext);
  96. TShortCut = Low(Word)..High(Word);
  97. { Standard events }
  98. TNotifyEvent = procedure(Sender: TObject) of object;
  99. THintEvent = procedure(var HintStr: string; var CanShow: Boolean) of object;
  100. THelpEvent = function (Command: Word; Data: Longint;
  101. var CallHelp: Boolean): Boolean of object;
  102. TGetStrProc = procedure(const S: string) of object;
  103. { Exception classes }
  104. EStreamError = class(Exception);
  105. EFCreateError = class(EStreamError);
  106. EFOpenError = class(EStreamError);
  107. EFilerError = class(EStreamError);
  108. EReadError = class(EFilerError);
  109. EWriteError = class(EFilerError);
  110. EClassNotFound = class(EFilerError);
  111. EMethodNotFound = class(EFilerError);
  112. EInvalidImage = class(EFilerError);
  113. EResNotFound = class(Exception);
  114. EListError = {$IFDEF FPC_DOTTEDUNITS}System.{$ENDIF}SysUtils.EListError;
  115. EBitsError = class(Exception);
  116. EStringListError = class(Exception);
  117. EComponentError = class(Exception);
  118. EParserError = class(Exception);
  119. EOutOfResources = class(EOutOfMemory);
  120. EInvalidOperation = class(Exception);
  121. TExceptionClass = Class of Exception;
  122. { ---------------------------------------------------------------------
  123. Free Pascal Observer support
  124. ---------------------------------------------------------------------}
  125. Const
  126. // Delphi compatibility
  127. ssCommand = ssMeta;
  128. SGUIDObserved = '{663C603C-3F3C-4CC5-823C-AC8079F979E5}';
  129. SGUIDObserver = '{BC7376EA-199C-4C2A-8684-F4805F0691CA}';
  130. Type
  131. // Notification operations :
  132. // Observer has changed, is freed, item added to/deleted from list, custom event.
  133. TFPObservedOperation = (ooChange,ooFree,ooAddItem,ooDeleteItem,ooCustom);
  134. {$INTERFACES CORBA}
  135. { IFPObserved }
  136. IFPObserved = Interface [SGUIDObserved]
  137. // attach a new observer
  138. Procedure FPOAttachObserver(AObserver : TObject);
  139. // Detach an observer
  140. Procedure FPODetachObserver(AObserver : TObject);
  141. // Notify all observers of a change.
  142. Procedure FPONotifyObservers(ASender : TObject; AOperation : TFPObservedOperation; Data : Pointer);
  143. end;
  144. { IFPObserver }
  145. IFPObserver = Interface [SGUIDObserver]
  146. // Called by observed when observers are notified.
  147. Procedure FPOObservedChanged(ASender : TObject; Operation : TFPObservedOperation; Data : Pointer);
  148. end;
  149. {$INTERFACES COM}
  150. { ---------------------------------------------------------------------
  151. Delphi Observer support
  152. ---------------------------------------------------------------------}
  153. TComponent = Class;
  154. TStringList = Class;
  155. IInterfaceList = Interface;
  156. EObserver = Class(Exception);
  157. IObserver = interface;
  158. {$IFDEF FPC_HAS_REFERENCE_PROCEDURE}
  159. TObserverToggleEvent = reference to procedure(const aObserver: IObserver; const aValue: Boolean);
  160. {$ELSE}
  161. TObserverToggleEvent = procedure(const aObserver: IObserver; const aValue: Boolean) of object;
  162. {$ENDIF}
  163. IObserver = interface
  164. ['{B03253D8-7720-4B68-B10A-E3E79B91ECD3}']
  165. procedure Removed;
  166. function GetActive: Boolean;
  167. procedure SetActive(Value: Boolean);
  168. function GetOnObserverToggle: TObserverToggleEvent;
  169. procedure SetOnObserverToggle(aEvent: TObserverToggleEvent);
  170. property OnObserverToggle: TObserverToggleEvent read GetOnObserverToggle write SetOnObserverToggle;
  171. property Active: Boolean read GetActive write SetActive;
  172. end;
  173. ISingleCastObserver = interface(IObserver)
  174. ['{D0395F17-52AA-4515-93A5-5B292F03AA7B}']
  175. end;
  176. IMultiCastObserver = interface(IObserver)
  177. ['{C19CB01E-1233-4405-8A30-7987DF2C3690}']
  178. end;
  179. IEditFormatLink = interface
  180. ['{D1CE0112-FA41-4922-A9F1-D4641C02AA05}']
  181. function GetDisplayName: string;
  182. function GetDisplayWidth: Integer;
  183. function GetDisplayTextWidth: Integer;
  184. function GetReadOnly: Boolean;
  185. function GetVisible: Boolean;
  186. function GetCurrency: Boolean;
  187. function GetEditMask: string;
  188. function GetAlignment: TAlignment;
  189. function GetMaxLength: Integer;
  190. property DisplayName: string read GetDisplayName;
  191. property DisplayWidth: Integer read GetDisplayWidth;
  192. property DisplayTextWidth: Integer read GetDisplayTextWidth;
  193. property ReadOnly: Boolean read GetReadOnly;
  194. property Visible: Boolean read GetVisible;
  195. property Currency: Boolean read GetCurrency;
  196. property EditMask: string read GetEditMask;
  197. property Alignment: TAlignment read GetAlignment;
  198. property MaxLength: Integer read GetMaxLength;
  199. end;
  200. IEditLinkObserver = interface(ISingleCastObserver)
  201. ['{E88C2705-7C5A-4E66-9B81-447D05D5E640}']
  202. procedure Update;
  203. function Edit: Boolean;
  204. procedure Reset;
  205. procedure Modified;
  206. function IsModified: Boolean;
  207. function IsValidChar(aKey: Char): Boolean;
  208. function IsRequired: Boolean;
  209. function GetIsReadOnly: Boolean;
  210. procedure SetIsReadOnly(Value: Boolean);
  211. property IsReadOnly: Boolean read GetIsReadOnly write SetIsReadOnly;
  212. function GetIsEditing: Boolean;
  213. property IsEditing: Boolean read GetIsEditing;
  214. procedure BeginUpdate;
  215. procedure EndUpdate;
  216. function GetUpdating: Boolean;
  217. property Updating: Boolean read GetUpdating;
  218. function GetFormatLink: IEditFormatLink;
  219. property FormatLink: IEditFormatLink read GetFormatLink;
  220. end;
  221. {$IFDEF FPC_HAS_REFERENCE_PROCEDURE}
  222. TObserverGetCurrentEvent = reference to function: TVarRec;
  223. {$ELSE}
  224. TObserverGetCurrentEvent = function: TVarRec of object;
  225. {$ENDIF}
  226. IEditGridLinkObserver = interface(IEditLinkObserver)
  227. ['{A911B648-E1E5-4EEC-9FEE-D8E62FFA0E71}']
  228. function GetCurrent: TVarRec;
  229. property Current: TVarRec read GetCurrent;
  230. function GetOnObserverCurrent: TObserverGetCurrentEvent;
  231. procedure SetOnObserverCurrent(aEvent: TObserverGetCurrentEvent);
  232. property OnObserverCurrent: TObserverGetCurrentEvent read GetOnObserverCurrent write SetOnObserverCurrent;
  233. end;
  234. IPositionLinkObserver170 = interface
  235. ['{FA45CF0C-E8DB-4F9E-B53F-E072C94659F6}']
  236. procedure PosChanged;
  237. end;
  238. IPositionLinkObserver = interface(IPositionLinkObserver170)
  239. ['{E78B0035-6802-447C-A80A-0AEC04AD851F}']
  240. procedure PosChanging;
  241. end;
  242. IControlValueObserver = interface
  243. ['{61DAC12C-B950-43CA-86B5-43D8E78012E8}']
  244. procedure ValueModified;
  245. procedure ValueUpdate;
  246. end;
  247. // May be implemented by EditLink or ControlValue observer
  248. IObserverTrack = interface
  249. ['{8B9F22C3-FDA3-45FD-99E1-5A88481A9F95}']
  250. function GetTrack: Boolean;
  251. property Track: Boolean read GetTrack;
  252. end;
  253. IIteratorLinkObserver = interface
  254. ['{8429848A-4447-4211-93D2-745543C7AB57}']
  255. procedure StartFrom(aPosition: Integer);
  256. function MoveNext: Boolean;
  257. procedure UpdateControlComponent(aControl: TComponent);
  258. procedure Finish;
  259. end;
  260. { TObservers }
  261. TIInterfaceArray = Array of IInterface;
  262. TObservers = class
  263. public type
  264. {$IFDEF FPC_HAS_REFERENCE_PROCEDURE}
  265. TCanObserveEvent = reference to function(const aID: Integer): Boolean;
  266. TObserverAddedEvent = reference to procedure(const aID: Integer; const aObserver: IObserver);
  267. {$ELSE}
  268. TCanObserveEvent = function(const aID: Integer): Boolean of object;
  269. TObserverAddedEvent = procedure(const aID: Integer; const aObserver: IObserver) of object;
  270. {$ENDIF}
  271. private type
  272. { TIDArray }
  273. TIDArray = record
  274. ID : Integer;
  275. List : Array of IInterface;
  276. Count : Integer;
  277. Procedure Add(const aInterface : IInterface);
  278. Procedure Remove(const aInterface : IInterface);
  279. Function GetActive: IObserver;
  280. Function GetSingleCast : ISingleCastObserver;
  281. end;
  282. PIDArray = ^TIDArray;
  283. { TIDArrayList }
  284. TIDArrayList = record
  285. List : Array of TIDArray;
  286. Count : Integer;
  287. Function IndexOfID(aId : Integer) : Integer;
  288. Function AddID(aId : Integer) : Integer;
  289. Procedure AddInterface(aID : integer; aInterFace : IInterface);
  290. Function GetIDArray(aIdx : Integer) : PIDArray;
  291. Function GetIDArrayFromID(aId : Integer) : PIDArray;
  292. end;
  293. private
  294. FList : TIDArrayList;
  295. FCanObserve: TCanObserveEvent;
  296. FObserverAdded: TObserverAddedEvent;
  297. public
  298. property OnCanObserve: TCanObserveEvent read FCanObserve write FCanObserve;
  299. property OnObserverAdded: TObserverAddedEvent read FObserverAdded write FObserverAdded;
  300. function CanObserve(const aID: Integer): Boolean; overload; virtual;
  301. procedure AddObserver(const aID: Integer; const aIntf: IInterface); overload; virtual;
  302. procedure AddObserver(const aIDs: Array of Integer; const aIntf: IInterface); overload; virtual;
  303. procedure RemoveObserver(const aID: Integer; const aIntf: IInterface); overload; virtual;
  304. procedure RemoveObserver(const aIDs: Array of Integer; const aIntf: IInterface); overload; virtual;
  305. function IsObserving(const aID: Integer): Boolean; overload; virtual;
  306. function TryIsObserving(const aID: Integer; out aIntf: IInterface): Boolean; virtual;
  307. function GetSingleCastObserver(const aID: Integer): IInterface; virtual;
  308. function GetMultiCastObserverArray(const aID: Integer) : TIInterfaceArray; virtual;
  309. function GetMultiCastObserver(const aID: Integer) : IInterfaceList; virtual;
  310. end;
  311. { TLinkObservers }
  312. TLinkObservers = class
  313. protected
  314. class function CheckObserving(const aObservers: TObservers; aID: Integer): Integer;
  315. public
  316. class function GetEditGridLink(const aObservers: TObservers): IEditGridLinkObserver; static;
  317. class function GetEditLink(const aObservers: TObservers): IEditLinkObserver; static;
  318. class procedure EditLinkUpdate(const aObservers: TObservers); static; inline;
  319. class function EditLinkTrackUpdate(const aObservers: TObservers): Boolean; static;
  320. class procedure EditLinkReset(const aObservers: TObservers); static; inline;
  321. class procedure EditLinkModified(aObservers: TObservers); static; inline;
  322. class function EditLinkIsModified(const aObservers: TObservers): Boolean; static; inline;
  323. class function EditLinkIsValidChar(const aObservers: TObservers; aKey: Char): Boolean; static; inline;
  324. class function EditLinkIsEditing(const aObservers: TObservers): Boolean; static; inline;
  325. class function EditLinkEdit(const aObservers: TObservers): Boolean; static; inline;
  326. class procedure EditLinkSetIsReadOnly(const aObservers: TObservers; AValue: Boolean); static; inline;
  327. class function EditLinkIsReadOnly(const aObservers: TObservers): Boolean; static; inline;
  328. class procedure EditGridLinkUpdate(const aObservers: TObservers); static; inline;
  329. class procedure EditGridLinkReset(const aObservers: TObservers); static; inline;
  330. class procedure EditGridLinkModified(const aObservers: TObservers); static; inline;
  331. class function EditGridLinkIsModified(const aObservers: TObservers): Boolean; static; inline;
  332. class function EditGridLinkIsValidChar(const aObservers: TObservers; aKey: Char): Boolean; static; inline;
  333. class function EditGridLinkIsEditing(const aObservers: TObservers): Boolean; static; inline;
  334. class function EditGridLinkEdit(const aObservers: TObservers): Boolean; static; inline;
  335. class function EditGridLinkIsReadOnly(const aObservers: TObservers): Boolean; static; inline;
  336. class procedure EditGridLinkSetIsReadOnly(const aObservers: TObservers; aValue: Boolean); static; inline;
  337. class procedure PositionLinkPosChanged(const aObservers: TObservers); static;
  338. class procedure PositionLinkPosChanging(const aObservers: TObservers); static;
  339. class procedure ListSelectionChanged(const aObservers: TObservers); static;
  340. class procedure ControlValueUpdate(aObservers: TObservers); static;
  341. class procedure ControlValueModified(aObservers: TObservers); static;
  342. class function ControlValueTrackUpdate(const aObservers: TObservers): Boolean; static;
  343. class function AllowControlChange(const aObservers: TObservers): Boolean; static;
  344. class procedure ControlChanged(const aObservers: TObservers); static;
  345. class function AllowControlChange(const aControl: TComponent): Boolean; static;
  346. class procedure ControlChanged(const aControl: TComponent); static;
  347. class procedure IteratorLinkUpdateControlComponent(const aObservers: TObservers; aControl: TComponent); static;
  348. class procedure IteratorLinkStartFrom(const aObservers: TObservers; aPosition: Integer); static;
  349. class function IteratorLinkMoveNext(const aObservers: TObservers): Boolean; static;
  350. class procedure IteratorLinkFinish(const aObservers: TObservers); static;
  351. end;
  352. { TObserverMapping }
  353. TObserverMapping = class (Tobject)
  354. private
  355. FList: TStringList;
  356. class var
  357. _Instance: TObserverMapping;
  358. protected
  359. class property Instance: TObserverMapping read _instance;
  360. protected
  361. Property List : TStringList Read FList;
  362. public const
  363. EditLinkID = 1;
  364. EditGridLinkID = 2;
  365. PositionLinkID = 3;
  366. ControlValueID = 4;
  367. IteratorLinkID = 5;
  368. MappedID = 100;
  369. private
  370. const MinPublicID = MappedID+1;
  371. public
  372. constructor Create;
  373. destructor Destroy; override;
  374. class constructor Init;
  375. class destructor Done;
  376. class function GetObserverID(const aKey: string): Integer;
  377. class procedure Clear;
  378. end;
  379. EObserverException = class(Exception);
  380. ObservableMemberAttribute = class(TCustomAttribute)
  381. strict protected
  382. FMemberName: String;
  383. FFramework: string;
  384. FTrack: Boolean;
  385. public
  386. constructor Create(const aMemberName, aFramework: string; aTrack: Boolean); overload;
  387. constructor Create(const aMemberName: string; aTrack: Boolean); overload;
  388. constructor Create(const aMemberName: string); overload;
  389. property MemberName: String read FMemberName;
  390. property Framework: string read FFramework;
  391. property Track: Boolean read FTrack;
  392. end;
  393. { Forward class declarations }
  394. TStream = class;
  395. TFiler = class;
  396. TReader = class;
  397. TWriter = class;
  398. { TFPList class }
  399. PPointerList = ^TPointerList;
  400. TPointerList = array[0..MaxListSize - 1] of Pointer;
  401. TListSortCompare = function (Item1, Item2: Pointer): Integer;
  402. TListCallback = TYU.TListCallback;
  403. TListStaticCallback = TYU.TListStaticCallback;
  404. {$IFNDEF FPC_TESTGENERICS}
  405. TListAssignOp = (laCopy, laAnd, laOr, laXor, laSrcUnique, laDestUnique);
  406. TFPList = class;
  407. TFPListEnumerator = class
  408. private
  409. FList: TFPList;
  410. FPosition: Integer;
  411. public
  412. constructor Create(AList: TFPList);
  413. function GetCurrent: Pointer;
  414. function MoveNext: Boolean;
  415. property Current: Pointer read GetCurrent;
  416. end;
  417. TFPList = class(TObject)
  418. private
  419. FList: PPointerList;
  420. FCount: Integer;
  421. FCapacity: Integer;
  422. procedure CopyMove (aList : TFPList);
  423. procedure MergeMove (aList : TFPList);
  424. procedure DoCopy(ListA, ListB : TFPList);
  425. procedure DoSrcUnique(ListA, ListB : TFPList);
  426. procedure DoAnd(ListA, ListB : TFPList);
  427. procedure DoDestUnique(ListA, ListB : TFPList);
  428. procedure DoOr(ListA, ListB : TFPList);
  429. procedure DoXOr(ListA, ListB : TFPList);
  430. protected
  431. function Get(Index: Integer): Pointer; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
  432. procedure Put(Index: Integer; Item: Pointer); {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
  433. procedure SetCapacity(NewCapacity: Integer);
  434. procedure SetCount(NewCount: Integer);
  435. Procedure RaiseIndexError(Index: Integer); deprecated;
  436. Procedure CheckIndex(AIndex : Integer); {$ifdef CLASSESINLINE} inline;{$ENDIF}
  437. public
  438. Type
  439. TDirection = (FromBeginning, FromEnd);
  440. destructor Destroy; override;
  441. Procedure AddList(AList : TFPList);
  442. function Add(Item: Pointer): Integer; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
  443. procedure Clear;
  444. procedure Delete(Index: Integer); {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
  445. class procedure Error(const Msg: string; Data: PtrInt); static;
  446. procedure Exchange(Index1, Index2: Integer);
  447. function Expand: TFPList; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
  448. function Extract(Item: Pointer): Pointer;
  449. function First: Pointer;
  450. function GetEnumerator: TFPListEnumerator;
  451. function IndexOf(Item: Pointer): Integer;
  452. function IndexOfItem(Item: Pointer; Direction: TDirection): Integer;
  453. procedure Insert(Index: Integer; Item: Pointer); {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
  454. function Last: Pointer;
  455. procedure Move(CurIndex, NewIndex: Integer);
  456. procedure Assign (ListA: TFPList; AOperator: TListAssignOp=laCopy; ListB: TFPList=nil);
  457. function Remove(Item: Pointer): Integer;
  458. procedure Pack;
  459. procedure Sort(Compare: TListSortCompare);
  460. procedure Sort(Compare: TListSortCompare; SortingAlgorithm: PSortingAlgorithm);
  461. procedure Sort(Compare: TListSortComparer_Context; Context: Pointer);
  462. procedure Sort(Compare: TListSortComparer_Context; Context: Pointer; SortingAlgorithm: PSortingAlgorithm);
  463. procedure ForEachCall(proc2call:TListCallback;arg:pointer);
  464. procedure ForEachCall(proc2call:TListStaticCallback;arg:pointer);
  465. property Capacity: Integer read FCapacity write SetCapacity;
  466. property Count: Integer read FCount write SetCount;
  467. property Items[Index: Integer]: Pointer read Get write Put; default;
  468. property List: PPointerList read FList;
  469. end;
  470. {$else}
  471. TFPPtrList = specialize TFPGList<Pointer>;
  472. TFPList = class(TFPPtrList)
  473. public
  474. procedure Assign(Source: TFPList);
  475. procedure Sort(Compare: TListSortCompare);
  476. procedure Sort(Compare: TListSortCompare; SortingAlgorithm: PSortingAlgorithm);
  477. procedure ForEachCall(Proc2call: TListCallback; Arg: Pointer);
  478. procedure ForEachCall(Proc2call: TListStaticCallback; Arg: Pointer);
  479. end;
  480. {$endif}
  481. { TList class}
  482. TListNotification = (lnAdded, lnExtracted, lnDeleted);
  483. TList = class;
  484. TListEnumerator = class(TFPListEnumerator)
  485. public
  486. constructor Create(AList: TList);
  487. end;
  488. TList = class(TObject,IFPObserved)
  489. private
  490. FList: TFPList;
  491. FObservers : TFPList;
  492. procedure CopyMove (aList : TList);
  493. procedure MergeMove (aList : TList);
  494. procedure DoCopy(ListA, ListB : TList);
  495. procedure DoSrcUnique(ListA, ListB : TList);
  496. procedure DoAnd(ListA, ListB : TList);
  497. procedure DoDestUnique(ListA, ListB : TList);
  498. procedure DoOr(ListA, ListB : TList);
  499. procedure DoXOr(ListA, ListB : TList);
  500. protected
  501. function Get(Index: Integer): Pointer; inline;
  502. procedure Grow; virtual;
  503. procedure Put(Index: Integer; Item: Pointer);
  504. procedure Notify(Ptr: Pointer; Action: TListNotification); virtual;
  505. procedure SetCapacity(NewCapacity: Integer); inline;
  506. function GetCapacity: Integer; inline;
  507. procedure SetCount(NewCount: Integer);
  508. function GetCount: Integer; inline;
  509. function GetList: PPointerList; inline;
  510. public
  511. constructor Create;
  512. destructor Destroy; override;
  513. Procedure FPOAttachObserver(AObserver : TObject);
  514. Procedure FPODetachObserver(AObserver : TObject);
  515. Procedure FPONotifyObservers(ASender : TObject; AOperation : TFPObservedOperation; Data : Pointer);
  516. Procedure AddList(AList : TList);
  517. function Add(Item: Pointer): Integer;
  518. procedure Clear; virtual;
  519. procedure Delete(Index: Integer);
  520. class procedure Error(const Msg: string; Data: PtrInt); virtual;
  521. procedure Exchange(Index1, Index2: Integer);
  522. function Expand: TList;
  523. function Extract(item: Pointer): Pointer;
  524. function First: Pointer; inline;
  525. function GetEnumerator: TListEnumerator;
  526. function IndexOf(Item: Pointer): Integer; inline;
  527. procedure Insert(Index: Integer; Item: Pointer);
  528. function Last: Pointer; inline;
  529. procedure Move(CurIndex, NewIndex: Integer); inline;
  530. procedure Assign (ListA: TList; AOperator: TListAssignOp=laCopy; ListB: TList=nil);
  531. function Remove(Item: Pointer): Integer;
  532. procedure Pack; inline;
  533. procedure Sort(Compare: TListSortCompare); inline;
  534. procedure Sort(Compare: TListSortCompare; SortingAlgorithm: PSortingAlgorithm); inline;
  535. procedure Sort(Compare: TListSortComparer_Context; Context: Pointer); inline;
  536. procedure Sort(Compare: TListSortComparer_Context; Context: Pointer; SortingAlgorithm: PSortingAlgorithm); inline;
  537. property Capacity: Integer read GetCapacity write SetCapacity;
  538. property Count: Integer read GetCount write SetCount;
  539. property Items[Index: Integer]: Pointer read Get write Put; default;
  540. property List: PPointerList read GetList;
  541. end;
  542. { TThreadList class }
  543. TThreadList = class
  544. private
  545. FList: TList;
  546. FDuplicates: TDuplicates;
  547. FLock: TRTLCriticalSection;
  548. public
  549. constructor Create;
  550. destructor Destroy; override;
  551. procedure Add(Item: Pointer);
  552. procedure Clear;
  553. function LockList: TList;
  554. procedure Remove(Item: Pointer);
  555. procedure UnlockList;
  556. property Duplicates: TDuplicates read FDuplicates write FDuplicates;
  557. end;
  558. {TBits Class}
  559. type
  560. TBitsBase = PtrInt;
  561. PBitsBase = ^TBitsBase;
  562. TBitsBaseUnsigned = PtrUint;
  563. const
  564. MaxBitFlags = High(SizeInt) - (bitsizeof(TBitsBase) - 1);
  565. type
  566. TBits = class(TObject)
  567. private
  568. FBits : PBitsBase;
  569. FSize : SizeInt; { total TBitsBases currently allocated }
  570. FBSize: SizeInt; {total bits currently allocated}
  571. findIndex : SizeInt;
  572. findXorMask : int8; { 0 (all zeros) or -1 (all ones), sign-extended to TBitsBase on read.
  573. 0 is for searching ones, -1 is for searching zeros. }
  574. function ScanFor1(start : SizeInt; xorMask : TBitsBase) : SizeInt;
  575. function ScanFor1Rev(start : SizeInt; xorMask : TBitsBase) : SizeInt;
  576. { functions and properties to match TBits class }
  577. procedure SetBit(bit : SizeInt; value : Boolean);
  578. procedure SetSize(value : SizeInt);
  579. Protected
  580. procedure CheckBitIndex (Bit : SizeInt;CurrentSize : Boolean);
  581. public
  582. constructor Create(TheSize : longint = 0); virtual;
  583. destructor Destroy; override;
  584. function GetFSize : SizeInt;
  585. procedure SetOn(Bit : SizeInt);
  586. procedure Clear(Bit : SizeInt);
  587. procedure Clearall;
  588. procedure CopyBits(BitSet : TBits);
  589. procedure AndBits(BitSet : TBits);
  590. procedure OrBits(BitSet : TBits);
  591. procedure XorBits(BitSet : TBits);
  592. procedure NotBits(BitSet : TBits);
  593. function Get(Bit : SizeInt) : boolean;
  594. procedure Grow(NBit : SizeInt);
  595. function Equals(Obj : TObject): Boolean; override; overload;
  596. function Equals(BitSet : TBits) : Boolean; overload;
  597. procedure SetIndex(Index : SizeInt);
  598. function FindFirstBit(State : boolean) : SizeInt;
  599. function FindNextBit : SizeInt;
  600. function FindPrevBit : SizeInt;
  601. { functions and properties to match TBits class }
  602. function OpenBit: SizeInt;
  603. property Bits[Bit: SizeInt]: Boolean read get write SetBit; default;
  604. property Size: SizeInt read FBSize write setSize;
  605. end;
  606. { TPersistent abstract class }
  607. {$M+}
  608. TPersistent = class(TObject,IFPObserved)
  609. private
  610. FObservers : TFPList;
  611. procedure AssignError(Source: TPersistent);
  612. protected
  613. procedure AssignTo(Dest: TPersistent); virtual;
  614. procedure DefineProperties(Filer: TFiler); virtual;
  615. function GetOwner: TPersistent; dynamic;
  616. public
  617. Destructor Destroy; override;
  618. procedure Assign(Source: TPersistent); virtual;
  619. Procedure FPOAttachObserver(AObserver : TObject);
  620. Procedure FPODetachObserver(AObserver : TObject);
  621. Procedure FPONotifyObservers(ASender : TObject; AOperation : TFPObservedOperation; Data : Pointer);
  622. function GetNamePath: string; virtual; {dynamic;}
  623. end;
  624. {$M-}
  625. { TPersistent class reference type }
  626. TPersistentClass = class of TPersistent;
  627. { TInterfaced Persistent }
  628. TInterfacedPersistent = class(TPersistent, IInterface)
  629. private
  630. FOwnerInterface: IInterface;
  631. protected
  632. { IInterface }
  633. function _AddRef: Longint; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  634. function _Release: Longint; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  635. public
  636. function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} IID: TGUID; out Obj): HResult; virtual; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  637. procedure AfterConstruction; override;
  638. end;
  639. { TRecall class }
  640. TRecall = class(TObject)
  641. private
  642. FStorage, FReference: TPersistent;
  643. public
  644. constructor Create(AStorage, AReference: TPersistent);
  645. destructor Destroy; override;
  646. procedure Store;
  647. procedure Forget;
  648. property Reference: TPersistent read FReference;
  649. end;
  650. { TCollection class }
  651. TCollection = class;
  652. TCollectionItem = class(TPersistent)
  653. private
  654. FCollection: TCollection;
  655. FID: Integer;
  656. FUpdateCount: Integer;
  657. function GetIndex: Integer;
  658. protected
  659. procedure SetCollection(Value: TCollection);virtual;
  660. procedure Changed(AllItems: Boolean);
  661. function GetOwner: TPersistent; override;
  662. function GetDisplayName: string; virtual;
  663. procedure SetIndex(Value: Integer); virtual;
  664. procedure SetDisplayName(const Value: string); virtual;
  665. property UpdateCount: Integer read FUpdateCount;
  666. public
  667. constructor Create(ACollection: TCollection); virtual;
  668. destructor Destroy; override;
  669. function GetNamePath: string; override;
  670. property Collection: TCollection read FCollection write SetCollection;
  671. property ID: Integer read FID;
  672. property Index: Integer read GetIndex write SetIndex;
  673. property DisplayName: string read GetDisplayName write SetDisplayName;
  674. end;
  675. TCollectionEnumerator = class
  676. private
  677. FCollection: TCollection;
  678. FPosition: Integer;
  679. public
  680. constructor Create(ACollection: TCollection);
  681. function GetCurrent: TCollectionItem;
  682. function MoveNext: Boolean;
  683. property Current: TCollectionItem read GetCurrent;
  684. end;
  685. TCollectionItemClass = class of TCollectionItem;
  686. TCollectionNotification = (cnAdded, cnExtracting, cnDeleting);
  687. TCollectionSortCompare = function (Item1, Item2: TCollectionItem): Integer;
  688. TCollection = class(TPersistent)
  689. private
  690. FItemClass: TCollectionItemClass;
  691. FItems: TFpList;
  692. FUpdateCount: Integer;
  693. FNextID: Integer;
  694. FPropName: string;
  695. function GetCount: Integer;
  696. function GetPropName: string;
  697. procedure InsertItem(Item: TCollectionItem);
  698. procedure RemoveItem(Item: TCollectionItem);
  699. procedure DoClear;
  700. protected
  701. { Design-time editor support }
  702. function GetAttrCount: Integer; dynamic;
  703. function GetAttr(Index: Integer): string; dynamic;
  704. function GetItemAttr(Index, ItemIndex: Integer): string; dynamic;
  705. procedure Changed;
  706. function GetItem(Index: Integer): TCollectionItem;
  707. procedure SetItem(Index: Integer; Value: TCollectionItem);
  708. procedure SetItemName(Item: TCollectionItem); virtual;
  709. procedure SetPropName; virtual;
  710. procedure Update(Item: TCollectionItem); virtual;
  711. procedure Notify(Item: TCollectionItem;Action: TCollectionNotification); virtual;
  712. property PropName: string read GetPropName write FPropName;
  713. property UpdateCount: Integer read FUpdateCount;
  714. public
  715. constructor Create(AItemClass: TCollectionItemClass);
  716. destructor Destroy; override;
  717. function Owner: TPersistent;
  718. function Add: TCollectionItem;
  719. procedure Assign(Source: TPersistent); override;
  720. procedure BeginUpdate; virtual;
  721. procedure Clear;
  722. procedure EndUpdate; virtual;
  723. procedure Delete(Index: Integer);
  724. function GetEnumerator: TCollectionEnumerator;
  725. function GetNamePath: string; override;
  726. function Insert(Index: Integer): TCollectionItem;
  727. function FindItemID(ID: Integer): TCollectionItem;
  728. procedure Exchange(Const Index1, index2: integer);
  729. procedure Move(Const Index1, index2: integer);
  730. procedure Sort(Const Compare : TCollectionSortCompare);
  731. property Count: Integer read GetCount;
  732. property ItemClass: TCollectionItemClass read FItemClass;
  733. property Items[Index: Integer]: TCollectionItem read GetItem write SetItem;
  734. end;
  735. TOwnedCollection = class(TCollection)
  736. private
  737. FOwner: TPersistent;
  738. protected
  739. Function GetOwner: TPersistent; override;
  740. public
  741. Constructor Create(AOwner: TPersistent;AItemClass: TCollectionItemClass);
  742. end;
  743. TStrings = class;
  744. { IStringsAdapter interface }
  745. { Maintains link between TStrings and IStrings implementations }
  746. IStringsAdapter = interface ['{739C2F34-52EC-11D0-9EA6-0020AF3D82DA}']
  747. procedure ReferenceStrings(S: TStrings);
  748. procedure ReleaseStrings;
  749. end;
  750. { TStringsEnumerator class }
  751. TStringsEnumerator = class
  752. private
  753. FStrings: TStrings;
  754. FPosition: Integer;
  755. public
  756. constructor Create(AStrings: TStrings);
  757. function GetCurrent: String;
  758. function MoveNext: Boolean;
  759. property Current: String read GetCurrent;
  760. end;
  761. { TStrings class }
  762. TStringsFilterMethod = function(const s: string): boolean of object;
  763. TStringsReduceMethod = function(const s1, s2: string): string of object;
  764. TStringsMapMethod = function(const s: string): string of object;
  765. TStringsForEachMethodExObj = procedure(const CurrentValue: string; const index: integer; Obj : TObject) of object;
  766. TStringsForEachMethodEx = procedure(const CurrentValue: string; const index: integer) of object;
  767. TStringsForEachMethod = procedure(const CurrentValue: string) of object;
  768. TMissingNameValueSeparatorAction = (mnvaValue,mnvaName,mnvaEmpty,mnvaError);
  769. TMissingNameValueSeparatorActions = set of TMissingNameValueSeparatorAction;
  770. TStringsOption = (soStrictDelimiter,soWriteBOM,soTrailingLineBreak,soUseLocale,soPreserveBOM);
  771. TStringsOptions = set of TStringsOption;
  772. TStrings = class(TPersistent)
  773. private
  774. FDefaultEncoding: TEncoding;
  775. FEncoding: TEncoding;
  776. FMissingNameValueSeparatorAction: TMissingNameValueSeparatorAction;
  777. FSpecialCharsInited : boolean;
  778. FAlwaysQuote: Boolean;
  779. FQuoteChar : Char;
  780. FDelimiter : Char;
  781. FNameValueSeparator : Char;
  782. FUpdateCount: Integer;
  783. FAdapter: IStringsAdapter;
  784. FLBS : TTextLineBreakStyle;
  785. FOptions : TStringsOptions;
  786. FLineBreak : String;
  787. function GetCommaText: string;
  788. function GetLineBreakCharLBS: string;
  789. function GetMissingNameValueSeparatorAction: TMissingNameValueSeparatorAction;
  790. function GetName(Index: Integer): string;
  791. function GetStrictDelimiter: Boolean;
  792. function GetTrailingLineBreak: Boolean;
  793. function GetUseLocale: Boolean;
  794. function GetValue(const Name: string): string;
  795. function GetWriteBOM: Boolean;
  796. Function GetLBS : TTextLineBreakStyle;
  797. procedure SetDefaultEncoding(const ADefaultEncoding: TEncoding);
  798. procedure SetEncoding(const AEncoding: TEncoding);
  799. Procedure SetLBS (AValue : TTextLineBreakStyle);
  800. procedure ReadData(Reader: TReader);
  801. procedure SetCommaText(const Value: string);
  802. procedure SetMissingNameValueSeparatorAction(AValue: TMissingNameValueSeparatorAction);
  803. procedure SetStringsAdapter(const Value: IStringsAdapter);
  804. procedure SetStrictDelimiter(AValue: Boolean);
  805. procedure SetTrailingLineBreak(AValue: Boolean);
  806. procedure SetUseLocale(AValue: Boolean);
  807. procedure SetWriteBOM(AValue: Boolean);
  808. procedure SetValue(const Name, Value: string);
  809. procedure SetDelimiter(c:Char);
  810. procedure SetQuoteChar(c:Char);
  811. procedure SetNameValueSeparator(c:Char);
  812. procedure WriteData(Writer: TWriter);
  813. procedure DoSetTextStr(const Value: string; DoClear : Boolean);
  814. Function GetDelimiter : Char;
  815. Function GetNameValueSeparator : Char;
  816. Function GetQuoteChar: Char;
  817. Function GetLineBreak : String;
  818. procedure SetLineBreak(const S : String);
  819. Function GetSkipLastLineBreak : Boolean;
  820. procedure SetSkipLastLineBreak(const AValue : Boolean);
  821. Procedure DoSetDelimitedText(const AValue: string; DoClear,aStrictDelimiter : Boolean; aQuoteChar,aDelimiter : Char);
  822. protected
  823. function CompareStrings(const s1,s2 : string) : Integer; virtual;
  824. procedure DefineProperties(Filer: TFiler); override;
  825. procedure Error(const Msg: string; Data: Integer);
  826. procedure Error(const Msg: pstring; Data: Integer);
  827. function Get(Index: Integer): string; virtual; abstract;
  828. function GetCapacity: Integer; virtual;
  829. function GetCount: Integer; virtual; abstract;
  830. function GetObject(Index: Integer): TObject; virtual;
  831. function GetTextStr: string; virtual;
  832. procedure Put(Index: Integer; const S: string); virtual;
  833. procedure PutObject(Index: Integer; AObject: TObject); virtual;
  834. procedure SetCapacity(NewCapacity: Integer); virtual;
  835. procedure SetTextStr(const Value: string); virtual;
  836. procedure SetUpdateState(Updating: Boolean); virtual;
  837. property UpdateCount: Integer read FUpdateCount;
  838. Function DoCompareText(const s1,s2 : string) : PtrInt; virtual;
  839. Function GetDelimitedText: string;
  840. Procedure SetDelimitedText(Const AValue: string);
  841. Function GetValueFromIndex(Index: Integer): string;
  842. Procedure SetValueFromIndex(Index: Integer; const Value: string);
  843. Procedure CheckSpecialChars;
  844. Class Function GetNextLine (Const Value : String; Var S : String; Var P : SizeInt) : Boolean;
  845. Function GetNextLinebreak (Const Value : String; Var S : String; Var P : SizeInt) : Boolean;
  846. {$IF (SizeOf(Integer) < SizeOf(SizeInt)) }
  847. class function GetNextLine(const Value: string; var S: string; var P: Integer) : Boolean; deprecated;
  848. function GetNextLineBreak(const Value: string; var S: string; var P: Integer) : Boolean; deprecated;
  849. {$IFEND}
  850. public
  851. constructor Create;
  852. destructor Destroy; override;
  853. function ToObjectArray(aStart,aEnd : Integer) : TObjectDynArray; overload;
  854. function ToObjectArray: TObjectDynArray; overload;
  855. function ToStringArray(aStart,aEnd : Integer) : TStringDynArray; overload;
  856. function ToStringArray: TStringDynArray; overload;
  857. function Add(const S: string): Integer; virtual; overload;
  858. function AddObject(const S: string; AObject: TObject): Integer; virtual; overload;
  859. function Add(const Fmt : string; const Args : Array of const): Integer; overload;
  860. function AddObject(const Fmt: string; Args : Array of const; AObject: TObject): Integer; overload;
  861. function AddPair(const AName, AValue: string): TStrings; overload; {$IFDEF CLASSESINLINE}inline;{$ENDIF}
  862. function AddPair(const AName, AValue: string; AObject: TObject): TStrings; overload;
  863. procedure AddStrings(TheStrings: TStrings); overload; virtual;
  864. procedure AddStrings(TheStrings: TStrings; ClearFirst : Boolean); overload;
  865. procedure AddStrings(const TheStrings: array of string); overload; virtual;
  866. procedure AddStrings(const TheStrings: array of string; ClearFirst : Boolean); overload;
  867. procedure SetStrings(TheStrings: TStrings); overload; virtual;
  868. procedure SetStrings(TheStrings: array of string); overload; virtual;
  869. Procedure AddText(Const S : String); virtual;
  870. procedure AddCommaText(const S: String);
  871. procedure AddDelimitedText(const S: String; ADelimiter: Char; AStrictDelimiter: Boolean); overload;
  872. procedure AddDelimitedtext(const S: String); overload;
  873. procedure Append(const S: string);
  874. procedure Assign(Source: TPersistent); override;
  875. procedure BeginUpdate;
  876. procedure Clear; virtual; abstract;
  877. procedure Delete(Index: Integer); virtual; abstract;
  878. procedure EndUpdate;
  879. function Equals(Obj: TObject): Boolean; override; overload;
  880. function Equals(TheStrings: TStrings): Boolean; overload;
  881. procedure Exchange(Index1, Index2: Integer); virtual;
  882. function ExtractName(Const S:String):String;
  883. Procedure Filter(aFilter: TStringsFilterMethod; aList : TStrings);
  884. Function Filter(aFilter: TStringsFilterMethod) : TStrings;
  885. Procedure Fill(const aValue : String; aStart,aEnd : Integer);
  886. procedure ForEach(aCallback: TStringsForeachMethod);
  887. procedure ForEach(aCallback: TStringsForeachMethodEx);
  888. procedure ForEach(aCallback: TStringsForeachMethodExObj);
  889. function GetEnumerator: TStringsEnumerator;
  890. procedure GetNameValue(Index : Integer; Out AName,AValue : String);
  891. function GetText: PChar; virtual;
  892. function IndexOf(const S: string): Integer; virtual;
  893. function IndexOf(const S: string; aStart : Integer): Integer; virtual;
  894. function IndexOfName(const Name: string): Integer; virtual;
  895. function IndexOfObject(AObject: TObject): Integer; virtual;
  896. procedure Insert(Index: Integer; const S: string); virtual; abstract;
  897. procedure InsertObject(Index: Integer; const S: string; AObject: TObject);
  898. function LastIndexOf(const S: string; aStart : Integer): Integer; virtual;
  899. function LastIndexOf(const S: string): Integer;
  900. procedure LoadFromFile(const FileName: string); overload; virtual;
  901. procedure LoadFromFile(const FileName: string; IgnoreEncoding : Boolean);
  902. procedure LoadFromFile(const FileName: string; AEncoding: TEncoding); overload; virtual;
  903. procedure LoadFromStream(Stream: TStream); overload; virtual;
  904. procedure LoadFromStream(Stream: TStream; IgnoreEncoding : Boolean); overload;
  905. procedure LoadFromStream(Stream: TStream; AEncoding: TEncoding); overload; virtual;
  906. Procedure Map(aMap: TStringsMapMethod; aList : TStrings);
  907. Function Map(aMap: TStringsMapMethod) : TStrings;
  908. procedure Move(CurIndex, NewIndex: Integer); virtual;
  909. Function Pop : String;
  910. function Reduce(aReduceMethod: TStringsReduceMethod; const startingValue: string): string;
  911. Function Reverse : TStrings;
  912. Procedure Reverse(aList : TStrings);
  913. procedure SaveToFile(const FileName: string); overload; virtual;
  914. procedure SaveToFile(const FileName: string; IgnoreEncoding : Boolean); overload;
  915. procedure SaveToFile(const FileName: string; AEncoding: TEncoding); overload; virtual;
  916. procedure SaveToStream(Stream: TStream); overload; virtual;
  917. procedure SaveToStream(Stream: TStream; IgnoreEncoding : Boolean); overload;
  918. procedure SaveToStream(Stream: TStream; AEncoding: TEncoding); overload; virtual;
  919. function Shift : String;
  920. Procedure Slice(fromIndex: integer; aList : TStrings);
  921. Function Slice(fromIndex: integer) : TStrings;
  922. procedure SetText(TheText: PChar); virtual;
  923. property AlwaysQuote: Boolean read FAlwaysQuote write FAlwaysQuote;
  924. property Capacity: Integer read GetCapacity write SetCapacity;
  925. property CommaText: string read GetCommaText write SetCommaText;
  926. property Count: Integer read GetCount;
  927. property DefaultEncoding: TEncoding read FDefaultEncoding write SetDefaultEncoding;
  928. property DelimitedText: string read GetDelimitedText write SetDelimitedText;
  929. property Delimiter: Char read GetDelimiter write SetDelimiter;
  930. property Encoding: TEncoding read FEncoding;
  931. property LineBreak : string Read GetLineBreak write SetLineBreak;
  932. Property MissingNameValueSeparatorAction : TMissingNameValueSeparatorAction Read GetMissingNameValueSeparatorAction Write SetMissingNameValueSeparatorAction;
  933. property Names[Index: Integer]: string read GetName;
  934. Property NameValueSeparator : Char Read GetNameValueSeparator Write SetNameValueSeparator;
  935. property Objects[Index: Integer]: TObject read GetObject write PutObject;
  936. property Options: TStringsOptions read FOptions write FOptions;
  937. property QuoteChar: Char read GetQuoteChar write SetQuoteChar;
  938. Property SkipLastLineBreak : Boolean Read GetSkipLastLineBreak Write SetSkipLastLineBreak;
  939. // Same as SkipLastLineBreak but for Delphi compatibility. Note it has opposite meaning.
  940. Property TrailingLineBreak : Boolean Read GetTrailingLineBreak Write SetTrailingLineBreak;
  941. Property StrictDelimiter : Boolean Read GetStrictDelimiter Write SetStrictDelimiter;
  942. property Strings[Index: Integer]: string read Get write Put; default;
  943. property StringsAdapter: IStringsAdapter read FAdapter write SetStringsAdapter;
  944. property Text: string read GetTextStr write SetTextStr;
  945. Property TextLineBreakStyle : TTextLineBreakStyle Read GetLBS Write SetLBS;
  946. Property UseLocale : Boolean Read GetUseLocale Write SetUseLocale;
  947. property ValueFromIndex[Index: Integer]: string read GetValueFromIndex write SetValueFromIndex;
  948. property Values[const Name: string]: string read GetValue write SetValue;
  949. property WriteBOM: Boolean read GetWriteBOM write SetWriteBOM;
  950. end;
  951. TStringsClass = Class of TStrings;
  952. { TStringList class }
  953. TStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer;
  954. {$IFNDEF FPC_TESTGENERICS}
  955. PStringItem = ^TStringItem;
  956. TStringItem = record
  957. FString: string;
  958. FObject: TObject;
  959. end;
  960. PStringItemList = ^TStringItemList;
  961. TStringItemList = array[0..MaxListSize] of TStringItem;
  962. TStringsSortStyle = (sslNone,sslUser,sslAuto);
  963. TStringsSortStyles = Set of TStringsSortStyle;
  964. TStringList = class(TStrings)
  965. private
  966. FList: PStringItemList;
  967. FCount: Integer;
  968. FCapacity: Integer;
  969. FOnChange: TNotifyEvent;
  970. FOnChanging: TNotifyEvent;
  971. FDuplicates: TDuplicates;
  972. FCaseSensitive : Boolean;
  973. FForceSort : Boolean;
  974. FOwnsObjects : Boolean;
  975. FSortStyle: TStringsSortStyle;
  976. procedure ExchangeItemsInt(Index1, Index2: Integer); inline;
  977. function GetSorted: Boolean;
  978. procedure Grow;
  979. procedure InternalClear(FromIndex : Integer = 0; ClearOnly : Boolean = False);
  980. procedure SetSorted(Value: Boolean);
  981. procedure SetCaseSensitive(b : boolean);
  982. procedure SetSortStyle(AValue: TStringsSortStyle);
  983. protected
  984. Procedure CheckIndex(AIndex : Integer); inline;
  985. procedure ExchangeItems(Index1, Index2: Integer); virtual;
  986. procedure Changed; virtual;
  987. procedure Changing; virtual;
  988. function Get(Index: Integer): string; override;
  989. function GetCapacity: Integer; override;
  990. function GetCount: Integer; override;
  991. function GetObject(Index: Integer): TObject; override;
  992. procedure Put(Index: Integer; const S: string); override;
  993. procedure PutObject(Index: Integer; AObject: TObject); override;
  994. procedure SetCapacity(NewCapacity: Integer); override;
  995. procedure SetUpdateState(Updating: Boolean); override;
  996. procedure InsertItem(Index: Integer; const S: string); virtual;
  997. procedure InsertItem(Index: Integer; const S: string; O: TObject); virtual;
  998. Function DoCompareText(const s1,s2 : string) : PtrInt; override;
  999. public
  1000. Constructor Create;
  1001. Constructor Create(anOwnsObjects : Boolean);
  1002. destructor Destroy; override;
  1003. function Add(const S: string): Integer; override;
  1004. procedure Clear; override;
  1005. procedure Delete(Index: Integer); override;
  1006. procedure Exchange(Index1, Index2: Integer); override;
  1007. function Find(const S: string; Out Index: Integer): Boolean; virtual;
  1008. function IndexOf(const S: string): Integer; override;
  1009. procedure Insert(Index: Integer; const S: string); override;
  1010. procedure Sort; virtual;
  1011. procedure Sort(SortingAlgorithm: PSortingAlgorithm); virtual;
  1012. procedure CustomSort(CompareFn: TStringListSortCompare); virtual;
  1013. procedure CustomSort(CompareFn: TStringListSortCompare; SortingAlgorithm: PSortingAlgorithm); virtual;
  1014. property Duplicates: TDuplicates read FDuplicates write FDuplicates;
  1015. property Sorted: Boolean read GetSorted write SetSorted;
  1016. property CaseSensitive: Boolean read FCaseSensitive write SetCaseSensitive;
  1017. property OnChange: TNotifyEvent read FOnChange write FOnChange;
  1018. property OnChanging: TNotifyEvent read FOnChanging write FOnChanging;
  1019. property OwnsObjects : boolean read FOwnsObjects write FOwnsObjects;
  1020. Property SortStyle : TStringsSortStyle Read FSortStyle Write SetSortStyle;
  1021. end;
  1022. {$else}
  1023. TFPStrObjMap = specialize TFPGMap<string, TObject>;
  1024. TStringListTextCompare = function(const s1, s2: string): PtrInt of object;
  1025. TStringList = class(TStrings)
  1026. private
  1027. FMap: TFPStrObjMap;
  1028. FCaseSensitive: Boolean;
  1029. FOnChange: TNotifyEvent;
  1030. FOnChanging: TNotifyEvent;
  1031. FOnCompareText: TStringListTextCompare;
  1032. FOwnsObjects : Boolean;
  1033. procedure SetCaseSensitive(NewSensitive: Boolean);
  1034. protected
  1035. procedure Changed; virtual;
  1036. procedure Changing; virtual;
  1037. function DefaultCompareText(const s1, s2: string): PtrInt;
  1038. function DoCompareText(const s1, s2: string): PtrInt; override;
  1039. function Get(Index: Integer): string; override;
  1040. function GetCapacity: Integer; override;
  1041. function GetDuplicates: TDuplicates;
  1042. function GetCount: Integer; override;
  1043. function GetObject(Index: Integer): TObject; override;
  1044. function GetSorted: Boolean; {$ifdef CLASSESINLINE} inline; {$endif}
  1045. function MapPtrCompare(Key1, Key2: Pointer): Integer;
  1046. procedure Put(Index: Integer; const S: string); override;
  1047. procedure PutObject(Index: Integer; AObject: TObject); override;
  1048. procedure QuickSort(L, R: Integer; CompareFn: TStringListSortCompare);
  1049. procedure SetCapacity(NewCapacity: Integer); override;
  1050. procedure SetDuplicates(NewDuplicates: TDuplicates);
  1051. procedure SetSorted(NewSorted: Boolean); {$ifdef CLASSESINLINE} inline; {$endif}
  1052. procedure SetUpdateState(Updating: Boolean); override;
  1053. public
  1054. constructor Create;
  1055. destructor Destroy; override;
  1056. function Add(const S: string): Integer; override;
  1057. procedure Clear; override;
  1058. procedure Delete(Index: Integer); override;
  1059. procedure Exchange(Index1, Index2: Integer); override;
  1060. function Find(const S: string; var Index: Integer): Boolean; virtual;
  1061. function IndexOf(const S: string): Integer; override;
  1062. procedure Insert(Index: Integer; const S: string); override;
  1063. procedure Sort; virtual;
  1064. procedure Sort(SortingAlgorithm: PSortingAlgorithm); virtual;
  1065. procedure CustomSort(CompareFn: TStringListSortCompare);
  1066. procedure CustomSort(CompareFn: TStringListSortCompare; SortingAlgorithm: PSortingAlgorithm);
  1067. property Duplicates: TDuplicates read GetDuplicates write SetDuplicates;
  1068. property Sorted: Boolean read GetSorted write SetSorted;
  1069. property CaseSensitive: Boolean read FCaseSensitive write SetCaseSensitive;
  1070. property OnChange: TNotifyEvent read FOnChange write FOnChange;
  1071. property OnChanging: TNotifyEvent read FOnChanging write FOnChanging;
  1072. property OnCompareText: TStringListTextCompare read FOnCompareText write FOnCompareText;
  1073. property OwnsObjects : boolean read FOwnsObjects write FOwnsObjects;
  1074. end;
  1075. {$endif}
  1076. { TStream abstract class }
  1077. TStream = class(TObject)
  1078. private
  1079. protected
  1080. procedure InvalidSeek; virtual;
  1081. procedure Discard(const Count: Int64);
  1082. procedure DiscardLarge(Count: int64; const MaxBufferSize: Longint);
  1083. procedure FakeSeekForward(Offset: Int64; const Origin: TSeekOrigin; const Pos: Int64);
  1084. function GetPosition: Int64; virtual;
  1085. procedure SetPosition(const Pos: Int64); virtual;
  1086. function GetSize: Int64; virtual;
  1087. procedure SetSize64(const NewSize: Int64); virtual;
  1088. procedure SetSize(NewSize: Longint); virtual;overload;
  1089. procedure SetSize(const NewSize: Int64); virtual;overload;
  1090. procedure ReadNotImplemented;
  1091. procedure WriteNotImplemented;
  1092. function ReadMaxSizeData(Var Buffer; aSize,aCount : NativeInt) : NativeInt;
  1093. Procedure ReadExactSizeData(Var Buffer; aSize,aCount : NativeInt);
  1094. function WriteMaxSizeData(Const Buffer; aSize,aCount : NativeInt) : NativeInt;
  1095. Procedure WriteExactSizeData(Const Buffer; aSize,aCount : NativeInt);
  1096. public
  1097. const DefaultWriteUnitname : Boolean = false;
  1098. function Read(var Buffer; Count: Longint): Longint; virtual; overload;
  1099. function Read(var Buffer: TBytes; Count: Longint): Longint; overload;
  1100. function Read( Buffer : TBytes; aOffset, Count: Longint): Longint; overload;
  1101. function Read64( Buffer : TBytes; aOffset, Count: Int64): Int64; overload;
  1102. function Write(const Buffer: TBytes; Offset, Count: Longint): Longint; overload;
  1103. function Write(const Buffer: TBytes; Count: Longint): Longint; overload;
  1104. function Write(const Buffer; Count: Longint): Longint; virtual; overload;
  1105. function Write64(const Buffer: TBytes; Offset, Count: Int64): Int64;
  1106. function Seek(Offset: Longint; Origin: Word): Longint; virtual; overload;
  1107. function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; virtual; overload;
  1108. function ReadData(Buffer: Pointer; Count: NativeInt): NativeInt; overload;
  1109. function ReadData(Buffer: TBytes; Count: NativeInt): NativeInt; overload;
  1110. function ReadData(var Buffer: Boolean): NativeInt; overload;
  1111. function ReadData(var Buffer: Boolean; Count: NativeInt): NativeInt; overload;
  1112. function ReadData(var Buffer: AnsiChar): NativeInt; overload;
  1113. function ReadData(var Buffer: AnsiChar; Count: NativeInt): NativeInt; overload;
  1114. function ReadData(var Buffer: WideChar): NativeInt; overload;
  1115. function ReadData(var Buffer: WideChar; Count: NativeInt): NativeInt; overload;
  1116. function ReadData(var Buffer: Int8): NativeInt; overload;
  1117. function ReadData(var Buffer: Int8; Count: NativeInt): NativeInt; overload;
  1118. function ReadData(var Buffer: UInt8): NativeInt; overload;
  1119. function ReadData(var Buffer: UInt8; Count: NativeInt): NativeInt; overload;
  1120. function ReadData(var Buffer: Int16): NativeInt; overload;
  1121. function ReadData(var Buffer: Int16; Count: NativeInt): NativeInt; overload;
  1122. function ReadData(var Buffer: UInt16): NativeInt; overload;
  1123. function ReadData(var Buffer: UInt16; Count: NativeInt): NativeInt; overload;
  1124. function ReadData(var Buffer: Int32): NativeInt; overload;
  1125. function ReadData(var Buffer: Int32; Count: NativeInt): NativeInt; overload;
  1126. function ReadData(var Buffer: UInt32): NativeInt; overload;
  1127. function ReadData(var Buffer: UInt32; Count: NativeInt): NativeInt; overload;
  1128. function ReadData(var Buffer: Int64): NativeInt; overload;
  1129. function ReadData(var Buffer: Int64; Count: NativeInt): NativeInt; overload;
  1130. function ReadData(var Buffer: UInt64): NativeInt; overload;
  1131. function ReadData(var Buffer: UInt64; Count: NativeInt): NativeInt; overload;
  1132. function ReadData(var Buffer: Single): NativeInt; overload;
  1133. function ReadData(var Buffer: Single; Count: NativeInt): NativeInt; overload;
  1134. function ReadData(var Buffer: Double): NativeInt; overload;
  1135. function ReadData(var Buffer: Double; Count: NativeInt): NativeInt; overload;
  1136. {$IFDEF FPC_HAS_TYPE_EXTENDED}
  1137. function ReadData(var Buffer: Extended): NativeInt; overload;
  1138. function ReadData(var Buffer: Extended; Count: NativeInt): NativeInt; overload;
  1139. function ReadData(var Buffer: TExtended80Rec): NativeInt; overload;
  1140. function ReadData(var Buffer: TExtended80Rec; Count: NativeInt): NativeInt; overload;
  1141. {$ENDIF}
  1142. procedure ReadBuffer(var Buffer; Count: NativeInt);
  1143. procedure ReadBuffer(var Buffer: TBytes; Count: NativeInt); overload;
  1144. procedure ReadBuffer(var Buffer: TBytes; Offset, Count: NativeInt); overload;
  1145. procedure ReadBufferData(var Buffer: Boolean); overload;
  1146. procedure ReadBufferData(var Buffer: Boolean; Count: NativeInt); overload;
  1147. procedure ReadBufferData(var Buffer: AnsiChar); overload;
  1148. procedure ReadBufferData(var Buffer: AnsiChar; Count: NativeInt); overload;
  1149. procedure ReadBufferData(var Buffer: WideChar); overload;
  1150. procedure ReadBufferData(var Buffer: WideChar; Count: NativeInt); overload;
  1151. procedure ReadBufferData(var Buffer: Int8); overload;
  1152. procedure ReadBufferData(var Buffer: Int8; Count: NativeInt); overload;
  1153. procedure ReadBufferData(var Buffer: UInt8); overload;
  1154. procedure ReadBufferData(var Buffer: UInt8; Count: NativeInt); overload;
  1155. procedure ReadBufferData(var Buffer: Int16); overload;
  1156. procedure ReadBufferData(var Buffer: Int16; Count: NativeInt); overload;
  1157. procedure ReadBufferData(var Buffer: UInt16); overload;
  1158. procedure ReadBufferData(var Buffer: UInt16; Count: NativeInt); overload;
  1159. procedure ReadBufferData(var Buffer: Int32); overload;
  1160. procedure ReadBufferData(var Buffer: Int32; Count: NativeInt); overload;
  1161. procedure ReadBufferData(var Buffer: UInt32); overload;
  1162. procedure ReadBufferData(var Buffer: UInt32; Count: NativeInt); overload;
  1163. procedure ReadBufferData(var Buffer: Int64); overload;
  1164. procedure ReadBufferData(var Buffer: Int64; Count: NativeInt); overload;
  1165. procedure ReadBufferData(var Buffer: UInt64); overload;
  1166. procedure ReadBufferData(var Buffer: UInt64; Count: NativeInt); overload;
  1167. procedure ReadBufferData(var Buffer: Single); overload;
  1168. procedure ReadBufferData(var Buffer: Single; Count: NativeInt); overload;
  1169. procedure ReadBufferData(var Buffer: Double); overload;
  1170. procedure ReadBufferData(var Buffer: Double; Count: NativeInt); overload;
  1171. {$IFDEF FPC_HAS_TYPE_EXTENDED}
  1172. procedure ReadBufferData(var Buffer: Extended); overload;
  1173. procedure ReadBufferData(var Buffer: Extended; Count: NativeInt); overload;
  1174. procedure ReadBufferData(var Buffer: TExtended80Rec); overload;
  1175. procedure ReadBufferData(var Buffer: TExtended80Rec; Count: NativeInt); overload;
  1176. {$ENDIF}
  1177. procedure WriteBuffer(const Buffer; Count: NativeInt);
  1178. procedure WriteBuffer(const Buffer: TBytes; Count: NativeInt); overload;
  1179. procedure WriteBuffer(const Buffer: TBytes; Offset, Count: NativeInt); overload;
  1180. function WriteData(const Buffer: TBytes; Count: NativeInt): NativeInt; overload;
  1181. function WriteData(const Buffer: Pointer; Count: NativeInt): NativeInt; overload;
  1182. function WriteData(const Buffer: Boolean): NativeInt; overload;
  1183. function WriteData(const Buffer: Boolean; Count: NativeInt): NativeInt; overload;
  1184. function WriteData(const Buffer: AnsiChar): NativeInt; overload;
  1185. function WriteData(const Buffer: AnsiChar; Count: NativeInt): NativeInt; overload;
  1186. function WriteData(const Buffer: WideChar): NativeInt; overload;
  1187. function WriteData(const Buffer: WideChar; Count: NativeInt): NativeInt; overload;
  1188. function WriteData(const Buffer: Int8): NativeInt; overload;
  1189. function WriteData(const Buffer: Int8; Count: NativeInt): NativeInt; overload;
  1190. function WriteData(const Buffer: UInt8): NativeInt; overload;
  1191. function WriteData(const Buffer: UInt8; Count: NativeInt): NativeInt; overload;
  1192. function WriteData(const Buffer: Int16): NativeInt; overload;
  1193. function WriteData(const Buffer: Int16; Count: NativeInt): NativeInt; overload;
  1194. function WriteData(const Buffer: UInt16): NativeInt; overload;
  1195. function WriteData(const Buffer: UInt16; Count: NativeInt): NativeInt; overload;
  1196. function WriteData(const Buffer: Int32): NativeInt; overload;
  1197. function WriteData(const Buffer: Int32; Count: NativeInt): NativeInt; overload;
  1198. function WriteData(const Buffer: UInt32): NativeInt; overload;
  1199. function WriteData(const Buffer: UInt32; Count: NativeInt): NativeInt; overload;
  1200. function WriteData(const Buffer: Int64): NativeInt; overload;
  1201. function WriteData(const Buffer: Int64; Count: NativeInt): NativeInt; overload;
  1202. function WriteData(const Buffer: UInt64): NativeInt; overload;
  1203. function WriteData(const Buffer: UInt64; Count: NativeInt): NativeInt; overload;
  1204. function WriteData(const Buffer: Single): NativeInt; overload;
  1205. function WriteData(const Buffer: Single; Count: NativeInt): NativeInt; overload;
  1206. function WriteData(const Buffer: Double): NativeInt; overload;
  1207. function WriteData(const Buffer: Double; Count: NativeInt): NativeInt; overload;
  1208. {$IFDEF FPC_HAS_TYPE_EXTENDED}
  1209. function WriteData(const Buffer: Extended): NativeInt; overload;
  1210. function WriteData(const Buffer: Extended; Count: NativeInt): NativeInt; overload;
  1211. function WriteData(const Buffer: TExtended80Rec): NativeInt; overload;
  1212. function WriteData(const Buffer: TExtended80Rec; Count: NativeInt): NativeInt; overload;
  1213. {$ENDIF}
  1214. procedure WriteBufferData(Buffer: Int32); overload;
  1215. procedure WriteBufferData(Buffer: Int32; Count: NativeInt); overload;
  1216. procedure WriteBufferData(Buffer: Boolean); overload;
  1217. procedure WriteBufferData(Buffer: Boolean; Count: NativeInt); overload;
  1218. procedure WriteBufferData(Buffer: AnsiChar); overload;
  1219. procedure WriteBufferData(Buffer: AnsiChar; Count: NativeInt); overload;
  1220. procedure WriteBufferData(Buffer: WideChar); overload;
  1221. procedure WriteBufferData(Buffer: WideChar; Count: NativeInt); overload;
  1222. procedure WriteBufferData(Buffer: Int8); overload;
  1223. procedure WriteBufferData(Buffer: Int8; Count: NativeInt); overload;
  1224. procedure WriteBufferData(Buffer: UInt8); overload;
  1225. procedure WriteBufferData(Buffer: UInt8; Count: NativeInt); overload;
  1226. procedure WriteBufferData(Buffer: Int16); overload;
  1227. procedure WriteBufferData(Buffer: Int16; Count: NativeInt); overload;
  1228. procedure WriteBufferData(Buffer: UInt16); overload;
  1229. procedure WriteBufferData(Buffer: UInt16; Count: NativeInt); overload;
  1230. procedure WriteBufferData(Buffer: UInt32); overload;
  1231. procedure WriteBufferData(Buffer: UInt32; Count: NativeInt); overload;
  1232. procedure WriteBufferData(Buffer: Int64); overload;
  1233. procedure WriteBufferData(Buffer: Int64; Count: NativeInt); overload;
  1234. procedure WriteBufferData(Buffer: UInt64); overload;
  1235. procedure WriteBufferData(Buffer: UInt64; Count: NativeInt); overload;
  1236. procedure WriteBufferData(Buffer: Single); overload;
  1237. procedure WriteBufferData(Buffer: Single; Count: NativeInt); overload;
  1238. procedure WriteBufferData(Buffer: Double); overload;
  1239. procedure WriteBufferData(Buffer: Double; Count: NativeInt); overload;
  1240. {$IFDEF FPC_HAS_TYPE_EXTENDED}
  1241. procedure WriteBufferData(Buffer: Extended); overload;
  1242. procedure WriteBufferData(Buffer: Extended; Count: NativeInt); overload;
  1243. procedure WriteBufferData(Buffer: TExtended80Rec); overload;
  1244. procedure WriteBufferData(Buffer: TExtended80Rec; Count: NativeInt); overload;
  1245. {$ENDIF}
  1246. function CopyFrom(Source: TStream; Count: Int64): Int64;
  1247. function ReadComponent(Instance: TComponent): TComponent;
  1248. function ReadComponentRes(Instance: TComponent): TComponent;
  1249. procedure WriteComponent(Instance: TComponent); overload;
  1250. procedure WriteComponent(Instance: TComponent; aWriteUnitname: boolean); overload;
  1251. procedure WriteComponentRes(const ResName: string; Instance: TComponent); overload;
  1252. procedure WriteComponentRes(const ResName: string; Instance: TComponent; aWriteUnitname: boolean); overload;
  1253. procedure WriteDescendent(Instance, Ancestor: TComponent); overload;
  1254. procedure WriteDescendent(Instance, Ancestor: TComponent; aWriteUnitname: boolean); overload;
  1255. procedure WriteDescendentRes(const ResName: string; Instance, Ancestor: TComponent); overload;
  1256. procedure WriteDescendentRes(const ResName: string; Instance, Ancestor: TComponent; aWriteUnitname: boolean); overload;
  1257. procedure WriteResourceHeader(const ResName: string; {!!!:out} var FixupInfo: Longint);
  1258. procedure FixupResourceHeader(FixupInfo: Longint);
  1259. procedure ReadResHeader;
  1260. function ReadByte : Byte;
  1261. function ReadWord : Word;
  1262. function ReadDWord : Cardinal;
  1263. function ReadQWord : QWord;
  1264. function ReadAnsiString : AnsiString;
  1265. function ReadUnicodeString : WideString;
  1266. procedure WriteByte(b : Byte);
  1267. procedure WriteWord(w : Word);
  1268. procedure WriteDWord(d : Cardinal);
  1269. procedure WriteQWord(q : QWord);
  1270. Procedure WriteAnsiString (const S : AnsiString); virtual;
  1271. Procedure WriteUnicodeString (const S : UnicodeString); virtual;
  1272. property Position: Int64 read GetPosition write SetPosition;
  1273. property Size: Int64 read GetSize write SetSize64;
  1274. end;
  1275. TProxyStream = class(TStream)
  1276. private
  1277. FStream: IStream;
  1278. protected
  1279. function GetIStream: IStream;
  1280. public
  1281. constructor Create(const Stream: IStream);
  1282. function Read(var Buffer; Count: Longint): Longint; override;
  1283. function Write(const Buffer; Count: Longint): Longint; override;
  1284. function Seek(const Offset: int64; Origin: TSeekOrigin): int64; override;
  1285. procedure Check(err:integer); virtual; abstract;
  1286. end;
  1287. { TOwnerStream }
  1288. TOwnerStream = Class(TStream)
  1289. Protected
  1290. FOwner : Boolean;
  1291. FSource : TStream;
  1292. Public
  1293. Constructor Create(ASource : TStream);
  1294. Destructor Destroy; override;
  1295. Property Source : TStream Read FSource;
  1296. Property SourceOwner : Boolean Read Fowner Write FOwner;
  1297. end;
  1298. IStreamPersist = interface ['{B8CD12A3-267A-11D4-83DA-00C04F60B2DD}']
  1299. procedure LoadFromStream(Stream: TStream);
  1300. procedure SaveToStream(Stream: TStream);
  1301. end;
  1302. { THandleStream class }
  1303. THandleStream = class(TStream)
  1304. private
  1305. FHandle: THandle;
  1306. protected
  1307. procedure SetSize(NewSize: Longint); override;
  1308. procedure SetSize(const NewSize: Int64); override;
  1309. public
  1310. constructor Create(AHandle: THandle);
  1311. function Read(var Buffer; Count: Longint): Longint; override;
  1312. function Write(const Buffer; Count: Longint): Longint; override;
  1313. function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override;
  1314. property Handle: THandle read FHandle;
  1315. end;
  1316. { TFileStream class }
  1317. TFileStream = class(THandleStream)
  1318. Private
  1319. FFileName : String;
  1320. public
  1321. constructor Create(const AFileName: string; Mode: Word);
  1322. constructor Create(const AFileName: string; Mode: Word; Rights: Cardinal);
  1323. destructor Destroy; override;
  1324. Function Flush : Boolean;
  1325. property FileName : String Read FFilename;
  1326. end;
  1327. { TCustomMemoryStream abstract class }
  1328. TCustomMemoryStream = class(TStream)
  1329. private
  1330. FMemory: Pointer;
  1331. FSize, FPosition: PtrInt;
  1332. FSizeBoundsSeek : Boolean;
  1333. protected
  1334. Function GetSize : Int64; Override;
  1335. function GetPosition: Int64; Override;
  1336. procedure SetPointer(Ptr: Pointer; ASize: PtrInt);
  1337. public
  1338. function Read(var Buffer; Count: LongInt): LongInt; override;
  1339. function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override;
  1340. procedure SaveToStream(Stream: TStream);
  1341. procedure SaveToFile(const FileName: string);
  1342. property Memory: Pointer read FMemory;
  1343. Property SizeBoundsSeek : Boolean Read FSizeBoundsSeek Write FSizeBoundsSeek;
  1344. end;
  1345. { TMemoryStream }
  1346. TMemoryStream = class(TCustomMemoryStream)
  1347. private
  1348. FCapacity: PtrInt;
  1349. procedure SetCapacity(NewCapacity: PtrInt);
  1350. protected
  1351. function Realloc(var NewCapacity: PtrInt): Pointer; virtual;
  1352. property Capacity: PtrInt read FCapacity write SetCapacity;
  1353. public
  1354. destructor Destroy; override;
  1355. procedure Clear;
  1356. procedure LoadFromStream(Stream: TStream);
  1357. procedure LoadFromFile(const FileName: string);
  1358. procedure SetSize({$ifdef CPU64}const NewSize: Int64{$else}NewSize: LongInt{$endif}); override;
  1359. function Write(const Buffer; Count: LongInt): LongInt; override;
  1360. end;
  1361. { TBytesStream }
  1362. TBytesStream = class(TMemoryStream)
  1363. private
  1364. FBytes: TBytes;
  1365. protected
  1366. function Realloc(var NewCapacity: PtrInt): Pointer; override;
  1367. public
  1368. constructor Create(const ABytes: TBytes); virtual; overload;
  1369. property Bytes: TBytes read FBytes;
  1370. end;
  1371. { TStringStream }
  1372. TStringStream = class(TBytesStream)
  1373. private
  1374. FEncoding: TEncoding;
  1375. FOwnsEncoding : Boolean;
  1376. function GetAnsiDataString: AnsiString;
  1377. function GetDataString: RTLString;
  1378. function GetUnicodeDataString: UnicodeString;
  1379. protected
  1380. public
  1381. constructor Create(const ABytes: TBytes); override; overload;
  1382. constructor Create; overload;
  1383. constructor Create(const AString: AnsiString); overload;
  1384. constructor CreateRaw(const AString: RawByteString); overload;
  1385. constructor Create(const AString: Ansistring; AEncoding: TEncoding; AOwnsEncoding: Boolean = True); overload;
  1386. constructor Create(const AString: Ansistring; ACodePage: Integer); overload;
  1387. // UnicodeString versions
  1388. constructor Create(const AString: UnicodeString); overload;
  1389. constructor Create(const AString: UnicodeString; AEncoding: TEncoding; AOwnsEncoding: Boolean = True); overload;
  1390. constructor Create(const AString: UnicodeString; ACodePage: Integer); overload;
  1391. Destructor Destroy; override;
  1392. function ReadUnicodeString(Count: Longint): UnicodeString;
  1393. procedure WriteUnicodeString(const AString: UnicodeString);
  1394. function ReadAnsiString(Count: Longint): AnsiString; overload;
  1395. procedure WriteAnsiString(const AString: AnsiString); override;
  1396. function ReadString(Count: Longint): string;
  1397. procedure WriteString(const AString: string);
  1398. property DataString: RTLString read GetDataString;
  1399. Property AnsiDataString : AnsiString Read GetAnsiDataString;
  1400. Property UnicodeDataString : UnicodeString Read GetUnicodeDataString;
  1401. Property OwnsEncoding : Boolean Read FOwnsEncoding;
  1402. Property Encoding : TEncoding Read FEncoding;
  1403. end;
  1404. { TRawByteStringStream }
  1405. TRawByteStringStream = Class(TBytesStream)
  1406. public
  1407. Constructor Create (const aData : RawByteString); overload;
  1408. function DataString: RawByteString;
  1409. function ReadString(Count: Longint): RawByteString;
  1410. procedure WriteString(const AString: RawByteString);
  1411. end;
  1412. { TResourceStream }
  1413. {$ifdef FPC_OS_UNICODE}
  1414. TResourceStream = class(TCustomMemoryStream)
  1415. private
  1416. Res: TFPResourceHandle;
  1417. Handle: TFPResourceHGLOBAL;
  1418. procedure Initialize(Instance: TFPResourceHMODULE; Name, ResType: PWideChar; NameIsID: Boolean);
  1419. public
  1420. constructor Create(Instance: TFPResourceHMODULE; const ResName: WideString; ResType: PWideChar);
  1421. constructor CreateFromID(Instance: TFPResourceHMODULE; ResID: Integer; ResType: PWideChar);
  1422. destructor Destroy; override;
  1423. end;
  1424. {$else}
  1425. TResourceStream = class(TCustomMemoryStream)
  1426. private
  1427. Res: TFPResourceHandle;
  1428. Handle: TFPResourceHGLOBAL;
  1429. procedure Initialize(Instance: TFPResourceHMODULE; Name, ResType: PAnsiChar; NameIsID: Boolean);
  1430. public
  1431. constructor Create(Instance: TFPResourceHMODULE; const ResName: string; ResType: PAnsiChar);
  1432. constructor CreateFromID(Instance: TFPResourceHMODULE; ResID: Integer; ResType: PAnsiChar);
  1433. destructor Destroy; override;
  1434. end;
  1435. {$endif FPC_OS_UNICODE}
  1436. { TStreamAdapter }
  1437. TStreamOwnership = (soReference, soOwned);
  1438. { Implements OLE IStream on TStream }
  1439. TStreamAdapter = class(TInterfacedObject, IStream)
  1440. private
  1441. FStream : TStream;
  1442. FOwnership : TStreamOwnership;
  1443. m_bReverted: Boolean;
  1444. public
  1445. constructor Create(Stream: TStream; Ownership: TStreamOwnership = soReference);
  1446. destructor Destroy; override;
  1447. function Read(pv: Pointer; cb: DWORD; pcbRead: PDWORD): HResult; virtual; stdcall;
  1448. function Write(pv: Pointer; cb: DWORD; pcbWritten: PDWORD): HResult; virtual; stdcall;
  1449. function Seek(dlibMove: LargeInt; dwOrigin: DWORD; out libNewPosition: LargeUint): HResult; virtual; stdcall;
  1450. function SetSize(libNewSize: LargeUint): HResult; virtual; stdcall;
  1451. function CopyTo(stm: IStream; cb: LargeUint; out cbRead: LargeUint; out cbWritten: LargeUint): HResult; virtual; stdcall;
  1452. function Commit(grfCommitFlags: DWORD): HResult; virtual; stdcall;
  1453. function Revert: HResult; virtual; stdcall;
  1454. function LockRegion(libOffset: LargeUint; cb: LargeUint; dwLockType: DWORD): HResult; virtual; stdcall;
  1455. function UnlockRegion(libOffset: LargeUint; cb: LargeUint; dwLockType: DWORD): HResult; virtual; stdcall;
  1456. function Stat(out statstg: TStatStg; grfStatFlag: DWORD): HResult; virtual; stdcall;
  1457. function Clone(out stm: IStream): HResult; virtual; stdcall;
  1458. property Stream: TStream read FStream;
  1459. property StreamOwnership: TStreamOwnership read FOwnership write FOwnership;
  1460. end;
  1461. { TFiler }
  1462. TValueType = (vaNull, vaList, vaInt8, vaInt16, vaInt32, vaExtended,
  1463. vaString, vaIdent, vaFalse, vaTrue, vaBinary, vaSet, vaLString,
  1464. vaNil, vaCollection, vaSingle, vaCurrency, vaDate, vaWString, vaInt64,
  1465. vaUTF8String, vaUString, vaQWord, vaDouble);
  1466. TFilerFlag = (ffInherited, ffChildPos, ffInline);
  1467. TFilerFlags = set of TFilerFlag;
  1468. TReaderProc = procedure(Reader: TReader) of object;
  1469. TWriterProc = procedure(Writer: TWriter) of object;
  1470. TStreamProc = procedure(Stream: TStream) of object;
  1471. TFiler = class(TObject)
  1472. private
  1473. FRoot: TComponent;
  1474. FLookupRoot: TComponent;
  1475. FAncestor: TPersistent;
  1476. FIgnoreChildren: Boolean;
  1477. protected
  1478. procedure SetRoot(ARoot: TComponent); virtual;
  1479. public
  1480. procedure DefineProperty(const Name: string;
  1481. ReadData: TReaderProc; WriteData: TWriterProc;
  1482. HasData: Boolean); virtual; abstract;
  1483. procedure DefineBinaryProperty(const Name: string;
  1484. ReadData, WriteData: TStreamProc;
  1485. HasData: Boolean); virtual; abstract;
  1486. Procedure FlushBuffer; virtual; abstract;
  1487. property Root: TComponent read FRoot write SetRoot;
  1488. property LookupRoot: TComponent read FLookupRoot;
  1489. property Ancestor: TPersistent read FAncestor write FAncestor;
  1490. property IgnoreChildren: Boolean read FIgnoreChildren write FIgnoreChildren;
  1491. end;
  1492. { TComponent class reference type }
  1493. TComponentClass = class of TComponent;
  1494. { TReader }
  1495. { TAbstractObjectReader }
  1496. TAbstractObjectReader = class
  1497. public
  1498. Procedure FlushBuffer; virtual;
  1499. function NextValue: TValueType; virtual; abstract;
  1500. function ReadValue: TValueType; virtual; abstract;
  1501. procedure BeginRootComponent; virtual; abstract;
  1502. procedure BeginComponent(var Flags: TFilerFlags; var AChildPos: Integer;
  1503. var CompClassName, CompName: String); virtual; abstract; overload;
  1504. procedure BeginComponent(var Flags: TFilerFlags; var AChildPos: Integer;
  1505. var CompUnitName, CompClassName, CompName: String); virtual; overload;
  1506. function BeginProperty: String; virtual; abstract;
  1507. //Please don't use read, better use ReadBinary whenever possible
  1508. procedure Read(var Buf; Count: LongInt); virtual; abstract;
  1509. { All ReadXXX methods are called _after_ the value type has been read! }
  1510. procedure ReadBinary(const DestData: TMemoryStream); virtual; abstract;
  1511. {$ifndef FPUNONE}
  1512. function ReadFloat: Extended; virtual; abstract;
  1513. function ReadSingle: Single; virtual; abstract;
  1514. function ReadDouble: Double; virtual; abstract;
  1515. function ReadDate: TDateTime; virtual; abstract;
  1516. {$endif}
  1517. function ReadCurrency: Currency; virtual; abstract;
  1518. function ReadIdent(ValueType: TValueType): RawByteString; virtual; abstract;
  1519. function ReadInt8: ShortInt; virtual; abstract;
  1520. function ReadInt16: SmallInt; virtual; abstract;
  1521. function ReadInt32: LongInt; virtual; abstract;
  1522. function ReadInt64: Int64; virtual; abstract;
  1523. function ReadSet(EnumType: Pointer): Integer; virtual; abstract;
  1524. procedure ReadSignature; virtual; abstract;
  1525. function ReadStr: RawByteString; virtual; abstract;
  1526. function ReadString(StringType: TValueType): RawByteString; virtual; abstract;
  1527. function ReadWideString: WideString;virtual;abstract;
  1528. function ReadUnicodeString: UnicodeString;virtual;abstract;
  1529. procedure SkipComponent(SkipComponentInfos: Boolean); virtual; abstract;
  1530. procedure SkipValue; virtual; abstract;
  1531. end;
  1532. { TBinaryObjectReader }
  1533. TBinaryObjectReader = class(TAbstractObjectReader)
  1534. public
  1535. {$ScopedEnums on}
  1536. type
  1537. TBOVersion = (
  1538. boVersion0,
  1539. boVersion1
  1540. );
  1541. {$ScopedEnums off}
  1542. const
  1543. UnitnameSeparator = '/';
  1544. protected
  1545. FStream: TStream;
  1546. FBuffer: Pointer;
  1547. FBufSize: Integer;
  1548. FBufPos: Integer;
  1549. FBufEnd: Integer;
  1550. FVersion: TBOVersion;
  1551. function ReadWord : word; {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}
  1552. function ReadDWord : longword; {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}
  1553. function ReadQWord : qword; {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}
  1554. {$ifndef FPUNONE}
  1555. function ReadExtended : extended; {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}
  1556. {$endif}
  1557. procedure SkipProperty;
  1558. procedure SkipSetBody;
  1559. public
  1560. constructor Create(Stream: TStream; BufSize: Integer);
  1561. destructor Destroy; override;
  1562. function NextValue: TValueType; override;
  1563. function ReadValue: TValueType; override;
  1564. procedure BeginRootComponent; override;
  1565. procedure BeginComponent(var Flags: TFilerFlags; var AChildPos: Integer;
  1566. var CompClassName, CompName: String); override; overload;
  1567. procedure BeginComponent(var Flags: TFilerFlags; var AChildPos: Integer;
  1568. var CompUnitName, CompClassName, CompName: String); override; overload;
  1569. function BeginProperty: String; override;
  1570. //Please don't use read, better use ReadBinary whenever possible
  1571. procedure Read(var Buf; Count: LongInt); override;
  1572. procedure ReadBinary(const DestData: TMemoryStream); override;
  1573. {$ifndef FPUNONE}
  1574. function ReadFloat: Extended; override;
  1575. function ReadSingle: Single; override;
  1576. function ReadDouble: Double; override;
  1577. function ReadDate: TDateTime; override;
  1578. {$endif}
  1579. function ReadCurrency: Currency; override;
  1580. function ReadIdent(ValueType: TValueType): RawByteString; override;
  1581. function ReadInt8: ShortInt; override;
  1582. function ReadInt16: SmallInt; override;
  1583. function ReadInt32: LongInt; override;
  1584. function ReadInt64: Int64; override;
  1585. function ReadSet(EnumType: Pointer): Integer; override;
  1586. procedure ReadSignature; override;
  1587. function ReadStr: RawByteString; override;
  1588. function ReadString(StringType: TValueType): RawByteString; override;
  1589. function ReadWideString: WideString;override;
  1590. function ReadUnicodeString: UnicodeString;override;
  1591. procedure SkipComponent(SkipComponentInfos: Boolean); override;
  1592. procedure SkipValue; override;
  1593. property Version: TBOVersion read FVersion;
  1594. end;
  1595. TFindMethodEvent = procedure(Reader: TReader; const MethodName: string;
  1596. var Address: CodePointer; var Error: Boolean) of object;
  1597. TSetMethodPropertyEvent = procedure(Reader: TReader; Instance: TPersistent;
  1598. PropInfo: PPropInfo; const TheMethodName: string;
  1599. var Handled: boolean) of object;
  1600. TSetNameEvent = procedure(Reader: TReader; Component: TComponent;
  1601. var aName: string) of object;
  1602. TReferenceNameEvent = procedure(Reader: TReader; var aName: string) of object;
  1603. TAncestorNotFoundEvent = procedure(Reader: TReader; const ComponentName: string;
  1604. ComponentClass: TPersistentClass; var Component: TComponent) of object;
  1605. TReadComponentsProc = procedure(Component: TComponent) of object;
  1606. TReaderError = procedure(Reader: TReader; const Message: string;
  1607. var Handled: Boolean) of object;
  1608. TPropertyNotFoundEvent = procedure(Reader: TReader; Instance: TPersistent;
  1609. var PropName: string; IsPath: boolean; var Handled, Skip: Boolean) of object;
  1610. TFindComponentClassEvent = procedure(Reader: TReader; const aClassName: string;
  1611. var ComponentClass: TComponentClass) of object;
  1612. TFindComponentClassExEvent = procedure(Reader: TReader;
  1613. const aName, anUnitname, aClassName: string;
  1614. var ComponentClass: TComponentClass) of object;
  1615. TCreateComponentEvent = procedure(Reader: TReader;
  1616. ComponentClass: TComponentClass; var Component: TComponent) of object;
  1617. TReadWriteStringPropertyEvent = procedure(Sender:TObject;
  1618. const Instance: TPersistent; PropInfo: PPropInfo;
  1619. var Content:string) of object;
  1620. TGetStreamProc = procedure (const S: TStream) of object;
  1621. TGetDeltaStreamsEvent = procedure (Sender: TObject; Proc: TGetStreamProc; var Handled: Boolean) of object;
  1622. { TReader }
  1623. TReader = class(TFiler)
  1624. private
  1625. FDriver: TAbstractObjectReader;
  1626. FOnFindComponentClassEx: TFindComponentClassExEvent;
  1627. FOwner: TComponent;
  1628. FParent: TComponent;
  1629. FFixups: TObject;
  1630. FLoaded: TFpList;
  1631. FLock: TRTLCriticalSection;
  1632. FOnFindMethod: TFindMethodEvent;
  1633. FOnSetMethodProperty: TSetMethodPropertyEvent;
  1634. FOnSetName: TSetNameEvent;
  1635. FOnReferenceName: TReferenceNameEvent;
  1636. FOnAncestorNotFound: TAncestorNotFoundEvent;
  1637. FOnError: TReaderError;
  1638. FOnPropertyNotFound: TPropertyNotFoundEvent;
  1639. FOnFindComponentClass: TFindComponentClassEvent;
  1640. FOnCreateComponent: TCreateComponentEvent;
  1641. FPropName: rawbytestring;
  1642. FCanHandleExcepts: Boolean;
  1643. FOnReadStringProperty:TReadWriteStringPropertyEvent;
  1644. procedure DoFixupReferences;
  1645. function FindComponentClass(const AName, anUnitName, AClassName: rawbytestring): TComponentClass;
  1646. procedure Lock;
  1647. procedure Unlock;
  1648. protected
  1649. function Error(const Message: string): Boolean; virtual;
  1650. function FindMethod(ARoot: TComponent; const AMethodName: rawbytestring): CodePointer; virtual;
  1651. procedure ReadProperty(AInstance: TPersistent);
  1652. procedure ReadPropValue(Instance: TPersistent; PropInfo: Pointer);
  1653. procedure PropertyError;
  1654. procedure ReadData(Instance: TComponent);
  1655. procedure SetName(aComponent: TComponent; aName : string); virtual;
  1656. property PropName: rawbytestring read FPropName;
  1657. property CanHandleExceptions: Boolean read FCanHandleExcepts;
  1658. function CreateDriver(Stream: TStream; BufSize: Integer): TAbstractObjectReader; virtual;
  1659. public
  1660. constructor Create(Stream: TStream; BufSize: Integer);
  1661. destructor Destroy; override;
  1662. Procedure FlushBuffer; override;
  1663. procedure BeginReferences;
  1664. procedure CheckValue(Value: TValueType);
  1665. procedure DefineProperty(const Name: string;
  1666. AReadData: TReaderProc; WriteData: TWriterProc;
  1667. HasData: Boolean); override;
  1668. procedure DefineBinaryProperty(const Name: string;
  1669. AReadData, WriteData: TStreamProc;
  1670. HasData: Boolean); override;
  1671. function EndOfList: Boolean;
  1672. procedure EndReferences;
  1673. procedure FixupReferences;
  1674. procedure SkipValue;
  1675. function NextValue: TValueType;
  1676. //Please don't use read, better use ReadBinary whenever possible
  1677. //uuups, ReadBinary is protected ..
  1678. procedure Read(var Buf; Count: LongInt); virtual;
  1679. procedure ReadPrefix(var aFlags: TFilerFlags; var aChildPos: Integer); virtual;
  1680. function ReadBoolean: Boolean;
  1681. function ReadChar: AnsiChar;
  1682. function ReadWideChar: WideChar;
  1683. function ReadUnicodeChar: UnicodeChar;
  1684. procedure ReadCollection(Collection: TCollection);
  1685. function ReadComponent(Component: TComponent): TComponent;
  1686. procedure ReadComponents(AOwner, AParent: TComponent;
  1687. Proc: TReadComponentsProc);
  1688. {$ifndef FPUNONE}
  1689. function ReadFloat: Extended;
  1690. function ReadSingle: Single;
  1691. function ReadDouble: Double;
  1692. function ReadDate: TDateTime;
  1693. {$endif}
  1694. function ReadCurrency: Currency;
  1695. function ReadIdent: rawbytestring;
  1696. function ReadInteger: Longint;
  1697. function ReadInt64: Int64;
  1698. function ReadSet(EnumType: Pointer): Integer;
  1699. procedure ReadListBegin;
  1700. procedure ReadListEnd;
  1701. function ReadRootComponent(ARoot: TComponent): TComponent;
  1702. function ReadComponentDeltaRes(Instance: TComponent; const DeltaCandidates: array of Ansistring; const Proc: TGetStreamProc): TComponent;
  1703. function ReadVariant: Variant;
  1704. procedure ReadSignature;
  1705. function ReadString: RawBytestring;
  1706. function ReadWideString: WideString;
  1707. function ReadUnicodeString: UnicodeString;
  1708. function ReadValue: TValueType;
  1709. procedure CopyValue(Writer: TWriter);
  1710. property Driver: TAbstractObjectReader read FDriver;
  1711. property Owner: TComponent read FOwner write FOwner;
  1712. property Parent: TComponent read FParent write FParent;
  1713. property OnError: TReaderError read FOnError write FOnError;
  1714. property OnPropertyNotFound: TPropertyNotFoundEvent read FOnPropertyNotFound write FOnPropertyNotFound;
  1715. property OnFindMethod: TFindMethodEvent read FOnFindMethod write FOnFindMethod;
  1716. property OnSetMethodProperty: TSetMethodPropertyEvent read FOnSetMethodProperty write FOnSetMethodProperty;
  1717. property OnSetName: TSetNameEvent read FOnSetName write FOnSetName;
  1718. property OnReferenceName: TReferenceNameEvent read FOnReferenceName write FOnReferenceName;
  1719. property OnAncestorNotFound: TAncestorNotFoundEvent read FOnAncestorNotFound write FOnAncestorNotFound;
  1720. property OnCreateComponent: TCreateComponentEvent read FOnCreateComponent write FOnCreateComponent;
  1721. property OnFindComponentClass: TFindComponentClassEvent read FOnFindComponentClass write FOnFindComponentClass;
  1722. property OnFindComponentClassEx: TFindComponentClassExEvent read FOnFindComponentClassEx write FOnFindComponentClassEx;
  1723. property OnReadStringProperty: TReadWriteStringPropertyEvent read FOnReadStringProperty write FOnReadStringProperty;
  1724. end;
  1725. { TWriter }
  1726. { TAbstractObjectWriter }
  1727. TAbstractObjectWriter = class
  1728. public
  1729. { Begin/End markers. Those ones who don't have an end indicator, use
  1730. "EndList", after the occurrence named in the comment. Note that this
  1731. only counts for "EndList" calls on the same level; each BeginXXX call
  1732. increases the current level. }
  1733. procedure BeginCollection; virtual; abstract; { Ends with the next "EndList" }
  1734. procedure BeginComponent(Component: TComponent; Flags: TFilerFlags;
  1735. ChildPos: Integer); virtual; abstract; { Ends after the second "EndList" }
  1736. procedure WriteSignature; virtual; abstract;
  1737. procedure BeginList; virtual; abstract;
  1738. procedure EndList; virtual; abstract;
  1739. procedure BeginProperty(const PropName: String); virtual; abstract;
  1740. procedure EndProperty; virtual; abstract;
  1741. Procedure FlushBuffer; virtual;
  1742. //Please don't use write, better use WriteBinary whenever possible
  1743. procedure Write(const Buffer; Count: Longint); virtual;abstract;
  1744. procedure WriteBinary(const Buffer; Count: Longint); virtual; abstract;
  1745. procedure WriteBoolean(Value: Boolean); virtual; abstract;
  1746. // procedure WriteChar(Value: AnsiChar);
  1747. {$ifndef FPUNONE}
  1748. procedure WriteFloat(const Value: Extended); virtual; abstract;
  1749. procedure WriteSingle(const Value: Single); virtual; abstract;
  1750. procedure WriteDate(const Value: TDateTime); virtual; abstract;
  1751. {$endif}
  1752. procedure WriteCurrency(const Value: Currency); virtual; abstract;
  1753. procedure WriteIdent(const Ident: string); virtual; abstract;
  1754. procedure WriteInteger(Value: Int64); virtual; abstract;
  1755. procedure WriteUInt64(Value: QWord); virtual; abstract;
  1756. procedure WriteVariant(const Value: Variant); virtual; abstract;
  1757. procedure WriteMethodName(const Name: String); virtual; abstract;
  1758. procedure WriteSet(Value: LongInt; SetType: Pointer); virtual; abstract;
  1759. procedure WriteString(const Value: RawByteString); virtual; abstract;
  1760. procedure WriteWideString(const Value: WideString);virtual;abstract;
  1761. procedure WriteUnicodeString(const Value: UnicodeString);virtual;abstract;
  1762. end;
  1763. { TBinaryObjectWriter }
  1764. TBinaryObjectWriter = class(TAbstractObjectWriter)
  1765. protected
  1766. FStream: TStream;
  1767. FBuffer: Pointer;
  1768. FBufSize: Integer;
  1769. FBufPos: Integer;
  1770. FBufEnd: Integer;
  1771. FVersion: TBinaryObjectReader.TBOVersion;
  1772. procedure WriteWord(w : word); {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}
  1773. procedure WriteDWord(lw : longword); {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}
  1774. procedure WriteQWord(qw : qword); {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}
  1775. {$ifndef FPUNONE}
  1776. procedure WriteExtended(e : extended); {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}
  1777. {$endif}
  1778. procedure WriteValue(Value: TValueType);
  1779. public
  1780. constructor Create(Stream: TStream; BufSize: Integer);
  1781. destructor Destroy; override;
  1782. procedure WriteSignature; override;
  1783. procedure FlushBuffer; override;
  1784. procedure BeginCollection; override;
  1785. procedure BeginComponent(Component: TComponent; Flags: TFilerFlags;
  1786. ChildPos: Integer); override;
  1787. procedure BeginList; override;
  1788. procedure EndList; override;
  1789. procedure BeginProperty(const PropName: String); override;
  1790. procedure EndProperty; override;
  1791. //Please don't use write, better use WriteBinary whenever possible
  1792. procedure Write(const Buffer; Count: Longint); override;
  1793. procedure WriteBinary(const Buffer; Count: LongInt); override;
  1794. procedure WriteBoolean(Value: Boolean); override;
  1795. {$ifndef FPUNONE}
  1796. procedure WriteFloat(const Value: Extended); override;
  1797. procedure WriteSingle(const Value: Single); override;
  1798. procedure WriteDate(const Value: TDateTime); override;
  1799. {$endif}
  1800. procedure WriteCurrency(const Value: Currency); override;
  1801. procedure WriteIdent(const Ident: string); override;
  1802. procedure WriteInteger(Value: Int64); override;
  1803. procedure WriteUInt64(Value: QWord); override;
  1804. procedure WriteMethodName(const Name: String); override;
  1805. procedure WriteSet(Value: LongInt; SetType: Pointer); override;
  1806. procedure WriteStr(const Value: RawByteString); // write shortstring
  1807. procedure WriteString(const Value: RawByteString); override;
  1808. procedure WriteWideString(const Value: WideString); override;
  1809. procedure WriteUnicodeString(const Value: UnicodeString); override;
  1810. procedure WriteVariant(const VarValue: Variant);override;
  1811. property Version: TBinaryObjectReader.TBOVersion read FVersion write FVersion;
  1812. end;
  1813. TTextObjectWriter = class(TAbstractObjectWriter)
  1814. end;
  1815. TFindAncestorEvent = procedure (Writer: TWriter; Component: TComponent;
  1816. const Name: string; var Ancestor, RootAncestor: TComponent) of object;
  1817. TWriteMethodPropertyEvent = procedure (Writer: TWriter; Instance: TPersistent;
  1818. PropInfo: PPropInfo;
  1819. const MethodValue, DefMethodValue: TMethod;
  1820. var Handled: boolean) of object;
  1821. TWriter = class(TFiler)
  1822. private
  1823. FDriver: TAbstractObjectWriter;
  1824. FDestroyDriver: Boolean;
  1825. FRootAncestor: TComponent;
  1826. FPropPath: String;
  1827. FAncestors: TStringList;
  1828. FAncestorPos: Integer;
  1829. FCurrentPos: Integer;
  1830. FOnFindAncestor: TFindAncestorEvent;
  1831. FOnWriteMethodProperty: TWriteMethodPropertyEvent;
  1832. FOnWriteStringProperty:TReadWriteStringPropertyEvent;
  1833. procedure AddToAncestorList(Component: TComponent);
  1834. procedure WriteComponentData(Instance: TComponent);
  1835. Procedure DetermineAncestor(Component: TComponent);
  1836. procedure DoFindAncestor(Component : TComponent);
  1837. protected
  1838. procedure SetRoot(ARoot: TComponent); override;
  1839. procedure WriteBinary(AWriteData: TStreamProc);
  1840. procedure WriteProperty(Instance: TPersistent; PropInfo: Pointer);
  1841. procedure WriteProperties(Instance: TPersistent);
  1842. procedure WriteChildren(Component: TComponent);
  1843. function CreateDriver(Stream: TStream; BufSize: Integer): TAbstractObjectWriter; virtual;
  1844. public
  1845. constructor Create(ADriver: TAbstractObjectWriter);
  1846. constructor Create(Stream: TStream; BufSize: Integer);
  1847. destructor Destroy; override;
  1848. Procedure FlushBuffer; override;
  1849. procedure DefineProperty(const Name: string;
  1850. ReadData: TReaderProc; AWriteData: TWriterProc;
  1851. HasData: Boolean); override;
  1852. procedure DefineBinaryProperty(const Name: string;
  1853. ReadData, AWriteData: TStreamProc;
  1854. HasData: Boolean); override;
  1855. //Please don't use write, better use WriteBinary whenever possible
  1856. //uuups, WriteBinary is protected ..
  1857. procedure Write(const Buffer; Count: Longint); virtual;
  1858. procedure WriteBoolean(Value: Boolean);
  1859. procedure WriteCollection(Value: TCollection);
  1860. procedure WriteComponent(Component: TComponent);
  1861. procedure WriteChar(Value: AnsiChar);
  1862. procedure WriteWideChar(Value: WideChar);
  1863. procedure WriteDescendent(ARoot: TComponent; AAncestor: TComponent);
  1864. {$ifndef FPUNONE}
  1865. procedure WriteFloat(const Value: Extended);
  1866. procedure WriteSingle(const Value: Single);
  1867. procedure WriteDate(const Value: TDateTime);
  1868. {$endif}
  1869. procedure WriteCurrency(const Value: Currency);
  1870. procedure WriteIdent(const Ident: string);
  1871. procedure WriteInteger(Value: Longint); overload;
  1872. procedure WriteInteger(Value: Int64); overload;
  1873. procedure WriteSet(Value: Longint; SetType: Pointer);
  1874. procedure WriteListBegin;
  1875. procedure WriteListEnd;
  1876. Procedure WriteSignature;
  1877. procedure WriteRootComponent(ARoot: TComponent);
  1878. procedure WriteString(const Value: String);
  1879. procedure WriteWideString(const Value: WideString);
  1880. procedure WriteUnicodeString(const Value: UnicodeString);
  1881. procedure WriteVariant(const VarValue: Variant);
  1882. property RootAncestor: TComponent read FRootAncestor write FRootAncestor;
  1883. property OnFindAncestor: TFindAncestorEvent read FOnFindAncestor write FOnFindAncestor;
  1884. property OnWriteMethodProperty: TWriteMethodPropertyEvent read FOnWriteMethodProperty write FOnWriteMethodProperty;
  1885. property OnWriteStringProperty: TReadWriteStringPropertyEvent read FOnWriteStringProperty write FOnWriteStringProperty;
  1886. property Driver: TAbstractObjectWriter read FDriver;
  1887. property PropertyPath: string read FPropPath;
  1888. end;
  1889. { TParser }
  1890. TParser = class(TObject)
  1891. private
  1892. fStream : TStream;
  1893. fBuf : PChar;
  1894. fBufLen : integer;
  1895. fPos : integer;
  1896. fDeltaPos : integer;
  1897. fFloatType : Char;
  1898. fSourceLine : integer;
  1899. fToken : Char;
  1900. fEofReached : boolean;
  1901. fLastTokenStr : string;
  1902. fLastTokenWStr : widestring;
  1903. function GetTokenName(aTok : Char) : string;
  1904. procedure LoadBuffer;
  1905. procedure CheckLoadBuffer; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
  1906. procedure ProcessChar; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
  1907. function IsNumber : boolean; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
  1908. function IsHexNum : boolean; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
  1909. function IsAlpha : boolean; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
  1910. function IsAlphaNum : boolean; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
  1911. function GetHexValue(c : AnsiChar) : byte; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
  1912. function GetAlphaNum : string;
  1913. procedure HandleNewLine;
  1914. procedure SkipBOM;
  1915. procedure SkipSpaces;
  1916. procedure SkipWhitespace;
  1917. procedure HandleEof;
  1918. procedure HandleAlphaNum;
  1919. procedure HandleNumber;
  1920. procedure HandleHexNumber;
  1921. function HandleQuotedString : string;
  1922. procedure HandleDecimalCharacter(var ascii : boolean;
  1923. out WideChr: widechar; out StringChr: AnsiChar);
  1924. procedure HandleString;
  1925. procedure HandleMinus;
  1926. procedure HandleUnknown;
  1927. public
  1928. constructor Create(Stream: TStream);
  1929. destructor Destroy; override;
  1930. procedure CheckToken(T: Char);
  1931. procedure CheckTokenSymbol(const S: string);
  1932. procedure Error(const Ident: string);
  1933. procedure ErrorFmt(const Ident: string; const Args: array of const);
  1934. procedure ErrorStr(const Message: string);
  1935. procedure HexToBinary(Stream: TStream);
  1936. function NextToken: Char;
  1937. function SourcePos: Longint;
  1938. function TokenComponentIdent: string;
  1939. {$ifndef FPUNONE}
  1940. function TokenFloat: Extended;
  1941. {$endif}
  1942. function TokenInt: Int64;
  1943. function TokenString: string;
  1944. function TokenWideString: WideString;
  1945. function TokenSymbolIs(const S: string): Boolean;
  1946. property FloatType: Char read fFloatType;
  1947. property SourceLine: Integer read fSourceLine;
  1948. property Token: Char read fToken;
  1949. end;
  1950. { TThread }
  1951. TThread = Class;
  1952. EThread = class(Exception);
  1953. EThreadExternalException = class(EThread);
  1954. EThreadDestroyCalled = class(EThread);
  1955. TSynchronizeProcVar = procedure;
  1956. TThreadMethod = procedure of object;
  1957. {$ifdef FPC_HAS_REFERENCE_PROCEDURE}
  1958. TThreadProcedure = reference to procedure;
  1959. {$endif}
  1960. TThreadReportStatus = Procedure(Const status : String) of Object;
  1961. TThreadStatusNotifyEvent = Procedure(Sender : TThread; Const status : String) of Object;
  1962. TThreadExecuteHandler = TThreadMethod;
  1963. TThreadExecuteStatusHandler = Procedure(ReportStatus : TThreadReportStatus) of object;
  1964. TNotifyCallBack = Procedure(Sender : TObject; AData : Pointer);
  1965. TThreadStatusNotifyCallBack = Procedure(Sender : TThread; AData : Pointer; Const status : String);
  1966. TThreadExecuteCallBack = Procedure(AData : Pointer);
  1967. TThreadExecuteStatusCallBack = Procedure(AData : Pointer; ReportStatus : TThreadReportStatus);
  1968. TThreadPriority = (tpIdle, tpLowest, tpLower, tpNormal, tpHigher, tpHighest,
  1969. tpTimeCritical);
  1970. TThread = class
  1971. private type
  1972. PThreadQueueEntry = ^TThreadQueueEntry;
  1973. TThreadQueueEntry = record
  1974. Method: TThreadMethod;
  1975. {$ifdef FPC_HAS_REFERENCE_PROCEDURE}
  1976. ThreadProc: TThreadProcedure;
  1977. {$endif}
  1978. Thread: TThread;
  1979. ThreadID: TThreadID;
  1980. Exception: TObject;
  1981. SyncEvent: PRtlEvent;
  1982. Next: PThreadQueueEntry;
  1983. end;
  1984. public type
  1985. TSystemTimes = record
  1986. IdleTime: QWord;
  1987. UserTime: QWord;
  1988. KernelTime: QWord;
  1989. NiceTime: QWord;
  1990. end;
  1991. private
  1992. class var FProcessorCount: LongWord;
  1993. private
  1994. FHandle: TThreadID;
  1995. FTerminated: Boolean;
  1996. FFreeOnTerminate: Boolean;
  1997. FFinished: Boolean;
  1998. FSuspended: LongBool;
  1999. FReturnValue: Integer;
  2000. FOnTerminate: TNotifyEvent;
  2001. FFatalException: TObject;
  2002. FExternalThread: Boolean;
  2003. FSynchronizeEntry: PThreadQueueEntry;
  2004. class function GetCurrentThread: TThread; static;
  2005. class function GetIsSingleProcessor: Boolean; static; inline;
  2006. class procedure InternalQueue(aThread: TThread; aMethod: TThreadMethod; aQueueIfMain: Boolean); static;
  2007. {$ifdef FPC_HAS_REFERENCE_PROCEDURE}
  2008. class procedure InternalQueue(aThread: TThread; aProcedure: TThreadProcedure; aQueueIfMain: Boolean); static;
  2009. {$endif}
  2010. procedure CallOnTerminate;
  2011. function GetPriority: TThreadPriority;
  2012. procedure SetPriority(Value: TThreadPriority);
  2013. procedure SetSuspended(Value: Boolean);
  2014. function GetSuspended: Boolean;
  2015. procedure InitSynchronizeEvent;
  2016. procedure DoneSynchronizeEvent;
  2017. { these two need to be implemented per platform }
  2018. procedure SysCreate(CreateSuspended: Boolean;
  2019. const StackSize: SizeUInt);
  2020. procedure SysDestroy;
  2021. protected
  2022. FThreadID: TThreadID; // someone might need it for pthread_* calls
  2023. procedure DoTerminate; virtual;
  2024. procedure TerminatedSet; virtual;
  2025. procedure Execute; virtual; abstract;
  2026. procedure Synchronize(AMethod: TThreadMethod);
  2027. {$ifdef FPC_HAS_REFERENCE_PROCEDURE}
  2028. procedure Synchronize(AProcedure : TThreadProcedure);
  2029. {$endif}
  2030. procedure Queue(aMethod: TThreadMethod);
  2031. {$ifdef FPC_HAS_REFERENCE_PROCEDURE}
  2032. procedure Queue(aProcedure: TThreadProcedure);
  2033. {$endif}
  2034. procedure ForceQueue(aMethod: TThreadMethod); inline;
  2035. property ReturnValue: Integer read FReturnValue write FReturnValue;
  2036. property Terminated: Boolean read FTerminated;
  2037. {$if defined(windows) or defined(OS2)}
  2038. private
  2039. FInitialSuspended: boolean;
  2040. {$endif}
  2041. {$ifdef Unix}
  2042. private
  2043. // see tthread.inc, ThreadFunc and TThread.Resume
  2044. FSuspendEvent: PRTLEvent;
  2045. FInitialSuspended: boolean;
  2046. FSuspendedInternal: longbool;
  2047. FThreadReaped: boolean;
  2048. {$endif}
  2049. {$ifdef netwlibc}
  2050. private
  2051. // see tthread.inc, ThreadFunc and TThread.Resume
  2052. FSem: Pointer;
  2053. FInitialSuspended: boolean;
  2054. FSuspendedExternal: boolean;
  2055. FPid: LongInt;
  2056. {$endif}
  2057. {$if defined(hasamiga)}
  2058. private
  2059. FInitialSuspended: boolean;
  2060. {$endif}
  2061. {$ifdef beos}
  2062. FSem : pointer;
  2063. FSuspendedExternal: boolean;
  2064. {$endif}
  2065. public
  2066. constructor Create(CreateSuspended: Boolean;
  2067. const StackSize: SizeUInt = DefaultStackSize);
  2068. destructor Destroy; override;
  2069. class function CreateAnonymousThread(aProc: TProcedure): TThread; static;
  2070. {$ifdef FPC_HAS_REFERENCE_PROCEDURE}
  2071. class function CreateAnonymousThread(aProc: TThreadProcedure): TThread; static;
  2072. {$ENDIF}
  2073. class function CreateAnonymousThread(aProc: TThreadMethod): TThread; static;
  2074. class procedure NameThreadForDebugging(aThreadName: UnicodeString; aThreadID: TThreadID = TThreadID(-1)); static; inline;
  2075. class procedure NameThreadForDebugging(aThreadName: AnsiString; aThreadID: TThreadID = TThreadID(-1)); static; inline;
  2076. class procedure SetReturnValue(aValue: Integer); static;
  2077. class function CheckTerminated: Boolean; static;
  2078. class procedure Synchronize(AThread: TThread; AMethod: TThreadMethod);
  2079. {$ifdef FPC_HAS_REFERENCE_PROCEDURE}
  2080. class procedure Synchronize(AThread: TThread; AProcedure : TThreadProcedure);
  2081. {$endif}
  2082. class procedure Queue(aThread: TThread; aMethod: TThreadMethod); static;
  2083. {$ifdef FPC_HAS_REFERENCE_PROCEDURE}
  2084. class procedure Queue(aThread: TThread; AProcedure : TThreadProcedure); static;
  2085. {$endif}
  2086. class procedure ForceQueue(aThread: TThread; aMethod: TThreadMethod); inline; static;
  2087. {$ifdef FPC_HAS_REFERENCE_PROCEDURE}
  2088. class procedure ForceQueue(aThread: TThread; aMethod: TThreadProcedure); inline; static;
  2089. {$endif}
  2090. class procedure RemoveQueuedEvents(aThread: TThread; aMethod: TThreadMethod); static;
  2091. class procedure RemoveQueuedEvents(aMethod: TThreadMethod); static;
  2092. class procedure RemoveQueuedEvents(aThread: TThread); static;
  2093. class procedure SpinWait(aIterations: LongWord); static;
  2094. class procedure Sleep(aMilliseconds: Cardinal); static;
  2095. class procedure Yield; static;
  2096. { use HAS_TTHREAD_GETSYSTEMTIMES to implement a platform specific variant
  2097. which does not return a zeroed record }
  2098. class function GetSystemTimes(out aSystemTimes: TSystemTimes) : boolean; static;
  2099. class function GetCPUUsage(var Previous: TSystemTimes): Integer;
  2100. class function GetTickCount: LongWord; static; deprecated 'Use TThread.GetTickCount64 instead';
  2101. class function GetTickCount64: QWord; static;
  2102. // Object based
  2103. Class Function ExecuteInThread(AMethod : TThreadExecuteHandler; AOnTerminate : TNotifyEvent = Nil) : TThread; overload; static;
  2104. Class Function ExecuteInThread(AMethod : TThreadExecuteStatusHandler; AOnStatus : TThreadStatusNotifyEvent; AOnTerminate : TNotifyEvent = Nil) : TThread; overload;static;
  2105. // Plain methods.
  2106. Class Function ExecuteInThread(AMethod : TThreadExecuteCallback; AData : Pointer = Nil; AOnTerminate: TNotifyCallBack = Nil) : TThread; overload;static;
  2107. Class Function ExecuteInThread(AMethod : TThreadExecuteStatusCallback; AOnStatus : TThreadStatusNotifyCallback; AData : Pointer = Nil; AOnTerminate : TNotifyCallBack = Nil) : TThread; overload;static;
  2108. procedure AfterConstruction; override;
  2109. procedure Start;
  2110. procedure Resume; deprecated;
  2111. procedure Suspend; deprecated;
  2112. procedure Terminate;
  2113. function WaitFor: Integer;
  2114. class function CurrentIsMain : Boolean; static; inline;
  2115. class property CurrentThread: TThread read GetCurrentThread;
  2116. class property Current: TThread read GetCurrentThread;
  2117. class property ProcessorCount: LongWord read FProcessorCount;
  2118. class property IsSingleProcessor: Boolean read GetIsSingleProcessor;
  2119. property FreeOnTerminate: Boolean read FFreeOnTerminate write FFreeOnTerminate;
  2120. property Handle: TThreadID read FHandle;
  2121. property ExternalThread: Boolean read FExternalThread;
  2122. property Priority: TThreadPriority read GetPriority write SetPriority;
  2123. property Suspended: Boolean read GetSuspended write SetSuspended;
  2124. property Finished: Boolean read FFinished;
  2125. property ThreadID: TThreadID read FThreadID;
  2126. property OnTerminate: TNotifyEvent read FOnTerminate write FOnTerminate;
  2127. property FatalException: TObject read FFatalException;
  2128. end;
  2129. { TComponent class }
  2130. TOperation = (opInsert, opRemove);
  2131. TComponentState = set of (csLoading, csReading, csWriting, csDestroying,
  2132. csDesigning, csAncestor, csUpdating, csFixups, csFreeNotification,
  2133. csInline, csDesignInstance);
  2134. TComponentStyle = set of (csInheritable, csCheckPropAvail, csSubComponent,
  2135. csTransient);
  2136. TGetChildProc = procedure (Child: TComponent) of object;
  2137. IVCLComObject = interface
  2138. ['{E07892A0-F52F-11CF-BD2F-0020AF0E5B81}']
  2139. function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
  2140. function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
  2141. function GetIDsOfNames(const IID: TGUID; Names: Pointer;
  2142. NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
  2143. function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
  2144. Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
  2145. function SafeCallException(ExceptObject: TObject; ExceptAddr: CodePointer): HResult;
  2146. procedure FreeOnRelease;
  2147. end;
  2148. IInterfaceComponentReference = interface
  2149. ['{3FEEC8E1-E400-4A24-BCAC-1F01476439B1}']
  2150. function GetComponent:TComponent;
  2151. end;
  2152. IDesignerNotify = interface
  2153. ['{B971E807-E3A6-11D1-AAB1-00C04FB16FBC}']
  2154. procedure Modified;
  2155. procedure Notification(AnObject: TPersistent; Operation: TOperation);
  2156. end;
  2157. TComponentEnumerator = class
  2158. private
  2159. FComponent: TComponent;
  2160. FPosition: Integer;
  2161. public
  2162. constructor Create(AComponent: TComponent);
  2163. function GetCurrent: TComponent;
  2164. function MoveNext: Boolean;
  2165. property Current: TComponent read GetCurrent;
  2166. end;
  2167. TBasicAction = class;
  2168. { TComponent }
  2169. TComponent = class(TPersistent,IUnknown,IInterfaceComponentReference)
  2170. private
  2171. FOwner: TComponent;
  2172. FName: TComponentName;
  2173. FTag: Ptrint;
  2174. FComponents: TFpList;
  2175. FFreeNotifies: TFpList;
  2176. FDesignInfo: Longint;
  2177. FVCLComObject: Pointer;
  2178. FComponentState: TComponentState;
  2179. FDObservers : TObservers;
  2180. FOnGetDeltaStreams: TGetDeltaStreamsEvent;
  2181. function GetComObject: IUnknown;
  2182. function GetComponent(AIndex: Integer): TComponent;
  2183. function GetComponentCount: Integer;
  2184. function GetComponentIndex: Integer;
  2185. procedure Insert(AComponent: TComponent);
  2186. procedure ReadLeft(Reader: TReader);
  2187. procedure ReadTop(Reader: TReader);
  2188. procedure Remove(AComponent: TComponent);
  2189. procedure RemoveNotification(AComponent: TComponent);
  2190. procedure SetComponentIndex(Value: Integer);
  2191. procedure SetReference(Enable: Boolean);
  2192. procedure WriteLeft(Writer: TWriter);
  2193. procedure WriteTop(Writer: TWriter);
  2194. protected
  2195. FComponentStyle: TComponentStyle;
  2196. function GetObservers: TObservers;virtual;
  2197. procedure GetDeltaStreams(aProc: TGetStreamProc); virtual;
  2198. procedure ReadDeltaStream(const S: TStream);
  2199. procedure ReadDeltaState; virtual;
  2200. procedure ChangeName(const NewName: TComponentName);
  2201. procedure DefineProperties(Filer: TFiler); override;
  2202. procedure GetChildren(Proc: TGetChildProc; Root: TComponent); dynamic;
  2203. function GetChildOwner: TComponent; dynamic;
  2204. function GetChildParent: TComponent; dynamic;
  2205. function GetOwner: TPersistent; override;
  2206. procedure Loaded; virtual;
  2207. procedure Loading; virtual;
  2208. procedure Notification(AComponent: TComponent;
  2209. Operation: TOperation); virtual;
  2210. procedure PaletteCreated; dynamic;
  2211. procedure ReadState(Reader: TReader); virtual;
  2212. procedure RemoveFreeNotifications;
  2213. procedure SetAncestor(Value: Boolean);
  2214. procedure SetDesigning(Value: Boolean; SetChildren : Boolean = True);
  2215. procedure SetDesignInstance(Value: Boolean);
  2216. procedure SetInline(Value: Boolean);
  2217. procedure SetName(const NewName: TComponentName); virtual;
  2218. procedure SetChildOrder(Child: TComponent; Order: Integer); dynamic;
  2219. procedure SetParentComponent(Value: TComponent); dynamic;
  2220. procedure Updating; dynamic;
  2221. procedure Updated; dynamic;
  2222. class procedure UpdateRegistry(Register: Boolean; const ClassID, ProgID: string); dynamic;
  2223. procedure ValidateRename(AComponent: TComponent;
  2224. const CurName, NewName: string); virtual;
  2225. procedure ValidateContainer(AComponent: TComponent); dynamic;
  2226. procedure ValidateInsert(AComponent: TComponent); dynamic;
  2227. { IUnknown }
  2228. function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} IID: TGUID; out Obj): Hresult; virtual; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  2229. function _AddRef: Longint; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  2230. function _Release: Longint; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  2231. function iicrGetComponent: TComponent;
  2232. { IDispatch }
  2233. function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
  2234. function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
  2235. function GetIDsOfNames(const IID: TGUID; Names: Pointer;
  2236. NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
  2237. function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
  2238. Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
  2239. public
  2240. //!! Moved temporary
  2241. // fpdoc doesn't handle this yet :(
  2242. {$ifndef fpdocsystem}
  2243. function IInterfaceComponentReference.GetComponent=iicrgetcomponent;
  2244. {$endif}
  2245. procedure WriteState(Writer: TWriter); virtual;
  2246. constructor Create(AOwner: TComponent); virtual;
  2247. destructor Destroy; override;
  2248. procedure BeforeDestruction; override;
  2249. procedure DestroyComponents;
  2250. procedure Destroying;
  2251. function ExecuteAction(Action: TBasicAction): Boolean; dynamic;
  2252. function FindComponent(const AName: string): TComponent;
  2253. procedure FreeNotification(AComponent: TComponent);
  2254. procedure RemoveFreeNotification(AComponent: TComponent);
  2255. procedure FreeOnRelease;
  2256. function GetEnumerator: TComponentEnumerator;
  2257. function GetNamePath: string; override;
  2258. function GetParentComponent: TComponent; dynamic;
  2259. function HasParent: Boolean; dynamic;
  2260. procedure InsertComponent(AComponent: TComponent);
  2261. procedure RemoveComponent(AComponent: TComponent);
  2262. function SafeCallException(ExceptObject: TObject;
  2263. ExceptAddr: CodePointer): HResult; override;
  2264. procedure SetSubComponent(ASubComponent: Boolean);
  2265. function UpdateAction(Action: TBasicAction): Boolean; dynamic;
  2266. property ComObject: IUnknown read GetComObject;
  2267. function IsImplementorOf (const Intf:IInterface):boolean;
  2268. procedure ReferenceInterface(const intf:IInterface;op:TOperation);
  2269. property Components[Index: Integer]: TComponent read GetComponent;
  2270. property ComponentCount: Integer read GetComponentCount;
  2271. property ComponentIndex: Integer read GetComponentIndex write SetComponentIndex;
  2272. property ComponentState: TComponentState read FComponentState;
  2273. property ComponentStyle: TComponentStyle read FComponentStyle;
  2274. property DesignInfo: Longint read FDesignInfo write FDesignInfo;
  2275. property Owner: TComponent read FOwner;
  2276. property VCLComObject: Pointer read FVCLComObject write FVCLComObject;
  2277. Property Observers : TObservers Read GetObservers;
  2278. property OnGetDeltaStreams: TGetDeltaStreamsEvent read FOnGetDeltaStreams write FOnGetDeltaStreams;
  2279. published
  2280. property Name: TComponentName read FName write SetName stored False;
  2281. property Tag: PtrInt read FTag write FTag default 0;
  2282. end;
  2283. { TBasicActionLink }
  2284. TBasicActionLink = class(TObject)
  2285. private
  2286. FOnChange: TNotifyEvent;
  2287. protected
  2288. FAction: TBasicAction;
  2289. procedure AssignClient(AClient: TObject); virtual;
  2290. procedure Change; virtual;
  2291. function IsOnExecuteLinked: Boolean; virtual;
  2292. procedure SetAction(Value: TBasicAction); virtual;
  2293. procedure SetOnExecute(Value: TNotifyEvent); virtual;
  2294. public
  2295. constructor Create(AClient: TObject); virtual;
  2296. destructor Destroy; override;
  2297. function Execute(AComponent: TComponent = nil): Boolean; virtual;
  2298. function Update: Boolean; virtual;
  2299. property Action: TBasicAction read FAction write SetAction;
  2300. property OnChange: TNotifyEvent read FOnChange write FOnChange;
  2301. end;
  2302. TBasicActionLinkClass = class of TBasicActionLink;
  2303. { TBasicAction }
  2304. TBasicAction = class(TComponent)
  2305. private
  2306. FActionComponent: TComponent;
  2307. FOnChange: TNotifyEvent;
  2308. FOnExecute: TNotifyEvent;
  2309. FOnUpdate: TNotifyEvent;
  2310. procedure SetActionComponent(AValue: TComponent);
  2311. protected
  2312. FClients: TFpList;
  2313. procedure Change; virtual;
  2314. Procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  2315. procedure SetOnExecute(Value: TNotifyEvent); virtual;
  2316. property OnChange: TNotifyEvent read FOnChange write FOnChange;
  2317. Function ClientCount : Integer;
  2318. Function GetClient(Idx : Integer) : TObject;
  2319. public
  2320. constructor Create(AOwner: TComponent); override;
  2321. destructor Destroy; override;
  2322. function HandlesTarget(Target: TObject): Boolean; virtual;
  2323. procedure UpdateTarget(Target: TObject); virtual;
  2324. procedure ExecuteTarget(Target: TObject); virtual;
  2325. function Execute: Boolean; dynamic;
  2326. procedure RegisterChanges(Value: TBasicActionLink);
  2327. procedure UnRegisterChanges(Value: TBasicActionLink);
  2328. function Update: Boolean; virtual;
  2329. function Suspended: Boolean; virtual;
  2330. property ActionComponent: TComponent read FActionComponent write SetActionComponent;
  2331. property OnExecute: TNotifyEvent read FOnExecute write SetOnExecute;
  2332. property OnUpdate: TNotifyEvent read FOnUpdate write FOnUpdate;
  2333. end;
  2334. TActionEvent = procedure(Action: TBasicAction; var Handled: Boolean) of object;
  2335. { TBasicAction class reference type }
  2336. TBasicActionClass = class of TBasicAction;
  2337. { Component registration handlers }
  2338. TActiveXRegType = (axrComponentOnly, axrIncludeDescendants);
  2339. IInterfaceList = interface ['{285DEA8A-B865-11D1-AAA7-00C04FB17A72}']
  2340. function Get(i : Integer) : IUnknown;
  2341. function GetCapacity : Integer;
  2342. function GetCount : Integer;
  2343. procedure Put(i : Integer;item : IUnknown);
  2344. procedure SetCapacity(NewCapacity : Integer);
  2345. procedure SetCount(NewCount : Integer);
  2346. procedure Clear;
  2347. procedure Delete(index : Integer);
  2348. procedure Exchange(index1,index2 : Integer);
  2349. function First : IUnknown;
  2350. function IndexOf(const item : IUnknown) : Integer;
  2351. function Add(item : IUnknown) : Integer;
  2352. procedure Insert(i : Integer;item : IUnknown);
  2353. function Last : IUnknown;
  2354. function Remove(item : IUnknown): Integer;
  2355. procedure Lock;
  2356. procedure Unlock;
  2357. property Capacity : Integer read GetCapacity write SetCapacity;
  2358. property Count : Integer read GetCount write SetCount;
  2359. property Items[index : Integer] : IUnknown read Get write Put;default;
  2360. end;
  2361. TInterfaceList = class;
  2362. TInterfaceListEnumerator = class
  2363. private
  2364. FList: TInterfaceList;
  2365. FPosition: Integer;
  2366. public
  2367. constructor Create(AList: TInterfaceList);
  2368. function GetCurrent: IUnknown;
  2369. function MoveNext: Boolean;
  2370. property Current: IUnknown read GetCurrent;
  2371. end;
  2372. TInterfaceList = class(TInterfacedObject,IInterfaceList)
  2373. private
  2374. FList : TThreadList;
  2375. protected
  2376. function Get(i : Integer) : IUnknown;
  2377. function GetCapacity : Integer;
  2378. function GetCount : Integer;
  2379. procedure Put(i : Integer;item : IUnknown);
  2380. procedure SetCapacity(NewCapacity : Integer);
  2381. procedure SetCount(NewCount : Integer);
  2382. public
  2383. constructor Create;
  2384. destructor Destroy; override;
  2385. procedure Clear;
  2386. procedure Delete(index : Integer);
  2387. procedure Exchange(index1,index2 : Integer);
  2388. function First : IUnknown;
  2389. function GetEnumerator: TInterfaceListEnumerator;
  2390. function IndexOf(const item : IUnknown) : Integer;
  2391. function Add(item : IUnknown) : Integer;
  2392. procedure Insert(i : Integer;item : IUnknown);
  2393. function Last : IUnknown;
  2394. function Remove(item : IUnknown): Integer;
  2395. procedure Lock;
  2396. procedure Unlock;
  2397. function Expand : TInterfaceList;
  2398. property Capacity : Integer read GetCapacity write SetCapacity;
  2399. property Count : Integer read GetCount write SetCount;
  2400. property Items[Index : Integer] : IUnknown read Get write Put;default;
  2401. end;
  2402. { ---------------------------------------------------------------------
  2403. TDatamodule support
  2404. ---------------------------------------------------------------------}
  2405. TDataModule = class(TComponent)
  2406. private
  2407. FDPos: TPoint;
  2408. FDSize: TPoint;
  2409. FDPPI: Integer;
  2410. FOnCreate: TNotifyEvent;
  2411. FOnDestroy: TNotifyEvent;
  2412. FOldOrder : Boolean;
  2413. Procedure ReadP(Reader: TReader);
  2414. Procedure WriteP(Writer: TWriter);
  2415. Procedure ReadT(Reader: TReader);
  2416. Procedure WriteT(Writer: TWriter);
  2417. Procedure ReadL(Reader: TReader);
  2418. Procedure WriteL(Writer: TWriter);
  2419. Procedure ReadW(Reader: TReader);
  2420. Procedure WriteW(Writer: TWriter);
  2421. Procedure ReadH(Reader: TReader);
  2422. Procedure WriteH(Writer: TWriter);
  2423. protected
  2424. Procedure DoCreate; virtual;
  2425. Procedure DoDestroy; virtual;
  2426. Procedure DefineProperties(Filer: TFiler); override;
  2427. Procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
  2428. Function HandleCreateException: Boolean; virtual;
  2429. Procedure ReadState(Reader: TReader); override;
  2430. public
  2431. constructor Create(AOwner: TComponent); override;
  2432. Constructor CreateNew(AOwner: TComponent);
  2433. Constructor CreateNew(AOwner: TComponent; CreateMode: Integer); virtual;
  2434. destructor Destroy; override;
  2435. Procedure AfterConstruction; override;
  2436. Procedure BeforeDestruction; override;
  2437. property DesignOffset: TPoint read FDPos write FDPos;
  2438. property DesignSize: TPoint read FDSize write FDSize;
  2439. property DesignPPI: Integer read FDPPI write FDPPI;
  2440. published
  2441. property OnCreate: TNotifyEvent read FOnCreate write FOnCreate;
  2442. property OnDestroy: TNotifyEvent read FOnDestroy write FOnDestroy;
  2443. property OldCreateOrder: Boolean read FOldOrder write FOldOrder;
  2444. end;
  2445. TDataModuleClass = Class of TDataModule;
  2446. TPlatformIds = UInt32;
  2447. ComponentPlatformsAttribute = class(TCustomAttribute)
  2448. private
  2449. FPlatforms: TPlatformIds;
  2450. public
  2451. constructor Create(const aPlatforms: TPlatformIds);
  2452. property Platforms: TPlatformIds read FPlatforms write FPlatforms;
  2453. end;
  2454. const
  2455. { Platform identifiers }
  2456. pidWin32 = $00000001;
  2457. pidWin64 = $00000002;
  2458. pidOSX32 = $00000004;
  2459. pidiOSSimulator32 = $00000008;
  2460. pidAndroidArm32 = $00000010;
  2461. pidLinux32 = $00000020;
  2462. pidiOSDevice32 = $00000040;
  2463. pidLinux64 = $00000080;
  2464. pidWinNX32 = $00000100;
  2465. pidWinIoT32 = $00000200;
  2466. pidiOSDevice64 = $00000400;
  2467. pidWinARM32 = $00000800;
  2468. pidOSX64 = $00001000;
  2469. pidLinuxArm32 = $00002000;
  2470. pidLinuxArm64 = $00004000;
  2471. pidAndroidArm64 = $00008000;
  2472. pidiOSSimulator64 = $00010000;
  2473. pidOSXArm64 = $00020000;
  2474. pidWinArm64 = $00040000;
  2475. pidiOSSimulatorArm64 = $00080000;
  2476. pidAllPlatforms = pidWin32 or pidWin64 or
  2477. pidOSX32 or pidOSX64 or pidOSXArm64 or
  2478. pidiOSDevice32 or pidiOSDevice64 or
  2479. pidiOSSimulator32 or pidiOSSimulator64 or
  2480. pidAndroidArm32 or pidAndroidArm64 or
  2481. pidLinux64;
  2482. pfidWindows = pidWin32 or pidWin64;
  2483. pfidOSX = pidOSX32 or pidOSX64 or pidOSXArm64;
  2484. pfidiOS = pidiOSDevice32 or pidiOSDevice64 or
  2485. pidiOSSimulator32 or pidiOSSimulator64;
  2486. pfidAndroid = pidAndroidArm32 or pidAndroidArm64;
  2487. pfidLinux = pidLinux64;
  2488. var
  2489. // IDE hooks for TDatamodule support.
  2490. AddDataModule : procedure (DataModule: TDataModule) of object;
  2491. RemoveDataModule : procedure (DataModule: TDataModule) of object;
  2492. ApplicationHandleException : procedure (Sender: TObject) of object;
  2493. ApplicationShowException : procedure (E: Exception) of object;
  2494. { ---------------------------------------------------------------------
  2495. tthread helpers
  2496. ---------------------------------------------------------------------}
  2497. { function to be called when gui thread is ready to execute method
  2498. result is true if a method has been executed
  2499. }
  2500. function CheckSynchronize(timeout : longint=0) : boolean;
  2501. var
  2502. { method proc that is called to trigger gui thread to execute a
  2503. method }
  2504. WakeMainThread : TNotifyEvent = nil;
  2505. { ---------------------------------------------------------------------
  2506. General streaming and registration routines
  2507. ---------------------------------------------------------------------}
  2508. var
  2509. RegisterComponentsProc: procedure(const Page: string;
  2510. ComponentClasses: array of TComponentClass);
  2511. RegisterNoIconProc: procedure(ComponentClasses: array of TComponentClass);
  2512. {!!!! RegisterNonActiveXProc: procedure(ComponentClasses: array of TComponentClass;
  2513. AxRegType: TActiveXRegType) = nil;
  2514. CurrentGroup: Integer = -1;}
  2515. CreateVCLComObjectProc: procedure(Component: TComponent) = nil;
  2516. { Point and rectangle constructors }
  2517. function Point(AX, AY: Integer): TPoint;
  2518. function SmallPoint(AX, AY: SmallInt): TSmallPoint;
  2519. function Rect(ALeft, ATop, ARight, ABottom: Integer): TRect;
  2520. function Bounds(ALeft, ATop, AWidth, AHeight: Integer): TRect;
  2521. function PointsEqual(const P1, P2: TPoint): Boolean; {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}
  2522. function PointsEqual(const P1, P2: TSmallPoint): Boolean; {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}
  2523. function InvalidPoint(X, Y: Integer): Boolean;
  2524. function InvalidPoint(const At: TPoint): Boolean;
  2525. function InvalidPoint(const At: TSmallPoint): Boolean;
  2526. { Class registration routines }
  2527. procedure RegisterClass(AClass: TPersistentClass);
  2528. procedure RegisterClasses(AClasses: array of TPersistentClass);
  2529. procedure RegisterClassAlias(AClass: TPersistentClass; const Alias: string);
  2530. procedure UnRegisterClass(AClass: TPersistentClass);
  2531. procedure UnRegisterClasses(const AClasses: array of TPersistentClass);
  2532. procedure UnRegisterModuleClasses(Module: HMODULE);
  2533. function FindClass(const AClassName: string): TPersistentClass; overload;
  2534. function FindClass(const anUnitname, aClassName: string): TPersistentClass; overload;
  2535. function GetClass(const aClassName: string): TPersistentClass; overload;
  2536. function GetClass(const anUnitname, aClassName: string): TPersistentClass; overload;
  2537. procedure StartClassGroup(AClass: TPersistentClass);
  2538. procedure GroupDescendentsWith(AClass, AClassGroup: TPersistentClass);
  2539. function ActivateClassGroup(AClass: TPersistentClass): TPersistentClass;
  2540. function ClassGroupOf(AClass: TPersistentClass): TPersistentClass;
  2541. function ClassGroupOf(Instance: TPersistent): TPersistentClass;
  2542. { Component registration routines }
  2543. procedure RegisterComponents(const Page: string;
  2544. ComponentClasses: array of TComponentClass);
  2545. procedure RegisterNoIcon(ComponentClasses: array of TComponentClass);
  2546. procedure RegisterNonActiveX(ComponentClasses: array of TComponentClass;
  2547. AxRegType: TActiveXRegType);
  2548. var
  2549. GlobalNameSpace: IReadWriteSync;
  2550. { Object filing routines }
  2551. type
  2552. TIdentMapEntry = record
  2553. Value: Integer;
  2554. Name: String;
  2555. end;
  2556. TIdentToInt = function(const Ident: string; var Int: Longint): Boolean;
  2557. TIntToIdent = function(Int: Longint; var Ident: string): Boolean;
  2558. TFindGlobalComponent = function(const Name: string): TComponent;
  2559. TInitComponentHandler = function(Instance: TComponent; RootAncestor : TClass): boolean;
  2560. var
  2561. MainThreadID: TThreadID;
  2562. procedure RegisterIntegerConsts(IntegerType: Pointer; IdentToIntFn: TIdentToInt;
  2563. IntToIdentFn: TIntToIdent);
  2564. function IdentToInt(const Ident: string; out Int: Longint; const Map: array of TIdentMapEntry): Boolean;
  2565. function IntToIdent(Int: Longint; var Ident: string; const Map: array of TIdentMapEntry): Boolean;
  2566. function FindIntToIdent(AIntegerType: Pointer): TIntToIdent;
  2567. function FindIdentToInt(AIntegerType: Pointer): TIdentToInt;
  2568. procedure RegisterFindGlobalComponentProc(AFindGlobalComponent: TFindGlobalComponent);
  2569. procedure UnregisterFindGlobalComponentProc(AFindGlobalComponent: TFindGlobalComponent);
  2570. function FindGlobalComponent(const Name: string): TComponent;
  2571. function InitInheritedComponent(Instance: TComponent; RootAncestor: TClass): Boolean;
  2572. function InitComponentRes(const ResName: string; Instance: TComponent): Boolean;
  2573. function ReadComponentRes(const ResName: string; Instance: TComponent): TComponent;
  2574. function ReadComponentResEx(HInstance: THandle; const ResName: string): TComponent;
  2575. function ReadComponentResFile(const FileName: string; Instance: TComponent): TComponent;
  2576. procedure WriteComponentResFile(const FileName: string; Instance: TComponent);
  2577. procedure RegisterInitComponentHandler(ComponentClass: TComponentClass; Handler: TInitComponentHandler);
  2578. procedure GlobalFixupReferences;
  2579. procedure GetFixupReferenceNames(Root: TComponent; Names: TStrings);
  2580. procedure GetFixupInstanceNames(Root: TComponent;
  2581. const ReferenceRootName: string; Names: TStrings);
  2582. procedure RedirectFixupReferences(Root: TComponent; const OldRootName,
  2583. NewRootName: string);
  2584. procedure RemoveFixupReferences(Root: TComponent; const RootName: string);
  2585. procedure RemoveFixups(Instance: TPersistent);
  2586. Function FindNestedComponent(Root : TComponent; APath : String; CStyle : Boolean = True) : TComponent;
  2587. procedure BeginGlobalLoading;
  2588. procedure NotifyGlobalLoading;
  2589. procedure EndGlobalLoading;
  2590. function CollectionsEqual(C1, C2: TCollection): Boolean;
  2591. function CollectionsEqual(C1, C2: TCollection; Owner1, Owner2: TComponent): Boolean;
  2592. { Object conversion routines }
  2593. type
  2594. TObjectTextEncoding = (
  2595. oteDFM,
  2596. oteLFM
  2597. );
  2598. procedure ObjectBinaryToText(Input, Output: TStream; Encoding: TObjectTextEncoding);
  2599. procedure ObjectBinaryToText(Input, Output: TStream);
  2600. procedure ObjectTextToBinary(Input, Output: TStream);
  2601. procedure ObjectResourceToText(Input, Output: TStream);
  2602. procedure ObjectTextToResource(Input, Output: TStream);
  2603. function TestStreamFormat(const Stream: TStream): TStreamOriginalFormat;
  2604. { Utility routines }
  2605. function LineStart(Buffer, BufPos: PAnsiChar): PAnsiChar;
  2606. procedure BinToHex(BinValue, HexValue: PAnsiChar; BinBufSize: Integer); deprecated 'use procedures from unit StrUtils';
  2607. function HexToBin(HexValue, BinValue: PAnsiChar; BinBufSize: Integer): Integer; deprecated 'use procedures from unit StrUtils';
  2608. function ExtractStrings(Separators, WhiteSpace: TSysCharSet; Content: PAnsiChar; Strings: TStrings; AddEmptyStrings : Boolean = False): Integer;
  2609. Function IfThen(AValue: Boolean; const ATrue: TStringList; const AFalse: TStringList = nil): TStringList; overload;