1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the QtNfc module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39
40 #include <qndefnfctextrecord.h>
41
42 #include <QtCore/QTextCodec>
43 #include <QtCore/QLocale>
44
45 QT_BEGIN_NAMESPACE
46
47 /*!
48 \class QNdefNfcTextRecord
49 \brief The QNdefNfcTextRecord class provides an NFC RTD-Text.
50
51 \ingroup connectivity-nfc
52 \inmodule QtNfc
53 \since 5.2
54
55 RTD-Text encapsulates a user displayable text record.
56 */
57
58 /*!
59 \enum QNdefNfcTextRecord::Encoding
60
61 This enum describes the text encoding standard used.
62
63 \value Utf8 The text is encoded with UTF-8.
64 \value Utf16 The text is encoding with UTF-16.
65 */
66
67 /*!
68 \fn QNdefNfcTextRecord::QNdefNfcTextRecord()
69
70 Constructs an empty NFC text record of type \l QNdefRecord::NfcRtd.
71 */
72
73 /*!
74 \fn QNdefNfcTextRecord::QNdefNfcTextRecord(const QNdefRecord& other)
75
76 Constructs a new NFC text record that is a copy of \a other.
77 */
78
79 /*!
80 Returns the locale of the text record.
81 */
locale() const82 QString QNdefNfcTextRecord::locale() const
83 {
84 const QByteArray p = payload();
85
86 if (p.isEmpty())
87 return QString();
88
89 quint8 status = p.at(0);
90
91 quint8 codeLength = status & 0x3f;
92
93 return QString::fromLatin1(p.constData() + 1, codeLength);
94 }
95
96 /*!
97 Sets the locale of the text record to \a locale.
98 */
setLocale(const QString & locale)99 void QNdefNfcTextRecord::setLocale(const QString &locale)
100 {
101 QByteArray p = payload();
102
103 quint8 status = p.isEmpty() ? 0 : p.at(0);
104
105 quint8 codeLength = status & 0x3f;
106
107 quint8 newStatus = (status & 0xd0) | locale.length();
108
109 p[0] = newStatus;
110 p.replace(1, codeLength, locale.toLatin1());
111
112 setPayload(p);
113 }
114
115 /*!
116 Returns the contents of the text record as a string.
117 */
text() const118 QString QNdefNfcTextRecord::text() const
119 {
120 const QByteArray p = payload();
121
122 if (p.isEmpty())
123 return QString();
124
125 #if QT_CONFIG(textcodec)
126 quint8 status = p.at(0);
127
128 bool utf16 = status & 0x80;
129 quint8 codeLength = status & 0x3f;
130
131 QTextCodec *codec = QTextCodec::codecForName(utf16 ? "UTF-16BE" : "UTF-8");
132
133 return codec ? codec->toUnicode(p.constData() + 1 + codeLength, p.length() - 1 - codeLength) : QString();
134 #else
135 qWarning("Cannot decode payload, Qt was built with -no-feature-textcodec!");
136 return QString();
137 #endif
138 }
139
140 /*!
141 Sets the contents of the text record to \a text.
142 */
setText(const QString text)143 void QNdefNfcTextRecord::setText(const QString text)
144 {
145 #if QT_CONFIG(textcodec)
146 if (payload().isEmpty())
147 setLocale(QLocale().name());
148
149 QByteArray p = payload();
150
151 quint8 status = p.at(0);
152
153 bool utf16 = status & 0x80;
154 quint8 codeLength = status & 0x3f;
155
156 p.truncate(1 + codeLength);
157
158 QTextCodec *codec = QTextCodec::codecForName(utf16 ? "UTF-16BE" : "UTF-8");
159
160 p += codec->fromUnicode(text);
161
162 setPayload(p);
163 #else
164 qWarning("Cannot encode payload, Qt was built with -no-feature-textcodec!");
165 Q_UNUSED(text);
166 #endif
167 }
168
169 /*!
170 Returns the encoding of the contents.
171 */
encoding() const172 QNdefNfcTextRecord::Encoding QNdefNfcTextRecord::encoding() const
173 {
174 if (payload().isEmpty())
175 return Utf8;
176
177 QByteArray p = payload();
178
179 quint8 status = p.at(0);
180
181 bool utf16 = status & 0x80;
182
183 if (utf16)
184 return Utf16;
185 else
186 return Utf8;
187 }
188
189 /*!
190 Sets the enconding of the contents to \a encoding.
191 */
setEncoding(Encoding encoding)192 void QNdefNfcTextRecord::setEncoding(Encoding encoding)
193 {
194 QByteArray p = payload();
195
196 quint8 status = p.isEmpty() ? 0 : p.at(0);
197
198 QString string = text();
199
200 if (encoding == Utf8)
201 status &= ~0x80;
202 else
203 status |= 0x80;
204
205 p[0] = status;
206
207 setPayload(p);
208
209 setText(string);
210 }
211
212 QT_END_NAMESPACE
213