summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2010-10-13 18:59:19 +0100
committerWill Thompson <will.thompson@collabora.co.uk>2010-10-20 16:44:58 +0100
commit0acc7bc7afe85b3e1d5e2d24045a90e1fb06dc72 (patch)
treee4a781b4fd38bc280781a698e1916324cda0fdc9
parentf4fa57cc01fa75d20f5f95b4c67969ffc0f8f210 (diff)
downloadtelepathy-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.c109
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)