diff options
Diffstat (limited to 'ccast/ccmes.h')
-rw-r--r-- | ccast/ccmes.h | 103 |
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 */ |