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 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 14 * its contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29#include "config.h" 30#include "ArchiveFactory.h" 31 32#include "MIMETypeRegistry.h" 33 34#if ENABLE(WEB_ARCHIVE) && USE(CF) 35#include "LegacyWebArchive.h" 36#endif 37#if ENABLE(MHTML) 38#include "MHTMLArchive.h" 39#endif 40 41#include <wtf/HashMap.h> 42#include <wtf/HashSet.h> 43#include <wtf/StdLibExtras.h> 44#include <wtf/text/WTFString.h> 45 46namespace WebCore { 47 48typedef PassRefPtr<Archive> RawDataCreationFunction(const KURL&, SharedBuffer*); 49typedef HashMap<String, RawDataCreationFunction*, CaseFoldingHash> ArchiveMIMETypesMap; 50 51// The create functions in the archive classes return PassRefPtr to concrete subclasses 52// of Archive. This adaptor makes the functions have a uniform return type. 53template <typename ArchiveClass> static PassRefPtr<Archive> archiveFactoryCreate(const KURL& url, SharedBuffer* buffer) 54{ 55 return ArchiveClass::create(url, buffer); 56} 57 58static ArchiveMIMETypesMap& archiveMIMETypes() 59{ 60 DEFINE_STATIC_LOCAL(ArchiveMIMETypesMap, mimeTypes, ()); 61 static bool initialized = false; 62 63 if (initialized) 64 return mimeTypes; 65 66#if ENABLE(WEB_ARCHIVE) && USE(CF) 67 mimeTypes.set("application/x-webarchive", archiveFactoryCreate<LegacyWebArchive>); 68#endif 69#if ENABLE(MHTML) 70 mimeTypes.set("multipart/related", archiveFactoryCreate<MHTMLArchive>); 71 mimeTypes.set("application/x-mimearchive", archiveFactoryCreate<MHTMLArchive>); 72#endif 73 74 initialized = true; 75 return mimeTypes; 76} 77 78bool ArchiveFactory::isArchiveMimeType(const String& mimeType) 79{ 80 return !mimeType.isEmpty() && archiveMIMETypes().contains(mimeType); 81} 82 83PassRefPtr<Archive> ArchiveFactory::create(const KURL& url, SharedBuffer* data, const String& mimeType) 84{ 85 RawDataCreationFunction* function = mimeType.isEmpty() ? 0 : archiveMIMETypes().get(mimeType); 86 return function ? function(url, data) : PassRefPtr<Archive>(0); 87} 88 89void ArchiveFactory::registerKnownArchiveMIMETypes() 90{ 91 HashSet<String>& mimeTypes = MIMETypeRegistry::getSupportedNonImageMIMETypes(); 92 ArchiveMIMETypesMap::iterator i = archiveMIMETypes().begin(); 93 ArchiveMIMETypesMap::iterator end = archiveMIMETypes().end(); 94 95 for (; i != end; ++i) 96 mimeTypes.add(i->key); 97} 98 99} 100