streams.inc 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896
  1. {
  2. This file is part of the Free Component Library (FCL)
  3. Copyright (c) 1999-2000 by the Free Pascal development team
  4. See the file COPYING.FPC, included in this distribution,
  5. for details about the copyright.
  6. This program is distributed in the hope that it will be useful,
  7. but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9. **********************************************************************}
  10. {****************************************************************************}
  11. {* TStream *}
  12. {****************************************************************************}
  13. procedure TStream.ReadNotImplemented;
  14. begin
  15. raise EStreamError.CreateFmt(SStreamNoReading, [ClassName]) at get_caller_addr(get_frame);
  16. end;
  17. procedure TStream.WriteNotImplemented;
  18. begin
  19. raise EStreamError.CreateFmt(SStreamNoWriting, [ClassName]) at get_caller_addr(get_frame);
  20. end;
  21. function TStream.Read(var Buffer; Count: Longint): Longint;
  22. begin
  23. ReadNotImplemented;
  24. Result := 0;
  25. end;
  26. function TStream.Write(const Buffer; Count: Longint): Longint;
  27. begin
  28. WriteNotImplemented;
  29. Result := 0;
  30. end;
  31. function TStream.GetPosition: Int64;
  32. begin
  33. Result:=Seek(0,soCurrent);
  34. end;
  35. procedure TStream.SetPosition(const Pos: Int64);
  36. begin
  37. Seek(pos,soBeginning);
  38. end;
  39. procedure TStream.SetSize64(const NewSize: Int64);
  40. begin
  41. // Required because can't use overloaded functions in properties
  42. SetSize(NewSize);
  43. end;
  44. function TStream.GetSize: Int64;
  45. var
  46. p : int64;
  47. begin
  48. p:=Seek(0,soCurrent);
  49. GetSize:=Seek(0,soEnd);
  50. Seek(p,soBeginning);
  51. end;
  52. procedure TStream.SetSize(NewSize: Longint);
  53. begin
  54. // We do nothing. Pipe streams don't support this
  55. // As wel as possible read-ony streams !!
  56. end;
  57. procedure TStream.SetSize(const NewSize: Int64);
  58. begin
  59. // Backwards compatibility that calls the longint SetSize
  60. if (NewSize<Low(longint)) or
  61. (NewSize>High(longint)) then
  62. raise ERangeError.Create(SRangeError);
  63. SetSize(longint(NewSize));
  64. end;
  65. function TStream.Seek(Offset: Longint; Origin: Word): Longint;
  66. type
  67. TSeek64 = function(const offset:Int64;Origin:TSeekorigin):Int64 of object;
  68. var
  69. CurrSeek,
  70. TStreamSeek : TSeek64;
  71. CurrClass : TClass;
  72. begin
  73. // Redirect calls to 64bit Seek, but we can't call the 64bit Seek
  74. // from TStream, because then we end up in an infinite loop
  75. CurrSeek:=nil;
  76. CurrClass:=Classtype;
  77. while (CurrClass<>nil) and
  78. (CurrClass<>TStream) do
  79. CurrClass:=CurrClass.Classparent;
  80. if CurrClass<>nil then
  81. begin
  82. CurrSeek:[email protected];
  83. TStreamSeek:=@TStream(@CurrClass).Seek;
  84. if TMethod(TStreamSeek).Code=TMethod(CurrSeek).Code then
  85. CurrSeek:=nil;
  86. end;
  87. if CurrSeek<>nil then
  88. Result:=Seek(Int64(offset),TSeekOrigin(origin))
  89. else
  90. raise EStreamError.CreateFmt(SSeekNotImplemented,[ClassName]);
  91. end;
  92. function TStream.Seek(const Offset: Int64; Origin: TSeekorigin): Int64;
  93. begin
  94. // Backwards compatibility that calls the longint Seek
  95. if (Offset<Low(longint)) or
  96. (Offset>High(longint)) then
  97. raise ERangeError.Create(SRangeError);
  98. Result:=Seek(longint(Offset),ord(Origin));
  99. end;
  100. procedure TStream.ReadBuffer(var Buffer; Count: Longint);
  101. begin
  102. if Read(Buffer,Count)<Count then
  103. Raise EReadError.Create(SReadError);
  104. end;
  105. procedure TStream.WriteBuffer(const Buffer; Count: Longint);
  106. begin
  107. if Write(Buffer,Count)<Count then
  108. Raise EWriteError.Create(SWriteError);
  109. end;
  110. function TStream.CopyFrom(Source: TStream; Count: Int64): Int64;
  111. var
  112. i : Int64;
  113. buffer : array[0..1023] of byte;
  114. begin
  115. CopyFrom:=0;
  116. If (Count=0) then
  117. begin
  118. // This WILL fail for non-seekable streams...
  119. Source.Position:=0;
  120. Count:=Source.Size;
  121. end;
  122. while Count>0 do
  123. begin
  124. if (Count>sizeof(buffer)) then
  125. i:=sizeof(Buffer)
  126. else
  127. i:=Count;
  128. i:=Source.Read(buffer,i);
  129. i:=Write(buffer,i);
  130. if i=0 then break;
  131. dec(count,i);
  132. CopyFrom:=CopyFrom+i;
  133. end;
  134. end;
  135. function TStream.ReadComponent(Instance: TComponent): TComponent;
  136. var
  137. Reader: TReader;
  138. begin
  139. Reader := TReader.Create(Self, 4096);
  140. try
  141. Result := Reader.ReadRootComponent(Instance);
  142. finally
  143. Reader.Free;
  144. end;
  145. end;
  146. function TStream.ReadComponentRes(Instance: TComponent): TComponent;
  147. begin
  148. ReadResHeader;
  149. Result := ReadComponent(Instance);
  150. end;
  151. procedure TStream.WriteComponent(Instance: TComponent);
  152. begin
  153. WriteDescendent(Instance, nil);
  154. end;
  155. procedure TStream.WriteComponentRes(const ResName: string; Instance: TComponent);
  156. begin
  157. WriteDescendentRes(ResName, Instance, nil);
  158. end;
  159. procedure TStream.WriteDescendent(Instance, Ancestor: TComponent);
  160. var
  161. Driver : TAbstractObjectWriter;
  162. Writer : TWriter;
  163. begin
  164. Driver := TBinaryObjectWriter.Create(Self, 4096);
  165. Try
  166. Writer := TWriter.Create(Driver);
  167. Try
  168. Writer.WriteDescendent(Instance, Ancestor);
  169. Finally
  170. Writer.Destroy;
  171. end;
  172. Finally
  173. Driver.Free;
  174. end;
  175. end;
  176. procedure TStream.WriteDescendentRes(const ResName: string; Instance, Ancestor: TComponent);
  177. var
  178. FixupInfo: Integer;
  179. begin
  180. { Write a resource header }
  181. WriteResourceHeader(ResName, FixupInfo);
  182. { Write the instance itself }
  183. WriteDescendent(Instance, Ancestor);
  184. { Insert the correct resource size into the resource header }
  185. FixupResourceHeader(FixupInfo);
  186. end;
  187. procedure TStream.WriteResourceHeader(const ResName: string; {!!!: out} var FixupInfo: Integer);
  188. var
  189. ResType, Flags : word;
  190. begin
  191. ResType:=NtoLE(word($000A));
  192. Flags:=NtoLE(word($1030));
  193. { Note: This is a Windows 16 bit resource }
  194. { Numeric resource type }
  195. WriteByte($ff);
  196. { Application defined data }
  197. WriteWord(ResType);
  198. { write the name as asciiz }
  199. WriteBuffer(ResName[1],length(ResName));
  200. WriteByte(0);
  201. { Movable, Pure and Discardable }
  202. WriteWord(Flags);
  203. { Placeholder for the resource size }
  204. WriteDWord(0);
  205. { Return current stream position so that the resource size can be
  206. inserted later }
  207. FixupInfo := Position;
  208. end;
  209. procedure TStream.FixupResourceHeader(FixupInfo: Integer);
  210. var
  211. ResSize,TmpResSize : Integer;
  212. begin
  213. ResSize := Position - FixupInfo;
  214. TmpResSize := NtoLE(longword(ResSize));
  215. { Insert the correct resource size into the placeholder written by
  216. WriteResourceHeader }
  217. Position := FixupInfo - 4;
  218. WriteDWord(TmpResSize);
  219. { Seek back to the end of the resource }
  220. Position := FixupInfo + ResSize;
  221. end;
  222. procedure TStream.ReadResHeader;
  223. var
  224. ResType, Flags : word;
  225. begin
  226. try
  227. { Note: This is a Windows 16 bit resource }
  228. { application specific resource ? }
  229. if ReadByte<>$ff then
  230. raise EInvalidImage.Create(SInvalidImage);
  231. ResType:=LEtoN(ReadWord);
  232. if ResType<>$000a then
  233. raise EInvalidImage.Create(SInvalidImage);
  234. { read name }
  235. while ReadByte<>0 do
  236. ;
  237. { check the access specifier }
  238. Flags:=LEtoN(ReadWord);
  239. if Flags<>$1030 then
  240. raise EInvalidImage.Create(SInvalidImage);
  241. { ignore the size }
  242. ReadDWord;
  243. except
  244. on EInvalidImage do
  245. raise;
  246. else
  247. raise EInvalidImage.create(SInvalidImage);
  248. end;
  249. end;
  250. function TStream.ReadByte : Byte;
  251. var
  252. b : Byte;
  253. begin
  254. ReadBuffer(b,1);
  255. ReadByte:=b;
  256. end;
  257. function TStream.ReadWord : Word;
  258. var
  259. w : Word;
  260. begin
  261. ReadBuffer(w,2);
  262. ReadWord:=w;
  263. end;
  264. function TStream.ReadDWord : Cardinal;
  265. var
  266. d : Cardinal;
  267. begin
  268. ReadBuffer(d,4);
  269. ReadDWord:=d;
  270. end;
  271. Function TStream.ReadAnsiString : String;
  272. Type
  273. PByte = ^Byte;
  274. Var
  275. TheSize : Longint;
  276. P : PByte ;
  277. begin
  278. ReadBuffer (TheSize,SizeOf(TheSize));
  279. SetLength(Result,TheSize);
  280. // Illegal typecast if no AnsiStrings defined.
  281. if TheSize>0 then
  282. begin
  283. ReadBuffer (Pointer(Result)^,TheSize);
  284. P:=Pointer(Result)+TheSize;
  285. p^:=0;
  286. end;
  287. end;
  288. Procedure TStream.WriteAnsiString (const S : String);
  289. Var L : Longint;
  290. begin
  291. L:=Length(S);
  292. WriteBuffer (L,SizeOf(L));
  293. WriteBuffer (Pointer(S)^,L);
  294. end;
  295. procedure TStream.WriteByte(b : Byte);
  296. begin
  297. WriteBuffer(b,1);
  298. end;
  299. procedure TStream.WriteWord(w : Word);
  300. begin
  301. WriteBuffer(w,2);
  302. end;
  303. procedure TStream.WriteDWord(d : Cardinal);
  304. begin
  305. WriteBuffer(d,4);
  306. end;
  307. {****************************************************************************}
  308. {* THandleStream *}
  309. {****************************************************************************}
  310. Constructor THandleStream.Create(AHandle: Integer);
  311. begin
  312. FHandle:=AHandle;
  313. end;
  314. function THandleStream.Read(var Buffer; Count: Longint): Longint;
  315. begin
  316. Result:=FileRead(FHandle,Buffer,Count);
  317. If Result=-1 then Result:=0;
  318. end;
  319. function THandleStream.Write(const Buffer; Count: Longint): Longint;
  320. begin
  321. Result:=FileWrite (FHandle,Buffer,Count);
  322. If Result=-1 then Result:=0;
  323. end;
  324. Procedure THandleStream.SetSize(NewSize: Longint);
  325. begin
  326. SetSize(Int64(NewSize));
  327. end;
  328. Procedure THandleStream.SetSize(const NewSize: Int64);
  329. begin
  330. FileTruncate(FHandle,NewSize);
  331. end;
  332. function THandleStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
  333. begin
  334. Result:=FileSeek(FHandle,Offset,ord(Origin));
  335. end;
  336. {****************************************************************************}
  337. {* TFileStream *}
  338. {****************************************************************************}
  339. constructor TFileStream.Create(const AFileName: string; Mode: Word);
  340. begin
  341. FFileName:=AFileName;
  342. If Mode=fmcreate then
  343. FHandle:=FileCreate(AFileName)
  344. else
  345. FHAndle:=FileOpen(AFileName,Mode);
  346. If (THandle(FHandle)=feInvalidHandle) then
  347. If Mode=fmcreate then
  348. raise EFCreateError.createfmt(SFCreateError,[AFileName])
  349. else
  350. raise EFOpenError.Createfmt(SFOpenError,[AFilename]);
  351. end;
  352. constructor TFileStream.Create(const AFileName: string; Mode: Word; Rights: Cardinal);
  353. begin
  354. FFileName:=AFileName;
  355. If Mode=fmcreate then
  356. FHandle:=FileCreate(AFileName,Rights)
  357. else
  358. FHAndle:=FileOpen(AFileName,Mode);
  359. If (THandle(FHandle)=feInvalidHandle) then
  360. If Mode=fmcreate then
  361. raise EFCreateError.createfmt(SFCreateError,[AFileName])
  362. else
  363. raise EFOpenError.Createfmt(SFOpenError,[AFilename]);
  364. end;
  365. destructor TFileStream.Destroy;
  366. begin
  367. FileClose(FHandle);
  368. end;
  369. {****************************************************************************}
  370. {* TCustomMemoryStream *}
  371. {****************************************************************************}
  372. procedure TCustomMemoryStream.SetPointer(Ptr: Pointer; ASize: Longint);
  373. begin
  374. FMemory:=Ptr;
  375. FSize:=ASize;
  376. end;
  377. function TCustomMemoryStream.GetSize: Int64;
  378. begin
  379. Result:=FSize;
  380. end;
  381. function TCustomMemoryStream.Read(var Buffer; Count: Longint): Longint;
  382. begin
  383. Result:=0;
  384. If (FSize>0) and (FPosition<Fsize) then
  385. begin
  386. Result:=FSize-FPosition;
  387. If Result>Count then Result:=Count;
  388. Move ((FMemory+FPosition)^,Buffer,Result);
  389. FPosition:=Fposition+Result;
  390. end;
  391. end;
  392. function TCustomMemoryStream.Seek(Offset: Longint; Origin: Word): Longint;
  393. begin
  394. Case Origin of
  395. soFromBeginning : FPosition:=Offset;
  396. soFromEnd : FPosition:=FSize+Offset;
  397. soFromCurrent : FpoSition:=FPosition+Offset;
  398. end;
  399. Result:=FPosition;
  400. end;
  401. procedure TCustomMemoryStream.SaveToStream(Stream: TStream);
  402. begin
  403. if FSize>0 then Stream.WriteBuffer (FMemory^,FSize);
  404. end;
  405. procedure TCustomMemoryStream.SaveToFile(const FileName: string);
  406. Var S : TFileStream;
  407. begin
  408. S:=TFileStream.Create (FileName,fmCreate);
  409. Try
  410. SaveToStream(S);
  411. finally
  412. S.free;
  413. end;
  414. end;
  415. {****************************************************************************}
  416. {* TMemoryStream *}
  417. {****************************************************************************}
  418. Const TMSGrow = 4096; { Use 4k blocks. }
  419. procedure TMemoryStream.SetCapacity(NewCapacity: Longint);
  420. begin
  421. SetPointer (Realloc(NewCapacity),Fsize);
  422. FCapacity:=NewCapacity;
  423. end;
  424. function TMemoryStream.Realloc(var NewCapacity: Longint): Pointer;
  425. begin
  426. If NewCapacity<0 Then
  427. NewCapacity:=0
  428. else
  429. begin
  430. // if growing, grow at least a quarter
  431. if (NewCapacity>FCapacity) and (NewCapacity < (5*FCapacity) div 4) then
  432. NewCapacity := (5*FCapacity) div 4;
  433. // round off to block size.
  434. NewCapacity := (NewCapacity + (TMSGrow-1)) and not (TMSGROW-1);
  435. end;
  436. // Only now check !
  437. If NewCapacity=FCapacity then
  438. Result:=FMemory
  439. else
  440. begin
  441. Result:=Reallocmem(FMemory,Newcapacity);
  442. If (Result=Nil) and (Newcapacity>0) then
  443. Raise EStreamError.Create(SMemoryStreamError);
  444. end;
  445. end;
  446. destructor TMemoryStream.Destroy;
  447. begin
  448. Clear;
  449. Inherited Destroy;
  450. end;
  451. procedure TMemoryStream.Clear;
  452. begin
  453. FSize:=0;
  454. FPosition:=0;
  455. SetCapacity (0);
  456. end;
  457. procedure TMemoryStream.LoadFromStream(Stream: TStream);
  458. begin
  459. Stream.Position:=0;
  460. SetSize(Stream.Size);
  461. If FSize>0 then Stream.ReadBuffer(FMemory^,FSize);
  462. end;
  463. procedure TMemoryStream.LoadFromFile(const FileName: string);
  464. Var S : TFileStream;
  465. begin
  466. S:=TFileStream.Create (FileName,fmOpenRead);
  467. Try
  468. LoadFromStream(S);
  469. finally
  470. S.free;
  471. end;
  472. end;
  473. procedure TMemoryStream.SetSize(NewSize: Longint);
  474. begin
  475. SetCapacity (NewSize);
  476. FSize:=NewSize;
  477. IF FPosition>FSize then
  478. FPosition:=FSize;
  479. end;
  480. function TMemoryStream.Write(const Buffer; Count: Longint): Longint;
  481. Var NewPos : Longint;
  482. begin
  483. If Count=0 then
  484. exit(0);
  485. NewPos:=FPosition+Count;
  486. If NewPos>Fsize then
  487. begin
  488. IF NewPos>FCapacity then
  489. SetCapacity (NewPos);
  490. FSize:=Newpos;
  491. end;
  492. System.Move (Buffer,(FMemory+FPosition)^,Count);
  493. FPosition:=NewPos;
  494. Result:=Count;
  495. end;
  496. {****************************************************************************}
  497. {* TStringStream *}
  498. {****************************************************************************}
  499. procedure TStringStream.SetSize(NewSize: Longint);
  500. begin
  501. Setlength(FDataString,NewSize);
  502. If FPosition>NewSize then FPosition:=NewSize;
  503. end;
  504. constructor TStringStream.Create(const AString: string);
  505. begin
  506. Inherited create;
  507. FDataString:=AString;
  508. end;
  509. function TStringStream.Read(var Buffer; Count: Longint): Longint;
  510. begin
  511. Result:=Length(FDataString)-FPosition;
  512. If Result>Count then Result:=Count;
  513. // This supposes FDataString to be of type AnsiString !
  514. Move (Pchar(FDataString)[FPosition],Buffer,Result);
  515. FPosition:=FPosition+Result;
  516. end;
  517. function TStringStream.ReadString(Count: Longint): string;
  518. Var NewLen : Longint;
  519. begin
  520. NewLen:=Length(FDataString)-FPosition;
  521. If NewLen>Count then NewLen:=Count;
  522. SetLength(Result,NewLen);
  523. Read (Pointer(Result)^,NewLen);
  524. end;
  525. function TStringStream.Seek(Offset: Longint; Origin: Word): Longint;
  526. begin
  527. Case Origin of
  528. soFromBeginning : FPosition:=Offset;
  529. soFromEnd : FPosition:=Length(FDataString)+Offset;
  530. soFromCurrent : FpoSition:=FPosition+Offset;
  531. end;
  532. If FPosition>Length(FDataString) then FPosition:=Length(FDataString);
  533. If FPosition<0 then FPosition:=0;
  534. Result:=FPosition;
  535. end;
  536. function TStringStream.Write(const Buffer; Count: Longint): Longint;
  537. begin
  538. Result:=Count;
  539. SetSize(FPosition+Count);
  540. // This supposes that FDataString is of type AnsiString)
  541. Move (Buffer,PChar(FDataString)[Fposition],Count);
  542. FPosition:=FPosition+Count;
  543. end;
  544. procedure TStringStream.WriteString(const AString: string);
  545. begin
  546. Write (PChar(Astring)[0],Length(AString));
  547. end;
  548. {****************************************************************************}
  549. {* TResourceStream *}
  550. {****************************************************************************}
  551. {$ifdef UNICODE}
  552. procedure TResourceStream.Initialize(Instance: THandle; Name, ResType: PWideChar);
  553. begin
  554. Res:=FindResource(Instance, Name, ResType);
  555. if Res=0 then
  556. raise EResNotFound.CreateFmt(SResNotFound,[Name]);
  557. Handle:=LoadResource(Instance,Res);
  558. if Handle=0 then
  559. raise EResNotFound.CreateFmt(SResNotFound,[Name]);
  560. SetPointer(LockResource(Handle),SizeOfResource(Instance,Res));
  561. end;
  562. constructor TResourceStream.Create(Instance: THandle; const ResName: WideString; ResType: PWideChar);
  563. begin
  564. inherited create;
  565. Initialize(Instance,PWideChar(ResName),ResType);
  566. end;
  567. constructor TResourceStream.CreateFromID(Instance: THandle; ResID: Integer; ResType: PWideChar);
  568. begin
  569. inherited create;
  570. Initialize(Instance,PWideChar(ResID),ResType);
  571. end;
  572. {$else UNICODE}
  573. procedure TResourceStream.Initialize(Instance: THandle; Name, ResType: PChar);
  574. begin
  575. Res:=FindResource(Instance, Name, ResType);
  576. if Res=0 then
  577. raise EResNotFound.CreateFmt(SResNotFound,[Name]);
  578. Handle:=LoadResource(Instance,Res);
  579. if Handle=0 then
  580. raise EResNotFound.CreateFmt(SResNotFound,[Name]);
  581. SetPointer(LockResource(Handle),SizeOfResource(Instance,Res));
  582. end;
  583. constructor TResourceStream.Create(Instance: THandle; const ResName: string; ResType: PChar);
  584. begin
  585. inherited create;
  586. Initialize(Instance,pchar(ResName),ResType);
  587. end;
  588. constructor TResourceStream.CreateFromID(Instance: THandle; ResID: Integer; ResType: PChar);
  589. begin
  590. inherited create;
  591. Initialize(Instance,pchar(PtrInt(ResID)),ResType);
  592. end;
  593. {$endif UNICODE}
  594. destructor TResourceStream.Destroy;
  595. begin
  596. UnlockResource(Handle);
  597. FreeResource(Handle);
  598. inherited destroy;
  599. end;
  600. {****************************************************************************}
  601. {* TOwnerStream *}
  602. {****************************************************************************}
  603. constructor TOwnerStream.Create(ASource: TStream);
  604. begin
  605. FSource:=ASource;
  606. end;
  607. destructor TOwnerStream.Destroy;
  608. begin
  609. If FOwner then
  610. FreeAndNil(FSource);
  611. inherited Destroy;
  612. end;
  613. {****************************************************************************}
  614. {* TStreamAdapter *}
  615. {****************************************************************************}
  616. constructor TStreamAdapter.Create(Stream: TStream; Ownership: TStreamOwnership = soReference);
  617. begin
  618. inherited Create;
  619. FStream:=Stream;
  620. FOwnership:=Ownership;
  621. end;
  622. destructor TStreamAdapter.Destroy;
  623. begin
  624. if StreamOwnership=soOwned then
  625. FreeAndNil(FStream);
  626. inherited Destroy;
  627. end;
  628. {$warnings off}
  629. function TStreamAdapter.Read(pv: Pointer; cb: DWORD; pcbRead: PDWORD): HResult; stdcall;
  630. begin
  631. runerror(217);
  632. end;
  633. function TStreamAdapter.Write(pv: Pointer; cb: DWORD; pcbWritten: PDWORD): HResult; stdcall;
  634. begin
  635. runerror(217);
  636. end;
  637. function TStreamAdapter.Seek(dlibMove: Largeint; dwOrigin: Longint; out libNewPosition: Largeint): HResult; stdcall;
  638. begin
  639. runerror(217);
  640. end;
  641. function TStreamAdapter.SetSize(libNewSize: Largeint): HResult; stdcall;
  642. begin
  643. runerror(217);
  644. end;
  645. function TStreamAdapter.CopyTo(stm: IStream; cb: Largeint; out cbRead: Largeint; out cbWritten: Largeint): HResult; stdcall;
  646. begin
  647. runerror(217);
  648. end;
  649. function TStreamAdapter.Commit(grfCommitFlags: Longint): HResult; stdcall;
  650. begin
  651. runerror(217);
  652. end;
  653. function TStreamAdapter.Revert: HResult; stdcall;
  654. begin
  655. runerror(217);
  656. end;
  657. function TStreamAdapter.LockRegion(libOffset: Largeint; cb: Largeint; dwLockType: Longint): HResult; stdcall;
  658. begin
  659. runerror(217);
  660. end;
  661. function TStreamAdapter.UnlockRegion(libOffset: Largeint; cb: Largeint; dwLockType: Longint): HResult; stdcall;
  662. begin
  663. runerror(217);
  664. end;
  665. function TStreamAdapter.Stat(out statstg: TStatStg; grfStatFlag: Longint): HResult; stdcall;
  666. begin
  667. runerror(217);
  668. end;
  669. function TStreamAdapter.Clone(out stm: IStream): HResult; stdcall;
  670. begin
  671. runerror(217);
  672. end;
  673. {$warnings on}