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()