Source code

Revision control

Copy as Markdown

Other Tools

// IStream.h↩
#ifndef __ISTREAM_H↩
#define __ISTREAM_H↩
#include "../Common/MyTypes.h"
#include "../Common/MyWindows.h"
#include "IDecl.h"
#define STREAM_INTERFACE_SUB(i, base, x) DECL_INTERFACE_SUB(i, base, 3, x)↩
#define STREAM_INTERFACE(i, x) STREAM_INTERFACE_SUB(i, IUnknown, x)↩
STREAM_INTERFACE(ISequentialInStream, 0x01)↩
{↩
STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize) PURE;↩
/*↩
The requirement for caller: (processedSize != NULL).↩
The callee can allow (processedSize == NULL) for compatibility reasons.↩
if (size == 0), this function returns S_OK and (*processedSize) is set to 0.↩
if (size != 0)↩
{↩
Partial read is allowed: (*processedSize <= avail_size && *processedSize <= size),↩
where (avail_size) is the size of remaining bytes in stream.↩
If (avail_size != 0), this function must read at least 1 byte: (*processedSize > 0).↩
You must call Read() in loop, if you need to read exact amount of data.↩
}↩
If seek pointer before Read() call was changed to position past the end of stream:↩
if (seek_pointer >= stream_size), this function returns S_OK and (*processedSize) is set to 0.↩
ERROR CASES:↩
If the function returns error code, then (*processedSize) is size of↩
data written to (data) buffer (it can be data before error or data with errors).↩
The recommended way for callee to work with reading errors:↩
1) write part of data before error to (data) buffer and return S_OK.↩
2) return error code for further calls of Read().↩
*/
};↩
STREAM_INTERFACE(ISequentialOutStream, 0x02)↩
{↩
STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize) PURE;↩
/*↩
The requirement for caller: (processedSize != NULL).↩
The callee can allow (processedSize == NULL) for compatibility reasons.↩
if (size != 0)↩
{↩
Partial write is allowed: (*processedSize <= size),↩
but this function must write at least 1 byte: (*processedSize > 0).↩
You must call Write() in loop, if you need to write exact amount of data.↩
}↩
ERROR CASES:↩
If the function returns error code, then (*processedSize) is size of↩
data written from (data) buffer.↩
*/
};↩
#ifdef __HRESULT_FROM_WIN32↩
#define HRESULT_WIN32_ERROR_NEGATIVE_SEEK __HRESULT_FROM_WIN32(ERROR_NEGATIVE_SEEK)↩
#else
#define HRESULT_WIN32_ERROR_NEGATIVE_SEEK HRESULT_FROM_WIN32(ERROR_NEGATIVE_SEEK)↩
#endif
/* Seek() Function↩
If you seek before the beginning of the stream, Seek() function returns error code:↩
Recommended error code is __HRESULT_FROM_WIN32(ERROR_NEGATIVE_SEEK).↩
or STG_E_INVALIDFUNCTION↩
It is allowed to seek past the end of the stream.↩
if Seek() returns error, then the value of *newPosition is undefined.↩
*/
STREAM_INTERFACE_SUB(IInStream, ISequentialInStream, 0x03)↩
{↩
STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) PURE;↩
};↩
STREAM_INTERFACE_SUB(IOutStream, ISequentialOutStream, 0x04)↩
{↩
STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) PURE;↩
STDMETHOD(SetSize)(UInt64 newSize) PURE;↩
};↩
STREAM_INTERFACE(IStreamGetSize, 0x06)↩
{↩
STDMETHOD(GetSize)(UInt64 *size) PURE;↩
};↩
STREAM_INTERFACE(IOutStreamFinish, 0x07)↩
{↩
STDMETHOD(OutStreamFinish)() PURE;↩
};↩
STREAM_INTERFACE(IStreamGetProps, 0x08)↩
{↩
STDMETHOD(GetProps)(UInt64 *size, FILETIME *cTime, FILETIME *aTime, FILETIME *mTime, UInt32 *attrib) PURE;↩
};↩
struct CStreamFileProps↩
{↩
UInt64 Size;↩
UInt64 VolID;↩
UInt64 FileID_Low;↩
UInt64 FileID_High;↩
UInt32 NumLinks;↩
UInt32 Attrib;↩
FILETIME CTime;↩
FILETIME ATime;↩
FILETIME MTime;↩
};↩
STREAM_INTERFACE(IStreamGetProps2, 0x09)↩
{↩
STDMETHOD(GetProps2)(CStreamFileProps *props) PURE;↩
};↩
#endif