1 /* 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #include "config.h" 27 #include "WebKitDLL.h" 28 #include "WebArchive.h" 29 30 #include "DOMCoreClasses.h" 31 #include "MemoryStream.h" 32 #include <WebCore/LegacyWebArchive.h> 33 34 using namespace WebCore; 35 36 // WebArchive ---------------------------------------------------------------- 37 38 WebArchive* WebArchive::createInstance() 39 { 40 WebArchive* instance = new WebArchive(0); 41 instance->AddRef(); 42 return instance; 43 } 44 45 WebArchive* WebArchive::createInstance(PassRefPtr<LegacyWebArchive> coreArchive) 46 { 47 WebArchive* instance = new WebArchive(coreArchive); 48 49 instance->AddRef(); 50 return instance; 51 } 52 53 WebArchive::WebArchive(PassRefPtr<LegacyWebArchive> coreArchive) 54 : m_refCount(0) 55 , m_archive(coreArchive) 56 { 57 gClassCount++; 58 gClassNameCount.add("WebArchive"); 59 } 60 61 WebArchive::~WebArchive() 62 { 63 gClassCount--; 64 gClassNameCount.remove("WebArchive"); 65 } 66 67 HRESULT STDMETHODCALLTYPE WebArchive::QueryInterface(REFIID riid, void** ppvObject) 68 { 69 *ppvObject = 0; 70 if (IsEqualGUID(riid, IID_IUnknown)) 71 *ppvObject = static_cast<IWebArchive*>(this); 72 else if (IsEqualGUID(riid, __uuidof(IWebArchive))) 73 *ppvObject = static_cast<IWebArchive*>(this); 74 else 75 return E_NOINTERFACE; 76 77 AddRef(); 78 return S_OK; 79 } 80 81 ULONG STDMETHODCALLTYPE WebArchive::AddRef() 82 { 83 return ++m_refCount; 84 } 85 86 ULONG STDMETHODCALLTYPE WebArchive::Release() 87 { 88 ULONG newRef = --m_refCount; 89 if (!newRef) 90 delete(this); 91 92 return newRef; 93 } 94 95 HRESULT STDMETHODCALLTYPE WebArchive::initWithMainResource( 96 /* [in] */ IWebResource*, 97 /* [in, size_is(cSubResources)] */ IWebResource**, 98 /* [in] */ int, 99 /* in, size_is(cSubFrameArchives)] */ IWebArchive**, 100 /* [in] */ int) 101 { 102 return E_NOTIMPL; 103 } 104 105 HRESULT STDMETHODCALLTYPE WebArchive::initWithData( 106 /* [in] */ IStream*) 107 { 108 return E_NOTIMPL; 109 } 110 111 HRESULT STDMETHODCALLTYPE WebArchive::initWithNode( 112 /* [in] */ IDOMNode* node) 113 { 114 if (!node) 115 return E_POINTER; 116 117 COMPtr<DOMNode> domNode(Query, node); 118 if (!domNode) 119 return E_NOINTERFACE; 120 121 m_archive = LegacyWebArchive::create(domNode->node()); 122 123 return S_OK; 124 } 125 126 HRESULT STDMETHODCALLTYPE WebArchive::mainResource( 127 /* [out, retval] */ IWebResource**) 128 { 129 return E_NOTIMPL; 130 } 131 132 HRESULT STDMETHODCALLTYPE WebArchive::subResources( 133 /* [out, retval] */ IEnumVARIANT**) 134 { 135 return E_NOTIMPL; 136 } 137 138 HRESULT STDMETHODCALLTYPE WebArchive::subframeArchives( 139 /* [out, retval] */ IEnumVARIANT**) 140 { 141 return E_NOTIMPL; 142 } 143 144 HRESULT STDMETHODCALLTYPE WebArchive::data( 145 /* [out, retval] */ IStream** stream) 146 { 147 RetainPtr<CFDataRef> cfData = m_archive->rawDataRepresentation(); 148 if (!cfData) 149 return E_FAIL; 150 151 RefPtr<SharedBuffer> buffer = SharedBuffer::create(CFDataGetBytePtr(cfData.get()), CFDataGetLength(cfData.get())); 152 153 return MemoryStream::createInstance(buffer).copyRefTo(stream); 154 } 155