Commit 7bdce141 authored by Zeeshan Ali's avatar Zeeshan Ali

Add CDMA location support

parent 30291530
...@@ -69,6 +69,18 @@ else ...@@ -69,6 +69,18 @@ else
fi fi
AM_CONDITIONAL([BUILD_3G_SOURCE], [test "$build_3g_source" = "yes"]) AM_CONDITIONAL([BUILD_3G_SOURCE], [test "$build_3g_source" = "yes"])
# CDMA source
AC_ARG_ENABLE(cdma-source,
AS_HELP_STRING([--disable-cdma-source], [Disable CDMA backend (requires ModemManager)]),
[build_cdma_source=$enableval], [build_cdma_source=yes])
if test "$build_cdma_source" = "yes"; then
build_modem_source=yes
AC_DEFINE([GCLUE_USE_CDMA_SOURCE], [1], [Build CDMA source?])
else
AC_DEFINE([GCLUE_USE_CDMA_SOURCE], [0], [Build CDMA source?])
fi
AM_CONDITIONAL([BUILD_CDMA_SOURCE], [test "$build_cdma_source" = "yes"])
# GPS source # GPS source
AC_ARG_ENABLE(modem-gps-source, AC_ARG_ENABLE(modem-gps-source,
AS_HELP_STRING([--disable-modem-gps-source], [Disable modem GPS backend (requires ModemManager)]), AS_HELP_STRING([--disable-modem-gps-source], [Disable modem GPS backend (requires ModemManager)]),
...@@ -81,7 +93,7 @@ else ...@@ -81,7 +93,7 @@ else
fi fi
AM_CONDITIONAL([BUILD_MODEM_GPS_SOURCE], [test "$build_modem_gps_source" = "yes"]) AM_CONDITIONAL([BUILD_MODEM_GPS_SOURCE], [test "$build_modem_gps_source" = "yes"])
# Modem source is used in common by GPS and 3G sources # Modem source is used in common by GPS, 3G and CDMA sources
if test "$build_modem_source" = "yes"; then if test "$build_modem_source" = "yes"; then
require_modemmanager=yes require_modemmanager=yes
fi fi
...@@ -194,5 +206,6 @@ AC_MSG_NOTICE([ ...@@ -194,5 +206,6 @@ AC_MSG_NOTICE([
systemdsystemunitdir: ${systemdsystemunitdir} systemdsystemunitdir: ${systemdsystemunitdir}
3G source: ${build_3g_source} 3G source: ${build_3g_source}
CDMA source: ${build_cdma_source}
Modem GPS source: ${build_modem_gps_source} Modem GPS source: ${build_modem_gps_source}
]) ])
...@@ -105,6 +105,10 @@ if BUILD_3G_SOURCE ...@@ -105,6 +105,10 @@ if BUILD_3G_SOURCE
libgeoclue_la_SOURCES += gclue-3g.c gclue-3g.h libgeoclue_la_SOURCES += gclue-3g.c gclue-3g.h
endif endif
if BUILD_CDMA_SOURCE
libgeoclue_la_SOURCES += gclue-cdma.c gclue-cdma.h
endif
if BUILD_MODEM_GPS_SOURCE if BUILD_MODEM_GPS_SOURCE
libgeoclue_la_SOURCES += gclue-modem-gps.c gclue-modem-gps.h libgeoclue_la_SOURCES += gclue-modem-gps.c gclue-modem-gps.h
endif endif
......
/* vim: set et ts=8 sw=8: */
/*
* Copyright (C) 2014 Red Hat, Inc.
*
* Geoclue is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* Geoclue is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along
* with Geoclue; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* Authors: Zeeshan Ali (Khattak) <zeeshanak@gnome.org>
*/
#include <stdlib.h>
#include <glib.h>
#include <string.h>
#include "gclue-cdma.h"
#include "gclue-modem-manager.h"
#include "geocode-glib/geocode-location.h"
/**
* SECTION:gclue-cdma
* @short_description: WiFi-based geolocation
* @include: gclue-glib/gclue-cdma.h
*
* Contains functions to get the geolocation from a CDMA cell tower.
**/
struct _GClueCDMAPrivate {
GClueModem *modem;
GCancellable *cancellable;
gulong cdma_notify_id;
};
G_DEFINE_TYPE (GClueCDMA, gclue_cdma, GCLUE_TYPE_LOCATION_SOURCE)
static gboolean
gclue_cdma_start (GClueLocationSource *source);
static gboolean
gclue_cdma_stop (GClueLocationSource *source);
static void
refresh_accuracy_level (GClueCDMA *source)
{
GClueAccuracyLevel new, existing;
existing = gclue_location_source_get_available_accuracy_level
(GCLUE_LOCATION_SOURCE (source));
if (gclue_modem_get_is_cdma_available (source->priv->modem))
new = GCLUE_ACCURACY_LEVEL_NEIGHBORHOOD;
else
new = GCLUE_ACCURACY_LEVEL_NONE;
if (new != existing) {
g_debug ("Available accuracy level from %s: %u",
G_OBJECT_TYPE_NAME (source), new);
g_object_set (G_OBJECT (source),
"available-accuracy-level", new,
NULL);
}
}
static void
on_cdma_enabled (GObject *source_object,
GAsyncResult *result,
gpointer user_data)
{
GClueCDMA *source = GCLUE_CDMA (user_data);
GError *error = NULL;
if (!gclue_modem_enable_cdma_finish (source->priv->modem,
result,
&error)) {
g_warning ("Failed to enable CDMA: %s", error->message);
g_error_free (error);
}
}
static void
on_is_cdma_available_notify (GObject *gobject,
GParamSpec *pspec,
gpointer user_data)
{
GClueCDMA *source = GCLUE_CDMA (user_data);
GClueCDMAPrivate *priv = source->priv;
refresh_accuracy_level (source);
if (gclue_location_source_get_active (GCLUE_LOCATION_SOURCE (source)) &&
gclue_modem_get_is_cdma_available (priv->modem))
gclue_modem_enable_cdma (priv->modem,
priv->cancellable,
on_cdma_enabled,
source);
}
static void
gclue_cdma_finalize (GObject *gcdma)
{
GClueCDMAPrivate *priv = GCLUE_CDMA (gcdma)->priv;
G_OBJECT_CLASS (gclue_cdma_parent_class)->finalize (gcdma);
g_signal_handler_disconnect (priv->modem,
priv->cdma_notify_id);
priv->cdma_notify_id = 0;
g_cancellable_cancel (priv->cancellable);
g_clear_object (&priv->cancellable);
g_clear_object (&priv->modem);
}
static void
gclue_cdma_class_init (GClueCDMAClass *klass)
{
GClueLocationSourceClass *source_class = GCLUE_LOCATION_SOURCE_CLASS (klass);
GObjectClass *gcdma_class = G_OBJECT_CLASS (klass);
gcdma_class->finalize = gclue_cdma_finalize;
source_class->start = gclue_cdma_start;
source_class->stop = gclue_cdma_stop;
g_type_class_add_private (klass, sizeof (GClueCDMAPrivate));
}
static void
gclue_cdma_init (GClueCDMA *source)
{
GClueCDMAPrivate *priv;
source->priv = G_TYPE_INSTANCE_GET_PRIVATE ((source), GCLUE_TYPE_CDMA, GClueCDMAPrivate);
priv = source->priv;
priv->cancellable = g_cancellable_new ();
priv->modem = gclue_modem_manager_get_singleton ();
priv->cdma_notify_id =
g_signal_connect (priv->modem,
"notify::is-cdma-available",
G_CALLBACK (on_is_cdma_available_notify),
source);
}
static void
on_cdma_destroyed (gpointer data,
GObject *where_the_object_was)
{
GClueCDMA **source = (GClueCDMA **) data;
*source = NULL;
}
/**
* gclue_cdma_get_singleton:
*
* Get the #GClueCDMA singleton.
*
* Returns: (transfer full): a new ref to #GClueCDMA. Use g_object_unref()
* when done.
**/
GClueCDMA *
gclue_cdma_get_singleton (void)
{
static GClueCDMA *source = NULL;
if (source == NULL) {
source = g_object_new (GCLUE_TYPE_CDMA, NULL);
g_object_weak_ref (G_OBJECT (source),
on_cdma_destroyed,
&source);
} else
g_object_ref (source);
return source;
}
static void
on_fix_cdma (GClueModem *modem,
gdouble latitude,
gdouble longitude,
gpointer user_data)
{
GeocodeLocation *location;
location = geocode_location_new (latitude,
longitude,
1000); /* Assume 1 km accuracy */
gclue_location_source_set_location (GCLUE_LOCATION_SOURCE (user_data),
location);
g_object_unref (location);
}
static gboolean
gclue_cdma_start (GClueLocationSource *source)
{
GClueLocationSourceClass *base_class;
GClueCDMAPrivate *priv;
g_return_val_if_fail (GCLUE_IS_LOCATION_SOURCE (source), FALSE);
priv = GCLUE_CDMA (source)->priv;
base_class = GCLUE_LOCATION_SOURCE_CLASS (gclue_cdma_parent_class);
if (!base_class->start (source))
return FALSE;
g_signal_connect (priv->modem,
"fix-cdma",
G_CALLBACK (on_fix_cdma),
source);
if (gclue_modem_get_is_cdma_available (priv->modem))
gclue_modem_enable_cdma (priv->modem,
priv->cancellable,
on_cdma_enabled,
source);
return TRUE;
}
static gboolean
gclue_cdma_stop (GClueLocationSource *source)
{
GClueCDMAPrivate *priv = GCLUE_CDMA (source)->priv;
GClueLocationSourceClass *base_class;
GError *error = NULL;
g_return_val_if_fail (GCLUE_IS_LOCATION_SOURCE (source), FALSE);
base_class = GCLUE_LOCATION_SOURCE_CLASS (gclue_cdma_parent_class);
if (!base_class->stop (source))
return FALSE;
g_signal_handlers_disconnect_by_func (G_OBJECT (priv->modem),
G_CALLBACK (on_fix_cdma),
source);
if (gclue_modem_get_is_cdma_available (priv->modem))
if (!gclue_modem_disable_cdma (priv->modem,
priv->cancellable,
&error)) {
g_warning ("Failed to disable CDMA: %s",
error->message);
g_error_free (error);
}
return TRUE;
}
/* vim: set et ts=8 sw=8: */
/*
* Copyright (C) 2014 Red Hat, Inc.
*
* Geoclue is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* Geoclue is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along
* with Geoclue; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* Authors: Zeeshan Ali (Khattak) <zeeshanak@gnome.org>
*/
#ifndef GCLUE_CDMA_H
#define GCLUE_CDMA_H
#include <glib.h>
#include <gio/gio.h>
#include "gclue-location-source.h"
G_BEGIN_DECLS
GType gclue_cdma_get_type (void) G_GNUC_CONST;
#define GCLUE_TYPE_CDMA (gclue_cdma_get_type ())
#define GCLUE_CDMA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCLUE_TYPE_CDMA, GClueCDMA))
#define GCLUE_IS_CDMA(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCLUE_TYPE_CDMA))
#define GCLUE_CDMA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCLUE_TYPE_CDMA, GClueCDMAClass))
#define GCLUE_IS_CDMA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCLUE_TYPE_CDMA))
#define GCLUE_CDMA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCLUE_TYPE_CDMA, GClueCDMAClass))
/**
* GClueCDMA:
*
* All the fields in the #GClueCDMA structure are private and should never be accessed directly.
**/
typedef struct _GClueCDMA GClueCDMA;
typedef struct _GClueCDMAClass GClueCDMAClass;
typedef struct _GClueCDMAPrivate GClueCDMAPrivate;
struct _GClueCDMA {
/* <private> */
GClueLocationSource parent_instance;
GClueCDMAPrivate *priv;
};
/**
* GClueCDMAClass:
*
* All the fields in the #GClueCDMAClass structure are private and should never be accessed directly.
**/
struct _GClueCDMAClass {
/* <private> */
GClueLocationSourceClass parent_class;
};
GClueCDMA * gclue_cdma_get_singleton (void);
G_END_DECLS
#endif /* GCLUE_CDMA_H */
...@@ -33,6 +33,10 @@ ...@@ -33,6 +33,10 @@
#include "gclue-3g.h" #include "gclue-3g.h"
#endif #endif
#if GCLUE_USE_CDMA_SOURCE
#include "gclue-cdma.h"
#endif
#if GCLUE_USE_MODEM_GPS_SOURCE #if GCLUE_USE_MODEM_GPS_SOURCE
#include "gclue-modem-gps.h" #include "gclue-modem-gps.h"
#endif #endif
...@@ -265,6 +269,10 @@ gclue_locator_constructed (GObject *object) ...@@ -265,6 +269,10 @@ gclue_locator_constructed (GObject *object)
#if GCLUE_USE_3G_SOURCE #if GCLUE_USE_3G_SOURCE
GClue3G *source = gclue_3g_get_singleton (); GClue3G *source = gclue_3g_get_singleton ();
locator->priv->sources = g_list_append (locator->priv->sources, source); locator->priv->sources = g_list_append (locator->priv->sources, source);
#endif
#if GCLUE_USE_CDMA_SOURCE
GClueCDMA *cdma = gclue_cdma_get_singleton ();
locator->priv->sources = g_list_append (locator->priv->sources, cdma);
#endif #endif
if (locator->priv->accuracy_level >= GCLUE_ACCURACY_LEVEL_CITY) { if (locator->priv->accuracy_level >= GCLUE_ACCURACY_LEVEL_CITY) {
GClueWifi *wifi = gclue_wifi_get_singleton GClueWifi *wifi = gclue_wifi_get_singleton
......
VOID:UINT,UINT,ULONG,ULONG VOID:UINT,UINT,ULONG,ULONG
VOID:DOUBLE,DOUBLE
This diff is collapsed.
...@@ -49,6 +49,13 @@ gclue_modem_default_init (GClueModemInterface *iface) ...@@ -49,6 +49,13 @@ gclue_modem_default_init (GClueModemInterface *iface)
G_PARAM_READABLE); G_PARAM_READABLE);
g_object_interface_install_property (iface, spec); g_object_interface_install_property (iface, spec);
spec = g_param_spec_boolean ("is-cdma-available",
"IsCDMAAvailable",
"Is CDMA Available?",
FALSE,
G_PARAM_READABLE);
g_object_interface_install_property (iface, spec);
spec = g_param_spec_boolean ("is-gps-available", spec = g_param_spec_boolean ("is-gps-available",
"IsGPSAvailable", "IsGPSAvailable",
"Is GPS Available?", "Is GPS Available?",
...@@ -70,6 +77,18 @@ gclue_modem_default_init (GClueModemInterface *iface) ...@@ -70,6 +77,18 @@ gclue_modem_default_init (GClueModemInterface *iface)
G_TYPE_ULONG, G_TYPE_ULONG,
G_TYPE_ULONG); G_TYPE_ULONG);
g_signal_new ("fix-cdma",
GCLUE_TYPE_MODEM,
G_SIGNAL_RUN_LAST,
0,
NULL,
NULL,
gclue_marshal_VOID__DOUBLE_DOUBLE,
G_TYPE_NONE,
2,
G_TYPE_DOUBLE,
G_TYPE_DOUBLE);
g_signal_new ("fix-gps", g_signal_new ("fix-gps",
GCLUE_TYPE_MODEM, GCLUE_TYPE_MODEM,
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
...@@ -90,6 +109,14 @@ gclue_modem_get_is_3g_available (GClueModem *modem) ...@@ -90,6 +109,14 @@ gclue_modem_get_is_3g_available (GClueModem *modem)
return GCLUE_MODEM_GET_INTERFACE (modem)->get_is_3g_available (modem); return GCLUE_MODEM_GET_INTERFACE (modem)->get_is_3g_available (modem);
} }
gboolean
gclue_modem_get_is_cdma_available (GClueModem *modem)
{
g_return_val_if_fail (GCLUE_IS_MODEM (modem), FALSE);
return GCLUE_MODEM_GET_INTERFACE (modem)->get_is_cdma_available (modem);
}
gboolean gboolean
gclue_modem_get_is_gps_available (GClueModem *modem) gclue_modem_get_is_gps_available (GClueModem *modem)
{ {
...@@ -125,6 +152,33 @@ gclue_modem_enable_3g_finish (GClueModem *modem, ...@@ -125,6 +152,33 @@ gclue_modem_enable_3g_finish (GClueModem *modem,
error); error);
} }
void
gclue_modem_enable_cdma (GClueModem *modem,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data)
{
g_return_if_fail (GCLUE_IS_MODEM (modem));
g_return_if_fail (gclue_modem_get_is_cdma_available (modem));
GCLUE_MODEM_GET_INTERFACE (modem)->enable_cdma (modem,
cancellable,
callback,
user_data);
}
gboolean
gclue_modem_enable_cdma_finish (GClueModem *modem,
GAsyncResult *result,
GError **error)
{
g_return_val_if_fail (GCLUE_IS_MODEM (modem), FALSE);
return GCLUE_MODEM_GET_INTERFACE (modem)->enable_cdma_finish (modem,
result,
error);
}
void void
gclue_modem_enable_gps (GClueModem *modem, gclue_modem_enable_gps (GClueModem *modem,
GCancellable *cancellable, GCancellable *cancellable,
...@@ -165,6 +219,19 @@ gclue_modem_disable_3g (GClueModem *modem, ...@@ -165,6 +219,19 @@ gclue_modem_disable_3g (GClueModem *modem,
error); error);
} }
gboolean
gclue_modem_disable_cdma (GClueModem *modem,
GCancellable *cancellable,
GError **error)
{
g_return_val_if_fail (GCLUE_IS_MODEM (modem), FALSE);
g_return_val_if_fail (gclue_modem_get_is_cdma_available (modem), FALSE);
return GCLUE_MODEM_GET_INTERFACE (modem)->disable_cdma (modem,
cancellable,
error);
}
gboolean gboolean
gclue_modem_disable_gps (GClueModem *modem, gclue_modem_disable_gps (GClueModem *modem,
GCancellable *cancellable, GCancellable *cancellable,
......
...@@ -40,52 +40,74 @@ struct _GClueModemInterface { ...@@ -40,52 +40,74 @@ struct _GClueModemInterface {
/* <private> */ /* <private> */
GTypeInterface parent_iface; GTypeInterface parent_iface;
gboolean (*get_is_3g_available) (GClueModem *modem); gboolean (*get_is_3g_available) (GClueModem *modem);
gboolean (*get_is_gps_available) (GClueModem *modem); gboolean (*get_is_cdma_available) (GClueModem *modem);
void (*enable_3g) (GClueModem *modem, gboolean (*get_is_gps_available) (GClueModem *modem);
GCancellable *cancellable, void (*enable_3g) (GClueModem *modem,
GAsyncReadyCallback callback, GCancellable *cancellable,
gpointer user_data); GAsyncReadyCallback callback,
gboolean (*enable_3g_finish) (GClueModem *modem, gpointer user_data);
GAsyncResult *result, gboolean (*enable_3g_finish) (GClueModem *modem,
GError **error); GAsyncResult *result,
void (*enable_gps) (GClueModem *modem, GError **error);
GCancellable *cancellable, void (*enable_cdma) (GClueModem *modem,
GAsyncReadyCallback callback, GCancellable *cancellable,
gpointer user_data); GAsyncReadyCallback callback,
gboolean (*enable_gps_finish) (GClueModem *modem, gpointer user_data);
GAsyncResult *result, gboolean (*enable_cdma_finish) (GClueModem *modem,
GError **error); GAsyncResult *result,
gboolean (*disable_3g) (GClueModem *modem, GError **error);
GCancellable *cancellable, void (*enable_gps) (GClueModem *modem,
GError **error); GCancellable *cancellable,
gboolean (*disable_gps) (GClueModem *modem, GAsyncReadyCallback callback,
GCancellable *cancellable, gpointer user_data);
GError **error); gboolean (*enable_gps_finish) (GClueModem *modem,
GAsyncResult *result,
GError **error);
gboolean (*disable_3g) (GClueModem *modem,
GCancellable *cancellable,
GError **error);
gboolean (*disable_cdma) (GClueModem *modem,
GCancellable *cancellable,
GError **error);
gboolean (*disable_gps) (GClueModem *modem,
GCancellable *cancellable,
GError **error);
}; };
gboolean gclue_modem_get_is_3g_available (GClueModem *modem); gboolean gclue_modem_get_is_3g_available (GClueModem *modem);
gboolean gclue_modem_get_is_gps_available (GClueModem *modem); gboolean gclue_modem_get_is_cdma_available (GClueModem *modem);
void gclue_modem_enable_3g (GClueModem *modem, gboolean gclue_modem_get_is_gps_available (GClueModem *modem);
GCancellable *cancellable, void gclue_modem_enable_3g (GClueModem *modem,
GAsyncReadyCallback callback, GCancellable *cancellable,
gpointer user_data); GAsyncReadyCallback callback,
gboolean gclue_modem_enable_3g_finish (GClueModem *modem, gpointer user_data);
GAsyncResult *result, gboolean gclue_modem_enable_3g_finish (GClueModem *modem,
GError **error); GAsyncResult *result,
void gclue_modem_enable_gps (GClueModem *modem, GError **error);
GCancellable *cancellable, void gclue_modem_enable_cdma (GClueModem *modem,
GAsyncReadyCallback callback, GCancellable *cancellable,
gpointer user_data); GAsyncReadyCallback callback,
gboolean gclue_modem_enable_gps_finish (GClueModem *modem, gpointer user_data);
GAsyncResult *result, gboolean gclue_modem_enable_cdma_finish (GClueModem *modem,
GError **error); GAsyncResult *result,
gboolean gclue_modem_disable_3g (GClueModem *modem, GError **error);
GCancellable *cancellable, void gclue_modem_enable_gps (GClueModem *modem,
GError **error); GCancellable *cancellable,
gboolean gclue_modem_disable_gps (GClueModem *modem, GAsyncReadyCallback callback,
GCancellable *cancellable, gpointer user_data);
GError **error); gboolean gclue_modem_enable_gps_finish (GClueModem *modem,
GAsyncResult *result,
GError **error);
gboolean gclue_modem_disable_3g (GClueModem *modem,
GCancellable *cancellable,
GError **error);
gboolean gclue_modem_disable_cdma (GClueModem *modem,
GCancellable *cancellable,
GError **error);
gboolean gclue_modem_disable_gps (GClueModem *modem,
GCancellable *cancellable,
GError **error);
G_END_DECLS G_END_DECLS
......
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