webengine/osswebengine/WebKit/win/WebKitClassFactory.cpp
changeset 0 dd21522fd290
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webengine/osswebengine/WebKit/win/WebKitClassFactory.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include "config.h"
+#include "WebKitDLL.h"
+#include "WebKitClassFactory.h"
+
+#include "CFDictionaryPropertyBag.h"
+#include "WebCache.h"
+#include "WebDownload.h"
+#include "WebError.h"
+#include "WebFrame.h"
+#include "WebHistory.h"
+#include "WebHistoryItem.h"
+#include "WebIconDatabase.h"
+#include "WebJavaScriptCollector.h"
+#include "WebKit.h"
+#include "WebScrollBar.h"
+#include "WebKitStatistics.h"
+#include "WebMutableURLRequest.h"
+#include "WebNotificationCenter.h"
+#include "WebPreferences.h"
+#include "WebURLCredential.h"
+#include "WebURLProtectionSpace.h"
+#include "WebURLResponse.h"
+#include "WebDebugProgram.h"
+#include "WebView.h"
+#include <SafariTheme/SafariTheme.h>
+
+// WebKitClassFactory ---------------------------------------------------------
+
+typedef void (APIENTRY*STInitializePtr)();
+
+WebKitClassFactory::WebKitClassFactory(CLSID targetClass)
+: m_targetClass(targetClass)
+, m_refCount(0)
+{
+    static bool didInitializeSafariTheme;
+    if (!didInitializeSafariTheme) {
+        if (HMODULE module = LoadLibrary(SAFARITHEMEDLL))
+            if (STInitializePtr stInit = (STInitializePtr)GetProcAddress(module, "STInitialize"))
+                stInit();
+        didInitializeSafariTheme = true;
+    }
+
+    gClassCount++;
+}
+
+WebKitClassFactory::~WebKitClassFactory()
+{
+    gClassCount--;
+}
+
+// IUnknown -------------------------------------------------------------------
+
+HRESULT STDMETHODCALLTYPE WebKitClassFactory::QueryInterface(REFIID riid, void** ppvObject)
+{
+    *ppvObject = 0;
+    if (IsEqualGUID(riid, IID_IUnknown))
+        *ppvObject = static_cast<IUnknown*>(this);
+    else if (IsEqualGUID(riid, IID_IClassFactory))
+        *ppvObject = static_cast<IClassFactory*>(this);
+    else
+        return E_NOINTERFACE;
+
+    AddRef();
+    return S_OK;
+}
+
+ULONG STDMETHODCALLTYPE WebKitClassFactory::AddRef(void)
+{
+    return ++m_refCount;
+}
+
+ULONG STDMETHODCALLTYPE WebKitClassFactory::Release(void)
+{
+    ULONG newRef = --m_refCount;
+    if (!newRef && !gLockCount)
+        delete(this);
+
+    return newRef;
+}
+
+// IClassFactory --------------------------------------------------------------
+
+HRESULT STDMETHODCALLTYPE WebKitClassFactory::CreateInstance(IUnknown* pUnkOuter, REFIID riid, void** ppvObject)
+{
+    IUnknown* unknown = 0;
+    *ppvObject = 0;
+    
+    if (pUnkOuter)
+        return CLASS_E_NOAGGREGATION;
+
+    if (IsEqualGUID(m_targetClass, CLSID_WebView))
+        unknown = static_cast<IWebView*>(WebView::createInstance());
+    else if (IsEqualGUID(m_targetClass, CLSID_WebIconDatabase))
+        unknown = static_cast<IWebIconDatabase*>(WebIconDatabase::createInstance());
+    else if (IsEqualGUID(m_targetClass, CLSID_WebMutableURLRequest))
+        unknown = static_cast<IWebMutableURLRequest*>(WebMutableURLRequest::createInstance());
+    else if (IsEqualGUID(m_targetClass, CLSID_WebNotificationCenter))
+        unknown = static_cast<IWebNotificationCenter*>(WebNotificationCenter::createInstance());
+    else if (IsEqualGUID(m_targetClass, CLSID_WebHistory))
+        unknown = static_cast<IWebHistory*>(WebHistory::createInstance());
+    else if (IsEqualGUID(m_targetClass, CLSID_CFDictionaryPropertyBag))
+        unknown = static_cast<IPropertyBag*>(CFDictionaryPropertyBag::createInstance());
+    else if (IsEqualGUID(m_targetClass, CLSID_WebHistoryItem))
+        unknown = static_cast<IWebHistoryItem*>(WebHistoryItem::createInstance());
+    else if (IsEqualGUID(m_targetClass, CLSID_WebCache))
+        unknown = static_cast<IWebCache*>(WebCache::createInstance());
+    else if (IsEqualGUID(m_targetClass, CLSID_WebJavaScriptCollector))
+        unknown = static_cast<IWebJavaScriptCollector*>(WebJavaScriptCollector::createInstance());
+    else if (IsEqualGUID(m_targetClass, CLSID_WebPreferences))
+        unknown = static_cast<IWebPreferences*>(WebPreferences::createInstance());
+    else if (IsEqualGUID(m_targetClass, CLSID_WebScrollBar))
+        unknown = static_cast<IWebScrollBarPrivate*>(WebScrollBar::createInstance());
+    else if (IsEqualGUID(m_targetClass, CLSID_WebKitStatistics))
+        unknown = static_cast<IWebKitStatistics*>(WebKitStatistics::createInstance());
+    else if (IsEqualGUID(m_targetClass, CLSID_WebError))
+        unknown = static_cast<IWebError*>(WebError::createInstance(ResourceError()));
+    else if (IsEqualGUID(m_targetClass, CLSID_WebURLCredential))
+        unknown = static_cast<IWebURLCredential*>(WebURLCredential::createInstance());
+    else if (IsEqualGUID(m_targetClass, CLSID_WebDownload))
+        unknown = static_cast<IWebDownload*>(WebDownload::createInstance());
+    else if (IsEqualGUID(m_targetClass, CLSID_WebURLRequest))
+        unknown = static_cast<IWebURLRequest*>(WebMutableURLRequest::createImmutableInstance());
+    else if (IsEqualGUID(m_targetClass, CLSID_WebURLProtectionSpace))
+        unknown = static_cast<IWebURLProtectionSpace*>(WebURLProtectionSpace::createInstance());
+    else if (IsEqualGUID(m_targetClass, CLSID_WebDebugProgram))
+        unknown = static_cast<IWebDebugProgram*>(WebDebugProgram::createInstance());
+    else if (IsEqualGUID(m_targetClass, CLSID_WebURLResponse))
+        unknown = static_cast<IWebURLResponse*>(WebURLResponse::createInstance());
+    else
+        return CLASS_E_CLASSNOTAVAILABLE;
+
+    if (!unknown)
+        return E_OUTOFMEMORY;
+
+    HRESULT hr = unknown->QueryInterface(riid, ppvObject);
+    if (FAILED(hr))
+        delete unknown;
+    else
+        unknown->Release(); // both createInstance() and QueryInterface() added refs
+
+    return hr;
+}
+
+HRESULT STDMETHODCALLTYPE WebKitClassFactory::LockServer(BOOL fLock)
+{
+    if (fLock)
+        gLockCount++;
+    else
+        gLockCount--;
+
+    return S_OK;
+}