8 #include <boost/type_traits/remove_cv.hpp>
9 #include <boost/variant/get.hpp>
10 #include <boost/variant/recursive_variant.hpp>
11 #include <boost/variant/variant.hpp>
12 #include <base-logging/Logging.hpp>
23 typedef fipa::acl::bitefficient::Message<std::string::const_iterator> bitefficient_message_grammar;
24 bitefficient_message_grammar grammar;
27 std::string::const_iterator iter = storage.begin();
28 std::string::const_iterator end = storage.end();
29 bool r = parse(iter, end, grammar, parseTree);
48 void BitefficientMessageParser::buildParameters(
const std::vector<message::Parameter>& parsedParams,
ACLMessage &msg)
50 std::vector<message::Parameter>::const_iterator it = parsedParams.begin();
52 for (; it != parsedParams.end(); ++it)
55 buildPredefMessageParameters(*it,msg);
56 }
catch(
const std::runtime_error& e)
58 UserdefParam param = buildUserdefParameter(*it);
59 LOG_INFO(
"Creating userdefined parameter name: '%s' value: '%s'", param.getName().c_str(), param.getValue().c_str());
65 void BitefficientMessageParser::buildPredefMessageParameters(
const message::Parameter& param, ACLMessage &msg)
68 if (param.name ==
"sender")
70 buildSender(param, msg);
73 if (param.name ==
"receiver")
75 buildReceiver(param, msg);
78 if (param.name ==
"content")
80 buildContent(param, msg);
83 if (param.name ==
"reply-by")
85 buildReplyBy(param, msg);
88 if (param.name ==
"reply-to")
90 buildReplyTo(param, msg);
97 value = boost::get<std::string>(param.data);
98 }
catch (
const boost::bad_get& e)
100 LOG_ERROR(
"Failed getting data for parameter '%s'", param.name.c_str());
104 if (param.name ==
"in-reply-to")
106 msg.setInReplyTo(value);
109 if (param.name ==
"reply-with")
111 msg.setReplyWith(value);
114 if (param.name ==
"language")
116 msg.setLanguage(value);
119 if (param.name ==
"encoding")
121 msg.setEncoding(value);
124 if (param.name ==
"ontology")
126 msg.setOntology(value);
129 if (param.name ==
"protocol")
131 msg.setProtocol(value);
135 if (param.name ==
"conversation-id")
137 msg.setConversationID(value);
141 std::string errorMsg =
"Message parameter '" + param.name +
"' is not predefined";
142 LOG_ERROR(
"%s",errorMsg.c_str());
143 throw std::runtime_error(errorMsg);
146 void BitefficientMessageParser::buildSender(
const message::Parameter& param, ACLMessage &msg)
149 AgentID sender = buildAgentID(temp);
151 msg.setSender(sender);
154 AgentID BitefficientMessageParser::buildAgentID(
const AgentIdentifier& agent)
157 retAg.setName(agent.name);
161 std::vector<std::string>::const_iterator it = agent.
addresses.begin();
164 retAg.addAddress(*it);
170 buildResolvers(agent, retAg);
173 if (!agent.parameters.empty())
175 buildAgentParameters(agent, retAg);
182 void BitefficientMessageParser::buildResolvers(
const AgentIdentifier& agentIdentifier, AgentID& outAgentID)
184 std::vector<fipa::acl::Resolver>::const_iterator it = agentIdentifier.
resolvers.begin();
185 for (; it != agentIdentifier.
resolvers.end(); ++it)
188 AgentID agent = buildAgentID(resolver);
189 outAgentID.addResolver(agent);
193 void BitefficientMessageParser::buildAgentParameters(
const AgentIdentifier& agentIdentifier, AgentID& outAgentID)
195 std::vector<UserDefinedParameter>::const_iterator it = agentIdentifier.parameters.begin();
196 for (; it != agentIdentifier.parameters.end(); ++it)
198 UserdefParam parameter = buildUserdefParameter(*it);
199 outAgentID.addUserdefParam(parameter);
203 UserdefParam BitefficientMessageParser::buildUserdefParameter(
const UserDefinedParameter& param)
206 const std::string& value = boost::get<std::string>(param.data);
208 UserdefParam retParam;
209 retParam.setName(param.name);
210 retParam.setValue(value);
215 UserdefParam BitefficientMessageParser::buildUserdefParameter(
const message::Parameter& param)
217 const std::string& value = boost::get<std::string>(param.data);
219 UserdefParam retParam;
220 retParam.setName(param.name);
221 retParam.setValue(value);
227 void BitefficientMessageParser::buildReceiver(
const message::Parameter& param, ACLMessage &msg)
230 const std::vector<AgentIdentifier>& unbuiltReceivers = boost::get<std::vector<AgentIdentifier> >(param.data);
231 std::vector<AgentIdentifier>::const_iterator it = unbuiltReceivers.begin();
232 for (; it!= unbuiltReceivers.end(); ++it)
234 AgentID receiver = buildAgentID(*it);
235 msg.addReceiver(receiver);
239 void BitefficientMessageParser::buildReplyBy(
const message::Parameter& param, ACLMessage &msg)
241 const DateTime& dateTime = boost::get<DateTime>(param.data);
242 base::Time date = dateTime.toTime();
243 msg.setReplyBy(date);
246 void BitefficientMessageParser::buildReplyTo(
const message::Parameter& param, ACLMessage &msg)
248 const std::vector<AgentIdentifier>& agentIds = boost::get<std::vector<AgentIdentifier> >(param.data);
250 std::vector<AgentIdentifier>::const_iterator it = agentIds.begin();
251 for (; it != agentIds.end(); ++it)
253 AgentID agentId = buildAgentID(*it);
254 msg.addReplyTo(agentId);
258 void BitefficientMessageParser::buildContent(
const message::Parameter& param,ACLMessage &msg)
260 const ByteSequence& byteSequence = boost::get<ByteSequence>(param.data);
262 byteSequence.toRawDataString(&content);
263 msg.setContent(content);
std::vector< message::Parameter > parameters
rebuilds an ACLMessage from a parsed bit-efficient encoded received message
void addUserdefParam(const UserdefParam &p)
bool parseData(const std::string &storage, ACLMessage &msg)
parses a correctly encoded message according to grammar_bitefficient.h and creates a Message object f...
This class provides a representation of a message conforming to the FIPA specification SC00061...
bool buildMessage(const Message &parsedMsg, ACLMessage &msg)
creates an unpopulated message object and passes it around to have its fields populated, along with the parsed message where the data is extracted from
qi::rule< Iterator, std::vector< fipa::acl::Resolver >) > resolvers
void setPerformative(Performative perf)
Set performative.
qi::rule< Iterator, std::vector< std::string >) > addresses