# Copyright (c) 2014 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.
"""
This module provides bindings for PseudoModem Manager.
"""
import dbus
import logging
import mm1_proxy
from autotest_lib.client.bin import utils
from autotest_lib.client.cros.cellular import mm1_constants
from autotest_lib.client.cros.cellular.pseudomodem import pm_constants
class PseudoMMProxy(mm1_proxy.ModemManager1Proxy):
"""A wrapper around a DBus proxy for PseudoModem Manager."""
# Used for software message propagation latencies.
SHORT_TIMEOUT_SECONDS = 2
@property
def iface_testing(self):
"""@return org.chromium.Pseudomodem.Testing DBus interface."""
return dbus.Interface(
self._bus.get_object(mm1_constants.I_MODEM_MANAGER,
pm_constants.TESTING_PATH),
pm_constants.I_TESTING)
def iface_ism(self, machine_name, timeout_seconds=SHORT_TIMEOUT_SECONDS):
"""
Get the testing interface of the given interactive state machine.
@param machine_name: The name of the interactive state machine.
@param timeout_seconds: Max number of seconds to wait until interactive
state machine becomes available.
@return dbus.Interface for the testing interface of
InteractiveScanningMachine.
@raise mm1_proxy.ModemManager1ProxyError if a valid DBus object can't
be found.
"""
def _get_machine(ignore_error):
machine = self._bus.get_object(
mm1_constants.I_MODEM_MANAGER,
'/'.join([pm_constants.TESTING_PATH, machine_name]))
if machine is None:
return None
i_machine = dbus.Interface(machine, pm_constants.I_TESTING_ISM)
# Only way to know if this DBus object is valid is to call a
# method on it.
try:
i_machine.IsWaiting() # Ignore result.
return i_machine
except dbus.exceptions.DBusException as e:
if ignore_error:
return None
logging.debug(e)
raise mm1_proxy.ModemManager1ProxyError(
'Failed to obtain a valid object for interactive '
'state machine %s. DBus error: %s',
machine_name,
repr(e))
try:
utils.poll_for_condition(
lambda: _get_machine(True), timeout=timeout_seconds)
except utils.TimeoutError as e:
pass
return _get_machine(False)