#!/usr/bin/env python2

# Copyright (c) 2013 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.

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import logging
import logging.handlers

import common
from autotest_lib.client.cros import constants
from autotest_lib.client.cros import xmlrpc_server
from autotest_lib.client.cros.multimedia import bluetooth_facade_native


class BluetoothDeviceXmlRpcDelegate(
        xmlrpc_server.XmlRpcDelegate,
        bluetooth_facade_native.BluetoothFacadeNative):
    """Exposes DUT methods called remotely during Bluetooth autotests.

    The delegate inherits from BluetoothFacadeNative where all native calls
    should be kept. This XmlRpcDelegate is kept around for when Bluetooth needs
    to be called without using the MultimediaRpcDelegate.

    TODO(abps): Remove this xmlrpc delegate once it's no longer used.
    """

    def __init__(self):
        super(BluetoothDeviceXmlRpcDelegate, self).__init__()

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