1# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import cdma_activate_machine
6import connect_cdma_machine
7import connect_machine
8import disable_machine
9import disconnect_machine
10import enable_machine
11import pm_constants
12import register_cdma_machine
13import register_machine
14
15class StateMachineFactory(object):
16    """
17    State machines are created by the |Modem| objects by calling methods from
18    an object of type StateMachineFactory.
19
20    To supply your own state machines, simply pass in your own subclass of
21    |StateMachineFactory| that provides your implementations of the
22    state machine.
23
24    This default implementation allows tailoring the different state machines to
25    be interactive as needed.
26
27    """
28    def __init__(self):
29        self._bus = None
30        self._interactive = set()
31
32
33    def SetBus(self, bus):
34        """
35        Set the default dbus bus.
36
37        @param bus: The dbus bus.
38
39        """
40        self._bus = bus
41
42
43    def SetInteractiveAll(self):
44        """
45        Set all machines to be launched in interactive mode.
46
47        All core pseudomodem machines should appear here. If you add a state
48        machine to pseudomodem, please add it here so that tests can easily run
49        it in interactive mode.
50
51        """
52        self.SetInteractive(pm_constants.STATE_MACHINE_CDMA_ACTIVATE)
53        self.SetInteractive(pm_constants.STATE_MACHINE_CONNECT)
54        self.SetInteractive(pm_constants.STATE_MACHINE_CONNECT_CDMA)
55        self.SetInteractive(pm_constants.STATE_MACHINE_DISABLE)
56        self.SetInteractive(pm_constants.STATE_MACHINE_DISCONNECT)
57        self.SetInteractive(pm_constants.STATE_MACHINE_ENABLE)
58        self.SetInteractive(pm_constants.STATE_MACHINE_REGISTER)
59        self.SetInteractive(pm_constants.STATE_MACHINE_REGISTER_CDMA)
60
61
62    def SetInteractive(self, machine_name):
63        """
64        Set the given machine to be launched in interative mode.
65
66        @param machine_name: The name of the machine to be launched in
67                interactive mode.
68
69        """
70        self._interactive.add(machine_name)
71
72
73    def CreateMachine(self, machine_name, *args, **kwargs):
74        """
75        Create an instance of the given machine.
76
77        @param machine_name: The name of the machine to be created. All
78                supported machine names are exported as constants in the
79                |pm_constants| module.
80        @param *args, **kwargs: Arguments to pass to the machine constructor.
81        @returns: A new instance of the deseried machine
82
83        """
84        if machine_name == pm_constants.STATE_MACHINE_CDMA_ACTIVATE:
85            machine = cdma_activate_machine.CdmaActivateMachine(*args, **kwargs)
86        elif machine_name == pm_constants.STATE_MACHINE_CONNECT:
87            machine = connect_machine.ConnectMachine(*args, **kwargs)
88        elif machine_name == pm_constants.STATE_MACHINE_CONNECT_CDMA:
89            machine = connect_cdma_machine.ConnectCdmaMachine(*args, **kwargs)
90        elif machine_name == pm_constants.STATE_MACHINE_DISABLE:
91            machine = disable_machine.DisableMachine(*args, **kwargs)
92        elif machine_name == pm_constants.STATE_MACHINE_DISCONNECT:
93            machine = disconnect_machine.DisconnectMachine(*args, **kwargs)
94        elif machine_name == pm_constants.STATE_MACHINE_ENABLE:
95            machine = enable_machine.EnableMachine(*args, **kwargs)
96        elif machine_name == pm_constants.STATE_MACHINE_REGISTER:
97            machine = register_machine.RegisterMachine(*args, **kwargs)
98        elif machine_name == pm_constants.STATE_MACHINE_REGISTER_CDMA:
99            machine = register_cdma_machine.RegisterCdmaMachine(*args, **kwargs)
100        else:
101            # Reaching here is a non recoverable programming error.
102            assert False
103
104        if machine_name in self._interactive:
105            machine.EnterInteractiveMode(self._bus)
106        return machine
107