diff --git a/CMakeLists.txt b/CMakeLists.txt index 5134a4d..ff3c6f4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -114,4 +114,14 @@ ADD_SUBDIRECTORY(example/client) ADD_SUBDIRECTORY(example/server) ADD_SUBDIRECTORY(test) -INSTALL(TARGETS ${lib_target} LIBRARY DESTINATION lib) +#INSTALL(TARGETS ${lib_target} LIBRARY DESTINATION lib) + +if(WIN32) + INSTALL(TARGETS ${lib_target} + RUNTIME DESTINATION lib + ) +else() + INSTALL(TARGETS ${lib_target} + LIBRARY DESTINATION lib + ) +endif() diff --git a/include/CuteIPCInterface.h b/include/CuteIPCInterface.h index 9948fcd..63e4f8f 100644 --- a/include/CuteIPCInterface.h +++ b/include/CuteIPCInterface.h @@ -21,7 +21,7 @@ class CuteIPCInterface : public QObject bool connectToServer(const QHostAddress& host, quint16 port); void disconnectFromServer(); - + bool isConnected(); bool remoteConnect(const char* signal, QObject* object, const char* method); bool remoteSlotConnect(QObject* localObject, const char* signal, const char* remoteSlot); @@ -52,6 +52,11 @@ class CuteIPCInterface : public QObject QString lastError() const; + signals: + void connected(); + void disconnected(); + + protected: CuteIPCInterfacePrivate* const d_ptr; CuteIPCInterface(CuteIPCInterfacePrivate& dd, QObject* parent); diff --git a/include/CuteIPCService.h b/include/CuteIPCService.h index 080c39f..a18ec6b 100644 --- a/include/CuteIPCService.h +++ b/include/CuteIPCService.h @@ -4,6 +4,7 @@ // Qt #include #include +#include // Local class CuteIPCServicePrivate; @@ -16,8 +17,8 @@ class CuteIPCService : public QObject explicit CuteIPCService(QObject* parent = 0); ~CuteIPCService(); - bool listen(const QString& name = QString(), QObject* subject = 0); - bool listen(QObject* subject); + bool listen(const QString& name = QString(), QObject* subject = 0, QLocalServer::SocketOptions options=QLocalServer::NoOptions); + bool listen(QObject* subject, QLocalServer::SocketOptions options=QLocalServer::NoOptions); QString serverName() const; bool listenTcp(const QHostAddress& address = QHostAddress::Any, quint16 port = 0, QObject* subject = 0); diff --git a/src/CuteIPCInterface.cpp b/src/CuteIPCInterface.cpp index 5a798fe..8b588fb 100644 --- a/src/CuteIPCInterface.cpp +++ b/src/CuteIPCInterface.cpp @@ -123,7 +123,7 @@ bool CuteIPCInterfacePrivate::sendSynchronousRequest(const QByteArray& request, if (!connected) { socket.disconnectFromServer(); - QString error("CuteIPC: Не удалось подключиться к серверу при вызове синхронного метода"); + QString error("CuteIPC: Could not connect to the server when the synchronous method was called"); qWarning() << error; _q_setLastError(error); return false; @@ -135,6 +135,8 @@ bool CuteIPCInterfacePrivate::sendSynchronousRequest(const QByteArray& request, QEventLoop loop; QObject::connect(&connection, SIGNAL(callFinished()), &loop, SLOT(quit())); + + QObject::connect(&connection, SIGNAL(socketDisconnected()), q_ptr, SIGNAL(disconnected())); QObject::connect(&connection, SIGNAL(socketDisconnected()), &loop, SLOT(quit())); connection.sendCallRequest(request); loop.exec(); @@ -149,7 +151,7 @@ bool CuteIPCInterfacePrivate::sendSynchronousRequest(const QByteArray& request, if (!connected) { socket.disconnectFromHost(); - QString error("CuteIPC: Не удалось подключиться к серверу при вызове синхронного метода"); + QString error("CuteIPC: Could not connect to the server when the synchronous method was called"); qWarning() << error; _q_setLastError(error); return false; @@ -296,6 +298,7 @@ CuteIPCInterface::CuteIPCInterface(QObject* parent) Q_D(CuteIPCInterface); d->q_ptr = this; + connect(d->m_worker, SIGNAL(disconnected()), SIGNAL(disconnected())); connect(d->m_worker, SIGNAL(setLastError(QString)), SLOT(_q_setLastError(QString))); connect(d->m_worker, SIGNAL(invokeRemoteSignal(QString, CuteIPCMessage::Arguments)), SLOT(_q_invokeRemoteSignal(QString, CuteIPCMessage::Arguments))); @@ -325,6 +328,11 @@ CuteIPCInterface::CuteIPCInterface(CuteIPCInterfacePrivate& dd, QObject* parent) } +bool CuteIPCInterface::isConnected() { + Q_D(CuteIPCInterface); + return d->m_worker->isConnected(); +} + /*! Destroyes the object. */ @@ -344,16 +352,18 @@ CuteIPCInterface::~CuteIPCInterface() bool CuteIPCInterface::connectToServer(const QString& name) { Q_D(CuteIPCInterface); - bool connected; + bool isConnected; QEventLoop loop; connect(d->m_worker, SIGNAL(connectToServerFinished()), &loop, SLOT(quit())); - QMetaObject::invokeMethod(d->m_worker, "connectToServer", Q_ARG(QString, name), Q_ARG(void*, &connected)); + QMetaObject::invokeMethod(d->m_worker, "connectToServer", Q_ARG(QString, name), Q_ARG(void*, &isConnected)); loop.exec(); d->m_localServer = name; + if (isConnected) + emit connected(); - return connected; + return isConnected; } /*! @@ -367,15 +377,18 @@ bool CuteIPCInterface::connectToServer(const QString& name) bool CuteIPCInterface::connectToServer(const QHostAddress& host, quint16 port) { Q_D(CuteIPCInterface); - bool connected; + bool isConnected; QEventLoop loop; connect(d->m_worker, SIGNAL(connectToServerFinished()), &loop, SLOT(quit())); - QMetaObject::invokeMethod(d->m_worker, "connectToTcpServer", Q_ARG(QHostAddress, host), Q_ARG(quint16, port), Q_ARG(void*, &connected)); + QMetaObject::invokeMethod(d->m_worker, "connectToTcpServer", Q_ARG(QHostAddress, host), Q_ARG(quint16, port), Q_ARG(void*, &isConnected)); loop.exec(); d->m_tcpAddress = qMakePair(host, port); - return connected; + if (isConnected) + emit connected(); + + return isConnected; } diff --git a/src/CuteIPCInterfaceConnection.cpp b/src/CuteIPCInterfaceConnection.cpp index 9930fe8..2d58de0 100644 --- a/src/CuteIPCInterfaceConnection.cpp +++ b/src/CuteIPCInterfaceConnection.cpp @@ -31,6 +31,9 @@ CuteIPCInterfaceConnection::CuteIPCInterfaceConnection(QTcpSocket* socket, QObje connect(socket, SIGNAL(readyRead()), SLOT(readyRead())); } +bool CuteIPCInterfaceConnection::isConnected() { + return m_socket && m_socket->isOpen(); +} void CuteIPCInterfaceConnection::sendCallRequest(const QByteArray& request) { @@ -108,7 +111,7 @@ bool CuteIPCInterfaceConnection::readMessageFromSocket() } case CuteIPCMessage::AboutToCloseSocket: { - DEBUG << "Сервер сообщает о закрытии соединения"; + DEBUG << "The server reports that the connection is closed"; CuteIPCMessage message = CuteIPCMarshaller::demarshallMessage(m_block); CuteIPCMarshaller::freeArguments(message.arguments()); m_lastCallSuccessful = false; diff --git a/src/CuteIPCInterfaceConnection_p.h b/src/CuteIPCInterfaceConnection_p.h index c53d212..74d55ea 100644 --- a/src/CuteIPCInterfaceConnection_p.h +++ b/src/CuteIPCInterfaceConnection_p.h @@ -22,6 +22,7 @@ class CuteIPCInterfaceConnection : public QObject void sendCallRequest(const QByteArray& request); void setReturnedObject(QGenericReturnArgument returnedObject); bool lastCallSuccessful() const; + bool isConnected(); signals: void callFinished(); diff --git a/src/CuteIPCInterfaceWorker.cpp b/src/CuteIPCInterfaceWorker.cpp index cd5cb7e..b07a835 100644 --- a/src/CuteIPCInterfaceWorker.cpp +++ b/src/CuteIPCInterfaceWorker.cpp @@ -28,6 +28,7 @@ void CuteIPCInterfaceWorker::connectToServer(const QString& name, void* successf QLocalSocket* socket = new QLocalSocket; socket->connectToServer(name); + bool connected = socket->waitForConnected(5000); if (!connected) { @@ -42,6 +43,7 @@ void CuteIPCInterfaceWorker::connectToServer(const QString& name, void* successf this, SIGNAL(invokeRemoteSignal(QString, CuteIPCMessage::Arguments))); connect(m_connection, SIGNAL(errorOccured(QString)), this, SIGNAL(setLastError(QString))); + connect(m_connection, SIGNAL(socketDisconnected()), SIGNAL(disconnected())); connect(m_connection, SIGNAL(socketDisconnected()), m_connection, SLOT(deleteLater())); connect(m_connection, SIGNAL(socketDisconnected()), socket, SLOT(deleteLater())); @@ -88,6 +90,7 @@ void CuteIPCInterfaceWorker::connectToTcpServer(const QHostAddress& host, const this, SIGNAL(invokeRemoteSignal(QString, CuteIPCMessage::Arguments))); connect(m_connection, SIGNAL(errorOccured(QString)), this, SIGNAL(setLastError(QString))); + connect(m_connection, SIGNAL(socketDisconnected()), SIGNAL(disconnected())); connect(m_connection, SIGNAL(socketDisconnected()), m_connection, SLOT(deleteLater())); connect(m_connection, SIGNAL(socketDisconnected()), socket, SLOT(deleteLater())); @@ -131,6 +134,10 @@ void CuteIPCInterfaceWorker::disconnectFromServer() } +bool CuteIPCInterfaceWorker::isConnected() { + return m_connection->isConnected(); +} + void CuteIPCInterfaceWorker::sendCallRequest(const QByteArray& request) { if (!m_connection) diff --git a/src/CuteIPCInterfaceWorker.h b/src/CuteIPCInterfaceWorker.h index dc09e23..19ed516 100644 --- a/src/CuteIPCInterfaceWorker.h +++ b/src/CuteIPCInterfaceWorker.h @@ -21,8 +21,10 @@ class CuteIPCInterfaceWorker : public QObject explicit CuteIPCInterfaceWorker(QObject* parent = 0); ~CuteIPCInterfaceWorker(); + bool isConnected(); signals: void setLastError(const QString& error); + void disconnected(); // slot finish signals void connectToServerFinished(); diff --git a/src/CuteIPCService.cpp b/src/CuteIPCService.cpp index b853d28..f75c066 100644 --- a/src/CuteIPCService.cpp +++ b/src/CuteIPCService.cpp @@ -6,6 +6,7 @@ #include "CuteIPCSignalHandler_p.h" // Qt +#include #include #include #include @@ -62,11 +63,13 @@ CuteIPCServicePrivate::~CuteIPCServicePrivate() } // Clients reaction timeout - QEventLoop loop; - QTimer timer; - QObject::connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); - timer.start(CLIENTS_DISCONNECT_TIMEOUT); - loop.exec(); + if ( QCoreApplication::instance() ) { + QEventLoop loop; + QTimer timer; + QObject::connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); + timer.start(CLIENTS_DISCONNECT_TIMEOUT); + loop.exec(); + } } @@ -303,7 +306,7 @@ QHostAddress CuteIPCService::tcpAddress() const object itself. Previous subject will be replaced. Returns true on success, otherwise false. */ -bool CuteIPCService::listen(const QString& serverName, QObject* subject) +bool CuteIPCService::listen(const QString& serverName, QObject* subject, QLocalServer::SocketOptions options) { Q_D(CuteIPCService); QString name = serverName; @@ -312,6 +315,7 @@ bool CuteIPCService::listen(const QString& serverName, QObject* subject) DEBUG << "Trying to listen" << name; d->registerLocalServer(); + d->m_localServer->setSocketOptions(options); bool ok = d->m_localServer->listen(name); if (!ok) @@ -335,9 +339,9 @@ bool CuteIPCService::listen(const QString& serverName, QObject* subject) /*! * This is an overloaded member function. */ -bool CuteIPCService::listen(QObject* subject) +bool CuteIPCService::listen(QObject* subject, QLocalServer::SocketOptions options) { - return listen(QString(), subject); + return listen(QString(), subject, options); }