Home
About
Blog
Products
Forum
Support
Contact
Sunbelt Computer Software
PL/B Language Development and Support
Home
About
Blog
Products
Forum
Support
Contact
sqlitebrowser/src/Data.cpp at 5e0c56a47faa3f2982dcf12b37bb4ec2edec87f6 · amtech/sqlitebrowser · GitHub
Skip to content
Navigation Menu
Sign in
Products
Platform
GitHub
Repository hosting, code review, and collaboration
Copilot
AI coding agent for tasks, projects and automated work
Build & Ship
Actions
CI/CD and automation
Code Quality
Quality analysis, fixes, and enforcement
Codespaces
Cloud development environments
Secure
Code Security
Vulnerability detection and remediation
Secret Protection
Secret scanning and leak prevention
All Features
Developers
Learn
Documentation
Training
Certifications
Build
Build with Copilot
Customize Copilot
Integrations
Explore
Trending repos
GitHub Sponsors
Events
Changelog
Changelog
Your source for the latest features, improvements, and fixes across GitHub products, all in one place.
Businesses
By Stage
Enterprises
Team
Startups
Nonprofits
By Industry
Healthcare
Financial services
Manufacturing
Government
See all industries
Evaluate GitHub
Why GitHub
Customer Stories
Business insights
Trust Center
Add-ons
GitHub Advanced Security
Enterprise-grade code security
Copilot for business
Enterprise-grade AI features
Premium Support
Enterprise-grade 24/7 support
Resources
Learn & Connect
Documentation
Resource center
Blog
Events & webinars
Community Forum
Customer Stories
Integrations
Support
Customer support
Training
GitHub Status
Company
About
Partners
Changelog
GitHub Universe
GitHub Universe
The event for developers, by developers — talks, workshops, and what’s next for GitHub.
Pricing
Search
/
Sign in
Sign up
Appearance settings
You signed in with another tab or window.
Reload
to refresh your session.
You signed out in another tab or window.
Reload
to refresh your session.
You switched accounts on another tab or window.
Reload
to refresh your session.
Dismiss alert
{{ message }}
amtech
sqlitebrowser
Repository navigation
Code
Pull requests
Actions
Projects
Security and quality
Insights
More
items
Files
Expand file tree
5e0c56a47faa3f2982dcf12b37bb4ec2edec87f6
Breadcrumbs
sqlitebrowser
/
src
/
Data.cpp
Copy path
Blame
More file actions
Blame
More file actions
Latest commit
History
History
History
165 lines (144 loc) · 5.28 KB
5e0c56a
Breadcrumbs
sqlitebrowser
/
src
/
Data.cpp
Copy path
Top
File metadata and controls
Code
Blame
165 lines (144 loc) · 5.28 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
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
154
155
156
157
158
159
160
161
162
163
164
165
#
include
"
Data.h
"
#
include
<
QBuffer
>
#
include
<
QDateTime
>
#
include
<
QImageReader
>
#
include
<
QLocale
>
#
include
<
QTextCodec
>
#
include
<
algorithm
>
//
Note that these aren't all possible BOMs. But they are probably the most common ones.
//
The size is needed at least for the ones with character zero in them.
static
const
QByteArray
bom3
(
"
\xEF\xBB\xBF
"
,
3
);
static
const
QByteArray
bom2a
(
"
\xFE\xFF
"
,
2
);
static
const
QByteArray
bom2b
(
"
\xFF\xFE
"
,
2
);
static
const
QByteArray
bom4a
(
"
\x00\x00\xFE\xFF
"
,
4
);
static
const
QByteArray
bom4b
(
"
\xFF\xFE\x00\x00
"
,
4
);
bool
isTextOnly
(QByteArray data,
const
QString& encoding,
bool
quickTest)
{
//
If the data starts with a Unicode BOM, we can use detection provided by QTextCodec.
if
(
startsWithBom
(data)) {
QTextCodec *codec = encoding.
isEmpty
()?
QTextCodec::codecForName
(
"
UTF-8
"
) :
QTextCodec::codecForName
(encoding.
toUtf8
());
QTextCodec *detectedCodec =
QTextCodec::codecForUtfText
(data,
nullptr
);
return
detectedCodec == codec;
}
//
Truncate to the first few bytes for quick testing
int
testSize = quickTest?
std::min
(
512
, data.
size
()) : data.
size
();
//
If the quick test has been requested and we have to truncate the string, we have to use
//
an approach where truncated multibyte characters are not interpreted as invalid characters.
if
(quickTest && data.
size
() > testSize) {
//
We can assume that the default encoding (UTF-8) and all the ISO-8859
//
cannot contain character zero.
//
This has to be checked explicitly because toUnicode() is using zero as
//
a terminator for these encodings.
if
((encoding.
isEmpty
() || encoding.
startsWith
(
"
ISO-8859
"
)) && data.
contains
(
'
\0
'
))
return
false
;
QTextCodec::ConverterState state;
QTextCodec *codec = encoding.
isEmpty
()?
QTextCodec::codecForName
(
"
UTF-8
"
) :
QTextCodec::codecForName
(encoding.
toUtf8
());
codec->
toUnicode
(data.
constData
(), testSize, &state);
return
state.
invalidChars
==
0
;
}
else
{
//
Convert to Unicode if necessary
data =
decodeString
(data, encoding);
QString
text
(data);
bool
isPrintable =
true
;
for
(QChar character : text) {
if
(!character.
isPrint
()) {
isPrintable =
false
;
break
;
}
}
//
Perform check
return
isPrintable && text.
toUtf8
() == data;
}
}
bool
containsRightToLeft
(
const
QString& text) {
for
(QChar ch : text) {
switch
(ch.
direction
()) {
case
QChar::DirR:
case
QChar::DirAL:
case
QChar::DirRLE:
case
QChar::DirRLO:
case
QChar::DirRLI:
return
true
;
default
:
break
;
}
}
return
false
;
}
bool
startsWithBom
(
const
QByteArray& data)
{
if
(data.
startsWith
(bom3) ||
data.
startsWith
(bom2a) || data.
startsWith
(bom2b) ||
data.
startsWith
(bom4a) || data.
startsWith
(bom4b))
return
true
;
else
return
false
;
}
QByteArray
removeBom
(QByteArray& data)
{
if
(data.
startsWith
(bom3))
{
QByteArray bom = data.
left
(
3
);
data.
remove
(
0
,
3
);
return
bom;
}
else
if
(data.
startsWith
(bom2a) || data.
startsWith
(bom2b)) {
QByteArray bom = data.
left
(
2
);
data.
remove
(
0
,
2
);
return
bom;
}
else
if
(data.
startsWith
(bom4a) || data.
startsWith
(bom4b)) {
QByteArray bom = data.
left
(
4
);
data.
remove
(
0
,
4
);
return
bom;
}
else
{
return
QByteArray
();
}
}
QString
isImageData
(
const
QByteArray& data)
{
//
Check if it's an image. First do a quick test by calling canRead() which only checks the first couple of bytes or so. Only if
//
that returned true, do a more sophisticated test of the data. This way we get both, good performance and proper data checking.
QBuffer
imageBuffer
(
const_cast
<QByteArray*>(&data));
QImageReader
readerBuffer
(&imageBuffer);
QString imageFormat = readerBuffer.
format
();
if
(readerBuffer.
canRead
() && !readerBuffer.
read
().
isNull
())
return
imageFormat;
else
return
QString
();
}
QStringList
toStringList
(
const
QList<QByteArray>& list) {
QStringList strings;
for
(
const
QByteArray &item : list) {
strings.
append
(
QString::fromUtf8
(item));
}
return
strings;
}
QByteArray
encodeString
(
const
QByteArray& str,
const
QString& encoding)
{
if
(encoding.
isEmpty
())
return
str;
else
return
QTextCodec::codecForName
(encoding.
toUtf8
())->
fromUnicode
(str);
}
QByteArray
decodeString
(
const
QByteArray& str,
const
QString& encoding)
{
if
(encoding.
isEmpty
())
return
str;
else
return
QTextCodec::codecForName
(encoding.
toUtf8
())->
toUnicode
(str).
toUtf8
();
}
QString
humanReadableSize
(
unsigned
long
byteCount)
{
static
const
std::vector<QString> units = {
"
B
"
,
"
KiB
"
,
"
MiB
"
,
"
GiB
"
,
"
TiB
"
,
"
PiB
"
,
"
EiB
"
,
"
ZiB
"
};
double
size =
static_cast
<
double
>(byteCount);
for
(
const
QString& unit : units)
{
if
(size <
1024.0
)
return
QString::number
(size,
'
f
'
,
2
) +
"
"
+ unit;
size /=
1024.0
;
}
return
QString::number
(size,
'
f
'
,
2
) +
"
YiB
"
;
}
QString
isoDateTimeStringToLocalDateTimeString
(
const
QString& date_string)
{
return
QLocale::system
().
toString
(
QDateTime::fromString
(date_string, Qt::ISODate).
toLocalTime
(), QLocale::ShortFormat);
}
You can’t perform that action at this time.