summaryrefslogtreecommitdiff
path: root/dom/power/PowerManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/power/PowerManager.cpp')
-rw-r--r--dom/power/PowerManager.cpp210
1 files changed, 210 insertions, 0 deletions
diff --git a/dom/power/PowerManager.cpp b/dom/power/PowerManager.cpp
new file mode 100644
index 0000000000..64534976da
--- /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