diff options
author | Felipe Contreras <felipe.contreras@gmail.com> | 2010-06-13 02:56:20 +0300 |
---|---|---|
committer | Felipe Contreras <felipe.contreras@gmail.com> | 2010-06-14 03:13:31 +0300 |
commit | 6d8d5d2f5ede85d5b03555bc28d23e3729e49015 (patch) | |
tree | 6a207731829aca30fd97babe16a0a06aa82c9298 | |
parent | d9bfd9b8d15c4acaad97bc15bd08541c2515ece5 (diff) |
Add pn_cmd_node
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | pn_cmd_node.c | 119 | ||||
-rw-r--r-- | pn_cmd_node.h | 28 |
3 files changed, 148 insertions, 1 deletions
@@ -18,7 +18,7 @@ QUIET_CLEAN = @echo ' CLEAN '$@; endif test: test.o pn_core.o pn_session.o pn_node.o \ - pn_trans.o \ + pn_trans.o pn_cmd_node.o \ pn_log.o pn_printf.o test: override CFLAGS += $(GIO_CFLAGS) test: override LIBS += $(GIO_LIBS) diff --git a/pn_cmd_node.c b/pn_cmd_node.c new file mode 100644 index 0000000..314b3f9 --- /dev/null +++ b/pn_cmd_node.c @@ -0,0 +1,119 @@ +#include "pn_cmd_node.h" +#include "pn_trans.h" + +#include <string.h> + +#include "pn_log.h" + +static void *parent_class; + +struct pn_cmd_node_priv { + unsigned counter; +}; + +struct pn_cmd_node * +pn_cmd_node_new(void) +{ + return g_object_new(PN_CMD_NODE_TYPE, NULL); +} + +void +pn_cmd_node_free(struct pn_cmd_node *conn) +{ + if (!conn) + return; + g_object_unref(conn); +} + +static inline void +show_cmd(bool incoming, + const char *str, + size_t len) +{ + const char *mark = incoming ? "<-" : "->"; + pn_info(NULL, "%s %.*s", mark, len, str); +} + +static void +send_valist(struct pn_cmd_node *self, + const char *command, + const char *format, + va_list args) +{ + struct pn_cmd_node_priv *priv = self->priv; + struct pn_trans *trans; + + trans = pn_trans_new(); + + trans->id = ++priv->counter; + trans->command = g_strdup(command); + trans->params = g_strdup_vprintf(format, args); + + { + char *data; + size_t len; + + data = pn_trans_to_string(trans); + len = strlen(data); + + show_cmd(false, data, len - 2); + + g_free(data); + } + + pn_trans_free(trans); +} + +void +pn_cmd_node_send(struct pn_cmd_node *self, + const char *command, + const char *format, + ...) +{ + va_list args; + va_start(args, format); + send_valist(self, command, format, args); + va_end(args); +} + +/* GObject stuff */ + +static void +class_init(void *g_class, + void *class_data) +{ + parent_class = g_type_class_peek_parent(g_class); + g_type_class_add_private(g_class, sizeof(struct pn_cmd_node_priv)); +} + +static void +instance_init(GTypeInstance *instance, + void *g_class) +{ + struct pn_cmd_node *self = PN_CMD_NODE(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); +} + +GType +pn_cmd_node_get_type(void) +{ + static gsize init_type; + + if (g_once_init_enter(&init_type)) { + GType type; + GTypeInfo type_info = { + .class_size = sizeof(struct pn_cmd_node_class), + .class_init = class_init, + .instance_size = sizeof(struct pn_cmd_node), + .instance_init = instance_init, + }; + + type = g_type_register_static(PN_NODE_TYPE, "PnCmdNode", &type_info, 0); + + g_once_init_leave(&init_type, type); + } + + return init_type; +} diff --git a/pn_cmd_node.h b/pn_cmd_node.h new file mode 100644 index 0000000..f43c7ff --- /dev/null +++ b/pn_cmd_node.h @@ -0,0 +1,28 @@ +#ifndef PN_CMD_NODE_H +#define PN_CMD_NODE_H + +#include "pn_node.h" + +struct pn_cmd_node { + struct pn_node parent; + + struct pn_cmd_node_priv *priv; +}; + +struct pn_cmd_node_class { + struct pn_node_class parent_class; +}; + +#define PN_CMD_NODE_TYPE (pn_cmd_node_get_type()) +#define PN_CMD_NODE(obj)(G_TYPE_CHECK_INSTANCE_CAST((obj), PN_CMD_NODE_TYPE, struct pn_cmd_node)) + +struct pn_cmd_node *pn_cmd_node_new(void); +void pn_cmd_node_free(struct pn_cmd_node *node); + +void pn_cmd_node_send(struct pn_cmd_node *node, + const char *command, + const char *format, ...); + +GType pn_cmd_node_get_type(void); + +#endif |