aboutsummaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/icera/mm-iface-icera.c90
-rw-r--r--plugins/icera/mm-iface-icera.h11
2 files changed, 101 insertions, 0 deletions
diff --git a/plugins/icera/mm-iface-icera.c b/plugins/icera/mm-iface-icera.c
index 54b1ed49..01d5cb18 100644
--- a/plugins/icera/mm-iface-icera.c
+++ b/plugins/icera/mm-iface-icera.c
@@ -660,6 +660,96 @@ void mm_iface_icera_modem_reset (MMIfaceModem *self,
}
/*****************************************************************************/
+/* Load network timezone (Time interface) */
+
+static gboolean
+parse_tlts_query_reply (const gchar *response,
+ gchar **iso8601,
+ MMNetworkTimezone **tz)
+{
+ gint year;
+ gint month;
+ gint day;
+ gint hour;
+ gint minute;
+ gint second;
+ gchar sign;
+ gint offset;
+
+ response = mm_strip_tag (response, "*TLTS: ");
+ if (sscanf (response,
+ "\"%02d/%02d/%02d,%02d:%02d:%02d%c%02d\"",
+ &year,
+ &month,
+ &day,
+ &hour,
+ &minute,
+ &second,
+ &sign,
+ &offset) == 8) {
+ /* Offset comes in 15-min intervals */
+ offset *= 15;
+ /* Apply sign to offset */
+ if (sign == '-')
+ offset *= -1;
+
+ /* If asked for it, build timezone information */
+ if (tz) {
+ *tz = mm_network_timezone_new ();
+ mm_network_timezone_set_offset (*tz, offset);
+ }
+
+ if (iso8601) {
+ /* don't give tz info in the date/time string, we have another
+ * property for that */
+ *iso8601 = g_strdup_printf ("%02d/%02d/%02d %02d:%02d:%02d",
+ year, month, day,
+ hour, minute, second);
+ }
+
+ return TRUE;
+ }
+
+ mm_warn ("Unknown *TLTS response: %s", response);
+ return FALSE;
+}
+
+MMNetworkTimezone *
+mm_iface_icera_modem_time_load_network_timezone_finish (MMIfaceModemTime *self,
+ GAsyncResult *res,
+ GError **error)
+{
+ const gchar *response;
+ MMNetworkTimezone *tz;
+
+
+ response = mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, NULL);
+ if (!response) {
+ /* We'll assume we can retry a bit later */
+ g_set_error (error,
+ MM_CORE_ERROR,
+ MM_CORE_ERROR_RETRY,
+ "Retry");
+ return NULL;
+ }
+
+ return (parse_tlts_query_reply (response, NULL, &tz) ? tz : NULL);
+}
+
+void
+mm_iface_icera_modem_time_load_network_timezone (MMIfaceModemTime *self,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ mm_base_modem_at_command (MM_BASE_MODEM (self),
+ "%TLTS",
+ 3,
+ FALSE,
+ callback,
+ user_data);
+}
+
+/*****************************************************************************/
static void
iface_icera_init (gpointer g_iface)
diff --git a/plugins/icera/mm-iface-icera.h b/plugins/icera/mm-iface-icera.h
index e781c28f..3ba32d37 100644
--- a/plugins/icera/mm-iface-icera.h
+++ b/plugins/icera/mm-iface-icera.h
@@ -19,6 +19,7 @@
#include "mm-iface-modem.h"
#include "mm-iface-modem-3gpp.h"
+#include "mm-iface-modem-time.h"
#include "mm-broadband-modem.h"
#define MM_TYPE_IFACE_ICERA (mm_iface_icera_get_type ())
@@ -99,4 +100,14 @@ gboolean mm_iface_icera_modem_3gpp_disable_unsolicited_events_finish (MMIfaceMod
GAsyncResult *res,
GError **error);
+/*****************************************************************************/
+/* Modem Time interface specific implementations */
+
+void mm_iface_icera_modem_time_load_network_timezone (MMIfaceModemTime *self,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+MMNetworkTimezone *mm_iface_icera_modem_time_load_network_timezone_finish (MMIfaceModemTime *self,
+ GAsyncResult *res,
+ GError **error);
+
#endif /* MM_IFACE_ICERA_H */