diff options
Diffstat (limited to 'examples/ipc')
-rw-r--r-- | examples/ipc/README | 35 | ||||
-rw-r--r-- | examples/ipc/ipc.pro | 8 | ||||
-rw-r--r-- | examples/ipc/localfortuneclient/client.cpp | 153 | ||||
-rw-r--r-- | examples/ipc/localfortuneclient/client.h | 82 | ||||
-rw-r--r-- | examples/ipc/localfortuneclient/localfortuneclient.pro | 12 | ||||
-rw-r--r-- | examples/ipc/localfortuneclient/main.cpp | 52 | ||||
-rw-r--r-- | examples/ipc/localfortuneserver/localfortuneserver.pro | 12 | ||||
-rw-r--r-- | examples/ipc/localfortuneserver/main.cpp | 56 | ||||
-rw-r--r-- | examples/ipc/localfortuneserver/server.cpp | 111 | ||||
-rw-r--r-- | examples/ipc/localfortuneserver/server.h | 70 | ||||
-rw-r--r-- | examples/ipc/sharedmemory/dialog.cpp | 189 | ||||
-rw-r--r-- | examples/ipc/sharedmemory/dialog.h | 71 | ||||
-rw-r--r-- | examples/ipc/sharedmemory/dialog.ui | 47 | ||||
-rw-r--r-- | examples/ipc/sharedmemory/image.png | bin | 0 -> 10199 bytes | |||
-rw-r--r-- | examples/ipc/sharedmemory/main.cpp | 54 | ||||
-rw-r--r-- | examples/ipc/sharedmemory/qt.png | bin | 0 -> 2383 bytes | |||
-rw-r--r-- | examples/ipc/sharedmemory/sharedmemory.pro | 13 |
17 files changed, 965 insertions, 0 deletions
diff --git a/examples/ipc/README b/examples/ipc/README new file mode 100644 index 0000000..71e2f46 --- /dev/null +++ b/examples/ipc/README @@ -0,0 +1,35 @@ +These examples demonstrate IPC support in Qt. + +The example launcher provided with Qt can be used to explore each of the +examples in this directory. + +Documentation for these examples can be found via the Tutorial and Examples +link in the main Qt documentation. + + +Finding the Qt Examples and Demos launcher +========================================== + +On Windows: + +The launcher can be accessed via the Windows Start menu. Select the menu +entry entitled "Qt Examples and Demos" entry in the submenu containing +the Qt tools. + +On Mac OS X: + +For the binary distribution, the qtdemo executable is installed in the +/Developer/Applications/Qt directory. For the source distribution, it is +installed alongside the other Qt tools on the path specified when Qt is +configured. + +On Unix/Linux: + +The qtdemo executable is installed alongside the other Qt tools on the path +specified when Qt is configured. + +On all platforms: + +The source code for the launcher can be found in the demos/qtdemo directory +in the Qt package. This example is built at the same time as the Qt libraries, +tools, examples, and demonstrations. diff --git a/examples/ipc/ipc.pro b/examples/ipc/ipc.pro new file mode 100644 index 0000000..0698f89 --- /dev/null +++ b/examples/ipc/ipc.pro @@ -0,0 +1,8 @@ +TEMPLATE = subdirs +SUBDIRS = sharedmemory +!wince*: SUBDIRS += localfortuneserver localfortuneclient + +# install +sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS ipc.pro README +sources.path = $$[QT_INSTALL_EXAMPLES]/ipc +INSTALLS += sources diff --git a/examples/ipc/localfortuneclient/client.cpp b/examples/ipc/localfortuneclient/client.cpp new file mode 100644 index 0000000..2edbcc3 --- /dev/null +++ b/examples/ipc/localfortuneclient/client.cpp @@ -0,0 +1,153 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, 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.0, 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtGui> +#include <QtNetwork> + +#include "client.h" + +Client::Client(QWidget *parent) + : QDialog(parent) +{ + hostLabel = new QLabel(tr("&Server name:")); + hostLineEdit = new QLineEdit("fortune"); + + hostLabel->setBuddy(hostLineEdit); + + statusLabel = new QLabel(tr("This examples requires that you run the " + "Fortune Server example as well.")); + + getFortuneButton = new QPushButton(tr("Get Fortune")); + getFortuneButton->setDefault(true); + + quitButton = new QPushButton(tr("Quit")); + + buttonBox = new QDialogButtonBox; + buttonBox->addButton(getFortuneButton, QDialogButtonBox::ActionRole); + buttonBox->addButton(quitButton, QDialogButtonBox::RejectRole); + + socket = new QLocalSocket(this); + + connect(hostLineEdit, SIGNAL(textChanged(const QString &)), + this, SLOT(enableGetFortuneButton())); + connect(getFortuneButton, SIGNAL(clicked()), + this, SLOT(requestNewFortune())); + connect(quitButton, SIGNAL(clicked()), this, SLOT(close())); + connect(socket, SIGNAL(readyRead()), this, SLOT(readFortune())); + connect(socket, SIGNAL(error(QLocalSocket::LocalSocketError)), + this, SLOT(displayError(QLocalSocket::LocalSocketError))); + + QGridLayout *mainLayout = new QGridLayout; + mainLayout->addWidget(hostLabel, 0, 0); + mainLayout->addWidget(hostLineEdit, 0, 1); + mainLayout->addWidget(statusLabel, 2, 0, 1, 2); + mainLayout->addWidget(buttonBox, 3, 0, 1, 2); + setLayout(mainLayout); + + setWindowTitle(tr("Fortune Client")); + hostLineEdit->setFocus(); +} + +void Client::requestNewFortune() +{ + getFortuneButton->setEnabled(false); + blockSize = 0; + socket->abort(); + socket->connectToServer(hostLineEdit->text()); +} + +void Client::readFortune() +{ + QDataStream in(socket); + in.setVersion(QDataStream::Qt_4_0); + + if (blockSize == 0) { + if (socket->bytesAvailable() < (int)sizeof(quint16)) + return; + in >> blockSize; + } + + if (in.atEnd()) + return; + + QString nextFortune; + in >> nextFortune; + + if (nextFortune == currentFortune) { + QTimer::singleShot(0, this, SLOT(requestNewFortune())); + return; + } + + currentFortune = nextFortune; + statusLabel->setText(currentFortune); + getFortuneButton->setEnabled(true); +} + +void Client::displayError(QLocalSocket::LocalSocketError socketError) +{ + switch (socketError) { + case QLocalSocket::ServerNotFoundError: + QMessageBox::information(this, tr("Fortune Client"), + tr("The host was not found. Please check the " + "host name and port settings.")); + break; + case QLocalSocket::ConnectionRefusedError: + QMessageBox::information(this, tr("Fortune Client"), + tr("The connection was refused by the peer. " + "Make sure the fortune server is running, " + "and check that the host name and port " + "settings are correct.")); + break; + case QLocalSocket::PeerClosedError: + break; + default: + QMessageBox::information(this, tr("Fortune Client"), + tr("The following error occurred: %1.") + .arg(socket->errorString())); + } + + getFortuneButton->setEnabled(true); +} + +void Client::enableGetFortuneButton() +{ + getFortuneButton->setEnabled(!hostLineEdit->text().isEmpty()); +} diff --git a/examples/ipc/localfortuneclient/client.h b/examples/ipc/localfortuneclient/client.h new file mode 100644 index 0000000..4dbdeb1 --- /dev/null +++ b/examples/ipc/localfortuneclient/client.h @@ -0,0 +1,82 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, 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.0, 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CLIENT_H +#define CLIENT_H + +#include <QDialog> +#include <qlocalsocket.h> + +QT_BEGIN_NAMESPACE +class QDialogButtonBox; +class QLabel; +class QLineEdit; +class QPushButton; +class QLocalSocket; +QT_END_NAMESPACE + +class Client : public QDialog +{ + Q_OBJECT + +public: + Client(QWidget *parent = 0); + +private slots: + void requestNewFortune(); + void readFortune(); + void displayError(QLocalSocket::LocalSocketError socketError); + void enableGetFortuneButton(); + +private: + QLabel *hostLabel; + QLineEdit *hostLineEdit; + QLabel *statusLabel; + QPushButton *getFortuneButton; + QPushButton *quitButton; + QDialogButtonBox *buttonBox; + + QLocalSocket *socket; + QString currentFortune; + quint16 blockSize; +}; + +#endif diff --git a/examples/ipc/localfortuneclient/localfortuneclient.pro b/examples/ipc/localfortuneclient/localfortuneclient.pro new file mode 100644 index 0000000..906cc8a --- /dev/null +++ b/examples/ipc/localfortuneclient/localfortuneclient.pro @@ -0,0 +1,12 @@ +HEADERS = client.h +SOURCES = client.cpp \ + main.cpp +QT += network + +# install +target.path = $$[QT_INSTALL_EXAMPLES]/ipc/localfortuneclient +sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS localfortuneclient.pro +sources.path = $$[QT_INSTALL_EXAMPLES]/ipc/localfortuneclient +INSTALLS += target sources + + diff --git a/examples/ipc/localfortuneclient/main.cpp b/examples/ipc/localfortuneclient/main.cpp new file mode 100644 index 0000000..11dcbc6 --- /dev/null +++ b/examples/ipc/localfortuneclient/main.cpp @@ -0,0 +1,52 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, 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.0, 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QApplication> + +#include "client.h" + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + Client client; + client.show(); + return client.exec(); +} diff --git a/examples/ipc/localfortuneserver/localfortuneserver.pro b/examples/ipc/localfortuneserver/localfortuneserver.pro new file mode 100644 index 0000000..fca9a0a --- /dev/null +++ b/examples/ipc/localfortuneserver/localfortuneserver.pro @@ -0,0 +1,12 @@ +HEADERS = server.h +SOURCES = server.cpp \ + main.cpp +QT += network + +# install +target.path = $$[QT_INSTALL_EXAMPLES]/ipc/localfortuneserver +sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS localfortuneserver.pro +sources.path = $$[QT_INSTALL_EXAMPLES]/ipc/localfortuneserver +INSTALLS += target sources + + diff --git a/examples/ipc/localfortuneserver/main.cpp b/examples/ipc/localfortuneserver/main.cpp new file mode 100644 index 0000000..b505c44 --- /dev/null +++ b/examples/ipc/localfortuneserver/main.cpp @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, 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.0, 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QApplication> +#include <QtCore> + +#include <stdlib.h> + +#include "server.h" + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + Server server; + server.show(); + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + return server.exec(); +} diff --git a/examples/ipc/localfortuneserver/server.cpp b/examples/ipc/localfortuneserver/server.cpp new file mode 100644 index 0000000..96a2663 --- /dev/null +++ b/examples/ipc/localfortuneserver/server.cpp @@ -0,0 +1,111 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, 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.0, 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtGui> +#include <QtNetwork> + +#include <stdlib.h> + +#include "server.h" +#include <qlocalserver.h> +#include <qlocalsocket.h> + +Server::Server(QWidget *parent) + : QDialog(parent) +{ + statusLabel = new QLabel; + quitButton = new QPushButton(tr("Quit")); + quitButton->setAutoDefault(false); + + server = new QLocalServer(this); + if (!server->listen("fortune")) { + QMessageBox::critical(this, tr("Fortune Server"), + tr("Unable to start the server: %1.") + .arg(server->errorString())); + close(); + return; + } + + statusLabel->setText(tr("The server is running.\n" + "Run the Fortune Client example now.")); + + fortunes << tr("You've been leading a dog's life. Stay off the furniture.") + << tr("You've got to think about tomorrow.") + << tr("You will be surprised by a loud noise.") + << tr("You will feel hungry again in another hour.") + << tr("You might have mail.") + << tr("You cannot kill time without injuring eternity.") + << tr("Computers are not intelligent. They only think they are."); + + connect(quitButton, SIGNAL(clicked()), this, SLOT(close())); + connect(server, SIGNAL(newConnection()), this, SLOT(sendFortune())); + + QHBoxLayout *buttonLayout = new QHBoxLayout; + buttonLayout->addStretch(1); + buttonLayout->addWidget(quitButton); + buttonLayout->addStretch(1); + + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->addWidget(statusLabel); + mainLayout->addLayout(buttonLayout); + setLayout(mainLayout); + + setWindowTitle(tr("Fortune Server")); +} + +void Server::sendFortune() +{ + QByteArray block; + QDataStream out(&block, QIODevice::WriteOnly); + out.setVersion(QDataStream::Qt_4_0); + out << (quint16)0; + out << fortunes.at(qrand() % fortunes.size()); + out.device()->seek(0); + out << (quint16)(block.size() - sizeof(quint16)); + + QLocalSocket *clientConnection = server->nextPendingConnection(); + connect(clientConnection, SIGNAL(disconnected()), + clientConnection, SLOT(deleteLater())); + + clientConnection->write(block); + clientConnection->flush(); + clientConnection->disconnectFromServer(); +} diff --git a/examples/ipc/localfortuneserver/server.h b/examples/ipc/localfortuneserver/server.h new file mode 100644 index 0000000..7198fd9 --- /dev/null +++ b/examples/ipc/localfortuneserver/server.h @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, 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.0, 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef SERVER_H +#define SERVER_H + +#include <QDialog> + +QT_BEGIN_NAMESPACE +class QLabel; +class QPushButton; +class QLocalServer; +QT_END_NAMESPACE + +class Server : public QDialog +{ + Q_OBJECT + +public: + Server(QWidget *parent = 0); + +private slots: + void sendFortune(); + +private: + QLabel *statusLabel; + QPushButton *quitButton; + QLocalServer *server; + QStringList fortunes; +}; + +#endif diff --git a/examples/ipc/sharedmemory/dialog.cpp b/examples/ipc/sharedmemory/dialog.cpp new file mode 100644 index 0000000..245a4a1 --- /dev/null +++ b/examples/ipc/sharedmemory/dialog.cpp @@ -0,0 +1,189 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, 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.0, 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "dialog.h" +#include <QFileDialog> +#include <QBuffer> +#include <QtCore/QDebug> + +/*! + \class Dialog + + \brief This class is a simple example of how to use QSharedMemory. + + It is a simple dialog that presents a few buttons. To compile the + example, run make in qt/examples/ipc. Then run the executable twice + to create two processes running the dialog. In one of the processes, + press the button to load an image into a shared memory segment, and + then select an image file to load. Once the first process has loaded + and displayed the image, in the second process, press the button to + read the same image from shared memory. The second process displays + the same image loaded from its new loaction in shared memory. +*/ + +/*! + The class contains a data member \l {QSharedMemory} {sharedMemory}, + which is initialized with the key "QSharedMemoryExample" to force + all instances of Dialog to access the same shared memory segment. + The constructor also connects the clicked() signal from each of the + three dialog buttons to the slot function appropriate for handling + each button. +*/ +//! [0] +Dialog::Dialog(QWidget *parent) + : QDialog(parent), sharedMemory("QSharedMemoryExample") +{ + ui.setupUi(this); + connect(ui.loadFromFileButton, SIGNAL(clicked()), SLOT(loadFromFile())); + connect(ui.loadFromSharedMemoryButton, + SIGNAL(clicked()), + SLOT(loadFromMemory())); + setWindowTitle(tr("SharedMemory Example")); +} +//! [0] + +/*! + This slot function is called when the \tt {Load Image From File...} + button is pressed on the firs Dialog process. First, it tests + whether the process is already connected to a shared memory segment + and, if so, detaches from that segment. This ensures that we always + start the example from the beginning if we run it multiple times + with the same two Dialog processes. After detaching from an existing + shared memory segment, the user is prompted to select an image file. + The selected file is loaded into a QImage. The QImage is displayed + in the Dialog and streamed into a QBuffer with a QDataStream. + + Next, it gets a new shared memory segment from the system big enough + to hold the image data in the QBuffer, and it locks the segment to + prevent the second Dialog process from accessing it. Then it copies + the image from the QBuffer into the shared memory segment. Finally, + it unlocks the shared memory segment so the second Dialog process + can access it. + + After this function runs, the user is expected to press the \tt + {Load Image from Shared Memory} button on the second Dialog process. + + \sa loadFromMemory() + */ +//! [1] +void Dialog::loadFromFile() +{ + if (sharedMemory.isAttached()) + detach(); + + ui.label->setText(tr("Select an image file")); + QString fileName = QFileDialog::getOpenFileName(0, QString(), QString(), + tr("Images (*.png *.xpm *.jpg)")); + QImage image; + if (!image.load(fileName)) { + ui.label->setText(tr("Selected file is not an image, please select another.")); + return; + } + ui.label->setPixmap(QPixmap::fromImage(image)); +//! [1] //! [2] + + // load into shared memory + QBuffer buffer; + buffer.open(QBuffer::ReadWrite); + QDataStream out(&buffer); + out << image; + int size = buffer.size(); + + if (!sharedMemory.create(size)) { + ui.label->setText(tr("Unable to create shared memory segment.")); + return; + } + sharedMemory.lock(); + char *to = (char*)sharedMemory.data(); + const char *from = buffer.data().data(); + memcpy(to, from, qMin(sharedMemory.size(), size)); + sharedMemory.unlock(); +} +//! [2] + +/*! + This slot function is called in the second Dialog process, when the + user presses the \tt {Load Image from Shared Memory} button. First, + it attaches the process to the shared memory segment created by the + first Dialog process. Then it locks the segment for exclusive + access, copies the image data from the segment into a QBuffer, and + streams the QBuffer into a QImage. Then it unlocks the shared memory + segment, detaches from it, and finally displays the QImage in the + Dialog. + + \sa loadFromFile() + */ +//! [3] +void Dialog::loadFromMemory() +{ + if (!sharedMemory.attach()) { + ui.label->setText(tr("Unable to attach to shared memory segment.\n" \ + "Load an image first.")); + return; + } + + QBuffer buffer; + QDataStream in(&buffer); + QImage image; + + sharedMemory.lock(); + buffer.setData((char*)sharedMemory.constData(), sharedMemory.size()); + buffer.open(QBuffer::ReadOnly); + in >> image; + sharedMemory.unlock(); + + sharedMemory.detach(); + ui.label->setPixmap(QPixmap::fromImage(image)); +} +//! [3] + +/*! + This private function is called by the destructor to detach the + process from its shared memory segment. When the last process + detaches from a shared memory segment, the system releases the + shared memory. + */ +void Dialog::detach() +{ + if (!sharedMemory.detach()) + ui.label->setText(tr("Unable to detach from shared memory.")); +} + diff --git a/examples/ipc/sharedmemory/dialog.h b/examples/ipc/sharedmemory/dialog.h new file mode 100644 index 0000000..a0c84b6 --- /dev/null +++ b/examples/ipc/sharedmemory/dialog.h @@ -0,0 +1,71 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, 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.0, 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef DIALOG_H +#define DIALOG_H + +#include <qdialog.h> +#include <qsharedmemory.h> +#include "ui_dialog.h" + +//! [0] +class Dialog : public QDialog +{ + Q_OBJECT + + public: + Dialog(QWidget *parent = 0); + + public slots: + void loadFromFile(); + void loadFromMemory(); + + private: + void detach(); + + private: + Ui::Dialog ui; + QSharedMemory sharedMemory; +}; +//! [0] + +#endif + diff --git a/examples/ipc/sharedmemory/dialog.ui b/examples/ipc/sharedmemory/dialog.ui new file mode 100644 index 0000000..e99d6fb --- /dev/null +++ b/examples/ipc/sharedmemory/dialog.ui @@ -0,0 +1,47 @@ +<ui version="4.0" > + <class>Dialog</class> + <widget class="QDialog" name="Dialog" > + <property name="geometry" > + <rect> + <x>0</x> + <y>0</y> + <width>451</width> + <height>322</height> + </rect> + </property> + <property name="windowTitle" > + <string>Dialog</string> + </property> + <layout class="QGridLayout" > + <item row="0" column="0" > + <widget class="QPushButton" name="loadFromFileButton" > + <property name="text" > + <string>Load Image From File...</string> + </property> + </widget> + </item> + <item row="1" column="0" > + <widget class="QLabel" name="label" > + <property name="text" > + <string>Launch two of these dialogs. In the first, press the top button and load an image from a file. In the second, press the bottom button and display the loaded image from shared memory.</string> + </property> + <property name="alignment" > + <set>Qt::AlignCenter</set> + </property> + <property name="wordWrap" > + <bool>true</bool> + </property> + </widget> + </item> + <item row="2" column="0" > + <widget class="QPushButton" name="loadFromSharedMemoryButton" > + <property name="text" > + <string>Display Image From Shared Memory</string> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/examples/ipc/sharedmemory/image.png b/examples/ipc/sharedmemory/image.png Binary files differnew file mode 100644 index 0000000..dd93453 --- /dev/null +++ b/examples/ipc/sharedmemory/image.png diff --git a/examples/ipc/sharedmemory/main.cpp b/examples/ipc/sharedmemory/main.cpp new file mode 100644 index 0000000..533efeb --- /dev/null +++ b/examples/ipc/sharedmemory/main.cpp @@ -0,0 +1,54 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, 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.0, 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QApplication> +#include "dialog.h" + +//! [0] +int main(int argc, char *argv[]) +{ + QApplication application(argc, argv); + Dialog dialog; + dialog.show(); + return application.exec(); +} +//! [0] + diff --git a/examples/ipc/sharedmemory/qt.png b/examples/ipc/sharedmemory/qt.png Binary files differnew file mode 100644 index 0000000..60ef558 --- /dev/null +++ b/examples/ipc/sharedmemory/qt.png diff --git a/examples/ipc/sharedmemory/sharedmemory.pro b/examples/ipc/sharedmemory/sharedmemory.pro new file mode 100644 index 0000000..4833090 --- /dev/null +++ b/examples/ipc/sharedmemory/sharedmemory.pro @@ -0,0 +1,13 @@ +SOURCES += main.cpp \ + dialog.cpp + +HEADERS += dialog.h + +# Forms and resources +FORMS += dialog.ui + +# install +target.path = $$[QT_INSTALL_EXAMPLES]/ipc/sharedmemory +sources.files = $$SOURCES $$HEADERS $$FORMS $$RESOURCES *.pro *.png +sources.path = $$[QT_INSTALL_EXAMPLES]/ipc/sharedmemory +INSTALLS += target sources |