diff --git a/YACReader/YACReader.pro b/YACReader/YACReader.pro index b17ffb7f..4de102fe 100644 --- a/YACReader/YACReader.pro +++ b/YACReader/YACReader.pro @@ -37,10 +37,7 @@ LIBS += -L../dependencies/poppler/lib -loleaut32 -lole32 LIBS += -lpoppler-qt5 INCLUDEPATH += ../dependencies/poppler/include/qt5 -QMAKE_CXXFLAGS_RELEASE += /MP /Ob2 /Oi /Ot /GT -!CONFIG(no_opengl) { - QMAKE_CXXFLAGS_RELEASE += /GL -} +QMAKE_CXXFLAGS_RELEASE += /02 /MP /Ob2 /Oi /Ot /GT /GL QMAKE_LFLAGS_RELEASE += /LTCG CONFIG -= embed_manifest_exe } diff --git a/YACReaderLibrary/YACReaderLibrary.pro b/YACReaderLibrary/YACReaderLibrary.pro index b33896f7..e3cbaba0 100644 --- a/YACReaderLibrary/YACReaderLibrary.pro +++ b/YACReaderLibrary/YACReaderLibrary.pro @@ -32,10 +32,7 @@ LIBS += -L../dependencies/poppler/lib -loleaut32 -lole32 -lshell32 LIBS += -lpoppler-qt5 INCLUDEPATH += ../dependencies/poppler/include/qt5 -QMAKE_CXXFLAGS_RELEASE += /MP /Ob2 /Oi /Ot /GT -!CONFIG(no_opengl) { - QMAKE_CXXFLAGS_RELEASE += /GL -} +QMAKE_CXXFLAGS_RELEASE += /02 /MP /Ob2 /Oi /Ot /GT /GL QMAKE_LFLAGS_RELEASE += /LTCG CONFIG -= embed_manifest_exe } diff --git a/YACReaderLibrary/db_helper.cpp b/YACReaderLibrary/db_helper.cpp index c442af91..44819fb2 100644 --- a/YACReaderLibrary/db_helper.cpp +++ b/YACReaderLibrary/db_helper.cpp @@ -348,7 +348,7 @@ void DBHelper::update(ComicInfo * comicInfo, QSqlDatabase & db) updateComicInfo.bindValue(":comicVineID", comicInfo->comicVineID); - updateComicInfo.exec(); + updateComicInfo.exec(); } void DBHelper::updateRead(ComicInfo * comicInfo, QSqlDatabase & db) @@ -391,6 +391,44 @@ void DBHelper::updateProgress(qulonglong libraryId, const ComicInfo &comicInfo) QSqlDatabase::removeDatabase(libraryPath); } +void DBHelper::updateReadingRemoteProgress(const ComicInfo &comicInfo, QSqlDatabase &db) +{ + QSqlQuery updateComicInfo(db); + updateComicInfo.prepare("UPDATE comic_info SET " + "read = :read, " + "currentPage = :currentPage, " + "hasBeenOpened = :hasBeenOpened" + " WHERE id = :id "); + + updateComicInfo.bindValue(":read", comicInfo.read?1:0); + updateComicInfo.bindValue(":currentPage", comicInfo.currentPage); + updateComicInfo.bindValue(":hasBeenOpened", comicInfo.hasBeenOpened?1:0); + updateComicInfo.bindValue(":id", comicInfo.id); + updateComicInfo.exec(); +} + + +void DBHelper::updateFromRemoteClient(qulonglong libraryId,const ComicInfo & comicInfo) +{ + QString libraryPath = DBHelper::getLibraries().getPath(libraryId); + QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath+"/.yacreaderlibrary"); + + ComicDB comic = DBHelper::loadComic(comicInfo.id,db); + + if(comic.info.hash == comicInfo.hash) + { + if(comic.info.currentPage == comic.info.numPages) + comic.info.read = true; + comic.info.currentPage = comicInfo.currentPage; + comic.info.hasBeenOpened = true; + + DBHelper::updateReadingRemoteProgress(comic.info,db); + } + + db.close(); + QSqlDatabase::removeDatabase(libraryPath); +} + void DBHelper::renameLabel(qulonglong id, const QString &name, QSqlDatabase &db) { QSqlQuery renameLabelQuery(db); diff --git a/YACReaderLibrary/db_helper.h b/YACReaderLibrary/db_helper.h index b104b48f..5eb2eae3 100644 --- a/YACReaderLibrary/db_helper.h +++ b/YACReaderLibrary/db_helper.h @@ -57,6 +57,8 @@ public: static void updateRead(ComicInfo * comicInfo, QSqlDatabase & db); static void update(const Folder & folder, QSqlDatabase & db); static void updateProgress(qulonglong libraryId,const ComicInfo & comicInfo); + static void updateReadingRemoteProgress(const ComicInfo & comicInfo, QSqlDatabase & db); + static void updateFromRemoteClient(qulonglong libraryId,const ComicInfo & comicInfo); static void renameLabel(qulonglong id, const QString & name, QSqlDatabase & db); static void renameList(qulonglong id, const QString & name, QSqlDatabase & db); static void reasignOrderToSublists(QList ids, QSqlDatabase & db); diff --git a/YACReaderLibrary/library_window.cpp b/YACReaderLibrary/library_window.cpp index 2b620a09..691c33ea 100644 --- a/YACReaderLibrary/library_window.cpp +++ b/YACReaderLibrary/library_window.cpp @@ -570,7 +570,7 @@ void LibraryWindow::createActions() setAllAsNonReadAction->setIcon(QIcon(":/images/setAllUnread.png"));*/ showHideMarksAction = new QAction(tr("Show/Hide marks"),this); - showHideMarksAction->setToolTip(tr("Show or hide readed marks")); + showHideMarksAction->setToolTip(tr("Show or hide read marks")); showHideMarksAction->setData(SHOW_HIDE_MARKS_ACTION_YL); showHideMarksAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SHOW_HIDE_MARKS_ACTION_YL)); showHideMarksAction->setCheckable(true); diff --git a/YACReaderLibrary/server/controllers/synccontroller.cpp b/YACReaderLibrary/server/controllers/synccontroller.cpp new file mode 100644 index 00000000..7c4c1859 --- /dev/null +++ b/YACReaderLibrary/server/controllers/synccontroller.cpp @@ -0,0 +1,55 @@ +#include "synccontroller.h" + +#include "QsLog.h" +#include + +#include "comic_db.h" +#include "db_helper.h" + +SyncController::SyncController() +{ + +} + +void SyncController::service(HttpRequest &request, HttpResponse &response) +{ + QString postData = QString::fromUtf8(request.getBody()); + + QLOG_INFO() << "POST DATA: " << postData; + + if(postData.length()>0) { + QList data = postData.split("\n"); + + qulonglong libraryId; + qulonglong comicId; + int currentPage; + QString hash; + foreach(QString comicInfo, data) + { + QList comicInfoProgress = comicInfo.split("\t"); + + if(comicInfoProgress.length() == 4) + { + libraryId = comicInfoProgress.at(0).toULongLong(); + comicId = comicInfoProgress.at(1).toULongLong(); + hash = comicInfoProgress.at(2); + currentPage = comicInfoProgress.at(3).toInt(); + + ComicInfo info; + info.currentPage = currentPage; + info.hash = hash; //TODO remove the hash check and add UUIDs for libraries + info.id = comicId; + DBHelper::updateFromRemoteClient(libraryId,info); + } + } + } + else + { + response.setStatus(412,"No comic info received"); + response.writeText("",true); + return; + } + + response.write("OK",true); +} + diff --git a/YACReaderLibrary/server/controllers/synccontroller.h b/YACReaderLibrary/server/controllers/synccontroller.h new file mode 100644 index 00000000..6f6a5d76 --- /dev/null +++ b/YACReaderLibrary/server/controllers/synccontroller.h @@ -0,0 +1,21 @@ +#ifndef SYNCCONTROLLER_H +#define SYNCCONTROLLER_H + +#include + +#include "httprequest.h" +#include "httpresponse.h" +#include "httprequesthandler.h" + +class SyncController : public HttpRequestHandler { + Q_OBJECT + Q_DISABLE_COPY(SyncController); +public: + /** Constructor */ + SyncController(); + + /** Generates the response */ + void service(HttpRequest& request, HttpResponse& response); +}; + +#endif // SYNCCONTROLLER_H diff --git a/YACReaderLibrary/server/requestmapper.cpp b/YACReaderLibrary/server/requestmapper.cpp index 87057869..66b03413 100644 --- a/YACReaderLibrary/server/requestmapper.cpp +++ b/YACReaderLibrary/server/requestmapper.cpp @@ -21,6 +21,7 @@ #include "controllers/updatecomiccontroller.h" #include "controllers/errorcontroller.h" #include "controllers/comicdownloadinfocontroller.h" +#include "controllers/synccontroller.h" #include "db_helper.h" #include "yacreader_libraries.h" @@ -91,81 +92,86 @@ void RequestMapper::loadSession(HttpRequest & request, HttpResponse& response) } void RequestMapper::service(HttpRequest& request, HttpResponse& response) { - QByteArray path=request.getPath(); - qDebug("RequestMapper: path=%s",path.data()); + QByteArray path=request.getPath(); + qDebug("RequestMapper: path=%s",path.data()); - QRegExp folder("/library/.+/folder/[0-9]+/?");//get comic content - QRegExp folderInfo("/library/.+/folder/[0-9]+/info/?"); //get folder info + QRegExp folder("/library/.+/folder/[0-9]+/?");//get comic content + QRegExp folderInfo("/library/.+/folder/[0-9]+/info/?"); //get folder info QRegExp comicDownloadInfo("/library/.+/comic/[0-9]+/?"); //get comic info (basic/download info) QRegExp comicFullInfo("/library/.+/comic/[0-9]+/info/?"); //get comic info (full info) QRegExp comicOpen("/library/.+/comic/[0-9]+/remote/?"); //the server will open for reading the comic QRegExp comicUpdate("/library/.+/comic/[0-9]+/update/?"); //get comic info - QRegExp comicClose("/library/.+/comic/[0-9]+/close/?"); //the server will close the comic and free memory - QRegExp cover("/library/.+/cover/[0-9a-f]+.jpg"); //get comic cover (navigation) - QRegExp comicPage("/library/.+/comic/[0-9]+/page/[0-9]+/?"); //get comic page + QRegExp comicClose("/library/.+/comic/[0-9]+/close/?"); //the server will close the comic and free memory + QRegExp cover("/library/.+/cover/[0-9a-f]+.jpg"); //get comic cover (navigation) + QRegExp comicPage("/library/.+/comic/[0-9]+/page/[0-9]+/?"); //get comic page QRegExp comicPageRemote("/library/.+/comic/[0-9]+/page/[0-9]+/remote?"); //get comic page (remote reading) + QRegExp sync("/sync"); + QRegExp library("/library/([0-9]+)/.+"); //permite verificar que la biblioteca solicitada existe path = QUrl::fromPercentEncoding(path).toUtf8(); - loadSession(request, response); + if(!sync.exactMatch(path)) //no session is needed for syncback info, until security will be added + loadSession(request, response); - //primera petición, se ha hecho un post, se sirven las bibliotecas si la seguridad mediante login no está habilitada + //primera petición, se ha hecho un post, se sirven las bibliotecas si la seguridad mediante login no está habilitada if(path == "/") //Don't send data to the server using '/' !!!! { - LibrariesController().service(request, response); - } - - else - { - - //se comprueba que la sesión sea la correcta con el fin de evitar accesos no autorizados - HttpSession session=Static::sessionStore->getSession(request,response,false); - if(!session.isNull() && session.contains("ySession")) + LibrariesController().service(request, response); + } + else + { + if(sync.exactMatch(path)) + SyncController().service(request, response); + else { - if(library.indexIn(path)!=-1 && DBHelper::getLibraries().contains(library.cap(1).toInt()) ) - { - //listar el contenido del folder - if(folder.exactMatch(path)) - { - FolderController().service(request, response); - } - else if (folderInfo.exactMatch(path)) - { - FolderInfoController().service(request, response); - } - else if(cover.exactMatch(path)) - { - CoverController().service(request, response); - } - else if(comicDownloadInfo.exactMatch(path)) + //se comprueba que la sesión sea la correcta con el fin de evitar accesos no autorizados + HttpSession session=Static::sessionStore->getSession(request,response,false); + if(!session.isNull() && session.contains("ySession")) + { + if(library.indexIn(path)!=-1 && DBHelper::getLibraries().contains(library.cap(1).toInt()) ) { - ComicDownloadInfoController().service(request, response); + //listar el contenido del folder + if(folder.exactMatch(path)) + { + FolderController().service(request, response); + } + else if (folderInfo.exactMatch(path)) + { + FolderInfoController().service(request, response); + } + else if(cover.exactMatch(path)) + { + CoverController().service(request, response); + } + else if(comicDownloadInfo.exactMatch(path)) + { + ComicDownloadInfoController().service(request, response); + } + else if(comicFullInfo.exactMatch(path) || comicOpen.exactMatch(path))//start download or start remote reading + { + ComicController().service(request, response); + } + else if(comicPage.exactMatch(path) || comicPageRemote.exactMatch(path)) + { + PageController().service(request,response); + } + else if(comicUpdate.exactMatch(path)) + { + UpdateComicController().service(request, response); + } } - else if(comicFullInfo.exactMatch(path) || comicOpen.exactMatch(path))//start download or start remote reading - { - ComicController().service(request, response); - } - else if(comicPage.exactMatch(path) || comicPageRemote.exactMatch(path)) - { - PageController().service(request,response); - } - else if(comicUpdate.exactMatch(path)) + else { - UpdateComicController().service(request, response); + //response.writeText(library.cap(1)); + Static::staticFileController->service(request, response); } - } - else - { - //response.writeText(library.cap(1)); - Static::staticFileController->service(request, response); - } + } + else //acceso no autorizado, redirección + { + ErrorController(300).service(request,response); + } } - else //acceso no autorizado, redirección - { - ErrorController(300).service(request,response); - } - } - + } } diff --git a/YACReaderLibrary/server/server.pri b/YACReaderLibrary/server/server.pri index 5fc65043..4be20612 100644 --- a/YACReaderLibrary/server/server.pri +++ b/YACReaderLibrary/server/server.pri @@ -5,31 +5,33 @@ HEADERS += \ $$PWD/static.h \ $$PWD/startup.h \ $$PWD/requestmapper.h \ - $$PWD/controllers/comiccontroller.h \ - $$PWD/controllers/errorcontroller.h \ - $$PWD/controllers/foldercontroller.h \ - $$PWD/controllers/folderinfocontroller.h \ - $$PWD/controllers/librariescontroller.h \ - $$PWD/controllers/pagecontroller.h \ - $$PWD/controllers/sessionmanager.h \ - $$PWD/controllers/covercontroller.h \ - server/controllers/updatecomiccontroller.h \ - server/controllers/comicdownloadinfocontroller.h + $$PWD/controllers/comiccontroller.h \ + $$PWD/controllers/errorcontroller.h \ + $$PWD/controllers/foldercontroller.h \ + $$PWD/controllers/folderinfocontroller.h \ + $$PWD/controllers/librariescontroller.h \ + $$PWD/controllers/pagecontroller.h \ + $$PWD/controllers/sessionmanager.h \ + $$PWD/controllers/covercontroller.h \ + $$PWD/controllers/updatecomiccontroller.h \ + $$PWD/controllers/comicdownloadinfocontroller.h \ + $$PWD/controllers/synccontroller.h SOURCES += \ $$PWD/static.cpp \ $$PWD/startup.cpp \ $$PWD/requestmapper.cpp \ - $$PWD/controllers/comiccontroller.cpp \ - $$PWD/controllers/errorcontroller.cpp \ - $$PWD/controllers/foldercontroller.cpp \ - $$PWD/controllers/folderinfocontroller.cpp \ - $$PWD/controllers/librariescontroller.cpp \ - $$PWD/controllers/pagecontroller.cpp \ - $$PWD/controllers/sessionmanager.cpp \ - $$PWD/controllers/covercontroller.cpp \ - server/controllers/updatecomiccontroller.cpp \ - server/controllers/comicdownloadinfocontroller.cpp + $$PWD/controllers/comiccontroller.cpp \ + $$PWD/controllers/errorcontroller.cpp \ + $$PWD/controllers/foldercontroller.cpp \ + $$PWD/controllers/folderinfocontroller.cpp \ + $$PWD/controllers/librariescontroller.cpp \ + $$PWD/controllers/pagecontroller.cpp \ + $$PWD/controllers/sessionmanager.cpp \ + $$PWD/controllers/covercontroller.cpp \ + $$PWD/controllers/updatecomiccontroller.cpp \ + $$PWD/controllers/comicdownloadinfocontroller.cpp \ + $$PWD/controllers/synccontroller.cpp include(lib/bfLogging/bfLogging.pri) include(lib/bfHttpServer/bfHttpServer.pri) diff --git a/release/server/docroot/css/styles_iphone.css b/release/server/docroot/css/styles_iphone.css index fdf3dc0d..a2ef844c 100644 --- a/release/server/docroot/css/styles_iphone.css +++ b/release/server/docroot/css/styles_iphone.css @@ -5,11 +5,10 @@ body{ /* libraries */ #contentLibraries{ - width: 300px; border: 1px solid #C6C6C6; background-color: white; - margin-left: auto; - margin-right: auto; + margin-left: 20px; + margin-right: 20px; margin-top: 9px; } @@ -62,7 +61,7 @@ body{ #contentLibraries .library-indicator { - float: left; + float: right; background-color: white; height: 8px; padding: 16px 16px 15px 16px; @@ -181,10 +180,10 @@ body{ #itemContainer li { -width: 300px; + height: 120px; border: 1px solid #E2E2E2; -margin: 9px auto 0px auto; +margin: 9px 10px 0px 10px; background-color: white; overflow: hidden; position: relative; @@ -218,22 +217,22 @@ overflow: hidden; .info { padding: 8px 0px 0px 0px; -float: left; + position: relative; height: 115px; -width: 212px; +padding-left: 82px; } .buttons { position:absolute; bottom:0px; - left:0px; + left:80px; + right: 0px; border-top: 1px solid #e2e2e2; padding-top: 3px; height: 25px; - width: 220px; font-family: Arial; color: #6e6e6e; font-size: 10px; @@ -245,7 +244,7 @@ width: 212px; bottom:24px; padding-top: 3px; height: 25px; - width: 220px; + width: 100%; font-family: Arial; color: #adadad; font-size: 10px;