* patch from 15003 from M spiller, reverting now implemented.

git-svn-id: trunk@14078 -
This commit is contained in:
marco 2009-11-06 10:52:23 +00:00
parent 2295a9f23b
commit 6ed7d33569
2 changed files with 49 additions and 8 deletions

View File

@ -945,8 +945,9 @@ type
{ Implements OLE IStream on TStream }
TStreamAdapter = class(TInterfacedObject, IStream)
private
FStream: TStream;
FOwnership: TStreamOwnership;
FStream : TStream;
FOwnership : TStreamOwnership;
m_bReverted: Boolean;
public
constructor Create(Stream: TStream; Ownership: TStreamOwnership = soReference);
destructor Destroy; override;

View File

@ -821,6 +821,9 @@ begin
inherited Create;
FStream:=Stream;
FOwnership:=Ownership;
m_bReverted:=false; // mantis 15003
// http://www.tech-archive.net/Archive/German/microsoft.public.de.vc/2005-08/msg00791.html
// http://code.google.com/p/ddab-lib/wiki/TPJIStreamWrapper
end;
@ -836,6 +839,11 @@ function TStreamAdapter.Read(pv: Pointer; cb: DWORD; pcbRead: PDWORD): HResult;
var
readcount: Longint;
begin
if m_bReverted then
begin
Result := STG_E_REVERTED;
Exit;
end;
if pv = nil then
begin
Result := E_INVALIDARG;
@ -851,6 +859,11 @@ function TStreamAdapter.Write(pv: Pointer; cb: DWORD; pcbWritten: PDWORD): HResu
var
writecount: Longint;
begin
if m_bReverted then
begin
Result := STG_E_REVERTED;
Exit;
end;
if pv = nil then
begin
Result := E_INVALIDARG;
@ -866,6 +879,11 @@ function TStreamAdapter.Seek(dlibMove: Largeint; dwOrigin: Longint; out libNewPo
var
newpos: Int64;
begin
if m_bReverted then
begin
Result := STG_E_REVERTED;
Exit;
end;
case dwOrigin of
STREAM_SEEK_SET: newpos := FStream.Seek(dlibMove, soBeginning);
STREAM_SEEK_CUR: newpos := FStream.Seek(dlibMove, soCurrent);
@ -879,42 +897,59 @@ end;
function TStreamAdapter.SetSize(libNewSize: Largeint): HResult; stdcall;
begin
if m_bReverted then
begin
Result := STG_E_REVERTED;
Exit;
end;
runerror(217);
end;
function TStreamAdapter.CopyTo(stm: IStream; cb: Largeint; out cbRead: Largeint; out cbWritten: Largeint): HResult; stdcall;
begin
if m_bReverted then
begin
Result := STG_E_REVERTED;
Exit;
end;
runerror(217);
end;
function TStreamAdapter.Commit(grfCommitFlags: Longint): HResult; stdcall;
begin
runerror(217);
if m_bReverted then
Result := STG_E_REVERTED
else
Result := S_OK;
end;
function TStreamAdapter.Revert: HResult; stdcall;
begin
runerror(217);
m_bReverted := True;
Result := S_OK;
end;
function TStreamAdapter.LockRegion(libOffset: Largeint; cb: Largeint; dwLockType: Longint): HResult; stdcall;
begin
runerror(217);
Result := STG_E_INVALIDFUNCTION;
end;
function TStreamAdapter.UnlockRegion(libOffset: Largeint; cb: Largeint; dwLockType: Longint): HResult; stdcall;
begin
runerror(217);
Result := STG_E_INVALIDFUNCTION;
end;
function TStreamAdapter.Stat(out statstg: TStatStg; grfStatFlag: Longint): HResult; stdcall;
begin
if m_bReverted then
begin
Result := STG_E_REVERTED;
Exit;
end;
if grfStatFlag in [STATFLAG_DEFAULT,STATFLAG_NOOPEN,STATFLAG_NONAME] then
begin
if @statstg <> nil then
@ -937,6 +972,11 @@ end;
function TStreamAdapter.Clone(out stm: IStream): HResult; stdcall;
begin
if m_bReverted then
begin
Result := STG_E_REVERTED;
Exit;
end;
runerror(217);
end;