Ignore:
Timestamp:
Sep 5, 2001, 3:54:53 PM (24 years ago)
Author:
bird
Message:

Added $Id:$ keyword.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/shell32/memorystream.c

    r5618 r6650  
     1/* $Id: memorystream.c,v 1.3 2001-09-05 13:46:56 bird Exp $ */
    12/*
    2  *      this class implements a pure IStream object
    3  *      and can be used for many purposes
     3 *  this class implements a pure IStream object
     4 *  and can be used for many purposes
    45 *
    5  *      the main reason for implementing this was
    6  *      a cleaner implementation of IShellLink which
    7  *      needs to be able to load lnk's from a IStream
    8  *      interface so it was obvious to capsule the file
    9  *      access in a IStream to.
     6 *  the main reason for implementing this was
     7 *  a cleaner implementation of IShellLink which
     8 *  needs to be able to load lnk's from a IStream
     9 *  interface so it was obvious to capsule the file
     10 *  access in a IStream to.
    1011 */
    1112
     
    3637static HRESULT WINAPI IStream_fnClone (IStream * iface, IStream** ppstm);
    3738
    38 static ICOM_VTABLE(IStream) stvt = 
    39 {       
    40         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
    41         IStream_fnQueryInterface,
    42         IStream_fnAddRef,
    43         IStream_fnRelease,
    44         IStream_fnRead,
    45         IStream_fnWrite,
    46         IStream_fnSeek,
    47         IStream_fnSetSize,
    48         IStream_fnCopyTo,
    49         IStream_fnCommit,
    50         IStream_fnRevert,
    51         IStream_fnLockRegion,
    52         IStream_fnUnlockRegion,
    53         IStream_fnStat,
    54         IStream_fnClone
    55        
     39static ICOM_VTABLE(IStream) stvt =
     40{
     41    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     42    IStream_fnQueryInterface,
     43    IStream_fnAddRef,
     44    IStream_fnRelease,
     45    IStream_fnRead,
     46    IStream_fnWrite,
     47    IStream_fnSeek,
     48    IStream_fnSetSize,
     49    IStream_fnCopyTo,
     50    IStream_fnCommit,
     51    IStream_fnRevert,
     52    IStream_fnLockRegion,
     53    IStream_fnUnlockRegion,
     54    IStream_fnStat,
     55    IStream_fnClone
     56
    5657};
    5758
    58 typedef struct 
    59 {       ICOM_VTABLE(IStream)    *lpvtst;
    60         DWORD           ref;
    61         LPBYTE          pImage;
    62         HANDLE          hMapping;
    63         DWORD           dwLength;
    64         DWORD           dwPos;
     59typedef struct
     60{   ICOM_VTABLE(IStream)    *lpvtst;
     61    DWORD       ref;
     62    LPBYTE      pImage;
     63    HANDLE      hMapping;
     64    DWORD       dwLength;
     65    DWORD       dwPos;
    6566} ISHFileStream;
    6667
     
    7273HRESULT CreateStreamOnFile (LPCSTR pszFilename, IStream ** ppstm)
    7374{
    74         ISHFileStream*  fstr;
    75         OFSTRUCT        ofs;
    76         HFILE           hFile = OpenFile( pszFilename, &ofs, OF_READ );
    77         HRESULT         ret = E_FAIL;
    78        
    79         fstr = (ISHFileStream*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(ISHFileStream));
    80         fstr->lpvtst=&stvt;
    81         fstr->ref = 1;
    82         fstr->dwLength = GetFileSize (hFile, NULL);
    83 
    84         shell32_ObjCount++;
    85 
    86         if (!(fstr->hMapping = CreateFileMappingA(hFile,NULL,PAGE_READONLY|SEC_COMMIT,0,0,NULL)))
    87         {
    88           WARN("failed to create filemap.\n");
    89           goto end_2;
    90         }
    91 
    92         if (!(fstr->pImage = MapViewOfFile(fstr->hMapping,FILE_MAP_READ,0,0,0)))
    93         {
    94           WARN("failed to mmap filemap.\n");
    95           goto end_3;
    96         }
    97 
    98         ret = S_OK;
    99         goto end_1;
    100        
    101 end_3:  CloseHandle(fstr->hMapping);
    102 end_2:  HeapFree(GetProcessHeap(), 0, fstr);
    103         fstr = NULL;
    104 
    105 end_1:  _lclose(hFile);
    106         (*ppstm) = (IStream*)fstr;
    107         return ret;
     75    ISHFileStream*  fstr;
     76    OFSTRUCT    ofs;
     77    HFILE       hFile = OpenFile( pszFilename, &ofs, OF_READ );
     78    HRESULT     ret = E_FAIL;
     79
     80    fstr = (ISHFileStream*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(ISHFileStream));
     81    fstr->lpvtst=&stvt;
     82    fstr->ref = 1;
     83    fstr->dwLength = GetFileSize (hFile, NULL);
     84
     85    shell32_ObjCount++;
     86
     87    if (!(fstr->hMapping = CreateFileMappingA(hFile,NULL,PAGE_READONLY|SEC_COMMIT,0,0,NULL)))
     88    {
     89      WARN("failed to create filemap.\n");
     90      goto end_2;
     91    }
     92
     93    if (!(fstr->pImage = MapViewOfFile(fstr->hMapping,FILE_MAP_READ,0,0,0)))
     94    {
     95      WARN("failed to mmap filemap.\n");
     96      goto end_3;
     97    }
     98
     99    ret = S_OK;
     100    goto end_1;
     101
     102end_3:  CloseHandle(fstr->hMapping);
     103end_2:  HeapFree(GetProcessHeap(), 0, fstr);
     104    fstr = NULL;
     105
     106end_1:  _lclose(hFile);
     107    (*ppstm) = (IStream*)fstr;
     108    return ret;
    108109}
    109110
     
    113114static HRESULT WINAPI IStream_fnQueryInterface(IStream *iface, REFIID riid, LPVOID *ppvObj)
    114115{
    115         ICOM_THIS(ISHFileStream, iface);
    116 
    117         TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj);
    118 
    119         *ppvObj = NULL;
    120 
    121         if(IsEqualIID(riid, &IID_IUnknown) ||
    122            IsEqualIID(riid, &IID_IStream))
    123         {
    124           *ppvObj = This;
    125         }
    126 
    127         if(*ppvObj)
    128         {
    129           IStream_AddRef((IStream*)*ppvObj);     
    130           TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
    131           return S_OK;
    132         }
    133         TRACE("-- Interface: E_NOINTERFACE\n");
    134         return E_NOINTERFACE;
     116    ICOM_THIS(ISHFileStream, iface);
     117
     118    TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj);
     119
     120    *ppvObj = NULL;
     121
     122    if(IsEqualIID(riid, &IID_IUnknown) ||
     123       IsEqualIID(riid, &IID_IStream))
     124    {
     125      *ppvObj = This;
     126    }
     127
     128    if(*ppvObj)
     129    {
     130      IStream_AddRef((IStream*)*ppvObj);
     131      TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
     132      return S_OK;
     133    }
     134    TRACE("-- Interface: E_NOINTERFACE\n");
     135    return E_NOINTERFACE;
    135136}
    136137
     
    140141static ULONG WINAPI IStream_fnAddRef(IStream *iface)
    141142{
    142         ICOM_THIS(ISHFileStream, iface);
    143 
    144         TRACE("(%p)->(count=%lu)\n",This, This->ref);
    145 
    146         shell32_ObjCount++;
    147         return ++(This->ref);
     143    ICOM_THIS(ISHFileStream, iface);
     144
     145    TRACE("(%p)->(count=%lu)\n",This, This->ref);
     146
     147    shell32_ObjCount++;
     148    return ++(This->ref);
    148149}
    149150
     
    153154static ULONG WINAPI IStream_fnRelease(IStream *iface)
    154155{
    155         ICOM_THIS(ISHFileStream, iface);
    156 
    157         TRACE("(%p)->()\n",This);
    158 
    159         shell32_ObjCount--;
    160 
    161         if (!--(This->ref))
    162         { TRACE(" destroying SHFileStream (%p)\n",This);
    163 
    164           UnmapViewOfFile(This->pImage);
    165           CloseHandle(This->hMapping);
    166 
    167           HeapFree(GetProcessHeap(),0,This);
    168           return 0;
    169         }
    170         return This->ref;
     156    ICOM_THIS(ISHFileStream, iface);
     157
     158    TRACE("(%p)->()\n",This);
     159
     160    shell32_ObjCount--;
     161
     162    if (!--(This->ref))
     163    { TRACE(" destroying SHFileStream (%p)\n",This);
     164
     165      UnmapViewOfFile(This->pImage);
     166      CloseHandle(This->hMapping);
     167
     168      HeapFree(GetProcessHeap(),0,This);
     169      return 0;
     170    }
     171    return This->ref;
    171172}
    172173
    173174static HRESULT WINAPI IStream_fnRead (IStream * iface, void* pv, ULONG cb, ULONG* pcbRead)
    174175{
    175         ICOM_THIS(ISHFileStream, iface);
    176 
    177         DWORD dwBytesToRead, dwBytesLeft;
    178        
    179         TRACE("(%p)->(%p,0x%08lx,%p)\n",This, pv, cb, pcbRead);
    180        
    181         if ( !pv )
    182           return STG_E_INVALIDPOINTER;
    183 
    184         dwBytesLeft = This->dwLength - This->dwPos;
    185 
    186         if ( 0 >= dwBytesLeft )                                         /* end of buffer */
    187           return S_FALSE;
    188        
    189         dwBytesToRead = ( cb > dwBytesLeft) ? dwBytesLeft : cb;
    190 
    191         memmove ( pv, (This->pImage) + (This->dwPos), dwBytesToRead);
    192        
    193         This->dwPos += dwBytesToRead;                                   /* adjust pointer */
    194 
    195         if (pcbRead)
    196           *pcbRead = dwBytesToRead;
    197 
    198         return S_OK;
     176    ICOM_THIS(ISHFileStream, iface);
     177
     178    DWORD dwBytesToRead, dwBytesLeft;
     179
     180    TRACE("(%p)->(%p,0x%08lx,%p)\n",This, pv, cb, pcbRead);
     181
     182    if ( !pv )
     183      return STG_E_INVALIDPOINTER;
     184
     185    dwBytesLeft = This->dwLength - This->dwPos;
     186
     187    if ( 0 >= dwBytesLeft )                     /* end of buffer */
     188      return S_FALSE;
     189
     190    dwBytesToRead = ( cb > dwBytesLeft) ? dwBytesLeft : cb;
     191
     192    memmove ( pv, (This->pImage) + (This->dwPos), dwBytesToRead);
     193
     194    This->dwPos += dwBytesToRead;                   /* adjust pointer */
     195
     196    if (pcbRead)
     197      *pcbRead = dwBytesToRead;
     198
     199    return S_OK;
    199200}
    200201static HRESULT WINAPI IStream_fnWrite (IStream * iface, const void* pv, ULONG cb, ULONG* pcbWritten)
    201202{
    202         ICOM_THIS(ISHFileStream, iface);
    203 
    204         TRACE("(%p)\n",This);
    205 
    206         return E_NOTIMPL;
     203    ICOM_THIS(ISHFileStream, iface);
     204
     205    TRACE("(%p)\n",This);
     206
     207    return E_NOTIMPL;
    207208}
    208209static HRESULT WINAPI IStream_fnSeek (IStream * iface, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER* plibNewPosition)
    209210{
    210         ICOM_THIS(ISHFileStream, iface);
    211 
    212         TRACE("(%p)\n",This);
    213 
    214         return E_NOTIMPL;
     211    ICOM_THIS(ISHFileStream, iface);
     212
     213    TRACE("(%p)\n",This);
     214
     215    return E_NOTIMPL;
    215216}
    216217static HRESULT WINAPI IStream_fnSetSize (IStream * iface, ULARGE_INTEGER libNewSize)
    217218{
    218         ICOM_THIS(ISHFileStream, iface);
    219 
    220         TRACE("(%p)\n",This);
    221 
    222         return E_NOTIMPL;
     219    ICOM_THIS(ISHFileStream, iface);
     220
     221    TRACE("(%p)\n",This);
     222
     223    return E_NOTIMPL;
    223224}
    224225static HRESULT WINAPI IStream_fnCopyTo (IStream * iface, IStream* pstm, ULARGE_INTEGER cb, ULARGE_INTEGER* pcbRead, ULARGE_INTEGER* pcbWritten)
    225226{
    226         ICOM_THIS(ISHFileStream, iface);
    227 
    228         TRACE("(%p)\n",This);
    229 
    230         return E_NOTIMPL;
     227    ICOM_THIS(ISHFileStream, iface);
     228
     229    TRACE("(%p)\n",This);
     230
     231    return E_NOTIMPL;
    231232}
    232233static HRESULT WINAPI IStream_fnCommit (IStream * iface, DWORD grfCommitFlags)
    233234{
    234         ICOM_THIS(ISHFileStream, iface);
    235 
    236         TRACE("(%p)\n",This);
    237 
    238         return E_NOTIMPL;
     235    ICOM_THIS(ISHFileStream, iface);
     236
     237    TRACE("(%p)\n",This);
     238
     239    return E_NOTIMPL;
    239240}
    240241static HRESULT WINAPI IStream_fnRevert (IStream * iface)
    241242{
    242         ICOM_THIS(ISHFileStream, iface);
    243 
    244         TRACE("(%p)\n",This);
    245 
    246         return E_NOTIMPL;
     243    ICOM_THIS(ISHFileStream, iface);
     244
     245    TRACE("(%p)\n",This);
     246
     247    return E_NOTIMPL;
    247248}
    248249static HRESULT WINAPI IStream_fnLockRegion (IStream * iface, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
    249250{
    250         ICOM_THIS(ISHFileStream, iface);
    251 
    252         TRACE("(%p)\n",This);
    253 
    254         return E_NOTIMPL;
     251    ICOM_THIS(ISHFileStream, iface);
     252
     253    TRACE("(%p)\n",This);
     254
     255    return E_NOTIMPL;
    255256}
    256257static HRESULT WINAPI IStream_fnUnlockRegion (IStream * iface, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
    257258{
    258         ICOM_THIS(ISHFileStream, iface);
    259 
    260         TRACE("(%p)\n",This);
    261 
    262         return E_NOTIMPL;
     259    ICOM_THIS(ISHFileStream, iface);
     260
     261    TRACE("(%p)\n",This);
     262
     263    return E_NOTIMPL;
    263264}
    264265static HRESULT WINAPI IStream_fnStat (IStream * iface, STATSTG*   pstatstg, DWORD grfStatFlag)
    265266{
    266         ICOM_THIS(ISHFileStream, iface);
    267 
    268         TRACE("(%p)\n",This);
    269 
    270         return E_NOTIMPL;
     267    ICOM_THIS(ISHFileStream, iface);
     268
     269    TRACE("(%p)\n",This);
     270
     271    return E_NOTIMPL;
    271272}
    272273static HRESULT WINAPI IStream_fnClone (IStream * iface, IStream** ppstm)
    273274{
    274         ICOM_THIS(ISHFileStream, iface);
    275 
    276         TRACE("(%p)\n",This);
    277 
    278         return E_NOTIMPL;
    279 }
     275    ICOM_THIS(ISHFileStream, iface);
     276
     277    TRACE("(%p)\n",This);
     278
     279    return E_NOTIMPL;
     280}
Note: See TracChangeset for help on using the changeset viewer.