1dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/*
2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2010 Apple Inc. All rights reserved.
3dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
4dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Redistribution and use in source and binary forms, with or without
5dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * modification, are permitted provided that the following conditions
6dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * are met:
7dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 1.  Redistributions of source code must retain the above copyright
8dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *     notice, this list of conditions and the following disclaimer.
9dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 2.  Redistributions in binary form must reproduce the above copyright
10dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *     notice, this list of conditions and the following disclaimer in the
11dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *     documentation and/or other materials provided with the distribution.
12dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
13dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
24dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
25dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "config.h"
26dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "WebUserContentURLPattern.h"
27dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
28e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include "MarshallingHelpers.h"
29e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include "WebKitDLL.h"
30e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
31dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <WebCore/BString.h>
32dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <WebCore/KURL.h>
33dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
34dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockusing namespace WebCore;
35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
36dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockinline WebUserContentURLPattern::WebUserContentURLPattern()
37dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    : m_refCount(0)
38dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
39dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ++gClassCount;
40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    gClassNameCount.add("WebUserContentURLPattern");
41dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWebUserContentURLPattern::~WebUserContentURLPattern()
44dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    --gClassCount;
46dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    gClassNameCount.remove("WebUserContentURLPattern");
47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockCOMPtr<WebUserContentURLPattern> WebUserContentURLPattern::createInstance()
50dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
51dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return new WebUserContentURLPattern;
52dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
53dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockULONG WebUserContentURLPattern::AddRef()
55dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
56dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return ++m_refCount;
57dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
58dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockULONG WebUserContentURLPattern::Release()
60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ULONG newRefCount = --m_refCount;
62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!newRefCount)
63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        delete this;
64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return newRefCount;
65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockHRESULT WebUserContentURLPattern::QueryInterface(REFIID riid, void** ppvObject)
68dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
69dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!ppvObject)
70dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return E_POINTER;
71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    *ppvObject = 0;
72dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
73dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (IsEqualIID(riid, __uuidof(WebUserContentURLPattern)))
74dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *ppvObject = this;
75dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    else if (IsEqualIID(riid, __uuidof(IWebUserContentURLPattern)))
76dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *ppvObject = static_cast<IWebUserContentURLPattern*>(this);
77dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    else if (IsEqualIID(riid, IID_IUnknown))
78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *ppvObject = static_cast<IUnknown*>(this);
79dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    else
80dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return E_NOINTERFACE;
81dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
82dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    AddRef();
83dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return S_OK;
84dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
85dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
86dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockHRESULT WebUserContentURLPattern::parse(BSTR patternString)
87dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_pattern = UserContentURLPattern(String(patternString, SysStringLen(patternString)));
89dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return S_OK;
90dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
91dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
92dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockHRESULT WebUserContentURLPattern::isValid(BOOL* isValid)
93dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
94dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!isValid)
95dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return E_POINTER;
96dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    *isValid = m_pattern.isValid();
97dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return S_OK;
98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockHRESULT WebUserContentURLPattern::scheme(BSTR* scheme)
101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!scheme)
103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return E_POINTER;
104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    *scheme = BString(m_pattern.scheme()).release();
105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return S_OK;
106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockHRESULT WebUserContentURLPattern::host(BSTR* host)
109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!host)
111dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return E_POINTER;
112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    *host = BString(m_pattern.host()).release();
113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return S_OK;
114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockHRESULT WebUserContentURLPattern::matchesSubdomains(BOOL* matches)
117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!matches)
119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return E_POINTER;
120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    *matches = m_pattern.matchSubdomains();
121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return S_OK;
122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
123e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
124e458d70a0d18538346f41b503114c9ebe6b2ce12Leon ClarkeHRESULT WebUserContentURLPattern::matchesURL(BSTR url, BOOL* matches)
125e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
126e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (!matches)
127e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        return E_POINTER;
128e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    *matches = m_pattern.matches(MarshallingHelpers::BSTRToKURL(url));
129e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    return S_OK;
130e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
131