普通文本  |  107行  |  3.93 KB

# 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.

import cdma_activate_machine
import connect_cdma_machine
import connect_machine
import disable_machine
import disconnect_machine
import enable_machine
import pm_constants
import register_cdma_machine
import register_machine

class StateMachineFactory(object):
    """
    State machines are created by the |Modem| objects by calling methods from
    an object of type StateMachineFactory.

    To supply your own state machines, simply pass in your own subclass of
    |StateMachineFactory| that provides your implementations of the
    state machine.

    This default implementation allows tailoring the different state machines to
    be interactive as needed.

    """
    def __init__(self):
        self._bus = None
        self._interactive = set()


    def SetBus(self, bus):
        """
        Set the default dbus bus.

        @param bus: The dbus bus.

        """
        self._bus = bus


    def SetInteractiveAll(self):
        """
        Set all machines to be launched in interactive mode.

        All core pseudomodem machines should appear here. If you add a state
        machine to pseudomodem, please add it here so that tests can easily run
        it in interactive mode.

        """
        self.SetInteractive(pm_constants.STATE_MACHINE_CDMA_ACTIVATE)
        self.SetInteractive(pm_constants.STATE_MACHINE_CONNECT)
        self.SetInteractive(pm_constants.STATE_MACHINE_CONNECT_CDMA)
        self.SetInteractive(pm_constants.STATE_MACHINE_DISABLE)
        self.SetInteractive(pm_constants.STATE_MACHINE_DISCONNECT)
        self.SetInteractive(pm_constants.STATE_MACHINE_ENABLE)
        self.SetInteractive(pm_constants.STATE_MACHINE_REGISTER)
        self.SetInteractive(pm_constants.STATE_MACHINE_REGISTER_CDMA)


    def SetInteractive(self, machine_name):
        """
        Set the given machine to be launched in interative mode.

        @param machine_name: The name of the machine to be launched in
                interactive mode.

        """
        self._interactive.add(machine_name)


    def CreateMachine(self, machine_name, *args, **kwargs):
        """
        Create an instance of the given machine.

        @param machine_name: The name of the machine to be created. All
                supported machine names are exported as constants in the
                |pm_constants| module.
        @param *args, **kwargs: Arguments to pass to the machine constructor.
        @returns: A new instance of the deseried machine

        """
        if machine_name == pm_constants.STATE_MACHINE_CDMA_ACTIVATE:
            machine = cdma_activate_machine.CdmaActivateMachine(*args, **kwargs)
        elif machine_name == pm_constants.STATE_MACHINE_CONNECT:
            machine = connect_machine.ConnectMachine(*args, **kwargs)
        elif machine_name == pm_constants.STATE_MACHINE_CONNECT_CDMA:
            machine = connect_cdma_machine.ConnectCdmaMachine(*args, **kwargs)
        elif machine_name == pm_constants.STATE_MACHINE_DISABLE:
            machine = disable_machine.DisableMachine(*args, **kwargs)
        elif machine_name == pm_constants.STATE_MACHINE_DISCONNECT:
            machine = disconnect_machine.DisconnectMachine(*args, **kwargs)
        elif machine_name == pm_constants.STATE_MACHINE_ENABLE:
            machine = enable_machine.EnableMachine(*args, **kwargs)
        elif machine_name == pm_constants.STATE_MACHINE_REGISTER:
            machine = register_machine.RegisterMachine(*args, **kwargs)
        elif machine_name == pm_constants.STATE_MACHINE_REGISTER_CDMA:
            machine = register_cdma_machine.RegisterCdmaMachine(*args, **kwargs)
        else:
            # Reaching here is a non recoverable programming error.
            assert False

        if machine_name in self._interactive:
            machine.EnterInteractiveMode(self._bus)
        return machine