blob: 66a20b2101e066b5cefae94d5307e2f97e12265e [file] [log] [blame]
# Copyright (c) 2012 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 mm1
import state_machine
class DisableMachine(state_machine.StateMachine):
def _HandleConnectedState(self):
logging.info('DisableMachine: Modem is CONNECTED.')
assert self._modem.connect_step is None
# TODO(armansito): Pass a different raise_cb here to handle
# disconnect failure
logging.info('DisableMachine: Starting Disconnect.')
self._modem.Disconnect(
mm1.ROOT_PATH, DisableMachine.Step, DisableMachine.Step, self)
return True
def _HandleConnectingState(self):
logging.info('DisableMachine: Modem is CONNECTING.')
assert self._modem.connect_step
logging.info('DisableMachine: Canceling connect.')
self._modem.connect_step.Cancel()
return True
def _HandleDisconnectingState(self):
logging.info('DisableMachine: Modem is DISCONNECTING.')
assert self._modem.disconnect_step
logging.info('DisableMachine: Waiting for disconnect.')
# wait until disconnect ends
return True
def _HandleRegisteredState(self):
logging.info('DisableMachine: Modem is REGISTERED.')
assert not self._modem.IsPendingRegister()
assert not self._modem.IsPendingEnable()
assert not self._modem.IsPendingConnect()
assert not self._modem.IsPendingDisconnect()
self._modem.UnregisterWithNetwork()
logging.info('DisableMachine: Setting state to DISABLING.')
reason = mm1.MM_MODEM_STATE_CHANGE_REASON_USER_REQUESTED
self._modem.ChangeState(mm1.MM_MODEM_STATE_DISABLING, reason)
return True
def _HandleSearchingState(self):
logging.info('DisableMachine: Modem is SEARCHING.')
assert self._modem.register_step
assert not self._modem.IsPendingEnable()
assert not self._modem.IsPendingConnect()
logging.info('DisableMachine: Canceling register.')
self._modem.register_step.Cancel()
return True
def _HandleEnabledState(self):
logging.info('DisableMachine: Modem is ENABLED.')
assert not self._modem.IsPendingRegister()
assert not self._modem.IsPendingEnable()
assert not self._modem.IsPendingConnect()
logging.info('DisableMachine: Setting state to DISABLING.')
reason = mm1.MM_MODEM_STATE_CHANGE_REASON_USER_REQUESTED
self._modem.ChangeState(mm1.MM_MODEM_STATE_DISABLING, reason)
return True
def _HandleDisablingState(self):
logging.info('DisableMachine: Modem is DISABLING.')
assert not self._modem.IsPendingRegister()
assert not self._modem.IsPendingEnable()
assert not self._modem.IsPendingConnect()
assert not self._modem.IsPendingDisconnect()
logging.info('DisableMachine: Setting state to DISABLED.')
reason = mm1.MM_MODEM_STATE_CHANGE_REASON_USER_REQUESTED
self._modem.ChangeState(mm1.MM_MODEM_STATE_DISABLED, reason)
self._modem.disable_step = None
return False
def _GetModemStateFunctionMap(self):
return {
mm1.MM_MODEM_STATE_CONNECTED: DisableMachine._HandleConnectedState,
mm1.MM_MODEM_STATE_CONNECTING: \
DisableMachine._HandleConnectingState,
mm1.MM_MODEM_STATE_DISCONNECTING: \
DisableMachine._HandleDisconnectingState,
mm1.MM_MODEM_STATE_REGISTERED: \
DisableMachine._HandleRegisteredState,
mm1.MM_MODEM_STATE_SEARCHING: DisableMachine._HandleSearchingState,
mm1.MM_MODEM_STATE_ENABLED: DisableMachine._HandleEnabledState,
mm1.MM_MODEM_STATE_DISABLING: DisableMachine._HandleDisablingState
}
def _ShouldStartStateMachine(self):
if self._modem.disable_step and self._modem.disable_step != self:
# There is already a disable operation in progress.
message = 'Modem disable already in progress.'
logging.info(message)
raise mm1.MMCoreError(mm1.MMCoreError.IN_PROGRESS, message)
elif self._modem.disable_step is None:
# There is no disable operation going in, cancelled or otherwise.
state = self._modem.Get(mm1.I_MODEM, 'State')
if state == mm1.MM_MODEM_STATE_DISABLED:
# The reason we're not raising an error here is that
# shill will make multiple successive calls to disable
# but WON'T check for raised errors, which causes
# problems. Treat this particular case as success.
logging.info('Already in a disabled state. Ignoring.')
return False
invalid_states = [
mm1.MM_MODEM_STATE_FAILED,
mm1.MM_MODEM_STATE_UNKNOWN,
mm1.MM_MODEM_STATE_INITIALIZING,
mm1.MM_MODEM_STATE_LOCKED
]
if state in invalid_states:
raise mm1.MMCoreError(
mm1.MMCoreError.WRONG_STATE,
('Modem disable cannot be initiated while in state'
' %u.') % state)
if self._modem.enable_step:
# This needs to be done here, because the case where an enable
# cycle has been initiated but it hasn't triggered any state
# transitions yet would not be detected in a state handler.
logging.info('There is an ongoing Enable, canceling it.')
self._modem.enable_step.Cancel()
if self._modem.connect_step:
logging.info('There is an ongoing Connect, canceling it.')
self._modem.connect_step.Cancel()
logging.info('Starting Disable.')
self._modem.disable_step = self
return True