some bugs fixed in local server/client communication

This commit is contained in:
Luis Ángel San Martín
2013-08-24 20:13:38 +02:00
parent 8ae63e562a
commit b684b580ed
7 changed files with 95 additions and 81 deletions

View File

@ -398,6 +398,7 @@ QList<LibraryItem *> DBHelper::getFoldersFromParent(qulonglong parentId, QSqlDat
return list;
}
//TODO sort using natural sorting and issue number
QList<ComicDB> DBHelper::getSortedComicsFromParent(qulonglong parentId, QSqlDatabase & db)
{

View File

@ -29,6 +29,8 @@ int main( int argc, char ** argv )
app.installTranslator(&viewerTranslator);
app.setApplicationName("YACReaderLibrary");
qRegisterMetaType<ComicDB>("ComicDB");
#ifdef SERVER_RELEASE
QSettings * settings = new QSettings(QCoreApplication::applicationDirPath()+"/YACReaderLibrary.ini",QSettings::IniFormat); //TODO unificar la creaci<63>n del fichero de config con el servidor
settings->beginGroup("libraryConfig");

View File

@ -2,6 +2,7 @@
#include <QLocalServer>
#include <QLocalSocket>
#include <QPointer>
#include "yacreader_global.h"
#include "db_helper.h"
@ -28,17 +29,15 @@ bool YACReaderLocalServer::isListening()
void YACReaderLocalServer::sendResponse()
{
QLocalSocket *clientConnection = localServer->nextPendingConnection();
connect(clientConnection, SIGNAL(disconnected()),
clientConnection, SLOT(deleteLater()));
QLocalSocket *clientConnection = localServer->nextPendingConnection();
//connect(clientConnection, SIGNAL(disconnected()),clientConnection, SLOT(deleteLater()));
qRegisterMetaType<ComicDB>("ComicDB");
YACReaderClientConnectionWorker * worker = new YACReaderClientConnectionWorker(clientConnection);
connect(worker,SIGNAL(comicUpdated(quint64, ComicDB)),this,SIGNAL(comicUpdated(quint64, ComicDB)));
connect(worker,SIGNAL(finished()),worker,SLOT(deleteLater()));
worker->start();
//clientConnection->waitForBytesWritten();*/
//clientConnection->disconnectFromServer();
YACReaderClientConnectionWorker * worker = new YACReaderClientConnectionWorker(clientConnection);
connect(worker,SIGNAL(comicUpdated(quint64, ComicDB)),this,SIGNAL(comicUpdated(quint64, ComicDB)));
connect(worker,SIGNAL(finished()),worker,SLOT(deleteLater()));
worker->start();
//clientConnection->waitForBytesWritten();*/
//clientConnection->disconnectFromServer();
}
bool YACReaderLocalServer::isRunning()
@ -57,78 +56,85 @@ YACReaderClientConnectionWorker::YACReaderClientConnectionWorker( QLocalSocket *
}
YACReaderClientConnectionWorker::~YACReaderClientConnectionWorker()
{
}
void YACReaderClientConnectionWorker::run()
{
quint64 libraryId;
ComicDB comic;
int tries = 0;
quint64 libraryId;
ComicDB comic;
int tries = 0;
//QByteArray data;
while(clientConnection->bytesAvailable() < sizeof(quint16) && tries < 200)
{
clientConnection->waitForReadyRead(10);
tries++;
}
if(tries == 200)
return;
QDataStream sizeStream(clientConnection->read(sizeof(quint16)));
sizeStream.setVersion(QDataStream::Qt_4_8);
quint16 totalSize = 0;
sizeStream >> totalSize;
//QByteArray data;
while(clientConnection->bytesAvailable() < sizeof(quint16) && tries < 200)
{
clientConnection->waitForReadyRead(10);
tries++;
}
if(tries == 200)
return;
QDataStream sizeStream(clientConnection->read(sizeof(quint16)));
sizeStream.setVersion(QDataStream::Qt_4_8);
quint16 totalSize = 0;
sizeStream >> totalSize;
tries = 0;
while(clientConnection->bytesAvailable() < totalSize && tries < 200)
{
clientConnection->waitForReadyRead(10);
tries++;
}
if(tries == 200)
return;
QDataStream dataStream(clientConnection->read(totalSize));
quint8 msgType;
dataStream >> msgType;
dataStream >> libraryId;
dataStream >> comic;
tries = 0;
while(clientConnection->bytesAvailable() < totalSize && tries < 200)
{
clientConnection->waitForReadyRead(10);
tries++;
}
if(tries == 200)
return;
QDataStream dataStream(clientConnection->read(totalSize));
quint8 msgType;
dataStream >> msgType;
dataStream >> libraryId;
dataStream >> comic;
switch (msgType)
{
case YACReader::RequestComicInfo:
{
QList<ComicDB> siblings;
getComicInfo(libraryId,comic,siblings);
switch (msgType)
{
case YACReader::RequestComicInfo:
{
QList<ComicDB> siblings;
getComicInfo(libraryId,comic,siblings);
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_8);
out << (quint16)0;
out << comic;
out << siblings;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_8);
out << (quint16)0;
out << comic;
out << siblings;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
int written = 0;
tries = 0;
while(written != block.size() && tries < 200)
{
int ret = clientConnection->write(block);
if(ret != -1)
{
int written = 0;
tries = 0;
while(written != block.size() && tries < 200)
{
int ret = clientConnection->write(block);
if(ret != -1)
{
written += ret;
clientConnection->flush();
}
else
tries++;
}
break;
}
case YACReader::SendComicInfo:
{
updateComic(libraryId,comic);
//clientConnection->disconnectFromServer();
break;
}
}
else
tries++;
}
break;
}
case YACReader::SendComicInfo:
{
updateComic(libraryId,comic);
//clientConnection->disconnectFromServer();
break;
}
}
}
clientConnection->waitForDisconnected();
clientConnection->deleteLater();
}
void YACReaderClientConnectionWorker::getComicInfo(quint64 libraryId, ComicDB & comic, QList<ComicDB> & siblings)

View File

@ -30,6 +30,7 @@ class YACReaderClientConnectionWorker : public QThread
Q_OBJECT
public:
YACReaderClientConnectionWorker( QLocalSocket *clientConnection);
~YACReaderClientConnectionWorker();
signals:
void comicUpdated(quint64 libraryId, const ComicDB & comic);
private: