tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

IStream.h (3808B)


      1 // IStream.h
      2 
      3 #ifndef __ISTREAM_H
      4 #define __ISTREAM_H
      5 
      6 #include "../Common/MyTypes.h"
      7 #include "../Common/MyWindows.h"
      8 
      9 #include "IDecl.h"
     10 
     11 #define STREAM_INTERFACE_SUB(i, base, x) DECL_INTERFACE_SUB(i, base, 3, x)
     12 #define STREAM_INTERFACE(i, x) STREAM_INTERFACE_SUB(i, IUnknown, x)
     13 
     14 STREAM_INTERFACE(ISequentialInStream, 0x01)
     15 {
     16  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize) PURE;
     17  
     18  /*
     19  The requirement for caller: (processedSize != NULL).
     20  The callee can allow (processedSize == NULL) for compatibility reasons.
     21    
     22  if (size == 0), this function returns S_OK and (*processedSize) is set to 0.
     23 
     24  if (size != 0)
     25  {
     26    Partial read is allowed: (*processedSize <= avail_size && *processedSize <= size),
     27      where (avail_size) is the size of remaining bytes in stream.
     28    If (avail_size != 0), this function must read at least 1 byte: (*processedSize > 0).
     29    You must call Read() in loop, if you need to read exact amount of data.
     30  }
     31 
     32  If seek pointer before Read() call was changed to position past the end of stream:
     33    if (seek_pointer >= stream_size), this function returns S_OK and (*processedSize) is set to 0.
     34  
     35  ERROR CASES:
     36    If the function returns error code, then (*processedSize) is size of
     37    data written to (data) buffer (it can be data before error or data with errors).
     38    The recommended way for callee to work with reading errors:
     39      1) write part of data before error to (data) buffer and return S_OK.
     40      2) return error code for further calls of Read().
     41  */
     42 };
     43 
     44 STREAM_INTERFACE(ISequentialOutStream, 0x02)
     45 {
     46  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize) PURE;
     47  
     48  /*
     49  The requirement for caller: (processedSize != NULL).
     50  The callee can allow (processedSize == NULL) for compatibility reasons.
     51 
     52  if (size != 0)
     53  {
     54    Partial write is allowed: (*processedSize <= size),
     55    but this function must write at least 1 byte: (*processedSize > 0).
     56    You must call Write() in loop, if you need to write exact amount of data.
     57  }
     58 
     59  ERROR CASES:
     60    If the function returns error code, then (*processedSize) is size of
     61    data written from (data) buffer.
     62  */
     63 };
     64 
     65 #ifdef __HRESULT_FROM_WIN32
     66 #define HRESULT_WIN32_ERROR_NEGATIVE_SEEK __HRESULT_FROM_WIN32(ERROR_NEGATIVE_SEEK)
     67 #else
     68 #define HRESULT_WIN32_ERROR_NEGATIVE_SEEK   HRESULT_FROM_WIN32(ERROR_NEGATIVE_SEEK)
     69 #endif
     70 
     71 /*  Seek() Function
     72  If you seek before the beginning of the stream, Seek() function returns error code:
     73      Recommended error code is __HRESULT_FROM_WIN32(ERROR_NEGATIVE_SEEK).
     74      or STG_E_INVALIDFUNCTION
     75      
     76  It is allowed to seek past the end of the stream.
     77 
     78 
     79  if Seek() returns error, then the value of *newPosition is undefined.
     80 */
     81 
     82 STREAM_INTERFACE_SUB(IInStream, ISequentialInStream, 0x03)
     83 {
     84  STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) PURE;
     85 };
     86 
     87 STREAM_INTERFACE_SUB(IOutStream, ISequentialOutStream, 0x04)
     88 {
     89  STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) PURE;
     90  STDMETHOD(SetSize)(UInt64 newSize) PURE;
     91 };
     92 
     93 STREAM_INTERFACE(IStreamGetSize, 0x06)
     94 {
     95  STDMETHOD(GetSize)(UInt64 *size) PURE;
     96 };
     97 
     98 STREAM_INTERFACE(IOutStreamFinish, 0x07)
     99 {
    100  STDMETHOD(OutStreamFinish)() PURE;
    101 };
    102 
    103 
    104 STREAM_INTERFACE(IStreamGetProps, 0x08)
    105 {
    106  STDMETHOD(GetProps)(UInt64 *size, FILETIME *cTime, FILETIME *aTime, FILETIME *mTime, UInt32 *attrib) PURE;
    107 };
    108 
    109 struct CStreamFileProps
    110 {
    111  UInt64 Size;
    112  UInt64 VolID;
    113  UInt64 FileID_Low;
    114  UInt64 FileID_High;
    115  UInt32 NumLinks;
    116  UInt32 Attrib;
    117  FILETIME CTime;
    118  FILETIME ATime;
    119  FILETIME MTime;
    120 };
    121 
    122 STREAM_INTERFACE(IStreamGetProps2, 0x09)
    123 {
    124  STDMETHOD(GetProps2)(CStreamFileProps *props) PURE;
    125 };
    126 
    127 #endif