fipa_acl  1.4
grammar_bitefficient_envelope.h
Go to the documentation of this file.
1 #ifndef FIPA_ACL_GRAMMAR_ENVELOPE_BITEFFICIENT_H
2 #define FIPA_ACL_GRAMMAR_ENVELOPE_BITEFFICIENT_H
3 #include <fipa_acl/message_generator/acl_envelope.h>
4 #include <fipa_acl/message_parser/grammar/grammar_bitefficient.h>
5 
8  (std::string, name)
10 );
11 
14  (const fipa::acl::ACLBaseEnvelope&, const fipa::acl::ACLBaseEnvelope&, obj.getBaseEnvelope(), obj.setBaseEnvelope(val))
15  (const fipa::acl::ACLBaseEnvelopeList&, const fipa::acl::ACLBaseEnvelopeList&, obj.getExtraEnvelopes(), obj.addExtraEnvelope(val))
16  (const std::string&, const std::string&, obj.getPayload(), obj.setPayload(val))
17 );
18 
21  (const fipa::acl::AgentIDList&, const fipa::acl::AgentIDList&, obj.getTo(), obj.setTo(val))
22  (const fipa::acl::AgentID&, const fipa::acl::AgentID&, obj.getFrom(), obj.setFrom(val))
23  (const std::string& , const std::string&, obj.getACLRepresentationString(), obj.setACLRepresentation(val))
24  (const fipa::acl::Comments&, const fipa::acl::Comments&, obj.getComments(), obj.setComments(val))
25  (const fipa::acl::PayloadLength& , const fipa::acl::PayloadLength&, obj.getPayloadLength(), obj.setPayloadLength(val))
26  (const fipa::acl::PayloadEncoding&, const fipa::acl::PayloadEncoding&, obj.getPayloadEncoding(), obj.setPayloadEncoding(val))
27  (const base::Time&, const base::Time&, obj.getDate(), obj.setDate(val))
28  (const fipa::acl::AgentIDList&, const fipa::acl::AgentIDList&, obj.getIntendedReceivers(), obj.setIntendedReceivers(val))
29  (const fipa::acl::ReceivedObject&, const fipa::acl::ReceivedObject&, obj.getReceivedObject(), obj.setReceivedObject(val))
30  (const fipa::acl::TransportBehaviour&, const fipa::acl::TransportBehaviour&, obj.getTransportBehaviour(), obj.setTransportBehaviour(val))
31  (const fipa::acl::UserdefinedParameterList&, const fipa::acl::UserdefinedParameterList&, obj.getUserdefinedParameters(), obj.setUserdefinedParameters(val))
32 );
33 
34 
37  (const fipa::acl::URL&, const fipa::acl::URL&, obj.getBy(), obj.setBy(val))
38  (const fipa::acl::URL&, const fipa::acl::URL&, obj.getFrom(), obj.setFrom(val))
39  (const base::Time&, const base::Time&, obj.getDate(), obj.setDate(val))
40  (const fipa::acl::ID&, const fipa::acl::ID&, obj.getId(), obj.setId(val))
41  (const fipa::acl::Via&, const fipa::acl::Via&, obj.getVia(), obj.setVia(val))
42  (const fipa::acl::UserdefinedParameterList&, const fipa::acl::UserdefinedParameterList&, obj.getUserdefinedParameters(), obj.setUserdefinedParameters(val))
43 );
44 
45 
46 namespace fipa {
47 // ##########################################
48 // Utility functions for envelope processing
49 // ##########################################
50 
52  {
54 
55  template <typename T0, typename T1>
56  struct result
57  {
58  typedef result_type type;
59  };
60 
61  template <typename T0, typename T1>
62  result_type operator()(T0 base, T1 extra) const
63  {
64  return base.merge(extra);
65  }
66  };
67 
68  extern phoenix::function<mergeBaseEnvelopeImpl> mergeBaseEnvelope;
69 
70 namespace acl {
71 namespace bitefficient {
72 
73 template<typename Iterator>
74 struct Any : qi::grammar<Iterator, std::string()>
75 {
76  Any() : Any::base_type(any_rule, "Any-bitefficient_grammar")
77  {
78 
79  any_rule = binStringNoCodetable [ label::_val = convertToString(label::_1) ];
80 
81  FIPA_DEBUG_RULE(any_rule);
82  }
83 
84  qi::rule<Iterator, std::string() > any_rule;
85  BinStringNoCodetable<Iterator> binStringNoCodetable;
86 };
87 
88 template<typename Iterator>
89 struct Url : qi::grammar<Iterator, std::string()>
90 {
91  Url() : Url::base_type(url_rule, "Url-bitefficient_grammar")
92  {
93  url_rule = nullTerminatedString [ label::_val = convertToString(label::_1)];
94  FIPA_DEBUG_RULE(url_rule);
95  }
96  qi::rule<Iterator, std::string()> url_rule;
97  NullTerminatedString<Iterator> nullTerminatedString;
98 };
99 
100 template<typename Iterator>
101 struct EnvelopeAgentIdentifier : qi::grammar<Iterator, fipa::acl::AgentID()>
102 {
103  EnvelopeAgentIdentifier() : EnvelopeAgentIdentifier::base_type(agent_identifier_rule, "EnvelopeAgentIdentifier-bitefficient_grammar")
104  {
105  using qi::byte_;
106 
107  agent_identifier_rule = byte_(0x02) >> agentName [ phoenix::at_c<0>(label::_val) = convertToString(label::_1) ]
108  >> -addresses [ phoenix::at_c<1>(label::_val) = label::_1 ]
109  >> -resolvers [ phoenix::at_c<2>(label::_val) = label::_1 ]
110  >> -userDefinedParameters [ phoenix::at_c<3>(label::_val) = label::_1 ]
111  >> endOfCollection;
112 
113  addresses = byte_(0x02) >> urlCollection [ label::_val = label::_1 ];
114  resolvers = byte_(0x03) >> *agent_identifier_rule [ phoenix::push_back(label::_val, label::_1) ]
115  >> endOfCollection;
116 
117  userDefinedParameters = *userDefinedParameter [ phoenix::push_back(label::_val, label::_1) ]
118  ;
119 
120  urlCollection = *url [ phoenix::push_back(label::_val, label::_1) ]
121  >> endOfCollection;
122 
123  userDefinedParameter = byte_(0x05) >> nullTerminatedString [ phoenix::at_c<0>(label::_val) = convertToString(label::_1) ]
124  >> any [ phoenix::at_c<1>(label::_val) = label::_1 ]
125  ;
126 
127  #ifdef BOOST_SPIRIT_DEBUG
128  // BOOST_SPIRIT_DEBUG_NODE(agent_identifier_rule);
129  // BOOST_SPIRIT_DEBUG_NODE(addresses);
130  // BOOST_SPIRIT_DEBUG_NODE(resolvers);
131  // BOOST_SPIRIT_DEBUG_NODE(userDefinedParameter);
132  #endif
133  }
134 
135  BinWord<Iterator> binWord;
136  BinStringNoCodetable<Iterator> binStringNoCodetable;
137 
138  qi::rule<Iterator, fipa::acl::AgentID() > agent_identifier_rule;
139  NullTerminatedString<Iterator> agentName;
140 
141  qi::rule<Iterator, std::vector<std::string>() > addresses;
142  qi::rule<Iterator, std::vector<fipa::acl::AgentID>() > resolvers;
143  qi::rule<Iterator, std::vector<fipa::acl::UserdefParam>() > userDefinedParameters;
144  qi::rule<Iterator, fipa::acl::UserdefParam() > userDefinedParameter;
145  qi::rule<Iterator, std::vector<std::string>() > urlCollection;
146 
147  NullTerminatedString<Iterator> nullTerminatedString;
150  EndOfCollection<Iterator> endOfCollection;
151 };
152 
153 template <typename Iterator>
154 struct ReceivedObject : qi::grammar<Iterator, fipa::acl::ReceivedObject()>
155 {
156  ReceivedObject() : ReceivedObject::base_type(received_object_rule, "ReceivedObject-bitefficient_grammar")
157  {
158  using qi::byte_;
159 
160  received_object_rule = by [ phoenix::at_c<0>(label::_val) = label::_1 ]
161  >> date [ phoenix::at_c<2>(label::_val) = convertToBaseTime(label::_1) ]
162  >> -from [ phoenix::at_c<1>(label::_val) = label::_1 ]
163  >> -id [ phoenix::at_c<3>(label::_val) = label::_1 ]
164  >> -via [ phoenix::at_c<4>(label::_val) = label::_1 ]
165  >> userDefinedParameters [ phoenix::at_c<5>(label::_val) = label::_1 ]
166  >> endOfCollection
167  ;
168 
169 
170  from = byte_(0x02) >> url [ label::_val = label::_1 ];
171  id = byte_(0x03) >> nullTerminatedString [ label::_val = convertToString(label::_1)];
172  via = byte_(0x04) >> nullTerminatedString [ label::_val = convertToString(label::_1)];
173 
174  userDefinedParameters = *userDefinedParameter [ phoenix::push_back(label::_val, label::_1) ];
175  userDefinedParameter = qi::byte_(0x00)
176  >> nullTerminatedString /*keyword*/ [ phoenix::at_c<0>(label::_val) = convertToString(label::_1) ]
177  >> nullTerminatedString [ phoenix::at_c<1>(label::_val) = convertToString(label::_1) ]
178  ;
179  }
180 
181  qi::rule<Iterator, fipa::acl::ReceivedObject()> received_object_rule;
184  qi::rule<Iterator, fipa::acl::URL()> from;
185  qi::rule<Iterator, fipa::acl::ID()> id;
186  qi::rule<Iterator, fipa::acl::Via()> via;
187 
188  BinDateTime<Iterator> date;
189  NullTerminatedString<Iterator> nullTerminatedString;
190 
191  qi::rule<Iterator, fipa::acl::UserdefinedParameterList() > userDefinedParameters;
192  qi::rule<Iterator, fipa::acl::UserdefParam()> userDefinedParameter;
193  EndOfCollection<Iterator> endOfCollection;
194 };
195 
196 
197 
198 template <typename Iterator>
199 struct Envelope : qi::grammar<Iterator, fipa::acl::ACLEnvelope()>
200 {
201  Envelope() : Envelope::base_type(message_envelope_rule, "Envelope-bitefficient_grammar")
202  {
203  using qi::byte_;
204  namespace label = qi::labels;
205 
206  message_envelope_rule = *extEnvelope [ phoenix::at_c<1>(label::_val) = label::_1 ]
207  >> baseEnvelope [ phoenix::at_c<0>(label::_val) = label::_1 ]
208  >> payload [ phoenix::at_c<2>(label::_val) = label::_1]
209 
210  ;
211 
212  baseEnvelope = baseEnvelopeHeader [ label::_a = label::_1 ]
213  >> *parameter [ label::_a = mergeBaseEnvelope(label::_a, label::_1)]
214  >> endOfEnvelope [ label::_val = label::_a ]
215  ;
216 
217  extEnvelope = extEnvelopeHeader [ label::_a = label::_1 ]
218  >> *parameter [ label::_a = mergeBaseEnvelope(label::_a, label::_1)]
219  >> endOfEnvelope [ label::_val = label::_a ]
220  ;
221 
222  baseEnvelopeHeader = baseMsgId
223  >> envLen [ phoenix::at_c<4>(label::_val) = label::_1 ]
224  >> aclRepresentation [ phoenix::at_c<2>(label::_val) = label::_1 ]
225  >> date [ phoenix::at_c<6>(label::_val) = convertToBaseTime(label::_1) ]
226  ;
227 
228  extEnvelopeHeader = extMsgId
229  >> envLen [ phoenix::at_c<4>(label::_val) = label::_1 ]
230  >> receivedObject [ phoenix::at_c<8>(label::_val) = label::_1 ]
231  ;
232 
233  envLen = len16 | jumboEnvelope;
234 
235  jumboEnvelope = byte_(0x00) >> byte_(0x00)
236  >> len32 [ label::_val = label::_1 ]
237  ;
238 
239  baseMsgId = byte_(0xfe) [ label::_val = 0xfe ];
240  extMsgId = byte_(0xfd) [ label::_val = 0xfd ];
241 
242  agentIdentifierSequence = *agentIdentifier [ phoenix::push_back(label::_val, label::_1) ]
243  >> endOfCollection
244  ;
245 
246  parameter = predefinedParameter [ label::_val = label::_1 ]
247  | customParameterList [ phoenix::at_c<10>(label::_val) = label::_1 ]
248  ;
249 
250  // only synthesize attribute is a list to facilitate adding to BaseEnvelope
251  customParameterList = userDefinedMessageParameter [ phoenix::push_back(label::_val, label::_1) ]
252  ;
253 
254  userDefinedMessageParameter = byte_(0x00)
255  >> parameterName [ phoenix::at_c<0>(label::_val) = label::_1 ]
256  >> parameterValue [ phoenix::at_c<1>(label::_val) = label::_1 ]
257  ;
258 
259  predefinedParameter = byte_(0x02) >> agentIdentifierSequence [ phoenix::at_c<0>(label::_val) = label::_1 ]
260  | byte_(0x03) >> agentIdentifier [ phoenix::at_c<1>(label::_val) = label::_1 ]
261  | byte_(0x04) >> aclRepresentation [ phoenix::at_c<2>(label::_val) = label::_1 ]
262  | byte_(0x05) >> comments [ phoenix::at_c<3>(label::_val) = convertToString(label::_1) ]
263  | byte_(0x06) >> payloadLength [ phoenix::at_c<4>(label::_val) = convertStringToNumber(label::_1) ]
264  | byte_(0x07) >> payloadEncoding [ phoenix::at_c<5>(label::_val) = convertToString(label::_1) ]
265  // // date is not set here
266  | byte_(0x09) >> intendedReceiver [ phoenix::at_c<7>(label::_val) = label::_1 ]
267  | byte_(0x0a) >> receivedObject [ phoenix::at_c<8>(label::_val) = label::_1 ]
268  | byte_(0x0b) >> transportBehaviour [ phoenix::at_c<9>(label::_val) = label::_1 ]
269  ;
270 
271  aclRepresentation = userDefinedACLRepresentation
272  | byte_(0x10) [ label::_val = representation::TypeTxt[representation::BITEFFICIENT] ] // [FIPA00069]
273  | byte_(0x11) [ label::_val = representation::TypeTxt[representation::STRING_REP] ]// [FIPA00070]
274  | byte_(0x12) [ label::_val = representation::TypeTxt[representation::XML] ] // [FIPA00071]
275  ;
276 
277  intendedReceiver = agentIdentifierSequence.alias();
278 
279  userDefinedACLRepresentation = byte_(0x00)
280  >> nullTerminatedString [ label::_val = convertToString(label::_1) ];
281 
282  payload = *byte_ [ label::_val += label::_1 ];
283 
284  //FIPA_DEBUG_RULE(date);
285  }
286 
287 
288  qi::rule<Iterator, fipa::acl::ACLBaseEnvelope() > predefinedParameter;
289  qi::rule<Iterator, fipa::acl::UserdefinedParameterList() > customParameterList;
290 
291  qi::rule<Iterator, fipa::acl::ACLEnvelope()> message_envelope_rule;
292  qi::rule<Iterator, fipa::acl::ACLBaseEnvelope(), qi::locals<fipa::acl::ACLBaseEnvelope> > extEnvelope;
293  qi::rule<Iterator, fipa::acl::ACLBaseEnvelope()> extEnvelopeHeader;
294  qi::rule<Iterator, fipa::acl::ACLBaseEnvelope()> baseEnvelopeHeader;
295  qi::rule<Iterator, fipa::acl::ACLBaseEnvelope(), qi::locals<fipa::acl::ACLBaseEnvelope> > baseEnvelope;
296  qi::rule<Iterator, fipa::acl::ACLBaseEnvelope()> parameter;
297  EndOfCollection<Iterator> endOfEnvelope;
298  EndOfCollection<Iterator> endOfCollection;
299 
301  BinDateTime<Iterator> date;
302 
303  qi::rule<Iterator, fipa::acl::UserdefParam()> userDefinedMessageParameter;
304  qi::rule<Iterator, std::string()> parameterName;
305  qi::rule<Iterator, std::string()> parameterValue;
306 
307  NullTerminatedString<Iterator> comments;
308  BinNumber<Iterator> payloadLength;
309  NullTerminatedString<Iterator> payloadEncoding;
311 
312  qi::rule<Iterator, boost::uint_least32_t()> envLen;
313  Len16<Iterator> len16;
314  Len32<Iterator> len32;
315  qi::rule<Iterator, boost::uint_least32_t()> jumboEnvelope;
316 
317  qi::rule<Iterator, std::string()> aclRepresentation;
318  qi::rule<Iterator, std::string()> userDefinedACLRepresentation;
319 
320  NullTerminatedString<Iterator> nullTerminatedString;
321  NullTerminatedString<Iterator> keyword;
322 
323  qi::rule<Iterator> baseMsgId;
324  qi::rule<Iterator> extMsgId;
325  BinExpression<Iterator> binExpression;
327 
329  qi::rule<Iterator, std::vector<fipa::acl::AgentID>() > agentIdentifierSequence;
330  qi::rule<Iterator, std::vector<fipa::acl::AgentID>() > intendedReceiver;
331  qi::rule<Iterator, fipa::acl::UserDefinedParameter() > userDefinedParameter;
332 
333  qi::rule<Iterator, std::string() > payload;
334 
335 };
336 
337 } // end namespace bitefficient
338 } // end namespace acl
339 } // end namespace fipa
340 #endif // FIPA_ACL_GRAMMAR_ENVELOPE_BITEFFICIENT_H
341 
NullTerminatedString< Iterator > nullTerminatedString
std::string TransportBehaviour
Definition: acl_envelope.h:16
qi::rule< Iterator, fipa::acl::AgentID() > agent_identifier_rule
std::string ID
std::string Comments
Definition: acl_envelope.h:12
FIPA_ACL_FUSION_ADAPT(fipa::acl::ACLEnvelope,(const fipa::acl::ACLBaseEnvelope &, const fipa::acl::ACLBaseEnvelope &, obj.getBaseEnvelope(), obj.setBaseEnvelope(val))(const fipa::acl::ACLBaseEnvelopeList &, const fipa::acl::ACLBaseEnvelopeList &, obj.getExtraEnvelopes(), obj.addExtraEnvelope(val))(const std::string &, const std::string &, obj.getPayload(), obj.setPayload(val)))
The ACLBaseEnvelope defines the layout for an envelope with which ACLMessage data can be wrapped...
Definition: acl_envelope.h:36
NullTerminatedString< Iterator > keyword
ACLBaseEnvelope merge(const ACLBaseEnvelope &other) const
qi::rule< Iterator, fipa::acl::UserdefParam()> userDefinedParameter
ACLMessage envelope (also typed as fipa::acl::Letter) includes the base envelope and updated fields...
Definition: acl_envelope.h:349
std::string Via
qi::rule< Iterator, fipa::acl::UserdefParam() > userDefinedParameter
qi::rule< Iterator, fipa::acl::UserDefinedParameter() > userDefinedParameter
qi::rule< Iterator, fipa::acl::ACLBaseEnvelope()> extEnvelopeHeader
qi::rule< Iterator, fipa::acl::ReceivedObject()> received_object_rule
qi::rule< Iterator, fipa::acl::ACLBaseEnvelope(), qi::locals< fipa::acl::ACLBaseEnvelope > > extEnvelope
uint32_t PayloadLength
Definition: acl_envelope.h:13
qi::rule< Iterator, boost::uint_least32_t()> jumboEnvelope
std::vector< UserdefParam > UserdefinedParameterList
Definition: userdef_param.h:94
qi::rule< Iterator, fipa::acl::ACLBaseEnvelope()> baseEnvelopeHeader
NullTerminatedString< Iterator > comments
qi::rule< Iterator, fipa::acl::ACLEnvelope()> message_envelope_rule
qi::rule< Iterator, std::string() > payload
NullTerminatedString< Iterator > nullTerminatedString
phoenix::function< convertStringToNumberImpl > convertStringToNumber
std::string URL
phoenix::function< convertToStringImpl > convertToString
fipa::acl::ACLBaseEnvelope result_type
std::vector< AgentID > AgentIDList
Definition: agent_id.h:20
qi::rule< Iterator, std::string()> parameterValue
qi::rule< Iterator, std::string()> userDefinedACLRepresentation
qi::rule< Iterator, fipa::acl::UserdefinedParameterList() > userDefinedParameters
qi::rule< Iterator, fipa::acl::ACLBaseEnvelope() > predefinedParameter
result_type operator()(T0 base, T1 extra) const
BinStringNoCodetable< Iterator > binStringNoCodetable
const std::string TypeTxt[]
Definition: types.h:28
qi::rule< Iterator, std::string()> parameterName
BOOST_FUSION_ADAPT_STRUCT(fipa::acl::envelope::Parameter,(std::string, name)(fipa::acl::envelope::ParameterValue, data))
std::vector< ACLBaseEnvelope > ACLBaseEnvelopeList
Definition: acl_envelope.h:19
qi::rule< Iterator, boost::uint_least32_t()> envLen
std::string ParameterValue
Definition: parameter.h:54
qi::rule< Iterator, fipa::acl::Via()> via
phoenix::function< mergeBaseEnvelopeImpl > mergeBaseEnvelope
qi::rule< Iterator, fipa::acl::URL()> from
qi::rule< Iterator, std::string()> url_rule
qi::rule< Iterator, fipa::acl::UserdefinedParameterList() > customParameterList
phoenix::function< convertToBaseTimeImpl > convertToBaseTime
qi::rule< Iterator, std::string()> aclRepresentation
NullTerminatedString< Iterator > nullTerminatedString
qi::rule< Iterator, std::string() > any_rule
#define FIPA_DEBUG_RULE(X)
std::string PayloadEncoding
Definition: acl_envelope.h:14
qi::rule< Iterator, fipa::acl::UserdefParam()> userDefinedMessageParameter
EnvelopeAgentIdentifier< Iterator > agentIdentifier
qi::rule< Iterator, fipa::acl::ACLBaseEnvelope()> parameter
Implements the general AgentID functionality, which is present throughout the fipa specifications(FIP...
Definition: agent_id.h:37
Foundation of Physical Intelligent Agents.
Definition: conversation.cpp:6
NullTerminatedString< Iterator > payloadEncoding
qi::rule< Iterator, fipa::acl::ACLBaseEnvelope(), qi::locals< fipa::acl::ACLBaseEnvelope > > baseEnvelope