1/*
2 * Copyright (C) 2008-2017 Apple Inc. 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. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#pragma once
27
28#include <wtf/Forward.h>
29#include <wtf/RetainPtr.h>
30#include "Timer.h"
31
32#if PLATFORM(IOS_FAMILY)
33OBJC_CLASS WebNetworkStateObserver;
34#endif
35
36#if PLATFORM(MAC)
37typedef const struct __SCDynamicStore * SCDynamicStoreRef;
38#endif
39
40#if PLATFORM(WIN)
41#include <windows.h>
42#endif
43
44namespace WebCore {
45
46class NetworkStateNotifier {
47 WTF_MAKE_NONCOPYABLE(NetworkStateNotifier);
48
49public:
50 WEBCORE_EXPORT static NetworkStateNotifier& singleton();
51
52 WEBCORE_EXPORT bool onLine();
53 WEBCORE_EXPORT void addListener(WTF::Function<void(bool isOnLine)>&&);
54
55private:
56 friend NeverDestroyed<NetworkStateNotifier>;
57
58 NetworkStateNotifier();
59
60 void updateStateWithoutNotifying();
61 void updateState();
62 void updateStateSoon();
63 void startObserving();
64
65#if PLATFORM(WIN)
66 void registerForAddressChange();
67 static void CALLBACK addressChangeCallback(void*, BOOLEAN timedOut);
68#endif
69
70#if USE(GLIB)
71 static void networkChangedCallback(NetworkStateNotifier*);
72#endif
73
74 Optional<bool> m_isOnLine;
75 Vector<WTF::Function<void(bool)>> m_listeners;
76 Timer m_updateStateTimer;
77
78#if PLATFORM(IOS_FAMILY)
79 RetainPtr<WebNetworkStateObserver> m_observer;
80#endif
81
82#if PLATFORM(MAC)
83 RetainPtr<SCDynamicStoreRef> m_store;
84#endif
85
86#if PLATFORM(WIN)
87 HANDLE m_waitHandle;
88 OVERLAPPED m_overlapped;
89#endif
90};
91
92} // namespace WebCore
93