This patch adds a new message bus API to Asterisk.
[asterisk/asterisk.git] / main / stasis_message.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 2013, Digium, Inc.
5  *
6  * David M. Lee, II <dlee@digium.com>
7  *
8  * See http://www.asterisk.org for more information about
9  * the Asterisk project. Please do not directly contact
10  * any of the maintainers of this project for assistance;
11  * the project provides a web site, mailing lists and IRC
12  * channels for your use.
13  *
14  * This program is free software, distributed under the terms of
15  * the GNU General Public License Version 2. See the LICENSE file
16  * at the top of the source tree.
17  */
18
19 /*! \file
20  *
21  * \brief Stasis Message API.
22  *
23  * \author David M. Lee, II <dlee@digium.com>
24  */
25
26 /*** MODULEINFO
27         <support_level>core</support_level>
28  ***/
29
30 #include "asterisk.h"
31
32 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
33
34 #include "asterisk/astobj2.h"
35 #include "asterisk/stasis.h"
36 #include "asterisk/utils.h"
37
38 /*! \private */
39 struct stasis_message_type {
40         char *name;
41 };
42
43 static void message_type_dtor(void *obj)
44 {
45         struct stasis_message_type *type = obj;
46         ast_free(type->name);
47         type->name = NULL;
48 }
49
50 struct stasis_message_type *stasis_message_type_create(const char *name)
51 {
52         RAII_VAR(struct stasis_message_type *, type, NULL, ao2_cleanup);
53
54         type = ao2_alloc(sizeof(*type), message_type_dtor);
55         if (!type) {
56                 return NULL;
57         }
58
59         type->name = ast_strdup(name);
60         if (!type->name) {
61                 return NULL;
62         }
63
64         ao2_ref(type, +1);
65         return type;
66 }
67
68 const char *stasis_message_type_name(const struct stasis_message_type *type)
69 {
70         return type->name;
71 }
72
73 /*! \private */
74 struct stasis_message {
75         /*! Time the message was created */
76         struct timeval timestamp;
77         /*! Type of the message */
78         struct stasis_message_type *type;
79         /*! Message content */
80         void *data;
81 };
82
83 static void stasis_message_dtor(void *obj)
84 {
85         struct stasis_message *message = obj;
86         ao2_cleanup(message->type);
87         ao2_cleanup(message->data);
88 }
89
90 struct stasis_message *stasis_message_create(struct stasis_message_type *type, void *data)
91 {
92         RAII_VAR(struct stasis_message *, message, NULL, ao2_cleanup);
93
94         if (type == NULL || data == NULL) {
95                 return NULL;
96         }
97
98         message = ao2_alloc(sizeof(*message), stasis_message_dtor);
99         if (message == NULL) {
100                 return NULL;
101         }
102
103         message->timestamp = ast_tvnow();
104         ao2_ref(type, +1);
105         message->type = type;
106         ao2_ref(data, +1);
107         message->data = data;
108
109         ao2_ref(message, +1);
110         return message;
111 }
112
113 struct stasis_message_type *stasis_message_type(const struct stasis_message *msg)
114 {
115         if (msg == NULL) {
116                 return NULL;
117         }
118         return msg->type;
119 }
120
121 void *stasis_message_data(const struct stasis_message *msg)
122 {
123         if (msg == NULL) {
124                 return NULL;
125         }
126         return msg->data;
127 }
128
129 const struct timeval *stasis_message_timestamp(const struct stasis_message *msg)
130 {
131         if (msg == NULL) {
132                 return NULL;
133         }
134         return &msg->timestamp;
135 }