Add 2 properties to PositionPublisher: blur and start-gps
[azimuth] / src / position-publisher.c
index 9f2f0a1..77e6ab3 100644 (file)
 #include <telepathy-glib/interfaces.h>
 
 #include <location/location-gps-device.h>
+#include <location/location-gpsd-control.h>
 
 #include "connection-watcher.h"
 #include "position-publisher.h"
 
 G_DEFINE_TYPE(PositionPublisher, position_publisher, G_TYPE_OBJECT)
 
+/* properties */
+enum
+{
+  PROP_START_GPS = 1,
+  PROP_BLUR,
+  LAST_PROPERTY
+};
+
 /* Minimum time before 2 publishing (in seconds) */
 #define PUBLISH_THROTTLE 10
 
@@ -41,6 +50,7 @@ typedef struct _PositionPublisherPrivate PositionPublisherPrivate;
 struct _PositionPublisherPrivate
 {
   ConnectionWatcher *watcher;
+  LocationGPSDControl *gps_control;
   LocationGPSDevice *gps_device;
   GSList *connections;
   GHashTable *location;
@@ -48,6 +58,8 @@ struct _PositionPublisherPrivate
   guint throttle_timeout;
   /* TRUE if location has been modified while we were waiting */
   gboolean modified;
+  gboolean blur;
+  gboolean start_gps;
 
   gboolean dispose_has_run;
 };
@@ -241,6 +253,13 @@ position_publisher_init (PositionPublisher *obj)
   g_signal_connect (priv->watcher, "connection-added",
       G_CALLBACK (connection_added_cb), obj);
 
+  priv->gps_control = location_gpsd_control_get_default();
+
+  g_object_set (G_OBJECT(priv->gps_control),
+    "preferred-method", LOCATION_METHOD_USER_SELECTED,
+    "preferred-interval", LOCATION_INTERVAL_120S,
+    NULL);
+
   priv->gps_device = g_object_new (LOCATION_TYPE_GPS_DEVICE, NULL);
 
   g_signal_connect (priv->gps_device, "changed",
@@ -263,18 +282,37 @@ position_publisher_constructed (GObject *object)
 
 static void position_publisher_dispose (GObject *object);
 static void position_publisher_finalize (GObject *object);
+static void position_publisher_get_property (GObject *object,
+    guint property_id, GValue *value, GParamSpec *pspec);
+static void position_publisher_set_property (GObject *object,
+    guint property_id, const GValue *value, GParamSpec *pspec);
 
 static void
 position_publisher_class_init (PositionPublisherClass *position_publisher_class)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (position_publisher_class);
+  GParamSpec *param_spec;
 
   g_type_class_add_private (position_publisher_class, sizeof (PositionPublisherPrivate));
 
   object_class->dispose = position_publisher_dispose;
   object_class->finalize = position_publisher_finalize;
+  object_class->get_property = position_publisher_get_property;
+  object_class->set_property = position_publisher_set_property;
 
   object_class->constructed = position_publisher_constructed;
+
+  param_spec = g_param_spec_boolean ("blur", "Blur?",
+      "Whether the real GPS position is truncated for privacy concerns.", TRUE,
+      G_PARAM_CONSTRUCT | G_PARAM_WRITABLE | G_PARAM_READABLE
+      | G_PARAM_STATIC_STRINGS);
+  g_object_class_install_property (object_class, PROP_BLUR, param_spec);
+
+  param_spec = g_param_spec_boolean ("start-gps", "Start GPS?",
+      "Whether the publisher starts the GPS.", FALSE,
+      G_PARAM_CONSTRUCT | G_PARAM_WRITABLE | G_PARAM_READABLE
+      | G_PARAM_STATIC_STRINGS);
+  g_object_class_install_property (object_class, PROP_START_GPS, param_spec);
 }
 
 void
@@ -290,6 +328,7 @@ position_publisher_dispose (GObject *object)
   priv->dispose_has_run = TRUE;
 
   g_object_unref (priv->watcher);
+  g_object_unref (priv->gps_control);
   g_object_unref (priv->gps_device);
 
   for (l = priv->connections; l != NULL; l = g_slist_next (l))
@@ -317,9 +356,55 @@ position_publisher_finalize (GObject *object)
   G_OBJECT_CLASS (position_publisher_parent_class)->finalize (object);
 }
 
+static void
+position_publisher_get_property (GObject *object,
+                                 guint property_id,
+                                 GValue *value,
+                                 GParamSpec *pspec)
+{
+  PositionPublisher *self = POSITION_PUBLISHER (object);
+  PositionPublisherPrivate *priv = POSITION_PUBLISHER_GET_PRIVATE (self);
+
+  switch (property_id) {
+    case PROP_BLUR:
+      g_value_set_boolean (value, priv->blur);
+      break;
+    case PROP_START_GPS:
+      g_value_set_boolean (value, priv->start_gps);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+      break;
+  }
+}
+
+static void
+position_publisher_set_property (GObject *object,
+                                 guint property_id,
+                                 const GValue *value,
+                                 GParamSpec *pspec)
+{
+  PositionPublisher *self = POSITION_PUBLISHER (object);
+  PositionPublisherPrivate *priv = POSITION_PUBLISHER_GET_PRIVATE (self);
+
+  switch (property_id) {
+    case PROP_BLUR:
+      priv->blur = g_value_get_boolean (value);
+      break;
+    case PROP_START_GPS:
+      priv->blur = g_value_get_boolean (value);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+      break;
+  }
+}
+
 PositionPublisher *
-position_publisher_new (void)
+position_publisher_new (gboolean blur, gboolean start_gps)
 {
   return g_object_new (POSITION_PUBLISHER_TYPE,
+      "blur", blur,
+      "start-gps", start_gps,
       NULL);
 }