mirror of
https://github.com/xiaoyifang/goldendict-ng.git
synced 2024-11-27 15:24:05 +00:00
Compare commits
13 commits
8b3e94757c
...
9a41f99fab
Author | SHA1 | Date | |
---|---|---|---|
9a41f99fab | |||
808d857602 | |||
3c5233f2a1 | |||
c5ca1b7d63 | |||
5092ebe2ee | |||
5bef4cef22 | |||
59d01868da | |||
10b0496cce | |||
1cf495e7dd | |||
c2fc90801b | |||
2de2141758 | |||
db4c352d6c | |||
7c32cad65a |
|
@ -486,7 +486,7 @@ void DictServerWordSearchRequest::run()
|
||||||
qDebug() << "receive match:" << reply;
|
qDebug() << "receive match:" << reply;
|
||||||
auto code = reply.left( 3 );
|
auto code = reply.left( 3 );
|
||||||
|
|
||||||
if ( reply.left( 3 ) != "152" ) {
|
if ( code != "152" ) {
|
||||||
|
|
||||||
matchNext();
|
matchNext();
|
||||||
}
|
}
|
||||||
|
@ -574,8 +574,11 @@ class DictServerArticleRequest: public Dictionary::DataRequest
|
||||||
DictServerDictionary & dict;
|
DictServerDictionary & dict;
|
||||||
string articleData;
|
string articleData;
|
||||||
|
|
||||||
|
QString articleText;
|
||||||
|
|
||||||
int currentDatabase = 0;
|
int currentDatabase = 0;
|
||||||
DictServerState state;
|
DictServerState state;
|
||||||
|
QTimer * timer;
|
||||||
bool contentInHtml = false;
|
bool contentInHtml = false;
|
||||||
|
|
||||||
|
|
||||||
|
@ -587,14 +590,21 @@ public:
|
||||||
dict( dict_ ),
|
dict( dict_ ),
|
||||||
dictImpl( new DictServerImpl( this, dict_.url, "GoldenDict-t" ) )
|
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 ) {
|
connect( this, &DictServerArticleRequest::finishedArticle, this, [ this ]( QString articleText ) {
|
||||||
if ( Utils::AtomicInt::loadAcquire( isCancelled ) ) {
|
if ( Utils::AtomicInt::loadAcquire( isCancelled ) ) {
|
||||||
cancel();
|
cancel();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug() << articleText;
|
|
||||||
|
|
||||||
static QRegularExpression phonetic( R"(\\([^\\]+)\\)",
|
static QRegularExpression phonetic( R"(\\([^\\]+)\\)",
|
||||||
QRegularExpression::CaseInsensitiveOption ); // phonetics: \stuff\ ...
|
QRegularExpression::CaseInsensitiveOption ); // phonetics: \stuff\ ...
|
||||||
static QRegularExpression divs_inside_phonetic( "</div([^>]*)><div([^>]*)>",
|
static QRegularExpression divs_inside_phonetic( "</div([^>]*)><div([^>]*)>",
|
||||||
|
@ -687,10 +697,7 @@ public:
|
||||||
defineNext();
|
defineNext();
|
||||||
} );
|
} );
|
||||||
|
|
||||||
QTimer::singleShot( 5000, this, [ this ]() {
|
timer->start();
|
||||||
qDebug() << "Server takes too much time to response";
|
|
||||||
cancel();
|
|
||||||
} );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void run();
|
void run();
|
||||||
|
@ -723,9 +730,9 @@ void DictServerArticleRequest::run()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
connect( &dictImpl->socket, &QTcpSocket::readyRead, this, [ this ]() {
|
connect( &dictImpl->socket, &QTcpSocket::readyRead, this, [ this ]() {
|
||||||
QMutexLocker const _( &dictImpl->mutex );
|
QMutexLocker const _( &dictImpl->mutex );
|
||||||
|
timer->start();
|
||||||
if ( state == DictServerState::DEFINE ) {
|
if ( state == DictServerState::DEFINE ) {
|
||||||
QByteArray reply = dictImpl->socket.readLine();
|
QByteArray reply = dictImpl->socket.readLine();
|
||||||
qDebug() << "receive define:" << reply;
|
qDebug() << "receive define:" << reply;
|
||||||
|
@ -748,34 +755,19 @@ void DictServerArticleRequest::run()
|
||||||
if ( reply.left( 3 ) == "150" ) {
|
if ( reply.left( 3 ) == "150" ) {
|
||||||
// Articles found
|
// Articles found
|
||||||
int countPos = reply.indexOf( ' ', 4 );
|
int countPos = reply.indexOf( ' ', 4 );
|
||||||
|
// Get articles count,
|
||||||
QString articleText;
|
// todo ,how to use this count?
|
||||||
|
|
||||||
// Get articles count
|
|
||||||
int count = reply.mid( 4, countPos > 4 ? countPos - 4 : -1 ).toInt();
|
int count = reply.mid( 4, countPos > 4 ? countPos - 4 : -1 ).toInt();
|
||||||
|
|
||||||
// Read articles
|
// 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;
|
state = DictServerState::DEFINE_DATA;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ( state == DictServerState::DEFINE_DATA ) {
|
else if ( state == DictServerState::DEFINE_DATA ) {
|
||||||
QByteArray reply = dictImpl->socket.readLine();
|
QByteArray reply = dictImpl->socket.readLine();
|
||||||
qDebug() << "receive define data:" << reply;
|
qDebug() << "receive define data:" << reply << QDateTime::currentDateTime();
|
||||||
while ( true ) {
|
|
||||||
if ( reply.isEmpty() ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
readData( reply );
|
readData( reply );
|
||||||
reply = dictImpl->socket.readLine();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
@ -814,7 +806,8 @@ void DictServerArticleRequest::readData( QByteArray reply )
|
||||||
|
|
||||||
pos = endPos + 1;
|
pos = endPos + 1;
|
||||||
|
|
||||||
QString dbID, dbName;
|
QString dbID;
|
||||||
|
QString dbName;
|
||||||
|
|
||||||
// Retrieve database ID
|
// Retrieve database ID
|
||||||
endPos = reply.indexOf( ' ', pos );
|
endPos = reply.indexOf( ' ', pos );
|
||||||
|
@ -828,7 +821,6 @@ void DictServerArticleRequest::readData( QByteArray reply )
|
||||||
|
|
||||||
// Retrieve database ID
|
// Retrieve database ID
|
||||||
pos = endPos + 1;
|
pos = endPos + 1;
|
||||||
endPos = reply.indexOf( ' ', pos );
|
|
||||||
if ( reply[ pos ] == '\"' ) {
|
if ( reply[ pos ] == '\"' ) {
|
||||||
endPos = reply.indexOf( '\"', pos + 1 ) + 1;
|
endPos = reply.indexOf( '\"', pos + 1 ) + 1;
|
||||||
}
|
}
|
||||||
|
@ -852,47 +844,30 @@ void DictServerArticleRequest::readData( QByteArray reply )
|
||||||
articleData += string( "<div class=\"dictserver_from\">" ) + dbName.toUtf8().data() + "[" + dbID.toUtf8().data()
|
articleData += string( "<div class=\"dictserver_from\">" ) + dbName.toUtf8().data() + "[" + dbID.toUtf8().data()
|
||||||
+ "]" + "</div>";
|
+ "]" + "</div>";
|
||||||
|
|
||||||
// Retreive MIME headers if any
|
reply = dictImpl->socket.readAll();
|
||||||
|
|
||||||
static QRegularExpression contentTypeExpr( "Content-Type\\s*:\\s*text/html",
|
articleText += reply;
|
||||||
QRegularExpression::CaseInsensitiveOption );
|
qDebug() << "reply data:" << reply << QDateTime::currentDateTime();
|
||||||
|
if ( articleText.contains( "\r\n.\r\n" ) ) {
|
||||||
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.
|
//discard all left message.
|
||||||
while ( !dictImpl->socket.readLine().isEmpty() ) {}
|
|
||||||
emit finishedArticle( articleText );
|
emit finishedArticle( articleText );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
articleText += reply;
|
||||||
|
reply = dictImpl->socket.readAll();
|
||||||
|
qDebug() << "reply data:" << reply << QDateTime::currentDateTime();
|
||||||
|
|
||||||
articleText += reply;
|
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()
|
void DictServerArticleRequest::cancel()
|
||||||
|
|
|
@ -224,7 +224,7 @@ void loadDictionaries( QWidget * parent,
|
||||||
|
|
||||||
loadDicts.wait();
|
loadDicts.wait();
|
||||||
|
|
||||||
if ( loadDicts.getExceptionText().size() ) {
|
if ( !loadDicts.getExceptionText().empty() ) {
|
||||||
QMessageBox::critical( parent,
|
QMessageBox::critical( parent,
|
||||||
QCoreApplication::translate( "LoadDictionaries", "Error loading dictionaries" ),
|
QCoreApplication::translate( "LoadDictionaries", "Error loading dictionaries" ),
|
||||||
QString::fromUtf8( loadDicts.getExceptionText().c_str() ) );
|
QString::fromUtf8( loadDicts.getExceptionText().c_str() ) );
|
||||||
|
|
|
@ -204,26 +204,11 @@ void EditDictionaries::acceptChangedSources( bool rebuildGroups )
|
||||||
// Those hold pointers to dictionaries, we need to free them.
|
// Those hold pointers to dictionaries, we need to free them.
|
||||||
groupInstances.clear();
|
groupInstances.clear();
|
||||||
|
|
||||||
groups.clear();
|
|
||||||
orderAndProps.clear();
|
|
||||||
|
|
||||||
loadDictionaries( this, cfg, dictionaries, dictNetMgr );
|
loadDictionaries( this, cfg, dictionaries, dictNetMgr );
|
||||||
|
|
||||||
Instances::updateNames( savedGroups, dictionaries );
|
|
||||||
Instances::updateNames( savedOrder, dictionaries );
|
|
||||||
Instances::updateNames( savedInactive, dictionaries );
|
|
||||||
|
|
||||||
if ( rebuildGroups ) {
|
if ( rebuildGroups ) {
|
||||||
ui.tabs->removeTab( 1 );
|
orderAndProps->rebuild( savedOrder, savedInactive, dictionaries );
|
||||||
ui.tabs->removeTab( 1 );
|
groups->rebuild( dictionaries, savedGroups, orderAndProps->getCurrentDictionaryOrder() );
|
||||||
|
|
||||||
orderAndProps = new OrderAndProps( this, savedOrder, savedInactive, dictionaries );
|
|
||||||
groups = new Groups( this, dictionaries, savedGroups, orderAndProps->getCurrentDictionaryOrder() );
|
|
||||||
|
|
||||||
ui.tabs->insertTab( 1, orderAndProps, QIcon( ":/icons/book.svg" ), tr( "&Dictionaries" ) );
|
|
||||||
ui.tabs->insertTab( 2, groups, QIcon( ":/icons/bookcase.svg" ), tr( "&Groups" ) );
|
|
||||||
connect( groups, &Groups::showDictionaryInfo, this, &EditDictionaries::showDictionaryInfo );
|
|
||||||
connect( orderAndProps, &OrderAndProps::showDictionaryHeadwords, this, &EditDictionaries::showDictionaryHeadwords );
|
|
||||||
}
|
}
|
||||||
setUpdatesEnabled( true );
|
setUpdatesEnabled( true );
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,6 +64,24 @@ Groups::Groups( QWidget * parent,
|
||||||
countChanged();
|
countChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Groups::rebuild( vector< sptr< Dictionary::Class > > const & dicts_,
|
||||||
|
Config::Groups const & groups_,
|
||||||
|
Config::Group const & order )
|
||||||
|
{
|
||||||
|
this->setUpdatesEnabled( false );
|
||||||
|
dicts = dicts_;
|
||||||
|
groups = groups_;
|
||||||
|
|
||||||
|
ui.dictionaries->setAsSource();
|
||||||
|
ui.dictionaries->populate( Instances::Group( order, dicts, Config::Group() ).dictionaries, dicts );
|
||||||
|
|
||||||
|
// Populate groups' widget
|
||||||
|
ui.groups->populate( groups, dicts, ui.dictionaries->getCurrentDictionaries() );
|
||||||
|
|
||||||
|
countChanged();
|
||||||
|
this->setUpdatesEnabled( true );
|
||||||
|
}
|
||||||
|
|
||||||
void Groups::editGroup( unsigned id )
|
void Groups::editGroup( unsigned id )
|
||||||
{
|
{
|
||||||
for ( int x = 0; x < groups.size(); ++x ) {
|
for ( int x = 0; x < groups.size(); ++x ) {
|
||||||
|
|
|
@ -18,7 +18,9 @@ public:
|
||||||
std::vector< sptr< Dictionary::Class > > const &,
|
std::vector< sptr< Dictionary::Class > > const &,
|
||||||
Config::Groups const &,
|
Config::Groups const &,
|
||||||
Config::Group const & order );
|
Config::Group const & order );
|
||||||
|
void rebuild( std::vector< sptr< Dictionary::Class > > const & dicts_,
|
||||||
|
Config::Groups const & groups_,
|
||||||
|
Config::Group const & order );
|
||||||
/// Instructs the dialog to position itself on editing the given group.
|
/// Instructs the dialog to position itself on editing the given group.
|
||||||
void editGroup( unsigned id );
|
void editGroup( unsigned id );
|
||||||
|
|
||||||
|
@ -31,7 +33,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::Groups ui;
|
Ui::Groups ui;
|
||||||
std::vector< sptr< Dictionary::Class > > const & dicts;
|
std::vector< sptr< Dictionary::Class > > dicts;
|
||||||
Config::Groups groups;
|
Config::Groups groups;
|
||||||
|
|
||||||
QToolButton * groupsListButton;
|
QToolButton * groupsListButton;
|
||||||
|
|
|
@ -133,6 +133,25 @@ OrderAndProps::OrderAndProps( QWidget * parent,
|
||||||
showDictNumbers();
|
showDictNumbers();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OrderAndProps::rebuild( Config::Group const & dictionaryOrder,
|
||||||
|
Config::Group const & inactiveDictionaries,
|
||||||
|
std::vector< sptr< Dictionary::Class > > const & allDictionaries )
|
||||||
|
{
|
||||||
|
Instances::Group order( dictionaryOrder, allDictionaries, Config::Group() );
|
||||||
|
Instances::Group inactive( inactiveDictionaries, allDictionaries, Config::Group() );
|
||||||
|
|
||||||
|
Instances::complementDictionaryOrder( order, inactive, allDictionaries );
|
||||||
|
|
||||||
|
setUpdatesEnabled( false );
|
||||||
|
ui.dictionaryOrder->populate( order.dictionaries, allDictionaries );
|
||||||
|
ui.inactiveDictionaries->populate( inactive.dictionaries, allDictionaries );
|
||||||
|
|
||||||
|
disableDictionaryDescription();
|
||||||
|
|
||||||
|
showDictNumbers();
|
||||||
|
setUpdatesEnabled( true );
|
||||||
|
}
|
||||||
|
|
||||||
Config::Group OrderAndProps::getCurrentDictionaryOrder() const
|
Config::Group OrderAndProps::getCurrentDictionaryOrder() const
|
||||||
{
|
{
|
||||||
Instances::Group g;
|
Instances::Group g;
|
||||||
|
|
|
@ -17,7 +17,9 @@ public:
|
||||||
Config::Group const & dictionaryOrder,
|
Config::Group const & dictionaryOrder,
|
||||||
Config::Group const & inactiveDictionaries,
|
Config::Group const & inactiveDictionaries,
|
||||||
std::vector< sptr< Dictionary::Class > > const & allDictionaries );
|
std::vector< sptr< Dictionary::Class > > const & allDictionaries );
|
||||||
|
void rebuild( Config::Group const & dictionaryOrder,
|
||||||
|
Config::Group const & inactiveDictionaries,
|
||||||
|
std::vector< sptr< Dictionary::Class > > const & allDictionaries );
|
||||||
Config::Group getCurrentDictionaryOrder() const;
|
Config::Group getCurrentDictionaryOrder() const;
|
||||||
Config::Group getCurrentInactiveDictionaries() const;
|
Config::Group getCurrentInactiveDictionaries() const;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue