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