Exemplo n.º 1
0
void DataPool::readyRead()
{
    QTcpSocket *socket;

    socket = qobject_cast<QTcpSocket *>(sender());
    if(socket == NULL)
        return;
    if(!accountMap.contains(socket))
        return;

    Connection &conn = accountMap[socket];
    if(conn.tcpSocket != socket)
    {
        qWarning() << "DataPool::readyRead() tcpSocket not the same";
        return;
    }

    while(socket->state() == QAbstractSocket::ConnectedState)
    {
        switch(conn.state)
        {
        case Connection::state_recv_len:
            if(conn.tcpSocket->bytesAvailable() < sizeof(quint32))
                return;
            do
            {
                QDataStream in(socket);
                in.setVersion(QDataStream::Qt_4_6);
                in >> conn.len;
            }while(0);
            conn.state = Connection::state_recv_data;
            break;

        case Connection::state_recv_data:
            if(conn.tcpSocket->bytesAvailable() < conn.len)
                return;
            conn.state = Connection::state_loop;
            if(conn.connectionType == Connection::unknown_connection)
            {
                quint8 cmd;
                QString fileName;
                quint64 fileSize;
                QDataStream in(socket);
                in.setVersion(QDataStream::Qt_4_6);
                in >> cmd;
                switch(cmd)
                {
                case 0x08:
                    conn.connectionType = Connection::message_connection;
                    in >> conn.peerUID;
                    break;

                case 0x0A:
                    in >> conn.peerUID >> fileName >> fileSize;
                    conn.connectionType = Connection::file_connection;
                    conn.state = Connection::state_wait;
                    emit fileRequest(conn.peerUID, fileName, fileSize);
                    return;

                case 0x0D:
                    in >> conn.peerUID;
                    conn.connectionType = Connection::audio_connection;
                    conn.state = Connection::state_wait;
                    emit audioRequest(conn.peerUID);
                    return;

                default:
                    qDebug() << "#1:" << cmd;
                    conn.state = Connection::state_close;
                    conn.tcpSocket->close();
                    return;
                }
            }
            else
            {
                bool accepted;
                QDataStream in(socket);
                in.setVersion(QDataStream::Qt_4_6);
                in >> accepted;
                if(conn.connectionType == Connection::file_connection)
                    emit fileRequestResult(conn.peerUID, accepted);
                else if(conn.connectionType == Connection::audio_connection)
                    emit audioRequestResult(conn.peerUID, accepted);
            }
            break;

        case Connection::state_wait:
            qDebug() << "#2";
            conn.state = Connection::state_close;
            conn.tcpSocket->close();
            return;

        case Connection::state_loop:
            if(conn.tcpSocket->bytesAvailable() < sizeof(quint32))
                return;
            do
            {
                QDataStream in(socket);
                in.setVersion(QDataStream::Qt_4_6);
                in >> conn.len;
            }while(0);
            conn.state = Connection::state_loop_data;
            break;

        case Connection::state_loop_data:
            if(conn.tcpSocket->bytesAvailable() < conn.len)
                return;
            do
            {
                quint8 cmd;
                QString msg;
                QByteArray data;
                QDataStream in(socket);
                in.setVersion(QDataStream::Qt_4_6);
                in >> cmd;
                conn.state = Connection::state_loop;
                switch(conn.connectionType)
                {
                case Connection::message_connection:
                    in >> msg;
                    emit newMessage(conn.peerUID, msg);
                    break;

                case Connection::file_connection:
                    if(cmd == 0x0B)
                    {
                        in >> data;
                        emit fileDataReady(conn.peerUID, data);
                    }
                    else if(cmd == 0x0C)
                    {
                        conn.state = Connection::state_done;
                        conn.tcpSocket->close();
                        emit fileReceived(conn.peerUID);
                        return;
                    }
                    break;

                case Connection::audio_connection:
                    in >> data;
                    emit audioDataReady(conn.peerUID, data);
                    break;

                default:
                    return;
                }
Exemplo n.º 2
0
void ScDLManager::updateText(const QString& t)
{
	emit fileReceived(t);
	qDebug()<<"File Received:"<<t;
}