diff options
author | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2010-10-13 18:59:19 +0100 |
---|---|---|
committer | Will Thompson <will.thompson@collabora.co.uk> | 2010-10-20 16:44:58 +0100 |
commit | 0acc7bc7afe85b3e1d5e2d24045a90e1fb06dc72 (patch) | |
tree | e4a781b4fd38bc280781a698e1916324cda0fdc9 | |
parent | f4fa57cc01fa75d20f5f95b4c67969ffc0f8f210 (diff) | |
download | telepathy-gabble-0acc7bc7afe85b3e1d5e2d24045a90e1fb06dc72.tar.gz |
GabbleServerSaslChannel: stop making assumptions about how Wocky implements its async callback
In principle, we're not meant to assume anything about @result - even
that it's a GSimpleAsyncResult.
(This broke when Wocky changed its source tags from _finish to the
more conventional _async.)
-rw-r--r-- | src/server-sasl-channel.c | 109 |
1 files changed, 100 insertions, 9 deletions
diff --git a/src/server-sasl-channel.c b/src/server-sasl-channel.c index 5397bcfc7..1b68448e6 100644 --- a/src/server-sasl-channel.c +++ b/src/server-sasl-channel.c @@ -66,17 +66,34 @@ static void gabble_server_sasl_channel_start_auth_async_func ( GAsyncReadyCallback callback, gpointer user_data); +static gboolean gabble_server_sasl_channel_start_auth_finish_func ( + WockyAuthRegistry *self, + GAsyncResult *result, + WockyAuthRegistryStartData **start_data, + GError **error); + static void gabble_server_sasl_channel_challenge_async_func ( WockyAuthRegistry *auth_registry, const GString *challenge_data, GAsyncReadyCallback callback, gpointer user_data); -static void gabble_server_sasl_channel_server_success_async_func ( +static gboolean gabble_server_sasl_channel_challenge_finish_func ( + WockyAuthRegistry *self, + GAsyncResult *result, + GString **response, + GError **error); + +static void gabble_server_sasl_channel_success_async_func ( WockyAuthRegistry *auth_registry, GAsyncReadyCallback callback, gpointer user_data); +static gboolean gabble_server_sasl_channel_success_finish_func ( + WockyAuthRegistry *self, + GAsyncResult *result, + GError **error); + static void gabble_server_sasl_channel_failure_func ( WockyAuthRegistry *auth_registry, GError *error); @@ -415,12 +432,21 @@ gabble_server_sasl_channel_class_init (GabbleServerSaslChannelClass *klass) auth_reg_class->start_auth_async_func = gabble_server_sasl_channel_start_auth_async_func; + auth_reg_class->start_auth_finish_func = + gabble_server_sasl_channel_start_auth_finish_func; + auth_reg_class->challenge_async_func = gabble_server_sasl_channel_challenge_async_func; + auth_reg_class->challenge_finish_func = + gabble_server_sasl_channel_challenge_finish_func; + auth_reg_class->success_async_func = - gabble_server_sasl_channel_server_success_async_func; - auth_reg_class->failure_func = gabble_server_sasl_channel_failure_func; + gabble_server_sasl_channel_success_async_func; + auth_reg_class->success_finish_func = + gabble_server_sasl_channel_success_finish_func; + auth_reg_class->failure_func = gabble_server_sasl_channel_failure_func; + auth_reg_class->failure_func = gabble_server_sasl_channel_failure_func; /* channel iface */ g_object_class_override_property (object_class, PROP_CHANNEL_PROPERTIES, @@ -647,7 +673,7 @@ gabble_server_sasl_channel_start_mechanism ( if (r == NULL || !g_simple_async_result_is_valid ( G_ASYNC_RESULT (priv->result), G_OBJECT (self), - wocky_auth_registry_start_auth_finish)) + gabble_server_sasl_channel_start_auth_async_func)) { gabble_server_sasl_channel_raise_not_available (context, "Authentication not in pre-start state."); @@ -703,7 +729,7 @@ gabble_server_sasl_channel_respond ( GSimpleAsyncResult *r = self->priv->result; if (r == NULL || !g_simple_async_result_is_valid (G_ASYNC_RESULT (r), - G_OBJECT (self), wocky_auth_registry_challenge_finish)) + G_OBJECT (self), gabble_server_sasl_channel_challenge_async_func)) { gabble_server_sasl_channel_raise_not_available (context, "Authentication waiting for response."); @@ -904,7 +930,7 @@ gabble_server_sasl_channel_start_auth_async_func ( NULL); priv->result = g_simple_async_result_new (G_OBJECT (self), callback, - user_data, wocky_auth_registry_start_auth_finish); + user_data, gabble_server_sasl_channel_start_auth_async_func); for (i = mechanisms; i != NULL; i = i->next) g_ptr_array_add (priv->available_mechanisms, g_strdup (i->data)); @@ -932,6 +958,28 @@ gabble_server_sasl_channel_start_auth_async_func ( } } +static gboolean +gabble_server_sasl_channel_start_auth_finish_func (WockyAuthRegistry *self, + GAsyncResult *result, + WockyAuthRegistryStartData **start_data, + GError **error) +{ + if (G_IS_SIMPLE_ASYNC_RESULT (result) && + g_simple_async_result_get_source_tag ((GSimpleAsyncResult *) result) == + gabble_server_sasl_channel_start_auth_async_func) + { + wocky_implement_finish_copy_pointer (self, + gabble_server_sasl_channel_start_auth_async_func, + wocky_auth_registry_start_data_dup, start_data); + } + else + { + return WOCKY_AUTH_REGISTRY_CLASS + (gabble_server_sasl_channel_parent_class)->start_auth_finish_func ( + self, result, start_data, error); + } +} + static void gabble_server_sasl_channel_challenge_async_func ( WockyAuthRegistry *auth_registry, @@ -947,7 +995,7 @@ gabble_server_sasl_channel_challenge_async_func ( g_assert (priv->result == NULL); priv->result = g_simple_async_result_new (G_OBJECT (self), callback, - user_data, wocky_auth_registry_challenge_finish); + user_data, gabble_server_sasl_channel_challenge_async_func); g_array_free (priv->challenge, TRUE); @@ -970,8 +1018,30 @@ gabble_server_sasl_channel_challenge_async_func ( } } +static gboolean +gabble_server_sasl_channel_challenge_finish_func (WockyAuthRegistry *self, + GAsyncResult *result, + GString **response, + GError **error) +{ + if (G_IS_SIMPLE_ASYNC_RESULT (result) && + g_simple_async_result_get_source_tag ((GSimpleAsyncResult *) result) == + gabble_server_sasl_channel_challenge_async_func) + { + wocky_implement_finish_copy_pointer (self, + gabble_server_sasl_channel_challenge_async_func, + wocky_g_string_dup, response); + } + else + { + return WOCKY_AUTH_REGISTRY_CLASS + (gabble_server_sasl_channel_parent_class)->challenge_finish_func ( + self, result, response, error); + } +} + static void -gabble_server_sasl_channel_server_success_async_func ( +gabble_server_sasl_channel_success_async_func ( WockyAuthRegistry *auth_registry, GAsyncReadyCallback callback, gpointer user_data) @@ -984,7 +1054,8 @@ gabble_server_sasl_channel_server_success_async_func ( GabbleSaslStatus current_status = g_value_get_uint ( g_value_array_get_nth (priv->current_state, 0)); GSimpleAsyncResult *r = g_simple_async_result_new (G_OBJECT (self), - callback, user_data, wocky_auth_registry_success_finish); + callback, user_data, + gabble_server_sasl_channel_success_async_func); DEBUG (""); @@ -1012,6 +1083,26 @@ gabble_server_sasl_channel_server_success_async_func ( } } +static gboolean gabble_server_sasl_channel_success_finish_func ( + WockyAuthRegistry *self, + GAsyncResult *result, + GError **error) +{ + if (G_IS_SIMPLE_ASYNC_RESULT (result) && + g_simple_async_result_get_source_tag ((GSimpleAsyncResult *) result) == + gabble_server_sasl_channel_success_async_func) + { + wocky_implement_finish_void (self, + gabble_server_sasl_channel_success_async_func); + } + else + { + return WOCKY_AUTH_REGISTRY_CLASS + (gabble_server_sasl_channel_parent_class)->success_finish_func ( + self, result, error); + } +} + static void gabble_server_sasl_channel_failure_func (WockyAuthRegistry *auth_registry, GError *error) |