SkIStream.cpp revision 80bacfeb4bda06541e8695bd502229727bccfeab
1fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek
2b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek/*
3b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek * Copyright 2011 Google Inc.
4b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek *
5b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek * Use of this source code is governed by a BSD-style license that can be
6b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek * found in the LICENSE file.
7b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek */
8b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek
9b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek
10fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek#define WIN32_LEAN_AND_MEAN
11fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek#include <Windows.h>
12b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek#include <ole2.h>
13b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek#include "SkIStream.h"
14b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek#include "SkStream.h"
15fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek
16fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek/**
17b315a3940f804cf9fc67f4e3314aac6a44d623eeTed Kremenek * SkBaseIStream
18991c54b9b7409656e5593364e065878b5210d556Ted Kremenek */
19991c54b9b7409656e5593364e065878b5210d556Ted KremenekSkBaseIStream::SkBaseIStream() : _refcount(1) { }
20ddf32dabe71f00aa0943449f67201f587f0a04d6Ted KremenekSkBaseIStream::~SkBaseIStream() { }
212ec5cd553542ec54652fb2ae2395e46795b1af84Ted Kremenek
222ec5cd553542ec54652fb2ae2395e46795b1af84Ted KremenekHRESULT STDMETHODCALLTYPE SkBaseIStream::QueryInterface(REFIID iid
232ec5cd553542ec54652fb2ae2395e46795b1af84Ted Kremenek                                                      , void ** ppvObject)
24ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek{
25ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek    if (NULL == ppvObject) {
26ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek        return E_INVALIDARG;
27ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek    }
28ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek    if (iid == __uuidof(IUnknown)
29ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek        || iid == __uuidof(IStream)
30ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek        || iid == __uuidof(ISequentialStream))
31ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek    {
32ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek        *ppvObject = static_cast<IStream*>(this);
33ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek        AddRef();
34991c54b9b7409656e5593364e065878b5210d556Ted Kremenek        return S_OK;
35991c54b9b7409656e5593364e065878b5210d556Ted Kremenek    } else {
36991c54b9b7409656e5593364e065878b5210d556Ted Kremenek        *ppvObject = NULL;
37991c54b9b7409656e5593364e065878b5210d556Ted Kremenek        return E_NOINTERFACE;
38991c54b9b7409656e5593364e065878b5210d556Ted Kremenek    }
39991c54b9b7409656e5593364e065878b5210d556Ted Kremenek}
40991c54b9b7409656e5593364e065878b5210d556Ted Kremenek
41991c54b9b7409656e5593364e065878b5210d556Ted KremenekULONG STDMETHODCALLTYPE SkBaseIStream::AddRef(void) {
42991c54b9b7409656e5593364e065878b5210d556Ted Kremenek    return (ULONG)InterlockedIncrement(&_refcount);
43991c54b9b7409656e5593364e065878b5210d556Ted Kremenek}
445daa3be1bf9db399aa7510bbcf2bfc8c7701b6daTed Kremenek
45938eef139ad43345248235da31f78a759dd18f13Ted KremenekULONG STDMETHODCALLTYPE SkBaseIStream::Release(void) {
465daa3be1bf9db399aa7510bbcf2bfc8c7701b6daTed Kremenek    ULONG res = (ULONG) InterlockedDecrement(&_refcount);
475d31f83bbe990aeb070ce6c8d919d229d4eb5052Ted Kremenek    if (0 == res) {
48c3998fa64e254b13669e8cf3a0cf23eb4f73b88bTed Kremenek        delete this;
49938eef139ad43345248235da31f78a759dd18f13Ted Kremenek    }
50991c54b9b7409656e5593364e065878b5210d556Ted Kremenek    return res;
515daa3be1bf9db399aa7510bbcf2bfc8c7701b6daTed Kremenek}
525daa3be1bf9db399aa7510bbcf2bfc8c7701b6daTed Kremenek
53938eef139ad43345248235da31f78a759dd18f13Ted Kremenek// ISequentialStream Interface
54938eef139ad43345248235da31f78a759dd18f13Ted KremenekHRESULT STDMETHODCALLTYPE SkBaseIStream::Read(void* pv
55938eef139ad43345248235da31f78a759dd18f13Ted Kremenek                                            , ULONG cb
56938eef139ad43345248235da31f78a759dd18f13Ted Kremenek                                            , ULONG* pcbRead)
57938eef139ad43345248235da31f78a759dd18f13Ted Kremenek{ return E_NOTIMPL; }
58938eef139ad43345248235da31f78a759dd18f13Ted Kremenek
59c3998fa64e254b13669e8cf3a0cf23eb4f73b88bTed KremenekHRESULT STDMETHODCALLTYPE SkBaseIStream::Write(void const* pv
60c3998fa64e254b13669e8cf3a0cf23eb4f73b88bTed Kremenek                                             , ULONG cb
615daa3be1bf9db399aa7510bbcf2bfc8c7701b6daTed Kremenek                                             , ULONG* pcbWritten)
625daa3be1bf9db399aa7510bbcf2bfc8c7701b6daTed Kremenek{ return E_NOTIMPL; }
635daa3be1bf9db399aa7510bbcf2bfc8c7701b6daTed Kremenek
64991c54b9b7409656e5593364e065878b5210d556Ted Kremenek// IStream Interface
652ec5cd553542ec54652fb2ae2395e46795b1af84Ted KremenekHRESULT STDMETHODCALLTYPE SkBaseIStream::SetSize(ULARGE_INTEGER)
66991c54b9b7409656e5593364e065878b5210d556Ted Kremenek{ return E_NOTIMPL; }
67c3998fa64e254b13669e8cf3a0cf23eb4f73b88bTed Kremenek
68c3998fa64e254b13669e8cf3a0cf23eb4f73b88bTed KremenekHRESULT STDMETHODCALLTYPE SkBaseIStream::CopyTo(IStream*
69c3998fa64e254b13669e8cf3a0cf23eb4f73b88bTed Kremenek                                              , ULARGE_INTEGER
70c3998fa64e254b13669e8cf3a0cf23eb4f73b88bTed Kremenek                                              , ULARGE_INTEGER*
71c3998fa64e254b13669e8cf3a0cf23eb4f73b88bTed Kremenek                                              , ULARGE_INTEGER*)
72c3998fa64e254b13669e8cf3a0cf23eb4f73b88bTed Kremenek{ return E_NOTIMPL; }
73c3998fa64e254b13669e8cf3a0cf23eb4f73b88bTed Kremenek
7482a1253077cd0832e4d347062b911cd305ab62d1Ted KremenekHRESULT STDMETHODCALLTYPE SkBaseIStream::Commit(DWORD)
755f2825f6fa24a792c11cf96accd76538a2fd951eTed Kremenek{ return E_NOTIMPL; }
765d31f83bbe990aeb070ce6c8d919d229d4eb5052Ted Kremenek
772dd7ad13bbbd43cb940040725a30cb7789bd2774Ted KremenekHRESULT STDMETHODCALLTYPE SkBaseIStream::Revert(void)
78991c54b9b7409656e5593364e065878b5210d556Ted Kremenek{ return E_NOTIMPL; }
7982a1253077cd0832e4d347062b911cd305ab62d1Ted Kremenek
8082a1253077cd0832e4d347062b911cd305ab62d1Ted KremenekHRESULT STDMETHODCALLTYPE SkBaseIStream::LockRegion(ULARGE_INTEGER
819f9b1fded49acff77e61b3ed1afc8bbaaefe6f34Ted Kremenek                                                  , ULARGE_INTEGER
82938eef139ad43345248235da31f78a759dd18f13Ted Kremenek                                                  , DWORD)
83991c54b9b7409656e5593364e065878b5210d556Ted Kremenek{ return E_NOTIMPL; }
84b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek
85fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted KremenekHRESULT STDMETHODCALLTYPE SkBaseIStream::UnlockRegion(ULARGE_INTEGER
86fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek                                                    , ULARGE_INTEGER
87fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek                                                    , DWORD)
88b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek{ return E_NOTIMPL; }
89fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek
90fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted KremenekHRESULT STDMETHODCALLTYPE SkBaseIStream::Clone(IStream **)
91d389465f426069115a35e857ef11f1fcc5a2f69cSeo Sanghyeon{ return E_NOTIMPL; }
92fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek
93fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted KremenekHRESULT STDMETHODCALLTYPE SkBaseIStream::Seek(LARGE_INTEGER liDistanceToMove
945d31f83bbe990aeb070ce6c8d919d229d4eb5052Ted Kremenek                                            , DWORD dwOrigin
95fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek                                            , ULARGE_INTEGER* lpNewFilePointer)
96fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek{ return E_NOTIMPL; }
97fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek
98991c54b9b7409656e5593364e065878b5210d556Ted KremenekHRESULT STDMETHODCALLTYPE SkBaseIStream::Stat(STATSTG* pStatstg
99fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek                                            , DWORD grfStatFlag)
100fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek{ return E_NOTIMPL; }
101fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek
102fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek
103fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek/**
104fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek * SkIStream
105fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek */
106fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted KremenekSkIStream::SkIStream(SkStream* stream, bool unrefOnRelease)
107991c54b9b7409656e5593364e065878b5210d556Ted Kremenek    : SkBaseIStream()
108fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek    , fSkStream(stream)
109fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek    , fUnrefOnRelease(unrefOnRelease)
110fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek    , fLocation()
111fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek{
112fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek    this->fSkStream->rewind();
113991c54b9b7409656e5593364e065878b5210d556Ted Kremenek}
114938eef139ad43345248235da31f78a759dd18f13Ted Kremenek
115938eef139ad43345248235da31f78a759dd18f13Ted KremenekSkIStream::~SkIStream() {
116938eef139ad43345248235da31f78a759dd18f13Ted Kremenek    if (NULL != this->fSkStream && fUnrefOnRelease) {
117a2bdaf53223eed00c4b33e2a8ef42ef64c4479aaTed Kremenek        this->fSkStream->unref();
118991c54b9b7409656e5593364e065878b5210d556Ted Kremenek    }
119fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek}
120fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek
121fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted KremenekHRESULT SkIStream::CreateFromSkStream(SkStream* stream
122fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek                                    , bool unrefOnRelease
123fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek                                    , IStream ** ppStream)
12461cd988a7eaadd4b81c63a18a4733bf31399b66cTed Kremenek{
125fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek    *ppStream = new SkIStream(stream, unrefOnRelease);
126fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek    return S_OK;
127fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek}
128fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek
129fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek// ISequentialStream Interface
130fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted KremenekHRESULT STDMETHODCALLTYPE SkIStream::Read(void* pv, ULONG cb, ULONG* pcbRead) {
131fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek    *pcbRead = this->fSkStream->read(pv, cb);
132fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek    this->fLocation.QuadPart += *pcbRead;
13361cd988a7eaadd4b81c63a18a4733bf31399b66cTed Kremenek    return (*pcbRead == cb) ? S_OK : S_FALSE;
13461cd988a7eaadd4b81c63a18a4733bf31399b66cTed Kremenek}
135fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek
136fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted KremenekHRESULT STDMETHODCALLTYPE SkIStream::Write(void const* pv
137fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek                                         , ULONG cb
138fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek                                         , ULONG* pcbWritten)
139fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek{
140fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek    return STG_E_CANTSAVE;
14161cd988a7eaadd4b81c63a18a4733bf31399b66cTed Kremenek}
142ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek
143ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek// IStream Interface
144ddf32dabe71f00aa0943449f67201f587f0a04d6Ted KremenekHRESULT STDMETHODCALLTYPE SkIStream::Seek(LARGE_INTEGER liDistanceToMove
145ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek                                        , DWORD dwOrigin
146ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek                                        , ULARGE_INTEGER* lpNewFilePointer)
147ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek{
148ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek    HRESULT hr = S_OK;
149ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek
150ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek    switch(dwOrigin) {
151fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek    case STREAM_SEEK_SET: {
152948e06babdf81033517b54910fedda8079f29ff9Ted Kremenek        if (!this->fSkStream->rewind()) {
153948e06babdf81033517b54910fedda8079f29ff9Ted Kremenek            hr = E_FAIL;
154948e06babdf81033517b54910fedda8079f29ff9Ted Kremenek        } else {
155948e06babdf81033517b54910fedda8079f29ff9Ted Kremenek            size_t skipped = this->fSkStream->skip(
156991c54b9b7409656e5593364e065878b5210d556Ted Kremenek                static_cast<size_t>(liDistanceToMove.QuadPart)
1579a3c7dae00402a60a9dbe918e310214c92c5baebTed Kremenek            );
1589a3c7dae00402a60a9dbe918e310214c92c5baebTed Kremenek            this->fLocation.QuadPart = skipped;
1599a3c7dae00402a60a9dbe918e310214c92c5baebTed Kremenek            if (skipped != liDistanceToMove.QuadPart) {
1609a3c7dae00402a60a9dbe918e310214c92c5baebTed Kremenek                hr = E_FAIL;
1611346268d7f44551ab63e25dbbf5e3ae9402708c5Ted Kremenek            }
1629a3c7dae00402a60a9dbe918e310214c92c5baebTed Kremenek        }
1639a3c7dae00402a60a9dbe918e310214c92c5baebTed Kremenek        break;
1641346268d7f44551ab63e25dbbf5e3ae9402708c5Ted Kremenek    }
1651346268d7f44551ab63e25dbbf5e3ae9402708c5Ted Kremenek    case STREAM_SEEK_CUR: {
1661346268d7f44551ab63e25dbbf5e3ae9402708c5Ted Kremenek        size_t skipped = this->fSkStream->skip(
1679a3c7dae00402a60a9dbe918e310214c92c5baebTed Kremenek            static_cast<size_t>(liDistanceToMove.QuadPart)
1689a3c7dae00402a60a9dbe918e310214c92c5baebTed Kremenek        );
1691346268d7f44551ab63e25dbbf5e3ae9402708c5Ted Kremenek        this->fLocation.QuadPart += skipped;
1701346268d7f44551ab63e25dbbf5e3ae9402708c5Ted Kremenek        if (skipped != liDistanceToMove.QuadPart) {
1711346268d7f44551ab63e25dbbf5e3ae9402708c5Ted Kremenek            hr = E_FAIL;
1721346268d7f44551ab63e25dbbf5e3ae9402708c5Ted Kremenek        }
1731346268d7f44551ab63e25dbbf5e3ae9402708c5Ted Kremenek        break;
1741346268d7f44551ab63e25dbbf5e3ae9402708c5Ted Kremenek    }
1751346268d7f44551ab63e25dbbf5e3ae9402708c5Ted Kremenek    case STREAM_SEEK_END: {
1761346268d7f44551ab63e25dbbf5e3ae9402708c5Ted Kremenek        if (!this->fSkStream->rewind()) {
1771346268d7f44551ab63e25dbbf5e3ae9402708c5Ted Kremenek            hr = E_FAIL;
1781346268d7f44551ab63e25dbbf5e3ae9402708c5Ted Kremenek        } else {
1799a3c7dae00402a60a9dbe918e310214c92c5baebTed Kremenek            LONGLONG skip = this->fSkStream->getLength()
1809a3c7dae00402a60a9dbe918e310214c92c5baebTed Kremenek                          + liDistanceToMove.QuadPart;
1819a3c7dae00402a60a9dbe918e310214c92c5baebTed Kremenek            size_t skipped = this->fSkStream->skip(static_cast<size_t>(skip));
1829a3c7dae00402a60a9dbe918e310214c92c5baebTed Kremenek            this->fLocation.QuadPart = skipped;
183c3998fa64e254b13669e8cf3a0cf23eb4f73b88bTed Kremenek            if (skipped != skip) {
1849a3c7dae00402a60a9dbe918e310214c92c5baebTed Kremenek                hr = E_FAIL;
1859a3c7dae00402a60a9dbe918e310214c92c5baebTed Kremenek            }
1869a3c7dae00402a60a9dbe918e310214c92c5baebTed Kremenek        }
1875de4092946373af0c8caca64a281e8080c9d8a34Ted Kremenek        break;
1885de4092946373af0c8caca64a281e8080c9d8a34Ted Kremenek    }
1895de4092946373af0c8caca64a281e8080c9d8a34Ted Kremenek    default:
1905de4092946373af0c8caca64a281e8080c9d8a34Ted Kremenek        hr = STG_E_INVALIDFUNCTION;
1919a3c7dae00402a60a9dbe918e310214c92c5baebTed Kremenek        break;
192938eef139ad43345248235da31f78a759dd18f13Ted Kremenek    }
193938eef139ad43345248235da31f78a759dd18f13Ted Kremenek
194938eef139ad43345248235da31f78a759dd18f13Ted Kremenek    if (NULL != lpNewFilePointer) {
195938eef139ad43345248235da31f78a759dd18f13Ted Kremenek        lpNewFilePointer->QuadPart = this->fLocation.QuadPart;
196938eef139ad43345248235da31f78a759dd18f13Ted Kremenek    }
197938eef139ad43345248235da31f78a759dd18f13Ted Kremenek    return hr;
198938eef139ad43345248235da31f78a759dd18f13Ted Kremenek}
199938eef139ad43345248235da31f78a759dd18f13Ted Kremenek
200938eef139ad43345248235da31f78a759dd18f13Ted KremenekHRESULT STDMETHODCALLTYPE SkIStream::Stat(STATSTG* pStatstg
201938eef139ad43345248235da31f78a759dd18f13Ted Kremenek                                        , DWORD grfStatFlag)
202938eef139ad43345248235da31f78a759dd18f13Ted Kremenek{
203938eef139ad43345248235da31f78a759dd18f13Ted Kremenek    if (0 == (grfStatFlag & STATFLAG_NONAME)) {
2047e5bd6f061c549dca0c1aeedfdd4009b853264eaTed Kremenek        return STG_E_INVALIDFLAG;
2057e5bd6f061c549dca0c1aeedfdd4009b853264eaTed Kremenek    }
2067e5bd6f061c549dca0c1aeedfdd4009b853264eaTed Kremenek    pStatstg->pwcsName = NULL;
2077e5bd6f061c549dca0c1aeedfdd4009b853264eaTed Kremenek    pStatstg->cbSize.QuadPart = this->fSkStream->getLength();
2087e5bd6f061c549dca0c1aeedfdd4009b853264eaTed Kremenek    pStatstg->clsid = CLSID_NULL;
2097e5bd6f061c549dca0c1aeedfdd4009b853264eaTed Kremenek    pStatstg->type = STGTY_STREAM;
2107e5bd6f061c549dca0c1aeedfdd4009b853264eaTed Kremenek    pStatstg->grfMode = STGM_READ;
2117e5bd6f061c549dca0c1aeedfdd4009b853264eaTed Kremenek    return S_OK;
212938eef139ad43345248235da31f78a759dd18f13Ted Kremenek}
213938eef139ad43345248235da31f78a759dd18f13Ted Kremenek
214938eef139ad43345248235da31f78a759dd18f13Ted Kremenek
215938eef139ad43345248235da31f78a759dd18f13Ted Kremenek/**
216938eef139ad43345248235da31f78a759dd18f13Ted Kremenek * SkIWStream
217938eef139ad43345248235da31f78a759dd18f13Ted Kremenek */
218938eef139ad43345248235da31f78a759dd18f13Ted KremenekSkWIStream::SkWIStream(SkWStream* stream)
219938eef139ad43345248235da31f78a759dd18f13Ted Kremenek    : SkBaseIStream()
220938eef139ad43345248235da31f78a759dd18f13Ted Kremenek    , fSkWStream(stream)
2217e5bd6f061c549dca0c1aeedfdd4009b853264eaTed Kremenek{ }
222938eef139ad43345248235da31f78a759dd18f13Ted Kremenek
223938eef139ad43345248235da31f78a759dd18f13Ted KremenekSkWIStream::~SkWIStream() {
224938eef139ad43345248235da31f78a759dd18f13Ted Kremenek    if (NULL != this->fSkWStream) {
225938eef139ad43345248235da31f78a759dd18f13Ted Kremenek        this->fSkWStream->flush();
226938eef139ad43345248235da31f78a759dd18f13Ted Kremenek    }
227938eef139ad43345248235da31f78a759dd18f13Ted Kremenek}
2289a3c7dae00402a60a9dbe918e310214c92c5baebTed Kremenek
2299a3c7dae00402a60a9dbe918e310214c92c5baebTed KremenekHRESULT SkWIStream::CreateFromSkWStream(SkWStream* stream
230fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek                                      , IStream ** ppStream)
231fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek{
232fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek    *ppStream = new SkWIStream(stream);
233fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek    return S_OK;
234fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek}
235fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek
236fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek// ISequentialStream Interface
237fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted KremenekHRESULT STDMETHODCALLTYPE SkWIStream::Write(void const* pv
23806c58b191f969e2ae5308cc9b6540bad9511f4efAnders Carlsson                                          , ULONG cb
239fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek                                          , ULONG* pcbWritten)
2406c4312d17015755213a8e1c1003517f94786dfa4Ted Kremenek{
2416c4312d17015755213a8e1c1003517f94786dfa4Ted Kremenek    HRESULT hr = S_OK;
242fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek    bool wrote = this->fSkWStream->write(pv, cb);
243fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek    if (wrote) {
244fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek        *pcbWritten = cb;
245fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek    } else {
246fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek        *pcbWritten = 0;
247fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek        hr = S_FALSE;
248fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek    }
249fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek    return hr;
250fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek}
251fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek
252fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek// IStream Interface
253fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted KremenekHRESULT STDMETHODCALLTYPE SkWIStream::Commit(DWORD) {
254fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek    this->fSkWStream->flush();
255fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek    return S_OK;
256fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek}
257fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek
258e4f6952831d2b42b99f4a28825e87012d93eb8c0Ted KremenekHRESULT STDMETHODCALLTYPE SkWIStream::Stat(STATSTG* pStatstg
259b10362acd971b84d4525334b275fcbfb4e42cb85Ted Kremenek                                         , DWORD grfStatFlag)
2608d33cd77dc1086f70f1699ea012702d0df7eba1aDaniel Dunbar{
2618d33cd77dc1086f70f1699ea012702d0df7eba1aDaniel Dunbar    if (0 == (grfStatFlag & STATFLAG_NONAME)) {
262fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek        return STG_E_INVALIDFLAG;
263fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek    }
264fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek    pStatstg->pwcsName = NULL;
265940260996dfae2b6acd0466c1519b8e5083bed83Ted Kremenek    pStatstg->cbSize.QuadPart = 0;
266940260996dfae2b6acd0466c1519b8e5083bed83Ted Kremenek    pStatstg->clsid = CLSID_NULL;
267940260996dfae2b6acd0466c1519b8e5083bed83Ted Kremenek    pStatstg->type = STGTY_STREAM;
268fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek    pStatstg->grfMode = STGM_WRITE;
269fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek    return S_OK;
270fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek}
271fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek