Modificaci?n del SERVIDOR que mejora la estabilidad del sistema.

Se ha eliminado el soporte del servidor para conexiones persistentes.
A?adido soporte para buscar aleatoriamente un puerto v?lido, si el seleccionado por el usuario no esta disponible
This commit is contained in:
Luis Ángel San Martín
2012-11-04 21:02:15 +01:00
parent 047457da93
commit 4cee4117f8
21 changed files with 311 additions and 220 deletions

View File

@ -1421,3 +1421,27 @@ ComicDB LibraryWindow::getComicInfo(const QString & libraryName, qulonglong id)
QSqlDatabase::removeDatabase(libraries.value(libraryName));
return comic;
}
QString LibraryWindow::getFolderName(const QString & libraryName, qulonglong id)
{
QSqlDatabase db = DataBaseManagement::loadDatabase(libraries.value(libraryName)+"/.yacreaderlibrary");
QString name="";
{
QSqlQuery selectQuery(db); //TODO check
selectQuery.prepare("SELECT name FROM folder WHERE id = :id");
selectQuery.bindValue(":id", id);
selectQuery.exec();
if(selectQuery.next())
{
QSqlRecord record = selectQuery.record();
name = record.value(0).toString();
}
}
db.close();
QSqlDatabase::removeDatabase(libraries.value(libraryName));
return name;
}

View File

@ -214,6 +214,7 @@ public:
QList<LibraryItem *> getFolderComicsFromLibrary(const QString & libraryName, qulonglong folderId);
qulonglong getParentFromComicFolderId(const QString & libraryName, qulonglong id);
ComicDB getComicInfo(const QString & libraryName, qulonglong id);
QString getFolderName(const QString & libraryName, qulonglong id);
};
#endif

View File

