2 Copyright (c) 2008 TrueCrypt Developers Association. All rights reserved.
4 Governed by the TrueCrypt License 3.0 the full text of which is contained in
5 the file License.txt included in TrueCrypt binary and source code distribution
12 #include "Serializer.h"
17 T Serializer::Deserialize ()
20 DataStream->ReadCompleteBuffer (BufferPtr ((byte *) &size, sizeof (size)));
22 if (Endian::Big (size) != sizeof (T))
23 throw ParameterIncorrect (SRC_POS);
26 DataStream->ReadCompleteBuffer (BufferPtr ((byte *) &data, sizeof (data)));
28 return Endian::Big (data);
31 void Serializer::Deserialize (const string &name, bool &data)
34 data = Deserialize <byte> () == 1;
37 void Serializer::Deserialize (const string &name, byte &data)
40 data = Deserialize <byte> ();
43 void Serializer::Deserialize (const string &name, int32 &data)
46 data = (int32) Deserialize <uint32> ();
49 void Serializer::Deserialize (const string &name, int64 &data)
52 data = (int64) Deserialize <uint64> ();
55 void Serializer::Deserialize (const string &name, uint32 &data)
58 data = Deserialize <uint32> ();
61 void Serializer::Deserialize (const string &name, uint64 &data)
64 data = Deserialize <uint64> ();
67 void Serializer::Deserialize (const string &name, string &data)
70 data = DeserializeString ();
73 void Serializer::Deserialize (const string &name, wstring &data)
76 data = DeserializeWString ();
79 void Serializer::Deserialize (const string &name, const BufferPtr &data)
83 uint64 size = Deserialize <uint64> ();
84 if (data.Size() != size)
85 throw ParameterIncorrect (SRC_POS);
87 DataStream->ReadCompleteBuffer (data);
90 bool Serializer::DeserializeBool (const string &name)
93 Deserialize (name, data);
97 int32 Serializer::DeserializeInt32 (const string &name)
100 return Deserialize <uint32> ();
103 int64 Serializer::DeserializeInt64 (const string &name)
106 return Deserialize <uint64> ();
109 uint32 Serializer::DeserializeUInt32 (const string &name)
112 return Deserialize <uint32> ();
115 uint64 Serializer::DeserializeUInt64 (const string &name)
118 return Deserialize <uint64> ();
121 string Serializer::DeserializeString ()
123 uint64 size = Deserialize <uint64> ();
125 vector <char> data ((size_t) size);
126 DataStream->ReadCompleteBuffer (BufferPtr ((byte *) &data[0], (size_t) size));
128 return string (&data[0]);
131 string Serializer::DeserializeString (const string &name)
134 return DeserializeString ();
137 list <string> Serializer::DeserializeStringList (const string &name)
140 list <string> deserializedList;
141 uint64 listSize = Deserialize <uint64> ();
143 for (size_t i = 0; i < listSize; i++)
144 deserializedList.push_back (DeserializeString ());
146 return deserializedList;
149 wstring Serializer::DeserializeWString ()
151 uint64 size = Deserialize <uint64> ();
153 vector <wchar_t> data ((size_t) size / sizeof (wchar_t));
154 DataStream->ReadCompleteBuffer (BufferPtr ((byte *) &data[0], (size_t) size));
156 return wstring (&data[0]);
159 list <wstring> Serializer::DeserializeWStringList (const string &name)
162 list <wstring> deserializedList;
163 uint64 listSize = Deserialize <uint64> ();
165 for (size_t i = 0; i < listSize; i++)
166 deserializedList.push_back (DeserializeWString ());
168 return deserializedList;
171 wstring Serializer::DeserializeWString (const string &name)
174 return DeserializeWString ();
177 template <typename T>
178 void Serializer::Serialize (T data)
180 uint64 size = Endian::Big (uint64 (sizeof (data)));
181 DataStream->Write (ConstBufferPtr ((byte *) &size, sizeof (size)));
183 data = Endian::Big (data);
184 DataStream->Write (ConstBufferPtr ((byte *) &data, sizeof (data)));
187 void Serializer::Serialize (const string &name, bool data)
189 SerializeString (name);
190 byte d = data ? 1 : 0;
194 void Serializer::Serialize (const string &name, byte data)
196 SerializeString (name);
200 void Serializer::Serialize (const string &name, const char *data)
202 Serialize (name, string (data));
205 void Serializer::Serialize (const string &name, int32 data)
207 SerializeString (name);
208 Serialize ((uint32) data);
211 void Serializer::Serialize (const string &name, int64 data)
213 SerializeString (name);
214 Serialize ((uint64) data);
217 void Serializer::Serialize (const string &name, uint32 data)
219 SerializeString (name);
223 void Serializer::Serialize (const string &name, uint64 data)
225 SerializeString (name);
229 void Serializer::Serialize (const string &name, const string &data)
231 SerializeString (name);
232 SerializeString (data);
235 void Serializer::Serialize (const string &name, const wchar_t *data)
237 Serialize (name, wstring (data));
240 void Serializer::Serialize (const string &name, const wstring &data)
242 SerializeString (name);
243 SerializeWString (data);
246 void Serializer::Serialize (const string &name, const list <string> &stringList)
248 SerializeString (name);
250 uint64 listSize = stringList.size();
251 Serialize (listSize);
253 foreach (const string &item, stringList)
254 SerializeString (item);
257 void Serializer::Serialize (const string &name, const list <wstring> &stringList)
259 SerializeString (name);
261 uint64 listSize = stringList.size();
262 Serialize (listSize);
264 foreach (const wstring &item, stringList)
265 SerializeWString (item);
268 void Serializer::Serialize (const string &name, const ConstBufferPtr &data)
270 SerializeString (name);
272 uint64 size = data.Size();
275 DataStream->Write (data);
278 void Serializer::SerializeString (const string &data)
280 Serialize ((uint64) data.size() + 1);
281 DataStream->Write (ConstBufferPtr ((byte *) (data.data() ? data.data() : data.c_str()), data.size() + 1));
284 void Serializer::SerializeWString (const wstring &data)
286 uint64 size = (data.size() + 1) * sizeof (wchar_t);
288 DataStream->Write (ConstBufferPtr ((byte *) (data.data() ? data.data() : data.c_str()), (size_t) size));
291 void Serializer::ValidateName (const string &name)
293 string dName = DeserializeString();
296 throw ParameterIncorrect (SRC_POS);