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