Ignore:
Timestamp:
Sep 15, 2001, 11:26:26 AM (24 years ago)
Author:
sandervl
Message:

restored old version

File:
1 edited

Legend:

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

    r6650 r6709  
    1 /* $Id: memorystream.c,v 1.3 2001-09-05 13:46:56 bird Exp $ */
    21/*
    3  *  this class implements a pure IStream object
    4  *  and can be used for many purposes
     2 *      this class implements a pure IStream object
     3 *      and can be used for many purposes
    54 *
    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.
     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.
    1110 */
    1211
     
    3736static HRESULT WINAPI IStream_fnClone (IStream * iface, IStream** ppstm);
    3837
    39 static 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 
     38static 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       
    5756};
    5857
    59 typedef struct
    60 {   ICOM_VTABLE(IStream)    *lpvtst;
    61     DWORD       ref;
    62     LPBYTE      pImage;
    63     HANDLE      hMapping;
    64     DWORD       dwLength;
    65     DWORD       dwPos;
     58typedef struct 
     59{       ICOM_VTABLE(IStream)    *lpvtst;
     60        DWORD           ref;
     61        LPBYTE          pImage;
     62        HANDLE          hMapping;
     63        DWORD           dwLength;
     64        DWORD           dwPos;
    6665} ISHFileStream;
    6766
     
    7372HRESULT CreateStreamOnFile (LPCSTR pszFilename, IStream ** ppstm)
    7473{
    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 
    102 end_3:  CloseHandle(fstr->hMapping);
    103 end_2:  HeapFree(GetProcessHeap(), 0, fstr);
    104     fstr = NULL;
    105 
    106 end_1:  _lclose(hFile);
    107     (*ppstm) = (IStream*)fstr;
    108     return ret;
     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       
     101end_3:  CloseHandle(fstr->hMapping);
     102end_2:  HeapFree(GetProcessHeap(), 0, fstr);
     103        fstr = NULL;
     104
     105end_1:  _lclose(hFile);
     106        (*ppstm) = (IStream*)fstr;
     107        return ret;
    109108}
    110109
     
    114113static HRESULT WINAPI IStream_fnQueryInterface(IStream *iface, REFIID riid, LPVOID *ppvObj)
    115114{
    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;
     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;
    136135}
    137136
     
    141140static ULONG WINAPI IStream_fnAddRef(IStream *iface)
    142141{
    143     ICOM_THIS(ISHFileStream, iface);
    144 
    145     TRACE("(%p)->(count=%lu)\n",This, This->ref);
    146 
    147     shell32_ObjCount++;
    148     return ++(This->ref);
     142        ICOM_THIS(ISHFileStream, iface);
     143
     144        TRACE("(%p)->(count=%lu)\n",This, This->ref);
     145
     146        shell32_ObjCount++;
     147        return ++(This->ref);
    149148}
    150149
     
    154153static ULONG WINAPI IStream_fnRelease(IStream *iface)
    155154{
    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;
     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;
    172171}
    173172
    174173static HRESULT WINAPI IStream_fnRead (IStream * iface, void* pv, ULONG cb, ULONG* pcbRead)
    175174{
    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;
     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;
    200199}
    201200static HRESULT WINAPI IStream_fnWrite (IStream * iface, const void* pv, ULONG cb, ULONG* pcbWritten)
    202201{
    203     ICOM_THIS(ISHFileStream, iface);
    204 
    205     TRACE("(%p)\n",This);
    206 
    207     return E_NOTIMPL;
     202        ICOM_THIS(ISHFileStream, iface);
     203
     204        TRACE("(%p)\n",This);
     205
     206        return E_NOTIMPL;
    208207}
    209208static HRESULT WINAPI IStream_fnSeek (IStream * iface, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER* plibNewPosition)
    210209{
    211     ICOM_THIS(ISHFileStream, iface);
    212 
    213     TRACE("(%p)\n",This);
    214 
    215     return E_NOTIMPL;
     210        ICOM_THIS(ISHFileStream, iface);
     211
     212        TRACE("(%p)\n",This);
     213
     214        return E_NOTIMPL;
    216215}
    217216static HRESULT WINAPI IStream_fnSetSize (IStream * iface, ULARGE_INTEGER libNewSize)
    218217{
    219     ICOM_THIS(ISHFileStream, iface);
    220 
    221     TRACE("(%p)\n",This);
    222 
    223     return E_NOTIMPL;
     218        ICOM_THIS(ISHFileStream, iface);
     219
     220        TRACE("(%p)\n",This);
     221
     222        return E_NOTIMPL;
    224223}
    225224static HRESULT WINAPI IStream_fnCopyTo (IStream * iface, IStream* pstm, ULARGE_INTEGER cb, ULARGE_INTEGER* pcbRead, ULARGE_INTEGER* pcbWritten)
    226225{
    227     ICOM_THIS(ISHFileStream, iface);
    228 
    229     TRACE("(%p)\n",This);
    230 
    231     return E_NOTIMPL;
     226        ICOM_THIS(ISHFileStream, iface);
     227
     228        TRACE("(%p)\n",This);
     229
     230        return E_NOTIMPL;
    232231}
    233232static HRESULT WINAPI IStream_fnCommit (IStream * iface, DWORD grfCommitFlags)
    234233{
    235     ICOM_THIS(ISHFileStream, iface);
    236 
    237     TRACE("(%p)\n",This);
    238 
    239     return E_NOTIMPL;
     234        ICOM_THIS(ISHFileStream, iface);
     235
     236        TRACE("(%p)\n",This);
     237
     238        return E_NOTIMPL;
    240239}
    241240static HRESULT WINAPI IStream_fnRevert (IStream * iface)
    242241{
    243     ICOM_THIS(ISHFileStream, iface);
    244 
    245     TRACE("(%p)\n",This);
    246 
    247     return E_NOTIMPL;
     242        ICOM_THIS(ISHFileStream, iface);
     243
     244        TRACE("(%p)\n",This);
     245
     246        return E_NOTIMPL;
    248247}
    249248static HRESULT WINAPI IStream_fnLockRegion (IStream * iface, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
    250249{
    251     ICOM_THIS(ISHFileStream, iface);
    252 
    253     TRACE("(%p)\n",This);
    254 
    255     return E_NOTIMPL;
     250        ICOM_THIS(ISHFileStream, iface);
     251
     252        TRACE("(%p)\n",This);
     253
     254        return E_NOTIMPL;
    256255}
    257256static HRESULT WINAPI IStream_fnUnlockRegion (IStream * iface, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
    258257{
    259     ICOM_THIS(ISHFileStream, iface);
    260 
    261     TRACE("(%p)\n",This);
    262 
    263     return E_NOTIMPL;
     258        ICOM_THIS(ISHFileStream, iface);
     259
     260        TRACE("(%p)\n",This);
     261
     262        return E_NOTIMPL;
    264263}
    265264static HRESULT WINAPI IStream_fnStat (IStream * iface, STATSTG*   pstatstg, DWORD grfStatFlag)
    266265{
    267     ICOM_THIS(ISHFileStream, iface);
    268 
    269     TRACE("(%p)\n",This);
    270 
    271     return E_NOTIMPL;
     266        ICOM_THIS(ISHFileStream, iface);
     267
     268        TRACE("(%p)\n",This);
     269
     270        return E_NOTIMPL;
    272271}
    273272static HRESULT WINAPI IStream_fnClone (IStream * iface, IStream** ppstm)
    274273{
    275     ICOM_THIS(ISHFileStream, iface);
    276 
    277     TRACE("(%p)\n",This);
    278 
    279     return E_NOTIMPL;
    280 }
     274        ICOM_THIS(ISHFileStream, iface);
     275
     276        TRACE("(%p)\n",This);
     277
     278        return E_NOTIMPL;
     279}
Note: See TracChangeset for help on using the changeset viewer.