Fix QTextStream and QDebug operator<< for QLatin1String
authorKent Hansen <kent.hansen@nokia.com>
Wed, 1 Feb 2012 19:47:26 +0000 (20:47 +0100)
committerQt by Nokia <qt-info@nokia.com>
Thu, 2 Feb 2012 10:10:04 +0000 (11:10 +0100)
QLatin1String now has a constructor that takes explicit length, which
makes it possible to create a QLatin1String that isn't null-terminated.
Made the QTextStream and QDebug << operators work in that case.

Change-Id: I94d051ce2ebfb2d2a403b96d25e040c80a54bf7c
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
src/corelib/io/qdebug.h
src/corelib/io/qtextstream.cpp
src/corelib/io/qtextstream.h
tests/auto/corelib/io/qdebug/tst_qdebug.cpp
tests/auto/corelib/io/qtextstream/tst_qtextstream.cpp

index c268660..48a382e 100644 (file)
@@ -113,7 +113,7 @@ public:
     inline QDebug &operator<<(const char* t) { stream->ts << QString::fromAscii(t); return maybeSpace(); }
     inline QDebug &operator<<(const QString & t) { stream->ts << '\"' << t  << '\"'; return maybeSpace(); }
     inline QDebug &operator<<(const QStringRef & t) { return operator<<(t.toString()); }
-    inline QDebug &operator<<(const QLatin1String &t) { stream->ts << '\"'  << t.latin1() << '\"'; return maybeSpace(); }
+    inline QDebug &operator<<(const QLatin1String &t) { stream->ts << '\"'  << t << '\"'; return maybeSpace(); }
     inline QDebug &operator<<(const QByteArray & t) { stream->ts  << '\"' << t << '\"'; return maybeSpace(); }
     inline QDebug &operator<<(const void * t) { stream->ts << t; return maybeSpace(); }
     inline QDebug &operator<<(QTextStreamFunction f) {
index 7ea00ce..7f37866 100644 (file)
@@ -2533,6 +2533,21 @@ QTextStream &QTextStream::operator<<(const QString &string)
 /*!
     \overload
 
+    Writes \a string to the stream, and returns a reference to the
+    QTextStream. The contents of \a string are converted with the
+    QString constructor that takes a QLatin1String as argument.
+*/
+QTextStream &QTextStream::operator<<(const QLatin1String &string)
+{
+    Q_D(QTextStream);
+    CHECK_VALID_STREAM(*this);
+    d->putString(QString(string));
+    return *this;
+}
+
+/*!
+    \overload
+
     Writes \a array to the stream. The contents of \a array are
     converted with QString::fromAscii().
 */
index 3e1d0fa..011d43e 100644 (file)
@@ -187,6 +187,7 @@ public:
     QTextStream &operator<<(float f);
     QTextStream &operator<<(double f);
     QTextStream &operator<<(const QString &s);
+    QTextStream &operator<<(const QLatin1String &s);
     QTextStream &operator<<(const QByteArray &array);
     QTextStream &operator<<(const char *c);
     QTextStream &operator<<(const void *ptr);
index 19f020f..12f7e28 100644 (file)
@@ -54,6 +54,7 @@ private slots:
     void debugWithBool() const;
     void veryLongWarningMessage() const;
     void qDebugQStringRef() const;
+    void qDebugQLatin1String() const;
     void defaultMessagehandler() const;
 };
 
@@ -198,6 +199,18 @@ void tst_QDebug::qDebugQStringRef() const
     }
 }
 
+void tst_QDebug::qDebugQLatin1String() const
+{
+    MessageHandlerSetter mhs(myMessageHandler);
+    { qDebug() << QLatin1String("foo") << QLatin1String("") << QLatin1String("barbaz", 3); }
+    QString file = __FILE__; int line = __LINE__ - 1; QString function = Q_FUNC_INFO;
+    QCOMPARE(s_msgType, QtDebugMsg);
+    QCOMPARE(QString::fromLatin1(s_msg), QString::fromLatin1("\"foo\" \"\" \"bar\" "));
+    QCOMPARE(QString::fromLatin1(s_file), file);
+    QCOMPARE(s_line, line);
+    QCOMPARE(QString::fromLatin1(s_function), function);
+}
+
 void tst_QDebug::defaultMessagehandler() const
 {
     MessageHandlerSetter mhs(0);
index 7d5db69..01aecc2 100644 (file)
@@ -170,6 +170,7 @@ private slots:
     // text write operators
     void string_write_operator_ToDevice_data();
     void string_write_operator_ToDevice();
+    void latin1String_write_operator_ToDevice();
 
     // other
     void skipWhiteSpace_data();
@@ -2384,6 +2385,20 @@ void tst_QTextStream::string_write_operator_ToDevice()
     }
 }
 
+void tst_QTextStream::latin1String_write_operator_ToDevice()
+{
+    QBuffer buf;
+    buf.open(QBuffer::WriteOnly);
+    QTextStream stream(&buf);
+    stream.setCodec(QTextCodec::codecForName("ISO-8859-1"));
+    stream.setAutoDetectUnicode(true);
+
+    stream << QLatin1String("No explicit length");
+    stream << QLatin1String("Explicit length - ignore this part", 15);
+    stream.flush();
+    QCOMPARE(buf.buffer().constData(), "No explicit lengthExplicit length");
+}
+
 // ------------------------------------------------------------------------------
 void tst_QTextStream::useCase1()
 {