diff options
Diffstat (limited to '.pc/tizen.patch/providers/manual')
-rwxr-xr-x | .pc/tizen.patch/providers/manual/Makefile.am | 54 | ||||
-rwxr-xr-x | .pc/tizen.patch/providers/manual/geoclue-manual.c | 365 |
2 files changed, 419 insertions, 0 deletions
diff --git a/.pc/tizen.patch/providers/manual/Makefile.am b/.pc/tizen.patch/providers/manual/Makefile.am new file mode 100755 index 0000000..231e042 --- /dev/null +++ b/.pc/tizen.patch/providers/manual/Makefile.am @@ -0,0 +1,54 @@ +libexec_PROGRAMS = geoclue-manual + +noinst_DATA = \ + geoclue-manual.xml + +nodist_geoclue_manual_SOURCES = \ + geoclue-manual-glue.h + +BUILT_SOURCES = \ + $(nodist_geoclue_manual_SOURCES) + +geoclue_manual_SOURCES = \ + geoclue-manual.c + +geoclue_manual_CFLAGS = \ + -I$(top_srcdir) \ + -I$(top_builddir) \ + $(GEOCLUE_CFLAGS) + +geoclue_manual_LDADD = \ + $(GEOCLUE_LIBS) \ + $(top_builddir)/geoclue/libgeoclue.la + + +providersdir = $(datadir)/geoclue-providers +providers_DATA = geoclue-manual.provider + +servicedir = $(DBUS_SERVICES_DIR) +service_in_files = org.freedesktop.Geoclue.Providers.Manual.service.in +service_DATA = $(service_in_files:.service.in=.service) + +$(service_DATA): $(service_in_files) Makefile + $(AM_V_GEN) sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@ + +CLEANFILES = \ + stamp-geoclue-manual-glue.h + +EXTRA_DIST = \ + $(service_in_files) \ + $(providers_DATA) \ + $(noinst_DATA) + +DISTCLEANFILES = \ + $(service_DATA) \ + $(nodist_geoclue_manual_SOURCES) + +%-glue.h: stamp-%-glue.h + @true + +stamp-geoclue-manual-glue.h: geoclue-manual.xml + $(AM_V_GEN) $(DBUS_BINDING_TOOL) --prefix=geoclue_manual --mode=glib-server $< > xgen-$(@F) \ + && (cmp -s xgen-$(@F) $(@F:stamp-%=%) || cp xgen-$(@F) $(@F:stamp-%=%)) \ + && rm -f xgen-$(@F) \ + && echo timestamp > $(@F) diff --git a/.pc/tizen.patch/providers/manual/geoclue-manual.c b/.pc/tizen.patch/providers/manual/geoclue-manual.c new file mode 100755 index 0000000..2b6620a --- /dev/null +++ b/.pc/tizen.patch/providers/manual/geoclue-manual.c @@ -0,0 +1,365 @@ +/* + * Geoclue + * geoclue-manual.c - Manual address provider + * + * Author: Jussi Kukkonen <jku@o-hand.com> + * Copyright 2008 by Garmin Ltd. or its subsidiaries + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +/** Geoclue manual provider + * + * This is an address provider which gets its address data from user + * input. No UI is included, any application may query the address from + * the user and submit it to manual provider through the D-Bus API: + * org.freedesktop.Geoclue.Manual.SetAddress + * org.freedesktop.Geoclue.Manual.SetAddressFields + * + * SetAddress allows setting the current address as a GeoclueAddress, + * while SetAddressFields is a convenience version with separate + * address fields. Shell example using SetAddressFields: + * + * dbus-send --print-reply --type=method_call \ + * --dest=org.freedesktop.Geoclue.Providers.Manual \ + * /org/freedesktop/Geoclue/Providers/Manual \ + * org.freedesktop.Geoclue.Manual.SetAddressFields \ + * int32:7200 \ + * string: \ + * string:"Finland" \ + * string: \ + * string:"Helsinki" \ + * string: \ + * string: \ + * string:"Solnantie 24" + * + * This would make the provider emit a AddressChanged signal with + * accuracy level GEOCLUE_ACCURACY_STREET. Unless new SetAddress* calls + * are made, provider will emit another signal in two hours (7200 sec), + * with empty address and GEOCLUE_ACCURACY_NONE. + **/ + +#include <config.h> +#include <string.h> +#include <dbus/dbus-glib-bindings.h> +#include <dbus/dbus.h> + +#include <geoclue/gc-provider.h> +#include <geoclue/gc-iface-address.h> + +typedef struct { + GcProvider parent; + + GMainLoop *loop; + + guint event_id; + + int timestamp; + GHashTable *address; + GeoclueAccuracy *accuracy; +} GeoclueManual; + +typedef struct { + GcProviderClass parent_class; +} GeoclueManualClass; + +#define GEOCLUE_TYPE_MANUAL (geoclue_manual_get_type ()) +#define GEOCLUE_MANUAL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEOCLUE_TYPE_MANUAL, GeoclueManual)) + +static void geoclue_manual_address_init (GcIfaceAddressClass *iface); + +G_DEFINE_TYPE_WITH_CODE (GeoclueManual, geoclue_manual, GC_TYPE_PROVIDER, + G_IMPLEMENT_INTERFACE (GC_TYPE_IFACE_ADDRESS, + geoclue_manual_address_init)) + +static gboolean +geoclue_manual_set_address (GeoclueManual *manual, + int valid_until, + GHashTable *address, + GError **error); + +static gboolean +geoclue_manual_set_address_fields (GeoclueManual *manual, + int valid_until, + char *country_code, + char *country, + char *region, + char *locality, + char *area, + char *postalcode, + char *street, + GError **error); + +#include "geoclue-manual-glue.h" + + +static GeoclueAccuracyLevel +get_accuracy_for_address (GHashTable *address) +{ + if (g_hash_table_lookup (address, GEOCLUE_ADDRESS_KEY_STREET)) { + return GEOCLUE_ACCURACY_LEVEL_STREET; + } else if (g_hash_table_lookup (address, GEOCLUE_ADDRESS_KEY_POSTALCODE)) { + return GEOCLUE_ACCURACY_LEVEL_POSTALCODE; + } else if (g_hash_table_lookup (address, GEOCLUE_ADDRESS_KEY_LOCALITY)) { + return GEOCLUE_ACCURACY_LEVEL_LOCALITY; + } else if (g_hash_table_lookup (address, GEOCLUE_ADDRESS_KEY_REGION)) { + return GEOCLUE_ACCURACY_LEVEL_REGION; + } else if (g_hash_table_lookup (address, GEOCLUE_ADDRESS_KEY_COUNTRY) || + g_hash_table_lookup (address, GEOCLUE_ADDRESS_KEY_COUNTRYCODE)) { + return GEOCLUE_ACCURACY_LEVEL_COUNTRY; + } + return GEOCLUE_ACCURACY_LEVEL_NONE; +} + +static gboolean +get_status (GcIfaceGeoclue *gc, + GeoclueStatus *status, + GError **error) +{ + GeoclueAccuracyLevel level; + + geoclue_accuracy_get_details (GEOCLUE_MANUAL (gc)->accuracy, + &level, NULL, NULL); + if (level == GEOCLUE_ACCURACY_LEVEL_NONE) { + *status = GEOCLUE_STATUS_UNAVAILABLE; + } else { + *status = GEOCLUE_STATUS_AVAILABLE; + } + return TRUE; +} + +static void +shutdown (GcProvider *provider) +{ + GeoclueManual *manual; + + manual = GEOCLUE_MANUAL (provider); + g_main_loop_quit (manual->loop); +} + +gboolean +validity_ended (GeoclueManual *manual) +{ + manual->event_id = 0; + g_hash_table_remove_all (manual->address); + geoclue_accuracy_set_details (manual->accuracy, + GEOCLUE_ACCURACY_LEVEL_NONE, 0, 0); + + gc_iface_address_emit_address_changed (GC_IFACE_ADDRESS (manual), + manual->timestamp, + manual->address, + manual->accuracy); + return FALSE; +} + + +static void +geoclue_manual_set_address_common (GeoclueManual *manual, + int valid_for, + GHashTable *address) +{ + if (manual->event_id > 0) { + g_source_remove (manual->event_id); + } + + manual->timestamp = time (NULL); + + g_hash_table_destroy (manual->address); + manual->address = address; + + geoclue_accuracy_set_details (manual->accuracy, + get_accuracy_for_address (address), + 0, 0); + + gc_iface_address_emit_address_changed (GC_IFACE_ADDRESS (manual), + manual->timestamp, + manual->address, + manual->accuracy); + + if (valid_for > 0) { + manual->event_id = g_timeout_add (valid_for * 1000, + (GSourceFunc)validity_ended, + manual); + } +} + +static gboolean +geoclue_manual_set_address (GeoclueManual *manual, + int valid_for, + GHashTable *address, + GError **error) +{ + geoclue_manual_set_address_common (manual, + valid_for, + geoclue_address_details_copy (address)); + return TRUE; +} + +static gboolean +geoclue_manual_set_address_fields (GeoclueManual *manual, + int valid_for, + char *country_code, + char *country, + char *region, + char *locality, + char *area, + char *postalcode, + char *street, + GError **error) +{ + GHashTable *address; + + address = geoclue_address_details_new (); + if (country_code && (strlen (country_code) > 0)) { + g_hash_table_insert (address, + g_strdup (GEOCLUE_ADDRESS_KEY_COUNTRYCODE), + g_strdup (country_code)); + } + if (country && (strlen (country) > 0)) { + g_hash_table_insert (address, + g_strdup (GEOCLUE_ADDRESS_KEY_COUNTRY), + g_strdup (country)); + } + if (region && (strlen (region) > 0)) { + g_hash_table_insert (address, + g_strdup (GEOCLUE_ADDRESS_KEY_REGION), + g_strdup (region)); + } + if (locality && (strlen (locality) > 0)) { + g_hash_table_insert (address, + g_strdup (GEOCLUE_ADDRESS_KEY_LOCALITY), + g_strdup (locality)); + } + if (area && (strlen (area) > 0)) { + g_hash_table_insert (address, + g_strdup (GEOCLUE_ADDRESS_KEY_AREA), + g_strdup (area)); + } + if (postalcode && (strlen (postalcode) > 0)) { + g_hash_table_insert (address, + g_strdup (GEOCLUE_ADDRESS_KEY_POSTALCODE), + g_strdup (postalcode)); + } + if (street && (strlen (street) > 0)) { + g_hash_table_insert (address, + g_strdup (GEOCLUE_ADDRESS_KEY_STREET), + g_strdup (street)); + } + + geoclue_manual_set_address_common (manual, + valid_for, + address); + return TRUE; +} + + +static void +finalize (GObject *object) +{ + GeoclueManual *manual; + + manual = GEOCLUE_MANUAL (object); + + g_hash_table_destroy (manual->address); + geoclue_accuracy_free (manual->accuracy); + + ((GObjectClass *) geoclue_manual_parent_class)->finalize (object); +} + +static void +geoclue_manual_class_init (GeoclueManualClass *klass) +{ + GObjectClass *o_class = (GObjectClass *) klass; + GcProviderClass *p_class = (GcProviderClass *) klass; + + o_class->finalize = finalize; + + p_class->get_status = get_status; + p_class->shutdown = shutdown; + + dbus_g_object_type_install_info (geoclue_manual_get_type (), + &dbus_glib_geoclue_manual_object_info); +} + +static void +geoclue_manual_init (GeoclueManual *manual) +{ + gc_provider_set_details (GC_PROVIDER (manual), + "org.freedesktop.Geoclue.Providers.Manual", + "/org/freedesktop/Geoclue/Providers/Manual", + "Manual", "Manual provider"); + + manual->address = geoclue_address_details_new (); + manual->accuracy = + geoclue_accuracy_new (GEOCLUE_ACCURACY_LEVEL_NONE, 0, 0); +} + +static gboolean +get_address (GcIfaceAddress *gc, + int *timestamp, + GHashTable **address, + GeoclueAccuracy **accuracy, + GError **error) +{ + GeoclueManual *manual = GEOCLUE_MANUAL (gc); + GeoclueAccuracyLevel level; + + geoclue_accuracy_get_details (manual->accuracy, &level, NULL, NULL); + if (level == GEOCLUE_ACCURACY_LEVEL_NONE) { + g_set_error (error, GEOCLUE_ERROR, + GEOCLUE_ERROR_NOT_AVAILABLE, + "No manual address set"); + return FALSE; + } + + if (timestamp) { + *timestamp = manual->timestamp; + } + if (address) { + *address = geoclue_address_details_copy (manual->address); + } + if (accuracy) { + *accuracy = geoclue_accuracy_copy (manual->accuracy); + } + + return TRUE; +} + +static void +geoclue_manual_address_init (GcIfaceAddressClass *iface) +{ + iface->get_address = get_address; +} + +int +main (int argc, + char **argv) +{ + GeoclueManual *manual; + + g_type_init (); + + manual = g_object_new (GEOCLUE_TYPE_MANUAL, NULL); + manual->loop = g_main_loop_new (NULL, TRUE); + + g_main_loop_run (manual->loop); + + g_main_loop_unref (manual->loop); + g_object_unref (manual); + + return 0; +} |