fipa_acl  1.4
xml_envelope_format.cpp
Go to the documentation of this file.
1 #include "xml_envelope_format.h"
2 #include "xml_format.h"
3 #include <boost/foreach.hpp>
4 #include <boost/lexical_cast.hpp>
5 
6 namespace fipa {
7 namespace acl {
8 
9 std::string XMLEnvelopeFormat::apply(const ACLEnvelope& envelope) const
10 {
11  TiXmlDocument doc;
12  TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "", "" );
13  doc.LinkEndChild( decl );
14 
15  TiXmlElement * envelopeElem = new TiXmlElement( "envelope" );
16  doc.LinkEndChild( envelopeElem );
17 
18  // Index for the params
19  int index = 1;
20  // Append base envelope
21  TiXmlElement* elem = getBaseEnvelope(envelope.getBaseEnvelope());
22  elem->SetAttribute("index", index++);
23  envelopeElem->LinkEndChild(elem);
24  // And all extra envelopes
25  BOOST_FOREACH(TiXmlElement* elem, getAllExternalEnvelopes(envelope))
26  {
27  elem->SetAttribute("index", index++);
28  envelopeElem->LinkEndChild(elem);
29  }
30 
31  TiXmlPrinter printer;
32  printer.SetIndent("");
33  printer.SetLineBreak("");
34  // When using a line break (for debugging), make sure to remove the last line break,
35  // so that the payload starts immediately after the last '>'.
36 
37  doc.Accept( &printer );
38  return printer.Str() + envelope.getPayload();
39 }
40 
41 std::vector< TiXmlElement* > XMLEnvelopeFormat::getAllExternalEnvelopes(const ACLEnvelope& envelope) const
42 {
43  std::vector<TiXmlElement*> vec;
44  const ACLBaseEnvelopeList& list = envelope.getExtraEnvelopes();
45  if(!list.empty())
46  {
47  ACLBaseEnvelopeList::const_iterator cit = list.begin();
48  for(; cit != list.end(); ++cit)
49  {
50  vec.push_back(getBaseEnvelope(*cit));
51  }
52  }
53  return vec;
54 }
55 
56 TiXmlElement* XMLEnvelopeFormat::getBaseEnvelope(const ACLBaseEnvelope& envelope) const
57 {
58  TiXmlElement* element = new TiXmlElement("params");
59  // Append children parameters
60  BOOST_FOREACH(TiXmlElement* elem, getParameters(envelope))
61  {
62  element->LinkEndChild(elem);
63  }
64  return element;
65 }
66 
67 std::vector<TiXmlElement*> XMLEnvelopeFormat::getParameters(const ACLBaseEnvelope& envelope) const
68 {
69  std::vector<TiXmlElement*> vec;
70 
71  if(envelope.contains(envelope::TO))
72  {
73  TiXmlElement* to = new TiXmlElement("to");
74  // Envelopes does not use name id or url href
75  BOOST_FOREACH(TiXmlElement* elem, XMLFormat::getAgentIDSequence(envelope.getTo(), false, false))
76  {
77  to->LinkEndChild(elem);
78  }
79  vec.push_back(to);
80  }
81 
82  if(envelope.contains(envelope::FROM))
83  {
84  TiXmlElement* from = new TiXmlElement("from");
85  // Envelopes does not use name id or url href
86  from->LinkEndChild(XMLFormat::getAgentID(envelope.getFrom(), false, false));
87  vec.push_back(from);
88  }
89 
90  if(envelope.contains(envelope::COMMENTS) && envelope.getComments() != "")
91  {
92  TiXmlElement* comments = new TiXmlElement("comments");
93  comments->LinkEndChild(new TiXmlText(envelope.getComments()));
94  vec.push_back(comments);
95  }
96 
97  if(envelope.contains(envelope::ACL_REPRESENTATION) && envelope.getACLRepresentationString() != "")
98  {
99  TiXmlElement* aclRep = new TiXmlElement("acl-representation");
100  aclRep->LinkEndChild(new TiXmlText(envelope.getACLRepresentationString()));
101  vec.push_back(aclRep);
102  }
103 
104  if(envelope.contains(envelope::PAYLOAD_LENGTH))
105  {
106  TiXmlElement* payloadLength = new TiXmlElement("payload-length");
107  payloadLength->LinkEndChild(new TiXmlText(boost::lexical_cast<std::string>(envelope.getPayloadLength())));
108  vec.push_back(payloadLength);
109  }
110 
111  if(envelope.contains(envelope::PAYLOAD_ENCODING) && envelope.getPayloadEncoding() != "")
112  {
113  TiXmlElement* payloadEncoding= new TiXmlElement("payload-encoding");
114  payloadEncoding->LinkEndChild(new TiXmlText(envelope.getPayloadEncoding()));
115  vec.push_back(payloadEncoding);
116  }
117 
118  if(envelope.contains(envelope::DATE))
119  {
120  vec.push_back(XMLFormat::getDate(envelope.getDate()));
121  }
122 
123  // We don't support ENCRYPTED field, otherwise this would go here
124 
126  {
127  TiXmlElement* intendedReceivers = new TiXmlElement("intended-receiver");
128  // Envelopes does not use name id or url href
129  BOOST_FOREACH(TiXmlElement* elem, XMLFormat::getAgentIDSequence(envelope.getIntendedReceivers(), false, false))
130  {
131  intendedReceivers->LinkEndChild(elem);
132  }
133  vec.push_back(intendedReceivers);
134  }
135 
136  if(envelope.contains(envelope::RECEIVED_OBJECT))
137  {
138  vec.push_back(XMLFormat::getReceivedObject(envelope.getReceivedObject()));
139  }
140 
142  {
143  BOOST_FOREACH(TiXmlElement* elem, XMLFormat::getUserdefinedParameters(envelope.getUserdefinedParameters()))
144  {
145  vec.push_back(elem);
146  }
147  }
148 
149  return vec;
150 }
151 
152 } // end namespace acl
153 } // end namespace fipa
const std::string & getPayload() const
Definition: acl_envelope.h:473
The ACLBaseEnvelope defines the layout for an envelope with which ACLMessage data can be wrapped...
Definition: acl_envelope.h:36
const ACLBaseEnvelopeList & getExtraEnvelopes() const
Definition: acl_envelope.h:411
ACLMessage envelope (also typed as fipa::acl::Letter) includes the base envelope and updated fields...
Definition: acl_envelope.h:349
const PayloadLength & getPayloadLength() const
Definition: acl_envelope.h:226
const PayloadEncoding & getPayloadEncoding() const
Definition: acl_envelope.h:236
const ACLBaseEnvelope & getBaseEnvelope() const
Definition: acl_envelope.h:430
const std::string & getACLRepresentationString() const
Definition: acl_envelope.h:209
bool contains(envelope::ParameterId id) const
Definition: acl_envelope.h:144
const base::Time & getDate() const
Definition: acl_envelope.h:246
static TiXmlElement * getAgentID(const AgentID &aid, bool useNameId, bool useUrlHref)
Definition: xml_format.cpp:61
const Comments & getComments() const
Definition: acl_envelope.h:191
static TiXmlElement * getReceivedObject(const ReceivedObject &receivedObject)
Definition: xml_format.cpp:99
static std::vector< TiXmlElement * > getAgentIDSequence(const AgentIDList &aidl, bool useNameId, bool useUrlHref)
Definition: xml_format.cpp:51
std::vector< ACLBaseEnvelope > ACLBaseEnvelopeList
Definition: acl_envelope.h:19
const AgentID & getFrom() const
Definition: acl_envelope.h:179
std::string apply(const ACLEnvelope &envelope) const
static TiXmlElement * getDate(const base::Time &date)
Definition: xml_format.cpp:8
static std::vector< TiXmlElement * > getUserdefinedParameters(const UserdefinedParameterList &params)
Definition: xml_format.cpp:145
Foundation of Physical Intelligent Agents.
Definition: conversation.cpp:6
const ReceivedObject & getReceivedObject() const
Definition: acl_envelope.h:281
const AgentIDList & getIntendedReceivers() const
Definition: acl_envelope.h:256
const AgentIDList & getTo() const
Definition: acl_envelope.h:150
const UserdefinedParameterList & getUserdefinedParameters() const
Definition: acl_envelope.h:307