4
* Copyright 2013 Alex <alex@linuxonly.ru>
6
* This program is free software: you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 3 of the License, or
9
* (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program. If not, see <http://www.gnu.org/licenses/>.
22
#include <glib/gi18n.h>
29
#include "../mmguicore.h"
32
#define MMGUI_MODULE_SERVICE_NAME "org.freedesktop.ModemManager1"
33
#define MMGUI_MODULE_IDENTIFIER 70
34
#define MMGUI_MODULE_DESCRIPTION "Modem Manager >= 0.7.0"
36
#define MMGUI_MODULE_ENABLE_OPERATION_TIMEOUT 20000
37
#define MMGUI_MODULE_SEND_SMS_OPERATION_TIMEOUT 35000
38
#define MMGUI_MODULE_SEND_USSD_OPERATION_TIMEOUT 25000
39
#define MMGUI_MODULE_NETWORKS_SCAN_OPERATION_TIMEOUT 60000
41
//Internal enumerations
42
//Modem state internal flags
44
MODULE_INT_MODEM_STATE_FAILED = -1,
45
MODULE_INT_MODEM_STATE_UNKNOWN = 0,
46
MODULE_INT_MODEM_STATE_INITIALIZING = 1,
47
MODULE_INT_MODEM_STATE_LOCKED = 2,
48
MODULE_INT_MODEM_STATE_DISABLED = 3,
49
MODULE_INT_MODEM_STATE_DISABLING = 4,
50
MODULE_INT_MODEM_STATE_ENABLING = 5,
51
MODULE_INT_MODEM_STATE_ENABLED = 6,
52
MODULE_INT_MODEM_STATE_SEARCHING = 7,
53
MODULE_INT_MODEM_STATE_REGISTERED = 8,
54
MODULE_INT_MODEM_STATE_DISCONNECTING = 9,
55
MODULE_INT_MODEM_STATE_CONNECTING = 10,
56
MODULE_INT_MODEM_STATE_CONNECTED = 11
57
} ModuleIntModemState;
59
//Modem capability internal flags
61
MODULE_INT_MODEM_CAPABILITY_NONE = 0,
62
MODULE_INT_MODEM_CAPABILITY_POTS = 1 << 0,
63
MODULE_INT_MODEM_CAPABILITY_CDMA_EVDO = 1 << 1,
64
MODULE_INT_MODEM_CAPABILITY_GSM_UMTS = 1 << 2,
65
MODULE_INT_MODEM_CAPABILITY_LTE = 1 << 3,
66
MODULE_INT_MODEM_CAPABILITY_LTE_ADVANCED = 1 << 4,
67
MODULE_INT_MODEM_CAPABILITY_IRIDIUM = 1 << 5,
68
} ModuleIntModemCapability;
70
//Modem registration internal flags
72
MODULE_INT_MODEM_3GPP_REGISTRATION_STATE_IDLE = 0,
73
MODULE_INT_MODEM_3GPP_REGISTRATION_STATE_HOME = 1,
74
MODULE_INT_MODEM_3GPP_REGISTRATION_STATE_SEARCHING = 2,
75
MODULE_INT_MODEM_3GPP_REGISTRATION_STATE_DENIED = 3,
76
MODULE_INT_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN = 4,
77
MODULE_INT_MODEM_3GPP_REGISTRATION_STATE_ROAMING = 5,
78
} ModuleIntModem3gppRegistrationState;
80
//Modem USSD state internal flags
82
MODULE_INT_MODEM_3GPP_USSD_SESSION_STATE_UNKNOWN = 0,
83
MODULE_INT_MODEM_3GPP_USSD_SESSION_STATE_IDLE = 1,
84
MODULE_INT_MODEM_3GPP_USSD_SESSION_STATE_ACTIVE = 2,
85
MODULE_INT_MODEM_3GPP_USSD_SESSION_STATE_USER_RESPONSE = 3,
86
} ModuleIntModem3gppUssdSessionState;
88
//Modem network availability internal flags
90
MODULE_INT_MODEM_3GPP_NETWORK_AVAILABILITY_UNKNOWN = 0,
91
MODULE_INT_MODEM_3GPP_NETWORK_AVAILABILITY_AVAILABLE = 1,
92
MODULE_INT_MODEM_3GPP_NETWORK_AVAILABILITY_CURRENT = 2,
93
MODULE_INT_MODEM_3GPP_NETWORK_AVAILABILITY_FORBIDDEN = 3,
94
} ModuleIntModem3gppNetworkAvailability;
96
//Modem acess technology internal flags
98
MODULE_INT_MODEM_ACCESS_TECHNOLOGY_UNKNOWN = 0,
99
MODULE_INT_MODEM_ACCESS_TECHNOLOGY_POTS = 1 << 0,
100
MODULE_INT_MODEM_ACCESS_TECHNOLOGY_GSM = 1 << 1,
101
MODULE_INT_MODEM_ACCESS_TECHNOLOGY_GSM_COMPACT = 1 << 2,
102
MODULE_INT_MODEM_ACCESS_TECHNOLOGY_GPRS = 1 << 3,
103
MODULE_INT_MODEM_ACCESS_TECHNOLOGY_EDGE = 1 << 4,
104
MODULE_INT_MODEM_ACCESS_TECHNOLOGY_UMTS = 1 << 5,
105
MODULE_INT_MODEM_ACCESS_TECHNOLOGY_HSDPA = 1 << 6,
106
MODULE_INT_MODEM_ACCESS_TECHNOLOGY_HSUPA = 1 << 7,
107
MODULE_INT_MODEM_ACCESS_TECHNOLOGY_HSPA = 1 << 8,
108
MODULE_INT_MODEM_ACCESS_TECHNOLOGY_HSPA_PLUS = 1 << 9,
109
MODULE_INT_MODEM_ACCESS_TECHNOLOGY_1XRTT = 1 << 10,
110
MODULE_INT_MODEM_ACCESS_TECHNOLOGY_EVDO0 = 1 << 11,
111
MODULE_INT_MODEM_ACCESS_TECHNOLOGY_EVDOA = 1 << 12,
112
MODULE_INT_MODEM_ACCESS_TECHNOLOGY_EVDOB = 1 << 13,
113
MODULE_INT_MODEM_ACCESS_TECHNOLOGY_LTE = 1 << 14,
114
MODULE_INT_MODEM_ACCESS_TECHNOLOGY_ANY = 0xFFFFFFFF,
115
} ModuleIntModemAccessTechnology;
117
//Location types internal flags
119
MODULE_INT_MODEM_LOCATION_SOURCE_NONE = 0,
120
MODULE_INT_MODEM_LOCATION_SOURCE_3GPP_LAC_CI = 1 << 0,
121
MODULE_INT_MODEM_LOCATION_SOURCE_GPS_RAW = 1 << 1,
122
MODULE_INT_MODEM_LOCATION_SOURCE_GPS_NMEA = 1 << 2,
123
} ModuleIntModemLocationSource;
125
//SMS message state internal flags
127
MODULE_INT_SMS_STATE_UNKNOWN = 0,
128
MODULE_INT_SMS_STATE_STORED = 1,
129
MODULE_INT_SMS_STATE_RECEIVING = 2,
130
MODULE_INT_SMS_STATE_RECEIVED = 3,
131
MODULE_INT_SMS_STATE_SENDING = 4,
132
MODULE_INT_SMS_STATE_SENT = 5,
135
//SMS message internal type
137
MODULE_INT_PDU_TYPE_UNKNOWN = 0,
138
MODULE_INT_PDU_TYPE_DELIVER = 1,
139
MODULE_INT_PDU_TYPE_SUBMIT = 2,
140
MODULE_INT_PDU_TYPE_STATUS_REPORT = 3
141
} ModuleIntSmsPduType;
143
//Private module variables
144
struct _mmguimoduledata {
146
GDBusConnection *connection;
148
GDBusObjectManager *objectmanager;
149
GDBusProxy *cardproxy;
150
GDBusProxy *netproxy;
151
GDBusProxy *modemproxy;
152
GDBusProxy *smsproxy;
153
GDBusProxy *ussdproxy;
154
GDBusProxy *locationproxy;
155
GDBusProxy *timeproxy;
156
GDBusProxy *contactsproxy;
157
//Attached signal handlers
158
gulong netpropsignal;
160
gulong modempropsignal;
162
gulong locationpropsignal;
164
//Partial SMS messages
169
GCancellable *cancellable;
170
//Operations timeouts
171
guint timeouts[MMGUI_DEVICE_OPERATIONS];
174
typedef struct _mmguimoduledata *moduledata_t;
176
static gboolean mmgui_module_device_enabled_from_state(gint state);
177
static gboolean mmgui_module_device_locked_from_state(gint state);
178
static gboolean mmgui_module_device_connected_from_state(gint state);
179
static gboolean mmgui_module_device_registered_from_state(gint state);
180
static enum _mmgui_device_types mmgui_module_device_type_from_caps(gint caps);
181
static enum _mmgui_reg_status mmgui_module_registration_status_translate(guint status);
182
static enum _mmgui_network_availability mmgui_module_network_availability_status_translate(guint status);
183
static enum _mmgui_access_tech mmgui_module_access_technology_translate(guint technology);
184
static enum _mmgui_device_modes mmgui_module_access_mode_translate(guint mode);
185
static gboolean mmgui_module_devices_update_device_mode(gpointer mmguicore, gint oldstate, gint newstate, guint changereason);
186
static gboolean mmgui_module_devices_update_location(gpointer mmguicore, mmguidevice_t device);
187
static gboolean mmgui_module_devices_enable_location(gpointer mmguicore, mmguidevice_t device, gboolean enable);
189
static mmguidevice_t mmgui_module_device_new(mmguicore_t mmguicore, const gchar *devpath);
191
static mmgui_sms_message_t mmgui_module_sms_retrieve(mmguicore_t mmguicore, const gchar *smspath);
192
static gint mmgui_module_sms_get_id(mmguicore_t mmguicore, const gchar *smspath);
195
static void mmgui_module_handle_error_message(mmguicore_t mmguicore, GError *error)
197
moduledata_t moduledata;
199
if ((mmguicore == NULL) || (error == NULL)) return;
201
moduledata = (moduledata_t)mmguicore->moduledata;
203
if (moduledata == NULL) return;
205
if (moduledata->errormessage != NULL) {
206
g_free(moduledata->errormessage);
209
if (error->message != NULL) {
210
moduledata->errormessage = g_strdup(error->message);
212
moduledata->errormessage = g_strdup("Unknown error");
215
g_warning("%s: %s", MMGUI_MODULE_DESCRIPTION, moduledata->errormessage);
218
static guint mmgui_module_get_object_path_index(const gchar *objectpath)
223
objectpathid = strrchr(objectpath, '/') + 1;
224
if ((objectpathid != NULL) && (objectpathid[0] != '\0')) {
225
id = atoi(objectpathid);
233
static void mmgui_signal_handler(GDBusProxy *proxy, const gchar *sender_name, const gchar *signal_name, GVariant *parameters, gpointer data)
235
mmguicore_t mmguicore;
236
moduledata_t moduledata;
239
gint oldstate, newstate;
242
if (data == NULL) return;
244
mmguicore = (mmguicore_t)data;
245
moduledata = (moduledata_t)mmguicore->moduledata;
247
if (g_str_equal(signal_name, "Added")) {
248
g_variant_get(parameters, "(ob)", &statusstr, &statusflag);
250
/*Message received from network*/
251
moduledata->partialsms = g_list_prepend(moduledata->partialsms, g_strdup(statusstr));
253
} else if (g_str_equal(signal_name, "StateChanged")) {
254
g_variant_get(parameters, "(iiu)", &oldstate, &newstate, &changereason);
255
/*Send signals if needed*/
256
mmgui_module_devices_update_device_mode(mmguicore, oldstate, newstate, changereason);
259
g_debug("SIGNAL: %s (%s) argtype: %s\n", signal_name, sender_name, g_variant_get_type_string(parameters));
262
static void mmgui_property_change_handler(GDBusProxy *proxy, GVariant *changed_properties, GStrv invalidated_properties, gpointer data)
264
mmguicore_t mmguicore;
265
mmguidevice_t device;
273
if ((changed_properties == NULL) || (data == NULL)) return;
275
mmguicore = (mmguicore_t)data;
277
if (mmguicore->device == NULL) return;
278
device = mmguicore->device;
280
if (g_variant_n_children(changed_properties) > 0) {
281
g_variant_get(changed_properties, "a{sv}", &iter);
282
while (g_variant_iter_loop(iter, "{&sv}", &key, &value)) {
283
if (g_str_equal(key, "SignalQuality")) {
284
g_variant_get(value, "(ub)", &statevalue, &stateflag);
285
if (statevalue != device->siglevel) {
286
device->siglevel = statevalue;
287
if (mmguicore->eventcb != NULL) {
288
(mmguicore->eventcb)(MMGUI_EVENT_SIGNAL_LEVEL_CHANGE, mmguicore, mmguicore->device);
291
} else if (g_str_equal(key, "AccessTechnologies")) {
292
statevalue = mmgui_module_access_mode_translate(g_variant_get_uint32(value));
293
if (statevalue != device->mode) {
294
device->mode = statevalue;
295
if (mmguicore->eventcb != NULL) {
296
(mmguicore->eventcb)(MMGUI_EVENT_NETWORK_MODE_CHANGE, mmguicore, mmguicore->device);
300
} else if (g_str_equal(key, "Location")) {
301
if (mmgui_module_devices_update_location(mmguicore, mmguicore->device)) {
302
if (mmguicore->eventcb != NULL) {
303
(mmguicore->eventcb)(MMGUI_EVENT_LOCATION_CHANGE, mmguicore, mmguicore->device);
307
g_debug("Property changed: %s\n", key);
309
g_variant_iter_free(iter);
313
static void mmgui_objectmanager_added_signal_handler(GDBusObjectManager *manager, GDBusObject *object, gpointer user_data)
315
mmguicore_t mmguicore;
316
const gchar *devpath;
317
mmguidevice_t device;
319
if ((user_data == NULL) || (object == NULL)) return;
321
mmguicore = (mmguicore_t)user_data;
323
if (mmguicore->eventcb != NULL) {
324
devpath = g_dbus_object_get_object_path(object);
325
g_debug("Device added: %s\n", devpath);
326
if (devpath != NULL) {
327
device = mmgui_module_device_new(mmguicore, devpath);
328
(mmguicore->eventcb)(MMGUI_EVENT_DEVICE_ADDED, mmguicore, device);
333
static void mmgui_objectmanager_removed_signal_handler(GDBusObjectManager *manager, GDBusObject *object, gpointer user_data)
335
mmguicore_t mmguicore;
336
const gchar *devpath;
339
if ((user_data == NULL) || (object == NULL)) return;
341
mmguicore = (mmguicore_t)user_data;
343
if (mmguicore->eventcb != NULL) {
344
devpath = g_dbus_object_get_object_path(object);
345
g_debug("Device removed: %s\n", devpath);
346
if (devpath != NULL) {
347
id = mmgui_module_get_object_path_index(devpath);
348
(mmguicore->eventcb)(MMGUI_EVENT_DEVICE_REMOVED, mmguicore, GUINT_TO_POINTER(id));
353
static gboolean mmgui_module_device_enabled_from_state(gint state)
358
case MODULE_INT_MODEM_STATE_FAILED:
359
case MODULE_INT_MODEM_STATE_UNKNOWN:
360
case MODULE_INT_MODEM_STATE_INITIALIZING:
361
case MODULE_INT_MODEM_STATE_LOCKED:
362
case MODULE_INT_MODEM_STATE_DISABLED:
363
case MODULE_INT_MODEM_STATE_DISABLING:
364
case MODULE_INT_MODEM_STATE_ENABLING:
367
case MODULE_INT_MODEM_STATE_ENABLED:
368
case MODULE_INT_MODEM_STATE_SEARCHING:
369
case MODULE_INT_MODEM_STATE_REGISTERED:
370
case MODULE_INT_MODEM_STATE_DISCONNECTING:
371
case MODULE_INT_MODEM_STATE_CONNECTING:
372
case MODULE_INT_MODEM_STATE_CONNECTED:
383
static gboolean mmgui_module_device_locked_from_state(gint state)
388
case MODULE_INT_MODEM_STATE_FAILED:
389
case MODULE_INT_MODEM_STATE_UNKNOWN:
390
case MODULE_INT_MODEM_STATE_INITIALIZING:
393
case MODULE_INT_MODEM_STATE_LOCKED:
396
case MODULE_INT_MODEM_STATE_DISABLED:
397
case MODULE_INT_MODEM_STATE_DISABLING:
398
case MODULE_INT_MODEM_STATE_ENABLING:
399
case MODULE_INT_MODEM_STATE_ENABLED:
400
case MODULE_INT_MODEM_STATE_SEARCHING:
401
case MODULE_INT_MODEM_STATE_REGISTERED:
402
case MODULE_INT_MODEM_STATE_DISCONNECTING:
403
case MODULE_INT_MODEM_STATE_CONNECTING:
404
case MODULE_INT_MODEM_STATE_CONNECTED:
415
static gboolean mmgui_module_device_connected_from_state(gint state)
420
case MODULE_INT_MODEM_STATE_FAILED:
421
case MODULE_INT_MODEM_STATE_UNKNOWN:
422
case MODULE_INT_MODEM_STATE_INITIALIZING:
423
case MODULE_INT_MODEM_STATE_LOCKED:
424
case MODULE_INT_MODEM_STATE_DISABLED:
425
case MODULE_INT_MODEM_STATE_DISABLING:
426
case MODULE_INT_MODEM_STATE_ENABLING:
427
case MODULE_INT_MODEM_STATE_ENABLED:
428
case MODULE_INT_MODEM_STATE_SEARCHING:
429
case MODULE_INT_MODEM_STATE_REGISTERED:
432
case MODULE_INT_MODEM_STATE_DISCONNECTING:
435
case MODULE_INT_MODEM_STATE_CONNECTING:
438
case MODULE_INT_MODEM_STATE_CONNECTED:
449
static gboolean mmgui_module_device_registered_from_state(gint state)
454
case MODULE_INT_MODEM_STATE_FAILED:
455
case MODULE_INT_MODEM_STATE_UNKNOWN:
456
case MODULE_INT_MODEM_STATE_INITIALIZING:
457
case MODULE_INT_MODEM_STATE_LOCKED:
458
case MODULE_INT_MODEM_STATE_DISABLED:
459
case MODULE_INT_MODEM_STATE_DISABLING:
460
case MODULE_INT_MODEM_STATE_ENABLING:
461
case MODULE_INT_MODEM_STATE_ENABLED:
462
case MODULE_INT_MODEM_STATE_SEARCHING:
465
case MODULE_INT_MODEM_STATE_REGISTERED:
466
case MODULE_INT_MODEM_STATE_DISCONNECTING:
467
case MODULE_INT_MODEM_STATE_CONNECTING:
468
case MODULE_INT_MODEM_STATE_CONNECTED:
479
static enum _mmgui_device_types mmgui_module_device_type_from_caps(gint caps)
481
enum _mmgui_device_types type;
484
case MODULE_INT_MODEM_CAPABILITY_NONE:
485
case MODULE_INT_MODEM_CAPABILITY_POTS:
486
type = MMGUI_DEVICE_TYPE_GSM;
488
case MODULE_INT_MODEM_CAPABILITY_CDMA_EVDO:
489
type = MMGUI_DEVICE_TYPE_CDMA;
491
case MODULE_INT_MODEM_CAPABILITY_GSM_UMTS:
492
case MODULE_INT_MODEM_CAPABILITY_LTE:
493
case MODULE_INT_MODEM_CAPABILITY_LTE_ADVANCED:
494
case MODULE_INT_MODEM_CAPABILITY_IRIDIUM:
495
type = MMGUI_DEVICE_TYPE_GSM;
498
type = MMGUI_DEVICE_TYPE_GSM;
505
static enum _mmgui_reg_status mmgui_module_registration_status_translate(guint status)
507
enum _mmgui_reg_status tstatus;
510
case MODULE_INT_MODEM_3GPP_REGISTRATION_STATE_IDLE:
511
tstatus = MMGUI_REG_STATUS_IDLE;
513
case MODULE_INT_MODEM_3GPP_REGISTRATION_STATE_HOME:
514
tstatus = MMGUI_REG_STATUS_HOME;
516
case MODULE_INT_MODEM_3GPP_REGISTRATION_STATE_SEARCHING:
517
tstatus = MMGUI_REG_STATUS_SEARCHING;
519
case MODULE_INT_MODEM_3GPP_REGISTRATION_STATE_DENIED:
520
tstatus = MMGUI_REG_STATUS_DENIED;
522
case MODULE_INT_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN:
523
tstatus = MMGUI_REG_STATUS_UNKNOWN;
525
case MODULE_INT_MODEM_3GPP_REGISTRATION_STATE_ROAMING:
526
tstatus = MMGUI_REG_STATUS_ROAMING;
529
tstatus = MMGUI_REG_STATUS_UNKNOWN;
536
static enum _mmgui_network_availability mmgui_module_network_availability_status_translate(guint status)
541
case MODULE_INT_MODEM_3GPP_NETWORK_AVAILABILITY_UNKNOWN:
542
tstatus = MMGUI_NA_UNKNOWN;
544
case MODULE_INT_MODEM_3GPP_NETWORK_AVAILABILITY_AVAILABLE:
545
tstatus = MMGUI_NA_AVAILABLE;
547
case MODULE_INT_MODEM_3GPP_NETWORK_AVAILABILITY_CURRENT:
548
tstatus = MMGUI_NA_CURRENT;
550
case MODULE_INT_MODEM_3GPP_NETWORK_AVAILABILITY_FORBIDDEN:
551
tstatus = MMGUI_NA_FORBIDDEN;
554
tstatus = MMGUI_NA_UNKNOWN;
561
static enum _mmgui_access_tech mmgui_module_access_technology_translate(guint technology)
563
enum _mmgui_access_tech ttechnology;
565
switch (technology) {
566
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_UNKNOWN:
567
ttechnology = MMGUI_ACCESS_TECH_UNKNOWN;
569
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_POTS:
570
ttechnology = MMGUI_ACCESS_TECH_UNKNOWN;
572
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_GSM:
573
ttechnology = MMGUI_ACCESS_TECH_GSM;
575
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_GSM_COMPACT:
576
ttechnology = MMGUI_ACCESS_TECH_GSM_COMPACT;
578
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_GPRS:
579
ttechnology = MMGUI_ACCESS_TECH_EDGE;
581
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_EDGE:
582
ttechnology = MMGUI_ACCESS_TECH_EDGE;
584
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_UMTS:
585
ttechnology = MMGUI_ACCESS_TECH_UMTS;
587
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_HSDPA:
588
ttechnology = MMGUI_ACCESS_TECH_HSDPA;
590
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_HSUPA:
591
ttechnology = MMGUI_ACCESS_TECH_HSUPA;
593
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_HSPA:
594
ttechnology = MMGUI_ACCESS_TECH_HSPA;
596
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_HSPA_PLUS:
597
ttechnology = MMGUI_ACCESS_TECH_HSPA_PLUS;
599
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_1XRTT:
600
ttechnology = MMGUI_ACCESS_TECH_1XRTT;
602
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_EVDO0:
603
ttechnology = MMGUI_ACCESS_TECH_EVDO0;
605
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_EVDOA:
606
ttechnology = MMGUI_ACCESS_TECH_EVDOA;
608
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_EVDOB:
609
ttechnology = MMGUI_ACCESS_TECH_EVDOB;
611
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_LTE:
612
ttechnology = MMGUI_ACCESS_TECH_LTE;
614
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_ANY:
615
ttechnology = MMGUI_ACCESS_TECH_UNKNOWN;
618
ttechnology = MMGUI_ACCESS_TECH_UNKNOWN;
625
static enum _mmgui_device_modes mmgui_module_access_mode_translate(guint mode)
627
enum _mmgui_device_modes tmode;
630
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_UNKNOWN:
631
tmode = MMGUI_DEVICE_MODE_UNKNOWN;
633
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_POTS:
634
tmode = MMGUI_DEVICE_MODE_UNKNOWN;
636
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_GSM:
637
tmode = MMGUI_DEVICE_MODE_GSM;
639
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_GSM_COMPACT:
640
tmode = MMGUI_DEVICE_MODE_GSM_COMPACT;
642
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_GPRS:
643
tmode = MMGUI_DEVICE_MODE_GPRS;
645
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_EDGE:
646
tmode = MMGUI_DEVICE_MODE_EDGE;
648
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_UMTS:
649
tmode = MMGUI_DEVICE_MODE_UMTS;
651
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_HSDPA:
652
tmode = MMGUI_DEVICE_MODE_HSDPA;
654
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_HSUPA:
655
tmode = MMGUI_DEVICE_MODE_HSUPA;
657
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_HSPA:
658
tmode = MMGUI_DEVICE_MODE_HSPA;
660
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_HSPA_PLUS:
661
tmode = MMGUI_DEVICE_MODE_HSPA_PLUS;
663
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_1XRTT:
664
tmode = MMGUI_DEVICE_MODE_1XRTT;
666
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_EVDO0:
667
tmode = MMGUI_DEVICE_MODE_EVDO0;
669
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_EVDOA:
670
tmode = MMGUI_DEVICE_MODE_EVDOA;
672
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_EVDOB:
673
tmode = MMGUI_DEVICE_MODE_EVDOB;
675
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_LTE:
676
tmode = MMGUI_DEVICE_MODE_LTE;
678
case MODULE_INT_MODEM_ACCESS_TECHNOLOGY_ANY:
679
tmode = MMGUI_DEVICE_MODE_UNKNOWN;
682
tmode = MMGUI_DEVICE_MODE_UNKNOWN;
689
static mmguidevice_t mmgui_module_device_new(mmguicore_t mmguicore, const gchar *devpath)
691
mmguidevice_t device;
692
moduledata_t moduledata;
693
GDBusProxy *deviceproxy;
695
GVariant *deviceinfo;
700
if ((mmguicore == NULL) || (devpath == NULL)) return NULL;
702
moduledata = (moduledata_t)mmguicore->moduledata;
704
if (moduledata->connection == NULL) return NULL;
706
device = g_new0(struct _mmguidevice, 1);
708
device->id = mmgui_module_get_object_path_index(devpath);
709
device->objectpath = g_strdup(devpath);
711
device->operation = MMGUI_DEVICE_OPERATION_IDLE;
712
/*Zero values we can't get this moment*/
714
device->smscaps = MMGUI_SMS_CAPS_NONE;
715
device->smsdb = NULL;
718
device->manufacturer = NULL;
719
device->model = NULL;
720
device->version = NULL;
721
device->operatorname = NULL;
722
device->operatorcode = NULL;
726
device->internalid = NULL;
727
device->persistentid = NULL;
728
device->sysfspath = NULL;
730
device->ussdcaps = MMGUI_USSD_CAPS_NONE;
731
device->ussdencoding = MMGUI_USSD_ENCODING_GSM7;
733
device->locationcaps = MMGUI_LOCATION_CAPS_NONE;
734
memset(device->loc3gppdata, 0, sizeof(device->loc3gppdata));
735
memset(device->locgpsdata, 0, sizeof(device->locgpsdata));
737
device->scancaps = MMGUI_SCAN_CAPS_NONE;
741
device->sessiontime = 0;
742
device->speedchecktime = 0;
743
device->smschecktime = 0;
744
device->speedindex = 0;
745
device->connected = FALSE;
746
memset(device->speedvalues, 0, sizeof(device->speedvalues));
747
memset(device->interface, 0, sizeof(device->interface));
749
device->contactscaps = MMGUI_CONTACTS_CAPS_NONE;
750
device->contactslist = NULL;
754
deviceproxy = g_dbus_proxy_new_sync(moduledata->connection,
755
G_DBUS_PROXY_FLAGS_NONE,
757
"org.freedesktop.ModemManager1",
759
"org.freedesktop.ModemManager1.Modem",
763
if ((deviceproxy == NULL) && (error != NULL)) {
764
mmgui_module_handle_error_message(mmguicore, error);
766
g_object_unref(deviceproxy);
767
/*Fill default values*/
768
device->manufacturer = g_strdup(_("Unknown"));
769
device->model = g_strdup(_("Unknown"));
770
device->version = g_strdup(_("Unknown"));
771
device->port = g_strdup(_("Unknown"));
772
device->type = MMGUI_DEVICE_TYPE_GSM;
776
/*Device manufacturer*/
777
deviceinfo = g_dbus_proxy_get_cached_property(deviceproxy, "Manufacturer");
778
if (deviceinfo != NULL) {
780
device->manufacturer = g_strdup(g_variant_get_string(deviceinfo, &strsize));
781
g_variant_unref(deviceinfo);
783
device->manufacturer = g_strdup(_("Unknown"));
787
deviceinfo = g_dbus_proxy_get_cached_property(deviceproxy, "Model");
788
if (deviceinfo != NULL) {
790
device->model = g_strdup(g_variant_get_string(deviceinfo, &strsize));
791
g_variant_unref(deviceinfo);
793
device->model = g_strdup(_("Unknown"));
797
deviceinfo = g_dbus_proxy_get_cached_property(deviceproxy, "Revision");
798
if (deviceinfo != NULL) {
800
device->version = g_strdup(g_variant_get_string(deviceinfo, &strsize));
801
g_variant_unref(deviceinfo);
803
device->version = g_strdup(_("Unknown"));
807
deviceinfo = g_dbus_proxy_get_cached_property(deviceproxy, "PrimaryPort");
808
if (deviceinfo != NULL) {
810
device->port = g_strdup(g_variant_get_string(deviceinfo, &strsize));
811
g_variant_unref(deviceinfo);
813
device->port = g_strdup("");
816
/*Need to get usb device serial for fallback traffic monitoring*/
817
deviceinfo = g_dbus_proxy_get_cached_property(deviceproxy, "Device");
818
if (deviceinfo != NULL) {
820
device->sysfspath = g_strdup(g_variant_get_string(deviceinfo, &strsize));
821
g_variant_unref(deviceinfo);
823
device->sysfspath = g_strdup("");
826
/*Device type (version 0.7.990 property)*/
827
deviceinfo = g_dbus_proxy_get_cached_property(deviceproxy, "ModemCapabilities");
828
if (deviceinfo != NULL) {
829
statevalue = g_variant_get_uint32(deviceinfo);
830
device->type = mmgui_module_device_type_from_caps(statevalue);
831
g_variant_unref(deviceinfo);
833
/*Device type (version 0.7.991 property)*/
834
deviceinfo = g_dbus_proxy_get_cached_property(deviceproxy, "CurrentCapabilities");
835
if (deviceinfo != NULL) {
836
statevalue = g_variant_get_uint32(deviceinfo);
837
device->type = mmgui_module_device_type_from_caps(statevalue);
838
g_variant_unref(deviceinfo);
840
device->type = MODULE_INT_MODEM_CAPABILITY_GSM_UMTS;
844
/*Is device enabled, blocked and registered*/
845
deviceinfo = g_dbus_proxy_get_cached_property(deviceproxy, "State");
846
if (deviceinfo != NULL) {
847
statevalue = g_variant_get_int32(deviceinfo);
848
device->enabled = mmgui_module_device_enabled_from_state(statevalue);
849
device->blocked = mmgui_module_device_locked_from_state(statevalue);
850
device->registered = mmgui_module_device_registered_from_state(statevalue);
851
g_variant_unref(deviceinfo);
853
device->enabled = TRUE;
854
device->blocked = FALSE;
855
device->registered = TRUE;
858
/*Internal Modem Manager identifier*/
859
deviceinfo = g_dbus_proxy_get_cached_property(deviceproxy, "DeviceIdentifier");
860
if (deviceinfo != NULL) {
862
device->internalid = g_strdup(g_variant_get_string(deviceinfo, &strsize));
863
g_variant_unref(deviceinfo);
865
device->internalid = NULL;
868
/*Persistent device identifier*/
869
blockstr = g_strdup_printf("%s_%s_%s", device->manufacturer, device->model, device->version);
870
device->persistentid = g_compute_checksum_for_string(G_CHECKSUM_MD5, (const gchar *)blockstr, -1);
873
g_object_unref(deviceproxy);
878
G_MODULE_EXPORT gboolean mmgui_module_init(mmguimodule_t module)
880
if (module == NULL) return FALSE;
882
module->type = MMGUI_MODULE_TYPE_MODEM_MANAGER;
883
module->requirement = MMGUI_MODULE_REQUIREMENT_SERVICE;
884
module->priority = MMGUI_MODULE_PRIORITY_NORMAL;
885
module->identifier = MMGUI_MODULE_IDENTIFIER;
886
module->functions = MMGUI_MODULE_FUNCTION_BASIC;
887
g_snprintf(module->servicename, sizeof(module->servicename), MMGUI_MODULE_SERVICE_NAME);
888
g_snprintf(module->description, sizeof(module->description), MMGUI_MODULE_DESCRIPTION);
893
G_MODULE_EXPORT gboolean mmgui_module_open(gpointer mmguicore)
895
mmguicore_t mmguicorelc;
896
moduledata_t *moduledata;
899
if (mmguicore == NULL) return FALSE;
901
mmguicorelc = (mmguicore_t)mmguicore;
903
moduledata = (moduledata_t *)&mmguicorelc->moduledata;
905
(*moduledata) = g_new0(struct _mmguimoduledata, 1);
909
(*moduledata)->connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
911
(*moduledata)->errormessage = NULL;
913
if (((*moduledata)->connection == NULL) && (error != NULL)) {
914
mmgui_module_handle_error_message(mmguicorelc, error);
916
g_free(mmguicorelc->moduledata);
922
(*moduledata)->objectmanager = g_dbus_object_manager_client_new_sync((*moduledata)->connection,
923
G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
924
"org.freedesktop.ModemManager1",
925
"/org/freedesktop/ModemManager1",
932
g_signal_connect(G_OBJECT((*moduledata)->objectmanager), "object-added", G_CALLBACK(mmgui_objectmanager_added_signal_handler), mmguicore);
933
g_signal_connect(G_OBJECT((*moduledata)->objectmanager), "object-removed", G_CALLBACK(mmgui_objectmanager_removed_signal_handler), mmguicore);
935
if (((*moduledata)->objectmanager == NULL) && (error != NULL)) {
936
mmgui_module_handle_error_message(mmguicorelc, error);
938
g_object_unref((*moduledata)->connection);
939
g_free(mmguicorelc->moduledata);
943
(*moduledata)->cancellable = g_cancellable_new();
944
/*Operations timeouts*/
945
(*moduledata)->timeouts[MMGUI_DEVICE_OPERATION_ENABLE] = MMGUI_MODULE_ENABLE_OPERATION_TIMEOUT;
946
(*moduledata)->timeouts[MMGUI_DEVICE_OPERATION_SEND_SMS] = MMGUI_MODULE_SEND_SMS_OPERATION_TIMEOUT;
947
(*moduledata)->timeouts[MMGUI_DEVICE_OPERATION_SEND_USSD] = MMGUI_MODULE_SEND_USSD_OPERATION_TIMEOUT;
948
(*moduledata)->timeouts[MMGUI_DEVICE_OPERATION_SCAN] = MMGUI_MODULE_NETWORKS_SCAN_OPERATION_TIMEOUT;
953
G_MODULE_EXPORT gboolean mmgui_module_close(gpointer mmguicore)
955
mmguicore_t mmguicorelc;
956
moduledata_t moduledata;
959
if (mmguicore == NULL) return FALSE;
960
mmguicorelc = (mmguicore_t)mmguicore;
961
moduledata = (moduledata_t)(mmguicorelc->moduledata);
966
if (moduledata != NULL) {
967
if (moduledata->errormessage != NULL) {
968
g_free(moduledata->errormessage);
971
if (moduledata->cancellable != NULL) {
972
g_object_unref(moduledata->cancellable);
973
moduledata->cancellable = NULL;
976
if (moduledata->objectmanager != NULL) {
977
g_object_unref(moduledata->objectmanager);
978
moduledata->objectmanager = NULL;
981
if (moduledata->connection != NULL) {
982
g_object_unref(moduledata->connection);
983
moduledata->connection = NULL;
992
G_MODULE_EXPORT gchar *mmgui_module_last_error(gpointer mmguicore)
994
mmguicore_t mmguicorelc;
995
moduledata_t moduledata;
997
if (mmguicore == NULL) return NULL;
999
mmguicorelc = (mmguicore_t)mmguicore;
1000
moduledata = (moduledata_t)(mmguicorelc->moduledata);
1002
return moduledata->errormessage;
1005
G_MODULE_EXPORT gboolean mmgui_module_interrupt_operation(gpointer mmguicore)
1007
mmguicore_t mmguicorelc;
1008
moduledata_t moduledata;
1009
mmguidevice_t device;
1011
if (mmguicore == NULL) return FALSE;
1012
mmguicorelc = (mmguicore_t)mmguicore;
1014
if (mmguicorelc->moduledata == NULL) return FALSE;
1015
moduledata = (moduledata_t)mmguicorelc->moduledata;
1017
if (mmguicorelc->device == NULL) return FALSE;
1018
device = mmguicorelc->device;
1020
if (device->operation == MMGUI_DEVICE_OPERATION_IDLE) return FALSE;
1022
if (moduledata->cancellable != NULL) {
1023
g_cancellable_cancel(moduledata->cancellable);
1030
G_MODULE_EXPORT gboolean mmgui_module_set_timeout(gpointer mmguicore, guint operation, guint timeout)
1032
mmguicore_t mmguicorelc;
1033
moduledata_t moduledata;
1035
if (mmguicore == NULL) return FALSE;
1036
mmguicorelc = (mmguicore_t)mmguicore;
1038
if (mmguicorelc->moduledata == NULL) return FALSE;
1039
moduledata = (moduledata_t)mmguicorelc->moduledata;
1041
if (timeout < 1000) timeout *= 1000;
1043
if (operation < MMGUI_DEVICE_OPERATIONS) {
1044
moduledata->timeouts[operation] = timeout;
1051
G_MODULE_EXPORT guint mmgui_module_devices_enum(gpointer mmguicore, GSList **devicelist)
1053
mmguicore_t mmguicorelc;
1054
moduledata_t moduledata;
1056
GList *objects, *object;
1057
const gchar *devpath;
1059
if ((mmguicore == NULL) || (devicelist == NULL)) return 0;
1060
mmguicorelc = (mmguicore_t)mmguicore;
1062
if (mmguicorelc->moduledata == NULL) return 0;
1063
moduledata = (moduledata_t)mmguicorelc->moduledata;
1067
objects = g_dbus_object_manager_get_objects(moduledata->objectmanager);
1068
for (object = objects; object != NULL; object = object->next) {
1069
devpath = g_dbus_object_get_object_path(G_DBUS_OBJECT(object->data));
1070
g_debug("Device object path: %s\n", devpath);
1071
*devicelist = g_slist_prepend(*devicelist, mmgui_module_device_new(mmguicore, devpath));
1074
g_list_foreach(objects, (GFunc)g_object_unref, NULL);
1075
g_list_free(objects);
1080
G_MODULE_EXPORT gboolean mmgui_module_devices_state(gpointer mmguicore, enum _mmgui_device_state_request request)
1082
mmguicore_t mmguicorelc;
1083
moduledata_t moduledata;
1084
mmguidevice_t device;
1089
if (mmguicore == NULL) return FALSE;
1090
mmguicorelc = (mmguicore_t)mmguicore;
1092
if (mmguicorelc->moduledata == NULL) return FALSE;
1093
moduledata = (moduledata_t)mmguicorelc->moduledata;
1095
if (mmguicorelc->device == NULL) return FALSE;
1096
device = mmguicorelc->device;
1098
if (moduledata->modemproxy == NULL) return FALSE;
1100
data = g_dbus_proxy_get_cached_property(moduledata->modemproxy, "State");
1102
statevalue = g_variant_get_int32(data);
1103
g_variant_unref(data);
1109
case MMGUI_DEVICE_STATE_REQUEST_ENABLED:
1110
/*Is device enabled*/
1111
res = mmgui_module_device_enabled_from_state(statevalue);
1112
if (device->operation != MMGUI_DEVICE_OPERATION_ENABLE) {
1113
device->enabled = res;
1116
case MMGUI_DEVICE_STATE_REQUEST_LOCKED:
1117
/*Is device blocked*/
1118
res = mmgui_module_device_locked_from_state(statevalue);
1119
device->blocked = res;
1121
case MMGUI_DEVICE_STATE_REQUEST_REGISTERED:
1122
/*Is device registered in network*/
1123
res = mmgui_module_device_registered_from_state(statevalue);
1124
device->registered = res;
1126
case MMGUI_DEVICE_STATE_REQUEST_CONNECTED:
1127
/*Is device connected (modem manager state)*/
1128
res = mmgui_module_device_connected_from_state(statevalue);
1138
G_MODULE_EXPORT gboolean mmgui_module_devices_update_state(gpointer mmguicore)
1140
mmguicore_t mmguicorelc;
1141
moduledata_t moduledata;
1142
mmguidevice_t device;
1148
if (mmguicore == NULL) return FALSE;
1149
mmguicorelc = (mmguicore_t)mmguicore;
1151
if (mmguicorelc->moduledata == NULL) return FALSE;
1152
moduledata = (moduledata_t)mmguicorelc->moduledata;
1154
if (mmguicorelc->device == NULL) return FALSE;
1155
device = mmguicorelc->device;
1157
if (device->enabled) {
1158
//Search for completed messages in partial sms list
1159
if ((moduledata->partialsms != NULL) && (mmguicorelc->eventcb != NULL)) {
1160
pslnode = moduledata->partialsms;
1161
while (pslnode != NULL) {
1162
pslpath = (gchar *)pslnode->data;
1163
pslnext = g_list_next(pslnode);
1164
//If messageid is -1 then it is incomplete
1165
messageid = mmgui_module_sms_get_id(mmguicore, pslpath);
1166
if (messageid != -1) {
1170
moduledata->partialsms = g_list_delete_link(moduledata->partialsms, pslnode);
1172
(mmguicorelc->eventcb)(MMGUI_EVENT_SMS_COMPLETED, mmguicore, GUINT_TO_POINTER((guint)messageid));
1182
static gboolean mmgui_module_devices_update_device_mode(gpointer mmguicore, gint oldstate, gint newstate, guint changereason)
1184
mmguicore_t mmguicorelc;
1185
moduledata_t moduledata;
1186
mmguidevice_t device;
1187
gboolean enabledsignal, blockedsignal, regsignal;
1191
if (mmguicore == NULL) return FALSE;
1192
mmguicorelc = (mmguicore_t)mmguicore;
1194
if (mmguicorelc->moduledata == NULL) return FALSE;
1195
moduledata = (moduledata_t)mmguicorelc->moduledata;
1197
if (mmguicorelc->device == NULL) return FALSE;
1198
device = mmguicorelc->device;
1200
/*Upadate state flags*/
1201
if (device->operation != MMGUI_DEVICE_OPERATION_ENABLE) {
1202
device->enabled = mmgui_module_device_enabled_from_state(newstate);
1204
device->blocked = mmgui_module_device_locked_from_state(newstate);
1205
device->registered = mmgui_module_device_registered_from_state(newstate);
1206
/*Is enabled signal needed */
1207
if ((device->operation != MMGUI_DEVICE_OPERATION_ENABLE) && (mmgui_module_device_enabled_from_state(oldstate) != device->enabled)) {
1208
enabledsignal = TRUE;
1210
enabledsignal = FALSE;
1212
/*Is blocked signal needed */
1213
if (mmgui_module_device_locked_from_state(oldstate) != device->blocked) {
1214
blockedsignal = TRUE;
1216
blockedsignal = FALSE;
1218
/*Is registered signal needed */
1219
if (mmgui_module_device_registered_from_state(oldstate) != device->registered) {
1225
/*Return if no signals will be sent*/
1226
if ((!enabledsignal) && (!blockedsignal) && (!regsignal)) return TRUE;
1228
if (moduledata->netproxy != NULL) {
1229
//Operator information
1230
if (device->operatorcode != NULL) {
1231
g_free(device->operatorcode);
1232
device->operatorcode = NULL;
1235
if (device->operatorname != NULL) {
1236
g_free(device->operatorname);
1237
device->operatorname = NULL;
1240
//Registration state
1241
data = g_dbus_proxy_get_cached_property(moduledata->netproxy, "RegistrationState");
1243
device->regstatus = mmgui_module_registration_status_translate(g_variant_get_uint32(data));
1244
g_variant_unref(data);
1246
device->regstatus = MMGUI_REG_STATUS_UNKNOWN;
1249
data = g_dbus_proxy_get_cached_property(moduledata->netproxy, "OperatorCode");
1252
device->operatorcode = g_strdup(g_variant_get_string(data, &strsize));
1253
g_variant_unref(data);
1255
device->operatorcode = NULL;
1258
data = g_dbus_proxy_get_cached_property(moduledata->netproxy, "OperatorName");
1261
device->operatorname = g_strdup(g_variant_get_string(data, &strsize));
1262
g_variant_unref(data);
1264
device->operatorname = NULL;
1268
if (moduledata->modemproxy != NULL) {
1269
if (device->enabled) {
1270
//Device identifier (IMEI)
1271
if (device->imei != NULL) {
1272
g_free(device->imei);
1273
device->imei = NULL;
1276
data = g_dbus_proxy_get_cached_property(moduledata->modemproxy, "EquipmentIdentifier");
1278
device->imei = g_strdup(g_variant_get_string(data, &strsize));
1279
g_variant_unref(data);
1281
device->imei = NULL;
1286
if (moduledata->cardproxy != NULL) {
1287
if (device->type == MMGUI_DEVICE_TYPE_GSM) {
1288
if (device->enabled) {
1290
if (device->imsi != NULL) {
1291
g_free(device->imsi);
1292
device->imsi = NULL;
1295
data = g_dbus_proxy_get_cached_property(moduledata->cardproxy, "Imsi");
1298
device->imsi = g_strdup(g_variant_get_string(data, &strsize));
1299
g_variant_unref(data);
1301
device->imsi = NULL;
1304
} else if (device->type == MMGUI_DEVICE_TYPE_CDMA) {
1306
if (device->imsi != NULL) {
1307
g_free(device->imsi);
1308
device->imsi = NULL;
1314
if (enabledsignal) {
1315
if (mmguicorelc->eventcb != NULL) {
1316
(mmguicorelc->eventcb)(MMGUI_EVENT_DEVICE_ENABLED_STATUS, mmguicorelc, GUINT_TO_POINTER(device->enabled));
1319
/*Is blocked signal needed */
1320
if (blockedsignal) {
1321
if (mmguicorelc->eventcb != NULL) {
1322
(mmguicorelc->eventcb)(MMGUI_EVENT_DEVICE_BLOCKED_STATUS, mmguicorelc, GUINT_TO_POINTER(device->blocked));
1325
/*Is registered signal needed */
1327
if (mmguicorelc->eventcb != NULL) {
1328
(mmguicorelc->eventcb)(MMGUI_EVENT_NETWORK_REGISTRATION_CHANGE, mmguicorelc, device);
1335
static gboolean mmgui_module_devices_update_location(gpointer mmguicore, mmguidevice_t device)
1337
mmguicore_t mmguicorelc;
1338
moduledata_t moduledata;
1341
guint32 locationtype;
1342
GVariant *locationdata;
1343
gchar *locationstring;
1347
if ((mmguicore == NULL) || (device == NULL)) return FALSE;
1348
mmguicorelc = (mmguicore_t)mmguicore;
1350
if (mmguicorelc->moduledata == NULL) return FALSE;
1351
moduledata = (moduledata_t)mmguicorelc->moduledata;
1353
if ((!(device->locationcaps & MMGUI_LOCATION_CAPS_3GPP)) && (!(device->locationcaps & MMGUI_LOCATION_CAPS_GPS))) return FALSE;
1357
data = g_dbus_proxy_call_sync(moduledata->locationproxy,
1365
if ((data != NULL) && (error == NULL)) {
1366
g_variant_get(data, "(a{uv})", &iter);
1367
while (g_variant_iter_next(iter, "{uv}", &locationtype, &locationdata)) {
1368
if ((locationtype == MODULE_INT_MODEM_LOCATION_SOURCE_3GPP_LAC_CI) && (locationdata != NULL)) {
1371
locationstring = g_strdup(g_variant_get_string(locationdata, &strlength));
1372
device->loc3gppdata[0] = (guint)strtol(strsep(&locationstring, ","), NULL, 10);
1373
device->loc3gppdata[1] = (guint)strtol(strsep(&locationstring, ","), NULL, 10);
1374
device->loc3gppdata[2] = (guint)strtol(strsep(&locationstring, ","), NULL, 16);
1375
device->loc3gppdata[3] = (guint)strtol(strsep(&locationstring, ","), NULL, 16);
1376
g_free(locationstring);
1377
g_variant_unref(locationdata);
1378
g_debug("3GPP location: %u, %u, %4x, %4x", device->loc3gppdata[0], device->loc3gppdata[1], device->loc3gppdata[2], device->loc3gppdata[3]);
1379
} else if ((locationtype == MODULE_INT_MODEM_LOCATION_SOURCE_GPS_RAW) && (locationdata != NULL)) {
1381
locationdata = g_variant_lookup_value(data, "latitude", G_VARIANT_TYPE_STRING);
1382
if (locationdata != NULL) {
1384
locationstring = (gchar *)g_variant_get_string(locationdata, &strlength);
1385
device->locgpsdata[0] = atof(locationstring);
1386
g_variant_unref(locationdata);
1388
device->locgpsdata[0] = 0.0;
1390
locationdata = g_variant_lookup_value(data, "longitude", G_VARIANT_TYPE_STRING);
1391
if (locationdata != NULL) {
1393
locationstring = (gchar *)g_variant_get_string(locationdata, &strlength);
1394
device->locgpsdata[1] = atof(locationstring);
1395
g_variant_unref(locationdata);
1397
device->locgpsdata[1] = 0.0;
1399
locationdata = g_variant_lookup_value(data, "altitude", G_VARIANT_TYPE_STRING);
1400
if (locationdata != NULL) {
1402
locationstring = (gchar *)g_variant_get_string(locationdata, &strlength);
1403
device->locgpsdata[2] = atof(locationstring);
1404
g_variant_unref(locationdata);
1406
device->locgpsdata[2] = 0.0;
1408
locationdata = g_variant_lookup_value(data, "utc-time", G_VARIANT_TYPE_STRING);
1409
if (locationdata != NULL) {
1411
locationstring = (gchar *)g_variant_get_string(locationdata, &strlength);
1412
device->locgpsdata[3] = atof(locationstring);
1413
g_variant_unref(locationdata);
1415
device->locgpsdata[3] = 0.0;
1417
g_debug("GPS location: %2.3f, %2.3f, %2.3f, %6.0f", device->locgpsdata[0], device->locgpsdata[1], device->locgpsdata[2], device->locgpsdata[3]);
1419
g_variant_unref(locationdata);
1421
g_variant_unref(data);
1425
if (device->locationcaps & MMGUI_LOCATION_CAPS_3GPP) {
1426
memset(device->loc3gppdata, 0, sizeof(device->loc3gppdata));
1428
if (device->locationcaps & MMGUI_LOCATION_CAPS_GPS) {
1429
memset(device->locgpsdata, 0, sizeof(device->locgpsdata));
1432
mmgui_module_handle_error_message(mmguicorelc, error);
1433
g_error_free(error);
1439
static gboolean mmgui_module_devices_enable_location(gpointer mmguicore, mmguidevice_t device, gboolean enable)
1441
mmguicore_t mmguicorelc;
1442
moduledata_t moduledata;
1443
GVariant *properties;
1444
guint locationtypes, enabledtypes;
1447
if ((mmguicore == NULL) || (device == NULL)) return FALSE;
1448
mmguicorelc = (mmguicore_t)mmguicore;
1450
if (mmguicorelc->moduledata == NULL) return FALSE;
1451
moduledata = (moduledata_t)mmguicorelc->moduledata;
1453
if (!device->enabled) return FALSE;
1454
if (moduledata->locationproxy == NULL) return FALSE;
1456
if ((enable) && ((device->locationcaps & MMGUI_LOCATION_CAPS_3GPP) || (device->locationcaps & MMGUI_LOCATION_CAPS_GPS))) return TRUE;
1457
if ((!enable) && ((!(device->locationcaps & MMGUI_LOCATION_CAPS_3GPP)) && (!(device->locationcaps & MMGUI_LOCATION_CAPS_GPS)))) return TRUE;
1460
//Determine supported capabilities and turn on location engine
1461
properties = g_dbus_proxy_get_cached_property(moduledata->locationproxy, "Capabilities");
1462
if (properties != NULL) {
1463
locationtypes = g_variant_get_uint32(properties);
1464
if ((locationtypes & MODULE_INT_MODEM_LOCATION_SOURCE_3GPP_LAC_CI) || (locationtypes & MODULE_INT_MODEM_LOCATION_SOURCE_GPS_RAW)) {
1466
//Enable only needed capabilities
1467
enabledtypes = ((locationtypes & MODULE_INT_MODEM_LOCATION_SOURCE_3GPP_LAC_CI) | (locationtypes & MODULE_INT_MODEM_LOCATION_SOURCE_GPS_RAW));
1468
//Apply new settings
1469
g_dbus_proxy_call_sync(moduledata->locationproxy, "Setup", g_variant_new("(ub)", enabledtypes, TRUE), 0, -1, NULL, &error);
1470
//Set enabled properties
1471
if (error == NULL) {
1473
if (locationtypes & MODULE_INT_MODEM_LOCATION_SOURCE_3GPP_LAC_CI) {
1474
device->locationcaps |= MMGUI_LOCATION_CAPS_3GPP;
1477
if (locationtypes & MODULE_INT_MODEM_LOCATION_SOURCE_GPS_RAW) {
1478
device->locationcaps |= MMGUI_LOCATION_CAPS_GPS;
1483
mmgui_module_handle_error_message(mmguicorelc, error);
1484
g_error_free(error);
1487
g_variant_unref(properties);
1491
g_dbus_proxy_call_sync(moduledata->locationproxy, "Setup", g_variant_new("(ub)", MODULE_INT_MODEM_LOCATION_SOURCE_NONE, FALSE), 0, -1, NULL, &error);
1492
if (error == NULL) {
1495
mmgui_module_handle_error_message(mmguicorelc, error);
1496
g_error_free(error);
1503
G_MODULE_EXPORT gboolean mmgui_module_devices_information(gpointer mmguicore)
1505
mmguicore_t mmguicorelc;
1506
moduledata_t moduledata;
1507
mmguidevice_t device;
1511
gsize strsize = 256;
1515
if (mmguicore == NULL) return FALSE;
1516
mmguicorelc = (mmguicore_t)mmguicore;
1518
if (mmguicorelc->moduledata == NULL) return FALSE;
1519
moduledata = (moduledata_t)mmguicorelc->moduledata;
1521
if (mmguicorelc->device == NULL) return FALSE;
1522
device = mmguicorelc->device;
1524
if (moduledata->modemproxy != NULL) {
1525
//Is device enabled and blocked
1526
data = g_dbus_proxy_get_cached_property(moduledata->modemproxy, "State");
1528
statevalue = g_variant_get_int32(data);
1529
device->enabled = mmgui_module_device_enabled_from_state(statevalue);
1530
device->blocked = mmgui_module_device_locked_from_state(statevalue);
1531
device->registered = mmgui_module_device_registered_from_state(statevalue);
1532
g_variant_unref(data);
1534
device->enabled = FALSE;
1535
device->blocked = TRUE;
1538
if (device->enabled) {
1539
//Device identifier (IMEI)
1540
if (device->imei != NULL) {
1541
g_free(device->imei);
1542
device->imei = NULL;
1545
data = g_dbus_proxy_get_cached_property(moduledata->modemproxy, "EquipmentIdentifier");
1547
device->imei = g_strdup(g_variant_get_string(data, &strsize));
1548
g_variant_unref(data);
1550
device->imei = NULL;
1553
data = g_dbus_proxy_get_cached_property(moduledata->modemproxy, "SignalQuality");
1555
g_variant_get(data, "(ub)", &statevalue, &stateflag);
1556
device->siglevel = statevalue;
1557
g_variant_unref(data);
1559
device->siglevel = 0;
1561
//Used access technology
1562
data = g_dbus_proxy_get_cached_property(moduledata->modemproxy, "AccessTechnologies");
1564
device->mode = mmgui_module_access_mode_translate(g_variant_get_uint32(data));
1565
g_variant_unref(data);
1567
device->mode = MMGUI_DEVICE_MODE_UNKNOWN;
1572
if (moduledata->netproxy != NULL) {
1573
//Operator information
1574
if (device->operatorcode != NULL) {
1575
g_free(device->operatorcode);
1576
device->operatorcode = NULL;
1579
if (device->operatorname != NULL) {
1580
g_free(device->operatorname);
1581
device->operatorname = NULL;
1584
//Registration state
1585
data = g_dbus_proxy_get_cached_property(moduledata->netproxy, "RegistrationState");
1587
device->regstatus = mmgui_module_registration_status_translate(g_variant_get_uint32(data));
1588
g_variant_unref(data);
1590
device->regstatus = MMGUI_REG_STATUS_UNKNOWN;
1593
data = g_dbus_proxy_get_cached_property(moduledata->netproxy, "OperatorCode");
1596
device->operatorcode = g_strdup(g_variant_get_string(data, &strsize));
1597
g_variant_unref(data);
1599
device->operatorcode = NULL;
1602
data = g_dbus_proxy_get_cached_property(moduledata->netproxy, "OperatorName");
1605
device->operatorname = g_strdup(g_variant_get_string(data, &strsize));
1606
g_variant_unref(data);
1608
device->operatorname = NULL;
1612
if (moduledata->cardproxy != NULL) {
1613
if (device->type == MMGUI_DEVICE_TYPE_GSM) {
1614
if (device->enabled) {
1616
if (device->imsi != NULL) {
1617
g_free(device->imsi);
1618
device->imsi = NULL;
1621
data = g_dbus_proxy_get_cached_property(moduledata->cardproxy, "Imsi");
1624
device->imsi = g_strdup(g_variant_get_string(data, &strsize));
1625
g_variant_unref(data);
1627
device->imsi = NULL;
1630
} else if (device->type == MMGUI_DEVICE_TYPE_CDMA) {
1632
if (device->imsi != NULL) {
1633
g_free(device->imsi);
1634
device->imsi = NULL;
1640
mmgui_module_devices_update_location(mmguicore, device);
1642
//Network time. This code makes ModemManager crash, so it commented out
1645
if (moduledata->timeproxy != NULL) {
1648
data = g_dbus_proxy_call_sync(moduledata->timeproxy,
1656
if ((data == NULL) && (error != NULL)) {
1657
mmgui_module_print_error_message(error);
1658
g_error_free(error);
1660
g_variant_get(data, "(s)", &timev);
1661
//device->imsi = g_strdup(device->imsi);
1662
g_variant_unref(data);
1669
G_MODULE_EXPORT gboolean mmgui_module_devices_open(gpointer mmguicore, mmguidevice_t device)
1671
mmguicore_t mmguicorelc;
1672
moduledata_t moduledata;
1673
const gchar *simpath;
1678
if ((mmguicore == NULL) || (device == NULL)) return FALSE;
1679
mmguicorelc = (mmguicore_t)mmguicore;
1681
if (mmguicorelc->moduledata == NULL) return FALSE;
1682
moduledata = (moduledata_t)mmguicorelc->moduledata;
1684
if (device == NULL) return FALSE;
1685
if (device->objectpath == NULL) return FALSE;
1689
moduledata->netproxy = g_dbus_proxy_new_sync(moduledata->connection,
1690
G_DBUS_PROXY_FLAGS_NONE,
1692
"org.freedesktop.ModemManager1",
1694
"org.freedesktop.ModemManager1.Modem.Modem3gpp",
1698
if ((moduledata->netproxy == NULL) && (error != NULL)) {
1699
device->scancaps = MMGUI_SCAN_CAPS_NONE;
1700
mmgui_module_handle_error_message(mmguicorelc, error);
1701
g_error_free(error);
1703
device->scancaps = MMGUI_SCAN_CAPS_OBSERVE;
1704
moduledata->netpropsignal = g_signal_connect(moduledata->netproxy, "g-properties-changed", G_CALLBACK(mmgui_property_change_handler), mmguicore);
1709
moduledata->modemproxy = g_dbus_proxy_new_sync(moduledata->connection,
1710
G_DBUS_PROXY_FLAGS_NONE,
1712
"org.freedesktop.ModemManager1",
1714
"org.freedesktop.ModemManager1.Modem",
1718
if ((moduledata->modemproxy == NULL) && (error != NULL)) {
1719
mmgui_module_handle_error_message(mmguicorelc, error);
1720
g_error_free(error);
1722
moduledata->statesignal = g_signal_connect(moduledata->modemproxy, "g-signal", G_CALLBACK(mmgui_signal_handler), mmguicore);
1723
moduledata->modempropsignal = g_signal_connect(moduledata->modemproxy, "g-properties-changed", G_CALLBACK(mmgui_property_change_handler), mmguicore);
1724
//Get path for SIM object
1725
simdata = g_dbus_proxy_get_cached_property(moduledata->modemproxy, "Sim");
1727
simpath = g_variant_get_string(simdata, &strlength);
1728
//If SIM object exists
1729
if (simpath != NULL) {
1731
moduledata->cardproxy = g_dbus_proxy_new_sync(moduledata->connection,
1732
G_DBUS_PROXY_FLAGS_NONE,
1734
"org.freedesktop.ModemManager1",
1736
"org.freedesktop.ModemManager1.Sim",
1740
if ((moduledata->cardproxy == NULL) && (error != NULL)) {
1741
mmgui_module_handle_error_message(mmguicorelc, error);
1742
g_error_free(error);
1745
moduledata->cardproxy = NULL;
1747
g_variant_unref(simdata);
1752
moduledata->smsproxy = g_dbus_proxy_new_sync(moduledata->connection,
1753
G_DBUS_PROXY_FLAGS_NONE,
1755
"org.freedesktop.ModemManager1",
1757
"org.freedesktop.ModemManager1.Modem.Messaging",
1761
if ((moduledata->smsproxy == NULL) && (error != NULL)) {
1762
device->smscaps = MMGUI_SMS_CAPS_NONE;
1763
mmgui_module_handle_error_message(mmguicorelc, error);
1764
g_error_free(error);
1766
device->smscaps = MMGUI_SMS_CAPS_RECEIVE | MMGUI_SMS_CAPS_SEND;
1767
moduledata->smssignal = g_signal_connect(moduledata->smsproxy, "g-signal", G_CALLBACK(mmgui_signal_handler), mmguicore);
1772
moduledata->ussdproxy = g_dbus_proxy_new_sync(moduledata->connection,
1773
G_DBUS_PROXY_FLAGS_NONE,
1775
"org.freedesktop.ModemManager1",
1777
"org.freedesktop.ModemManager1.Modem.Modem3gpp.Ussd",
1781
if ((moduledata->ussdproxy == NULL) && (error != NULL)) {
1782
device->ussdcaps = MMGUI_USSD_CAPS_NONE;
1783
mmgui_module_handle_error_message(mmguicorelc, error);
1784
g_error_free(error);
1786
device->ussdcaps = MMGUI_USSD_CAPS_SEND;
1791
moduledata->locationproxy = g_dbus_proxy_new_sync(moduledata->connection,
1792
G_DBUS_PROXY_FLAGS_NONE,
1794
"org.freedesktop.ModemManager1",
1796
"org.freedesktop.ModemManager1.Modem.Location",
1800
if ((moduledata->locationproxy == NULL) && (error != NULL)) {
1801
mmgui_module_handle_error_message(mmguicorelc, error);
1802
g_error_free(error);
1804
if (mmgui_module_devices_enable_location(mmguicore, device, TRUE)) {
1805
moduledata->locationpropsignal = g_signal_connect(moduledata->locationproxy, "g-properties-changed", G_CALLBACK(mmgui_property_change_handler), mmguicore);
1811
moduledata->timeproxy = g_dbus_proxy_new_sync(moduledata->connection,
1812
G_DBUS_PROXY_FLAGS_NONE,
1814
"org.freedesktop.ModemManager1",
1816
"org.freedesktop.ModemManager1.Modem.Time",
1820
if ((moduledata->timeproxy == NULL) && (error != NULL)) {
1821
mmgui_module_handle_error_message(mmguicorelc, error);
1822
g_error_free(error);
1824
moduledata->timesignal = g_signal_connect(moduledata->timeproxy, "g-signal", G_CALLBACK(mmgui_signal_handler), mmguicore);
1829
moduledata->contactsproxy = g_dbus_proxy_new_sync(moduledata->connection,
1830
G_DBUS_PROXY_FLAGS_NONE,
1832
"org.freedesktop.ModemManager1",
1834
"org.freedesktop.ModemManager1.Modem.Contacts",
1838
if ((moduledata->contactsproxy == NULL) && (error != NULL)) {
1839
device->contactscaps = MMGUI_CONTACTS_CAPS_NONE;
1840
mmgui_module_handle_error_message(mmguicorelc, error);
1841
g_error_free(error);
1843
//Test if we really have working conatacts API
1845
simdata = g_dbus_proxy_call_sync(moduledata->contactsproxy,
1853
if ((error != NULL) && (simdata == NULL)) {
1854
device->contactscaps = MMGUI_CONTACTS_CAPS_NONE;
1855
mmgui_module_handle_error_message(mmguicorelc, error);
1856
g_error_free(error);
1858
device->contactscaps = MMGUI_CONTACTS_CAPS_EXPORT | MMGUI_CONTACTS_CAPS_EDIT | MMGUI_CONTACTS_CAPS_EXTENDED;
1859
g_variant_unref(simdata);
1863
//Update device information using created proxy objects
1864
mmgui_module_devices_information(mmguicore);
1866
//Add fresh partial sms list
1867
moduledata->partialsms = NULL;
1869
//Initialize SMS database
1874
G_MODULE_EXPORT gboolean mmgui_module_devices_close(gpointer mmguicore)
1876
mmguicore_t mmguicorelc;
1877
moduledata_t moduledata;
1882
if (mmguicore == NULL) return FALSE;
1883
mmguicorelc = (mmguicore_t)mmguicore;
1885
if (mmguicorelc->moduledata == NULL) return FALSE;
1886
moduledata = (moduledata_t)mmguicorelc->moduledata;
1888
//Close SMS database
1890
//Change device pointer
1892
//Free partial sms list
1893
if (moduledata->partialsms != NULL) {
1894
pslnode = moduledata->partialsms;
1895
while (pslnode != NULL) {
1896
pslpath = (gchar *)pslnode->data;
1897
pslnext = g_list_next(pslnode);
1903
g_list_free(moduledata->partialsms);
1904
moduledata->partialsms = NULL;
1907
if (moduledata->cardproxy != NULL) {
1908
g_object_unref(moduledata->cardproxy);
1909
moduledata->cardproxy = NULL;
1911
if (moduledata->netproxy != NULL) {
1912
if (g_signal_handler_is_connected(moduledata->netproxy, moduledata->netpropsignal)) {
1913
g_signal_handler_disconnect(moduledata->netproxy, moduledata->netpropsignal);
1915
g_object_unref(moduledata->netproxy);
1916
moduledata->netproxy = NULL;
1918
if (moduledata->modemproxy != NULL) {
1919
if (g_signal_handler_is_connected(moduledata->modemproxy, moduledata->statesignal)) {
1920
g_signal_handler_disconnect(moduledata->modemproxy, moduledata->statesignal);
1922
if (g_signal_handler_is_connected(moduledata->modemproxy, moduledata->modempropsignal)) {
1923
g_signal_handler_disconnect(moduledata->modemproxy, moduledata->modempropsignal);
1925
g_object_unref(moduledata->modemproxy);
1926
moduledata->modemproxy = NULL;
1928
if (moduledata->smsproxy != NULL) {
1929
if (g_signal_handler_is_connected(moduledata->smsproxy, moduledata->smssignal)) {
1930
g_signal_handler_disconnect(moduledata->smsproxy, moduledata->smssignal);
1932
g_object_unref(moduledata->smsproxy);
1933
moduledata->smsproxy = NULL;
1935
if (moduledata->ussdproxy != NULL) {
1936
g_object_unref(moduledata->ussdproxy);
1937
moduledata->ussdproxy = NULL;
1939
if (moduledata->locationproxy != NULL) {
1940
if (g_signal_handler_is_connected(moduledata->locationproxy, moduledata->locationpropsignal)) {
1941
g_signal_handler_disconnect(moduledata->locationproxy, moduledata->locationpropsignal);
1943
g_object_unref(moduledata->locationproxy);
1944
moduledata->locationproxy = NULL;
1946
if (moduledata->timeproxy != NULL) {
1947
if (g_signal_handler_is_connected(moduledata->timeproxy, moduledata->timesignal)) {
1948
g_signal_handler_disconnect(moduledata->timeproxy, moduledata->timesignal);
1950
g_object_unref(moduledata->timeproxy);
1951
moduledata->timeproxy = NULL;
1953
if (moduledata->contactsproxy != NULL) {
1954
g_object_unref(moduledata->contactsproxy);
1955
moduledata->contactsproxy = NULL;
1961
static gboolean mmgui_module_devices_restart_ussd(gpointer mmguicore)
1963
mmguicore_t mmguicorelc;
1964
moduledata_t moduledata;
1965
mmguidevice_t device;
1968
if (mmguicore == NULL) return FALSE;
1969
mmguicorelc = (mmguicore_t)mmguicore;
1971
if (mmguicorelc->moduledata == NULL) return FALSE;
1972
moduledata = (moduledata_t)mmguicorelc->moduledata;
1974
if (mmguicorelc->device == NULL) return FALSE;
1975
device = mmguicorelc->device;
1977
if (moduledata->ussdproxy != NULL) {
1978
device->ussdcaps = MMGUI_USSD_CAPS_NONE;
1979
g_object_unref(moduledata->ussdproxy);
1984
moduledata->ussdproxy = g_dbus_proxy_new_sync(moduledata->connection,
1985
G_DBUS_PROXY_FLAGS_NONE,
1987
"org.freedesktop.ModemManager1",
1989
"org.freedesktop.ModemManager1.Modem.Modem3gpp.Ussd",
1993
if ((moduledata->ussdproxy == NULL) && (error != NULL)) {
1994
device->ussdcaps = MMGUI_USSD_CAPS_NONE;
1995
mmgui_module_handle_error_message(mmguicorelc, error);
1996
g_error_free(error);
1999
device->ussdcaps = MMGUI_USSD_CAPS_SEND;
2004
static void mmgui_module_devices_enable_handler(GDBusProxy *proxy, GAsyncResult *res, gpointer user_data)
2006
mmguicore_t mmguicorelc;
2007
moduledata_t moduledata;
2013
mmguicorelc = (mmguicore_t)user_data;
2014
if (mmguicorelc == NULL) return;
2016
if (mmguicorelc->moduledata == NULL) return;
2017
moduledata = (moduledata_t)mmguicorelc->moduledata;
2021
data = g_dbus_proxy_call_finish(proxy, res, &error);
2023
if ((data == NULL) && (error != NULL)) {
2024
if ((moduledata->cancellable == NULL) || ((moduledata->cancellable != NULL) && (!g_cancellable_is_cancelled(moduledata->cancellable)))) {
2025
mmgui_module_handle_error_message(mmguicorelc, error);
2027
g_error_free(error);
2030
g_variant_unref(data);
2031
newstate = mmguicorelc->device->enabled;
2032
//Update device state
2033
data = g_dbus_proxy_get_cached_property(proxy, "State");
2034
statevalue = g_variant_get_int32(data);
2035
mmguicorelc->device->enabled = mmgui_module_device_enabled_from_state(statevalue);
2036
g_variant_unref(data);
2037
//If device state changed - return TRUE
2038
if (newstate != mmguicorelc->device->enabled) {
2039
//Enable location API
2040
mmgui_module_devices_enable_location(mmguicorelc, mmguicorelc->device, TRUE);
2047
if (mmguicorelc->device != NULL) {
2048
mmguicorelc->device->operation = MMGUI_DEVICE_OPERATION_IDLE;
2051
if ((mmguicorelc->eventcb != NULL) && ((moduledata->cancellable == NULL) || ((moduledata->cancellable != NULL) && (!g_cancellable_is_cancelled(moduledata->cancellable))))) {
2052
(mmguicorelc->eventcb)(MMGUI_EVENT_MODEM_ENABLE_RESULT, user_data, GUINT_TO_POINTER(newstate));
2056
G_MODULE_EXPORT gboolean mmgui_module_devices_enable(gpointer mmguicore, gboolean enabled)
2058
mmguicore_t mmguicorelc;
2059
moduledata_t moduledata;
2061
if (mmguicore == NULL) return FALSE;
2062
mmguicorelc = (mmguicore_t)mmguicore;
2064
if (mmguicorelc->moduledata == NULL) return FALSE;
2065
moduledata = (moduledata_t)mmguicorelc->moduledata;
2067
if (moduledata->modemproxy == NULL) return FALSE;
2068
if (mmguicorelc->device == NULL) return FALSE;
2070
//Device already in requested state
2071
if (mmguicorelc->device->enabled == enabled) return TRUE;
2073
mmguicorelc->device->operation = MMGUI_DEVICE_OPERATION_ENABLE;
2075
if (moduledata->cancellable != NULL) {
2076
g_cancellable_reset(moduledata->cancellable);
2079
g_dbus_proxy_call(moduledata->modemproxy,
2081
g_variant_new("(b)", enabled),
2082
G_DBUS_CALL_FLAGS_NONE,
2083
moduledata->timeouts[MMGUI_DEVICE_OPERATION_ENABLE],
2084
moduledata->cancellable,
2085
(GAsyncReadyCallback)mmgui_module_devices_enable_handler,
2091
static time_t mmgui_module_str_to_time(const gchar *str)
2097
gint *fields[] = {&btime.tm_year, &btime.tm_mon, &btime.tm_mday,
2098
&btime.tm_hour, &btime.tm_min, &btime.tm_sec};
2100
timestamp = time(NULL);
2102
if (str == NULL) return timestamp;
2107
if (str[12] == '+') {
2108
//v.0.4.998 timestamp format
2109
for (i=0; i<6; i++) {
2110
strncpy(strbuf, str+(i*2), 2);
2112
*fields[i] = atoi(strbuf);
2114
} else if (str[8] == ',') {
2115
//v.0.5.2 timestamp format
2116
for (i=0; i<6; i++) {
2117
strncpy(strbuf, str+(i*3), 2);
2119
*fields[i] = atoi(strbuf);
2122
btime.tm_year += 100;
2124
timestamp = mktime(&btime);
2130
static mmgui_sms_message_t mmgui_module_sms_retrieve(mmguicore_t mmguicore, const gchar *smspath/*, gboolean listpartial*/)
2132
moduledata_t moduledata;
2133
mmgui_sms_message_t message;
2134
GDBusProxy *smsproxy;
2138
const gchar *valuestr;
2142
if ((mmguicore == NULL) || (smspath == NULL)) return NULL;
2143
if (mmguicore->moduledata == NULL) return NULL;
2145
moduledata = (moduledata_t)mmguicore->moduledata;
2149
smsproxy = g_dbus_proxy_new_sync(moduledata->connection,
2150
G_DBUS_PROXY_FLAGS_NONE,
2152
"org.freedesktop.ModemManager1",
2154
"org.freedesktop.ModemManager1.Sms",
2158
if ((smsproxy == NULL) && (error != NULL)) {
2159
mmgui_module_handle_error_message(mmguicore, error);
2160
g_error_free(error);
2161
//g_object_unref(smsproxy);
2166
value = g_dbus_proxy_get_cached_property(smsproxy, "State");
2167
if (value != NULL) {
2168
state = g_variant_get_uint32(value);
2169
if (state != MODULE_INT_SMS_STATE_RECEIVED) {
2170
/*//Message is not fully received - skip it and add to list if needed
2171
if ((state == MODULE_INT_SMS_STATE_RECEIVING) && (listpartial)) {
2172
moduledata->partialsms = g_list_prepend(moduledata->partialsms, g_strdup(smspath));
2174
g_variant_unref(value);
2175
g_object_unref(smsproxy);
2178
g_variant_unref(value);
2180
//Something strange with this message - skip it
2181
g_object_unref(smsproxy);
2186
value = g_dbus_proxy_get_cached_property(smsproxy, "PduType");
2187
if (value != NULL) {
2188
state = g_variant_get_uint32(value);
2189
if ((state == MODULE_INT_PDU_TYPE_UNKNOWN) || (state == MODULE_INT_PDU_TYPE_SUBMIT)) {
2190
//Only delivered messages and status reports needed this moment - maybe remove other?
2191
//TODO: remove message
2192
g_variant_unref(value);
2193
g_object_unref(smsproxy);
2196
g_variant_unref(value);
2198
//Something strange with this message - skip it
2199
g_object_unref(smsproxy);
2203
message = mmgui_smsdb_message_create();
2205
value = g_dbus_proxy_get_cached_property(smsproxy, "Number");
2206
if (value != NULL) {
2208
valuestr = g_variant_get_string(value, &strlength);
2209
mmgui_smsdb_message_set_number(message, valuestr);
2210
g_debug("SMS number: %s\n", valuestr);
2211
g_variant_unref(value);
2213
mmgui_smsdb_message_set_number(message, _("Unknown"));
2215
//Service center number
2216
value = g_dbus_proxy_get_cached_property(smsproxy, "SMSC");
2217
if (value != NULL) {
2219
valuestr = g_variant_get_string(value, &strlength);
2220
mmgui_smsdb_message_set_service_number(message, valuestr);
2221
g_debug("SMS service number: %s\n", valuestr);
2222
g_variant_unref(value);
2224
mmgui_smsdb_message_set_service_number(message, _("Unknown"));
2226
//Decoded message text
2228
value = g_dbus_proxy_get_cached_property(smsproxy, "Text");
2229
if (value != NULL) {
2230
strlength = 256*160;
2231
valuestr = g_variant_get_string(value, &strlength);
2232
g_debug("SMS text: %s\n", valuestr);
2233
mmgui_smsdb_message_set_text(message, valuestr, FALSE);
2235
g_variant_unref(value);
2237
value = g_dbus_proxy_get_cached_property(smsproxy, "Data");
2238
if (value != NULL) {
2239
strlength = g_variant_get_size(value);
2240
if (strlength > 0) {
2241
valuestr = g_variant_get_data(value);
2242
mmgui_smsdb_message_set_binary(message, TRUE);
2243
mmgui_smsdb_message_set_data(message, valuestr, strlength, FALSE);
2246
g_variant_unref(value);
2250
value = g_dbus_proxy_get_cached_property(smsproxy, "Timestamp");
2251
if (value != NULL) {
2253
valuestr = g_variant_get_string(value, &strlength);
2254
mmgui_smsdb_message_set_timestamp(message, mmgui_module_str_to_time(valuestr));
2255
g_debug("SMS timestamp: %lu\n", (gulong)message->timestamp);
2256
g_variant_unref(value);
2259
index = mmgui_module_get_object_path_index(smspath);
2262
//Message has no text - skip it
2263
mmgui_smsdb_message_free(message);
2267
mmgui_smsdb_message_set_identifier(message, index, FALSE);
2268
g_debug("SMS index: %u\n", index);
2273
static gint mmgui_module_sms_get_id(mmguicore_t mmguicore, const gchar *smspath)
2275
moduledata_t moduledata;
2276
GDBusProxy *smsproxy;
2281
if ((mmguicore == NULL) || (smspath == NULL)) return -1;
2282
if (mmguicore->moduledata == NULL) return -1;
2284
moduledata = (moduledata_t)mmguicore->moduledata;
2288
smsproxy = g_dbus_proxy_new_sync(moduledata->connection,
2289
G_DBUS_PROXY_FLAGS_NONE,
2291
"org.freedesktop.ModemManager1",
2293
"org.freedesktop.ModemManager1.Sms",
2297
if ((smsproxy == NULL) && (error != NULL)) {
2298
mmgui_module_handle_error_message(mmguicore, error);
2299
g_error_free(error);
2303
value = g_dbus_proxy_get_cached_property(smsproxy, "State");
2304
if (value != NULL) {
2305
state = g_variant_get_uint32(value);
2306
if (state == MODULE_INT_SMS_STATE_RECEIVED) {
2307
g_variant_unref(value);
2308
g_object_unref(smsproxy);
2309
return mmgui_module_get_object_path_index(smspath);
2311
g_variant_unref(value);
2312
g_object_unref(smsproxy);
2315
g_variant_unref(value);
2317
//Something strange with this message
2318
g_object_unref(smsproxy);
2323
G_MODULE_EXPORT guint mmgui_module_sms_enum(gpointer mmguicore, GSList **smslist)
2325
mmguicore_t mmguicorelc;
2326
moduledata_t moduledata;
2330
GVariantIter miterl1, miterl2;
2331
GVariant *mnodel1, *mnodel2;
2334
const gchar *smspath;
2336
mmgui_sms_message_t message;
2338
if ((mmguicore == NULL) || (smslist == NULL)) return 0;
2339
mmguicorelc = (mmguicore_t)mmguicore;
2341
if (mmguicorelc->moduledata == NULL) return 0;
2342
moduledata = (moduledata_t)mmguicorelc->moduledata;
2344
if (moduledata->smsproxy == NULL) return 0;
2345
if (mmguicorelc->device == NULL) return 0;
2346
if (!mmguicorelc->device->enabled) return 0;
2347
if (!(mmguicorelc->device->smscaps & MMGUI_SMS_CAPS_RECEIVE)) return 0;
2351
messages = g_dbus_proxy_call_sync(moduledata->smsproxy,
2359
if ((messages == NULL) && (error != NULL)) {
2360
mmgui_module_handle_error_message(mmguicorelc, error);
2361
g_error_free(error);
2367
g_variant_iter_init(&miterl1, messages);
2368
while ((mnodel1 = g_variant_iter_next_value(&miterl1)) != NULL) {
2369
g_variant_iter_init(&miterl2, mnodel1);
2370
while ((mnodel2 = g_variant_iter_next_value(&miterl2)) != NULL) {
2372
smspath = g_variant_get_string(mnodel2, &strlength);
2373
g_debug("SMS message object path: %s\n", smspath);
2374
if (smspath != NULL) {
2375
message = mmgui_module_sms_retrieve(mmguicorelc, smspath);
2376
if (message != NULL) {
2377
*smslist = g_slist_prepend(*smslist, message);
2381
g_variant_unref(mnodel2);
2383
g_variant_unref(mnodel1);
2386
g_variant_unref(messages);
2391
G_MODULE_EXPORT mmgui_sms_message_t mmgui_module_sms_get(gpointer mmguicore, guint index)
2393
mmguicore_t mmguicorelc;
2394
moduledata_t moduledata;
2396
mmgui_sms_message_t message;
2398
if (mmguicore == NULL) return NULL;
2399
mmguicorelc = (mmguicore_t)mmguicore;
2401
if (mmguicorelc->moduledata == NULL) return NULL;
2402
moduledata = (moduledata_t)mmguicorelc->moduledata;
2404
if (mmguicorelc->device == NULL) return NULL;
2405
if (!mmguicorelc->device->enabled) return NULL;
2406
if (!(mmguicorelc->device->smscaps & MMGUI_SMS_CAPS_RECEIVE)) return NULL;
2408
smspath = g_strdup_printf("/org/freedesktop/ModemManager1/SMS/%u", index);
2410
message = mmgui_module_sms_retrieve(mmguicorelc, smspath);
2417
G_MODULE_EXPORT gboolean mmgui_module_sms_delete(gpointer mmguicore, guint index)
2419
mmguicore_t mmguicorelc;
2420
moduledata_t moduledata;
2424
if (mmguicore == NULL) return FALSE;
2425
mmguicorelc = (mmguicore_t)mmguicore;
2427
if (mmguicorelc->moduledata == NULL) return FALSE;
2428
moduledata = (moduledata_t)mmguicorelc->moduledata;
2430
if (moduledata->smsproxy == NULL) return FALSE;
2431
if (mmguicorelc->device == NULL) return FALSE;
2432
if (!mmguicorelc->device->enabled) return FALSE;
2433
if (!(mmguicorelc->device->smscaps & MMGUI_SMS_CAPS_RECEIVE)) return FALSE;
2435
smspath = g_strdup_printf("/org/freedesktop/ModemManager1/SMS/%u", index);
2439
g_dbus_proxy_call_sync(moduledata->smsproxy,
2441
g_variant_new("(o)", smspath),
2447
if (error != NULL) {
2448
mmgui_module_handle_error_message(mmguicorelc, error);
2449
g_error_free(error);
2459
static void mmgui_module_sms_send_handler(GDBusProxy *proxy, GAsyncResult *res, gpointer user_data)
2461
mmguicore_t mmguicorelc;
2462
moduledata_t moduledata;
2465
const gchar *smspath;
2467
if (user_data == NULL) return;
2468
mmguicorelc = (mmguicore_t)user_data;
2470
if (mmguicorelc->moduledata == NULL) return;
2471
moduledata = (moduledata_t)mmguicorelc->moduledata;
2475
g_dbus_proxy_call_finish(proxy, res, &error);
2478
if (error != NULL) {
2479
if ((moduledata->cancellable == NULL) || ((moduledata->cancellable != NULL) && (!g_cancellable_is_cancelled(moduledata->cancellable)))) {
2480
mmgui_module_handle_error_message(mmguicorelc, error);
2482
g_error_free(error);
2488
smspath = g_dbus_proxy_get_object_path(proxy);
2489
if (smspath != NULL) {
2491
//Remove message from storage
2492
g_dbus_proxy_call_sync(moduledata->smsproxy,
2494
g_variant_new("(o)", smspath),
2499
if (error != NULL) {
2500
mmgui_module_handle_error_message(mmguicorelc, error);
2501
g_error_free(error);
2505
if (mmguicorelc->device != NULL) {
2506
mmguicorelc->device->operation = MMGUI_DEVICE_OPERATION_IDLE;
2509
if ((mmguicorelc->eventcb != NULL) && ((moduledata->cancellable == NULL) || ((moduledata->cancellable != NULL) && (!g_cancellable_is_cancelled(moduledata->cancellable))))) {
2510
(mmguicorelc->eventcb)(MMGUI_EVENT_SMS_SENT, user_data, GUINT_TO_POINTER(sent));
2514
G_MODULE_EXPORT gboolean mmgui_module_sms_send(gpointer mmguicore, gchar* number, gchar *text)
2516
mmguicore_t mmguicorelc;
2517
moduledata_t moduledata;
2518
GVariantBuilder *builder;
2519
GVariant *array, *message, *smspathv;
2523
GDBusProxy *messageproxy;
2525
if ((number == NULL) || (text == NULL)) return FALSE;
2527
if (mmguicore == NULL) return FALSE;
2528
mmguicorelc = (mmguicore_t)mmguicore;
2530
if (mmguicorelc->moduledata == NULL) return FALSE;
2531
moduledata = (moduledata_t)mmguicorelc->moduledata;
2533
if (moduledata->smsproxy == NULL) return FALSE;
2534
if (mmguicorelc->device == NULL) return FALSE;
2535
if (!mmguicorelc->device->enabled) return FALSE;
2536
if (!(mmguicorelc->device->smscaps & MMGUI_SMS_CAPS_SEND)) return FALSE;
2538
builder = g_variant_builder_new(G_VARIANT_TYPE_ARRAY);
2539
g_variant_builder_add_parsed(builder, "{'number', <%s>}", number);
2540
g_variant_builder_add_parsed(builder, "{'text', <%s>}", text);
2541
array = g_variant_builder_end(builder);
2543
builder = g_variant_builder_new(G_VARIANT_TYPE_TUPLE);
2544
g_variant_builder_add_value(builder, array);
2545
message = g_variant_builder_end(builder);
2549
//Create new message
2550
smspathv = g_dbus_proxy_call_sync(moduledata->smsproxy,
2558
if ((smspathv == NULL) && (error != NULL)) {
2559
mmgui_module_handle_error_message(mmguicorelc, error);
2560
g_error_free(error);
2564
//Created SMS object path
2565
g_variant_get(smspathv, "(o)", &smspath);
2566
if (smspath == NULL) {
2567
g_debug("Failed to obtain object path for saved SMS message\n");
2573
//Create message proxy
2574
messageproxy = g_dbus_proxy_new_sync(moduledata->connection,
2575
G_DBUS_PROXY_FLAGS_NONE,
2577
"org.freedesktop.ModemManager1",
2579
"org.freedesktop.ModemManager1.Sms",
2583
if ((messageproxy == NULL) && (error != NULL)) {
2584
mmgui_module_handle_error_message(mmguicorelc, error);
2585
g_error_free(error);
2592
mmguicorelc->device->operation = MMGUI_DEVICE_OPERATION_SEND_SMS;
2594
if (moduledata->cancellable != NULL) {
2595
g_cancellable_reset(moduledata->cancellable);
2599
g_dbus_proxy_call(messageproxy,
2602
G_DBUS_CALL_FLAGS_NONE,
2603
moduledata->timeouts[MMGUI_DEVICE_OPERATION_SEND_SMS],
2604
moduledata->cancellable,
2605
(GAsyncReadyCallback)mmgui_module_sms_send_handler,
2611
G_MODULE_EXPORT gboolean mmgui_module_ussd_cancel_session(gpointer mmguicore)
2613
mmguicore_t mmguicorelc;
2614
moduledata_t moduledata;
2617
if (mmguicore == NULL) return FALSE;
2618
mmguicorelc = (mmguicore_t)mmguicore;
2620
if (mmguicorelc->moduledata == NULL) return FALSE;
2621
moduledata = (moduledata_t)mmguicorelc->moduledata;
2623
if (moduledata->ussdproxy == NULL) return FALSE;
2624
if (mmguicorelc->device == NULL) return FALSE;
2625
if (!mmguicorelc->device->enabled) return FALSE;
2626
if (!(mmguicorelc->device->ussdcaps & MMGUI_USSD_CAPS_SEND)) return FALSE;
2630
g_dbus_proxy_call_sync(moduledata->ussdproxy,
2638
if (error != NULL) {
2639
mmgui_module_handle_error_message(mmguicorelc, error);
2640
g_error_free(error);
2647
G_MODULE_EXPORT enum _mmgui_ussd_state mmgui_module_ussd_get_state(gpointer mmguicore)
2649
mmguicore_t mmguicorelc;
2650
moduledata_t moduledata;
2653
enum _mmgui_ussd_state stateid;
2655
stateid = MMGUI_USSD_STATE_UNKNOWN;
2657
if (mmguicore == NULL) return stateid;
2658
mmguicorelc = (mmguicore_t)mmguicore;
2660
if (mmguicorelc->moduledata == NULL) return stateid;
2661
moduledata = (moduledata_t)mmguicorelc->moduledata;
2663
if (moduledata->ussdproxy == NULL) return stateid;
2664
if (mmguicorelc->device == NULL) return stateid;
2665
if (!mmguicorelc->device->enabled) return stateid;
2666
if (!(mmguicorelc->device->ussdcaps & MMGUI_USSD_CAPS_SEND)) return stateid;
2668
session = g_dbus_proxy_get_cached_property(moduledata->ussdproxy, "State");
2670
if (session == NULL) return stateid;
2672
state = g_variant_get_uint32(session);
2675
case MODULE_INT_MODEM_3GPP_USSD_SESSION_STATE_UNKNOWN:
2676
stateid = MMGUI_USSD_STATE_UNKNOWN;
2678
case MODULE_INT_MODEM_3GPP_USSD_SESSION_STATE_IDLE:
2679
stateid = MMGUI_USSD_STATE_IDLE;
2681
case MODULE_INT_MODEM_3GPP_USSD_SESSION_STATE_ACTIVE:
2682
stateid = MMGUI_USSD_STATE_ACTIVE;
2684
case MODULE_INT_MODEM_3GPP_USSD_SESSION_STATE_USER_RESPONSE:
2685
stateid = MMGUI_USSD_STATE_USER_RESPONSE;
2688
stateid = MMGUI_USSD_STATE_UNKNOWN;
2692
g_variant_unref(session);
2697
static void mmgui_module_ussd_send_handler(GDBusProxy *proxy, GAsyncResult *res, gpointer user_data)
2699
mmguicore_t mmguicorelc;
2700
moduledata_t moduledata;
2705
mmguicorelc = (mmguicore_t)user_data;
2706
if (mmguicorelc == NULL) return;
2708
if (mmguicorelc->moduledata == NULL) return;
2709
moduledata = (moduledata_t)mmguicorelc->moduledata;
2714
result = g_dbus_proxy_call_finish(proxy, res, &error);
2716
if ((result == NULL) && (error != NULL)) {
2717
/*For some reason after timeout ussd does not work - restart it*/
2718
mmgui_module_devices_restart_ussd(mmguicorelc);
2719
if ((moduledata->cancellable == NULL) || ((moduledata->cancellable != NULL) && (!g_cancellable_is_cancelled(moduledata->cancellable)))) {
2720
mmgui_module_handle_error_message(mmguicorelc, error);
2722
g_error_free(error);
2724
g_variant_get(result, "(s)", &answer);
2725
answer = g_strdup(answer);
2726
g_variant_unref(result);
2729
if (mmguicorelc->device != NULL) {
2730
mmguicorelc->device->operation = MMGUI_DEVICE_OPERATION_IDLE;
2733
if ((mmguicorelc->eventcb != NULL) && ((moduledata->cancellable == NULL) || ((moduledata->cancellable != NULL) && (!g_cancellable_is_cancelled(moduledata->cancellable))))) {
2734
(mmguicorelc->eventcb)(MMGUI_EVENT_USSD_RESULT, user_data, answer);
2738
G_MODULE_EXPORT gboolean mmgui_module_ussd_send(gpointer mmguicore, gchar *request, enum _mmgui_ussd_validation validationid)
2740
mmguicore_t mmguicorelc;
2741
moduledata_t moduledata;
2742
enum _mmgui_ussd_state sessionstate;
2746
if ((mmguicore == NULL) || (request == NULL)) return FALSE;
2747
mmguicorelc = (mmguicore_t)mmguicore;
2749
if (mmguicorelc->moduledata == NULL) return FALSE;
2750
moduledata = (moduledata_t)mmguicorelc->moduledata;
2752
if (moduledata->ussdproxy == NULL) return FALSE;
2753
if (mmguicorelc->device == NULL) return FALSE;
2754
if (!mmguicorelc->device->enabled) return FALSE;
2755
if (!(mmguicorelc->device->ussdcaps & MMGUI_USSD_CAPS_SEND)) return FALSE;
2757
sessionstate = mmgui_module_ussd_get_state(mmguicore);
2759
if ((sessionstate == MMGUI_USSD_STATE_UNKNOWN) ||
2760
(sessionstate == MMGUI_USSD_STATE_ACTIVE)) {
2761
mmgui_module_ussd_cancel_session(mmguicore);
2764
ussdreq = g_variant_new("(s)", request);
2766
if (sessionstate == MMGUI_USSD_STATE_IDLE) {
2767
command = "Initiate";
2768
} else if (sessionstate == MMGUI_USSD_STATE_USER_RESPONSE) {
2769
if (validationid == MMGUI_USSD_VALIDATION_REQUEST) {
2770
mmgui_module_ussd_cancel_session(mmguicore);
2771
command = "Initiate";
2773
command = "Respond";
2777
mmguicorelc->device->operation = MMGUI_DEVICE_OPERATION_SEND_USSD;
2779
if (moduledata->cancellable != NULL) {
2780
g_cancellable_reset(moduledata->cancellable);
2783
g_dbus_proxy_call(moduledata->ussdproxy,
2786
G_DBUS_CALL_FLAGS_NONE,
2787
moduledata->timeouts[MMGUI_DEVICE_OPERATION_SEND_USSD],
2788
moduledata->cancellable,
2789
(GAsyncReadyCallback)mmgui_module_ussd_send_handler,
2795
static mmgui_scanned_network_t mmgui_module_network_retrieve(GVariant *networkv)
2797
mmgui_scanned_network_t network;
2800
const gchar *valuestr;
2803
if (networkv == NULL) return NULL;
2805
network = g_new0(struct _mmgui_scanned_network, 1);
2806
//Mobile operator code (MCCMNC)
2807
value = g_variant_lookup_value(networkv, "operator-code", G_VARIANT_TYPE_STRING);
2808
if (value != NULL) {
2810
valuestr = g_variant_get_string(value, &strlength);
2811
network->operator_num = atoi(valuestr);
2812
g_variant_unref(value);
2814
network->operator_num = 0;
2816
//Network access technology
2817
value = g_variant_lookup_value(networkv, "access-technology", G_VARIANT_TYPE_UINT32);
2818
if (value != NULL) {
2819
network->access_tech = mmgui_module_access_technology_translate(g_variant_get_uint32(value));
2820
g_variant_unref(value);
2822
network->access_tech = MMGUI_ACCESS_TECH_GSM;
2824
//Long-format name of operator
2825
value = g_variant_lookup_value(networkv, "operator-long", G_VARIANT_TYPE_STRING);
2826
if (value != NULL) {
2828
valuestr = g_variant_get_string(value, &strlength);
2829
network->operator_long = g_strdup(valuestr);
2830
g_variant_unref(value);
2832
network->operator_long = g_strdup(_("Unknown"));
2834
//Short-format name of operator
2835
value = g_variant_lookup_value(networkv, "operator-short", G_VARIANT_TYPE_STRING);
2836
if (value != NULL) {
2838
valuestr = g_variant_get_string(value, &strlength);
2839
network->operator_short = g_strdup(valuestr);
2840
g_variant_unref(value);
2842
network->operator_short = g_strdup(_("Unknown"));
2844
//Network availability status (this is a critical parameter, so entry will be skipped if value is unknown)
2845
value = g_variant_lookup_value(networkv, "status", G_VARIANT_TYPE_UINT32);
2846
if (value != NULL) {
2847
network->status = mmgui_module_network_availability_status_translate(g_variant_get_uint32(value));
2848
g_variant_unref(value);
2851
if (network->operator_long != NULL) g_free(network->operator_long);
2852
if (network->operator_short != NULL) g_free(network->operator_short);
2858
static void mmgui_module_networks_scan_handler(GDBusProxy *proxy, GAsyncResult *res, gpointer user_data)
2860
mmguicore_t mmguicorelc;
2861
moduledata_t moduledata;
2865
GVariantIter niterl1, niterl2, niterl3;
2866
GVariant *nnodel1, *nnodel2, *nnodel3;
2867
mmgui_scanned_network_t network;
2869
mmguicorelc = (mmguicore_t)user_data;
2870
if (mmguicorelc == NULL) return;
2872
if (mmguicorelc->moduledata == NULL) return;
2873
moduledata = (moduledata_t)mmguicorelc->moduledata;
2878
result = g_dbus_proxy_call_finish(proxy, res, &error);
2880
if ((result == NULL) && (error != NULL)) {
2881
if ((moduledata->cancellable == NULL) || ((moduledata->cancellable != NULL) && (!g_cancellable_is_cancelled(moduledata->cancellable)))) {
2882
mmgui_module_handle_error_message(mmguicorelc, error);
2884
g_error_free(error);
2886
g_variant_iter_init(&niterl1, result);
2887
while ((nnodel1 = g_variant_iter_next_value(&niterl1)) != NULL) {
2888
g_variant_iter_init(&niterl2, nnodel1);
2889
while ((nnodel2 = g_variant_iter_next_value(&niterl2)) != NULL) {
2890
network = mmgui_module_network_retrieve(nnodel2);
2891
if (network != NULL) {
2892
networks = g_slist_prepend(networks, network);
2894
g_variant_unref(nnodel2);
2896
g_variant_unref(nnodel1);
2898
g_variant_unref(result);
2901
if (mmguicorelc->device != NULL) {
2902
mmguicorelc->device->operation = MMGUI_DEVICE_OPERATION_IDLE;
2905
if ((mmguicorelc->eventcb != NULL) && ((moduledata->cancellable == NULL) || ((moduledata->cancellable != NULL) && (!g_cancellable_is_cancelled(moduledata->cancellable))))) {
2906
(mmguicorelc->eventcb)(MMGUI_EVENT_SCAN_RESULT, user_data, networks);
2910
G_MODULE_EXPORT gboolean mmgui_module_networks_scan(gpointer mmguicore)
2912
mmguicore_t mmguicorelc;
2913
moduledata_t moduledata;
2915
if (mmguicore == NULL) return FALSE;
2916
mmguicorelc = (mmguicore_t)mmguicore;
2918
if (mmguicorelc->moduledata == NULL) return FALSE;
2919
moduledata = (moduledata_t)mmguicorelc->moduledata;
2921
if (moduledata->netproxy == NULL) return FALSE;
2922
if (mmguicorelc->device == NULL) return FALSE;
2923
if (!mmguicorelc->device->enabled) return FALSE;
2924
if (!(mmguicorelc->device->scancaps & MMGUI_SCAN_CAPS_OBSERVE)) return FALSE;
2926
mmguicorelc->device->operation = MMGUI_DEVICE_OPERATION_SCAN;
2928
if (moduledata->cancellable != NULL) {
2929
g_cancellable_reset(moduledata->cancellable);
2932
g_dbus_proxy_call(moduledata->netproxy,
2935
G_DBUS_CALL_FLAGS_NONE,
2936
moduledata->timeouts[MMGUI_DEVICE_OPERATION_SCAN],
2937
moduledata->cancellable,
2938
(GAsyncReadyCallback)mmgui_module_networks_scan_handler,
2944
static mmgui_contact_t mmgui_module_contact_retrieve(GVariant *contactv)
2946
mmgui_contact_t contact;
2949
const gchar *valuestr;
2951
if (contactv == NULL) return NULL;
2953
contact = g_new0(struct _mmgui_contact, 1);
2954
//Full name of the contact
2955
value = g_variant_lookup_value(contactv, "name", G_VARIANT_TYPE_STRING);
2956
if (value != NULL) {
2958
valuestr = g_variant_get_string(value, &strlength);
2959
contact->name = g_strdup(valuestr);
2960
g_variant_unref(value);
2962
contact->name = g_strdup(_("Unknown"));
2965
value = g_variant_lookup_value(contactv, "number", G_VARIANT_TYPE_STRING);
2966
if (value != NULL) {
2968
valuestr = g_variant_get_string(value, &strlength);
2969
contact->number = g_strdup(valuestr);
2970
g_variant_unref(value);
2972
contact->number = g_strdup(_("Unknown"));
2975
value = g_variant_lookup_value(contactv, "email", G_VARIANT_TYPE_STRING);
2976
if (value != NULL) {
2978
valuestr = g_variant_get_string(value, &strlength);
2979
contact->email = g_strdup(valuestr);
2980
g_variant_unref(value);
2982
contact->email = g_strdup(_("Unknown"));
2984
//Group this contact belongs to
2985
value = g_variant_lookup_value(contactv, "group", G_VARIANT_TYPE_STRING);
2986
if (value != NULL) {
2988
valuestr = g_variant_get_string(value, &strlength);
2989
contact->group = g_strdup(valuestr);
2990
g_variant_unref(value);
2992
contact->group = g_strdup(_("Unknown"));
2994
//Additional contact name
2995
value = g_variant_lookup_value(contactv, "name2", G_VARIANT_TYPE_STRING);
2996
if (value != NULL) {
2998
valuestr = g_variant_get_string(value, &strlength);
2999
contact->name2 = g_strdup(valuestr);
3000
g_variant_unref(value);
3002
contact->name2 = g_strdup(_("Unknown"));
3004
//Additional contact telephone number
3005
value = g_variant_lookup_value(contactv, "number2", G_VARIANT_TYPE_STRING);
3006
if (value != NULL) {
3008
valuestr = g_variant_get_string(value, &strlength);
3009
contact->number2 = g_strdup(valuestr);
3010
g_variant_unref(value);
3012
contact->number2 = g_strdup(_("Unknown"));
3014
//Boolean flag to specify whether this entry is hidden or not
3015
value = g_variant_lookup_value(contactv, "hidden", G_VARIANT_TYPE_BOOLEAN);
3016
if (value != NULL) {
3017
contact->hidden = g_variant_get_boolean(value);
3018
g_variant_unref(value);
3020
contact->hidden = FALSE;
3022
//Phonebook in which the contact is stored
3023
value = g_variant_lookup_value(contactv, "storage", G_VARIANT_TYPE_UINT32);
3024
if (value != NULL) {
3025
contact->storage = g_variant_get_uint32(value);
3026
g_variant_unref(value);
3028
contact->storage = FALSE;
3030
//Internal private number (this is a critical parameter, so entry will be skipped if value is unknown)
3031
value = g_variant_lookup_value(contactv, "index", G_VARIANT_TYPE_UINT32);
3032
if (value != NULL) {
3033
contact->id = g_variant_get_uint32(value);
3034
g_variant_unref(value);
3037
if (contact->name != NULL) g_free(contact->name);
3038
if (contact->number != NULL) g_free(contact->number);
3039
if (contact->email != NULL) g_free(contact->email);
3040
if (contact->group != NULL) g_free(contact->group);
3041
if (contact->name2 != NULL) g_free(contact->name2);
3042
if (contact->number2 != NULL) g_free(contact->number2);
3048
G_MODULE_EXPORT guint mmgui_module_contacts_enum(gpointer mmguicore, GSList **contactslist)
3050
mmguicore_t mmguicorelc;
3051
moduledata_t moduledata;
3055
GVariantIter citerl1, citerl2;
3056
GVariant *cnodel1, *cnodel2;
3057
mmgui_contact_t contact;
3059
if ((mmguicore == NULL) || (contactslist == NULL)) return 0;
3060
mmguicorelc = (mmguicore_t)mmguicore;
3062
if (mmguicorelc->moduledata == NULL) return 0;
3063
moduledata = (moduledata_t)mmguicorelc->moduledata;
3065
if (moduledata->contactsproxy == NULL) return 0;
3066
if (mmguicorelc->device == NULL) return 0;
3067
if (!mmguicorelc->device->enabled) return 0;
3068
if (!(mmguicorelc->device->contactscaps & MMGUI_CONTACTS_CAPS_EXPORT)) return 0;
3072
contacts = g_dbus_proxy_call_sync(moduledata->contactsproxy,
3080
if ((contacts == NULL) && (error != NULL)) {
3081
mmgui_module_handle_error_message(mmguicorelc, error);
3082
g_error_free(error);
3088
g_variant_iter_init(&citerl1, contacts);
3089
while ((cnodel1 = g_variant_iter_next_value(&citerl1)) != NULL) {
3090
g_variant_iter_init(&citerl2, cnodel1);
3091
while ((cnodel2 = g_variant_iter_next_value(&citerl2)) != NULL) {
3092
contact = mmgui_module_contact_retrieve(cnodel2);
3093
if (contact != NULL) {
3094
*contactslist = g_slist_prepend(*contactslist, contact);
3097
g_variant_unref(cnodel2);
3099
g_variant_unref(cnodel1);
3102
g_variant_unref(contacts);
3107
G_MODULE_EXPORT gboolean mmgui_module_contacts_delete(gpointer mmguicore, guint index)
3109
mmguicore_t mmguicorelc;
3110
moduledata_t moduledata;
3113
if (mmguicore == NULL) return FALSE;
3114
mmguicorelc = (mmguicore_t)mmguicore;
3116
if (mmguicorelc->moduledata == NULL) return FALSE;
3117
moduledata = (moduledata_t)mmguicorelc->moduledata;
3119
if (moduledata->contactsproxy == NULL) return FALSE;
3120
if (mmguicorelc->device == NULL) return FALSE;
3121
if (!mmguicorelc->device->enabled) return FALSE;
3122
if (!(mmguicorelc->device->contactscaps & MMGUI_CONTACTS_CAPS_EDIT)) return FALSE;
3126
g_dbus_proxy_call_sync(moduledata->contactsproxy,
3128
g_variant_new("(i)", index),
3134
if (error != NULL) {
3135
mmgui_module_handle_error_message(mmguicorelc, error);
3136
g_error_free(error);
3143
G_MODULE_EXPORT gint mmgui_module_contacts_add(gpointer mmguicore, gchar* name, gchar *number)
3145
mmguicore_t mmguicorelc;
3146
moduledata_t moduledata;
3147
GVariantBuilder *builder;
3148
GVariant *array, *contact;
3153
if ((mmguicore == NULL) || (name == NULL) || (number == NULL)) return -1;
3154
mmguicorelc = (mmguicore_t)mmguicore;
3156
if (mmguicorelc->moduledata == NULL) return -1;
3157
moduledata = (moduledata_t)mmguicorelc->moduledata;
3159
if (moduledata->contactsproxy == NULL) return -1;
3160
if (mmguicorelc->device == NULL) return -1;
3161
if (!mmguicorelc->device->enabled) return -1;
3162
if (!(mmguicorelc->device->contactscaps & MMGUI_CONTACTS_CAPS_EDIT)) return -1;
3164
builder = g_variant_builder_new(G_VARIANT_TYPE_ARRAY);
3165
g_variant_builder_add_parsed(builder, "{'name', <%s>}", name);
3166
g_variant_builder_add_parsed(builder, "{'number', <%s>}", number);
3167
g_variant_builder_add_parsed(builder, "{'hidden', <%b>}", FALSE);
3168
array = g_variant_builder_end(builder);
3170
builder = g_variant_builder_new(G_VARIANT_TYPE_TUPLE);
3171
g_variant_builder_add_value(builder, array);
3172
contact = g_variant_builder_end(builder);
3176
idv = g_dbus_proxy_call_sync(moduledata->contactsproxy,
3184
if ((idv == NULL) && (error != NULL)) {
3185
mmgui_module_handle_error_message(mmguicorelc, error);
3186
g_error_free(error);
3190
g_variant_get(idv, "(u)", &id);
3191
g_variant_unref(idv);