/* dispose of all our internal references */ static void seahorse_server_source_dispose (GObject *gobject) { SeahorseServerSource *ssrc; SeahorseSource *sksrc; /* * Note that after this executes the rest of the object should * still work without a segfault. This basically nullifies the * object, but doesn't free it. * * This function should also be able to run multiple times. */ ssrc = SEAHORSE_SERVER_SOURCE (gobject); sksrc = SEAHORSE_SOURCE (gobject); g_assert (ssrc->priv); /* Clear out all the operations */ if (ssrc->priv->mop) { if(seahorse_operation_is_running (SEAHORSE_OPERATION (ssrc->priv->mop))) seahorse_operation_cancel (SEAHORSE_OPERATION (ssrc->priv->mop)); g_object_unref (ssrc->priv->mop); ssrc->priv->mop = NULL; } G_OBJECT_CLASS (parent_class)->dispose (gobject); }
/* dispose of all our internal references */ static void seahorse_operation_dispose (GObject *gobject) { SeahorseOperation *op = SEAHORSE_OPERATION (gobject); if (op->is_running) seahorse_operation_cancel (op); g_assert (!op->is_running); /* We do this in dispose in case it's a circular reference */ if (op->result && op->result_destroy) (op->result_destroy) (op->result); op->result = NULL; op->result_destroy = NULL; G_OBJECT_CLASS (seahorse_operation_parent_class)->dispose (gobject); }
static gboolean step_operation (FilesCtx *ctx, SeahorseToolMode *mode, GError **err) { SeahorsePGPOperation *pop = NULL; gpgme_data_t data = NULL; gboolean ret = FALSE; SeahorseOperation *op; FileInfo *finfo; GList *l; gchar *filename; /* Reset our done counter */ ctx->done = 0; for (l = ctx->finfos; l; l = g_list_next (l)) { finfo = (FileInfo*)l->data; if (!finfo || !finfo->file) continue; ctx->cur = finfo; /* A new operation for each context */ pop = seahorse_pgp_operation_new (NULL); op = SEAHORSE_OPERATION (pop); data = seahorse_vfs_data_create_full (finfo->file, SEAHORSE_VFS_READ, (SeahorseVfsProgressCb)progress_cb, ctx, err); if (!data) goto finally; /* Inhibit popping up of progress dialog */ seahorse_tool_progress_block (TRUE); /* Embed filename during encryption */ if (mode_encrypt) { filename = g_file_get_basename (finfo->file); gpgme_data_set_file_name (data, filename); g_free (filename); } /* The start callback */ if (mode->startcb) { if (!(mode->startcb) (mode, finfo->uri, data, pop, err)) goto finally; } /* Let progress dialog pop up */ seahorse_tool_progress_block (FALSE); /* Run until the operation completes */ seahorse_util_wait_until ((!seahorse_operation_is_running (op) || !seahorse_tool_progress_check ())); /* If cancel then reflect that */ if (seahorse_operation_is_running (op)) { seahorse_operation_cancel (op); goto finally; } if (!seahorse_operation_is_successful (op)) { seahorse_operation_copy_error (op, err); goto finally; } /* The done callback */ if (mode->donecb) { if (!(mode->donecb) (mode, finfo->uri, data, pop, err)) goto finally; } ctx->done += g_file_info_get_size (finfo->info); ctx->cur = NULL; g_object_unref (pop); pop = NULL; gpgme_data_release (data); data = NULL; } seahorse_tool_progress_update (1.0, ""); ret = TRUE; finally: if (pop) g_object_unref (pop); if (data) gpgme_data_release (data); return ret; }
/** * on_progress_operation_cancel: * @button: ignored * @operation: The operation to cancel * * Cancels an operation * */ G_MODULE_EXPORT void on_progress_operation_cancel (GtkButton *button, SeahorseOperation *operation) { if (seahorse_operation_is_running (operation)) seahorse_operation_cancel (operation); }