1 // Copyright 2014 Idol Software, Inc.
3 // This file is part of Doctor Dump SDK.
5 // Doctor Dump SDK is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU Lesser General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU Lesser General Public License for more details.
15 // You should have received a copy of the GNU Lesser General Public License
16 // along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #include "Serializer.h"
21 CString
Serializer::GetHex() const
24 for (size_t i
= 0, size
= m_storage
.size(); i
< size
; ++i
)
25 res
.AppendFormat(_T("%02X"), (DWORD
)m_storage
[i
]);
29 Serializer::Serializer() : m_buf(NULL
), m_size(0) {}
31 Serializer::Serializer(const CString
& hex
)
33 size_t bufLen
= hex
.GetLength() / 2;
34 for (size_t i
= 0; i
< bufLen
; ++i
)
37 if (1 != swscanf_s((LPCTSTR
)hex
+ i
* 2, L
"%02X", &t
))
38 throw std::runtime_error("invalid buffer");
39 m_storage
.push_back((BYTE
)t
);
41 m_buf
= &m_storage
[0];
42 m_size
= m_storage
.size();
45 Serializer::Serializer(const BYTE
* buf
, size_t size
) : m_buf(buf
), m_size(size
) {}
47 Serializer
& Serializer::SerSimpleType(BYTE
* ptr
, size_t size
)
52 throw std::runtime_error("invalid buffer");
53 memcpy(ptr
, m_buf
, size
);
59 m_storage
.insert(m_storage
.end(), ptr
, ptr
+ size
);
64 Serializer
& Serializer::operator << (CStringA
& val
)
66 DWORD len
= val
.GetLength();
67 SerSimpleType((BYTE
*)&len
, sizeof(len
));
68 SerSimpleType((BYTE
*)val
.GetBuffer(len
), len
* sizeof(char));
69 val
.ReleaseBuffer(len
);
73 Serializer
& Serializer::operator << (CStringW
& val
)
75 DWORD len
= val
.GetLength();
76 SerSimpleType((BYTE
*)&len
, sizeof(len
));
77 SerSimpleType((BYTE
*)val
.GetBuffer(len
), len
* sizeof(wchar_t));
78 val
.ReleaseBuffer(len
);
82 Serializer
& operator << (Serializer
& ser
, MINIDUMP_EXCEPTION_INFORMATION
& val
)
84 ser
.SerSimpleType((BYTE
*)&val
.ExceptionPointers
, sizeof(val
.ExceptionPointers
));
85 return ser
<< val
.ThreadId
<< val
.ClientPointers
;
88 template <typename T1
, typename T2
>
89 Serializer
& operator << (Serializer
& ser
, std::pair
<T1
, T2
>& val
)
91 return ser
<< val
.first
<< val
.second
;
95 Serializer
& operator << (Serializer
& ser
, std::vector
<T
>& val
)
97 size_t size
= val
.size();
98 ser
.SerSimpleType((BYTE
*)&size
, sizeof(size
));
101 for (size_t i
= 0; i
< val
.size(); ++i
)
106 template <typename K
, typename V
>
107 Serializer
& operator << (Serializer
& ser
, std::map
<K
, V
>& val
)
109 size_t size
= val
.size();
110 ser
.SerSimpleType((BYTE
*)&size
, sizeof(size
));
113 for (size_t i
= 0; i
< size
; ++i
)
115 std::pair
<K
, V
> item
;
122 for (std::map
<K
, V
>::iterator it
= val
.begin(); it
!= val
.end(); ++it
)
124 std::pair
<K
, V
> item
= *it
;
131 Serializer
& operator << (Serializer
& ser
, Config
& cfg
)
133 return ser
<< cfg
.Prefix
136 << cfg
.PrivacyPolicyUrl
137 << cfg
.V
[0] << cfg
.V
[1] << cfg
.V
[2] << cfg
.V
[3]
139 << cfg
.ApplicationGUID
141 << cfg
.LeaveDumpFilesInTempFolder
142 << cfg
.OpenProblemInBrowser
145 << cfg
.SendAdditionalDataWithoutApproval
156 Serializer
& operator << (Serializer
& ser
, Params
& param
)
158 return ser
<< param
.Process