summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2007-05-07 17:56:13 -0400
committerRay Strode <rstrode@redhat.com>2007-05-07 17:56:13 -0400
commit3242f87693a6d8037b68a0f84a487916913fd2ff (patch)
tree4fdcd9752f3c8210997f1a54e11b1e4c1be49e0d
parent932748b01c8fc7b35ab787d37582020101a63e8b (diff)
i don't know
-rw-r--r--src/pop-transaction.c74
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