static void request_location_reply_cb (GObject *source, GAsyncResult *res, gpointer user_data) { YetAnotherContextStruct *ctx = user_data; WockyStanza *reply; WockyNode *item_node; GError *wocky_error = NULL, *tp_error = NULL; reply = wocky_pep_service_get_finish (WOCKY_PEP_SERVICE (source), res, &item_node, &wocky_error); if (reply == NULL || wocky_stanza_extract_errors (reply, NULL, &wocky_error, NULL, NULL)) { DEBUG ("fetching location failed: %s", wocky_error->message); gabble_set_tp_error_from_wocky (wocky_error, &tp_error); dbus_g_method_return_error (ctx->context, tp_error); g_error_free (tp_error); } else { GHashTable *location; if (update_location_from_item (ctx->self, ctx->handle, item_node)) { location = get_cached_location (ctx->self, ctx->handle); /* We just cached a location for this contact, so it should be * non-NULL. */ g_return_if_fail (location != NULL); } else { /* If the location's unparseable, we'll hit this path. That seems * okay. */ location = g_hash_table_new (NULL, NULL); } tp_svc_connection_interface_location_return_from_request_location ( ctx->context, location); g_hash_table_unref (location); } tp_clear_object (&reply); g_object_unref (ctx->self); g_slice_free (YetAnotherContextStruct, ctx); }
static void location_get_locations (TpSvcConnectionInterfaceLocation *iface, const GArray *contacts, DBusGMethodInvocation *context) { GabbleConnection *conn = GABBLE_CONNECTION (iface); TpBaseConnection *base = (TpBaseConnection *) conn; TpHandleRepoIface *contact_handles; guint i; GError *error = NULL; GHashTable *return_locations = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) g_hash_table_unref); DEBUG ("GetLocation for contacts:"); gabble_connection_ensure_capabilities (conn, gabble_capabilities_get_geoloc_notify ()); /* Validate contacts */ contact_handles = tp_base_connection_get_handles (base, TP_HANDLE_TYPE_CONTACT); if (!tp_handles_are_valid (contact_handles, contacts, TRUE, &error)) { dbus_g_method_return_error (context, error); g_error_free (error); g_hash_table_unref (return_locations); return; } for (i = 0; i < contacts->len; i++) { TpHandle contact = g_array_index (contacts, TpHandle, i); GHashTable *location = get_cached_location (conn, contact); if (location != NULL) g_hash_table_insert (return_locations, GUINT_TO_POINTER (contact), location); } tp_svc_connection_interface_location_return_from_get_locations (context, return_locations); g_hash_table_unref (return_locations); }
static void conn_location_fill_contact_attributes (GObject *obj, const GArray *contacts, GHashTable *attributes_hash) { GabbleConnection *self = GABBLE_CONNECTION (obj); guint i; for (i = 0; i < contacts->len; i++) { TpHandle handle = g_array_index (contacts, TpHandle, i); GHashTable *location = get_cached_location (self, handle); if (location != NULL) { GValue *val = tp_g_value_slice_new_take_boxed ( TP_HASH_TYPE_STRING_VARIANT_MAP, location); tp_contacts_mixin_set_contact_attribute (attributes_hash, handle, TP_IFACE_CONNECTION_INTERFACE_LOCATION"/location", val); } } }