Blame src/gclue-service-location.c

Packit Service b2c451
/* vim: set et ts=8 sw=8: */
Packit Service b2c451
/* gclue-service-location.c
Packit Service b2c451
 *
Packit Service b2c451
 * Copyright 2013 Red Hat, Inc.
Packit Service b2c451
 *
Packit Service b2c451
 * Geoclue is free software; you can redistribute it and/or modify it under
Packit Service b2c451
 * the terms of the GNU General Public License as published by the Free
Packit Service b2c451
 * Software Foundation; either version 2 of the License, or (at your option)
Packit Service b2c451
 * any later version.
Packit Service b2c451
 *
Packit Service b2c451
 * Geoclue is distributed in the hope that it will be useful, but WITHOUT ANY
Packit Service b2c451
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
Packit Service b2c451
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
Packit Service b2c451
 * details.
Packit Service b2c451
 *
Packit Service b2c451
 * You should have received a copy of the GNU General Public License along
Packit Service b2c451
 * with Geoclue; if not, write to the Free Software Foundation, Inc.,
Packit Service b2c451
 * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
Packit Service b2c451
 *
Packit Service b2c451
 * Author: Zeeshan Ali (Khattak) <zeeshanak@gnome.org>
Packit Service b2c451
 */
Packit Service b2c451
Packit Service b2c451
#include <glib/gi18n.h>
Packit Service b2c451
Packit Service b2c451
#include "gclue-service-location.h"
Packit Service b2c451
Packit Service b2c451
static void
Packit Service b2c451
gclue_service_location_initable_iface_init (GInitableIface *iface);
Packit Service b2c451
Packit Service b2c451
struct _GClueServiceLocationPrivate
Packit Service b2c451
{
Packit Service b2c451
        GClueClientInfo *client_info;
Packit Service b2c451
        char *path;
Packit Service b2c451
        GDBusConnection *connection;
Packit Service b2c451
};
Packit Service b2c451
Packit Service b2c451
G_DEFINE_TYPE_WITH_CODE (GClueServiceLocation,
Packit Service b2c451
                         gclue_service_location,
Packit Service b2c451
                         GCLUE_DBUS_TYPE_LOCATION_SKELETON,
Packit Service b2c451
                         G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
Packit Service b2c451
                                                gclue_service_location_initable_iface_init)
Packit Service b2c451
                         G_ADD_PRIVATE (GClueServiceLocation));
