streams.inc 20 KB

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