diff options
author | Chris Craig <craig@ics.com> | 2012-05-10 18:01:25 -0400 |
---|---|---|
committer | Chris Craig <craig@ics.com> | 2013-03-01 03:33:27 +0100 |
commit | 6b8d228ab8cc2a424f80d5a76f93d598ffac454f (patch) | |
tree | 32ccec5e60ea7b7c87a22d12ffe5ef4b4cceea7a /src/jsonpipe.cpp | |
parent | f6c2f5c3a36f148cf1654c0fea576282b3c83b1c (diff) |
Qt5 release fixes
Modifications to build with the final Qt 5 release. Because
the Qt module build process changed a lot, there are a number
of changes. Most significantly, all classes are renamed to begin
with 'Q', since that's the only way to get syncqt to install them
correctly.
Change-Id: I987fd426702a49991e930d1670d9c76be994eab9
Reviewed-by: Chris Craig <craig@ics.com>
Diffstat (limited to 'src/jsonpipe.cpp')
-rw-r--r-- | src/jsonpipe.cpp | 391 |
1 files changed, 0 insertions, 391 deletions
diff --git a/src/jsonpipe.cpp b/src/jsonpipe.cpp deleted file mode 100644 index bd63de3..0000000 --- a/src/jsonpipe.cpp +++ /dev/null @@ -1,391 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtAddOn.JsonStream module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QDebug> -#include <QtEndian> -#include <QSocketNotifier> -#include <QElapsedTimer> -#include <qjsondocument.h> -#include <qjsonobject.h> -#include <QTextCodec> - -#include <sys/select.h> -#include <stdio.h> -#include <errno.h> -#include <unistd.h> // for ::write - -#include "jsonpipe.h" -#include "jsonbuffer_p.h" -#include "bson/qt-bson_p.h" - -QT_BEGIN_NAMESPACE_JSONSTREAM - -/****************************************************************************/ - -class JsonPipePrivate -{ -public: - JsonPipePrivate() - : mIn(0) - , mOut(0) - , mFormat(FormatUndefined) {} - - JsonBuffer *mInBuffer; - QByteArray mOutBuffer; - QSocketNotifier *mIn; - QSocketNotifier *mOut; - EncodingFormat mFormat; -}; - -/****************************************************************************/ - -/*! - \class JsonPipe - \brief The JsonPipe class serializes JSON data. - - The JsonPipe class is a generic interface for serializing and deserializing - JSON data over pipe connections. It is designed to support multiple serialization - and deserialization formats by auto-detecting the format in use. -*/ - -/*! - \enum JsonPipe::PipeError - - This enum is passed in the \l{error()} signal indicating a problem - with a pipe connection. - - \value WriteFailed Unable to write to the outgoing pipe - \value WriteAtEnd The outgoing pipe has been closed - \value ReadFailed Unable to read from the incoming pipe - \value ReadAtEnd The incoming pipe has been closed - */ - -/*! - Constructs a \c JsonPipe object with an optional \a parent. - */ - -JsonPipe::JsonPipe(QObject *parent) - : QObject(parent) - , d_ptr(new JsonPipePrivate()) -{ - Q_D(JsonPipe); - d->mInBuffer = new JsonBuffer(this); - connect(d->mInBuffer, SIGNAL(readyReadMessage()), SLOT(processMessages())); -} - -/*! - Delete the \c JsonPipe object - */ - -JsonPipe::~JsonPipe() -{ -} - -/*! - Return true if writing should be possible -*/ - -bool JsonPipe::writeEnabled() const -{ - Q_D(const JsonPipe); - return (d->mOut != NULL); -} - -/*! - Return true if more data may be read -*/ - -bool JsonPipe::readEnabled() const -{ - Q_D(const JsonPipe); - return (d->mIn != NULL); -} - -/*! - Set the current file descriptors. The input descriptor is set to \a - in_fd and the output descriptor is set to \a out_fd. -*/ - -void JsonPipe::setFds(int in_fd, int out_fd) -{ - Q_D(JsonPipe); - if (d->mIn) - delete d->mIn; - if (d->mOut) - delete d->mOut; - - d->mIn = new QSocketNotifier(in_fd, QSocketNotifier::Read, this); - d->mOut = new QSocketNotifier(out_fd, QSocketNotifier::Write, this); - connect(d->mIn, SIGNAL(activated(int)), SLOT(inReady(int))); - connect(d->mOut, SIGNAL(activated(int)), SLOT(outReady(int))); - d->mIn->setEnabled(true); - d->mOut->setEnabled(d->mOutBuffer.size() > 0); -} - -/*! - \internal - */ - -void JsonPipe::inReady(int fd) -{ - Q_D(JsonPipe); - d->mIn->setEnabled(false); - int n = d->mInBuffer->copyFromFd(fd); - if (n <= 0) { - d->mInBuffer->clear(); - d->mIn->deleteLater(); - d->mIn = NULL; - emit error( (n < 0) ? ReadFailed : ReadAtEnd ); - } - else - d->mIn->setEnabled(true); -} - -/*! - \internal - - Return number of byte written - */ -int JsonPipe::writeInternal(int fd) -{ - Q_D(JsonPipe); - if (!d->mOutBuffer.size()) - return 0; - - int n = ::write(fd, d->mOutBuffer.data(), d->mOutBuffer.size()); - if (n <= 0) { - d->mOut->deleteLater(); - d->mOut = NULL; - // ### TODO: This emits errors in the middle of waitForBytesWritten. - // ### This could cause problems 'cause it gets called in destructors - emit error(n < 0 ? WriteFailed : WriteAtEnd); - } - else if (n < d->mOutBuffer.size()) - d->mOutBuffer = d->mOutBuffer.mid(n); - else - d->mOutBuffer.clear(); - return n; -} - -/*! - \internal -*/ - -void JsonPipe::outReady(int) -{ - Q_D(JsonPipe); - Q_ASSERT(d->mOut); - d->mOut->setEnabled(false); - if (d->mOutBuffer.size()) { - writeInternal(d->mOut->socket()); - if (d->mOut && !d->mOutBuffer.isEmpty()) - d->mOut->setEnabled(true); - } -} - -/*! - Send a JsonObject \a object over the pipe. Return true if - the object could be added to the output buffer and false if there is - no output buffer. -*/ - -bool JsonPipe::send(const QJsonObject& object) -{ - Q_D(JsonPipe); - if (!d->mOut) - return false; - - QJsonDocument document(object); - - switch (d->mFormat) { - case FormatUndefined: - d->mFormat = FormatQBJS; - // Deliberate fall through - case FormatQBJS: - d->mOutBuffer.append(document.toBinaryData()); - break; - case FormatUTF8: - d->mOutBuffer.append(document.toJson()); - break; - case FormatUTF16BE: - d->mOutBuffer.append( QTextCodec::codecForName("UTF-16BE")->fromUnicode(QString::fromUtf8(document.toJson())).mid(2) ); - break; - case FormatUTF16LE: - d->mOutBuffer.append( QTextCodec::codecForName("UTF-16LE")->fromUnicode(QString::fromUtf8(document.toJson())).mid(2) ); - break; - case FormatUTF32BE: - d->mOutBuffer.append( QTextCodec::codecForName("UTF-32BE")->fromUnicode(QString::fromUtf8(document.toJson())).mid(4) ); - break; - case FormatUTF32LE: - d->mOutBuffer.append( QTextCodec::codecForName("UTF-32LE")->fromUnicode(QString::fromUtf8(document.toJson())).mid(4) ); - break; - case FormatBSON: - { - BsonObject bson(document.toVariant().toMap()); - d->mOutBuffer.append("bson"); - d->mOutBuffer.append(bson.data()); - break; - } - } - if (d->mOutBuffer.size()) - d->mOut->setEnabled(true); - return true; -} - -/*! - \internal - Handle a received Qt Binary Json \a object and emit the correct signals -*/ - -void JsonPipe::objectReceived(const QJsonObject& object) -{ - Q_D(JsonPipe); - if (d->mFormat == FormatUndefined) - d->mFormat = d->mInBuffer->format(); - emit messageReceived(object); -} - -/*! - \internal -*/ -void JsonPipe::processMessages() -{ - Q_D(JsonPipe); - d->mInBuffer->setEnabled(false); - while (d->mInBuffer->messageAvailable()) { - QJsonObject obj = d->mInBuffer->readMessage(); - if (!obj.isEmpty()) - objectReceived(obj); - } - d->mInBuffer->setEnabled(true); -} - -/*! - Return the current JsonPipe::EncodingFormat. - */ - -EncodingFormat JsonPipe::format() const -{ - Q_D(const JsonPipe); - return d->mFormat; -} - -/*! - Set the EncodingFormat to \a format. - */ - -void JsonPipe::setFormat( EncodingFormat format ) -{ - Q_D(JsonPipe); - d->mFormat = format; -} - -/*! - Blocks until all of the output buffer has been written to the pipe. - We return true if and only if there was data to be written and it - was successfully written. The \a msecs parameter is the maximum - number of milliseconds to block before giving up. - */ - -bool JsonPipe::waitForBytesWritten(int msecs) -{ - Q_D(JsonPipe); - if (!d->mOut || d->mOutBuffer.isEmpty()) - return false; - - d->mOut->setEnabled(false); - - QElapsedTimer stopWatch; - stopWatch.start(); - - while (d->mOut && !d->mOutBuffer.isEmpty()) { - fd_set wfds; - FD_ZERO(&wfds); - FD_SET(d->mOut->socket(),&wfds); - - int timeout = msecs - stopWatch.elapsed(); - struct timeval tv; - struct timeval *tvptr = ((msecs > 0 && timeout > 0) ? &tv : NULL); - if (tvptr) { - tv.tv_sec = timeout / 1000; - tv.tv_usec = (timeout % 1000) * 1000; - } - - int retval = ::select(d->mOut->socket() + 1, NULL, &wfds, NULL, tvptr); - if (retval == -1 && errno == EINTR) - continue; - if (retval <= 0) - break; - writeInternal(d->mOut->socket()); - } - - if (d->mOut && !d->mOutBuffer.isEmpty()) - d->mOut->setEnabled(true); - return d->mOutBuffer.isEmpty(); -} - -/*! - \relates JsonPipe - - Sends the \a map via the \a pipe. -*/ - -JsonPipe& operator<<( JsonPipe& pipe, const QJsonObject& map ) -{ - pipe.send(map); - return pipe; -} - -/*! - \fn void JsonPipe::messageReceived(const QJsonObject& message) - This signal is emitted when a new \a message has been received on the - pipe. -*/ - -/*! - \fn void JsonPipe::error(PipeError err) - This signal is emitted when there is a read or write pipe error \a - err. -*/ - -#include "moc_jsonpipe.cpp" - -QT_END_NAMESPACE_JSONSTREAM |