diff options
Diffstat (limited to 'dom/power/PowerManager.cpp')
-rw-r--r-- | dom/power/PowerManager.cpp | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/dom/power/PowerManager.cpp b/dom/power/PowerManager.cpp new file mode 100644 index 000000000..64534976d --- /dev/null +++ b/dom/power/PowerManager.cpp @@ -0,0 +1,210 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "mozilla/dom/PowerManager.h" + +#include "mozilla/Hal.h" +#include "WakeLock.h" +#include "nsDOMClassInfoID.h" +#include "nsIDOMWakeLockListener.h" +#include "nsIDocument.h" +#include "nsIPermissionManager.h" +#include "nsIPowerManagerService.h" +#include "nsIPrincipal.h" +#include "nsPIDOMWindow.h" +#include "nsServiceManagerUtils.h" +#include "nsError.h" +#include "mozilla/dom/MozPowerManagerBinding.h" +#include "mozilla/Services.h" + +namespace mozilla { +namespace dom { + +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(PowerManager) + NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY + NS_INTERFACE_MAP_ENTRY(nsISupports) + NS_INTERFACE_MAP_ENTRY(nsIDOMMozWakeLockListener) +NS_INTERFACE_MAP_END + +NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(PowerManager, mListeners, mWindow) + +NS_IMPL_CYCLE_COLLECTING_ADDREF(PowerManager) +NS_IMPL_CYCLE_COLLECTING_RELEASE(PowerManager) + +/* virtual */ JSObject* +PowerManager::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) +{ + return MozPowerManagerBinding::Wrap(aCx, this, aGivenProto); +} + +nsresult +PowerManager::Init(nsPIDOMWindowInner* aWindow) +{ + mWindow = aWindow; + + nsCOMPtr<nsIPowerManagerService> pmService = + do_GetService(POWERMANAGERSERVICE_CONTRACTID); + NS_ENSURE_STATE(pmService); + + // Add ourself to the global notification list. + pmService->AddWakeLockListener(this); + return NS_OK; +} + +nsresult +PowerManager::Shutdown() +{ + nsCOMPtr<nsIPowerManagerService> pmService = + do_GetService(POWERMANAGERSERVICE_CONTRACTID); + NS_ENSURE_STATE(pmService); + + // Remove ourself from the global notification list. + pmService->RemoveWakeLockListener(this); + return NS_OK; +} + +void +PowerManager::Reboot(ErrorResult& aRv) +{ + nsCOMPtr<nsIPowerManagerService> pmService = + do_GetService(POWERMANAGERSERVICE_CONTRACTID); + if (pmService) { + pmService->Reboot(); + } else { + aRv.Throw(NS_ERROR_UNEXPECTED); + } +} + +void +PowerManager::FactoryReset(mozilla::dom::FactoryResetReason& aReason) +{ + hal::FactoryReset(aReason); +} + +void +PowerManager::PowerOff(ErrorResult& aRv) +{ + nsCOMPtr<nsIPowerManagerService> pmService = + do_GetService(POWERMANAGERSERVICE_CONTRACTID); + if (pmService) { + pmService->PowerOff(); + } else { + aRv.Throw(NS_ERROR_UNEXPECTED); + } +} + +void +PowerManager::AddWakeLockListener(nsIDOMMozWakeLockListener *aListener) +{ + if (!mListeners.Contains(aListener)) { + mListeners.AppendElement(aListener); + } +} + +void +PowerManager::RemoveWakeLockListener(nsIDOMMozWakeLockListener *aListener) +{ + mListeners.RemoveElement(aListener); +} + +void +PowerManager::GetWakeLockState(const nsAString& aTopic, + nsAString& aState, + ErrorResult& aRv) +{ + nsCOMPtr<nsIPowerManagerService> pmService = + do_GetService(POWERMANAGERSERVICE_CONTRACTID); + if (pmService) { + aRv = pmService->GetWakeLockState(aTopic, aState); + } else { + aRv.Throw(NS_ERROR_UNEXPECTED); + } +} + +NS_IMETHODIMP +PowerManager::Callback(const nsAString &aTopic, const nsAString &aState) +{ + /** + * We maintain a local listener list instead of using the global + * list so that when the window is destroyed we don't have to + * cleanup the mess. + * Copy the listeners list before we walk through the callbacks + * because the callbacks may install new listeners. We expect no + * more than one listener per window, so it shouldn't be too long. + */ + AutoTArray<nsCOMPtr<nsIDOMMozWakeLockListener>, 2> listeners(mListeners); + for (uint32_t i = 0; i < listeners.Length(); ++i) { + listeners[i]->Callback(aTopic, aState); + } + + return NS_OK; +} + +bool +PowerManager::ScreenEnabled() +{ + return hal::GetScreenEnabled(); +} + +void +PowerManager::SetScreenEnabled(bool aEnabled) +{ + hal::SetScreenEnabled(aEnabled); +} + +bool +PowerManager::KeyLightEnabled() +{ + return hal::GetKeyLightEnabled(); +} + +void +PowerManager::SetKeyLightEnabled(bool aEnabled) +{ + hal::SetKeyLightEnabled(aEnabled); +} + +double +PowerManager::ScreenBrightness() +{ + return hal::GetScreenBrightness(); +} + +void +PowerManager::SetScreenBrightness(double aBrightness, ErrorResult& aRv) +{ + if (0 <= aBrightness && aBrightness <= 1) { + hal::SetScreenBrightness(aBrightness); + } else { + aRv.Throw(NS_ERROR_INVALID_ARG); + } +} + +bool +PowerManager::CpuSleepAllowed() +{ + return hal::GetCpuSleepAllowed(); +} + +void +PowerManager::SetCpuSleepAllowed(bool aAllowed) +{ + hal::SetCpuSleepAllowed(aAllowed); +} + +already_AddRefed<PowerManager> +PowerManager::CreateInstance(nsPIDOMWindowInner* aWindow) +{ + RefPtr<PowerManager> powerManager = new PowerManager(); + if (NS_FAILED(powerManager->Init(aWindow))) { + powerManager = nullptr; + } + + return powerManager.forget(); +} + +} // namespace dom +} // namespace mozilla |