Atlas  0.7.0
Networking protocol for the Worldforge system.
MEncoder.cpp
1 // This file may be redistributed and modified only under the terms of
2 // the GNU Lesser General Public License (See COPYING for details).
3 // Copyright (C) 2000 Stefanus Du Toit
4 
5 // $Id$
6 
7 #include <Atlas/Message/MEncoder.h>
8 
9 #include <Atlas/Message/Element.h>
10 
11 namespace Atlas { namespace Message {
12 
13 Encoder::Encoder(Atlas::Bridge & b)
14  : EncoderBase(b)
15 {
16 }
17 
18 
19 void Encoder::listElementItem(const Element& obj)
20 {
21  switch (obj.getType()) {
22  case Element::TYPE_INT: m_b.listIntItem(obj.Int()); break;
23  case Element::TYPE_FLOAT: m_b.listFloatItem(obj.Float()); break;
24  case Element::TYPE_STRING: m_b.listStringItem(obj.String()); break;
25  case Element::TYPE_MAP: {
26  m_b.listMapItem();
27  for (auto& entry: obj.Map()) {
28  mapElementItem(entry.first, entry.second);
29  }
30  m_b.mapEnd();
31  }
32  break;
33  case Element::TYPE_LIST: {
34  m_b.listListItem();
35  for (auto& element: obj.List()) {
36  listElementItem(element);
37  }
38  m_b.listEnd();
39  }
40  break;
41  case Element::TYPE_NONE:
42  m_b.listNoneItem();
43  break;
44  default: break;
45  }
46 }
47 
48 void Encoder::listElementMapItem(const MapType& obj)
49 {
50  m_b.listMapItem();
51  for (auto& entry: obj) {
52  mapElementItem(entry.first, entry.second);
53  }
54  m_b.mapEnd();
55 }
56 
57 void Encoder::listElementListItem(const ListType& obj)
58 {
59  m_b.listListItem();
60  for (auto& element: obj) {
61  listElementItem(element);
62  }
63  m_b.listEnd();
64 }
65 
66 void Encoder::mapElementItem(const std::string& name, const Element& obj)
67 {
68  switch (obj.getType()) {
69  case Element::TYPE_INT: m_b.mapIntItem(name, obj.Int()); break;
70  case Element::TYPE_FLOAT: m_b.mapFloatItem(name, obj.Float()); break;
71  case Element::TYPE_STRING: m_b.mapStringItem(name, obj.String()); break;
72  case Element::TYPE_MAP: {
73  m_b.mapMapItem(name);
74  for (auto& entry: obj.Map()) {
75  mapElementItem(entry.first, entry.second);
76  }
77  m_b.mapEnd();
78  }
79  break;
80  case Element::TYPE_LIST: {
81  m_b.mapListItem(name);
82  for (auto& element: obj.List()) {
83  listElementItem(element);
84  }
85  m_b.listEnd();
86  }
87  break;
88  case Element::TYPE_NONE:
89  m_b.mapNoneItem(name);
90  break;
91  default:
92  break;
93  }
94 }
95 
96 void Encoder::mapElementMapItem(const std::string& name, const MapType& obj)
97 {
98  m_b.mapMapItem(name);
99  for (auto& entry: obj) {
100  mapElementItem(entry.first, entry.second);
101  }
102  m_b.mapEnd();
103 }
104 
105 void Encoder::mapElementListItem(const std::string& name, const ListType& obj)
106 {
107  m_b.mapListItem(name);
108  for (auto& element: obj) {
109  listElementItem(element);
110  }
111  m_b.listEnd();
112 }
113 
114 void Encoder::streamMessageElement(const MapType& obj)
115 {
116  m_b.streamMessage();
117  for (auto& entry: obj) {
118  mapElementItem(entry.first, entry.second);
119  }
120  m_b.mapEnd();
121 }
122 
123 } } // namespace Atlas::Message
Definition: Bridge.h:20