diff options
author | Felipe Contreras <felipe.contreras@gmail.com> | 2010-06-14 00:12:37 +0300 |
---|---|---|
committer | Felipe Contreras <felipe.contreras@gmail.com> | 2010-06-14 03:57:50 +0300 |
commit | bff5b6450661f175c2cb09412355fb9f39c2c7f1 (patch) | |
tree | afdd38afe95a26126266c01f2ab3bcda61665d43 | |
parent | f422fc1552c5c187ff1bcb68147dc78463377260 (diff) |
Add parser implementation
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
-rw-r--r-- | pn_cmd_node.c | 30 | ||||
-rw-r--r-- | pn_node.c | 17 | ||||
-rw-r--r-- | pn_node.h | 4 |
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 @@ -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; @@ -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); |