summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelipe Contreras <felipe.contreras@gmail.com>2010-06-14 02:54:53 +0300
committerFelipe Contreras <felipe.contreras@gmail.com>2010-06-14 03:57:54 +0300
commit54ff389121af56e2e6b01a9e266a15613b94ddba (patch)
treed010fc9f4dd8e16b61161b678900edb48c613d73
parent4046cf07c3d5ed41182c1a931f4d477879b91c88 (diff)
cmd_node: keep track of transactions
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
-rw-r--r--pn_cmd_node.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/pn_cmd_node.c b/pn_cmd_node.c
index fd2da76..327f19c 100644
--- a/pn_cmd_node.c
+++ b/pn_cmd_node.c
@@ -11,6 +11,7 @@ static void *parent_class;
struct pn_cmd_node_priv {
unsigned counter;
+ GHashTable *transactions;
};
struct pn_cmd_node *
@@ -51,6 +52,8 @@ send_valist(struct pn_cmd_node *self,
trans->command = g_strdup(command);
trans->params = g_strdup_vprintf(format, args);
+ g_hash_table_insert(priv->transactions, GINT_TO_POINTER(trans->id), trans);
+
{
char *data;
size_t len;
@@ -62,8 +65,6 @@ send_valist(struct pn_cmd_node *self,
pn_node_write(PN_NODE(self), data, len);
}
-
- pn_trans_free(trans);
}
void
@@ -85,9 +86,15 @@ got_command(struct pn_cmd_node *self,
const char *string,
gsize length)
{
+ struct pn_cmd_node_priv *priv = self->priv;
struct pn_cmd *cmd;
+ struct pn_trans *trans;
+
show_cmd(true, string, length);
+
cmd = pn_cmd_new_from_string(string, length);
+ if (cmd->tr_id)
+ trans = g_hash_table_lookup(priv->transactions, GINT_TO_POINTER(cmd->tr_id));
pn_warn(self, "unhandled command: %.*s", length, string);
pn_cmd_free(cmd);
}
@@ -110,15 +117,27 @@ parse_impl(struct pn_node *node,
/* GObject stuff */
static void
+finalize(GObject *obj)
+{
+ struct pn_cmd_node_priv *priv = PN_CMD_NODE(obj)->priv;
+ g_hash_table_destroy(priv->transactions);
+
+ G_OBJECT_CLASS(parent_class)->finalize(obj);
+}
+
+static void
class_init(void *g_class,
void *class_data)
{
struct pn_node_class *node_class = PN_NODE_CLASS(g_class);
+ GObjectClass *gobject_class = G_OBJECT_CLASS(g_class);
parent_class = g_type_class_peek_parent(g_class);
g_type_class_add_private(g_class, sizeof(struct pn_cmd_node_priv));
node_class->parse = &parse_impl;
+
+ gobject_class->finalize = finalize;
}
static void
@@ -129,6 +148,7 @@ instance_init(GTypeInstance *instance,
struct pn_cmd_node_priv *priv = self->priv;
self->priv = priv = G_TYPE_INSTANCE_GET_PRIVATE(instance, PN_CMD_NODE_TYPE, struct pn_cmd_node_priv);
+ priv->transactions = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) pn_trans_free);
}
GType