streams.inc 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657
  1. {
  2. $Id$
  3. This file is part of the Free Component Library (FCL)
  4. Copyright (c) 1999-2000 by the Free Pascal development team
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. {****************************************************************************}
  12. {* TStream *}
  13. {****************************************************************************}
  14. function TStream.GetPosition: Longint;
  15. begin
  16. Result:=Seek(0,soFromCurrent);
  17. end;
  18. procedure TStream.SetPosition(Pos: Longint);
  19. begin
  20. Seek(pos,soFromBeginning);
  21. end;
  22. function TStream.GetSize: Longint;
  23. var
  24. p : longint;
  25. begin
  26. p:=GetPosition;
  27. GetSize:=Seek(0,soFromEnd);
  28. Seek(p,soFromBeginning);
  29. end;
  30. procedure TStream.SetSize(NewSize: Longint);
  31. begin
  32. // We do nothing. Pipe streams don't support this
  33. // As wel as possible read-ony streams !!
  34. end;
  35. procedure TStream.ReadBuffer(var Buffer; Count: Longint);
  36. begin
  37. if Read(Buffer,Count)<Count then
  38. Raise EReadError.Create(SReadError);
  39. end;
  40. procedure TStream.WriteBuffer(const Buffer; Count: Longint);
  41. begin
  42. if Write(Buffer,Count)<Count then
  43. Raise EWriteError.Create(SWriteError);
  44. end;
  45. function TStream.CopyFrom(Source: TStream; Count: Longint): Longint;
  46. var
  47. i : longint;
  48. buffer : array[0..1023] of byte;
  49. begin
  50. CopyFrom:=0;
  51. while Count>0 do
  52. begin
  53. if (Count>sizeof(buffer)) then
  54. i:=sizeof(Buffer)
  55. else
  56. i:=Count;
  57. i:=Source.Read(buffer,i);
  58. i:=Write(buffer,i);
  59. dec(count,i);
  60. CopyFrom:=CopyFrom+i;
  61. if i=0 then
  62. exit;
  63. end;
  64. end;
  65. function TStream.ReadComponent(Instance: TComponent): TComponent;
  66. var
  67. Reader : TReader;
  68. begin
  69. (*
  70. Reader.Create(Self,1024);
  71. if assigned(Instance) then
  72. ReadComponent:=Reader.ReadRootComponent(Instance)
  73. else
  74. begin
  75. {!!!!!}
  76. end;
  77. Reader.Destroy;
  78. *)
  79. end;
  80. function TStream.ReadComponentRes(Instance: TComponent): TComponent;
  81. begin
  82. {!!!!!}
  83. ReadComponentRes:=nil;
  84. end;
  85. procedure TStream.WriteComponent(Instance: TComponent);
  86. var
  87. Writer : TWriter;
  88. begin
  89. (*
  90. Try
  91. Writer.Create(Self,1024);
  92. Writer.WriteRootComponent(Instance);
  93. Finally
  94. Writer.Destroy;
  95. end;
  96. *)
  97. end;
  98. procedure TStream.WriteComponentRes(const ResName: string; Instance: TComponent);
  99. var
  100. startpos,s : longint;
  101. begin
  102. {$ifdef Win16Res}
  103. { Numeric resource type }
  104. WriteByte($ff);
  105. { Application defined data }
  106. WriteWord($0a);
  107. { write the name as asciiz }
  108. // WriteBuffer(ResName[1],length(ResName));
  109. WriteByte(0);
  110. { Movable, Pure and Discardable }
  111. WriteWord($1030);
  112. { size isn't known yet }
  113. WriteDWord(0);
  114. startpos:=GetPosition;
  115. WriteComponent(Instance);
  116. { calculate size }
  117. s:=GetPosition-startpos;
  118. { back patch size }
  119. SetPosition(startpos-4);
  120. WriteDWord(s);
  121. {$endif Win16Res}
  122. end;
  123. procedure TStream.WriteDescendent(Instance, Ancestor: TComponent);
  124. begin
  125. {!!!!!}
  126. end;
  127. procedure TStream.WriteDescendentRes(const ResName: string; Instance, Ancestor: TComponent);
  128. begin
  129. {!!!!!}
  130. end;
  131. procedure TStream.ReadResHeader;
  132. begin
  133. {$ifdef Win16Res}
  134. try
  135. { application specific resource ? }
  136. if ReadByte<>$ff then
  137. raise EInvalidImage.Create('');
  138. if ReadWord<>$000a then
  139. raise EInvalidImage.Create('');
  140. { read name }
  141. while ReadByte<>0 do
  142. ;
  143. { check the access specifier }
  144. if ReadWord<>$1030 then
  145. raise EInvalidImage.Create('');
  146. { ignore the size }
  147. ReadDWord;
  148. except
  149. {/////
  150. on EInvalidImage do
  151. raise;
  152. else
  153. raise EInvalidImage.create(SInvalidImage);
  154. }
  155. end;
  156. {$endif Win16Res}
  157. end;
  158. function TStream.ReadByte : Byte;
  159. var
  160. b : Byte;
  161. begin
  162. ReadBuffer(b,1);
  163. ReadByte:=b;
  164. end;
  165. function TStream.ReadWord : Word;
  166. var
  167. w : Word;
  168. begin
  169. ReadBuffer(w,2);
  170. ReadWord:=w;
  171. end;
  172. function TStream.ReadDWord : Cardinal;
  173. var
  174. d : Cardinal;
  175. begin
  176. ReadBuffer(d,4);
  177. ReadDWord:=d;
  178. end;
  179. Function TStream.ReadAnsiString : String;
  180. Type
  181. PByte = ^Byte;
  182. Var
  183. TheSize : Longint;
  184. P : PByte ;
  185. begin
  186. ReadBuffer (TheSize,SizeOf(TheSize));
  187. SetLength(Result,TheSize);
  188. // Illegal typecast if no AnsiStrings defined.
  189. if TheSize>0 then
  190. begin
  191. ReadBuffer (Pointer(Result)^,TheSize);
  192. P:=Pointer(Result)+TheSize;
  193. p^:=0;
  194. end;
  195. end;
  196. Procedure TStream.WriteAnsiString (S : String);
  197. Var L : Longint;
  198. begin
  199. L:=Length(S);
  200. WriteBuffer (L,SizeOf(L));
  201. WriteBuffer (Pointer(S)^,L);
  202. end;
  203. procedure TStream.WriteByte(b : Byte);
  204. begin
  205. WriteBuffer(b,1);
  206. end;
  207. procedure TStream.WriteWord(w : Word);
  208. begin
  209. WriteBuffer(w,2);
  210. end;
  211. procedure TStream.WriteDWord(d : Cardinal);
  212. begin
  213. WriteBuffer(d,4);
  214. end;
  215. {****************************************************************************}
  216. {* THandleStream *}
  217. {****************************************************************************}
  218. Constructor THandleStream.Create(AHandle: Integer);
  219. begin
  220. FHandle:=AHandle;
  221. end;
  222. function THandleStream.Read(var Buffer; Count: Longint): Longint;
  223. begin
  224. Result:=FileRead(FHandle,Buffer,Count);
  225. If Result=-1 then Result:=0;
  226. end;
  227. function THandleStream.Write(const Buffer; Count: Longint): Longint;
  228. begin
  229. Result:=FileWrite (FHandle,Buffer,Count);
  230. If Result=-1 then Result:=0;
  231. end;
  232. {****************************************************************************}
  233. {* TFileStream *}
  234. {****************************************************************************}
  235. constructor TFileStream.Create(const AFileName: string; Mode: Word);
  236. begin
  237. FFileName:=AFileName;
  238. If Mode=fmcreate then
  239. FHandle:=FileCreate(AFileName)
  240. else
  241. FHAndle:=FileOpen(AFileName,Mode);
  242. If FHandle<0 then
  243. If Mode=fmcreate then
  244. raise EFCreateError.createfmt(SFCreateError,[AFileName])
  245. else
  246. raise EFOpenError.Createfmt(SFOpenError,[AFilename]);
  247. end;
  248. destructor TFileStream.Destroy;
  249. begin
  250. FileClose(FHandle);
  251. end;
  252. Procedure TFileStream.SetSize(NewSize: Longint);
  253. begin
  254. FileTruncate(FHandle,NewSize);
  255. end;
  256. function TFileStream.Seek(Offset: Longint; Origin: Word): Longint;
  257. begin
  258. Result:=FileSeek(FHandle,Offset,Origin);
  259. end;
  260. {****************************************************************************}
  261. {* TCustomMemoryStream *}
  262. {****************************************************************************}
  263. procedure TCustomMemoryStream.SetPointer(Ptr: Pointer; ASize: Longint);
  264. begin
  265. FMemory:=Ptr;
  266. FSize:=ASize;
  267. end;
  268. function TCustomMemoryStream.Read(var Buffer; Count: Longint): Longint;
  269. begin
  270. Result:=0;
  271. If (FSize>0) and (FPosition<Fsize) then
  272. begin
  273. Result:=FSize-FPosition;
  274. If Result>Count then Result:=Count;
  275. Move ((FMemory+FPosition)^,Buffer,Result);
  276. FPosition:=Fposition+Result;
  277. end;
  278. end;
  279. function TCustomMemoryStream.Seek(Offset: Longint; Origin: Word): Longint;
  280. begin
  281. Case Origin of
  282. soFromBeginning : FPosition:=Offset;
  283. soFromEnd : FPosition:=FSize+Offset;
  284. soFromCurrent : FpoSition:=FPosition+Offset;
  285. end;
  286. Result:=FPosition;
  287. end;
  288. procedure TCustomMemoryStream.SaveToStream(Stream: TStream);
  289. begin
  290. if FSize>0 then Stream.WriteBuffer (FMemory^,FSize);
  291. end;
  292. procedure TCustomMemoryStream.SaveToFile(const FileName: string);
  293. Var S : TFileStream;
  294. begin
  295. Try
  296. S:=TFileStream.Create (FileName,fmCreate);
  297. SaveToStream(S);
  298. finally
  299. S.free;
  300. end;
  301. end;
  302. {****************************************************************************}
  303. {* TMemoryStream *}
  304. {****************************************************************************}
  305. Const TMSGrow = 4096; { Use 4k blocks. }
  306. procedure TMemoryStream.SetCapacity(NewCapacity: Longint);
  307. begin
  308. SetPointer (Realloc(NewCapacity),Fsize);
  309. FCapacity:=NewCapacity;
  310. end;
  311. function TMemoryStream.Realloc(var NewCapacity: Longint): Pointer;
  312. Var MoveSize : Longint;
  313. begin
  314. If NewCapacity>0 Then // round off to block size.
  315. NewCapacity := (NewCapacity + (TMSGrow-1)) and not (TMSGROW-1);
  316. // Only now check !
  317. If NewCapacity=FCapacity then
  318. Result:=FMemory
  319. else
  320. If NewCapacity=0 then
  321. FreeMem (FMemory,Fcapacity)
  322. else
  323. begin
  324. GetMem (Result,NewCapacity);
  325. If Result=Nil then
  326. Raise EStreamError.Create(SMemoryStreamError);
  327. If FCapacity>0 then
  328. begin
  329. MoveSize:=FSize;
  330. If MoveSize>NewCapacity then MoveSize:=NewCapacity;
  331. Move (Fmemory^,Result^,MoveSize);
  332. FreeMem (FMemory,FCapacity);
  333. end;
  334. end;
  335. end;
  336. destructor TMemoryStream.Destroy;
  337. begin
  338. Clear;
  339. Inherited Destroy;
  340. end;
  341. procedure TMemoryStream.Clear;
  342. begin
  343. FSize:=0;
  344. FPosition:=0;
  345. SetCapacity (0);
  346. end;
  347. procedure TMemoryStream.LoadFromStream(Stream: TStream);
  348. begin
  349. Stream.Position:=0;
  350. SetSize(Stream.Size);
  351. If FSize>0 then Stream.ReadBuffer(FMemory^,FSize);
  352. end;
  353. procedure TMemoryStream.LoadFromFile(const FileName: string);
  354. Var S : TFileStream;
  355. begin
  356. Try
  357. S:=TFileStream.Create (FileName,fmOpenRead);
  358. LoadFromStream(S);
  359. finally
  360. S.free;
  361. end;
  362. end;
  363. procedure TMemoryStream.SetSize(NewSize: Longint);
  364. begin
  365. SetCapacity (NewSize);
  366. FSize:=NewSize;
  367. IF FPosition>FSize then
  368. FPosition:=FSize;
  369. end;
  370. function TMemoryStream.Write(const Buffer; Count: Longint): Longint;
  371. Var NewPos : Longint;
  372. begin
  373. If Count=0 then
  374. exit(0);
  375. NewPos:=FPosition+Count;
  376. If NewPos>Fsize then
  377. begin
  378. IF NewPos>FCapacity then
  379. SetCapacity (NewPos);
  380. FSize:=Newpos;
  381. end;
  382. System.Move (Buffer,(FMemory+FPosition)^,Count);
  383. FPosition:=NewPos;
  384. Result:=Count;
  385. end;
  386. {****************************************************************************}
  387. {* TStringStream *}
  388. {****************************************************************************}
  389. procedure TStringStream.SetSize(NewSize: Longint);
  390. begin
  391. //!! Setlength(FDataString,NewSize);
  392. If FPosition>NewSize then FPosition:=NewSize;
  393. end;
  394. constructor TStringStream.Create(const AString: string);
  395. begin
  396. Inherited create;
  397. FDataString:=AString;
  398. end;
  399. function TStringStream.Read(var Buffer; Count: Longint): Longint;
  400. begin
  401. Result:=Length(FDataString)-FPosition;
  402. If Result>Count then Result:=Count;
  403. // This supposes FDataString to be of type AnsiString !
  404. //!! Move (Pchar(FDataString)[FPosition],Buffer,Count);
  405. FPosition:=FPosition+Count;
  406. end;
  407. function TStringStream.ReadString(Count: Longint): string;
  408. Var NewLen : Longint;
  409. begin
  410. NewLen:=Length(FDataString)-FPosition;
  411. If NewLen>Count then NewLen:=Count;
  412. //!! SetLength(Result,NewLen);
  413. //!! Read (Pointer(Result)^,NewLen);
  414. ReadString:='';
  415. end;
  416. function TStringStream.Seek(Offset: Longint; Origin: Word): Longint;
  417. begin
  418. Case Origin of
  419. soFromBeginning : FPosition:=Offset;
  420. soFromEnd : FPosition:=Length(FDataString)+Offset;
  421. soFromCurrent : FpoSition:=FPosition+Offset;
  422. end;
  423. If FPosition>Length(FDataString) then FPosition:=Length(FDataString);
  424. If FPosition<0 then FPosition:=0;
  425. Result:=FPosition;
  426. end;
  427. function TStringStream.Write(const Buffer; Count: Longint): Longint;
  428. begin
  429. Result:=Count;
  430. SetSize(FPosition+Count);
  431. // This supposes that FDataString is of type AnsiString)
  432. //!! Move (Buffer,PCHar(FDataString)[Fposition],Count);
  433. FPosition:=FPosition+Count;
  434. end;
  435. procedure TStringStream.WriteString(const AString: string);
  436. begin
  437. //!! Write (PChar(Astring)[0],Length(AString));
  438. end;
  439. {****************************************************************************}
  440. {* TResourceStream *}
  441. {****************************************************************************}
  442. procedure TResourceStream.Initialize(Instance: THandle; Name, ResType: PChar);
  443. begin
  444. end;
  445. constructor TResourceStream.Create(Instance: THandle; const ResName: string; ResType: PChar);
  446. begin
  447. end;
  448. constructor TResourceStream.CreateFromID(Instance: THandle; ResID: Integer; ResType: PChar);
  449. begin
  450. end;
  451. destructor TResourceStream.Destroy;
  452. begin
  453. end;
  454. function TResourceStream.Write(const Buffer; Count: Longint): Longint;
  455. begin
  456. Write:=0;
  457. end;
  458. {
  459. $Log$
  460. Revision 1.20 2000-01-07 01:24:33 peter
  461. * updated copyright to 2000
  462. Revision 1.19 2000/01/06 01:20:33 peter
  463. * moved out of packages/ back to topdir
  464. Revision 1.2 2000/01/04 18:07:16 michael
  465. + Streaming implemented
  466. Revision 1.1 2000/01/03 19:33:08 peter
  467. * moved to packages dir
  468. Revision 1.17 1999/11/30 15:28:38 michael
  469. + Added FileNAme property for filestreams
  470. Revision 1.16 1999/10/03 19:38:06 peter
  471. * fixed readansistring
  472. * fixed constants
  473. Revision 1.15 1999/09/13 08:35:16 fcl
  474. * Changed some argument names (Root->ARoot etc.) because the new compiler
  475. now performs more ambiguity checks (sg)
  476. Revision 1.14 1999/07/18 20:58:47 michael
  477. * fixed bug in realloc and setcapacity of tmemorystream
  478. Revision 1.13 1999/04/08 10:18:55 peter
  479. * makefile updates
  480. }