@ -40,7 +40,7 @@ ComicController::ComicController() {}
void ComicController::service(HttpRequest& request, HttpResponse& response)
{
HttpSession session=Static::sessionStore->getSession(request,response);
HttpSession session=Static::sessionStore->getSession(request,response,false);
QString path = QUrl::fromPercentEncoding(request.getPath()).toLatin1();
QStringList pathElements = path.split('/');

View File

@ -10,8 +10,11 @@ CoverController::CoverController() {}
void CoverController::service(HttpRequest& request, HttpResponse& response)
{
response.setHeader("Content-Type", "image/jpeg");
HttpSession session=Static::sessionStore->getSession(request,response,false);
response.setHeader("Content-Type", "image/jpeg");
response.setHeader("Connection","close");
//response.setHeader("Content-Type", "plain/text; charset=ISO-8859-1");
QMap<QString,QString> libraries = mw->getLibraries();
@ -25,17 +28,32 @@ void CoverController::service(HttpRequest& request, HttpResponse& response)
//response.writeText(libraryName+"<br/>");
//response.writeText(libraries.value(libraryName)+"/.yacreaderlibrary/covers/"+fileName+"<br/>");
QFile file(libraries.value(libraryName)+"/.yacreaderlibrary/covers/"+fileName);
if (file.exists()) {
if (file.open(QIODevice::ReadOnly))
{
qDebug("StaticFileController: Open file %s",qPrintable(file.fileName()));
// Return the file content, do not store in cache
while (!file.atEnd() && !file.error()) {
response.write(file.read(65536));
//QFile file(libraries.value(libraryName)+"/.yacreaderlibrary/covers/"+fileName);
//if (file.exists()) {
// if (file.open(QIODevice::ReadOnly))
// {
// qDebug("StaticFileController: Open file %s",qPrintable(file.fileName()));
// // Return the file content, do not store in cache
// while (!file.atEnd() && !file.error()) {
// response.write(file.read(131072));
// }
// }
// file.close();
//}
QImage img(libraries.value(libraryName)+"/.yacreaderlibrary/covers/"+fileName);
if (!img.isNull()) {
int width = 80;
if(session.getDisplayType()=="retina")
width = 160;
img = img.scaledToWidth(width,Qt::SmoothTransformation);
QByteArray ba;
QBuffer buffer(&ba);
buffer.open(QIODevice::WriteOnly);
img.save(&buffer, "JPG");
response.write(ba,true);
}
}
file.close();
}
}

View File

@ -22,11 +22,12 @@ FolderController::FolderController() {}
void FolderController::service(HttpRequest& request, HttpResponse& response)
{
HttpSession session=Static::sessionStore->getSession(request,response,false);
response.setHeader("Content-Type", "text/html; charset=ISO-8859-1");
response.setHeader("Connection","close");
HttpSession session=Static::sessionStore->getSession(request,response);
QString y = session.get("xxx").toString();
//QString y = session.get("xxx").toString();
//response.writeText(QString("session xxx : %1 <br/>").arg(y));
Template t=Static::templateLoader->getTemplate("folder_"+session.getDeviceType(),request.getHeader("Accept-Language"));
@ -35,10 +36,15 @@ void FolderController::service(HttpRequest& request, HttpResponse& response)
QStringList pathElements = path.split('/');
QString libraryName = pathElements.at(2);
qulonglong parentId = pathElements.at(4).toULongLong();
QString folderName = mw->getFolderName(libraryName,parentId);
if(parentId!=1)
t.setVariable("folder.name",folderName);
else
t.setVariable("folder.name",libraryName);
QList<LibraryItem *> folderContent = mw->getFolderContentFromLibrary(libraryName,parentId);
QList<LibraryItem *> folderComics = mw->getFolderComicsFromLibrary(libraryName,parentId);
response.writeText(libraryName);
//response.writeText(libraryName);
folderContent.append(folderComics);
@ -76,7 +82,7 @@ void FolderController::service(HttpRequest& request, HttpResponse& response)
//t.loop("element",folderContent.length());
int elementsPerPage = 20;
int elementsPerPage = 18;
int numFolders = folderContent.length();
int numComics = folderComics.length();
@ -107,25 +113,27 @@ void FolderController::service(HttpRequest& request, HttpResponse& response)
t.setVariable(QString("element%1.name").arg(i),folderContent.at(i + (page*elementsPerPage))->name);
if(item->isDir())
{
t.setVariable(QString("element%1.class").arg(i),"folder");
t.setVariable(QString("element%1.image.width").arg(i),"89px");
t.setVariable(QString("element%1.image.url").arg(i),"/images/f.png");
t.setVariable(QString("element%1.browse").arg(i),QString("<a href=\"%1\">Browse</a>").arg(QString("/library/%1/folder/%2").arg(libraryName).arg(item->id)));
t.setVariable(QString("element%1.browse").arg(i),QString("<a class =\"browseButton\" href=\"%1\">browse</a>").arg(QString("/library/%1/folder/%2").arg(libraryName).arg(item->id)));
//t.setVariable(QString("element%1.url").arg(i),"/library/"+libraryName+"/folder/"+QString("%1").arg(folderContent.at(i + (page*10))->id));
//t.setVariable(QString("element%1.downloadurl").arg(i),"/library/"+libraryName+"/folder/"+QString("%1/info").arg(folderContent.at(i + (page*elementsPerPage))->id));
t.setVariable(QString("element%1.download").arg(i),QString("<a href=\"%1\">Download</a>").arg("/library/"+QUrl::toPercentEncoding(libraryName)+"/folder/"+QString("%1/info").arg(folderContent.at(i + (page*elementsPerPage))->id)));
t.setVariable(QString("element%1.download").arg(i),QString("<a class =\"importButton\" href=\"%1\">import</a>").arg("/library/"+QUrl::toPercentEncoding(libraryName)+"/folder/"+QString("%1/info").arg(folderContent.at(i + (page*elementsPerPage))->id)));
}
else
{
t.setVariable(QString("element%1.class").arg(i),"cover");
const ComicDB * comic = (ComicDB *)item;
t.setVariable(QString("element%1.browse").arg(i),"");
t.setVariable(QString("element%1.image.width").arg(i),"80px");
//t.setVariable(QString("element%1.downloadurl").arg(i),"/library/"+libraryName+"/comic/"+QString("%1").arg(comic->id));
if(!session.isComicOnDevice(comic->info.hash))
t.setVariable(QString("element%1.download").arg(i),QString("<a href=\"%1\">Download</a>").arg("/library/"+QUrl::toPercentEncoding(libraryName)+"/comic/"+QString("%1").arg(comic->id)));
t.setVariable(QString("element%1.download").arg(i),QString("<a class =\"importButton\" href=\"%1\">import</a>").arg("/library/"+QUrl::toPercentEncoding(libraryName)+"/comic/"+QString("%1").arg(comic->id)));
else
t.setVariable(QString("element%1.download").arg(i),QString(""));
t.setVariable(QString("element%1.download").arg(i),QString("<div class=\"importedButton\">imported</div>"));
//t.setVariable(QString("element%1.image.url").arg(i),"/images/f.png");
@ -134,53 +142,55 @@ void FolderController::service(HttpRequest& request, HttpResponse& response)
i++;
}
int comicsOffset;// = qMax(0,((page - (numFolderPages - 1)) * 10) - (numFolders%10));
//int comicsOffset;// = qMax(0,((page - (numFolderPages - 1)) * 10) - (numFolders%10));
int comicPage = numFolderPages!=0?page-(numFolderPages - 1):page;
//int comicPage = numFolderPages!=0?page-(numFolderPages - 1):page;
if(comicPage > 0)
{
comicsOffset = elementsPerPage - (numFolders%elementsPerPage);
comicsOffset += (comicPage-1) *elementsPerPage;
}
else
comicsOffset = 0;
int globalComicsOffset = elementsPerPage - (numFolders%elementsPerPage);
int numComicsAtCurrentPage = 0;
if(comicPage == 0) //primera p<>gina de los c<>mics
numComicsAtCurrentPage = qMin(globalComicsOffset,numComics);
else if (page == (numPages-1)) //<2F>ltima p<>gina de los c<>mics
numComicsAtCurrentPage = elementsPerPage-globalComicsOffset + (numComics%elementsPerPage);
else
numComicsAtCurrentPage = elementsPerPage - numFoldersAtCurrentPage;
if(numComics == 0)
numComicsAtCurrentPage = 0;
//response.writeText(QString("numComicsAtCurrentPage : %1 <br/>").arg(numComicsAtCurrentPage));
//response.writeText(QString("comicsOffset : %1 <br/>").arg(comicsOffset));
t.loop("elementcomic",numComicsAtCurrentPage);
//
int j = 0;
while(j<numComicsAtCurrentPage)
{
const ComicDB * comic = (ComicDB *)folderComics.at(j+comicsOffset);
//if(comic->info.title == 0 || comic->info.title->isEmpty())
t.setVariable(QString("elementcomic%1.name").arg(j),comic->name);
//if(comicPage > 0)
//{
// comicsOffset = elementsPerPage - (numFolders%elementsPerPage);
// comicsOffset += (comicPage-1) *elementsPerPage;
//}
//else
// t.setVariable(QString("elementcomic%1.name").arg(i),*comic->info.title);
t.setVariable(QString("elementcomic%1.url").arg(j),"/library/"+QUrl::toPercentEncoding(libraryName)+"/comic/"+QString("%1").arg(comic->id));
t.setVariable(QString("elementcomic%1.coverulr").arg(j),"/library/"+QUrl::toPercentEncoding(libraryName)+"/cover/"+QString("%1").arg(comic->info.hash + ".jpg"));
j++;
}
// comicsOffset = 0;
//
//int globalComicsOffset = elementsPerPage - (numFolders%elementsPerPage);
//int numComicsAtCurrentPage = 0;
//if(comicPage == 0) //primera p<>gina de los c<>mics
// numComicsAtCurrentPage = qMin(globalComicsOffset,numComics);
// else if (page == (numPages-1)) //<2F>ltima p<>gina de los c<>mics
// numComicsAtCurrentPage = elementsPerPage-globalComicsOffset + (numComics%elementsPerPage);
// else
// numComicsAtCurrentPage = elementsPerPage - numFoldersAtCurrentPage;
//if(numComics == 0)
// numComicsAtCurrentPage = 0;
////response.writeText(QString("numComicsAtCurrentPage : %1 <br/>").arg(numComicsAtCurrentPage));
////response.writeText(QString("comicsOffset : %1 <br/>").arg(comicsOffset));
//t.loop("elementcomic",numComicsAtCurrentPage);
////
//int j = 0;
//while(j<numComicsAtCurrentPage)
//{
// const ComicDB * comic = (ComicDB *)folderComics.at(j+comicsOffset);
// //if(comic->info.title == 0 || comic->info.title->isEmpty())
// t.setVariable(QString("elementcomic%1.name").arg(j),comic->name);
// //else
// // t.setVariable(QString("elementcomic%1.name").arg(i),*comic->info.title);
// t.setVariable(QString("elementcomic%1.url").arg(j),"/library/"+QUrl::toPercentEncoding(libraryName)+"/comic/"+QString("%1").arg(comic->id));
// t.setVariable(QString("elementcomic%1.coverulr").arg(j),"/library/"+QUrl::toPercentEncoding(libraryName)+"/cover/"+QString("%1").arg(comic->info.hash + ".jpg"));
// j++;
//}
if(numPages > 1)
{
t.setCondition("pageIndex",true);
QMap<QString,int> indexCount;
QString firstChar;
@ -203,6 +213,10 @@ void FolderController::service(HttpRequest& request, HttpResponse& response)
}
QList<QString> index = indexCount.keys();
if(index.length()>1)
{
t.setCondition("alphaIndex",true);
qSort(index.begin(),index.end(),naturalSortLessThanCI);
t.loop("index",index.length());
int i=0;
@ -218,6 +232,13 @@ void FolderController::service(HttpRequest& request, HttpResponse& response)
indexPage = count/elementsPerPage;
}
}
else
{
t.loop("index",0);
t.setCondition("alphaIndex",false);
}
t.loop("page",numPages);
int z = 0;
@ -237,13 +258,19 @@ void FolderController::service(HttpRequest& request, HttpResponse& response)
t.setVariable("page.previous",QString("/library/%1/folder/%2?page=%3").arg(QString(QUrl::toPercentEncoding(libraryName))).arg(parentId).arg((page==0)?page:page-1));
t.setVariable("page.next",QString("/library/%1/folder/%2?page=%3").arg(QString(QUrl::toPercentEncoding(libraryName))).arg(parentId).arg((page==numPages-1)?page:page+1));
t.setVariable("page.last",QString("/library/%1/folder/%2?page=%3").arg(QString(QUrl::toPercentEncoding(libraryName))).arg(parentId).arg(numPages-1));
}
else
{
t.loop("page",0);
t.loop("index",0);
t.setCondition("pageIndex",false);
t.setCondition("alphaIndex",false);
}
t.setVariable("page",QString("%1").arg(page+1));
t.setVariable("pages",QString("%1").arg(numPages));
response.write(t.toLatin1(),true);
}

