Commit 487c9fec authored by Zeeshan Ali's avatar Zeeshan Ali

tmp

parent 2c8db684
......@@ -155,7 +155,9 @@ on_simple_ready (GObject *source_object,
g_object_ref (client);
g_print ("Client object: %s\n",
g_dbus_proxy_get_object_path (G_DBUS_PROXY (client)));
gclue_client_set_time_threshold (client, time_threshold);
if (time_threshold > 0) {
gclue_client_set_time_threshold (client, time_threshold);
}
print_location (simple);
......
......@@ -228,30 +228,31 @@ on_avail_accuracy_level_changed (GObject *gobject,
}
static void
reset_time_threshold (GClueLocationSource *source,
guint cur_value,
guint new_value)
reset_time_threshold (GClueLocator *locator,
GClueLocationSource *source,
guint value)
{
GClueMinUINT *threshold;
threshold = gclue_location_source_get_time_threshold (source);
gclue_min_uint_exchage_value (threshold, cur_value, new_value);
gclue_min_uint_add_value (threshold, value, G_OBJECT (locator));
}
static void
on_time_threshold_changed(GObject *gobject,
GParamSpec *pspec,
gpointer user_data)
on_time_threshold_changed (GObject *gobject,
GParamSpec *pspec,
gpointer user_data)
{
GClueMinUINT *threshold = GCLUE_MIN_UINT (gobject);
GClueLocator *locator = GCLUE_LOCATOR (user_data);
guint value = gclue_min_uint_get_value (threshold);
GList *node;
g_debug ("Locator: on_time_threshold_changed");
for (node = locator->priv->sources; node != NULL; node = node->next) {
reset_time_threshold (GCLUE_LOCATION_SOURCE (node->data),
locator->priv->time_threshold,
reset_time_threshold (locator,
GCLUE_LOCATION_SOURCE (node->data),
value);
}
}
......@@ -298,16 +299,18 @@ gclue_locator_finalize (GObject *gsource)
GClueLocator *locator = GCLUE_LOCATOR (gsource);
GClueLocatorPrivate *priv = locator->priv;
GList *node;
GClueMinUINT *threshold;
G_OBJECT_CLASS (gclue_locator_parent_class)->finalize (gsource);
for (node = locator->priv->sources; node != NULL; node = node->next) {
GClueMinUINT *threshold;
threshold = gclue_location_source_get_time_threshold
(GCLUE_LOCATION_SOURCE (node->data));
gclue_min_uint_drop_value (threshold, priv->time_threshold);
threshold = gclue_location_source_get_time_threshold
(GCLUE_LOCATION_SOURCE (locator));
g_signal_handlers_disconnect_by_func
(G_OBJECT (threshold),
G_CALLBACK (on_time_threshold_changed),
locator);
for (node = locator->priv->sources; node != NULL; node = node->next) {
g_signal_handlers_disconnect_by_func
(G_OBJECT (node->data),
G_CALLBACK (on_avail_accuracy_level_changed),
......@@ -522,9 +525,14 @@ gclue_locator_get_accuracy_level (GClueLocator *locator)
guint
gclue_locator_get_time_threshold (GClueLocator *locator)
{
GClueMinUINT *threshold;
g_return_val_if_fail (GCLUE_IS_LOCATOR (locator), 0);
return locator->priv->time_threshold;
threshold = gclue_location_source_get_time_threshold
(GCLUE_LOCATION_SOURCE (locator));
return gclue_min_uint_get_value (threshold);
}
/**
......@@ -545,15 +553,7 @@ gclue_locator_set_time_threshold (GClueLocator *locator,
{
g_return_if_fail (GCLUE_IS_LOCATOR (locator));
if (locator->priv->time_threshold == value) {
return;
}
reset_time_threshold (GCLUE_LOCATION_SOURCE (locator),
locator->priv->time_threshold,
reset_time_threshold (locator,
GCLUE_LOCATION_SOURCE (locator),
value);
locator->priv->time_threshold = value;
g_debug ("%s: New time-threshold: %u",
G_OBJECT_TYPE_NAME (locator),
value);
}
......@@ -51,6 +51,34 @@ enum
static GParamSpec *gParamSpecs[LAST_PROP];
typedef struct
{
GClueMinUINT *muint;
GObject *owner;
} OwnerData;
static gboolean
on_owner_weak_ref_notify_defered (OwnerData *data)
{
gclue_min_uint_drop_value (data->muint, data->owner);
g_object_unref (data->muint);
g_slice_free (OwnerData, data);
return FALSE;
}
static void
on_owner_weak_ref_notify (gpointer data, GObject *object)
{
OwnerData *owner_data = g_slice_new (OwnerData);
owner_data->muint = GCLUE_MIN_UINT (data);
g_object_ref (owner_data->muint);
owner_data->owner = object;
// Let's ensure owner is really gone before we drop its value
g_idle_add ((GSourceFunc) on_owner_weak_ref_notify_defered, owner_data);
}
static void
gclue_min_uint_finalize (GObject *object)
{
......@@ -134,17 +162,17 @@ guint
gclue_min_uint_get_value (GClueMinUINT *muint)
{
guint value;
GList *keys, *l;
GList *values, *l;
g_return_val_if_fail (GCLUE_IS_MIN_UINT(muint), 0);
if (g_hash_table_size (muint->priv->all_values) == 0)
return 0;
keys = g_hash_table_get_keys (muint->priv->all_values);
value = GPOINTER_TO_UINT (keys->data);
values = g_hash_table_get_values (muint->priv->all_values);
value = GPOINTER_TO_UINT (values->data);
for (l = keys->next; l; l = l->next) {
for (l = values->next; l; l = l->next) {
guint i = GPOINTER_TO_UINT (l->data);
if (value > i) {
......@@ -159,93 +187,61 @@ gclue_min_uint_get_value (GClueMinUINT *muint)
* gclue_min_uint_add_value
* @muint: a #GClueMinUINT
* @value: A value to add to the list
* @owner: the object adding this value
*
* If @owner has already added a value previously, this call will simply replace
* that. i-e Each object can only add one value at a time.
**/
void
gclue_min_uint_add_value (GClueMinUINT *muint,
guint value)
guint value,
GObject *owner)
{
gpointer key, hash_value;
guint cur_value, new_value;
guint num_users = 1;
guint new_value;
g_return_if_fail (GCLUE_IS_MIN_UINT(muint));
key = GUINT_TO_POINTER (value);
hash_value = g_hash_table_lookup (muint->priv->all_values, key);
if (hash_value != NULL) {
num_users = GPOINTER_TO_UINT (hash_value) + 1;
}
cur_value = gclue_min_uint_get_value (muint);
g_hash_table_replace (muint->priv->all_values,
key,
GUINT_TO_POINTER (num_users));
owner,
GUINT_TO_POINTER (value));
g_object_weak_ref (owner, on_owner_weak_ref_notify, muint);
new_value = gclue_min_uint_get_value (muint);
g_debug ("%s: Added %u for %s. New minimum value: %u",
G_OBJECT_TYPE_NAME (muint),
value,
G_OBJECT_TYPE_NAME (owner),
new_value);
if (cur_value != new_value && muint->priv->notify_value) {
g_object_notify_by_pspec (G_OBJECT (muint),
gParamSpecs[PROP_VALUE]);
}
g_object_notify_by_pspec (G_OBJECT (muint), gParamSpecs[PROP_VALUE]);
}
/**
* gclue_min_uint_drop_value
* @muint: a #GClueMinUINT
* @value: A value to drop from the list
* @owner: the object that adadded a value previously
**/
void
gclue_min_uint_drop_value (GClueMinUINT *muint,
guint value)
GObject *owner)
{
gpointer key, hash_value;
guint cur_value, new_value;
guint num_users;
gpointer hash_value;
guint new_value;
g_return_if_fail (GCLUE_IS_MIN_UINT(muint));
key = GUINT_TO_POINTER (value);
hash_value = g_hash_table_lookup (muint->priv->all_values, key);
if (hash_value == NULL) {
if (!g_hash_table_lookup_extended (muint->priv->all_values,
owner,
NULL,
&hash_value)) {
return;
}
cur_value = gclue_min_uint_get_value (muint);
num_users = GPOINTER_TO_UINT (hash_value) - 1;
if (num_users == 0) {
g_hash_table_remove (muint->priv->all_values, key);
} else {
g_hash_table_replace (muint->priv->all_values,
key,
GUINT_TO_POINTER (num_users));
}
g_hash_table_remove (muint->priv->all_values, owner);
new_value = gclue_min_uint_get_value (muint);
g_debug ("%s: Dropped %u. New minimum value: %u",
G_OBJECT_TYPE_NAME (muint),
GPOINTER_TO_INT (hash_value),
new_value);
if (cur_value != new_value && muint->priv->notify_value) {
g_object_notify_by_pspec (G_OBJECT (muint),
gParamSpecs[PROP_VALUE]);
}
}
/**
* gclue_min_uint_exchange_value
* @muint: a #GClueMinUINT
* @to_drop: A value to drop from the list
* @to_add: A value to add to the list
*
* Use this method instead of #gclue_min_uint_drop_value and
* #gclue_min_uint_add_value to ensure #GClueMinUINT:value property is only
* notified once.
**/
void
gclue_min_uint_exchage_value (GClueMinUINT *muint,
guint to_drop,
guint to_add)
{
g_return_if_fail (GCLUE_IS_MIN_UINT(muint));
muint->priv->notify_value = FALSE;
gclue_min_uint_drop_value (muint, to_drop);
muint->priv->notify_value = TRUE;
gclue_min_uint_add_value (muint, to_add);
g_object_notify_by_pspec (G_OBJECT (muint), gParamSpecs[PROP_VALUE]);
}
......@@ -57,12 +57,10 @@ GType gclue_min_uint_get_type (void) G_GNUC_CONST;
GClueMinUINT * gclue_min_uint_new (void);
guint gclue_min_uint_get_value (GClueMinUINT *muint);
void gclue_min_uint_add_value (GClueMinUINT *muint,
guint value);
guint value,
GObject *owner);
void gclue_min_uint_drop_value (GClueMinUINT *muint,
guint value);
void gclue_min_uint_exchage_value (GClueMinUINT *muint,
guint to_drop,
guint to_add);
GObject *owner);
G_END_DECLS
#endif /* GCLUE_MIN_UINT_H */
......@@ -106,6 +106,18 @@ on_is_gps_available_notify (GObject *gobject,
source);
}
static void
on_time_threshold_changed (GObject *gobject,
GParamSpec *pspec,
gpointer user_data)
{
GClueModemGPS *source = GCLUE_MODEM_GPS (user_data);
guint threshold;
threshold = gclue_min_uint_get_value (GCLUE_MIN_UINT (gobject));
gclue_modem_set_time_threshold (source->priv->modem, threshold);
}
static void
gclue_modem_gps_finalize (GObject *ggps)
{
......@@ -140,6 +152,7 @@ static void
gclue_modem_gps_init (GClueModemGPS *source)
{
GClueModemGPSPrivate *priv;
GClueMinUINT *threshold;
source->priv = G_TYPE_INSTANCE_GET_PRIVATE ((source), GCLUE_TYPE_MODEM_GPS, GClueModemGPSPrivate);
priv = source->priv;
......@@ -152,6 +165,12 @@ gclue_modem_gps_init (GClueModemGPS *source)
"notify::is-gps-available",
G_CALLBACK (on_is_gps_available_notify),
source);
threshold = gclue_location_source_get_time_threshold
(GCLUE_LOCATION_SOURCE (source));
g_signal_connect (threshold,
"notify::value",
G_CALLBACK (on_time_threshold_changed),
source);
}
static void
......
......@@ -230,12 +230,12 @@ gclue_modem_manager_class_init (GClueModemManagerClass *klass)
gParamSpecs[PROP_IS_GPS_AVAILABLE] =
g_object_class_find_property (gmodem_class,
"is-gps-available");
gParamSpecs[PROP_TIME_THRESHOLD] =
g_object_class_find_property (gmodem_class,
"time-threshold");
g_object_class_override_property (gmodem_class,
PROP_TIME_THRESHOLD,
"time-threshold");
gParamSpecs[PROP_TIME_THRESHOLD] =
g_object_class_find_property (gmodem_class,
"time-threshold");
signals[FIX_3G] = g_signal_lookup ("fix-3g", GCLUE_TYPE_MODEM);
signals[FIX_CDMA] = g_signal_lookup ("fix-cdma", GCLUE_TYPE_MODEM);
......@@ -320,7 +320,7 @@ on_get_3gpp_ready (GObject *source_object,
cell_id = mm_location_3gpp_get_cell_id (location_3gpp);
if (is_location_3gpp_same (manager, mcc, mnc, lac, cell_id)) {
g_debug ("New 3GPP location is same as last one");
//g_debug ("New 3GPP location is same as last one");
return;
}
g_clear_object (&priv->location_3gpp);
......@@ -409,13 +409,13 @@ on_get_gps_nmea_ready (GObject *source_object,
}
if (is_location_gga_same (manager, gga)) {
g_debug ("New GGA trace is same as last one: %s", gga);
//g_debug ("New GGA trace is same as last one: %s", gga);
return;
}
g_clear_object (&priv->location_nmea);
priv->location_nmea = location_nmea;
g_debug ("New GPGGA trace: %s", gga);
//g_debug ("New GPGGA trace: %s", gga);
g_signal_emit (manager, signals[FIX_GPS], 0, gga);
}
......@@ -641,11 +641,15 @@ on_mm_object_added (GDBusObjectManager *object_manager,
manager->priv->modem = mm_modem;
manager->priv->modem_location = mm_object_get_modem_location (mm_object);
mm_modem_location_set_gps_refresh_rate (manager->priv->modem_location,
manager->priv->time_threshold,
manager->priv->cancellable,
on_gps_refresh_rate_set,
NULL);
g_debug ("Setting GPS refresh rate to %u on Modem '%s'",
manager->priv->time_threshold,
mm_object_get_path (mm_object));
mm_modem_location_set_gps_refresh_rate
(manager->priv->modem_location,
manager->priv->time_threshold,
manager->priv->cancellable,
on_gps_refresh_rate_set,
NULL);
g_signal_connect (G_OBJECT (manager->priv->modem_location),
"notify::location",
......@@ -762,6 +766,7 @@ gclue_modem_manager_constructed (GObject *object)
priv->cancellable,
on_bus_get_ready,
object);
}
static void
......
......@@ -258,6 +258,7 @@ start_client (GClueServiceClient *client, GClueAccuracyLevel accuracy_level)
gclue_dbus_client_set_active (GCLUE_DBUS_CLIENT (client), TRUE);
priv->locator = gclue_locator_new (accuracy_level);
gclue_locator_set_time_threshold (priv->locator, 0);
g_signal_connect (priv->locator,
"notify::location",
G_CALLBACK (on_locator_location_changed),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment