EII Message Bus C Reference
msg_envelope.h
Go to the documentation of this file.
1 // Copyright (c) 2019 Intel Corporation.
2 //
3 // Permission is hereby granted, free of charge, to any person obtaining a copy
4 // of this software and associated documentation files (the "Software"), to
5 // deal in the Software without restriction, including without limitation the
6 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7 // sell copies of the Software, and to permit persons to whom the Software is
8 // furnished to do so, subject to the following conditions:
9 //
10 // The above copyright notice and this permission notice shall be included in
11 // all copies or substantial portions of the Software.
12 //
13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18 // FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19 // IN THE SOFTWARE.
20 
26 #ifndef _EII_MESSAGE_BUS_MSGENV_H
27 #define _EII_MESSAGE_BUS_MSGENV_H
28 
29 #include <stdlib.h>
30 #include <stdbool.h>
31 #include <stdint.h>
32 #include "eii/msgbus/msgbusret.h"
33 #include "eii/msgbus/hashmap.h"
34 #include "eii/msgbus/linkedlist.h"
35 
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
39 
43 typedef enum {
44  CT_JSON = 0,
45 
46  // For custom serialized data by the user (assumed done by the caller of
47  // the `msgbus_recv()` prior to calling the method)
48  CT_BLOB = 1,
49 
50  // TODO: ADD support for CBOR
51  // CT_CBOR = 2,
53 
57 typedef enum {
58  MSG_ENV_DT_INT = 0,
59  MSG_ENV_DT_FLOATING = 1,
60  MSG_ENV_DT_STRING = 2,
61  MSG_ENV_DT_BOOLEAN = 3,
62  MSG_ENV_DT_BLOB = 4,
63  MSG_ENV_DT_OBJECT = 5,
64  MSG_ENV_DT_ARRAY = 6,
65  MSG_ENV_DT_NONE = 7,
67 
71 typedef struct {
72  void* ptr;
73  void (*free)(void*);
74  bool owned;
75 
76  size_t len;
77  const char* bytes;
78 } owned_blob_t;
79 
83 typedef struct {
84  owned_blob_t* shared;
85 
86  uint64_t len;
87  const char* data;
89 
93 typedef struct {
95 
96  union {
97  int64_t integer;
98  double floating;
99  char* string;
100  bool boolean;
101  msg_envelope_blob_t* blob;
102  hashmap_t* object;
103  linkedlist_t* array;
104  } body;
106 
111 typedef struct {
112  char* name;
113  char* correlation_id;
114  content_type_t content_type;
115 
116  // Internal tracking for (key, value) pairs
117  hashmap_t* map;
118 
119  // Internal tracking for blob data
122 
126 typedef struct {
127  owned_blob_t* shared;
128 
129  // Convenience values
130  size_t len;
131  const char* bytes;
133 
141 
148 
155 
163 
172 
182  msg_envelope_t* obj, const char* key,
183  const char* value);
184 
193 
203  msg_envelope_t* obj, const char* key,
204  int64_t value);
205 
214 
224  msg_envelope_t* obj, const char* key,
225  double value);
226 
235 
245  msg_envelope_t* obj, const char* key,
246  bool value);
247 
259  char* data, size_t len);
260 
270  msg_envelope_elem_body_t* obj, const char* key,
271  msg_envelope_elem_body_t* value);
272 
282  msg_envelope_elem_body_t* obj, const char* key,
283  int64_t value);
284 
294  msg_envelope_elem_body_t* obj, const char* key,
295  const char* value);
296 
306  msg_envelope_elem_body_t* obj, const char* key,
307  double value);
308 
318  msg_envelope_elem_body_t* obj, const char* key,
319  bool value);
320 
329  msg_envelope_elem_body_t* obj, const char* key);
330 
339  msg_envelope_elem_body_t* obj, const char* key);
340 
350  msg_envelope_elem_body_t* value);
351 
361  int64_t value);
362 
372  const char* value);
373 
383  double value);
384 
394  bool value);
395 
404  msg_envelope_elem_body_t* arr, int idx);
405 
414  msg_envelope_elem_body_t* arr, int idx);
415 
422 
438  msg_envelope_t* env, const char* key, msg_envelope_elem_body_t* data);
439 
448 
461  msg_envelope_t* env, const char* key, msg_envelope_elem_body_t** data);
462 
473 
494  int num_parts, const char* name, msg_envelope_t** env);
495 
504  int num_parts, msg_envelope_serialized_part_t** parts);
505 
514  msg_envelope_serialized_part_t* parts, int num_parts);
515 
532  msg_envelope_t* msg, bool pretty_print, bool print_blobs);
533 
540 
547  void* ptr, void (*free_fn)(void*), const char* data, size_t len);
548 
554 
558 void owned_blob_destroy(owned_blob_t* shared);
559 
560 #ifdef __cplusplus
561 } // extern "C"
562 
563 // If in C++, then add Serializable interface for objects which can be
564 // serialized into a msg_envelope_t* structure
565 namespace eii {
566 namespace msgbus {
567 
572 class Serializable {
573 protected:
574  msg_envelope_t* m_msg;
575 
576 public:
580  Serializable() : m_msg(NULL) {};
581 
590  Serializable(msg_envelope_t* msg) : m_msg(msg) {};
591 
595  virtual ~Serializable() {
596  if(m_msg != NULL) {
598  }
599  };
600 
607  virtual msg_envelope_t* serialize() = 0;
608 };
609 
610 } // msgbus
611 } // eii
612 
613 #endif // __cplusplus
614 
615 #endif // _EII_MESSAGE_BUD_MSGENV_H
msgbus_msg_envelope_put_float
msgbus_ret_t msgbus_msg_envelope_put_float(msg_envelope_t *obj, const char *key, double value)
owned_blob_destroy
void owned_blob_destroy(owned_blob_t *shared)
msgbus_msg_envelope_new_bool
msg_envelope_elem_body_t * msgbus_msg_envelope_new_bool(bool boolean)
msgbus_msg_envelope_new_string
msg_envelope_elem_body_t * msgbus_msg_envelope_new_string(const char *string)
msgbus_msg_envelope_new_none
msg_envelope_elem_body_t * msgbus_msg_envelope_new_none()
msgbus_msg_envelope_elem_object_put_string
msgbus_ret_t msgbus_msg_envelope_elem_object_put_string(msg_envelope_elem_body_t *obj, const char *key, const char *value)
msgbus_msg_envelope_elem_object_put_bool
msgbus_ret_t msgbus_msg_envelope_elem_object_put_bool(msg_envelope_elem_body_t *obj, const char *key, bool value)
msgbusret.h
Messaging return codes.
msg_envelope_elem_body_t
Definition: msg_envelope.h:93
msgbus_msg_envelope_put_integer
msgbus_ret_t msgbus_msg_envelope_put_integer(msg_envelope_t *obj, const char *key, int64_t value)
msgbus_msg_envelope_elem_object_put_integer
msgbus_ret_t msgbus_msg_envelope_elem_object_put_integer(msg_envelope_elem_body_t *obj, const char *key, int64_t value)
msgbus_msg_envelope_new_object
msg_envelope_elem_body_t * msgbus_msg_envelope_new_object()
msgbus_ret_t
msgbus_ret_t
Definition: msgbusret.h:36
hashmap.h
C hashmap implementation.
msg_envelope_t
Definition: msg_envelope.h:111
owned_blob_copy
owned_blob_t * owned_blob_copy(owned_blob_t *to_copy)
msgbus_msg_envelope_put
msgbus_ret_t msgbus_msg_envelope_put(msg_envelope_t *env, const char *key, msg_envelope_elem_body_t *data)
msg_envelope_serialized_part_t
Definition: msg_envelope.h:126
msg_envelope_data_type_t
msg_envelope_data_type_t
Definition: msg_envelope.h:57
msgbus_msg_envelope_new_blob
msg_envelope_elem_body_t * msgbus_msg_envelope_new_blob(char *data, size_t len)
owned_blob_new
owned_blob_t * owned_blob_new(void *ptr, void(*free_fn)(void *), const char *data, size_t len)
msgbus_msg_envelope_remove
msgbus_ret_t msgbus_msg_envelope_remove(msg_envelope_t *env, const char *key)
msgbus_msg_envelope_new
msg_envelope_t * msgbus_msg_envelope_new(content_type_t ct)
msgbus_msg_envelope_elem_array_get_at
msg_envelope_elem_body_t * msgbus_msg_envelope_elem_array_get_at(msg_envelope_elem_body_t *arr, int idx)
linkedlist.h
C singly linked list.
msgbus_msg_envelope_deserialize
msgbus_ret_t msgbus_msg_envelope_deserialize(content_type_t ct, msg_envelope_serialized_part_t *parts, int num_parts, const char *name, msg_envelope_t **env)
msgbus_msg_envelope_put_string
msgbus_ret_t msgbus_msg_envelope_put_string(msg_envelope_t *obj, const char *key, const char *value)
msgbus_msg_envelope_elem_object_put_float
msgbus_ret_t msgbus_msg_envelope_elem_object_put_float(msg_envelope_elem_body_t *obj, const char *key, double value)
msgbus_msg_envelope_elem_array_add_float
msgbus_ret_t msgbus_msg_envelope_elem_array_add_float(msg_envelope_elem_body_t *arr, double value)
hashmap_t
Definition: hashmap.h:70
msgbus_msg_envelope_elem_array_remove_at
msgbus_ret_t msgbus_msg_envelope_elem_array_remove_at(msg_envelope_elem_body_t *arr, int idx)
msgbus_msg_envelope_new_floating
msg_envelope_elem_body_t * msgbus_msg_envelope_new_floating(double floating)
msgbus_msg_envelope_elem_object_remove
msgbus_ret_t msgbus_msg_envelope_elem_object_remove(msg_envelope_elem_body_t *obj, const char *key)
msgbus_msg_envelope_elem_object_put
msgbus_ret_t msgbus_msg_envelope_elem_object_put(msg_envelope_elem_body_t *obj, const char *key, msg_envelope_elem_body_t *value)
msgbus_msg_envelope_elem_destroy
void msgbus_msg_envelope_elem_destroy(msg_envelope_elem_body_t *elem)
owned_blob_t
Definition: msg_envelope.h:71
msgbus_msg_envelope_elem_array_add_integer
msgbus_ret_t msgbus_msg_envelope_elem_array_add_integer(msg_envelope_elem_body_t *arr, int64_t value)
msgbus_msg_envelope_print
void msgbus_msg_envelope_print(msg_envelope_t *msg, bool pretty_print, bool print_blobs)
content_type_t
content_type_t
Definition: msg_envelope.h:43
msgbus_msg_envelope_elem_array_add
msgbus_ret_t msgbus_msg_envelope_elem_array_add(msg_envelope_elem_body_t *arr, msg_envelope_elem_body_t *value)
msgbus_msg_envelope_elem_object_get
msg_envelope_elem_body_t * msgbus_msg_envelope_elem_object_get(msg_envelope_elem_body_t *obj, const char *key)
msgbus_msg_envelope_elem_array_add_string
msgbus_ret_t msgbus_msg_envelope_elem_array_add_string(msg_envelope_elem_body_t *arr, const char *value)
msgbus_msg_envelope_elem_array_add_bool
msgbus_ret_t msgbus_msg_envelope_elem_array_add_bool(msg_envelope_elem_body_t *arr, bool value)
linkedlist_t
Definition: linkedlist.h:64
msg_envelope_blob_t
Definition: msg_envelope.h:83
msgbus_msg_envelope_destroy
void msgbus_msg_envelope_destroy(msg_envelope_t *msg)
msgbus_msg_envelope_serialize_parts_new
msgbus_ret_t msgbus_msg_envelope_serialize_parts_new(int num_parts, msg_envelope_serialized_part_t **parts)
msgbus_msg_envelope_serialize_destroy
void msgbus_msg_envelope_serialize_destroy(msg_envelope_serialized_part_t *parts, int num_parts)
msgbus_msg_envelope_put_bool
msgbus_ret_t msgbus_msg_envelope_put_bool(msg_envelope_t *obj, const char *key, bool value)
msgbus_msg_envelope_new_array
msg_envelope_elem_body_t * msgbus_msg_envelope_new_array()
msgbus_msg_envelope_get
msgbus_ret_t msgbus_msg_envelope_get(msg_envelope_t *env, const char *key, msg_envelope_elem_body_t **data)
msgbus_msg_envelope_new_integer
msg_envelope_elem_body_t * msgbus_msg_envelope_new_integer(int64_t integer)
msgbus_msg_envelope_serialize
int msgbus_msg_envelope_serialize(msg_envelope_t *env, msg_envelope_serialized_part_t **parts)