View File

@ -10,12 +10,15 @@ LibrariesController::LibrariesController() {}
void LibrariesController::service(HttpRequest& request, HttpResponse& response)
{
response.setHeader("Content-Type", "text/html; charset=ISO-8859-1");
HttpSession session=Static::sessionStore->getSession(request,response);
session.set("ySession","ok");
response.setHeader("Content-Type", "text/html; charset=ISO-8859-1");
response.setHeader("Connection","close");
QString postData = QString::fromUtf8(request.getBody());
response.writeText(postData);
//response.writeText(postData);
QList<QString> data = postData.split("\n");
if(data.length() > 2)
@ -30,7 +33,7 @@ void LibrariesController::service(HttpRequest& request, HttpResponse& response)
}
else //valores por defecto, con propositos de depuraci<63>n
{
session.setDeviceType("iphone");
session.setDeviceType("ipad");
session.setDisplayType("retina");
}

View File

@ -11,7 +11,7 @@ PageController::PageController() {}
void PageController::service(HttpRequest& request, HttpResponse& response)
{
HttpSession session=Static::sessionStore->getSession(request,response);
HttpSession session=Static::sessionStore->getSession(request,response,false);
QString path = QUrl::fromPercentEncoding(request.getPath()).toLatin1();
QStringList pathElements = path.split('/');
@ -26,15 +26,15 @@ void PageController::service(HttpRequest& request, HttpResponse& response)
{
if(comicFile->pageIsLoaded(page))
{
response.setHeader("Content-Type", "yacreader/page");
response.setHeader("Content-Type", "image/jpeg");
QByteArray pageData = comicFile->getRawPage(page);
QDataStream data(pageData);
char buffer[65536];
char buffer[4096];
while (!data.atEnd()) {
int len = data.readRawData(buffer,65536);
int len = data.readRawData(buffer,4096);
response.write(QByteArray(buffer,len));
}
//response.write(pageData);
response.write(pageData);
}
else
{

View File

@ -129,6 +129,7 @@ void HttpConnectionHandler::read() {
readTimer.stop();
qDebug("HttpConnectionHandler (%p): received request",this);
HttpResponse response(&socket);
//response.setHeader("Connection","close"); No funciona bien con NSURLConnection
try {
requestHandler->service(*currentRequest, response);
}
@ -140,15 +141,18 @@ void HttpConnectionHandler::read() {
if (!response.hasSentLastPart()) {
response.write(QByteArray(),true);
}
socket.disconnectFromHost(); //CAMBIADO s<>lo se van a soportar conexiones NO persistentes
// Close the connection after delivering the response, if requested
if (QString::compare(currentRequest->getHeader("Connection"),"close",Qt::CaseInsensitive)==0) {
socket.disconnectFromHost();
}
else {
// Start timer for next request
int readTimeout=settings->value("readTimeout",10000).toInt();
readTimer.start(readTimeout);
}
//if (QString::compare(currentRequest->getHeader("Connection"),"close",Qt::CaseInsensitive)==0) {
// socket.disconnectFromHost();
//}
//else {
// // Start timer for next request
// int readTimeout=settings->value("readTimeout",10000).toInt();
// readTimer.start(readTimeout);
//}
// Prepare for next request
delete currentRequest;
currentRequest=0;

View File

@ -16,7 +16,14 @@ HttpListener::HttpListener(QSettings* settings, HttpRequestHandler* requestHandl
// Start listening
int port=settings->value("port").toInt();
listen(QHostAddress::Any, port);
if (!isListening()) {
//Cambiado
int i = 0;
while (!isListening() && i < 1000) {
listen(QHostAddress::Any, (rand() % 45535)+20000);
i++;
}
if(!isListening())
{
qCritical("HttpListener: Cannot bind on port %i: %s",port,qPrintable(errorString()));
}
else {

View File

@ -14,12 +14,12 @@ HttpResponse::HttpResponse(QTcpSocket* socket) {
}
void HttpResponse::setHeader(QByteArray name, QByteArray value) {
Q_ASSERT(sentHeaders==false);
//Q_ASSERT(sentHeaders==false);
headers.insert(name,value);
}
void HttpResponse::setHeader(QByteArray name, int value) {
Q_ASSERT(sentHeaders==false);
//Q_ASSERT(sentHeaders==false);
headers.insert(name,QByteArray::number(value));
}
@ -33,7 +33,7 @@ void HttpResponse::setStatus(int statusCode, QByteArray description) {
}
void HttpResponse::writeHeaders() {
Q_ASSERT(sentHeaders==false);
//Q_ASSERT(sentHeaders==false);
QByteArray buffer;
buffer.append("HTTP/1.1 ");
buffer.append(QByteArray::number(statusCode));
@ -67,7 +67,7 @@ void HttpResponse::writeToSocket(QByteArray data) {
}
void HttpResponse::write(QByteArray data, bool lastPart) {
Q_ASSERT(sentLastPart==false);
//Q_ASSERT(sentLastPart==false);
if (sentHeaders==false) {
QByteArray connectionMode=headers.value("Connection");
if (!headers.contains("Content-Length") && !headers.contains("Transfer-Encoding") && connectionMode!="close" && connectionMode!="Close") {
@ -115,7 +115,7 @@ bool HttpResponse::hasSentLastPart() const {
void HttpResponse::setCookie(const HttpCookie& cookie) {
Q_ASSERT(sentHeaders==false);
//Q_ASSERT(sentHeaders==false);
if (!cookie.getName().isEmpty()) {
cookies.insert(cookie.getName(),cookie);
}

View File

@ -42,61 +42,69 @@ void StaticFileController::service(HttpRequest& request, HttpResponse& response)
response.setStatus(403,"forbidden");
response.write("403 forbidden",true);
}
// Check if we have the file in cache
qint64 now=QDateTime::currentMSecsSinceEpoch();
mutex.lock();
CacheEntry* entry=cache.object(path);
if (entry && (cacheTimeout==0 || entry->created>now-cacheTimeout)) {
QByteArray document=entry->document; //copy the cached document, because other threads may destroy the cached entry immediately after mutex unlock.
mutex.unlock();
qDebug("StaticFileController: Cache hit for %s",path.data());
setContentType(path,response);
response.setHeader("Cache-Control","max-age="+QByteArray::number(maxAge/1000));
response.write(document);
}
else {
mutex.unlock();
qDebug("StaticFileController: Cache miss for %s",path.data());
// The file is not in cache.
// If the filename is a directory, append index.html.
if (QFileInfo(docroot+path).isDir()) {
path+="/index.html";
}
//TODO(DONE) carga sensible al dispositivo y a la localizaci<63>n
QString stringPath = path;
QStringList paths = QString(path).split('/');
QString fileName = paths.last();
stringPath.remove(fileName);
HttpSession session=Static::sessionStore->getSession(request,response);
HttpSession session=Static::sessionStore->getSession(request,response,false);
QString device = session.getDeviceType();
fileName = getDeviceAwareFileName(fileName, device, request.getHeader("Accept-Language"), stringPath);
QString newPath = stringPath.append(fileName);
path = newPath.toLocal8Bit();
//CAMBIADO
response.setHeader("Connection","close");
//END_TODO
// Check if we have the file in cache
//qint64 now=QDateTime::currentMSecsSinceEpoch();
// mutex.lock();
// CacheEntry* entry=cache.object(path);
//if (entry && (cacheTimeout==0 || entry->created>now-cacheTimeout)) {
// QByteArray document=entry->document; //copy the cached document, because other threads may destroy the cached entry immediately after mutex unlock.
// mutex.unlock();
// qDebug("StaticFileController: Cache hit for %s",path.data());
// setContentType(path,response);
// response.setHeader("Cache-Control","max-age="+QByteArray::number(maxAge/1000));
// response.write(document);
//}
//else {
// mutex.unlock();
//qDebug("StaticFileController: Cache miss for %s",path.data());
// The file is not in cache.
// If the filename is a directory, append index.html.
if (QFileInfo(docroot+path).isDir()) {
path+="/index.html";
}
QFile file(docroot+path);
if (file.exists()) {
qDebug("StaticFileController: Open file %s",qPrintable(file.fileName()));
if (file.open(QIODevice::ReadOnly)) {
setContentType(path,response);
response.setHeader("Cache-Control","max-age="+QByteArray::number(maxAge/1000));
if (file.size()<=maxCachedFileSize) {
// Return the file content and store it also in the cache
entry=new CacheEntry();
//response.setHeader("Cache-Control","max-age="+QByteArray::number(maxAge/1000));
//if (file.size()<=maxCachedFileSize) {
// // Return the file content and store it also in the cache
// entry=new CacheEntry();
// while (!file.atEnd() && !file.error()) {
// QByteArray buffer=file.read(65536);
// response.write(buffer);
// entry->document.append(buffer);
// }
// entry->created=now;
// mutex.lock();
// cache.insert(request.getPath(),entry,entry->document.size());
// mutex.unlock();
//}
//else {
// Return the file content, do not store in cache*/
while (!file.atEnd() && !file.error()) {
QByteArray buffer=file.read(65536);
response.write(buffer);
entry->document.append(buffer);
}
entry->created=now;
mutex.lock();
cache.insert(request.getPath(),entry,entry->document.size());
mutex.unlock();
}
else {
// Return the file content, do not store in cache
while (!file.atEnd() && !file.error()) {
response.write(file.read(65536));
}
response.write(file.read(131072));
//}
}
file.close();
}
@ -110,7 +118,7 @@ void StaticFileController::service(HttpRequest& request, HttpResponse& response)
response.setStatus(404,"not found");
response.write("404 not found",true);
}
}
//}
}
void StaticFileController::setContentType(QString fileName, HttpResponse& response) const {
@ -182,7 +190,7 @@ QString StaticFileController::getDeviceAwareFileName(QString fileName, QString d
QString baseName = fi.baseName();
QString extension = fi.completeSuffix();
QString completeFileName = getLocalizedFileName(fileName+"_"+device+"."+extension,locales,path);
QString completeFileName = getLocalizedFileName(baseName+"_"+device+"."+extension,locales,path);
if(QFile(docroot+"/"+path+completeFileName).exists())
return completeFileName; //existe un archivo espec<65>fico para este dispositivo y locales

View File

@ -53,8 +53,8 @@ void FileLogger::refreshSettings() {
FileLogger::FileLogger(QSettings* settings, const int refreshInterval, QObject* parent)
: Logger(parent)
{
Q_ASSERT(settings!=0);
Q_ASSERT(refreshInterval>=0);
//Q_ASSERT(settings!=0);
//Q_ASSERT(refreshInterval>=0);
this->settings=settings;
file=0;
if (refreshInterval>0)

View File

@ -61,7 +61,7 @@ void Logger::msgHandler(const QtMsgType type, const char* message) {
// Abort the program after logging a fatal message
if (type>=QtFatalMsg) {
abort();
//abort();
}
recursiveMutex.unlock();

View File

@ -114,7 +114,7 @@ int Template::setCondition(QString name, bool value) {
}
int Template::loop(QString name, int repetitions) {
Q_ASSERT(repetitions>=0);
//Q_ASSERT(repetitions>=0);
int count=0;
QString startTag="{loop "+name+"}";
QString elseTag="{else "+name+"}";

View File

@ -31,14 +31,15 @@ void RequestMapper::service(HttpRequest& request, HttpResponse& response) {
QByteArray path=request.getPath();
qDebug("RequestMapper: path=%s",path.data());
QRegExp folder("/library/.+/folder/[0-9]+/?");//(?page=[0-9]+)?
QRegExp folderInfo("/library/.+/folder/[0-9]+/info/?");
QRegExp comic("/library/.+/comic/[0-9]+/?");
QRegExp comicClose("/library/.+/comic/[0-9]+/close/?");
QRegExp cover("/library/.+/cover/[0-9a-f]+.jpg");
QRegExp comicPage("/library/.+/comic/[0-9]+/page/[0-9]+/?");
QRegExp folder("/library/.+/folder/[0-9]+/?");//get comic content
QRegExp folderInfo("/library/.+/folder/[0-9]+/info/?"); //get folder info
QRegExp comic("/library/.+/comic/[0-9]+/?"); //get comic info
QRegExp comicOpen("/library/.+/comic/[0-9]+/open/?"); //the server will open for reading the comic
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 library("/library/([^/.]+)/.+");
QRegExp library("/library/([^/.]+)/.+"); //permite verificar que la biblioteca solicitada existe
path = QUrl::fromPercentEncoding(path).toLatin1();
@ -51,8 +52,8 @@ void RequestMapper::service(HttpRequest& request, HttpResponse& response) {
else
{
//se comprueba que la sesi<73>n sea la correcta con el fin de evitar accesos no autorizados
HttpSession session=Static::sessionStore->getSession(request,response);
if(session.contains("ySession"))
HttpSession session=Static::sessionStore->getSession(request,response,false);
if(!session.isNull() && session.contains("ySession"))
{
if(library.indexIn(path)!=-1 && mw->getLibraries().contains(library.cap(1)) )
{
@ -80,7 +81,7 @@ void RequestMapper::service(HttpRequest& request, HttpResponse& response) {
}
else
{
response.writeText(library.cap(1));
//response.writeText(library.cap(1));
Static::staticFileController->service(request, response);
}
}

View File

@ -3,28 +3,61 @@
<head>
<link rel="stylesheet" href="/css/reset.css" type="text/css" />
<link rel="stylesheet" href="/css/styles.css" type="text/css" />
<title>Login</title>
<title>Folder</title>
</head>
<body>
<div id="content">
<h1>BROWSE AND IMPORT</h1>
<h2>nombre folder?</h2>
<h2>{folder.name} {if pageIndex} - PAGE {page} OF {pages}{end pageIndex}</h2>
<a href="/">Libraries</a> <a href="{upurl}">up</a>
<div id="topIndex"> {if pageIndex} <a class="next" href="{page.next}">next</a> <a class="previous" href="{page.previous}">previous</a> {end pageIndex} <a class="up" href="{upurl}">up</a> <a class="libraries" href="/">Libraries</a> </div>
<!--<a href="javascript:javascript:history.go(-1)">up</a>-->
<div class="folderContent">
<ul id="itemContainer">
{loop element}
<li><img style="width: {element.image.width}" src="{element.image.url}"/> <p>{element.name}</p> {element.browse} - {element.download} </li>
<li><div class="{element.class}"><img style="width: {element.image.width}" src="{element.image.url}"/></div> <div class="info"> <div class="title"><p>{element.name}</p> </div><div class="buttons"> {element.download} {element.browse} </div></div></li>
{end element}
</ul>
<div>{loop index} <a href="{index.url}"> {index.indexname} </a> {end index}</div>
<br />
<div>{loop page} <a href="{page.url}"> {page.number} </a> {end page}</div>
<div class="clear">&nbsp;</div>
</div>
</div>
<div class="sombra">&nbsp;</div>
{if alphaIndex}
<div class="index">
<ul id="alphaIndex">
{loop index}
<li> <a href="{index.url}"> {index.indexname} </a> </li>
{end index}
</ul>
<div class="clear">&nbsp;</div>
</div>
<div class="sombra">&nbsp;</div>
{end alphaIndex}
{if pageIndex}
<div class="index">
<ul id="pageIndex">
<li> <a class="first" href="{page.first}">first</a> </li>
<li> <a class="previous" href="{page.previous}">previous</a> </li>
{loop page} <li> <a class="{page.current}" href="{page.url}"> {page.number} </a> </li> {end page}
<li> <a class="next" href="{page.next}">next</a> </li>
<li> <a class="last" href="{page.last}">last</a> </li>
</ul>
<div class="clear">&nbsp;</div>
</div>
<div class="sombra">&nbsp;</div>
{end pageIndex}
</body>
</html>

View File

@ -9,19 +9,22 @@
<div id="content">
<h1>BROWSE AND IMPORT</h1>
<h2>nombre folder?</h2>
<h2>{folder.name} {if pageIndex} - PAGE {page} OF {pages} {end pageIndex}</h2>
<a href="/">Libraries</a> <a href="{upurl}">up</a>
<div id="topIndex"> <a class="libraries" href="/">Libraries</a> <a class="up" href="{upurl}">up</a> {if pageIndex} <a class="previous" href="{page.previous}">previous</a><a class="next" href="{page.next}">next</a> {end pageIndex} </div>
<!--<a href="javascript:javascript:history.go(-1)">up</a>-->
<div class="folderContent">
<ul id="itemContainer">
{loop element}
<li><img style="width: {element.image.width}" src="{element.image.url}"/> <p>{element.name}</p> {element.browse} - {element.download} </li>
<li><div class="{element.class}"><img style="width: {element.image.width}" src="{element.image.url}"/></div> <div class="info"> <div class="title" > <p>{element.name}</p> </div> <div class="buttons"> {element.download} {element.browse} </div></div></li>
{end element}
</ul>
<div class="clear">&nbsp;</div>
</div>
</div>
<div class="sombra">&nbsp;</div>
{if alphaIndex}
<div class="index">
<ul id="alphaIndex">
{loop index}
@ -34,6 +37,10 @@
</div>
<div class="sombra">&nbsp;</div>
{end alphaIndex}
{if pageIndex}
<div class="index">
<ul id="pageIndex">
@ -49,5 +56,7 @@
</div>
<div class="sombra">&nbsp;</div>
{end pageIndex}
</body>
</html>

View File

@ -1,22 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<link rel="stylesheet" href="/css/reset.css" type="text/css" />
<link rel="stylesheet" href="/css/styles.css" type="text/css" />
<title>Login</title>
</head>
<body>
<div id="content">
<h1>BIBLIOTECAS</h1>
<h2>Selecciona una biblioteca</h2>
<p>
<ul>
{loop library}
<li><a href="/library/{library.name}/folder/1">{library.label}</a></li>
{end library}
</ul>
</p>
</div>
<div class="sombra">&nbsp;</div>
</body>
</html>

View File

@ -6,17 +6,17 @@
<title>Login</title>
</head>
<body>
<div id="content">
<div id="contentLibraries">
<h1>LIBRARIES</h1>
<h2>Select a comic library</h2>
<p>
<ul>
<ul id="librariesList">
{loop library}
<li><a href="/library/{library.name}/folder/1">{library.label}</a></li>
{end library}
</ul>
</p>
</div>
<div class="sombra">&nbsp;</div>
<div class="sombraLibraries">&nbsp;</div>
</body>
</html>

View File

@ -1,22 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<link rel="stylesheet" href="/css/reset.css" type="text/css" />
<link rel="stylesheet" href="/css/styles.css" type="text/css" />
<title>Login</title>
</head>
<body>
<div id="content">
<h1>BIBLIOTECAS</h1>
<h2>Selecciona una biblioteca</h2>
<p>
<ul id="libraryList">
{loop library}
<li><a href="/library/{library.name}/folder/1">{library.label}</a></li>
{end library}
</ul>
</p>
</div>
<div class="sombra">&nbsp;</div>
</body>
</html>

View File

@ -10,7 +10,7 @@
<h1>LIBRARIES</h1>
<h2>Select a comic library</h2>
<p>
<ul>
<ul id="librariesList">
{loop library}
<li><a href="/library/{library.name}/folder/1">{library.label}</a></li>
{end library}