diff options
author | Ray Strode <rstrode@redhat.com> | 2007-05-07 17:56:13 -0400 |
---|---|---|
committer | Ray Strode <rstrode@redhat.com> | 2007-05-07 17:56:13 -0400 |
commit | 3242f87693a6d8037b68a0f84a487916913fd2ff (patch) | |
tree | 4fdcd9752f3c8210997f1a54e11b1e4c1be49e0d | |
parent | 932748b01c8fc7b35ab787d37582020101a63e8b (diff) |
i don't know
-rw-r--r-- | src/pop-transaction.c | 74 |
1 files changed, 54 insertions, 20 deletions
diff --git a/src/pop-transaction.c b/src/pop-transaction.c index 9f7f3ad..37a70a0 100644 --- a/src/pop-transaction.c +++ b/src/pop-transaction.c @@ -200,11 +200,11 @@ static gboolean pop_transaction_rollback_action_and_rewind (PopTransaction *tran static void pop_transaction_rollback_on_idle (PopTransaction *transaction); static void pop_transaction_rollback_and_finish (PopTransaction *transaction); -static gboolean pop_transaction_is_running_action (PopTransaction *transaction); static gboolean pop_transaction_is_at_first_action (PopTransaction *transaction); static gboolean pop_transaction_is_attached (PopTransaction *transaction); static gboolean pop_transaction_is_empty (PopTransaction *transaction); static gboolean pop_transaction_is_committed (PopTransaction *transaction); +static gboolean pop_transaction_is_waiting (PopTransaction *transaction); static gboolean pop_transaction_is_finished (PopTransaction *transaction); static guint pop_transaction_signals[NUMBER_OF_SIGNALS]; @@ -877,7 +877,6 @@ pop_transaction_process_action_and_seek_forward (PopTransaction *transaction) action = pop_action_tree_get_current_action (transaction->priv->action_tree); - transaction->priv->is_running_action = TRUE; if (action->process_func != NULL) { if (action->process_status == POP_ACTION_PROCESS_STATUS_NOT_FINISHED) @@ -887,7 +886,6 @@ pop_transaction_process_action_and_seek_forward (PopTransaction *transaction) { action->process_status = POP_ACTION_PROCESS_STATUS_SUCCEEDED; } - transaction->priv->is_running_action = FALSE; switch (action->process_status) { @@ -960,7 +958,6 @@ pop_transaction_rollback_action_and_rewind (PopTransaction *transaction) action = pop_action_tree_get_current_action (transaction->priv->action_tree); - transaction->priv->is_running_action = TRUE; if (action->rollback_func != NULL) { if (action->rollback_status == POP_ACTION_ROLLBACK_STATUS_NOT_FINISHED) @@ -970,7 +967,6 @@ pop_transaction_rollback_action_and_rewind (PopTransaction *transaction) { action->rollback_status = POP_ACTION_ROLLBACK_STATUS_FINISHED; } - transaction->priv->is_running_action = FALSE; switch (action->rollback_status) { @@ -1030,20 +1026,6 @@ pop_transaction_rollback_and_finish (PopTransaction *transaction) } static gboolean -pop_transaction_is_running_action (PopTransaction *transaction) -{ - g_return_val_if_fail (POP_IS_TRANSACTION (transaction), FALSE); - - if (transaction->priv->is_running_action) - { - g_assert (transaction->priv->state >= POP_TRANSACTION_STATE_PROCESSING); - return TRUE; - } - - return FALSE; -} - -static gboolean pop_transaction_is_at_first_action (PopTransaction *transaction) { g_assert (POP_IS_TRANSACTION (transaction)); @@ -1075,6 +1057,14 @@ pop_transaction_is_committed (PopTransaction *transaction) } static gboolean +pop_transaction_is_waiting (PopTransaction *transaction) +{ + g_assert (POP_IS_TRANSACTION (transaction)); + + return transaction->priv->is_waiting; +} + +static gboolean pop_transaction_is_finished (PopTransaction *transaction) { return transaction->priv->state == POP_TRANSACTION_STATE_FINISHED; @@ -1148,6 +1138,19 @@ void pop_transaction_resume (PopTransaction *transaction) { g_assert (POP_IS_TRANSACTION (transaction)); + g_assert (pop_transaction_is_waiting (transaction)); + + transaction->priv->is_waiting = FALSE; + g_signal_emit (transaction, pop_transaction_signals[RESUME], 0); + + if (transaction->priv->wait_id != 0) + { + g_source_remove (transaction->priv->wait_id); + transaction->priv->wait_id = 0; + } + + if (!pop_transaction_is_committed (transaction)) + return; switch (transaction->priv->state) { @@ -1598,6 +1601,29 @@ output_transaction_new (guint8 *buffer, return transaction; } +static void +on_input_transaction_wait (PopTransaction *input_transaction, + PopTransaction *output_transaction) +{ + gint bytes_read, bytes_written; + + bytes_read = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (input_transaction), + "bytes-already-processed")); + bytes_written = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (output_transaction), + "bytes-already-processed")); + + if (bytes_read > bytes_written) + pop_transaction_resume (output_transaction); +} + +static void +on_input_transaction_finish (PopTransaction *input_transaction, + PopTransactionStatus status, + PopTransaction *output_transaction) +{ + pop_transaction_resume (output_transaction); +} + static PopActionProcessStatus process_cat_action (PopTransaction *transaction, gpointer data) @@ -1606,14 +1632,22 @@ process_cat_action (PopTransaction *transaction, char *buffer; static const int buffer_size = 4096; + buffer = g_malloc0 (buffer_size); input_transaction = input_transaction_new (buffer, buffer_size); pop_transaction_commit (input_transaction); output_transaction = output_transaction_new (buffer, buffer_size); + g_signal_connect (G_OBJECT (input_transaction), "wait", + G_CALLBACK (on_input_transaction_wait), + output_transaction); + g_signal_connect (G_OBJECT (input_transaction), "finish", + G_CALLBACK (on_input_transaction_finish), + output_transaction); pop_transaction_wait (output_transaction); + pop_transaction_commit (output_transaction); - return POP_ACTION_PROCESS_STATUS_SUCCEEDED; + return POP_ACTION_PROCESS_STATUS_NOT_FINISHED; } static PopActionRollbackStatus |