diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2010-09-18 10:02:13 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2010-09-18 10:02:13 +0000 |
| commit | 758badf800f49c7db3ca2ee81afd1e885ae97da5 (patch) | |
| tree | 5c68e69d374bc222fee974cb47990d3313efe9e1 /src/ui/qmmpstarter.cpp | |
| parent | c6e0029ee9ead0cc4c638831048f605b8160d1de (diff) | |
| download | qmmp-758badf800f49c7db3ca2ee81afd1e885ae97da5.tar.gz qmmp-758badf800f49c7db3ca2ee81afd1e885ae97da5.tar.bz2 qmmp-758badf800f49c7db3ca2ee81afd1e885ae97da5.zip | |
switching to QLocalServer and QLocalSocket
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@1890 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/ui/qmmpstarter.cpp')
| -rw-r--r-- | src/ui/qmmpstarter.cpp | 79 |
1 files changed, 42 insertions, 37 deletions
diff --git a/src/ui/qmmpstarter.cpp b/src/ui/qmmpstarter.cpp index 8735a66f2..bccd6e250 100644 --- a/src/ui/qmmpstarter.cpp +++ b/src/ui/qmmpstarter.cpp @@ -20,22 +20,23 @@ #include <QApplication> #include <QDir> - +#include <QLocalServer> +#include <QLocalSocket> #include <cstdlib> #include <iostream> #include <unistd.h> #include <sys/types.h> #include <string.h> #include <qmmpui/commandlinemanager.h> - -#ifndef Q_OS_WIN32 -#include "unixdomainsocket.h" -#endif #include "mainwindow.h" #include "qmmpstarter.h" #include "builtincommandlineoption.h" +#ifdef Q_OS_WIN32 +#define UDS_PATH QString("qmmp") +#else #define UDS_PATH QString("/tmp/qmmp.sock.%1").arg(getuid()).toAscii().constData() +#endif using namespace std; @@ -75,31 +76,36 @@ QMMPStarter::QMMPStarter(int argc,char **argv, QObject* parent) : QObject(parent } } -#ifndef Q_OS_WIN32 - m_sock = new UnixDomainSocket(this); - if (m_sock->bind(UDS_PATH)) + m_server = new QLocalServer(this); + m_socket = new QLocalSocket(this); + if(m_server->listen (UDS_PATH)) //trying to create server { startMainWindow(); } - else if (!m_sock->alive(UDS_PATH)) + else { - // Socket is present but not connectable - application was terminated previously??? - unlink(UDS_PATH); - if (m_sock->bind(UDS_PATH)) + m_socket->connectToServer(UDS_PATH); //connecting + m_socket->waitForConnected(); + if(!m_socket->isValid()) //invalid connection { - startMainWindow(); + qWarning("QMMPStarter: trying to remove invalid socket file"); + if(!QLocalServer::removeServer(UDS_PATH)) + { + qWarning("QMMPStarter: unable to remove invalid socket file"); + exit(1); + return; + } + if(m_server->listen (UDS_PATH)) + startMainWindow(); + else + { + qWarning("QMMPStarter: server error: %s", qPrintable(m_server->errorString())); + exit(1); + } } else - { - qWarning("QMMPStarter: fatal socket error, exiting"); - exit(1); - } + writeCommand(); } - else // socket is alive, qmmp application is already running. passing command to it! - writeCommand(); -#else - startMainWindow(); -#endif } QMMPStarter::~ QMMPStarter() @@ -110,16 +116,13 @@ QMMPStarter::~ QMMPStarter() void QMMPStarter::startMainWindow() { -#ifndef Q_OS_WIN32 - connect(m_sock, SIGNAL(readyRead()),this, SLOT(readCommand())); -#endif + connect(m_server, SIGNAL(newConnection()), SLOT(readCommand())); QStringList arg_l = argString.split("\n", QString::SkipEmptyParts); mw = new MainWindow(arg_l,m_option_manager,0); } void QMMPStarter::writeCommand() { -#ifndef Q_OS_WIN32 if (!argString.isEmpty()) { QString workingDir = QDir::currentPath() + "\n"; @@ -127,7 +130,12 @@ void QMMPStarter::writeCommand() QByteArray barray; barray.append(workingDir.toUtf8 ()); barray.append(argString.toUtf8 ()); - m_sock->writeDatagram ( barray.data(),UDS_PATH); + while(!barray.isEmpty()) + { + qint64 size = m_socket->write(barray); + barray.remove(0, size); + } + m_socket->flush(); } else { @@ -135,25 +143,22 @@ void QMMPStarter::writeCommand() } exit(0); -#endif } void QMMPStarter::readCommand() -{ -#ifndef Q_OS_WIN32 - QByteArray inputArray; - inputArray.resize(m_sock->pendingDatagramSize ()); - bzero(inputArray.data(),inputArray.size()); - m_sock->readDatagram(inputArray.data(), inputArray.size()); +{ + QLocalSocket *socket = m_server->nextPendingConnection(); + socket->waitForDisconnected(); + QByteArray inputArray = socket->readAll(); + socket->deleteLater(); + if(inputArray.isEmpty()) + return; QStringList slist = QString::fromUtf8(inputArray.data()).split("\n",QString::SkipEmptyParts); QString cwd = slist.takeAt(0); if (mw) { mw->processCommandArgs(slist,cwd); } - if(m_sock->pendingDatagramSize () > 0) - readCommand(); -#endif } void QMMPStarter::printUsage() |
