NetworkProximityAssertion.h [plain text]
#pragma once
#if ENABLE(PROXIMITY_NETWORKING)
#include "MobileWiFiSPI.h"
#include <WebCore/Timer.h>
#include <wtf/Noncopyable.h>
#include <wtf/RetainPtr.h>
OBJC_CLASS IDSService;
namespace WebKit {
enum class ResumptionReason : uint8_t;
enum class SuspensionReason : uint8_t;
class NetworkProximityAssertion {
WTF_MAKE_NONCOPYABLE(NetworkProximityAssertion);
public:
class Token {
WTF_MAKE_NONCOPYABLE(Token);
public:
explicit Token(NetworkProximityAssertion& assertion)
: m_assertion { assertion }
{
m_assertion.hold();
}
~Token()
{
m_assertion.release();
}
private:
NetworkProximityAssertion& m_assertion;
};
void resume(ResumptionReason);
void suspend(SuspensionReason, CompletionHandler<void()>&&);
protected:
NetworkProximityAssertion();
virtual ~NetworkProximityAssertion() = default;
bool m_isHoldingAssertion { false };
private:
enum class State {
Backgrounded, Resumed, Suspended, };
virtual void holdNow() = 0;
virtual void releaseNow() = 0;
void hold();
void release();
void releaseTimerFired();
void suspendAfterBackgroundingTimerFired();
void suspendNow();
uint64_t m_assertionCount { 0 };
State m_state { State::Suspended };
WebCore::DeferrableOneShotTimer m_releaseTimer;
WebCore::DeferrableOneShotTimer m_suspendAfterBackgroundingTimer;
};
class BluetoothProximityAssertion final : public NetworkProximityAssertion {
public:
explicit BluetoothProximityAssertion(IDSService *);
void suspend(SuspensionReason, CompletionHandler<void()>&&);
private:
void holdNow() override;
void releaseNow() override;
RetainPtr<IDSService> m_idsService;
};
class WiFiProximityAssertion final : public NetworkProximityAssertion {
public:
WiFiProximityAssertion();
private:
void holdNow() override;
void releaseNow() override;
RetainPtr<WiFiManagerClientRef> m_wiFiManagerClient;
};
}
#endif // ENABLE(PROXIMITY_NETWORKING)