app/MailtoUrl.cpp
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #include "MailtoUrl.h" | ||
| 2 | |||
| 3 | #include <QUrl> | ||
| 4 | #include <QUrlQuery> | ||
| 5 | |||
| 6 | 39 | static QString sanitizedHeaderValue(QString value) { | |
| 7 | 39 | value.removeIf([](QChar ch) { | |
| 8 |
4/4✓ Branch 3 → 4 taken 591 times.
✓ Branch 3 → 6 taken 8 times.
✓ Branch 5 → 6 taken 1 time.
✓ Branch 5 → 7 taken 590 times.
|
599 | return ch.unicode() < 0x20 || ch.unicode() == 0x7f; |
| 9 | }); | ||
| 10 | 39 | return value.trimmed(); | |
| 11 | } | ||
| 12 | |||
| 13 | 23 | std::optional<MailtoRequest> MailtoRequest::parse(const QString &value) { | |
| 14 |
2/2✓ Branch 2 → 3 taken 23 times.
✓ Branch 4 → 5 taken 23 times.
|
23 | const QUrl url = QUrl::fromEncoded(value.toUtf8(), QUrl::StrictMode); |
| 15 |
2/2✓ Branch 13 → 14 taken 19 times.
✓ Branch 13 → 22 taken 3 times.
|
44 | if (!url.isValid() || |
| 16 |
7/13✓ Branch 8 → 9 taken 22 times.
✓ Branch 30 → 31 taken 22 times.
✓ Branch 30 → 32 taken 1 time.
✓ Branch 32 → 33 taken 22 times.
✓ Branch 32 → 34 taken 1 time.
✓ Branch 34 → 35 taken 5 times.
✓ Branch 34 → 36 taken 18 times.
✗ Branch 173 → 174 not taken.
✗ Branch 173 → 175 not taken.
✗ Branch 177 → 178 not taken.
✗ Branch 177 → 179 not taken.
✗ Branch 181 → 182 not taken.
✗ Branch 181 → 183 not taken.
|
67 | url.scheme().compare(QStringLiteral("mailto"), |
| 17 | 38 | Qt::CaseInsensitive) != 0 || | |
| 18 |
14/19✓ Branch 6 → 7 taken 23 times.
✓ Branch 7 → 8 taken 22 times.
✓ Branch 7 → 22 taken 1 time.
✓ Branch 15 → 16 taken 19 times.
✓ Branch 17 → 18 taken 18 times.
✓ Branch 17 → 22 taken 1 time.
✓ Branch 19 → 20 taken 18 times.
✗ Branch 21 → 22 not taken.
✓ Branch 21 → 23 taken 18 times.
✓ Branch 24 → 25 taken 18 times.
✓ Branch 24 → 26 taken 5 times.
✓ Branch 26 → 27 taken 19 times.
✓ Branch 26 → 28 taken 4 times.
✓ Branch 28 → 29 taken 22 times.
✓ Branch 28 → 30 taken 1 time.
✗ Branch 163 → 164 not taken.
✗ Branch 163 → 165 not taken.
✗ Branch 168 → 169 not taken.
✗ Branch 168 → 170 not taken.
|
63 | !url.host().isEmpty() || !url.userInfo().isEmpty()) { |
| 19 | 5 | return std::nullopt; | |
| 20 | } | ||
| 21 | |||
| 22 | 18 | MailtoRequest request; | |
| 23 |
2/2✓ Branch 37 → 38 taken 18 times.
✓ Branch 38 → 39 taken 18 times.
|
18 | request.to = sanitizedHeaderValue(url.path(QUrl::FullyDecoded)); |
| 24 | |||
| 25 | 18 | bool hasSubject = false; | |
| 26 | 18 | bool hasBody = false; | |
| 27 | 18 | bool hasInReplyTo = false; | |
| 28 | 9 | const auto appendRecipients = [](QString &field, const QString &value) { | |
| 29 |
1/1✓ Branch 3 → 4 taken 9 times.
|
9 | const QString recipient = sanitizedHeaderValue(value); |
| 30 |
2/2✓ Branch 6 → 7 taken 1 time.
✓ Branch 6 → 8 taken 8 times.
|
9 | if (recipient.isEmpty()) return; |
| 31 |
3/3✓ Branch 9 → 10 taken 3 times.
✓ Branch 9 → 17 taken 5 times.
✓ Branch 13 → 14 taken 3 times.
|
11 | if (!field.isEmpty()) field += QStringLiteral(", "); |
| 32 |
1/1✓ Branch 17 → 18 taken 8 times.
|
8 | field += recipient; |
| 33 |
2/2✓ Branch 20 → 21 taken 8 times.
✓ Branch 20 → 23 taken 1 time.
|
9 | }; |
| 34 |
1/1✓ Branch 42 → 43 taken 18 times.
|
18 | const QUrlQuery query(url); |
| 35 |
5/5✓ Branch 44 → 45 taken 18 times.
✓ Branch 45 → 46 taken 18 times.
✓ Branch 46 → 47 taken 18 times.
✓ Branch 151 → 48 taken 35 times.
✓ Branch 151 → 152 taken 18 times.
|
53 | for (const auto &[key, value] : query.queryItems(QUrl::FullyDecoded)) { |
| 36 |
2/2✓ Branch 57 → 58 taken 4 times.
✓ Branch 57 → 59 taken 31 times.
|
35 | if (key.compare(QStringLiteral("to"), Qt::CaseInsensitive) == 0) { |
| 37 |
1/1✓ Branch 58 → 149 taken 4 times.
|
4 | appendRecipients(request.to, value); |
| 38 |
2/2✓ Branch 65 → 66 taken 3 times.
✓ Branch 65 → 67 taken 28 times.
|
31 | } else if (key.compare(QStringLiteral("cc"), Qt::CaseInsensitive) == 0) { |
| 39 |
1/1✓ Branch 66 → 149 taken 3 times.
|
3 | appendRecipients(request.cc, value); |
| 40 |
2/2✓ Branch 73 → 74 taken 2 times.
✓ Branch 73 → 75 taken 26 times.
|
28 | } else if (key.compare(QStringLiteral("bcc"), Qt::CaseInsensitive) == 0) { |
| 41 |
1/1✓ Branch 74 → 149 taken 2 times.
|
2 | appendRecipients(request.bcc, value); |
| 42 |
4/4✓ Branch 75 → 76 taken 25 times.
✓ Branch 75 → 82 taken 1 time.
✓ Branch 80 → 81 taken 2 times.
✓ Branch 80 → 82 taken 23 times.
|
51 | } else if (!hasInReplyTo && |
| 43 |
6/6✓ Branch 83 → 84 taken 25 times.
✓ Branch 83 → 85 taken 1 time.
✓ Branch 85 → 86 taken 25 times.
✓ Branch 85 → 87 taken 1 time.
✓ Branch 87 → 88 taken 2 times.
✓ Branch 87 → 115 taken 24 times.
|
51 | key.compare(QStringLiteral("in-reply-to"), Qt::CaseInsensitive) == 0) { |
| 44 | // One message id in angle brackets; anything else is ignored. | ||
| 45 |
1/1✓ Branch 89 → 90 taken 2 times.
|
2 | const QString id = sanitizedHeaderValue(value); |
| 46 |
4/6✓ Branch 95 → 96 taken 2 times.
✓ Branch 96 → 97 taken 2 times.
✗ Branch 96 → 110 not taken.
✓ Branch 99 → 100 taken 2 times.
✓ Branch 100 → 101 taken 2 times.
✗ Branch 100 → 110 not taken.
|
4 | if (id.size() <= 998 && id.startsWith(QLatin1Char('<')) && id.endsWith(QLatin1Char('>')) && |
| 47 |
8/10✓ Branch 92 → 93 taken 2 times.
✗ Branch 92 → 110 not taken.
✓ Branch 103 → 104 taken 2 times.
✓ Branch 104 → 105 taken 1 time.
✓ Branch 104 → 110 taken 1 time.
✓ Branch 107 → 108 taken 1 time.
✓ Branch 108 → 109 taken 1 time.
✗ Branch 108 → 110 not taken.
✓ Branch 111 → 112 taken 1 time.
✓ Branch 111 → 113 taken 1 time.
|
4 | id.count(QLatin1Char('<')) == 1 && !id.contains(QLatin1Char(' '))) |
| 48 | 1 | request.inReplyTo = id; | |
| 49 | 2 | hasInReplyTo = true; | |
| 50 |
4/4✓ Branch 115 → 116 taken 15 times.
✓ Branch 115 → 122 taken 9 times.
✓ Branch 120 → 121 taken 10 times.
✓ Branch 120 → 122 taken 5 times.
|
41 | } else if (!hasSubject && |
| 51 |
6/6✓ Branch 123 → 124 taken 15 times.
✓ Branch 123 → 125 taken 9 times.
✓ Branch 125 → 126 taken 15 times.
✓ Branch 125 → 127 taken 9 times.
✓ Branch 127 → 128 taken 10 times.
✓ Branch 127 → 134 taken 14 times.
|
39 | key.compare(QStringLiteral("subject"), |
| 52 | Qt::CaseInsensitive) == 0) { | ||
| 53 |
1/1✓ Branch 129 → 130 taken 10 times.
|
10 | request.subject = sanitizedHeaderValue(value); |
| 54 | 10 | hasSubject = true; | |
| 55 |
4/4✓ Branch 134 → 135 taken 12 times.
✓ Branch 134 → 141 taken 2 times.
✓ Branch 139 → 140 taken 7 times.
✓ Branch 139 → 141 taken 5 times.
|
26 | } else if (!hasBody && |
| 56 |
6/6✓ Branch 142 → 143 taken 12 times.
✓ Branch 142 → 144 taken 2 times.
✓ Branch 144 → 145 taken 12 times.
✓ Branch 144 → 146 taken 2 times.
✓ Branch 146 → 147 taken 7 times.
✓ Branch 146 → 149 taken 7 times.
|
26 | key.compare(QStringLiteral("body"), |
| 57 | Qt::CaseInsensitive) == 0) { | ||
| 58 | 7 | request.body = value; | |
| 59 | 7 | hasBody = true; | |
| 60 | } | ||
| 61 | 18 | } | |
| 62 | |||
| 63 | 18 | return request; | |
| 64 | 23 | } | |
| 65 |