sms.py revision 6be2bce4a88f601f488643cfec2c1c8831c61091
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 Uguray 63569f0cfc43e7f89366e3bf941d3e09662c21218Arman Ugurayimport dbus 7f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 83569f0cfc43e7f89366e3bf941d3e09662c21218Arman Ugurayimport dbus_std_ifaces 93569f0cfc43e7f89366e3bf941d3e09662c21218Arman Ugurayimport mm1 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 183569f0cfc43e7f89366e3bf941d3e09662c21218Arman Ugurayclass SMS(dbus_std_ifaces.DBusProperties): 193569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray """ 203569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray Pseudomodem implementation of the org.freedesktop.ModemManager1.Sms 213569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray interface. 223569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray 233569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray The SMS interface defines operations and properties of a single SMS 243569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray message. 253569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray 263569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray Modems implementing the Messaging interface will export one SMS object for 273569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray each SMS stored in the device. 283569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray 293569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray """ 303569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray 31f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray _sms_index = 0 32f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray _props_template = {} 33f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray _settable_props = set([ 'SMSC', 'Validity', 'Class', 'Storage', 34f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 'DeliveryReportRequest' ]) 35f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 36f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray def __init__(self, bus, sender_number, content): 37f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray self._sender_number = sender_number 38f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray self._content = content 39f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray dbus_std_ifaces.DBusProperties.__init__( 40f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray self, self._get_next_sms_path(), bus) 41f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 42f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray @classmethod 43f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray def _get_next_sms_path(cls): 44f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray path = mm1.SMS_PATH + '/' + str(cls._sms_index) 45f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray cls._sms_index += 1 46f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray return path 47f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 48f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray @classmethod 49f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray def set_config(cls, params): 50f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray """ 51f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray Sets the values that should be used for SMS properties when a new 52f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray SMS is constructed. 53f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 54f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray @param params: A dictionary containing properties and values to set. 55f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray Only some properties are allowed to be set through this method, 56f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray which are contained in |_settable_props|. A value of "default" 57f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray can be used (which is a string) to use the default value for 58f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray that dictionary when constructing the next SMS object. 59f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 60f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray @raises SMSConfigException, if params is malformed or contains a 61f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray disallowed property. 62f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 63f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray """ 64f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray if not isinstance(params, dict): 65f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray raise SMSConfigException('sms.SMS.set_config only accepts ' 66f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 'dictionaries.') 67f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray keyset = set(params) 68f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray if not keyset.issubset(cls._settable_props): 69f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray raise SMSConfigException( 70f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 'Properties: ' + repr(keyset.difference(params)) + ' are ' 71f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 'not settable.') 72f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 73f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray for key, value in params.iteritems(): 74f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray if value == 'default' and cls._props_template.has_key(key): 75f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray cls._props_template.pop(key) 76f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray else: 77f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray cls._props_template[key] = value 78f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 793569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray def _InitializeProperties(self): 80f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray props = {} 81f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray props['State'] = dbus.types.UInt32(mm1.MM_SMS_STATE_UNKNOWN) 82f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray props['PduType'] = dbus.types.UInt32(mm1.MM_SMS_PDU_TYPE_UNKNOWN) 83f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray props['Number'] = self._sender_number 84f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray # For now, only support 'Text' and not 'Data' 85f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray props['Text'] = self._content 86f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray props['SMSC'] = self._props_template.get('SMSC', '1231212') 87f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray props['Validity'] = self._props_template.get('Validity', 88f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray dbus.types.Struct( 89f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray [ dbus.types.UInt32(mm1.MM_SMS_VALIDITY_TYPE_UNKNOWN), 90f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray dbus.types.UInt32(0) ], 91f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray signature='uv')) 92f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray props['Class'] = self._props_template.get('Class', dbus.types.Int32(-1)) 93f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray props['DeliveryReportRequest'] = self._props_template.get( 94f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 'DeliveryReportRequest', 95f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray dbus.types.Boolean(False)) 96f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray props['Storage'] = self._props_template.get( 97f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 'Storage', dbus.types.UInt32(mm1.MM_SMS_STORAGE_UNKNOWN)) 98f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray # TODO(armansito): This may be useful for split SMS messages. Need to 99f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray # study the SMS standard to figure out how to make use of this 100f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray # property. 101f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray props['MessageReference'] = dbus.types.UInt32(0) 102f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 103f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray # Timestamp, DischargeTimestamp, and DeliveryState won't be available 104f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray # until an action (such as send, receive, status report) is take with 105f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray # the SMS. 106f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray props['Timestamp'] = '' 107f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray props['DischargeTimestamp'] = '' 108f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray return { mm1.I_SMS: props } 1093569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray 1106be2bce4a88f601f488643cfec2c1c8831c61091Prathmesh Prabhu # Remember to decorate your concrete implementation with 1116be2bce4a88f601f488643cfec2c1c8831c61091Prathmesh Prabhu # @utils.log_dbus_method() 1123569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray @dbus.service.method(mm1.I_SMS) 1133569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray def Send(self): 1143569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray """ 1153569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray If the message has not yet been sent, queue it for delivery. 1163569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray 1173569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray """ 1183569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray raise NotImplementedError() 1193569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray 1206be2bce4a88f601f488643cfec2c1c8831c61091Prathmesh Prabhu # Remember to decorate your concrete implementation with 1216be2bce4a88f601f488643cfec2c1c8831c61091Prathmesh Prabhu # @utils.log_dbus_method() 122f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray @dbus.service.method(mm1.I_SMS, in_signature='u') 123f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray def Store(self, storage): 1243569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray """ 1253569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray Stores the message in the device if not already done. 1263569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray 127f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray @param storage: An MMSmsStorage value. 128f4fc926ee1a10609e545b0edbc2921be93a78790Arman Uguray 1293569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray """ 1303569f0cfc43e7f89366e3bf941d3e09662c21218Arman Uguray raise NotImplementedError() 131