Open Lighting Architecture
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Message.h
1 /*
2  * This library is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU Lesser General Public
4  * License as published by the Free Software Foundation; either
5  * version 2.1 of the License, or (at your option) any later version.
6  *
7  * This library is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
10  * Lesser General Public License for more details.
11  *
12  * You should have received a copy of the GNU Lesser General Public
13  * License along with this library; if not, write to the Free Software
14  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15  *
16  * Message.h
17  * Holds the data for a message.
18  * Copyright (C) 2011 Simon Newton
19  */
20 
21 #ifndef INCLUDE_OLA_MESSAGING_MESSAGE_H_
22 #define INCLUDE_OLA_MESSAGING_MESSAGE_H_
23 
24 #include <ola/messaging/Descriptor.h>
25 #include <ola/messaging/MessageVisitor.h>
26 #include <ola/network/IPV4Address.h>
27 #include <ola/rdm/UID.h>
28 #include <string>
29 #include <vector>
30 
31 using std::string;
32 using std::vector;
33 
34 
35 namespace ola {
36 namespace messaging {
37 
38 
39 class MessageVisitor;
40 
41 class Message {
42  public:
43  explicit Message(const vector<const class MessageFieldInterface*> &fields)
44  : m_fields(fields) {
45  }
46  ~Message();
47 
48  void Accept(MessageVisitor *visitor) const;
49 
50  unsigned int FieldCount() const { return m_fields.size(); }
51 
52  private:
53  vector<const class MessageFieldInterface*> m_fields;
54 };
55 
56 
57 
62  public:
63  virtual ~MessageFieldInterface() {}
64 
65  // Call back into a MessageVisitor
66  virtual void Accept(MessageVisitor *visitor) const = 0;
67 };
68 
69 
70 
75  public:
76  BoolMessageField(const BoolFieldDescriptor *descriptor,
77  bool value)
78  : m_descriptor(descriptor),
79  m_value(value) {
80  }
81 
82  const BoolFieldDescriptor *GetDescriptor() const {
83  return m_descriptor;
84  }
85  bool Value() const { return m_value; }
86 
87  void Accept(MessageVisitor *visitor) const {
88  visitor->Visit(this);
89  }
90 
91  private:
92  const BoolFieldDescriptor *m_descriptor;
93  bool m_value;
94 };
95 
96 
101  public:
102  IPV4MessageField(const IPV4FieldDescriptor *descriptor,
103  const ola::network::IPV4Address &value)
104  : m_descriptor(descriptor),
105  m_value(value) {
106  }
107 
108  IPV4MessageField(const IPV4FieldDescriptor *descriptor,
109  uint32_t value)
110  : m_descriptor(descriptor),
111  m_value(ola::network::IPV4Address(value)) {
112  }
113 
114  const IPV4FieldDescriptor *GetDescriptor() const {
115  return m_descriptor;
116  }
117  ola::network::IPV4Address Value() const { return m_value; }
118 
119  void Accept(MessageVisitor *visitor) const {
120  visitor->Visit(this);
121  }
122 
123  private:
124  const IPV4FieldDescriptor *m_descriptor;
126 };
127 
128 
133  public:
134  UIDMessageField(const UIDFieldDescriptor *descriptor,
135  const ola::rdm::UID &uid)
136  : m_descriptor(descriptor),
137  m_uid(uid) {
138  }
139 
140  const UIDFieldDescriptor *GetDescriptor() const {
141  return m_descriptor;
142  }
143  const ola::rdm::UID& Value() const { return m_uid; }
144 
145  void Accept(MessageVisitor *visitor) const {
146  visitor->Visit(this);
147  }
148 
149  private:
150  const UIDFieldDescriptor *m_descriptor;
151  ola::rdm::UID m_uid;
152 };
153 
154 
159  public:
160  StringMessageField(const StringFieldDescriptor *descriptor,
161  const string &value)
162  : m_descriptor(descriptor),
163  m_value(value) {
164  }
165 
166  const StringFieldDescriptor *GetDescriptor() const { return m_descriptor; }
167  const string& Value() const { return m_value; }
168 
169  void Accept(MessageVisitor *visitor) const {
170  visitor->Visit(this);
171  }
172 
173  private:
174  const StringFieldDescriptor *m_descriptor;
175  const string m_value;
176 };
177 
178 
182 template <typename type>
184  public:
186  type value)
187  : m_descriptor(descriptor),
188  m_value(value) {
189  }
190 
191  const IntegerFieldDescriptor<type> *GetDescriptor() const {
192  return m_descriptor;
193  }
194  type Value() const { return m_value; }
195 
196  void Accept(MessageVisitor *visitor) const {
197  visitor->Visit(this);
198  }
199 
200  private:
201  const IntegerFieldDescriptor<type> *m_descriptor;
202  type m_value;
203 };
204 
205 
212 
213 
218  public:
219  GroupMessageField(const FieldDescriptorGroup *descriptor,
220  const vector<const class MessageFieldInterface*> &fields)
221  : m_descriptor(descriptor),
222  m_fields(fields) {
223  }
225 
226  const FieldDescriptorGroup *GetDescriptor() const { return m_descriptor; }
227 
228  unsigned int FieldCount() const { return m_fields.size(); }
229  const class MessageFieldInterface *GetField(unsigned int index) const {
230  if (index < m_fields.size())
231  return m_fields[index];
232  return NULL;
233  }
234 
235  void Accept(MessageVisitor *visitor) const;
236 
237  private:
238  const FieldDescriptorGroup *m_descriptor;
239  vector<const class MessageFieldInterface*> m_fields;
240 };
241 } // namespace messaging
242 } // namespace ola
243 
244 #endif // INCLUDE_OLA_MESSAGING_MESSAGE_H_