blob: 441ee6c69bf467e9ba2963dfe2a36acf9e944d86 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "platform/impl/scoped_wake_lock_mac.h"
#include <CoreFoundation/CoreFoundation.h>
#include "platform/api/task_runner.h"
#include "platform/impl/platform_client_posix.h"
#include "util/osp_logging.h"
namespace openscreen {
ScopedWakeLockMac::LockState ScopedWakeLockMac::lock_state_{};
SerialDeletePtr<ScopedWakeLock> ScopedWakeLock::Create(
TaskRunner* task_runner) {
return SerialDeletePtr<ScopedWakeLock>(task_runner, new ScopedWakeLockMac());
}
namespace {
TaskRunner* GetTaskRunner() {
auto* const platform_client = PlatformClientPosix::GetInstance();
OSP_DCHECK(platform_client);
auto* const task_runner = platform_client->GetTaskRunner();
OSP_DCHECK(task_runner);
return task_runner;
}
} // namespace
ScopedWakeLockMac::ScopedWakeLockMac() : ScopedWakeLock() {
GetTaskRunner()->PostTask([] {
if (lock_state_.reference_count++ == 0) {
AcquireWakeLock();
}
});
}
ScopedWakeLockMac::~ScopedWakeLockMac() {
GetTaskRunner()->PostTask([] {
if (--lock_state_.reference_count == 0) {
ReleaseWakeLock();
}
});
}
// static
void ScopedWakeLockMac::AcquireWakeLock() {
// The new way of doing an IOPM assertion requires constructing a standard
// Foundation dictionary and adding the expected properties.
CFMutableDictionaryRef assertion_properties = CFDictionaryCreateMutable(
0, 3, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
// This property means that we are requesting that the display not dim
// or go to sleep.
CFDictionarySetValue(assertion_properties, kIOPMAssertionTypeKey,
kIOPMAssertionTypeNoDisplaySleep);
CFDictionarySetValue(assertion_properties, kIOPMAssertionNameKey,
CFSTR("Open Screen ScopedWakeLock"));
const IOReturn result = IOPMAssertionCreateWithProperties(
assertion_properties, &lock_state_.assertion_id);
OSP_DCHECK_EQ(result, kIOReturnSuccess);
}
// static
void ScopedWakeLockMac::ReleaseWakeLock() {
const IOReturn result = IOPMAssertionRelease(lock_state_.assertion_id);
OSP_DCHECK_EQ(result, kIOReturnSuccess);
}
} // namespace openscreen