// Richiesta connessione TCP in ingresso void DuktoProtocol::newIncomingConnection() { // Verifica presenza connessione pendente if (!mTcpServer->hasPendingConnections()) return; // Recupero connessione QTcpSocket *s = mTcpServer->nextPendingConnection(); // Se sto già ricevendo o inviando, rifiuto la connessione if (mIsReceiving || mIsSending) { s->close(); return; } // Aggiornamento interfaccia grafica receiveFileStart(s->peerAddress().toString()); // Impostazione socket TCP corrente mCurrentSocket = s; // Attesa header della connessione (timeout 10 sec) if (!s->waitForReadyRead(10000)) { // Non ho ricevuto l'header della connessione, chiudo mCurrentSocket->close(); delete mCurrentSocket; mCurrentSocket = NULL; return; } // Registrazione gestori eventi socket connect(mCurrentSocket, SIGNAL(readyRead()), this, SLOT(readNewData()), Qt::DirectConnection); connect(mCurrentSocket, SIGNAL(disconnected()), this, SLOT(closedConnectionTmp()), Qt::QueuedConnection); // Inizializzazione variabili mIsReceiving = true; mTotalReceivedData = 0; mElementSize = -1; mReceivedFiles = new QStringList(); mRootFolderName = ""; mRootFolderRenamed = ""; mReceivingText = false; mRecvStatus = FILENAME; // -- Lettura header generale -- // Numero entità da ricevere mCurrentSocket->read((char*) &mElementsToReceiveCount, sizeof(qint64)); // Dimensione totale mCurrentSocket->read((char*) &mTotalSize, sizeof(qint64)); // Inizio lettura dati sui file readNewData(); }
void MainWindow::connectOpened() { // Sending broadcast hello mProtocol->initSockets(); connect(mProtocol, SIGNAL(peerListChanged()), this, SLOT(refreshPeerList())); connect(mProtocol, SIGNAL(sendFileComplete(QStringList*)), this, SLOT(sendFileComplete(QStringList*))); connect(mProtocol, SIGNAL(sendFileError(int)), this, SLOT(sendFileError(int))); connect(mProtocol, SIGNAL(receiveFileStart()), this, SLOT(receiveFileStart())); connect(mProtocol, SIGNAL(receiveFileComplete(QStringList*)), this, SLOT(receiveFileComplete(QStringList*))); connect(mProtocol, SIGNAL(receiveFileCancelled()), this, SLOT(receiveFileCancelled())); connect(mProtocol, SIGNAL(transferStatusUpdate(int)), this, SLOT(transferStatusUpdate(int)), Qt::DirectConnection); connect(mProtocol, SIGNAL(receiveTextComplete(QString*)), this, SLOT(receiveTextComplete(QString*))); mProtocol->sayHello(QHostAddress::Broadcast); // Hide connecting dialog mConnectingDialog->close(); delete mConnectingDialog; mConnectingDialog = NULL; }
void MainWindow::connectOpened() { // Sending broadcast hello mProtocol->initSockets(); connect(mProtocol, SIGNAL(peerListChanged()), this, SLOT(refreshPeerList())); connect(mProtocol, SIGNAL(sendFileComplete(QStringList*)), this, SLOT(sendFileComplete(QStringList*))); connect(mProtocol, SIGNAL(sendFileError(int)), this, SLOT(sendFileError(int))); connect(mProtocol, SIGNAL(receiveFileStart()), this, SLOT(receiveFileStart())); connect(mProtocol, SIGNAL(receiveFileComplete(QStringList*)), this, SLOT(receiveFileComplete(QStringList*))); connect(mProtocol, SIGNAL(receiveFileCancelled()), this, SLOT(receiveFileCancelled())); connect(mProtocol, SIGNAL(transferStatusUpdate(int)), this, SLOT(transferStatusUpdate(int)), Qt::DirectConnection); connect(mProtocol, SIGNAL(receiveTextComplete(QString*)), this, SLOT(receiveTextComplete(QString*))); // mProtocol->sayHello(QHostAddress::Broadcast); // Hide connecting dialog mConnectingDialog->close(); delete mConnectingDialog; mConnectingDialog = NULL; // Timer per l'invio dell'hello (a volte non viene inviato se lo invio subito) QTimer::singleShot(200, this, SLOT(sayHelloAgain())); }
// Richiesta connessione TCP in ingresso void DuktoProtocol::newIncomingConnection() { // Recieve connection QTcpSocket* s = mTcpServer->nextPendingConnection(); if(s == NULL) return; // If we are already recieving or sending // Pending header connection (timeout 10 sec) if ((mIsReceiving | mIsSending) || !s->waitForReadyRead(10000)) { s->close(); delete s; return; } // Update GUI receiveFileStart(s->peerAddress().toString()); // set current TCP socket mCurrentSocket = s; // Register socket's event handlers connect(mCurrentSocket, SIGNAL(readyRead()), this, SLOT(readNewData()), Qt::DirectConnection); connect(mCurrentSocket, SIGNAL(disconnected()), this, SLOT(closedConnectionTmp()), Qt::QueuedConnection); // Initialize variables mIsReceiving = true; mTotalReceivedData = 0; mElementSize = -1; mReceivedFiles = new QStringList(); mRootFolderName.clear(); mRootFolderRenamed.clear(); mReceivingText = false; mRecvStatus = FILENAME; // -- Reading General header -- // Entities number to receive mCurrentSocket->read((char*) &mElementsToReceiveCount, sizeof(qint64)); // total size mCurrentSocket->read((char*) &mTotalSize, sizeof(qint64)); // Start reading data on file readNewData(); }
GuiBehind::GuiBehind(DuktoWindow* view) : QObject(NULL), mView(view), mShowBackTimer(NULL), mPeriodicHelloTimer(NULL), mClipboard(NULL), mMiniWebServer(NULL), mSettings(NULL), mDestBuddy(NULL), mUpdatesChecker(NULL) { // Status variables mView->setGuiBehindReference(this); setCurrentTransferProgress(0); setTextSnippetSending(false); setShowUpdateBanner(false); // Clipboard object mClipboard = QApplication::clipboard(); connect(mClipboard, SIGNAL(dataChanged()), this, SLOT(clipboardChanged())); clipboardChanged(); // Add "Me" entry mBuddiesList.addMeElement(); // Add "Ip" entry mBuddiesList.addIpElement(); // Settings mSettings = new Settings(this); // Mini web server mMiniWebServer = new MiniWebServer(NETWORK_PORT + 1); // Destination buddy mDestBuddy = new DestinationBuddy(this); // Change current folder QDir::setCurrent(mSettings->currentPath()); // Set current theme color mTheme.setThemeColor(mSettings->themeColor()); // Init buddy list view->rootContext()->setContextProperty("buddiesListData", &mBuddiesList); view->rootContext()->setContextProperty("recentListData", &mRecentList); view->rootContext()->setContextProperty("ipAddressesData", &mIpAddresses); view->rootContext()->setContextProperty("guiBehind", this); view->rootContext()->setContextProperty("destinationBuddy", mDestBuddy); view->rootContext()->setContextProperty("theme", &mTheme); // Register protocol signals connect(&mDuktoProtocol, SIGNAL(peerListAdded(Peer)), this, SLOT(peerListAdded(Peer))); connect(&mDuktoProtocol, SIGNAL(peerListRemoved(Peer)), this, SLOT(peerListRemoved(Peer))); connect(&mDuktoProtocol, SIGNAL(receiveFileStart(QString)), this, SLOT(receiveFileStart(QString))); connect(&mDuktoProtocol, SIGNAL(transferStatusUpdate(qint64,qint64)), this, SLOT(transferStatusUpdate(qint64,qint64))); connect(&mDuktoProtocol, SIGNAL(receiveFileComplete(QStringList*,qint64)), this, SLOT(receiveFileComplete(QStringList*,qint64))); connect(&mDuktoProtocol, SIGNAL(receiveTextComplete(QString*,qint64)), this, SLOT(receiveTextComplete(QString*,qint64))); connect(&mDuktoProtocol, SIGNAL(sendFileComplete(QStringList*)), this, SLOT(sendFileComplete(QStringList*))); connect(&mDuktoProtocol, SIGNAL(sendFileError(int)), this, SLOT(sendFileError(int))); connect(&mDuktoProtocol, SIGNAL(receiveFileCancelled()), this, SLOT(receiveFileCancelled())); connect(&mDuktoProtocol, SIGNAL(sendFileAborted()), this, SLOT(sendFileAborted())); // Register other signals connect(this, SIGNAL(remoteDestinationAddressChanged()), this, SLOT(remoteDestinationAddressHandler())); // Say "hello" mDuktoProtocol.setPorts(NETWORK_PORT, NETWORK_PORT); mDuktoProtocol.initialize(); mDuktoProtocol.sayHello(QHostAddress::Broadcast); // Periodic "hello" timer mPeriodicHelloTimer = new QTimer(this); connect(mPeriodicHelloTimer, SIGNAL(timeout()), this, SLOT(periodicHello())); mPeriodicHelloTimer->start(60000); // Load GUI view->setSource(QUrl("qrc:/qml/dukto/Dukto.qml")); //view->setSource(QUrl::fromLocalFile("c:/users/emanuele/documenti/dukto/qml/dukto/Dukto.qml")); #ifndef Q_WS_S60 view->restoreGeometry(mSettings->windowGeometry()); #endif // Start random rotate mShowBackTimer = new QTimer(this); connect(mShowBackTimer, SIGNAL(timeout()), this, SLOT(showRandomBack())); qsrand(QDateTime::currentDateTime().toTime_t());; mShowBackTimer->start(10000); // Enqueue check for updates mUpdatesChecker = new UpdatesChecker(); connect(mUpdatesChecker, SIGNAL(updatesAvailable()), this, SLOT(showUpdatesMessage())); QTimer::singleShot(2000, mUpdatesChecker, SLOT(start())); // TEMP // Peer p(QHostAddress("172.16.3.3"), "Pippo at Pluto (Macintosh)"); // Peer p(QHostAddress("172.16.3.3"), "NomeUtenteMoltoLungoCheNonCiSta at IlMioPcCheHaUnNomeImpensabilmenteLungo (Macintosh)", 4644); // peerListAdded(p); }