streams.inc 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899
  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. Var
  273. TheSize : Longint;
  274. P : PByte ;
  275. begin
  276. ReadBuffer (TheSize,SizeOf(TheSize));
  277. SetLength(Result,TheSize);
  278. // Illegal typecast if no AnsiStrings defined.
  279. if TheSize>0 then
  280. begin
  281. ReadBuffer (Pointer(Result)^,TheSize);
  282. P:=Pointer(Result)+TheSize;
  283. p^:=0;
  284. end;
  285. end;
  286. Procedure TStream.WriteAnsiString (const S : String);
  287. Var L : Longint;
  288. begin
  289. L:=Length(S);
  290. WriteBuffer (L,SizeOf(L));
  291. WriteBuffer (Pointer(S)^,L);
  292. end;
  293. procedure TStream.WriteByte(b : Byte);
  294. begin
  295. WriteBuffer(b,1);
  296. end;
  297. procedure TStream.WriteWord(w : Word);
  298. begin
  299. WriteBuffer(w,2);
  300. end;
  301. procedure TStream.WriteDWord(d : Cardinal);
  302. begin
  303. WriteBuffer(d,4);
  304. end;
  305. {****************************************************************************}
  306. {* THandleStream *}
  307. {****************************************************************************}
  308. Constructor THandleStream.Create(AHandle: Integer);
  309. begin
  310. FHandle:=AHandle;
  311. end;
  312. function THandleStream.Read(var Buffer; Count: Longint): Longint;
  313. begin
  314. Result:=FileRead(FHandle,Buffer,Count);
  315. If Result=-1 then Result:=0;
  316. end;
  317. function THandleStream.Write(const Buffer; Count: Longint): Longint;
  318. begin
  319. Result:=FileWrite (FHandle,Buffer,Count);
  320. If Result=-1 then Result:=0;
  321. end;
  322. Procedure THandleStream.SetSize(NewSize: Longint);
  323. begin
  324. SetSize(Int64(NewSize));
  325. end;
  326. Procedure THandleStream.SetSize(const NewSize: Int64);
  327. begin
  328. FileTruncate(FHandle,NewSize);
  329. end;
  330. function THandleStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
  331. begin
  332. Result:=FileSeek(FHandle,Offset,ord(Origin));
  333. end;
  334. {****************************************************************************}
  335. {* TFileStream *}
  336. {****************************************************************************}
  337. constructor TFileStream.Create(const AFileName: string; Mode: Word);
  338. begin
  339. FFileName:=AFileName;
  340. If Mode=fmcreate then
  341. FHandle:=FileCreate(AFileName)
  342. else
  343. FHAndle:=FileOpen(AFileName,Mode);
  344. If (THandle(FHandle)=feInvalidHandle) then
  345. If Mode=fmcreate then
  346. raise EFCreateError.createfmt(SFCreateError,[AFileName])
  347. else
  348. raise EFOpenError.Createfmt(SFOpenError,[AFilename]);
  349. end;
  350. constructor TFileStream.Create(const AFileName: string; Mode: Word; Rights: Cardinal);
  351. begin
  352. FFileName:=AFileName;
  353. If Mode=fmcreate then
  354. FHandle:=FileCreate(AFileName,Rights)
  355. else
  356. FHAndle:=FileOpen(AFileName,Mode);
  357. If (THandle(FHandle)=feInvalidHandle) then
  358. If Mode=fmcreate then
  359. raise EFCreateError.createfmt(SFCreateError,[AFileName])
  360. else
  361. raise EFOpenError.Createfmt(SFOpenError,[AFilename]);
  362. end;
  363. destructor TFileStream.Destroy;
  364. begin
  365. FileClose(FHandle);
  366. end;
  367. {****************************************************************************}
  368. {* TCustomMemoryStream *}
  369. {****************************************************************************}
  370. procedure TCustomMemoryStream.SetPointer(Ptr: Pointer; ASize: Longint);
  371. begin
  372. FMemory:=Ptr;
  373. FSize:=ASize;
  374. end;
  375. function TCustomMemoryStream.GetSize: Int64;
  376. begin
  377. Result:=FSize;
  378. end;
  379. function TCustomMemoryStream.Read(var Buffer; Count: Longint): Longint;
  380. begin
  381. Result:=0;
  382. If (FSize>0) and (FPosition<Fsize) and (FPosition>=0) then
  383. begin
  384. Result:=FSize-FPosition;
  385. If Result>Count then Result:=Count;
  386. Move ((FMemory+FPosition)^,Buffer,Result);
  387. FPosition:=Fposition+Result;
  388. end;
  389. end;
  390. function TCustomMemoryStream.Seek(Offset: Longint; Origin: Word): Longint;
  391. begin
  392. Case Origin of
  393. soFromBeginning : FPosition:=Offset;
  394. soFromEnd : FPosition:=FSize+Offset;
  395. soFromCurrent : FPosition:=FPosition+Offset;
  396. end;
  397. Result:=FPosition;
  398. {$IFDEF DEBUG}
  399. if Result < 0 then
  400. raise Exception.Create('TCustomMemoryStream');
  401. {$ENDIF}
  402. end;
  403. procedure TCustomMemoryStream.SaveToStream(Stream: TStream);
  404. begin
  405. if FSize>0 then Stream.WriteBuffer (FMemory^,FSize);
  406. end;
  407. procedure TCustomMemoryStream.SaveToFile(const FileName: string);
  408. Var S : TFileStream;
  409. begin
  410. S:=TFileStream.Create (FileName,fmCreate);
  411. Try
  412. SaveToStream(S);
  413. finally
  414. S.free;
  415. end;
  416. end;
  417. {****************************************************************************}
  418. {* TMemoryStream *}
  419. {****************************************************************************}
  420. Const TMSGrow = 4096; { Use 4k blocks. }
  421. procedure TMemoryStream.SetCapacity(NewCapacity: Longint);
  422. begin
  423. SetPointer (Realloc(NewCapacity),Fsize);
  424. FCapacity:=NewCapacity;
  425. end;
  426. function TMemoryStream.Realloc(var NewCapacity: Longint): Pointer;
  427. begin
  428. If NewCapacity<0 Then
  429. NewCapacity:=0
  430. else
  431. begin
  432. // if growing, grow at least a quarter
  433. if (NewCapacity>FCapacity) and (NewCapacity < (5*FCapacity) div 4) then
  434. NewCapacity := (5*FCapacity) div 4;
  435. // round off to block size.
  436. NewCapacity := (NewCapacity + (TMSGrow-1)) and not (TMSGROW-1);
  437. end;
  438. // Only now check !
  439. If NewCapacity=FCapacity then
  440. Result:=FMemory
  441. else
  442. begin
  443. Result:=Reallocmem(FMemory,Newcapacity);
  444. If (Result=Nil) and (Newcapacity>0) then
  445. Raise EStreamError.Create(SMemoryStreamError);
  446. end;
  447. end;
  448. destructor TMemoryStream.Destroy;
  449. begin
  450. Clear;
  451. Inherited Destroy;
  452. end;
  453. procedure TMemoryStream.Clear;
  454. begin
  455. FSize:=0;
  456. FPosition:=0;
  457. SetCapacity (0);
  458. end;
  459. procedure TMemoryStream.LoadFromStream(Stream: TStream);
  460. begin
  461. Stream.Position:=0;
  462. SetSize(Stream.Size);
  463. If FSize>0 then Stream.ReadBuffer(FMemory^,FSize);
  464. end;
  465. procedure TMemoryStream.LoadFromFile(const FileName: string);
  466. Var S : TFileStream;
  467. begin
  468. S:=TFileStream.Create (FileName,fmOpenRead or fmShareDenyWrite);
  469. Try
  470. LoadFromStream(S);
  471. finally
  472. S.free;
  473. end;
  474. end;
  475. procedure TMemoryStream.SetSize(NewSize: Longint);
  476. begin
  477. SetCapacity (NewSize);
  478. FSize:=NewSize;
  479. IF FPosition>FSize then
  480. FPosition:=FSize;
  481. end;
  482. function TMemoryStream.Write(const Buffer; Count: Longint): Longint;
  483. Var NewPos : Longint;
  484. begin
  485. If (Count=0) or (FPosition<0) then
  486. exit(0);
  487. NewPos:=FPosition+Count;
  488. If NewPos>Fsize then
  489. begin
  490. IF NewPos>FCapacity then
  491. SetCapacity (NewPos);
  492. FSize:=Newpos;
  493. end;
  494. System.Move (Buffer,(FMemory+FPosition)^,Count);
  495. FPosition:=NewPos;
  496. Result:=Count;
  497. end;
  498. {****************************************************************************}
  499. {* TStringStream *}
  500. {****************************************************************************}
  501. procedure TStringStream.SetSize(NewSize: Longint);
  502. begin
  503. Setlength(FDataString,NewSize);
  504. If FPosition>NewSize then FPosition:=NewSize;
  505. end;
  506. constructor TStringStream.Create(const AString: string);
  507. begin
  508. Inherited create;
  509. FDataString:=AString;
  510. end;
  511. function TStringStream.Read(var Buffer; Count: Longint): Longint;
  512. begin
  513. Result:=Length(FDataString)-FPosition;
  514. If Result>Count then Result:=Count;
  515. // This supposes FDataString to be of type AnsiString !
  516. Move (Pchar(FDataString)[FPosition],Buffer,Result);
  517. FPosition:=FPosition+Result;
  518. end;
  519. function TStringStream.ReadString(Count: Longint): string;
  520. Var NewLen : Longint;
  521. begin
  522. NewLen:=Length(FDataString)-FPosition;
  523. If NewLen>Count then NewLen:=Count;
  524. SetLength(Result,NewLen);
  525. Read (Pointer(Result)^,NewLen);
  526. end;
  527. function TStringStream.Seek(Offset: Longint; Origin: Word): Longint;
  528. begin
  529. Case Origin of
  530. soFromBeginning : FPosition:=Offset;
  531. soFromEnd : FPosition:=Length(FDataString)+Offset;
  532. soFromCurrent : FpoSition:=FPosition+Offset;
  533. end;
  534. If FPosition>Length(FDataString) then FPosition:=Length(FDataString);
  535. If FPosition<0 then FPosition:=0;
  536. Result:=FPosition;
  537. end;
  538. function TStringStream.Write(const Buffer; Count: Longint): Longint;
  539. begin
  540. Result:=Count;
  541. SetSize(FPosition+Count);
  542. // This supposes that FDataString is of type AnsiString)
  543. Move (Buffer,PChar(FDataString)[Fposition],Count);
  544. FPosition:=FPosition+Count;
  545. end;
  546. procedure TStringStream.WriteString(const AString: string);
  547. begin
  548. Write (PChar(Astring)[0],Length(AString));
  549. end;
  550. {****************************************************************************}
  551. {* TResourceStream *}
  552. {****************************************************************************}
  553. {$ifdef UNICODE}
  554. procedure TResourceStream.Initialize(Instance: THandle; Name, ResType: PWideChar);
  555. begin
  556. Res:=FindResource(Instance, Name, ResType);
  557. if Res=0 then
  558. raise EResNotFound.CreateFmt(SResNotFound,[Name]);
  559. Handle:=LoadResource(Instance,Res);
  560. if Handle=0 then
  561. raise EResNotFound.CreateFmt(SResNotFound,[Name]);
  562. SetPointer(LockResource(Handle),SizeOfResource(Instance,Res));
  563. end;
  564. constructor TResourceStream.Create(Instance: THandle; const ResName: WideString; ResType: PWideChar);
  565. begin
  566. inherited create;
  567. Initialize(Instance,PWideChar(ResName),ResType);
  568. end;
  569. constructor TResourceStream.CreateFromID(Instance: THandle; ResID: Integer; ResType: PWideChar);
  570. begin
  571. inherited create;
  572. Initialize(Instance,PWideChar(ResID),ResType);
  573. end;
  574. {$else UNICODE}
  575. procedure TResourceStream.Initialize(Instance: THandle; Name, ResType: PChar);
  576. begin
  577. Res:=FindResource(Instance, Name, ResType);
  578. if Res=0 then
  579. raise EResNotFound.CreateFmt(SResNotFound,[Name]);
  580. Handle:=LoadResource(Instance,Res);
  581. if Handle=0 then
  582. raise EResNotFound.CreateFmt(SResNotFound,[Name]);
  583. SetPointer(LockResource(Handle),SizeOfResource(Instance,Res));
  584. end;
  585. constructor TResourceStream.Create(Instance: THandle; const ResName: string; ResType: PChar);
  586. begin
  587. inherited create;
  588. Initialize(Instance,pchar(ResName),ResType);
  589. end;
  590. constructor TResourceStream.CreateFromID(Instance: THandle; ResID: Integer; ResType: PChar);
  591. begin
  592. inherited create;
  593. Initialize(Instance,pchar(PtrInt(ResID)),ResType);
  594. end;
  595. {$endif UNICODE}
  596. destructor TResourceStream.Destroy;
  597. begin
  598. UnlockResource(Handle);
  599. FreeResource(Handle);
  600. inherited destroy;
  601. end;
  602. {****************************************************************************}
  603. {* TOwnerStream *}
  604. {****************************************************************************}
  605. constructor TOwnerStream.Create(ASource: TStream);
  606. begin
  607. FSource:=ASource;
  608. end;
  609. destructor TOwnerStream.Destroy;
  610. begin
  611. If FOwner then
  612. FreeAndNil(FSource);
  613. inherited Destroy;
  614. end;
  615. {****************************************************************************}
  616. {* TStreamAdapter *}
  617. {****************************************************************************}
  618. constructor TStreamAdapter.Create(Stream: TStream; Ownership: TStreamOwnership = soReference);
  619. begin
  620. inherited Create;
  621. FStream:=Stream;
  622. FOwnership:=Ownership;
  623. end;
  624. destructor TStreamAdapter.Destroy;
  625. begin
  626. if StreamOwnership=soOwned then
  627. FreeAndNil(FStream);
  628. inherited Destroy;
  629. end;
  630. {$warnings off}
  631. function TStreamAdapter.Read(pv: Pointer; cb: DWORD; pcbRead: PDWORD): HResult; stdcall;
  632. begin
  633. runerror(217);
  634. end;
  635. function TStreamAdapter.Write(pv: Pointer; cb: DWORD; pcbWritten: PDWORD): HResult; stdcall;
  636. begin
  637. runerror(217);
  638. end;
  639. function TStreamAdapter.Seek(dlibMove: Largeint; dwOrigin: Longint; out libNewPosition: Largeint): HResult; stdcall;
  640. begin
  641. runerror(217);
  642. end;
  643. function TStreamAdapter.SetSize(libNewSize: Largeint): HResult; stdcall;
  644. begin
  645. runerror(217);
  646. end;
  647. function TStreamAdapter.CopyTo(stm: IStream; cb: Largeint; out cbRead: Largeint; out cbWritten: Largeint): HResult; stdcall;
  648. begin
  649. runerror(217);
  650. end;
  651. function TStreamAdapter.Commit(grfCommitFlags: Longint): HResult; stdcall;
  652. begin
  653. runerror(217);
  654. end;
  655. function TStreamAdapter.Revert: HResult; stdcall;
  656. begin
  657. runerror(217);
  658. end;
  659. function TStreamAdapter.LockRegion(libOffset: Largeint; cb: Largeint; dwLockType: Longint): HResult; stdcall;
  660. begin
  661. runerror(217);
  662. end;
  663. function TStreamAdapter.UnlockRegion(libOffset: Largeint; cb: Largeint; dwLockType: Longint): HResult; stdcall;
  664. begin
  665. runerror(217);
  666. end;
  667. function TStreamAdapter.Stat(out statstg: TStatStg; grfStatFlag: Longint): HResult; stdcall;
  668. begin
  669. runerror(217);
  670. end;
  671. function TStreamAdapter.Clone(out stm: IStream): HResult; stdcall;
  672. begin
  673. runerror(217);
  674. end;
  675. {$warnings on}