## Using basic Geoclue providers: simple example in C

There are several examples in the geoclue source, these are included here to give a quick overview.

Here is a very simple example of using a specific Geoclue Position provider. Note that we're using the synchronous version of the method call here, so geoclue_position_get_position() will block until the response comes (or until D-Bus timeouts).

    #include <geoclue/geoclue-position.h>

    int main()
    {
    	GeocluePosition *pos;
    	GeocluePositionFields fields;
    	double lat, lon;
    	GError *error = NULL;

    	g_type_init ();

    	/ * Create the position object * /
    	pos = geoclue_position_new ("org.freedesktop.Geoclue.Providers.Hostip",
    	                            "/org/freedesktop/Geoclue/Providers/Hostip");

    	/ * call get_position. Note that unneeded output variables (here
    	    timestamp, altitude and accuracy) can be left NULL * /
    	fields = geoclue_position_get_position (pos, NULL,
    	                                        &lat, &lon, NULL,
    	                                        NULL, &error);
    	if (error) {
    		g_printerr ("Error in get_position: %s.\n", error->message);
    		g_error_free (error);
    		g_object_unref (pos);
    		return 1;
    	}

    	if (fields & GEOCLUE_POSITION_FIELDS_LATITUDE &&
    	    fields & GEOCLUE_POSITION_FIELDS_LONGITUDE) {
    		g_print ("According to Hostip.info we're at %.3f, %.3f.\n",
    		          lat, lon);
    	} else {
    		g_print ("Hostip does not have a valid location available.\nVisit http://www.hostip.info/ to correct this");
    	}
    	g_object_unref (pos);

    	return 0;
    }

Save as test-hostip.c and compile with

    gcc `pkg-config --libs --cflags geoclue`  -o test-hostip test-hostip.c

Here is a similarly simple example using GLib mainloop and Gypsy provider with position-changed signals:

    #include <geoclue/geoclue-position.h>

    / * device name or bluetooth address * /
    #define GPS_DEVICE_NAME "00:02:76:C5:81:BF"

    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;
    	GHashTable *options;
    	GeocluePosition *pos;
    	GError *error = NULL;

    	g_type_init ();

    	/ * Create the position object * /
    	pos = geoclue_position_new ("org.freedesktop.Geoclue.Providers.Gypsy",
    	                            "/org/freedesktop/Geoclue/Providers/Gypsy");

    	/ * Set GPS device name option for Gypsy * /
    	options = g_hash_table_new (g_str_hash, g_str_equal);
    	g_hash_table_insert (options, "org.freedesktop.Geoclue.GPSDevice", GPS_DEVICE_NAME);
    	if (!geoclue_provider_set_options (GEOCLUE_PROVIDER (pos), options, &error)) {
    		g_printerr ("Error setting options: %s\n", error->message);
    		g_error_free (error);
    		g_hash_table_destroy (options);
    		g_object_unref (pos);
                    return 1;
    	}
    	g_hash_table_destroy (options);

    	/ * connect to signal * /
    	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);

    	return 0;
    }