1/*
2 * Copyright (C) 2012 Intel Corporation. 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. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include "config.h"
27#include "RequestManagerClientEfl.h"
28
29#include "WKContextSoup.h"
30#include "WKSoupRequestManager.h"
31#include "ewk_context_private.h"
32#include "ewk_url_scheme_request_private.h"
33
34namespace WebKit {
35
36struct EwkUrlSchemeHandler {
37    Ewk_Url_Scheme_Request_Cb callback;
38    void* userData;
39
40    EwkUrlSchemeHandler()
41        : callback(0)
42        , userData(0)
43    { }
44
45    EwkUrlSchemeHandler(Ewk_Url_Scheme_Request_Cb callback, void* userData)
46        : callback(callback)
47        , userData(userData)
48    { }
49};
50
51static inline RequestManagerClientEfl* toRequestManagerClientEfl(const void* clientInfo)
52{
53    return static_cast<RequestManagerClientEfl*>(const_cast<void*>(clientInfo));
54}
55
56void RequestManagerClientEfl::didReceiveURIRequest(WKSoupRequestManagerRef soupRequestManagerRef, WKURLRef urlRef, WKPageRef, uint64_t requestID, const void* clientInfo)
57{
58    RequestManagerClientEfl* requestManager = toRequestManagerClientEfl(clientInfo);
59
60    RefPtr<EwkUrlSchemeRequest> schemeRequest = EwkUrlSchemeRequest::create(soupRequestManagerRef, urlRef, requestID);
61    EwkUrlSchemeHandler handler = requestManager->m_urlSchemeHandlers.get(schemeRequest->scheme());
62    if (!handler.callback)
63        return;
64
65    handler.callback(schemeRequest.get(), handler.userData);
66}
67
68RequestManagerClientEfl::RequestManagerClientEfl(WKContextRef context)
69    : m_soupRequestManager(WKContextGetSoupRequestManager(context))
70{
71    ASSERT(m_soupRequestManager);
72
73    WKSoupRequestManagerClientV0 wkRequestManagerClient;
74    memset(&wkRequestManagerClient, 0, sizeof(WKSoupRequestManagerClientV0));
75
76    wkRequestManagerClient.base.version = 0;
77    wkRequestManagerClient.base.clientInfo = this;
78    wkRequestManagerClient.didReceiveURIRequest = didReceiveURIRequest;
79
80    WKSoupRequestManagerSetClient(m_soupRequestManager.get(), &wkRequestManagerClient.base);
81}
82
83RequestManagerClientEfl::~RequestManagerClientEfl()
84{
85}
86
87void RequestManagerClientEfl::registerURLSchemeHandler(const String& scheme, Ewk_Url_Scheme_Request_Cb callback, void* userData)
88{
89    ASSERT(callback);
90
91    m_urlSchemeHandlers.set(scheme, EwkUrlSchemeHandler(callback, userData));
92    WKSoupRequestManagerRegisterURIScheme(m_soupRequestManager.get(), adoptWK(toCopiedAPI(scheme)).get());
93}
94
95} // namespace WebKit
96