165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/*
265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Apple Inc. All rights reserved.
365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without
565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions
665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met:
765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright
865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer.
965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright
1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer in the
1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    documentation and/or other materials provided with the distribution.
1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE.
2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */
2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef GenericCallback_h
2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#define GenericCallback_h
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WKAPICast.h"
3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebError.h"
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/HashMap.h>
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/PassRefPtr.h>
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/RefCounted.h>
3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit {
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochclass CallbackBase : public RefCounted<CallbackBase> {
3981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochpublic:
4081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    virtual ~CallbackBase()
4181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
4281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
4381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
4481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    uint64_t callbackID() const { return m_callbackID; }
4581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
4681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochprotected:
4781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    CallbackBase(void* context)
4881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        : m_context(context)
4981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        , m_callbackID(generateCallbackID())
5081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
5181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
5281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
5381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    void* context() const { return m_context; }
5481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
5581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochprivate:
5681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    static uint64_t generateCallbackID()
5781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
5881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        static uint64_t uniqueCallbackID = 1;
5981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return uniqueCallbackID++;
6081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
6181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
6281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    void* m_context;
6381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    uint64_t m_callbackID;
6481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch};
6581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
6681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochclass VoidCallback : public CallbackBase {
672fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockpublic:
682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    typedef void (*CallbackFunction)(WKErrorRef, void*);
692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    static PassRefPtr<VoidCallback> create(void* context, CallbackFunction callback)
712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return adoptRef(new VoidCallback(context, callback));
732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
7581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    virtual ~VoidCallback()
762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ASSERT(!m_callback);
782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void performCallback()
812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ASSERT(m_callback);
832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
8481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_callback(0, context());
852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_callback = 0;
872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void invalidate()
902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ASSERT(m_callback);
922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        RefPtr<WebError> error = WebError::create();
9481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_callback(toAPI(error.get()), context());
952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_callback = 0;
972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
992fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockprivate:
1002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    VoidCallback(void* context, CallbackFunction callback)
10181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        : CallbackBase(context)
1022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        , m_callback(callback)
1032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
1042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
1052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CallbackFunction m_callback;
1072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block};
1082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochtemplate<typename APIReturnValueType, typename InternalReturnValueType = typename APITypeInfo<APIReturnValueType>::ImplType>
11081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochclass GenericCallback : public CallbackBase {
1112fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockpublic:
11281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    typedef void (*CallbackFunction)(APIReturnValueType, WKErrorRef, void*);
1132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
11481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    static PassRefPtr<GenericCallback> create(void* context, CallbackFunction callback)
1152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
11681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return adoptRef(new GenericCallback(context, callback));
1172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
1182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
11981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    virtual ~GenericCallback()
1202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
1212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ASSERT(!m_callback);
1222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
1232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    void performCallbackWithReturnValue(InternalReturnValueType returnValue)
1252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
1262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ASSERT(m_callback);
1272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_callback(toAPI(returnValue), 0, context());
1292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_callback = 0;
1312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
1322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void invalidate()
1342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
1352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ASSERT(m_callback);
1362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        RefPtr<WebError> error = WebError::create();
13881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_callback(0, toAPI(error.get()), context());
1392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_callback = 0;
1412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
1422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1432fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockprivate:
14481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    GenericCallback(void* context, CallbackFunction callback)
14581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        : CallbackBase(context)
1462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        , m_callback(callback)
1472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
1482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
1492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CallbackFunction m_callback;
1512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block};
1522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
15381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// FIXME: Make a version of CallbackBase with two arguments, and define ComputedPagesCallback as a specialization.
15481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochclass ComputedPagesCallback : public CallbackBase {
15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochpublic:
15681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    typedef void (*CallbackFunction)(const Vector<WebCore::IntRect>&, double, WKErrorRef, void*);
15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    static PassRefPtr<ComputedPagesCallback> create(void* context, CallbackFunction callback)
15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
16081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return adoptRef(new ComputedPagesCallback(context, callback));
16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    virtual ~ComputedPagesCallback()
16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT(!m_callback);
16665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    void performCallbackWithReturnValue(const Vector<WebCore::IntRect>& returnValue1, double returnValue2)
16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT(m_callback);
17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_callback(returnValue1, returnValue2, 0, context());
17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_callback = 0;
17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void invalidate()
17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT(m_callback);
18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        RefPtr<WebError> error = WebError::create();
18281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_callback(Vector<WebCore::IntRect>(), 0, toAPI(error.get()), context());
18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_callback = 0;
18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochprivate:
18865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ComputedPagesCallback(void* context, CallbackFunction callback)
19081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        : CallbackBase(context)
19165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        , m_callback(callback)
19265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
19365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
19465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CallbackFunction m_callback;
19665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch};
19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochtemplate<typename T>
19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid invalidateCallbackMap(HashMap<uint64_t, T>& map)
20065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<T> callbacksVector;
20265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    copyValuesToVector(map, callbacksVector);
20365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (size_t i = 0, size = callbacksVector.size(); i < size; ++i)
20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        callbacksVector[i]->invalidate();
20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    map.clear();
20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit
20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif // GenericCallback_h
211