| 1 | // Copyright (C) 2021 The Qt Company Ltd. |
| 2 | // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only |
| 3 | #ifndef QQMLDEBUGTRANSLATIONPROTOCOL_P_H |
| 4 | #define QQMLDEBUGTRANSLATIONPROTOCOL_P_H |
| 5 | // |
| 6 | // W A R N I N G |
| 7 | // ------------- |
| 8 | // |
| 9 | // This file is not part of the Qt API. It exists purely as an |
| 10 | // implementation detail. This header file may change from version to |
| 11 | // version without notice, or even be removed. |
| 12 | // |
| 13 | // We mean it. |
| 14 | // |
| 15 | #include <QtCore/qdatastream.h> |
| 16 | #include <QtCore/qbuffer.h> |
| 17 | #include <QtCore/qurl.h> |
| 18 | #include <QtCore/qobjectdefs.h> |
| 19 | #include <QtCore/qmetaobject.h> |
| 20 | #include <QtCore/private/qglobal_p.h> |
| 21 | #include <tuple> |
| 22 | |
| 23 | QT_BEGIN_NAMESPACE |
| 24 | |
| 25 | namespace QQmlDebugTranslation { |
| 26 | |
| 27 | enum class Request { |
| 28 | ChangeLanguage = 1, |
| 29 | StateList, |
| 30 | ChangeState, |
| 31 | TranslationIssues, |
| 32 | TranslatableTextOccurrences, |
| 33 | WatchTextElides, |
| 34 | DisableWatchTextElides, |
| 35 | // following are obsolete, just provided for compilation compatibility |
| 36 | MissingTranslations |
| 37 | }; |
| 38 | |
| 39 | enum class Reply { |
| 40 | LanguageChanged = 101, |
| 41 | StateList, |
| 42 | StateChanged, |
| 43 | TranslationIssues, |
| 44 | TranslatableTextOccurrences, |
| 45 | // following are obsolete, just provided for compilation compatibility |
| 46 | MissingTranslations, |
| 47 | TextElided |
| 48 | }; |
| 49 | |
| 50 | inline QDataStream &operator<<(QDataStream &ds, Request r) |
| 51 | { |
| 52 | return ds << int(r); |
| 53 | } |
| 54 | |
| 55 | inline QDataStream &operator>>(QDataStream &ds, Request &r) |
| 56 | { |
| 57 | int i; |
| 58 | ds >> i; |
| 59 | r = Request(i); |
| 60 | return ds; |
| 61 | } |
| 62 | |
| 63 | inline QDataStream &operator<<(QDataStream &ds, Reply r) |
| 64 | { |
| 65 | return ds << int(r); |
| 66 | } |
| 67 | |
| 68 | inline QDataStream &operator>>(QDataStream &ds, Reply &r) |
| 69 | { |
| 70 | int i; |
| 71 | ds >> i; |
| 72 | r = Reply(i); |
| 73 | return ds; |
| 74 | } |
| 75 | |
| 76 | inline QByteArray createChangeLanguageRequest(QDataStream &packet, const QUrl &url, |
| 77 | const QString &locale) |
| 78 | { |
| 79 | packet << Request::ChangeLanguage << url << locale; |
| 80 | return qobject_cast<QBuffer *>(object: packet.device())->data(); |
| 81 | } |
| 82 | |
| 83 | inline QByteArray createChangeStateRequest(QDataStream &packet, const QString &state) |
| 84 | { |
| 85 | packet << Request::ChangeState << state; |
| 86 | return qobject_cast<QBuffer *>(object: packet.device())->data(); |
| 87 | } |
| 88 | |
| 89 | inline QByteArray createMissingTranslationsRequest(QDataStream &packet) |
| 90 | { |
| 91 | packet << Request::MissingTranslations; |
| 92 | return qobject_cast<QBuffer *>(object: packet.device())->data(); |
| 93 | } |
| 94 | |
| 95 | inline QByteArray createTranslationIssuesRequest(QDataStream &packet) |
| 96 | { |
| 97 | packet << Request::TranslationIssues; |
| 98 | return qobject_cast<QBuffer *>(object: packet.device())->data(); |
| 99 | } |
| 100 | |
| 101 | inline QByteArray createTranslatableTextOccurrencesRequest(QDataStream &packet) |
| 102 | { |
| 103 | packet << Request::TranslatableTextOccurrences; |
| 104 | return qobject_cast<QBuffer *>(object: packet.device())->data(); |
| 105 | } |
| 106 | |
| 107 | inline QByteArray createStateListRequest(QDataStream &packet) |
| 108 | { |
| 109 | packet << Request::StateList; |
| 110 | return qobject_cast<QBuffer *>(object: packet.device())->data(); |
| 111 | } |
| 112 | |
| 113 | inline QByteArray createWatchTextElidesRequest(QDataStream &packet) |
| 114 | { |
| 115 | packet << Request::WatchTextElides; |
| 116 | return qobject_cast<QBuffer *>(object: packet.device())->data(); |
| 117 | } |
| 118 | |
| 119 | inline QByteArray createDisableWatchTextElidesRequest(QDataStream &packet) |
| 120 | { |
| 121 | packet << Request::DisableWatchTextElides; |
| 122 | return qobject_cast<QBuffer *>(object: packet.device())->data(); |
| 123 | } |
| 124 | |
| 125 | class CodeMarker |
| 126 | { |
| 127 | public: |
| 128 | friend QDataStream &operator>>(QDataStream &stream, CodeMarker &codeMarker) |
| 129 | { |
| 130 | return stream >> codeMarker.url |
| 131 | >> codeMarker.line |
| 132 | >> codeMarker.column; |
| 133 | } |
| 134 | |
| 135 | friend QDataStream &operator<<(QDataStream &stream, const CodeMarker &codeMarker) |
| 136 | { |
| 137 | return stream << codeMarker.url |
| 138 | << codeMarker.line |
| 139 | << codeMarker.column; |
| 140 | } |
| 141 | |
| 142 | friend bool operator<(const CodeMarker &first, const CodeMarker &second) |
| 143 | { |
| 144 | return std::tie(args: first.url, args: first.line, args: first.column) |
| 145 | < std::tie(args: second.url, args: second.line, args: second.column); |
| 146 | } |
| 147 | |
| 148 | friend bool operator==(const CodeMarker &first, const CodeMarker &second) |
| 149 | { |
| 150 | return first.line == second.line |
| 151 | && first.column == second.column |
| 152 | && first.url == second.url; |
| 153 | } |
| 154 | |
| 155 | QUrl url; |
| 156 | int line = -1; |
| 157 | int column = -1; |
| 158 | }; |
| 159 | class TranslationIssue |
| 160 | { |
| 161 | public: |
| 162 | enum class Type{ |
| 163 | Missing, |
| 164 | Elided |
| 165 | }; |
| 166 | |
| 167 | friend QDataStream &operator>>(QDataStream &stream, TranslationIssue &issue) |
| 168 | { |
| 169 | int t; |
| 170 | stream >> issue.codeMarker |
| 171 | >> issue.language |
| 172 | >> t; |
| 173 | issue.type = Type(t); |
| 174 | return stream; |
| 175 | } |
| 176 | |
| 177 | friend QDataStream &operator<<(QDataStream &stream, const TranslationIssue &issue) |
| 178 | { |
| 179 | return stream << issue.codeMarker |
| 180 | << issue.language |
| 181 | << int(issue.type); |
| 182 | } |
| 183 | |
| 184 | friend bool operator==(const TranslationIssue &first, const TranslationIssue &second) |
| 185 | { |
| 186 | return first.type == second.type |
| 187 | && first.language == second.language |
| 188 | && first.codeMarker == second.codeMarker; |
| 189 | } |
| 190 | |
| 191 | QString toDebugString() const |
| 192 | { |
| 193 | QString debugString(QLatin1String( |
| 194 | "TranslationIssue(type=%1, line=%2, column=%3, url=%4, language=%5)" )); |
| 195 | return debugString.arg(args: type == TranslationIssue::Type::Missing ? QLatin1String("Missing" ) |
| 196 | : QLatin1String("Elided" ), |
| 197 | args: QString::number(codeMarker.line), args: QString::number(codeMarker.column), |
| 198 | args: codeMarker.url.toString(), args: language); |
| 199 | } |
| 200 | |
| 201 | QString language; |
| 202 | Type type = Type::Missing; |
| 203 | CodeMarker codeMarker; |
| 204 | }; |
| 205 | class QmlElement |
| 206 | { |
| 207 | public: |
| 208 | QmlElement() = default; |
| 209 | |
| 210 | friend QDataStream &operator>>(QDataStream &stream, QmlElement &qmlElement) |
| 211 | { |
| 212 | return stream >> qmlElement.codeMarker >> qmlElement.elementId >> qmlElement.elementType |
| 213 | >> qmlElement.propertyName >> qmlElement.translationId >> qmlElement.translatedText |
| 214 | >> qmlElement.fontFamily >> qmlElement.fontPointSize >> qmlElement.fontPixelSize |
| 215 | >> qmlElement.fontStyleName >> qmlElement.horizontalAlignment |
| 216 | >> qmlElement.verticalAlignment >> qmlElement.stateName; |
| 217 | } |
| 218 | |
| 219 | friend QDataStream &operator<<(QDataStream &stream, const QmlElement &qmlElement) |
| 220 | { |
| 221 | return stream << qmlElement.codeMarker << qmlElement.elementId << qmlElement.elementType |
| 222 | << qmlElement.propertyName << qmlElement.translationId |
| 223 | << qmlElement.translatedText << qmlElement.fontFamily |
| 224 | << qmlElement.fontPointSize << qmlElement.fontPixelSize |
| 225 | << qmlElement.fontStyleName << qmlElement.horizontalAlignment |
| 226 | << qmlElement.verticalAlignment << qmlElement.stateName; |
| 227 | } |
| 228 | |
| 229 | CodeMarker codeMarker; |
| 230 | QString propertyName; |
| 231 | QString translationId; |
| 232 | QString translatedText; |
| 233 | QString fontFamily; |
| 234 | QString fontStyleName; |
| 235 | QString elementId; |
| 236 | QString elementType; |
| 237 | qreal fontPointSize = 0.0; |
| 238 | QString stateName; |
| 239 | int fontPixelSize = 0; |
| 240 | int horizontalAlignment = 0; |
| 241 | int verticalAlignment = 0; |
| 242 | }; |
| 243 | |
| 244 | class QmlState |
| 245 | { |
| 246 | public: |
| 247 | QmlState() = default; |
| 248 | |
| 249 | friend QDataStream &operator>>(QDataStream &stream, QmlState &qmlState) |
| 250 | { |
| 251 | return stream >> qmlState.name; |
| 252 | } |
| 253 | |
| 254 | friend QDataStream &operator<<(QDataStream &stream, const QmlState &qmlState) |
| 255 | { |
| 256 | return stream << qmlState.name; |
| 257 | } |
| 258 | |
| 259 | QString name; |
| 260 | }; |
| 261 | } |
| 262 | |
| 263 | QT_END_NAMESPACE |
| 264 | |
| 265 | #endif // QQMLDEBUGTRANSLATIONPROTOCOL_P_H |
| 266 | |