/
utils.h
153 lines (105 loc) · 3.14 KB
/
utils.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#pragma once
#include <string>
#include "Logger.h"
template <typename T>
struct utfXStringBase
{
protected:
utfXStringBase() {};
utfXStringBase(const utfXStringBase &other)
{
operator=(other);
}
utfXStringBase(utfXStringBase &&other)
{
operator=(std::move(other));
}
virtual ~utfXStringBase()
{
if (nullptr != _data_ptr)
{
delete[] _data_ptr;
_data_ptr = nullptr;
}
}
utfXStringBase& operator = (const utfXStringBase& other)
{
if (this != &other)
{
if (nullptr != _data_ptr) {
delete[] _data_ptr;
}
_data_len = other._data_len;
_data_ptr = new (std::nothrow) T[_data_len];
if (nullptr != _data_ptr) {
std::memcpy(_data_ptr, other._data_ptr, _data_len*sizeof(T));
}
}
return *this;
}
utfXStringBase& operator = (utfXStringBase &&other)
{
if (nullptr != _data_ptr) {
delete[] _data_ptr;
}
_data_ptr = other._data_ptr;
_data_len = other._data_len;
other._data_ptr = nullptr;
other._data_len = 0;
return *this;
}
static const size_t _max_len = 4096;
T * _data_ptr = nullptr;
size_t _data_len = 0; // number of elements T
};
struct utf8String : private utfXStringBase<char>
{
explicit utf8String() {};
explicit utf8String(const char * src);
utf8String(const utf8String &other);
utf8String(utf8String &&other);
utf8String& operator =(const char *src);
utf8String& operator =(const utf8String &other);
utf8String& operator =(utf8String &&other);
inline operator const char*() const // utf8
{
return _data_ptr;
}
};
struct utf16String : private utfXStringBase<wchar_t>
{
explicit utf16String() {};
explicit utf16String(const wchar_t * src);
utf16String(const utf16String &other);
utf16String(utf16String &&other);
utf16String& operator =(const wchar_t *src);
utf16String& operator =(const utf16String &other);
utf16String& operator =(utf16String &&other);
inline operator const wchar_t*() const // utf-16
{
return _data_ptr;
}
// return string with HTML tags removed
utf16String htmlTagsStripped() const;
// return string with HTML entities replaced
utf16String htmlEntitiesStripped() const;
};
//void fingerprintToWString(const unsigned char fp[20], wchar_t *dst);
#define _WTWOTRMESSAGING_USE_DYNAMIC_STRINGS
#ifdef _WTWOTRMESSAGING_USE_DYNAMIC_STRINGS
utf8String utf16Toutf8(const wchar_t *src);
utf16String utf8Toutf16(const char *src);
// this method might be used on strings whose length is know but content
// may contain unprintable characters (including null-character '\0')
// those "wrong" characters will be replaced by '.'
utf16String utf8Toutf16_safe(const char *src, size_t length);
#else
const char * utf16Toutf8(const wchar_t *src);
const wchar_t * utf8Toutf16(const char *src);
// this method might be used on strings whose length is know but content
// may contain unprintable characters (including null-character '\0')
// those "wrong" characters will be replaced by '.'
const wchar_t * utf8Toutf16_safe(const char *src, size_t length);
#endif // _WTWOTRMESSAGING_USE_DYNAMIC_STRINGS
std::wstring makeKeyFromPeer(const wchar_t *id, const wchar_t *netClass, int netId);
std::wstring makeKeyFromPeer(const wtwContactDef *contact);