void ClientThread::run() {
    memset(&client, 0, sizeof(struct sockaddr));
    client.sin_family = AF_INET;
    client.sin_addr.s_addr = INADDR_ANY;
    client.sin_port = 0;

    sock = socket(PF_INET, SOCK_DGRAM, 0);
    setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));

    if(gethostbyname_r(addr.toStdString().c_str(), &he, buf, sizeof(buf), &ip_addr, &status) || !ip_addr || sock < 0 || bind(sock, (struct sockaddr*)&client, sizeof(struct sockaddr)) < 0) {
        emit connectError();
        ::close(sock);
    }

    else {
        memset(&server, 0, sizeof(struct sockaddr));
        memcpy(&server.sin_addr.s_addr, ip_addr->h_addr, ip_addr->h_length);
        server.sin_family = AF_INET;
        server.sin_port = htons(port.toInt());

        sendto(sock, "new0"+name.toUtf8(), name.toUtf8().length()+4, 0, (struct sockaddr*)&server, sizeof(struct sockaddr));
        buf_size = recvfrom(sock, buf, 2048, 0, (struct sockaddr*)&server, &size);
        id = QString::fromUtf8(buf, buf_size);
        emit connectSuccess(id);

        while (true) {
            buf_size = recvfrom(sock, buf, 2048, 0, (struct sockaddr*)&consultant, &size);

            if(QString::fromUtf8(buf, 4) == "exit") {
                talk = false;
                emit newSysMessage("Rozmowa została zakończona.");
                sendto(sock, "exit"+id.toUtf8(), id.toUtf8().length()+4, 0, (struct sockaddr*)&server, sizeof(struct sockaddr));
                emit exitTalk();
                break;
            }

            else if(!talk && QString::fromUtf8(buf, 3) == "con") {
                talk = true;
                emit newSysMessage("Właśnie połączył się z Tobą konsultant "+QString::fromUtf8(buf, buf_size).mid(3,buf_size-3)+".");
                emit startTalk();
            }

            else if(talk && QString::fromUtf8(buf, 1) == ";") {
                emit newMessage(QString::fromUtf8(buf, buf_size).mid(1,buf_size-1));
            }
        }
    }
}
Exemplo n.º 2
0
bool EvaSystemTray::qt_invoke( int _id, QUObject* _o )
{
    switch ( _id - staticMetaObject()->slotOffset() ) {
    case 0: changeToolTip((const unsigned int)(*((const unsigned int*)static_QUType_ptr.get(_o+1))),(const QString&)static_QUType_QString.get(_o+2),(const short)(*((const short*)static_QUType_ptr.get(_o+3)))); break;
    case 1: setOnline(); break;
    case 2: setOffline(); break;
    case 3: setLeave(); break;
    case 4: setInvisible(); break;
    case 5: setLoginWaiting(); break;
    case 6: newTxtMessage((const unsigned int)(*((const unsigned int*)static_QUType_ptr.get(_o+1)))); break;
    case 7: newTxtMessage((const unsigned int)(*((const unsigned int*)static_QUType_ptr.get(_o+1))),(short)(*((short*)static_QUType_ptr.get(_o+2)))); break;
    case 8: gotTxtMessage((const unsigned int)(*((const unsigned int*)static_QUType_ptr.get(_o+1)))); break;
    case 9: newSysMessage(); break;
    case 10: gotSysMessage(); break;
    case 11: static_QUType_int.set(_o,getSenderID()); break;
    case 12: slotTimeout(); break;
    case 13: slotClickTimeout(); break;
    case 14: minMaxAction(); break;
    default:
	return KSystemTray::qt_invoke( _id, _o );
    }
    return TRUE;
}