aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2021-07-01 23:37:45 +0200
committerAleksander Morgado <aleksander@aleksander.es>2021-07-01 23:38:04 +0200
commit5012c1a3f3cb6f7d5f78f83bfbf72796758a2492 (patch)
tree8bc9ac1a02a902e386235ca6f64ca54b0a387ea8
parentb8e939ceaca15d3f8bf1f153f93187f2e4f42ae4 (diff)
libmm-glib,modem-signal: use helper macros to manage the monitored properties
-rw-r--r--libmm-glib/mm-modem-signal.c323
1 files changed, 60 insertions, 263 deletions
diff --git a/libmm-glib/mm-modem-signal.c b/libmm-glib/mm-modem-signal.c
index c511b1d8..4a7574e8 100644
--- a/libmm-glib/mm-modem-signal.c
+++ b/libmm-glib/mm-modem-signal.c
@@ -41,26 +41,16 @@
G_DEFINE_TYPE (MMModemSignal, mm_modem_signal, MM_GDBUS_TYPE_MODEM_SIGNAL_PROXY)
-typedef struct {
- guint id;
- MMSignal *info;
-} UpdatedProperty;
-
-typedef enum {
- UPDATED_PROPERTY_TYPE_CDMA = 0,
- UPDATED_PROPERTY_TYPE_EVDO = 1,
- UPDATED_PROPERTY_TYPE_GSM = 2,
- UPDATED_PROPERTY_TYPE_UMTS = 3,
- UPDATED_PROPERTY_TYPE_LTE = 4,
- UPDATED_PROPERTY_TYPE_NR5G = 5,
- UPDATED_PROPERTY_TYPE_LAST
-} UpdatedPropertyType;
-
struct _MMModemSignalPrivate {
/* Common mutex to sync access */
GMutex mutex;
- UpdatedProperty values [UPDATED_PROPERTY_TYPE_LAST];
+ PROPERTY_OBJECT_DECLARE (cdma, MMSignal)
+ PROPERTY_OBJECT_DECLARE (evdo, MMSignal)
+ PROPERTY_OBJECT_DECLARE (gsm, MMSignal)
+ PROPERTY_OBJECT_DECLARE (umts, MMSignal)
+ PROPERTY_OBJECT_DECLARE (lte, MMSignal)
+ PROPERTY_OBJECT_DECLARE (nr5g, MMSignal)
};
/*****************************************************************************/
@@ -216,133 +206,6 @@ mm_modem_signal_get_rate (MMModemSignal *self)
/*****************************************************************************/
-static void values_updated (MMModemSignal *self, GParamSpec *pspec, UpdatedPropertyType type);
-
-static void
-cdma_updated (MMModemSignal *self,
- GParamSpec *pspec)
-{
- values_updated (self, pspec, UPDATED_PROPERTY_TYPE_CDMA);
-}
-
-static void
-evdo_updated (MMModemSignal *self,
- GParamSpec *pspec)
-{
- values_updated (self, pspec, UPDATED_PROPERTY_TYPE_EVDO);
-}
-
-static void
-gsm_updated (MMModemSignal *self,
- GParamSpec *pspec)
-{
- values_updated (self, pspec, UPDATED_PROPERTY_TYPE_GSM);
-}
-
-static void
-umts_updated (MMModemSignal *self,
- GParamSpec *pspec)
-{
- values_updated (self, pspec, UPDATED_PROPERTY_TYPE_UMTS);
-}
-
-static void
-lte_updated (MMModemSignal *self,
- GParamSpec *pspec)
-{
- values_updated (self, pspec, UPDATED_PROPERTY_TYPE_LTE);
-}
-
-static void
-nr5g_updated (MMModemSignal *self,
- GParamSpec *pspec)
-{
- values_updated (self, pspec, UPDATED_PROPERTY_TYPE_NR5G);
-}
-
-typedef GVariant * (* Getter) (MmGdbusModemSignal *self);
-typedef GVariant * (* Dupper) (MmGdbusModemSignal *self);
-typedef void (* UpdatedCallback) (MMModemSignal *self, GParamSpec *pspec);
-typedef struct {
- const gchar *signal_name;
- Getter get;
- Dupper dup;
- UpdatedCallback updated_callback;
-} SignalData;
-
-static const SignalData signal_data [UPDATED_PROPERTY_TYPE_LAST] = {
- { "notify::cdma", mm_gdbus_modem_signal_get_cdma, mm_gdbus_modem_signal_dup_cdma, cdma_updated },
- { "notify::evdo", mm_gdbus_modem_signal_get_evdo, mm_gdbus_modem_signal_dup_evdo, evdo_updated },
- { "notify::gsm", mm_gdbus_modem_signal_get_gsm, mm_gdbus_modem_signal_dup_gsm, gsm_updated },
- { "notify::umts", mm_gdbus_modem_signal_get_umts, mm_gdbus_modem_signal_dup_umts, umts_updated },
- { "notify::lte", mm_gdbus_modem_signal_get_lte, mm_gdbus_modem_signal_dup_lte, lte_updated },
- { "notify::nr5g", mm_gdbus_modem_signal_get_nr5g, mm_gdbus_modem_signal_dup_nr5g, nr5g_updated }
-};
-
-static void
-values_updated (MMModemSignal *self,
- GParamSpec *pspec,
- UpdatedPropertyType type)
-{
- g_mutex_lock (&self->priv->mutex);
- {
- GVariant *dictionary;
-
- g_clear_object (&self->priv->values[type].info);
- dictionary = signal_data[type].get (MM_GDBUS_MODEM_SIGNAL (self));
- if (dictionary) {
- GError *error = NULL;
-
- self->priv->values[type].info = mm_signal_new_from_dictionary (dictionary, &error);
- if (error) {
- g_warning ("Invalid signal info update received: %s", error->message);
- g_error_free (error);
- }
- }
- }
- g_mutex_unlock (&self->priv->mutex);
-}
-
-static void
-ensure_internal (MMModemSignal *self,
- MMSignal **dup,
- UpdatedPropertyType type)
-{
- g_mutex_lock (&self->priv->mutex);
- {
- /* If this is the first time ever asking for the object, setup the
- * update listener and the initial object, if any. */
- if (!self->priv->values[type].id) {
- GVariant *dictionary;
-
- dictionary = signal_data[type].dup (MM_GDBUS_MODEM_SIGNAL (self));
- if (dictionary) {
- GError *error = NULL;
-
- self->priv->values[type].info = mm_signal_new_from_dictionary (dictionary, &error);
- if (error) {
- g_warning ("Invalid signal info: %s", error->message);
- g_error_free (error);
- }
- g_variant_unref (dictionary);
- }
-
- /* No need to clear this signal connection when freeing self */
- self->priv->values[type].id =
- g_signal_connect (self,
- signal_data[type].signal_name,
- G_CALLBACK (signal_data[type].updated_callback),
- NULL);
- }
-
- if (dup && self->priv->values[type].info)
- *dup = g_object_ref (self->priv->values[type].info);
- }
- g_mutex_unlock (&self->priv->mutex);
-}
-
-/*****************************************************************************/
-
/**
* mm_modem_signal_get_cdma:
* @self: A #MMModem.
@@ -359,16 +222,6 @@ ensure_internal (MMModemSignal *self,
*
* Since: 1.2
*/
-MMSignal *
-mm_modem_signal_get_cdma (MMModemSignal *self)
-{
- MMSignal *info = NULL;
-
- g_return_val_if_fail (MM_IS_MODEM_SIGNAL (self), NULL);
-
- ensure_internal (self, &info, UPDATED_PROPERTY_TYPE_CDMA);
- return info;
-}
/**
* mm_modem_signal_peek_cdma:
@@ -385,14 +238,11 @@ mm_modem_signal_get_cdma (MMModemSignal *self)
*
* Since: 1.2
*/
-MMSignal *
-mm_modem_signal_peek_cdma (MMModemSignal *self)
-{
- g_return_val_if_fail (MM_IS_MODEM_SIGNAL (self), NULL);
- ensure_internal (self, NULL, UPDATED_PROPERTY_TYPE_CDMA);
- return self->priv->values[UPDATED_PROPERTY_TYPE_CDMA].info;
-}
+PROPERTY_OBJECT_DEFINE_FAILABLE (cdma,
+ ModemSignal, modem_signal, MODEM_SIGNAL,
+ MMSignal,
+ mm_signal_new_from_dictionary)
/*****************************************************************************/
@@ -412,16 +262,6 @@ mm_modem_signal_peek_cdma (MMModemSignal *self)
*
* Since: 1.2
*/
-MMSignal *
-mm_modem_signal_get_evdo (MMModemSignal *self)
-{
- MMSignal *info = NULL;
-
- g_return_val_if_fail (MM_IS_MODEM_SIGNAL (self), NULL);
-
- ensure_internal (self, &info, UPDATED_PROPERTY_TYPE_EVDO);
- return info;
-}
/**
* mm_modem_signal_peek_evdo:
@@ -438,14 +278,11 @@ mm_modem_signal_get_evdo (MMModemSignal *self)
*
* Since: 1.2
*/
-MMSignal *
-mm_modem_signal_peek_evdo (MMModemSignal *self)
-{
- g_return_val_if_fail (MM_IS_MODEM_SIGNAL (self), NULL);
- ensure_internal (self, NULL, UPDATED_PROPERTY_TYPE_EVDO);
- return self->priv->values[UPDATED_PROPERTY_TYPE_EVDO].info;
-}
+PROPERTY_OBJECT_DEFINE_FAILABLE (evdo,
+ ModemSignal, modem_signal, MODEM_SIGNAL,
+ MMSignal,
+ mm_signal_new_from_dictionary)
/*****************************************************************************/
@@ -465,16 +302,6 @@ mm_modem_signal_peek_evdo (MMModemSignal *self)
*
* Since: 1.2
*/
-MMSignal *
-mm_modem_signal_get_gsm (MMModemSignal *self)
-{
- MMSignal *info = NULL;
-
- g_return_val_if_fail (MM_IS_MODEM_SIGNAL (self), NULL);
-
- ensure_internal (self, &info, UPDATED_PROPERTY_TYPE_GSM);
- return info;
-}
/**
* mm_modem_signal_peek_gsm:
@@ -491,14 +318,11 @@ mm_modem_signal_get_gsm (MMModemSignal *self)
*
* Since: 1.2
*/
-MMSignal *
-mm_modem_signal_peek_gsm (MMModemSignal *self)
-{
- g_return_val_if_fail (MM_IS_MODEM_SIGNAL (self), NULL);
- ensure_internal (self, NULL, UPDATED_PROPERTY_TYPE_GSM);
- return self->priv->values[UPDATED_PROPERTY_TYPE_GSM].info;
-}
+PROPERTY_OBJECT_DEFINE_FAILABLE (gsm,
+ ModemSignal, modem_signal, MODEM_SIGNAL,
+ MMSignal,
+ mm_signal_new_from_dictionary)
/*****************************************************************************/
@@ -518,16 +342,6 @@ mm_modem_signal_peek_gsm (MMModemSignal *self)
*
* Since: 1.2
*/
-MMSignal *
-mm_modem_signal_get_umts (MMModemSignal *self)
-{
- MMSignal *info = NULL;
-
- g_return_val_if_fail (MM_IS_MODEM_SIGNAL (self), NULL);
-
- ensure_internal (self, &info, UPDATED_PROPERTY_TYPE_UMTS);
- return info;
-}
/**
* mm_modem_signal_peek_umts:
@@ -544,14 +358,11 @@ mm_modem_signal_get_umts (MMModemSignal *self)
*
* Since: 1.2
*/
-MMSignal *
-mm_modem_signal_peek_umts (MMModemSignal *self)
-{
- g_return_val_if_fail (MM_IS_MODEM_SIGNAL (self), NULL);
- ensure_internal (self, NULL, UPDATED_PROPERTY_TYPE_UMTS);
- return self->priv->values[UPDATED_PROPERTY_TYPE_UMTS].info;
-}
+PROPERTY_OBJECT_DEFINE_FAILABLE (umts,
+ ModemSignal, modem_signal, MODEM_SIGNAL,
+ MMSignal,
+ mm_signal_new_from_dictionary)
/*****************************************************************************/
@@ -571,16 +382,29 @@ mm_modem_signal_peek_umts (MMModemSignal *self)
*
* Since: 1.2
*/
-MMSignal *
-mm_modem_signal_get_lte (MMModemSignal *self)
-{
- MMSignal *info = NULL;
- g_return_val_if_fail (MM_IS_MODEM_SIGNAL (self), NULL);
+/**
+ * mm_modem_signal_peek_lte:
+ * @self: A #MMModem.
+ *
+ * Gets a #MMSignal object specifying the LTE signal information.
+ *
+ * <warning>The returned value is only valid until the property changes so it is
+ * only safe to use this function on the thread where @self was constructed. Use
+ * mm_modem_signal_get_lte() if on another thread.</warning>
+ *
+ * Returns: (transfer none): A #MMSignal. Do not free the returned value, it
+ * belongs to @self.
+ *
+ * Since: 1.2
+ */
- ensure_internal (self, &info, UPDATED_PROPERTY_TYPE_LTE);
- return info;
-}
+PROPERTY_OBJECT_DEFINE_FAILABLE (lte,
+ ModemSignal, modem_signal, MODEM_SIGNAL,
+ MMSignal,
+ mm_signal_new_from_dictionary)
+
+/*****************************************************************************/
/**
* mm_modem_signal_get_nr5g:
@@ -598,40 +422,6 @@ mm_modem_signal_get_lte (MMModemSignal *self)
*
* Since: 1.16
*/
-MMSignal *
-mm_modem_signal_get_nr5g (MMModemSignal *self)
-{
- MMSignal *info = NULL;
-
- g_return_val_if_fail (MM_IS_MODEM_SIGNAL (self), NULL);
-
- ensure_internal (self, &info, UPDATED_PROPERTY_TYPE_NR5G);
- return info;
-}
-
-/**
- * mm_modem_signal_peek_lte:
- * @self: A #MMModem.
- *
- * Gets a #MMSignal object specifying the LTE signal information.
- *
- * <warning>The returned value is only valid until the property changes so it is
- * only safe to use this function on the thread where @self was constructed. Use
- * mm_modem_signal_get_lte() if on another thread.</warning>
- *
- * Returns: (transfer none): A #MMSignal. Do not free the returned value, it
- * belongs to @self.
- *
- * Since: 1.2
- */
-MMSignal *
-mm_modem_signal_peek_lte (MMModemSignal *self)
-{
- g_return_val_if_fail (MM_IS_MODEM_SIGNAL (self), NULL);
-
- ensure_internal (self, NULL, UPDATED_PROPERTY_TYPE_LTE);
- return self->priv->values[UPDATED_PROPERTY_TYPE_LTE].info;
-}
/**
* mm_modem_signal_peek_nr5g:
@@ -648,14 +438,11 @@ mm_modem_signal_peek_lte (MMModemSignal *self)
*
* Since: 1.16
*/
-MMSignal *
-mm_modem_signal_peek_nr5g (MMModemSignal *self)
-{
- g_return_val_if_fail (MM_IS_MODEM_SIGNAL (self), NULL);
- ensure_internal (self, NULL, UPDATED_PROPERTY_TYPE_NR5G);
- return self->priv->values[UPDATED_PROPERTY_TYPE_NR5G].info;
-}
+PROPERTY_OBJECT_DEFINE_FAILABLE (nr5g,
+ ModemSignal, modem_signal, MODEM_SIGNAL,
+ MMSignal,
+ mm_signal_new_from_dictionary)
/*****************************************************************************/
@@ -664,18 +451,28 @@ mm_modem_signal_init (MMModemSignal *self)
{
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, MM_TYPE_MODEM_SIGNAL, MMModemSignalPrivate);
g_mutex_init (&self->priv->mutex);
+
+ PROPERTY_INITIALIZE (cdma, "cdma")
+ PROPERTY_INITIALIZE (evdo, "evdo")
+ PROPERTY_INITIALIZE (gsm, "gsm")
+ PROPERTY_INITIALIZE (umts, "umts")
+ PROPERTY_INITIALIZE (lte, "lte")
+ PROPERTY_INITIALIZE (nr5g, "nr5g")
}
static void
finalize (GObject *object)
{
MMModemSignal *self = MM_MODEM_SIGNAL (object);
- guint i;
g_mutex_clear (&self->priv->mutex);
- for (i = 0; i < UPDATED_PROPERTY_TYPE_LAST; i++)
- g_clear_object (&self->priv->values[i].info);
+ PROPERTY_OBJECT_FINALIZE (cdma)
+ PROPERTY_OBJECT_FINALIZE (evdo)
+ PROPERTY_OBJECT_FINALIZE (gsm)
+ PROPERTY_OBJECT_FINALIZE (umts)
+ PROPERTY_OBJECT_FINALIZE (lte)
+ PROPERTY_OBJECT_FINALIZE (nr5g)
G_OBJECT_CLASS (mm_modem_signal_parent_class)->finalize (object);
}