#!/usr/bin/python

# Copyright 2015 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import logging
import logging.handlers

import common
from autotest_lib.client.cros import constants
from autotest_lib.client.cros import dark_resume_listener
from autotest_lib.client.cros import xmlrpc_server
from autotest_lib.client.cros.power import sys_power
from autotest_lib.client.cros.power import power_utils

class DarkResumeXmlRpcDelegate(xmlrpc_server.XmlRpcDelegate):
    """Exposes methods called remotely during dark resume autotests.

    All instance methods of this object without a preceding '_' are exposed via
    an XMLRPC server.  This is not a stateless handler object, which means that
    if you store state inside the delegate, that state will remain around for
    future calls.

    """

    def __init__(self):
        super(DarkResumeXmlRpcDelegate, self).__init__()
        self._listener = dark_resume_listener.DarkResumeListener()


    @xmlrpc_server.dbus_safe(None)
    def suspend_bg_for_dark_resume(self, suspend_for_secs):
        """
        Suspends the system for dark resume.
        @param suspend_for_secs : If not 0, sets a rtc alarm to
            wake the system after|suspend_for_secs| secs.
        """
        if suspend_for_secs == 0 :
            sys_power.suspend_bg_for_dark_resume()
        else:
            sys_power.do_suspend(suspend_for_secs)


    @xmlrpc_server.dbus_safe(None)
    def set_stop_resuspend(self, stop_resuspend):
        """
        Stops resuspend on seeing a dark resume.
        @param stop_resuspend: Stops resuspend of the device on seeing a
            a dark resume if |stop_resuspend| is true.
        """
        self._listener.stop_resuspend(stop_resuspend)


    @xmlrpc_server.dbus_safe(0)
    def get_dark_resume_count(self):
        """Gets the number of dark resumes that have occurred since
        this listener was created."""
        return self._listener.count


    @xmlrpc_server.dbus_safe(False)
    def has_lid(self):
        """
        Checks whether the DUT has lid.

        @return: Returns True if the device has a lid, False otherwise.
        """

        return power_utils.has_lid()

if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG)
    handler = logging.handlers.SysLogHandler(address = '/dev/log')
    formatter = logging.Formatter(
            'dark_resume_xmlrpc_server: [%(levelname)s] %(message)s')
    handler.setFormatter(formatter)
    logging.getLogger().addHandler(handler)
    logging.debug('dark_resume_xmlrpc_server main...')
    server = xmlrpc_server.XmlRpcServer(
            'localhost', constants.DARK_RESUME_XMLRPC_SERVER_PORT)
    server.register_delegate(DarkResumeXmlRpcDelegate())
    server.run()
