From 808d8576027641da897c43dd607f89f26619beab Mon Sep 17 00:00:00 2001 From: xiaoyifang <105986+xiaoyifang@users.noreply.github.com> Date: Sun, 17 Nov 2024 09:19:07 +0800 Subject: [PATCH] fix: [dictserver] some word does not got displayed (#1958) * fix: [dictserver] some word does not got displayed --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- src/dict/dictserver.cc | 113 ++++++++++++++++------------------------- 1 file changed, 44 insertions(+), 69 deletions(-) diff --git a/src/dict/dictserver.cc b/src/dict/dictserver.cc index a30ba09a..21c0b71d 100644 --- a/src/dict/dictserver.cc +++ b/src/dict/dictserver.cc @@ -486,7 +486,7 @@ void DictServerWordSearchRequest::run() qDebug() << "receive match:" << reply; auto code = reply.left( 3 ); - if ( reply.left( 3 ) != "152" ) { + if ( code != "152" ) { matchNext(); } @@ -574,8 +574,11 @@ class DictServerArticleRequest: public Dictionary::DataRequest DictServerDictionary & dict; string articleData; + QString articleText; + int currentDatabase = 0; DictServerState state; + QTimer * timer; bool contentInHtml = false; @@ -587,14 +590,21 @@ public: dict( dict_ ), dictImpl( new DictServerImpl( this, dict_.url, "GoldenDict-t" ) ) { + timer = new QTimer( this ); + timer->setInterval( 5000 ); + timer->setSingleShot( true ); + qDebug() << "receive data:" << QDateTime::currentDateTime(); + connect( timer, &QTimer::timeout, this, [ this ]() { + qDebug() << "Server takes too much time to response" << QDateTime::currentDateTime(); + cancel(); + } ); + connect( this, &DictServerArticleRequest::finishedArticle, this, [ this ]( QString articleText ) { if ( Utils::AtomicInt::loadAcquire( isCancelled ) ) { cancel(); return; } - qDebug() << articleText; - static QRegularExpression phonetic( R"(\\([^\\]+)\\)", QRegularExpression::CaseInsensitiveOption ); // phonetics: \stuff\ ... static QRegularExpression divs_inside_phonetic( "]*)>]*)>", @@ -687,10 +697,7 @@ public: defineNext(); } ); - QTimer::singleShot( 5000, this, [ this ]() { - qDebug() << "Server takes too much time to response"; - cancel(); - } ); + timer->start(); } void run(); @@ -723,9 +730,9 @@ void DictServerArticleRequest::run() return; } - connect( &dictImpl->socket, &QTcpSocket::readyRead, this, [ this ]() { QMutexLocker const _( &dictImpl->mutex ); + timer->start(); if ( state == DictServerState::DEFINE ) { QByteArray reply = dictImpl->socket.readLine(); qDebug() << "receive define:" << reply; @@ -748,34 +755,19 @@ void DictServerArticleRequest::run() if ( reply.left( 3 ) == "150" ) { // Articles found int countPos = reply.indexOf( ' ', 4 ); - - QString articleText; - - // Get articles count + // Get articles count, + // todo ,how to use this count? int count = reply.mid( 4, countPos > 4 ? countPos - 4 : -1 ).toInt(); // Read articles - for ( int x = 0; x < count; x++ ) { - reply = dictImpl->socket.readLine(); - if ( reply.isEmpty() ) { - state = DictServerState::DEFINE_DATA; - return; - } - readData( reply ); - } + readData( reply ); state = DictServerState::DEFINE_DATA; } } else if ( state == DictServerState::DEFINE_DATA ) { QByteArray reply = dictImpl->socket.readLine(); - qDebug() << "receive define data:" << reply; - while ( true ) { - if ( reply.isEmpty() ) { - return; - } - readData( reply ); - reply = dictImpl->socket.readLine(); - } + qDebug() << "receive define data:" << reply << QDateTime::currentDateTime(); + readData( reply ); } } ); @@ -814,7 +806,8 @@ void DictServerArticleRequest::readData( QByteArray reply ) pos = endPos + 1; - QString dbID, dbName; + QString dbID; + QString dbName; // Retrieve database ID endPos = reply.indexOf( ' ', pos ); @@ -827,8 +820,7 @@ void DictServerArticleRequest::readData( QByteArray reply ) dbID = reply.mid( pos, endPos - pos ); // Retrieve database ID - pos = endPos + 1; - endPos = reply.indexOf( ' ', pos ); + pos = endPos + 1; if ( reply[ pos ] == '\"' ) { endPos = reply.indexOf( '\"', pos + 1 ) + 1; } @@ -852,47 +844,30 @@ void DictServerArticleRequest::readData( QByteArray reply ) articleData += string( "
" ) + dbName.toUtf8().data() + "[" + dbID.toUtf8().data() + "]" + "
"; - // Retreive MIME headers if any + reply = dictImpl->socket.readAll(); - static QRegularExpression contentTypeExpr( "Content-Type\\s*:\\s*text/html", - QRegularExpression::CaseInsensitiveOption ); - - for ( ;; ) { - reply = dictImpl->socket.readLine(); - if ( reply.isEmpty() ) { - return; - } - - if ( reply == "\r\n" ) { - break; - } - - QRegularExpressionMatch match = contentTypeExpr.match( reply ); - if ( match.hasMatch() ) { - contentInHtml = true; - } - } - QString articleText; - // Retrieve article text - - articleText.clear(); - for ( ;; ) { - reply = dictImpl->socket.readLine(); - if ( reply.isEmpty() ) { - return; - } - - qDebug() << "reply data:" << reply; - if ( reply == ".\r\n" ) { - //discard all left message. - while ( !dictImpl->socket.readLine().isEmpty() ) {} - emit finishedArticle( articleText ); - return; - } - - articleText += reply; + articleText += reply; + qDebug() << "reply data:" << reply << QDateTime::currentDateTime(); + if ( articleText.contains( "\r\n.\r\n" ) ) { + //discard all left message. + emit finishedArticle( articleText ); + return; } } + else { + articleText += reply; + reply = dictImpl->socket.readAll(); + qDebug() << "reply data:" << reply << QDateTime::currentDateTime(); + + articleText += reply; + if ( reply.contains( "\r\n.\r\n" ) ) { + //discard all left message. maybe delete all the remaining data after `.\r\n` + emit finishedArticle( articleText ); + return; + } + } + //restart. + timer->start(); } void DictServerArticleRequest::cancel()