19fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu/*
29fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu * Copyright 2010, The Android Open Source Project
39fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu *
49fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu * Redistribution and use in source and binary forms, with or without
59fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu * modification, are permitted provided that the following conditions
69fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu * are met:
79fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu *  * Redistributions of source code must retain the above copyright
89fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu *    notice, this list of conditions and the following disclaimer.
99fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu *  * Redistributions in binary form must reproduce the above copyright
109fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu *    notice, this list of conditions and the following disclaimer in the
119fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu *    documentation and/or other materials provided with the distribution.
129fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu *
139fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
149fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
159fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
169fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
179fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
189fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
199fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
209fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
219fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
229fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
239fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
249fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu */
259fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu
269fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu#include "config.h"
279fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu#include "PackageNotifier.h"
289fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu
299fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu#if ENABLE(APPLICATION_INSTALLED)
309fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu
319fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu#include <wtf/Assertions.h>
329fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu#include <wtf/StdLibExtras.h>
339fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu
349fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescunamespace WebCore {
359fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu
369fed475722a5da7e9fac4d78715b17ca5ed29335Andrei PopescuPackageNotifier::PackageNotifier()
379fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu        : m_onResultAvailable(0), m_isInitialized(false), m_timer(this, &PackageNotifier::timerFired)  { }
389fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu
399fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescuvoid PackageNotifier::setOnResultAvailable(Callback callback)
409fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu{
419fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu    m_onResultAvailable = callback;
429fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu}
439fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu
449fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescuvoid PackageNotifier::addPackageNames(const HashSet<String>& packageNames)
459fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu{
469fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu    if (!m_isInitialized)
479fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu        m_isInitialized = true;
489fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu
499fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu    typedef HashSet<String>::const_iterator NamesIterator;
509fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu    for (NamesIterator iter = packageNames.begin(); iter != packageNames.end(); ++iter)
519fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu        m_packageNames.add(*iter);
529fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu
539fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu    if (m_onResultAvailable)
549fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu        m_onResultAvailable();
559fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu}
569fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu
579fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescuvoid PackageNotifier::addPackageName(const String& packageName)
589fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu{
599fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu    ASSERT(m_isInitialized);
609fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu    m_packageNames.add(packageName);
619fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu}
629fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu
639fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescuvoid PackageNotifier::removePackageName(const String& packageName)
649fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu{
659fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu    ASSERT(m_isInitialized);
669fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu    m_packageNames.remove(packageName);
679fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu}
689fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu
699fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescuvoid PackageNotifier::requestPackageResult()
709fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu{
719fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu    if (!m_isInitialized || m_timer.isActive())
729fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu        return;
739fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu
749fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu    m_timer.startOneShot(0);
759fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu}
769fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu
779fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescuvoid PackageNotifier::timerFired(Timer<PackageNotifier>*)
789fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu{
799fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu    m_timer.stop();
809fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu    if (m_onResultAvailable)
819fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu        m_onResultAvailable();
829fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu}
839fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu
849fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescubool PackageNotifier::isPackageInstalled(const String& packageName)
859fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu{
869fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu    return m_packageNames.contains(packageName);
879fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu}
889fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu
899fed475722a5da7e9fac4d78715b17ca5ed29335Andrei PopescuPackageNotifier& packageNotifier()
909fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu{
919fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu    AtomicallyInitializedStatic(PackageNotifier*, packageNotifier = new PackageNotifier);
929fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu    return *packageNotifier;
939fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu}
949fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu
959fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu}
969fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu
979fed475722a5da7e9fac4d78715b17ca5ed29335Andrei Popescu#endif // ENABLE(APPLICATION_INSTALLED)
98