13569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray# Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 23569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray# Use of this source code is governed by a BSD-style license that can be 33569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray# found in the LICENSE file. 43569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray 53569f0cfc43e7f89366e3bf941d3e09662c21218Arman Ugurayimport dbus 6f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 73569f0cfc43e7f89366e3bf941d3e09662c21218Arman Ugurayimport dbus_std_ifaces 8c569e99b922542e7ddbbc4cd465fc8328ec16214Thieu Le 9c569e99b922542e7ddbbc4cd465fc8328ec16214Thieu Lefrom autotest_lib.client.cros.cellular import mm1_constants 103569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray 11f4fc926ee1a10609e545b0edbc2921be93a78790Arman Ugurayclass SMSConfigException(Exception): 12f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray """ 13f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray Raised when an error occurs while setting the SMS property template. 14f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 15f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray """ 16f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray pass 17f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 18c43ea562a0447330b26eeec3c7b1fb935958e985Prathmesh Prabhu 193569f0cfc43e7f89366e3bf941d3e09662c21218Arman Ugurayclass SMS(dbus_std_ifaces.DBusProperties): 203569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray """ 213569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray Pseudomodem implementation of the org.freedesktop.ModemManager1.Sms 223569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray interface. 233569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray 243569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray The SMS interface defines operations and properties of a single SMS 253569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray message. 263569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray 273569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray Modems implementing the Messaging interface will export one SMS object for 283569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray each SMS stored in the device. 293569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray 303569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray """ 313569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray 32f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray _sms_index = 0 33f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray _props_template = {} 34f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray _settable_props = set([ 'SMSC', 'Validity', 'Class', 'Storage', 35f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 'DeliveryReportRequest' ]) 36f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 37f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray def __init__(self, bus, sender_number, content): 38f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray self._sender_number = sender_number 39f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray self._content = content 40f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray dbus_std_ifaces.DBusProperties.__init__( 41f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray self, self._get_next_sms_path(), bus) 42f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 43c43ea562a0447330b26eeec3c7b1fb935958e985Prathmesh Prabhu 44f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray @classmethod 45f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray def _get_next_sms_path(cls): 46c569e99b922542e7ddbbc4cd465fc8328ec16214Thieu Le path = mm1_constants.SMS_PATH + '/' + str(cls._sms_index) 47f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray cls._sms_index += 1 48f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray return path 49f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 50c43ea562a0447330b26eeec3c7b1fb935958e985Prathmesh Prabhu 51f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray @classmethod 52f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray def set_config(cls, params): 53f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray """ 54f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray Sets the values that should be used for SMS properties when a new 55f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray SMS is constructed. 56f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 57f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray @param params: A dictionary containing properties and values to set. 58f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray Only some properties are allowed to be set through this method, 59f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray which are contained in |_settable_props|. A value of "default" 60f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray can be used (which is a string) to use the default value for 61f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray that dictionary when constructing the next SMS object. 62c43ea562a0447330b26eeec3c7b1fb935958e985Prathmesh Prabhu @raises: SMSConfigException, if params is malformed or contains a 63f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray disallowed property. 64f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 65f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray """ 66f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray if not isinstance(params, dict): 67f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray raise SMSConfigException('sms.SMS.set_config only accepts ' 68f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 'dictionaries.') 69f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray keyset = set(params) 70f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray if not keyset.issubset(cls._settable_props): 71f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray raise SMSConfigException( 72f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 'Properties: ' + repr(keyset.difference(params)) + ' are ' 73f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 'not settable.') 74f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 75f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray for key, value in params.iteritems(): 76f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray if value == 'default' and cls._props_template.has_key(key): 77f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray cls._props_template.pop(key) 78f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray else: 79f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray cls._props_template[key] = value 80f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 81c43ea562a0447330b26eeec3c7b1fb935958e985Prathmesh Prabhu 823569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray def _InitializeProperties(self): 83f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray props = {} 84c569e99b922542e7ddbbc4cd465fc8328ec16214Thieu Le props['State'] = dbus.types.UInt32(mm1_constants.MM_SMS_STATE_UNKNOWN) 85c569e99b922542e7ddbbc4cd465fc8328ec16214Thieu Le props['PduType'] = dbus.types.UInt32( 86c569e99b922542e7ddbbc4cd465fc8328ec16214Thieu Le mm1_constants.MM_SMS_PDU_TYPE_UNKNOWN) 87f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray props['Number'] = self._sender_number 88f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray # For now, only support 'Text' and not 'Data' 89f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray props['Text'] = self._content 90f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray props['SMSC'] = self._props_template.get('SMSC', '1231212') 91f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray props['Validity'] = self._props_template.get('Validity', 92f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray dbus.types.Struct( 93c569e99b922542e7ddbbc4cd465fc8328ec16214Thieu Le [dbus.types.UInt32( 94c569e99b922542e7ddbbc4cd465fc8328ec16214Thieu Le mm1_constants.MM_SMS_VALIDITY_TYPE_UNKNOWN), 95c569e99b922542e7ddbbc4cd465fc8328ec16214Thieu Le dbus.types.UInt32(0)], 96f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray signature='uv')) 97f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray props['Class'] = self._props_template.get('Class', dbus.types.Int32(-1)) 98f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray props['DeliveryReportRequest'] = self._props_template.get( 99f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 'DeliveryReportRequest', 100f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray dbus.types.Boolean(False)) 101f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray props['Storage'] = self._props_template.get( 102c569e99b922542e7ddbbc4cd465fc8328ec16214Thieu Le 'Storage', 103c569e99b922542e7ddbbc4cd465fc8328ec16214Thieu Le dbus.types.UInt32(mm1_constants.MM_SMS_STORAGE_UNKNOWN)) 104f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray # TODO(armansito): This may be useful for split SMS messages. Need to 105f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray # study the SMS standard to figure out how to make use of this 106f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray # property. 107f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray props['MessageReference'] = dbus.types.UInt32(0) 108f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 109f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray # Timestamp, DischargeTimestamp, and DeliveryState won't be available 110f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray # until an action (such as send, receive, status report) is take with 111f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray # the SMS. 112f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray props['Timestamp'] = '' 113f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray props['DischargeTimestamp'] = '' 114c569e99b922542e7ddbbc4cd465fc8328ec16214Thieu Le return { mm1_constants.I_SMS: props } 1153569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray 116c43ea562a0447330b26eeec3c7b1fb935958e985Prathmesh Prabhu 1176be2bce4a88f601f488643cfec2c1c8831c61091Prathmesh Prabhu # Remember to decorate your concrete implementation with 1186be2bce4a88f601f488643cfec2c1c8831c61091Prathmesh Prabhu # @utils.log_dbus_method() 119c569e99b922542e7ddbbc4cd465fc8328ec16214Thieu Le @dbus.service.method(mm1_constants.I_SMS) 1203569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray def Send(self): 121c43ea562a0447330b26eeec3c7b1fb935958e985Prathmesh Prabhu """ If the message has not yet been sent, queue it for delivery. """ 1223569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray raise NotImplementedError() 1233569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray 124c43ea562a0447330b26eeec3c7b1fb935958e985Prathmesh Prabhu 1256be2bce4a88f601f488643cfec2c1c8831c61091Prathmesh Prabhu # Remember to decorate your concrete implementation with 1266be2bce4a88f601f488643cfec2c1c8831c61091Prathmesh Prabhu # @utils.log_dbus_method() 127c569e99b922542e7ddbbc4cd465fc8328ec16214Thieu Le @dbus.service.method(mm1_constants.I_SMS, in_signature='u') 128f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray def Store(self, storage): 1293569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray """ 1303569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray Stores the message in the device if not already done. 1313569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray 132f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray @param storage: An MMSmsStorage value. 133f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 1343569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray """ 1353569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray raise NotImplementedError() 136