Geoclue Reference Manual |
---|
Here is the "Hello World" for Geoclue Master. It shows one of the advantages of using the Master provider: Even most web service providers can be used as signal emitting providers (master queries them whenever network connection changes).
#include <geoclue/geoclue-master.h> static void position_changed (GeocluePosition *position, GeocluePositionFields fields, int timestamp, double latitude, double longitude, double altitude, GeoclueAccuracy *accuracy, gpointer userdata) { g_print ("Position changed:\n"); if (fields & GEOCLUE_POSITION_FIELDS_LATITUDE && fields & GEOCLUE_POSITION_FIELDS_LONGITUDE) { g_print ("\t%f, %f\n\n", latitude, longitude); } else { g_print ("\tLatitude and longitude not available.\n\n"); } } int main() { GMainLoop *loop; GeoclueMaster *master; GeoclueMasterClient *client; GeocluePosition *pos; GeocluePositionFields fields; double lat, lon; GError *error = NULL; g_type_init (); / * create a MasterClient using Master * / master = geoclue_master_get_default (); client = geoclue_master_create_client (master, NULL, &error); g_object_unref (master); if (!client) { g_printerr ("Error creating GeoclueMasterClient: %s\n", error->message); g_error_free (error); return 1; } / * Set our requirements: We want at least city level accuracy, require signals, and allow the use of network (but not e.g. GPS) * / if (!geoclue_master_client_set_requirements (client, GEOCLUE_ACCURACY_LEVEL_LOCALITY, 0, TRUE, GEOCLUE_RESOURCE_NETWORK, &error)){ g_printerr ("set_requirements failed: %s", error->message); g_error_free (error); g_object_unref (client); return 1; } / * Get a Position object * / pos = geoclue_master_client_create_position (client, NULL); if (!pos) { g_printerr ("Failed to get a position object"); g_object_unref (client); return 1; } / * call get_position. We do not know which provider actually provides the answer (although we could find out using MasterClient API) * / fields = geoclue_position_get_position (pos, NULL, &lat, &lon, NULL, NULL, &error); if (error) { g_printerr ("Error in geoclue_position_get_position: %s.\n", error->message); g_error_free (error); error = NULL; } else { if (fields & GEOCLUE_POSITION_FIELDS_LATITUDE && fields & GEOCLUE_POSITION_FIELDS_LONGITUDE) { g_print ("We're at %.3f, %.3f.\n", lat, lon); } } g_signal_connect (G_OBJECT (pos), "position-changed", G_CALLBACK (position_changed), NULL); g_print ("Waiting for position change signals...\n"); loop = g_main_loop_new (NULL, FALSE); g_main_loop_run (loop); g_main_loop_unref (loop); g_object_unref (pos); g_object_unref (client); return 0; }