104 lines
2.6 KiB
C
104 lines
2.6 KiB
C
|
|
#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 */
|