// 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 #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::Create( TaskRunner* task_runner) { return SerialDeletePtr(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