summaryrefslogtreecommitdiff
path: root/ccast/ccmes.h
diff options
context:
space:
mode:
Diffstat (limited to 'ccast/ccmes.h')
-rw-r--r--ccast/ccmes.h103
1 files changed, 103 insertions, 0 deletions
diff --git a/ccast/ccmes.h b/ccast/ccmes.h
new file mode 100644
index 0000000..5eae02a
--- /dev/null
+++ b/ccast/ccmes.h
@@ -0,0 +1,103 @@
+
+#ifndef CCMES
+
+/*
+ * Class to deal with protobuf messages
+ * to/from ChromCast.
+ *
+ * Author: Graeme W. Gill
+ * Date: 3/9/2014
+ *
+ * Copyright 2014 Graeme W. Gill
+ * All rights reserved.
+ *
+ * This material is licenced under the GNU AFFERO GENERAL PUBLIC LICENSE Version 3 :-
+ * see the License2.txt file for licencing details.
+ *
+ */
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - */
+/* A single message */
+typedef struct _ccmes {
+ struct _ccmes *next; /* Linked list */
+ yajl_val tnode; /* If not NULL, top node of parsed data */
+ char *mtype; /* If not NULL, "type". Points into tnode data */
+ int rqid; /* "requestId", 0 by default */
+
+ char *source_id; /* Source name */
+ char *destination_id; /* Destination name */
+ char *namespace; /* Channel id */
+ int binary; /* Binary data flag */
+ ORD8 *data; /* String or binary */
+ ORD32 bin_len; /* Binary data length */
+} ccmes;
+
+/* Transfer the data from one message to another */
+void ccmes_transfer(ccmes *dst, ccmes *src);
+
+/* Initialise a message */
+void ccmes_init(ccmes *mes);
+
+/* Free up just the contents */
+void ccmes_empty(ccmes *mes);
+
+/* Free up the message and its contents */
+void ccmes_del(ccmes *mes);
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - */
+
+typedef enum {
+ ccmessv_OK = 0,
+ ccmessv_malloc, /* malloc failed */
+ ccmessv_context, /* Getting a ssl context failed */
+ ccmessv_connect, /* Connecting to host failed */
+ ccmessv_ssl, /* Establishing SSL connection to host failed */
+
+ ccmessv_send, /* Message body failed to send */
+ ccmessv_recv, /* No body or failed to read */
+ ccmessv_unpack, /* Failed to unpack protobufs */
+ ccmessv_timeout, /* Failed due to timeout on i/o operation */
+ ccmessv_closed /* Connection has been closed */
+} ccmessv_err;
+
+/* Error message from error number */
+char *ccmessv_emes(ccmessv_err rv);
+
+
+/* The central facility to send and receive messages */
+typedef struct _ccmessv {
+
+/* Public: */
+
+ /* Delete the ccmessv */
+ void (*del)(struct _ccmessv *p);
+
+ /* Send a raw message */
+ /* Return ccmessv_err on error */
+ ccmessv_err (*send)(struct _ccmessv *p, ccmes *mes);
+
+ /* Receive a message. mes->data should be free's after use */
+ /* Return ccmessv_err on error */
+ ccmessv_err (*receive)(struct _ccmessv *p, ccmes *mes);
+
+ ccpacket *pk;
+
+ amutex slock; /* Send lock protecting */
+
+} ccmessv;
+
+/* Create a new ccmessv object, and hand it the working packet connection. */
+/* (ccmessv does not close it when deleted) */
+/* Return NULL on error */
+ccmessv *new_ccmessv(ccpacket *pk);
+
+#ifdef __cplusplus
+ }
+#endif
+
+#define CCMES_H
+#endif /* CCMES_H */