summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelipe Contreras <felipe.contreras@gmail.com>2010-06-13 02:56:20 +0300
committerFelipe Contreras <felipe.contreras@gmail.com>2010-06-14 03:13:31 +0300
commit6d8d5d2f5ede85d5b03555bc28d23e3729e49015 (patch)
tree6a207731829aca30fd97babe16a0a06aa82c9298
parentd9bfd9b8d15c4acaad97bc15bd08541c2515ece5 (diff)
Add pn_cmd_node
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
-rw-r--r--Makefile2
-rw-r--r--pn_cmd_node.c119
-rw-r--r--pn_cmd_node.h28
3 files changed, 148 insertions, 1 deletions
diff --git a/Makefile b/Makefile
index 13f16a1..c1548e1 100644
--- a/Makefile
+++ b/Makefile
@@ -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