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
5"""
6This module provides exception classes for pseudomodem.
7
8"""
9
10import dbus.exceptions
11
12import common
13from autotest_lib.client.cros.cellular import mm1_constants
14
15class MMError(dbus.exceptions.DBusException):
16    """
17    Generic DBusException subclass that serves as the base class for
18    ModemManager errors.
19
20    """
21
22    def __init__(self, errno, *args, **kwargs):
23        super(MMError, self).__init__(self, args, kwargs)
24        self.include_traceback = False
25        self._error_name_base = None
26        self._error_name_map = None
27        self._Setup()
28        self._dbus_error_name = (self._error_name_base +
29            self._error_name_map[errno])
30
31    def _Setup(self):
32        raise NotImplementedError()
33
34
35class MMConnectionError(MMError):
36    """ DBusException wrapper for MMConnectionError values. """
37
38    UNKNOWN = 0
39    NO_CARRIER = 1
40    NO_DIALTONE = 2
41    BUSY = 3
42    NO_ANSWER = 4
43
44    def _Setup(self):
45        self._error_name_base = mm1_constants.MM1_ERROR_PREFIX + '.Connection'
46        self._error_name_map = {
47            self.UNKNOWN : '.Unknown',
48            self.NO_CARRIER : '.NoCarrier',
49            self.NO_DIALTONE : '.NoDialtone',
50            self.BUSY : '.Busy',
51            self.NO_ANSWER : '.NoAnswer'
52        }
53
54
55class MMCoreError(MMError):
56    """
57    DBusException wrapper for MMCoreError values.
58
59    """
60
61    FAILED = 0
62    CANCELLED = 1
63    ABORTED = 2
64    UNSUPPORTED = 3
65    NO_PLUGINS = 4
66    UNAUTHORIZED = 5
67    INVALID_ARGS = 6
68    IN_PROGRESS = 7
69    WRONG_STATE = 8
70    CONNECTED = 9
71    TOO_MANY = 10
72    NOT_FOUND = 11
73    RETRY = 12
74    EXISTS = 13
75
76    def _Setup(self):
77        self._error_name_base = mm1_constants.MM1_ERROR_PREFIX + '.Core'
78        self._error_name_map = {
79            self.FAILED : '.Failed',
80            self.CANCELLED : '.Cancelled',
81            self.ABORTED : '.Aborted',
82            self.UNSUPPORTED : '.Unsupported',
83            self.NO_PLUGINS : '.NoPlugins',
84            self.UNAUTHORIZED : '.Unauthorized',
85            self.INVALID_ARGS : '.InvalidArgs',
86            self.IN_PROGRESS : '.InProgress',
87            self.WRONG_STATE : '.WrongState',
88            self.CONNECTED : '.Connected',
89            self.TOO_MANY : '.TooMany',
90            self.NOT_FOUND : '.NotFound',
91            self.RETRY : '.Retry',
92            self.EXISTS : '.Exists'
93        }
94
95
96class MMMessageError(MMError):
97    """ DBusException wrapper for MMMessageError values. """
98
99    ME_FAILURE = 300
100    SMS_SERVICE_RESERVED = 301
101    NOT_ALLOWED = 302
102    NOT_SUPPORTED = 303
103    INVALID_PDU_PARAMETER = 304
104    INVALID_TEXT_PARAMETER = 305
105    SIM_NOT_INSERTED = 310
106    SIM_PIN = 311
107    PH_SIM_PIN = 312
108    SIM_FAILURE = 313
109    SIM_BUSY = 314
110    SIM_WRONG = 315
111    SIM_PUK = 316
112    SIM_PIN2 = 317
113    SIM_PUK2 = 318
114    MEMORY_FAILURE = 320
115    INVALID_INDEX = 321
116    MEMORY_FULL = 322
117    SMSC_ADDRESS_UNKNOWN = 330
118    NO_NETWORK = 331
119    NETWORK_TIMEOUT = 332
120    NO_CNMA_ACK_EXPECTED = 340
121    UNKNOWN = 500
122
123    def _Setup(self):
124        self._error_name_base = mm1_constants.MM1_ERROR_PREFIX + '.Message'
125        self._error_name_map = {
126            self.ME_FAILURE : '.MeFailure ',
127            self.SMS_SERVICE_RESERVED : '.SmsServiceReserved',
128            self.NOT_ALLOWED : '.NotAllowed',
129            self.NOT_SUPPORTED : '.NotSupported',
130            self.INVALID_PDU_PARAMETER :
131                    '.InvalidPduParameter',
132            self.INVALID_TEXT_PARAMETER :
133                    '.InvalidTextParameter',
134            self.SIM_NOT_INSERTED : '.SimNotInserted',
135            self.SIM_PIN : '.SimPin',
136            self.PH_SIM_PIN : '.PhSimPin',
137            self.SIM_FAILURE : '.SimFailure',
138            self.SIM_BUSY : '.SimBusy',
139            self.SIM_WRONG : '.SimWrong',
140            self.SIM_PUK : '.SimPuk',
141            self.SIM_PIN2 : '.SimPin2',
142            self.SIM_PUK2 : '.SimPuk2',
143            self.MEMORY_FAILURE : '.MemoryFailure',
144            self.INVALID_INDEX : '.InvalidIndex',
145            self.MEMORY_FULL : '.MemoryFull',
146            self.SMSC_ADDRESS_UNKNOWN : '.SmscAddressUnknown',
147            self.NO_NETWORK : '.NoNetwork',
148            self.NETWORK_TIMEOUT : '.NetworkTimeout',
149            self.NO_CNMA_ACK_EXPECTED : '.NoCnmaAckExpected',
150            self.UNKNOWN : '.Unknown'
151        }
152
153
154class MMMobileEquipmentError(MMError):
155    """ DBusException wrapper for MMMobileEquipmentError values. """
156
157    PHONE_FAILURE = 0
158    NO_CONNECTION = 1
159    LINK_RESERVED = 2
160    NOT_ALLOWED = 3
161    NOT_SUPPORTED = 4
162    PH_SIM_PIN = 5
163    PH_FSIM_PIN = 6
164    PH_FSIM_PUK = 7
165    SIM_NOT_INSERTED = 10
166    SIM_PIN = 11
167    SIM_PUK = 12
168    SIM_FAILURE = 13
169    SIM_BUSY = 14
170    SIM_WRONG = 15
171    INCORRECT_PASSWORD = 16
172    SIM_PIN2 = 17
173    SIM_PUK2 = 18
174    MEMORY_FULL = 20
175    INVALID_INDEX = 21
176    NOT_FOUND = 22
177    MEMORY_FAILURE = 23
178    TEXT_TOO_LONG = 24
179    INVALID_CHARS = 25
180    DIAL_STRING_TOO_LONG = 26
181    DIAL_STRING_INVALID = 27
182    NO_NETWORK = 30
183    NETWORK_TIMEOUT = 31
184    NETWORK_NOT_ALLOWED = 32
185    NETWORK_PIN = 40
186    NETWORK_PUK = 41
187    NETWORK_SUBSET_PIN = 42
188    NETWORK_SUBSET_PUK = 43
189    SERVICE_PIN = 44
190    SERVICE_PUK = 45
191    CORP_PIN = 46
192    CORP_PUK = 47
193    UNKNOWN = 100
194    # GPRS related errors
195    GPRS_ILLEGAL_MS = 103
196    GPRS_ILLEGAL_ME = 106
197    GPRS_SERVICE_NOT_ALLOWED = 107
198    GPRS_PLMN_NOT_ALLOWED = 111
199    GPRS_LOCATION_NOT_ALLOWED = 112
200    GPRS_ROAMING_NOT_ALLOWED = 113
201    GPRS_SERVICE_OPTION_NOT_SUPPORTED = 132
202    GPRS_SERVICE_OPTION_NOT_SUBSCRIBED = 133
203    GPRS_SERVICE_OPTION_OUT_OF_ORDER = 134
204    GPRS_UNKNOWN = 148
205    GPRS_PDP_AUTH_FAILURE = 149
206    GPRS_INVALID_MOBILE_CLASS = 150
207
208    def _Setup(self):
209        self._error_name_base = \
210            mm1_constants.MM1_ERROR_PREFIX + '.MobileEquipment'
211        self._error_name_map = {
212            self.PHONE_FAILURE : '.PhoneFailure',
213            self.NO_CONNECTION : '.NoConnection',
214            self.LINK_RESERVED : '.LinkReserved',
215            self.NOT_ALLOWED : '.NotAllowed',
216            self.NOT_SUPPORTED : '.NotSupported',
217            self.PH_SIM_PIN : '.PhSimPin',
218            self.PH_FSIM_PIN : '.PhFsimPin',
219            self.PH_FSIM_PUK : '.PhFsimPuk',
220            self.SIM_NOT_INSERTED : '.SimNotInserted',
221            self.SIM_PIN : '.SimPin',
222            self.SIM_PUK : '.SimPuk',
223            self.SIM_FAILURE : '.SimFailure',
224            self.SIM_BUSY : '.SimBusy',
225            self.SIM_WRONG : '.SimWrong',
226            self.INCORRECT_PASSWORD :
227                '.IncorrectPassword',
228            self.SIM_PIN2 : '.SimPin2',
229            self.SIM_PUK2 : '.SimPuk2',
230            self.MEMORY_FULL : '.MemoryFull',
231            self.INVALID_INDEX : '.InvalidIndex',
232            self.NOT_FOUND : '.NotFound',
233            self.MEMORY_FAILURE : '.MemoryFailure',
234            self.TEXT_TOO_LONG : '.TextTooLong',
235            self.INVALID_CHARS : '.InvalidChars',
236            self.DIAL_STRING_TOO_LONG :
237                '.DialStringTooLong',
238            self.DIAL_STRING_INVALID :
239                '.DialStringInvalid',
240            self.NO_NETWORK : '.NoNetwork',
241            self.NETWORK_TIMEOUT : '.NetworkTimeout',
242            self.NETWORK_NOT_ALLOWED :
243                '.NetworkNotAllowed',
244            self.NETWORK_PIN : '.NetworkPin',
245            self.NETWORK_PUK : '.NetworkPuk',
246            self.NETWORK_SUBSET_PIN :
247                '.NetworkSubsetPin',
248            self.NETWORK_SUBSET_PUK :
249                '.NetworkSubsetPuk',
250            self.SERVICE_PIN : '.ServicePin',
251            self.SERVICE_PUK : '.ServicePuk',
252            self.CORP_PIN : '.CorpPin',
253            self.CORP_PUK : '.CorpPuk',
254            self.UNKNOWN : '.Unknown',
255            self.GPRS_ILLEGAL_MS : '.Gprs.IllegalMs',
256            self.GPRS_ILLEGAL_ME : '.Gprs.IllegalMe',
257            self.GPRS_SERVICE_NOT_ALLOWED :
258                '.Gprs.ServiceNotAllowed',
259            self.GPRS_PLMN_NOT_ALLOWED :
260                '.Gprs.PlmnNotAllowed',
261            self.GPRS_LOCATION_NOT_ALLOWED :
262                '.Gprs.LocationNotAllowed',
263            self.GPRS_ROAMING_NOT_ALLOWED :
264                '.Gprs.RoamingNotAllowed',
265            self.GPRS_SERVICE_OPTION_NOT_SUPPORTED :
266                '.Gprs.ServiceOptionNotSupported',
267            self.GPRS_SERVICE_OPTION_NOT_SUBSCRIBED :
268                '.Gprs.ServiceOptionNotSubscribed',
269            self.GPRS_SERVICE_OPTION_OUT_OF_ORDER :
270                '.Gprs.ServiceOptionOutOfOrder',
271            self.GPRS_UNKNOWN :
272                '.Gprs.Unknown',
273            self.GPRS_PDP_AUTH_FAILURE :
274                '.Gprs.PdpAuthFailure',
275            self.GPRS_INVALID_MOBILE_CLASS :
276                '.Gprs.InvalidMobileClass'
277        }
278
279
280class MMSerialError(MMError):
281    """ DBusException wrapper for MMSerialError values. """
282
283    UNKNOWN = 0
284    OPEN_FAILED = 1
285    SEND_FAILED = 2
286    RESPONSE_TIMEOUT = 3
287    OPEN_FAILED_NO_DEVICE = 4
288    FLASH_FAILED = 5
289    NOT_OPEN = 6
290
291    def _Setup(self):
292        self._error_name_base = mm1_constants.MM1_ERROR_PREFIX + '.Serial'
293        self._error_name_map = {
294            self.UNKNOWN : '.Unknown',
295            self.OPEN_FAILED : '.OpenFailed',
296            self.SEND_FAILED : '.SendFailed',
297            self.RESPONSE_TIMEOUT : '.ResponseTimeout',
298            self.OPEN_FAILED_NO_DEVICE : '.OpenFailedNoDevice',
299            self.FLASH_FAILED : '.FlashFailed',
300            self.NOT_OPEN : '.NotOpen'
301        }
302
303
304class MMCdmaActivationError(MMError):
305    """ DBusException wrapper for MMCdmaActivationError values. """
306
307    NONE = 0
308    UNKNOWN = 1
309    ROAMING = 2
310    WRONG_RADIO_INTERFACE = 3
311    COULD_NOT_CONNECT = 4
312    SECURITY_AUTHENTICATION_FAILED = 5
313    PROVISIONING_FAILED = 6
314    NO_SIGNAL = 7
315    TIMED_OUT = 8
316    START_FAILED = 9
317
318    def _Setup(self):
319        self._error_name_base = \
320            mm1_constants.MM1_ERROR_PREFIX + '.CdmaActivation'
321        self._error_name_map = {
322            self.NONE : '.None',
323            self.UNKNOWN :
324                '.Unknown',
325            self.ROAMING :
326                '.Roaming',
327            self.WRONG_RADIO_INTERFACE :
328                '.WrongRadioInterface',
329            self.COULD_NOT_CONNECT :
330                '.CouldNotConnect',
331            self.SECURITY_AUTHENTICATION_FAILED :
332                '.SecurityAuthenticationFailed',
333            self.PROVISIONING_FAILED :
334                '.ProvisioningFailed',
335            self.NO_SIGNAL :
336                '.NoSignal',
337            self.TIMED_OUT :
338                '.TimedOut',
339            self.START_FAILED :
340                '.StartFailed'
341        }
342
343
344class TestError(dbus.exceptions.DBusException):
345    """
346    Raised by the test interface of Pseudomodem.
347
348    This is not a core ModemManager error, and is raised only on the test
349    interface mostly to notify the user of invalid requests or misconfiguration
350    of pseudomodem.
351
352    """
353    pass
354