2 * Copyright (C) 2007 Apple Inc. All rights reserved.
\r
4 * Redistribution and use in source and binary forms, with or without
\r
5 * modification, are permitted provided that the following conditions
\r
8 * 1. Redistributions of source code must retain the above copyright
\r
9 * notice, this list of conditions and the following disclaimer.
\r
10 * 2. Redistributions in binary form must reproduce the above copyright
\r
11 * notice, this list of conditions and the following disclaimer in the
\r
12 * documentation and/or other materials provided with the distribution.
\r
13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
\r
14 * its contributors may be used to endorse or promote products derived
\r
15 * from this software without specific prior written permission.
\r
17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
\r
18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
\r
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
\r
20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
\r
21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
\r
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
\r
23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
\r
24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
\r
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
\r
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\r
29 #include "WebDatabaseManager.h"
\r
30 #include "WebKitDLL.h"
\r
32 #include "COMEnumVariant.h"
\r
33 #include "WebSecurityOrigin.h"
\r
35 #include <WebCore/BString.h>
\r
36 #include <WebCore/COMPtr.h>
\r
37 #include <WebCore/DatabaseTracker.h>
\r
38 #include <WebCore/FileSystem.h>
\r
39 #include <WebCore/SecurityOriginData.h>
\r
41 using namespace WebCore;
\r
43 static inline bool isEqual(LPCWSTR s1, LPCWSTR s2)
45 return !wcscmp(s1, s2);
48 class DatabaseDetailsPropertyBag : public IPropertyBag, Noncopyable {
\r
50 static DatabaseDetailsPropertyBag* createInstance(const DatabaseDetails&);
\r
53 virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);
\r
54 virtual ULONG STDMETHODCALLTYPE AddRef();
\r
55 virtual ULONG STDMETHODCALLTYPE Release();
\r
58 virtual HRESULT STDMETHODCALLTYPE Read(LPCOLESTR pszPropName, VARIANT* pVar, IErrorLog* pErrorLog);
\r
59 virtual HRESULT STDMETHODCALLTYPE Write(LPCOLESTR pszPropName, VARIANT* pVar);
\r
61 DatabaseDetailsPropertyBag(const DatabaseDetails& details)
\r
63 , m_details(details) { }
\r
64 ~DatabaseDetailsPropertyBag() { }
\r
67 DatabaseDetails m_details;
\r
70 // DatabaseDetailsPropertyBag ------------------------------------------------------
\r
71 DatabaseDetailsPropertyBag* DatabaseDetailsPropertyBag::createInstance(const DatabaseDetails& details)
\r
73 DatabaseDetailsPropertyBag* instance = new DatabaseDetailsPropertyBag(details);
\r
78 // IUnknown ------------------------------------------------------------------------
\r
79 ULONG STDMETHODCALLTYPE DatabaseDetailsPropertyBag::AddRef()
\r
81 return ++m_refCount;
\r
84 ULONG STDMETHODCALLTYPE DatabaseDetailsPropertyBag::Release()
\r
86 ULONG newRef = --m_refCount;
\r
93 HRESULT STDMETHODCALLTYPE DatabaseDetailsPropertyBag::QueryInterface(REFIID riid, void** ppvObject)
\r
96 if (IsEqualGUID(riid, IID_IUnknown))
\r
97 *ppvObject = static_cast<DatabaseDetailsPropertyBag*>(this);
\r
98 else if (IsEqualGUID(riid, IID_IPropertyBag))
\r
99 *ppvObject = static_cast<DatabaseDetailsPropertyBag*>(this);
\r
101 return E_NOINTERFACE;
\r
107 // IPropertyBag --------------------------------------------------------------------
\r
108 HRESULT STDMETHODCALLTYPE DatabaseDetailsPropertyBag::Read(LPCOLESTR pszPropName, VARIANT* pVar, IErrorLog*)
\r
110 if (!pszPropName || !pVar)
\r
115 if (isEqual(pszPropName, WebDatabaseDisplayNameKey)) {
\r
116 COMVariantSetter<String>::setVariant(pVar, m_details.displayName());
\r
118 } else if (isEqual(pszPropName, WebDatabaseExpectedSizeKey)) {
\r
119 COMVariantSetter<unsigned long long>::setVariant(pVar, m_details.expectedUsage());
\r
121 } else if (isEqual(pszPropName, WebDatabaseUsageKey)) {
\r
122 COMVariantSetter<unsigned long long>::setVariant(pVar, m_details.currentUsage());
\r
126 return E_INVALIDARG;
\r
129 HRESULT STDMETHODCALLTYPE DatabaseDetailsPropertyBag::Write(LPCOLESTR pszPropName, VARIANT* pVar)
\r
131 if (!pszPropName || !pVar)
\r
137 static COMPtr<WebDatabaseManager> s_sharedWebDatabaseManager;
\r
139 // WebDatabaseManager --------------------------------------------------------------
\r
140 WebDatabaseManager* WebDatabaseManager::createInstance()
\r
142 WebDatabaseManager* manager = new WebDatabaseManager();
\r
147 WebDatabaseManager::WebDatabaseManager()
\r
153 WebDatabaseManager::~WebDatabaseManager()
\r
158 // IUnknown ------------------------------------------------------------------------
\r
159 HRESULT STDMETHODCALLTYPE WebDatabaseManager::QueryInterface(REFIID riid, void** ppvObject)
\r
162 if (IsEqualGUID(riid, IID_IUnknown))
\r
163 *ppvObject = static_cast<WebDatabaseManager*>(this);
\r
164 else if (IsEqualGUID(riid, IID_IWebDatabaseManager))
\r
165 *ppvObject = static_cast<WebDatabaseManager*>(this);
\r
167 return E_NOINTERFACE;
\r
173 ULONG STDMETHODCALLTYPE WebDatabaseManager::AddRef()
\r
175 return ++m_refCount;
\r
178 ULONG STDMETHODCALLTYPE WebDatabaseManager::Release()
\r
180 ULONG newRef = --m_refCount;
\r
187 template<> struct COMVariantSetter<SecurityOriginData> : COMIUnknownVariantSetter<WebSecurityOrigin, SecurityOriginData> {};
\r
189 // IWebDatabaseManager -------------------------------------------------------------
\r
190 HRESULT STDMETHODCALLTYPE WebDatabaseManager::sharedWebDatabaseManager(
\r
191 /* [retval][out] */ IWebDatabaseManager** result)
\r
193 if (!s_sharedWebDatabaseManager)
\r
194 s_sharedWebDatabaseManager.adoptRef(WebDatabaseManager::createInstance());
\r
196 return s_sharedWebDatabaseManager.copyRefTo(result);
\r
199 HRESULT STDMETHODCALLTYPE WebDatabaseManager::origins(
\r
200 /* [retval][out] */ IEnumVARIANT** result)
\r
207 if (this != s_sharedWebDatabaseManager)
\r
210 Vector<SecurityOriginData> origins;
\r
211 DatabaseTracker::tracker().origins(origins);
\r
212 COMPtr<COMEnumVariant<Vector<SecurityOriginData> > > enumVariant(AdoptCOM, COMEnumVariant<Vector<SecurityOriginData> >::adopt(origins));
\r
214 *result = enumVariant.releaseRef();
\r
218 HRESULT STDMETHODCALLTYPE WebDatabaseManager::databasesWithOrigin(
\r
219 /* [in] */ IWebSecurityOrigin* origin,
\r
220 /* [retval][out] */ IEnumVARIANT** result)
\r
222 if (!origin || !result)
\r
227 if (this != s_sharedWebDatabaseManager)
\r
230 COMPtr<WebSecurityOrigin> webSecurityOrigin(Query, origin);
\r
231 if (!webSecurityOrigin)
\r
234 Vector<String> databaseNames;
\r
235 DatabaseTracker::tracker().databaseNamesForOrigin(webSecurityOrigin->securityOriginData(), databaseNames);
\r
237 COMPtr<COMEnumVariant<Vector<String> > > enumVariant(AdoptCOM, COMEnumVariant<Vector<String> >::adopt(databaseNames));
\r
239 *result = enumVariant.releaseRef();
\r
243 HRESULT STDMETHODCALLTYPE WebDatabaseManager::detailsForDatabaseWithOrigin(
\r
244 /* [in] */ BSTR databaseName,
\r
245 /* [in] */ IWebSecurityOrigin* origin,
\r
246 /* [retval][out] */ IPropertyBag** result)
\r
248 if (!databaseName || !origin || !result)
\r
253 if (this != s_sharedWebDatabaseManager)
\r
256 COMPtr<WebSecurityOrigin> webSecurityOrigin(Query, origin);
\r
257 if (!webSecurityOrigin)
\r
260 DatabaseDetails details = DatabaseTracker::tracker().detailsForNameAndOrigin(String(databaseName, SysStringLen(databaseName)),
\r
261 webSecurityOrigin->securityOriginData());
\r
263 if (!details.isValid())
\r
264 return E_INVALIDARG;
\r
266 *result = DatabaseDetailsPropertyBag::createInstance(details);
\r
270 HRESULT STDMETHODCALLTYPE WebDatabaseManager::deleteAllDatabases()
\r
272 if (this != s_sharedWebDatabaseManager)
\r
275 DatabaseTracker::tracker().deleteAllDatabases();
\r
280 HRESULT STDMETHODCALLTYPE WebDatabaseManager::deleteDatabasesWithOrigin(
\r
281 /* [in] */ IWebSecurityOrigin* origin)
\r
286 if (this != s_sharedWebDatabaseManager)
\r
289 COMPtr<WebSecurityOrigin> webSecurityOrigin(Query, origin);
\r
290 if (!webSecurityOrigin)
\r
293 DatabaseTracker::tracker().deleteDatabasesWithOrigin(webSecurityOrigin->securityOriginData());
\r
298 HRESULT STDMETHODCALLTYPE WebDatabaseManager::deleteDatabaseWithOrigin(
\r
299 /* [in] */ BSTR databaseName,
\r
300 /* [in] */ IWebSecurityOrigin* origin)
\r
302 if (!databaseName || !origin)
\r
305 if (this != s_sharedWebDatabaseManager)
\r
308 COMPtr<WebSecurityOrigin> webSecurityOrigin(Query, origin);
\r
309 if (!webSecurityOrigin)
\r
312 DatabaseTracker::tracker().deleteDatabase(webSecurityOrigin->securityOriginData(), String(databaseName, SysStringLen(databaseName)));
\r
317 void WebKitSetWebDatabasesPathIfNecessary()
\r
319 static bool pathSet = false;
\r
323 WebCore::String databasesDirectory = WebCore::pathByAppendingComponent(WebCore::localUserSpecificStorageDirectory(), "Databases");
\r
324 WebCore::DatabaseTracker::tracker().setDatabasePath(databasesDirectory);
\r