summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelipe Contreras <felipe.contreras@gmail.com>2010-06-14 00:12:37 +0300
committerFelipe Contreras <felipe.contreras@gmail.com>2010-06-14 03:57:50 +0300
commitbff5b6450661f175c2cb09412355fb9f39c2c7f1 (patch)
treeafdd38afe95a26126266c01f2ab3bcda61665d43
parentf422fc1552c5c187ff1bcb68147dc78463377260 (diff)
Add parser implementation
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
-rw-r--r--pn_cmd_node.c30
-rw-r--r--pn_node.c17
-rw-r--r--pn_node.h4
3 files changed, 51 insertions, 0 deletions
diff --git a/pn_cmd_node.c b/pn_cmd_node.c
index 14d25a4..7f3b394 100644
--- a/pn_cmd_node.c
+++ b/pn_cmd_node.c
@@ -1,5 +1,6 @@
#include "pn_cmd_node.h"
#include "pn_trans.h"
+#include "pn_parser.h"
#include <string.h>
@@ -76,14 +77,43 @@ pn_cmd_node_send(struct pn_cmd_node *self,
va_end(args);
}
+/* pn_node stuff */
+
+static void
+got_command(struct pn_cmd_node *self,
+ const char *string,
+ gsize length)
+{
+ show_cmd(true, string, length);
+}
+
+static void
+parse_impl(struct pn_node *node,
+ struct pn_buffer *buffer)
+{
+ bool more;
+
+ do {
+ char *cmd;
+ gsize length;
+ more = pn_buffer_read_line(buffer, &cmd, &length);
+ if (cmd)
+ got_command(PN_CMD_NODE(node), cmd, length);
+ } while (more);
+}
+
/* GObject stuff */
static void
class_init(void *g_class,
void *class_data)
{
+ struct pn_node_class *node_class = PN_NODE_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;
}
static void
diff --git a/pn_node.c b/pn_node.c
index 71f24c6..6109ebb 100644
--- a/pn_node.c
+++ b/pn_node.c
@@ -78,9 +78,22 @@ pn_node_write(struct pn_node *node,
PN_NODE_GET_CLASS(node)->write(node, buffer, count);
}
+void
+pn_node_parse(struct pn_node *node,
+ struct pn_buffer *buffer)
+{
+ PN_NODE_GET_CLASS(node)->parse(node, buffer);
+}
+
/* pn_node stuff */
static void
+parse_impl(struct pn_node *node,
+ struct pn_buffer *buffer)
+{
+}
+
+static void
read_cb(GObject *source,
GAsyncResult *result,
gpointer user_data)
@@ -103,6 +116,9 @@ read_cb(GObject *source,
if (error)
goto nok;
+ b->len += size;
+ pn_node_parse(node, b);
+
if (priv->status == PN_NODE_STATUS_OPEN) {
g_input_stream_read_async(G_INPUT_STREAM(source), b->data, b->size,
G_PRIORITY_DEFAULT, NULL, read_cb, node);
@@ -305,6 +321,7 @@ class_init(void *g_class,
node_class->connect = &connect_impl;
node_class->close = &close_impl;
node_class->write = &write_impl;
+ node_class->parse = &parse_impl;
gobject_class->dispose = dispose;
gobject_class->finalize = finalize;
diff --git a/pn_node.h b/pn_node.h
index a0f4280..d81e56b 100644
--- a/pn_node.h
+++ b/pn_node.h
@@ -5,6 +5,8 @@
#include <stdbool.h>
+struct pn_buffer;
+
struct pn_node {
GObject parent;
@@ -17,6 +19,7 @@ struct pn_node_class {
void (*connect) (struct pn_node *node, const char *hostname, int port);
void (*close) (struct pn_node *node);
void (*write) (struct pn_node *node, const void *buffer, gsize count);
+ void (*parse) (struct pn_node *node, struct pn_buffer *buffer);
guint open_sig;
guint error_sig;
@@ -35,6 +38,7 @@ void pn_node_connect(struct pn_node *node, const char *hostname, int port);
void pn_node_close(struct pn_node *node);
void pn_node_write(struct pn_node *node, const void *buffer, gsize count);
+void pn_node_parse(struct pn_node *node, struct pn_buffer *buffer);
GType pn_node_get_type(void);
GQuark pn_node_error_quark(void);