view src/UiguiIndentServer.cpp @ 496:205b2f8adf4a

In preparation for some kind of IPC added a server class. With this abstraction it will be easier to create plugins for other ides or editors which can communicate with UiGUI. git-svn-id: svn://svn.code.sf.net/p/universalindent/code/trunk@736 59b1889a-e5ac-428c-b0c7-476e01d41282
author thomas_-_s <thomas_-_s@59b1889a-e5ac-428c-b0c7-476e01d41282>
date Tue, 17 Jun 2008 13:07:24 +0000
parents
children 629bd77efb5f
line wrap: on
line source

/***************************************************************************
 *   Copyright (C) 2006-2008 by Thomas Schweitzer                          *
 *   thomas-schweitzer(at)arcor.de                                         *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License version 2.0 as   *
 *   published by the Free Software Foundation.                            *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program in the file LICENSE.GPL; if not, write to the *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/


#include "UiguiIndentServer.h"

UiguiIndentServer::UiguiIndentServer(void) : QObject() {
    tcpServer = NULL;
}


UiguiIndentServer::~UiguiIndentServer(void) {
}


void UiguiIndentServer::startServer() {
    if ( tcpServer == NULL ) {
        tcpServer = new QTcpServer(this);
    }

    if ( !tcpServer->isListening() ) {
        if ( !tcpServer->listen(QHostAddress::Any, 84484) ) {
            QMessageBox::critical( NULL, tr("UiGUI Server"), tr("Unable to start the server: %1.").arg(tcpServer->errorString()) );
            return;
        }
    }

    connect( tcpServer, SIGNAL(newConnection()), this, SLOT(handleNewConnection()) );
}


void UiguiIndentServer::stopServer() {
    if ( tcpServer != NULL ) {
        tcpServer->close();
        delete tcpServer;
        tcpServer = NULL;
    }
}


void UiguiIndentServer::handleNewConnection() {
    QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
    connect( clientConnection, SIGNAL(disconnected()), clientConnection, SLOT(deleteLater()) );

    connect( clientConnection, SIGNAL(readyRead()), this, SLOT(handleReceivedData()) );
}


void UiguiIndentServer::handleReceivedData() {

    QTcpSocket *clientConnection = qobject_cast<QTcpSocket*>( sender() );
    quint16 blockSize = 0;
    QString receivedData = "";

    if ( clientConnection != NULL ) {
        QDataStream in(clientConnection);
        //in.setVersion(QDataStream::Qt_4_0);

        if ( blockSize == 0 ) {
            if ( clientConnection->bytesAvailable() < (int)sizeof(quint16) )
                return;

            in >> blockSize;
        }

        if ( clientConnection->bytesAvailable() < blockSize )
            return;

        unsigned int l = clientConnection->bytesAvailable();
        char *myData = new char[l];
        in.readRawData( myData, l);
        delete myData;
    }
}