summaryrefslogtreecommitdiffstats
path: root/src/protocol-cli.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2004-06-19 19:27:47 +0000
committerLennart Poettering <lennart@poettering.net>2004-06-19 19:27:47 +0000
commit81447ed392e57f822e09cf648cb16732a3e3773f (patch)
tree6c7030f9b2b6f8b89d91063ac53f2325446f2616 /src/protocol-cli.c
parent6eddcc2f856e2b8910046702e0a096e75942c2d6 (diff)
cli protocol
git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@28 fefdeb5f-60dc-0310-8127-8f9354f1896f
Diffstat (limited to 'src/protocol-cli.c')
-rw-r--r--src/protocol-cli.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/protocol-cli.c b/src/protocol-cli.c
new file mode 100644
index 00000000..c0c93d98
--- /dev/null
+++ b/src/protocol-cli.c
@@ -0,0 +1,59 @@
+#include <assert.h>
+#include <stdlib.h>
+
+#include "protocol-cli.h"
+#include "cli.h"
+
+struct protocol_cli {
+ struct core *core;
+ struct socket_server*server;
+ struct idxset *connections;
+};
+
+static void cli_eof_cb(struct cli*c, void*userdata) {
+ struct protocol_cli *p = userdata;
+ assert(c && p);
+
+ idxset_remove_by_data(p->connections, c, NULL);
+ cli_free(c);
+}
+
+static void on_connection(struct socket_server*s, struct iochannel *io, void *userdata) {
+ struct protocol_cli *p = userdata;
+ struct cli *c;
+ assert(s && io && p);
+
+ c = cli_new(p->core, io);
+ assert(c);
+ cli_set_eof_callback(c, cli_eof_cb, p);
+
+ idxset_put(p->connections, c, NULL);
+}
+
+struct protocol_cli* protocol_cli_new(struct core *core, struct socket_server *server) {
+ struct protocol_cli* p;
+ assert(core && server);
+
+ p = malloc(sizeof(struct protocol_cli));
+ assert(p);
+ p->core = core;
+ p->server = server;
+ p->connections = idxset_new(NULL, NULL);
+
+ socket_server_set_callback(p->server, on_connection, p);
+
+ return p;
+}
+
+static void free_connection(void *p, void *userdata) {
+ assert(p);
+ cli_free(p);
+}
+
+void protocol_cli_free(struct protocol_cli *p) {
+ assert(p);
+
+ idxset_free(p->connections, free_connection, NULL);
+ socket_server_free(p->server);
+ free(p);
+}