Packit Service b2c451
Packit Service b2c451
enum
Packit Service b2c451
{
Packit Service b2c451
        PROP_0,
Packit Service b2c451
        PROP_CLIENT_INFO,
Packit Service b2c451
        PROP_PATH,
Packit Service b2c451
        PROP_CONNECTION,
Packit Service b2c451
        PROP_LOCATION,
Packit Service b2c451
        LAST_PROP
Packit Service b2c451
};
Packit Service b2c451
Packit Service b2c451
static GParamSpec *gParamSpecs[LAST_PROP];
Packit Service b2c451
Packit Service b2c451
static void
Packit Service b2c451
gclue_service_location_finalize (GObject *object)
Packit Service b2c451
{
Packit Service b2c451
        GClueServiceLocationPrivate *priv = GCLUE_SERVICE_LOCATION (object)->priv;
Packit Service b2c451
Packit Service b2c451
        g_clear_pointer (&priv->path, g_free);
Packit Service b2c451
        g_clear_object (&priv->connection);
Packit Service b2c451
        g_clear_object (&priv->client_info);
Packit Service b2c451
Packit Service b2c451
        /* Chain up to the parent class */
Packit Service b2c451
        G_OBJECT_CLASS (gclue_service_location_parent_class)->finalize (object);
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
static void
Packit Service b2c451
gclue_service_location_get_property (GObject    *object,
Packit Service b2c451
                                     guint       prop_id,
Packit Service b2c451
                                     GValue     *value,
Packit Service b2c451
                                     GParamSpec *pspec)
Packit Service b2c451
{
Packit Service b2c451
        GClueServiceLocation *self = GCLUE_SERVICE_LOCATION (object);
Packit Service b2c451
Packit Service b2c451
        switch (prop_id) {
Packit Service b2c451
        case PROP_CLIENT_INFO:
Packit Service b2c451
                g_value_set_object (value, self->priv->client_info);
Packit Service b2c451
                break;
Packit Service b2c451
Packit Service b2c451
        case PROP_PATH:
Packit Service b2c451
                g_value_set_string (value, self->priv->path);
Packit Service b2c451
                break;
Packit Service b2c451
Packit Service b2c451
        case PROP_CONNECTION:
Packit Service b2c451
                g_value_set_object (value, self->priv->connection);
Packit Service b2c451
                break;
Packit Service b2c451
Packit Service b2c451
        case PROP_LOCATION:
Packit Service b2c451
        {
Packit Service b2c451
                GClueDBusLocation *location;
Packit Service b2c451
                GClueLocation *loc;
Packit Service b2c451
                GVariant *timestamp;
Packit Service b2c451
                guint64 sec, usec;
Packit Service b2c451
Packit Service b2c451
                location = GCLUE_DBUS_LOCATION (object);
Packit Service b2c451
Packit Service b2c451
                timestamp = gclue_dbus_location_get_timestamp (location);
Packit Service b2c451
                g_variant_get (timestamp, "(tt)", &sec, &usec);
Packit Service b2c451
Packit Service b2c451
                loc = gclue_location_new_full
Packit Service b2c451
                        (gclue_dbus_location_get_latitude (location),
Packit Service b2c451
                         gclue_dbus_location_get_longitude (location),
Packit Service b2c451
                         gclue_dbus_location_get_accuracy (location),
Packit Service b2c451
                         gclue_dbus_location_get_speed (location),
Packit Service b2c451
                         gclue_dbus_location_get_heading (location),
Packit Service b2c451
                         gclue_dbus_location_get_altitude (location),
Packit Service b2c451
                         sec,
Packit Service b2c451
                         gclue_dbus_location_get_description (location));
Packit Service b2c451
Packit Service b2c451
                g_value_take_object (value, loc);
Packit Service b2c451
                break;
Packit Service b2c451
        }
Packit Service b2c451
Packit Service b2c451
        default:
Packit Service b2c451
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit Service b2c451
        }
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
static void
Packit Service b2c451
gclue_service_location_set_property (GObject      *object,
Packit Service b2c451
                                     guint         prop_id,
Packit Service b2c451
                                     const GValue *value,
Packit Service b2c451
                                     GParamSpec   *pspec)
Packit Service b2c451
{
Packit Service b2c451
        GClueServiceLocation *self = GCLUE_SERVICE_LOCATION (object);
Packit Service b2c451
Packit Service b2c451
        switch (prop_id) {
Packit Service b2c451
        case PROP_CLIENT_INFO:
Packit Service b2c451
                self->priv->client_info = g_value_dup_object (value);
Packit Service b2c451
                break;
Packit Service b2c451
Packit Service b2c451
        case PROP_PATH:
Packit Service b2c451
                self->priv->path = g_value_dup_string (value);
Packit Service b2c451
                break;
Packit Service b2c451
Packit Service b2c451
        case PROP_CONNECTION:
Packit Service b2c451
                self->priv->connection = g_value_dup_object (value);
Packit Service b2c451
                break;
Packit Service b2c451
Packit Service b2c451
        case PROP_LOCATION:
Packit Service b2c451
        {
Packit Service b2c451
                GClueDBusLocation *location;
Packit Service b2c451
                GClueLocation *loc;
Packit Service b2c451
                gdouble altitude;
Packit Service b2c451
                GVariant *timestamp;
Packit Service b2c451
Packit Service b2c451
                location = GCLUE_DBUS_LOCATION (object);
Packit Service b2c451
                loc = g_value_get_object (value);
Packit Service b2c451
                gclue_dbus_location_set_latitude
Packit Service b2c451
                        (location, gclue_location_get_latitude (loc));
Packit Service b2c451
                gclue_dbus_location_set_longitude
Packit Service b2c451
                        (location, gclue_location_get_longitude (loc));
Packit Service b2c451
                gclue_dbus_location_set_accuracy
Packit Service b2c451
                        (location, gclue_location_get_accuracy (loc));
Packit Service b2c451
                gclue_dbus_location_set_description
Packit Service b2c451
                        (location, gclue_location_get_description (loc));
Packit Service b2c451
                gclue_dbus_location_set_speed
Packit Service b2c451
                        (location, gclue_location_get_speed (loc));
Packit Service b2c451
                gclue_dbus_location_set_heading
Packit Service b2c451
                        (location, gclue_location_get_heading (loc));
Packit Service b2c451
                timestamp = g_variant_new
Packit Service b2c451
                        ("(tt)",
Packit Service b2c451
                         (guint64) gclue_location_get_timestamp (loc),
Packit Service b2c451
                         (guint64) 0);
Packit Service b2c451
                gclue_dbus_location_set_timestamp
Packit Service b2c451
                        (location, timestamp);
Packit Service b2c451
                altitude = gclue_location_get_altitude (loc);
Packit Service b2c451
                if (altitude != GCLUE_LOCATION_ALTITUDE_UNKNOWN)
Packit Service b2c451
                        gclue_dbus_location_set_altitude (location, altitude);
Packit Service b2c451
                break;
Packit Service b2c451
        }
Packit Service b2c451
Packit Service b2c451
        default:
Packit Service b2c451
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit Service b2c451
        }
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
static void
Packit Service b2c451
gclue_service_location_handle_method_call (GDBusConnection       *connection,
Packit Service b2c451
                                           const gchar           *sender,
Packit Service b2c451
                                           const gchar           *object_path,
Packit Service b2c451
                                           const gchar           *interface_name,
Packit Service b2c451
                                           const gchar           *method_name,
Packit Service b2c451
                                           GVariant              *parameters,
Packit Service b2c451
                                           GDBusMethodInvocation *invocation,
Packit Service b2c451
                                           gpointer               user_data)
Packit Service b2c451
{
Packit Service b2c451
        GClueServiceLocationPrivate *priv = GCLUE_SERVICE_LOCATION (user_data)->priv;
Packit Service b2c451
        GDBusInterfaceSkeletonClass *skeleton_class;
Packit Service b2c451
        GDBusInterfaceVTable *skeleton_vtable;
Packit Service b2c451
Packit Service b2c451
        if (!gclue_client_info_check_bus_name (priv->client_info, sender)) {
Packit Service b2c451
                g_dbus_method_invocation_return_error_literal (invocation,
Packit Service b2c451
                                                               G_DBUS_ERROR,
Packit Service b2c451
                                                               G_DBUS_ERROR_ACCESS_DENIED,
Packit Service b2c451
                                                               "Access denied");
Packit Service b2c451
                return;
Packit Service b2c451
        }
Packit Service b2c451
Packit Service b2c451
        skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (gclue_service_location_parent_class);
Packit Service b2c451
        skeleton_vtable = skeleton_class->get_vtable (G_DBUS_INTERFACE_SKELETON (user_data));
Packit Service b2c451
        skeleton_vtable->method_call (connection,
Packit Service b2c451
                                      sender,
Packit Service b2c451
                                      object_path,
Packit Service b2c451
                                      interface_name,
Packit Service b2c451
                                      method_name,
Packit Service b2c451
                                      parameters,
Packit Service b2c451
                                      invocation,
Packit Service b2c451
                                      user_data);
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
static GVariant *
Packit Service b2c451
gclue_service_location_handle_get_property (GDBusConnection *connection,
Packit Service b2c451
                                            const gchar     *sender,
Packit Service b2c451
                                            const gchar     *object_path,
Packit Service b2c451
                                            const gchar     *interface_name,
Packit Service b2c451
                                            const gchar     *property_name,
Packit Service b2c451
                                            GError         **error,
Packit Service b2c451
                                            gpointer        user_data)
Packit Service b2c451
{
Packit Service b2c451
        GClueServiceLocationPrivate *priv = GCLUE_SERVICE_LOCATION (user_data)->priv;
Packit Service b2c451
        GDBusInterfaceSkeletonClass *skeleton_class;
Packit Service b2c451
        GDBusInterfaceVTable *skeleton_vtable;
Packit Service b2c451
Packit Service b2c451
        if (!gclue_client_info_check_bus_name (priv->client_info, sender)) {
Packit Service b2c451
                g_set_error (error,
Packit Service b2c451
                             G_DBUS_ERROR,
Packit Service b2c451
                             G_DBUS_ERROR_ACCESS_DENIED,
Packit Service b2c451
                             "Access denied");
Packit Service b2c451
                return NULL;
Packit Service b2c451
        }
Packit Service b2c451
Packit Service b2c451
        skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (gclue_service_location_parent_class);
Packit Service b2c451
        skeleton_vtable = skeleton_class->get_vtable (G_DBUS_INTERFACE_SKELETON (user_data));
Packit Service b2c451
        return skeleton_vtable->get_property (connection,
Packit Service b2c451
                                              sender,
Packit Service b2c451
                                              object_path,
Packit Service b2c451
                                              interface_name,
Packit Service b2c451
                                              property_name,
Packit Service b2c451
                                              error,
Packit Service b2c451
                                              user_data);
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
static gboolean
Packit Service b2c451
gclue_service_location_handle_set_property (GDBusConnection *connection,
Packit Service b2c451
                                            const gchar     *sender,
Packit Service b2c451
                                            const gchar     *object_path,
Packit Service b2c451
                                            const gchar     *interface_name,
Packit Service b2c451
                                            const gchar     *property_name,
Packit Service b2c451
                                            GVariant        *variant,
Packit Service b2c451
                                            GError         **error,
Packit Service b2c451
                                            gpointer        user_data)
Packit Service b2c451
{
Packit Service b2c451
        GClueServiceLocationPrivate *priv = GCLUE_SERVICE_LOCATION (user_data)->priv;
Packit Service b2c451
        GDBusInterfaceSkeletonClass *skeleton_class;
Packit Service b2c451
        GDBusInterfaceVTable *skeleton_vtable;
Packit Service b2c451
Packit Service b2c451
        if (!gclue_client_info_check_bus_name (priv->client_info, sender)) {
Packit Service b2c451
                g_set_error (error,
Packit Service b2c451
                             G_DBUS_ERROR,
Packit Service b2c451
                             G_DBUS_ERROR_ACCESS_DENIED,
Packit Service b2c451
                             "Access denied");
Packit Service b2c451
                return FALSE;
Packit Service b2c451
        }
Packit Service b2c451
Packit Service b2c451
        skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (gclue_service_location_parent_class);
Packit Service b2c451
        skeleton_vtable = skeleton_class->get_vtable (G_DBUS_INTERFACE_SKELETON (user_data));
Packit Service b2c451
        return skeleton_vtable->set_property (connection,
Packit Service b2c451
                                              sender,
Packit Service b2c451
                                              object_path,
Packit Service b2c451
                                              interface_name,
Packit Service b2c451
                                              property_name,
Packit Service b2c451
                                              variant,
Packit Service b2c451
                                              error,
Packit Service b2c451
                                              user_data);
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
static const GDBusInterfaceVTable gclue_service_location_vtable =
Packit Service b2c451
{
Packit Service b2c451
        gclue_service_location_handle_method_call,
Packit Service b2c451
        gclue_service_location_handle_get_property,
Packit Service b2c451
        gclue_service_location_handle_set_property,
Packit Service b2c451
        {NULL}
Packit Service b2c451
};
Packit Service b2c451
Packit Service b2c451
static GDBusInterfaceVTable *
Packit Service b2c451
gclue_service_location_get_vtable (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
Packit Service b2c451
{
Packit Service b2c451
        return (GDBusInterfaceVTable *) &gclue_service_location_vtable;
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
static void
Packit Service b2c451
gclue_service_location_class_init (GClueServiceLocationClass *klass)
Packit Service b2c451
{
Packit Service b2c451
        GObjectClass *object_class;
Packit Service b2c451
        GDBusInterfaceSkeletonClass *skeleton_class;
Packit Service b2c451
Packit Service b2c451
        object_class = G_OBJECT_CLASS (klass);
Packit Service b2c451
        object_class->finalize = gclue_service_location_finalize;
Packit Service b2c451
        object_class->get_property = gclue_service_location_get_property;
Packit Service b2c451
        object_class->set_property = gclue_service_location_set_property;
Packit Service b2c451
Packit Service b2c451
        skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass);
Packit Service b2c451
        skeleton_class->get_vtable = gclue_service_location_get_vtable;
Packit Service b2c451
Packit Service b2c451
        gParamSpecs[PROP_CLIENT_INFO] = g_param_spec_object ("client-info",
Packit Service b2c451
                                                             "ClientInfo",
Packit Service b2c451
                                                             "Information on client",
Packit Service b2c451
                                                             GCLUE_TYPE_CLIENT_INFO,
Packit Service b2c451
                                                             G_PARAM_READWRITE |
Packit Service b2c451
                                                             G_PARAM_CONSTRUCT_ONLY);
Packit Service b2c451
        g_object_class_install_property (object_class,
Packit Service b2c451
                                         PROP_CLIENT_INFO,
Packit Service b2c451
                                         gParamSpecs[PROP_CLIENT_INFO]);
Packit Service b2c451
Packit Service b2c451
        gParamSpecs[PROP_PATH] = g_param_spec_string ("path",
Packit Service b2c451
                                                      "Path",
Packit Service b2c451
                                                      "Path",
Packit Service b2c451
                                                      NULL,
Packit Service b2c451
                                                      G_PARAM_READWRITE |
Packit Service b2c451
                                                      G_PARAM_CONSTRUCT_ONLY);
Packit Service b2c451
        g_object_class_install_property (object_class,
Packit Service b2c451
                                         PROP_PATH,
Packit Service b2c451
                                         gParamSpecs[PROP_PATH]);
Packit Service b2c451
Packit Service b2c451
        gParamSpecs[PROP_CONNECTION] = g_param_spec_object ("connection",
Packit Service b2c451
                                                            "Connection",
Packit Service b2c451
                                                            "DBus Connection",
Packit Service b2c451
                                                            G_TYPE_DBUS_CONNECTION,
Packit Service b2c451
                                                            G_PARAM_READWRITE |
Packit Service b2c451
                                                            G_PARAM_CONSTRUCT_ONLY);
Packit Service b2c451
        g_object_class_install_property (object_class,
Packit Service b2c451
                                         PROP_CONNECTION,
Packit Service b2c451
                                         gParamSpecs[PROP_CONNECTION]);
Packit Service b2c451
Packit Service b2c451
        gParamSpecs[PROP_LOCATION] = g_param_spec_object ("location",
Packit Service b2c451
                                                          "Location",
Packit Service b2c451
                                                          "Location",
Packit Service b2c451
                                                          GCLUE_TYPE_LOCATION,
Packit Service b2c451
                                                          G_PARAM_READWRITE);
Packit Service b2c451
        g_object_class_install_property (object_class,
Packit Service b2c451
                                         PROP_LOCATION,
Packit Service b2c451
                                         gParamSpecs[PROP_LOCATION]);
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
static void
Packit Service b2c451
gclue_service_location_init (GClueServiceLocation *location)
Packit Service b2c451
{
Packit Service b2c451
        location->priv = G_TYPE_INSTANCE_GET_PRIVATE (location,
Packit Service b2c451
                                                      GCLUE_TYPE_SERVICE_LOCATION,
Packit Service b2c451
                                                      GClueServiceLocationPrivate);
Packit Service b2c451
        gclue_dbus_location_set_altitude (GCLUE_DBUS_LOCATION (location),
Packit Service b2c451
                                          GCLUE_LOCATION_ALTITUDE_UNKNOWN);
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
static gboolean
Packit Service b2c451
gclue_service_location_initable_init (GInitable    *initable,
Packit Service b2c451
                                      GCancellable *cancellable,
Packit Service b2c451
                                      GError      **error)
Packit Service b2c451
{
Packit Service b2c451
        return g_dbus_interface_skeleton_export
Packit Service b2c451
                (G_DBUS_INTERFACE_SKELETON (initable),
Packit Service b2c451
                 GCLUE_SERVICE_LOCATION (initable)->priv->connection,
Packit Service b2c451
                 GCLUE_SERVICE_LOCATION (initable)->priv->path,
Packit Service b2c451
                 error);
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
static void
Packit Service b2c451
gclue_service_location_initable_iface_init (GInitableIface *iface)
Packit Service b2c451
{
Packit Service b2c451
        iface->init = gclue_service_location_initable_init;
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
GClueServiceLocation *
Packit Service b2c451
gclue_service_location_new (GClueClientInfo *info,
Packit Service b2c451
                            const char      *path,
Packit Service b2c451
                            GDBusConnection *connection,
Packit Service b2c451
                            GClueLocation   *location,
Packit Service b2c451
                            GError         **error)
Packit Service b2c451
{
Packit Service b2c451
        return g_initable_new (GCLUE_TYPE_SERVICE_LOCATION,
Packit Service b2c451
                               NULL,
Packit Service b2c451
                               error,
Packit Service b2c451
                               "client-info", info,
Packit Service b2c451
                               "path", path,
Packit Service b2c451
                               "connection", connection,
Packit Service b2c451
                               "location", location,
Packit Service b2c451
                               NULL);
Packit Service b2c451
}
Packit Service b2c451
Packit Service b2c451
const gchar *
Packit Service b2c451
gclue_service_location_get_path (GClueServiceLocation *location)
Packit Service b2c451
{
Packit Service b2c451
        g_return_val_if_fail (GCLUE_IS_SERVICE_LOCATION(location), NULL);
Packit Service b2c451
Packit Service b2c451
        return location->priv->path;
Packit Service b2c451
}