diff options
author | Cosimo Cecchi <cosimoc@gnome.org> | 2010-08-24 21:20:06 +0800 |
---|---|---|
committer | Cosimo Cecchi <cosimoc@gnome.org> | 2010-08-24 21:20:06 +0800 |
commit | dc73f3d3e51958edaf3b0508c4205c387e735547 (patch) | |
tree | a5897c07e3704c6115f88545bf567148c8074d2c | |
parent | 76d38803e7992e50333c1054c48bb789ff63c699 (diff) | |
download | gsoc2013-empathy-dc73f3d3e51958edaf3b0508c4205c387e735547.tar gsoc2013-empathy-dc73f3d3e51958edaf3b0508c4205c387e735547.tar.gz gsoc2013-empathy-dc73f3d3e51958edaf3b0508c4205c387e735547.tar.bz2 gsoc2013-empathy-dc73f3d3e51958edaf3b0508c4205c387e735547.tar.lz gsoc2013-empathy-dc73f3d3e51958edaf3b0508c4205c387e735547.tar.xz gsoc2013-empathy-dc73f3d3e51958edaf3b0508c4205c387e735547.tar.zst gsoc2013-empathy-dc73f3d3e51958edaf3b0508c4205c387e735547.zip |
Properly handle corner cases of _prepare_async() called twice
- If it's called twice before the first call returned, emit an error.
- If it's called twice on an already-prepared object, just successfully
return.
-rw-r--r-- | libempathy/empathy-tls-certificate.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/libempathy/empathy-tls-certificate.c b/libempathy/empathy-tls-certificate.c index 00ff4d547..acb94c79d 100644 --- a/libempathy/empathy-tls-certificate.c +++ b/libempathy/empathy-tls-certificate.c @@ -52,6 +52,8 @@ typedef struct { gchar *cert_type; GPtrArray *cert_data; EmpTLSCertificateState state; + + gboolean is_prepared; } EmpathyTLSCertificatePriv; G_DEFINE_TYPE (EmpathyTLSCertificate, empathy_tls_certificate, @@ -106,6 +108,8 @@ tls_certificate_got_all_cb (TpProxy *proxy, DEBUG ("Got a certificate chain long %u, of type %s", priv->cert_data->len, priv->cert_type); + priv->is_prepared = TRUE; + g_simple_async_result_complete (priv->async_prepare_res); tp_clear_object (&priv->async_prepare_res); } @@ -117,6 +121,28 @@ empathy_tls_certificate_prepare_async (EmpathyTLSCertificate *self, { EmpathyTLSCertificatePriv *priv = GET_PRIV (self); + /* emit an error if we're already preparing the object */ + if (priv->async_prepare_res != NULL) + { + g_simple_async_report_error_in_idle (G_OBJECT (self), + callback, user_data, + G_IO_ERROR, G_IO_ERROR_PENDING, + "%s", + "Prepare operation already in progress on the TLS certificate."); + + return; + } + + + /* if the object is already prepared, just complete in idle */ + if (priv->is_prepared) + { + tp_simple_async_report_success_in_idle (G_OBJECT (self), + callback, user_data, empathy_tls_certificate_prepare_async); + + return; + } + priv->async_prepare_res = g_simple_async_result_new (G_OBJECT (self), callback, user_data, empathy_tls_certificate_prepare_async); |