mirror of
https://github.com/YACReader/yacreader
synced 2025-07-18 04:54:29 -04:00
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:
@ -1421,3 +1421,27 @@ ComicDB LibraryWindow::getComicInfo(const QString & libraryName, qulonglong id)
|
|||||||
QSqlDatabase::removeDatabase(libraries.value(libraryName));
|
QSqlDatabase::removeDatabase(libraries.value(libraryName));
|
||||||
return comic;
|
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;
|
||||||
|
}
|
@ -214,6 +214,7 @@ public:
|
|||||||
QList<LibraryItem *> getFolderComicsFromLibrary(const QString & libraryName, qulonglong folderId);
|
QList<LibraryItem *> getFolderComicsFromLibrary(const QString & libraryName, qulonglong folderId);
|
||||||
qulonglong getParentFromComicFolderId(const QString & libraryName, qulonglong id);
|
qulonglong getParentFromComicFolderId(const QString & libraryName, qulonglong id);
|
||||||
ComicDB getComicInfo(const QString & libraryName, qulonglong id);
|
ComicDB getComicInfo(const QString & libraryName, qulonglong id);
|
||||||
|
QString getFolderName(const QString & libraryName, qulonglong id);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -40,7 +40,7 @@ ComicController::ComicController() {}
|
|||||||
|
|
||||||
void ComicController::service(HttpRequest& request, HttpResponse& response)
|
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();
|
QString path = QUrl::fromPercentEncoding(request.getPath()).toLatin1();
|
||||||
QStringList pathElements = path.split('/');
|
QStringList pathElements = path.split('/');
|
||||||
|
@ -10,8 +10,11 @@ CoverController::CoverController() {}
|
|||||||
|
|
||||||
void CoverController::service(HttpRequest& request, HttpResponse& response)
|
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");
|
//response.setHeader("Content-Type", "plain/text; charset=ISO-8859-1");
|
||||||
|
|
||||||
QMap<QString,QString> libraries = mw->getLibraries();
|
QMap<QString,QString> libraries = mw->getLibraries();
|
||||||
@ -25,17 +28,32 @@ void CoverController::service(HttpRequest& request, HttpResponse& response)
|
|||||||
//response.writeText(libraryName+"<br/>");
|
//response.writeText(libraryName+"<br/>");
|
||||||
//response.writeText(libraries.value(libraryName)+"/.yacreaderlibrary/covers/"+fileName+"<br/>");
|
//response.writeText(libraries.value(libraryName)+"/.yacreaderlibrary/covers/"+fileName+"<br/>");
|
||||||
|
|
||||||
QFile file(libraries.value(libraryName)+"/.yacreaderlibrary/covers/"+fileName);
|
//QFile file(libraries.value(libraryName)+"/.yacreaderlibrary/covers/"+fileName);
|
||||||
if (file.exists()) {
|
//if (file.exists()) {
|
||||||
if (file.open(QIODevice::ReadOnly))
|
// if (file.open(QIODevice::ReadOnly))
|
||||||
{
|
// {
|
||||||
qDebug("StaticFileController: Open file %s",qPrintable(file.fileName()));
|
// qDebug("StaticFileController: Open file %s",qPrintable(file.fileName()));
|
||||||
// Return the file content, do not store in cache
|
// // Return the file content, do not store in cache
|
||||||
while (!file.atEnd() && !file.error()) {
|
// while (!file.atEnd() && !file.error()) {
|
||||||
response.write(file.read(65536));
|
// response.write(file.read(131072));
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
file.close();
|
// 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,11 +22,12 @@ FolderController::FolderController() {}
|
|||||||
|
|
||||||
void FolderController::service(HttpRequest& request, HttpResponse& response)
|
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("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));
|
//response.writeText(QString("session xxx : %1 <br/>").arg(y));
|
||||||
|
|
||||||
Template t=Static::templateLoader->getTemplate("folder_"+session.getDeviceType(),request.getHeader("Accept-Language"));
|
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('/');
|
QStringList pathElements = path.split('/');
|
||||||
QString libraryName = pathElements.at(2);
|
QString libraryName = pathElements.at(2);
|
||||||
qulonglong parentId = pathElements.at(4).toULongLong();
|
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 *> folderContent = mw->getFolderContentFromLibrary(libraryName,parentId);
|
||||||
QList<LibraryItem *> folderComics = mw->getFolderComicsFromLibrary(libraryName,parentId);
|
QList<LibraryItem *> folderComics = mw->getFolderComicsFromLibrary(libraryName,parentId);
|
||||||
|
|
||||||
response.writeText(libraryName);
|
//response.writeText(libraryName);
|
||||||
|
|
||||||
folderContent.append(folderComics);
|
folderContent.append(folderComics);
|
||||||
|
|
||||||
@ -76,7 +82,7 @@ void FolderController::service(HttpRequest& request, HttpResponse& response)
|
|||||||
|
|
||||||
//t.loop("element",folderContent.length());
|
//t.loop("element",folderContent.length());
|
||||||
|
|
||||||
int elementsPerPage = 20;
|
int elementsPerPage = 18;
|
||||||
|
|
||||||
int numFolders = folderContent.length();
|
int numFolders = folderContent.length();
|
||||||
int numComics = folderComics.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);
|
t.setVariable(QString("element%1.name").arg(i),folderContent.at(i + (page*elementsPerPage))->name);
|
||||||
if(item->isDir())
|
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.width").arg(i),"89px");
|
||||||
t.setVariable(QString("element%1.image.url").arg(i),"/images/f.png");
|
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.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.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
|
else
|
||||||
{
|
{
|
||||||
|
t.setVariable(QString("element%1.class").arg(i),"cover");
|
||||||
const ComicDB * comic = (ComicDB *)item;
|
const ComicDB * comic = (ComicDB *)item;
|
||||||
t.setVariable(QString("element%1.browse").arg(i),"");
|
t.setVariable(QString("element%1.browse").arg(i),"");
|
||||||
t.setVariable(QString("element%1.image.width").arg(i),"80px");
|
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));
|
//t.setVariable(QString("element%1.downloadurl").arg(i),"/library/"+libraryName+"/comic/"+QString("%1").arg(comic->id));
|
||||||
if(!session.isComicOnDevice(comic->info.hash))
|
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
|
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");
|
//t.setVariable(QString("element%1.image.url").arg(i),"/images/f.png");
|
||||||
|
|
||||||
@ -134,53 +142,55 @@ void FolderController::service(HttpRequest& request, HttpResponse& response)
|
|||||||
i++;
|
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)
|
//if(comicPage > 0)
|
||||||
{
|
//{
|
||||||
comicsOffset = elementsPerPage - (numFolders%elementsPerPage);
|
// comicsOffset = elementsPerPage - (numFolders%elementsPerPage);
|
||||||
comicsOffset += (comicPage-1) *elementsPerPage;
|
// comicsOffset += (comicPage-1) *elementsPerPage;
|
||||||
}
|
//}
|
||||||
else
|
//else
|
||||||
comicsOffset = 0;
|
// 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)
|
//int globalComicsOffset = elementsPerPage - (numFolders%elementsPerPage);
|
||||||
{
|
//int numComicsAtCurrentPage = 0;
|
||||||
const ComicDB * comic = (ComicDB *)folderComics.at(j+comicsOffset);
|
|
||||||
//if(comic->info.title == 0 || comic->info.title->isEmpty())
|
//if(comicPage == 0) //primera p<>gina de los c<>mics
|
||||||
t.setVariable(QString("elementcomic%1.name").arg(j),comic->name);
|
// numComicsAtCurrentPage = qMin(globalComicsOffset,numComics);
|
||||||
//else
|
// else if (page == (numPages-1)) //<2F>ltima p<>gina de los c<>mics
|
||||||
// t.setVariable(QString("elementcomic%1.name").arg(i),*comic->info.title);
|
// numComicsAtCurrentPage = elementsPerPage-globalComicsOffset + (numComics%elementsPerPage);
|
||||||
t.setVariable(QString("elementcomic%1.url").arg(j),"/library/"+QUrl::toPercentEncoding(libraryName)+"/comic/"+QString("%1").arg(comic->id));
|
// else
|
||||||
t.setVariable(QString("elementcomic%1.coverulr").arg(j),"/library/"+QUrl::toPercentEncoding(libraryName)+"/cover/"+QString("%1").arg(comic->info.hash + ".jpg"));
|
// numComicsAtCurrentPage = elementsPerPage - numFoldersAtCurrentPage;
|
||||||
j++;
|
|
||||||
}
|
//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)
|
if(numPages > 1)
|
||||||
{
|
{
|
||||||
|
t.setCondition("pageIndex",true);
|
||||||
|
|
||||||
QMap<QString,int> indexCount;
|
QMap<QString,int> indexCount;
|
||||||
|
|
||||||
QString firstChar;
|
QString firstChar;
|
||||||
@ -203,19 +213,30 @@ void FolderController::service(HttpRequest& request, HttpResponse& response)
|
|||||||
}
|
}
|
||||||
|
|
||||||
QList<QString> index = indexCount.keys();
|
QList<QString> index = indexCount.keys();
|
||||||
qSort(index.begin(),index.end(),naturalSortLessThanCI);
|
if(index.length()>1)
|
||||||
t.loop("index",index.length());
|
|
||||||
int i=0;
|
|
||||||
int count=0;
|
|
||||||
int indexPage=0;
|
|
||||||
for(QList<QString>::const_iterator itr=index.constBegin();itr!=index.constEnd();itr++)
|
|
||||||
{
|
{
|
||||||
//response.writeText(QString("%1 - %2 <br />").arg(*itr).arg(count));
|
t.setCondition("alphaIndex",true);
|
||||||
t.setVariable(QString("index%1.indexname").arg(i), *itr);
|
|
||||||
t.setVariable(QString("index%1.url").arg(i),QString("/library/%1/folder/%2?page=%3").arg(QString(QUrl::toPercentEncoding(libraryName))).arg(parentId).arg(indexPage));
|
qSort(index.begin(),index.end(),naturalSortLessThanCI);
|
||||||
i++;
|
t.loop("index",index.length());
|
||||||
count += indexCount.value(*itr);
|
int i=0;
|
||||||
indexPage = count/elementsPerPage;
|
int count=0;
|
||||||
|
int indexPage=0;
|
||||||
|
for(QList<QString>::const_iterator itr=index.constBegin();itr!=index.constEnd();itr++)
|
||||||
|
{
|
||||||
|
//response.writeText(QString("%1 - %2 <br />").arg(*itr).arg(count));
|
||||||
|
t.setVariable(QString("index%1.indexname").arg(i), *itr);
|
||||||
|
t.setVariable(QString("index%1.url").arg(i),QString("/library/%1/folder/%2?page=%3").arg(QString(QUrl::toPercentEncoding(libraryName))).arg(parentId).arg(indexPage));
|
||||||
|
i++;
|
||||||
|
count += indexCount.value(*itr);
|
||||||
|
indexPage = count/elementsPerPage;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
t.loop("index",0);
|
||||||
|
t.setCondition("alphaIndex",false);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -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.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.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));
|
t.setVariable("page.last",QString("/library/%1/folder/%2?page=%3").arg(QString(QUrl::toPercentEncoding(libraryName))).arg(parentId).arg(numPages-1));
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
t.loop("page",0);
|
t.loop("page",0);
|
||||||
t.loop("index",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);
|
response.write(t.toLatin1(),true);
|
||||||
|
|
||||||
}
|
}
|
@ -10,12 +10,15 @@ LibrariesController::LibrariesController() {}
|
|||||||
|
|
||||||
void LibrariesController::service(HttpRequest& request, HttpResponse& response)
|
void LibrariesController::service(HttpRequest& request, HttpResponse& response)
|
||||||
{
|
{
|
||||||
response.setHeader("Content-Type", "text/html; charset=ISO-8859-1");
|
|
||||||
|
|
||||||
HttpSession session=Static::sessionStore->getSession(request,response);
|
HttpSession session=Static::sessionStore->getSession(request,response);
|
||||||
session.set("ySession","ok");
|
session.set("ySession","ok");
|
||||||
|
|
||||||
|
response.setHeader("Content-Type", "text/html; charset=ISO-8859-1");
|
||||||
|
response.setHeader("Connection","close");
|
||||||
|
|
||||||
|
|
||||||
QString postData = QString::fromUtf8(request.getBody());
|
QString postData = QString::fromUtf8(request.getBody());
|
||||||
response.writeText(postData);
|
//response.writeText(postData);
|
||||||
|
|
||||||
QList<QString> data = postData.split("\n");
|
QList<QString> data = postData.split("\n");
|
||||||
if(data.length() > 2)
|
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
|
else //valores por defecto, con propositos de depuraci<63>n
|
||||||
{
|
{
|
||||||
session.setDeviceType("iphone");
|
session.setDeviceType("ipad");
|
||||||
session.setDisplayType("retina");
|
session.setDisplayType("retina");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ PageController::PageController() {}
|
|||||||
|
|
||||||
void PageController::service(HttpRequest& request, HttpResponse& response)
|
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();
|
QString path = QUrl::fromPercentEncoding(request.getPath()).toLatin1();
|
||||||
QStringList pathElements = path.split('/');
|
QStringList pathElements = path.split('/');
|
||||||
@ -26,15 +26,15 @@ void PageController::service(HttpRequest& request, HttpResponse& response)
|
|||||||
{
|
{
|
||||||
if(comicFile->pageIsLoaded(page))
|
if(comicFile->pageIsLoaded(page))
|
||||||
{
|
{
|
||||||
response.setHeader("Content-Type", "yacreader/page");
|
response.setHeader("Content-Type", "image/jpeg");
|
||||||
QByteArray pageData = comicFile->getRawPage(page);
|
QByteArray pageData = comicFile->getRawPage(page);
|
||||||
QDataStream data(pageData);
|
QDataStream data(pageData);
|
||||||
char buffer[65536];
|
char buffer[4096];
|
||||||
while (!data.atEnd()) {
|
while (!data.atEnd()) {
|
||||||
int len = data.readRawData(buffer,65536);
|
int len = data.readRawData(buffer,4096);
|
||||||
response.write(QByteArray(buffer,len));
|
response.write(QByteArray(buffer,len));
|
||||||
}
|
}
|
||||||
//response.write(pageData);
|
response.write(pageData);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -129,6 +129,7 @@ void HttpConnectionHandler::read() {
|
|||||||
readTimer.stop();
|
readTimer.stop();
|
||||||
qDebug("HttpConnectionHandler (%p): received request",this);
|
qDebug("HttpConnectionHandler (%p): received request",this);
|
||||||
HttpResponse response(&socket);
|
HttpResponse response(&socket);
|
||||||
|
//response.setHeader("Connection","close"); No funciona bien con NSURLConnection
|
||||||
try {
|
try {
|
||||||
requestHandler->service(*currentRequest, response);
|
requestHandler->service(*currentRequest, response);
|
||||||
}
|
}
|
||||||
@ -140,15 +141,18 @@ void HttpConnectionHandler::read() {
|
|||||||
if (!response.hasSentLastPart()) {
|
if (!response.hasSentLastPart()) {
|
||||||
response.write(QByteArray(),true);
|
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
|
// Close the connection after delivering the response, if requested
|
||||||
if (QString::compare(currentRequest->getHeader("Connection"),"close",Qt::CaseInsensitive)==0) {
|
//if (QString::compare(currentRequest->getHeader("Connection"),"close",Qt::CaseInsensitive)==0) {
|
||||||
socket.disconnectFromHost();
|
// socket.disconnectFromHost();
|
||||||
}
|
//}
|
||||||
else {
|
//else {
|
||||||
// Start timer for next request
|
// // Start timer for next request
|
||||||
int readTimeout=settings->value("readTimeout",10000).toInt();
|
// int readTimeout=settings->value("readTimeout",10000).toInt();
|
||||||
readTimer.start(readTimeout);
|
// readTimer.start(readTimeout);
|
||||||
}
|
//}
|
||||||
// Prepare for next request
|
// Prepare for next request
|
||||||
delete currentRequest;
|
delete currentRequest;
|
||||||
currentRequest=0;
|
currentRequest=0;
|
||||||
|
@ -16,9 +16,16 @@ HttpListener::HttpListener(QSettings* settings, HttpRequestHandler* requestHandl
|
|||||||
// Start listening
|
// Start listening
|
||||||
int port=settings->value("port").toInt();
|
int port=settings->value("port").toInt();
|
||||||
listen(QHostAddress::Any, port);
|
listen(QHostAddress::Any, port);
|
||||||
if (!isListening()) {
|
//Cambiado
|
||||||
qCritical("HttpListener: Cannot bind on port %i: %s",port,qPrintable(errorString()));
|
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 {
|
else {
|
||||||
qDebug("HttpListener: Listening on port %i",port);
|
qDebug("HttpListener: Listening on port %i",port);
|
||||||
}
|
}
|
||||||
|
@ -14,12 +14,12 @@ HttpResponse::HttpResponse(QTcpSocket* socket) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void HttpResponse::setHeader(QByteArray name, QByteArray value) {
|
void HttpResponse::setHeader(QByteArray name, QByteArray value) {
|
||||||
Q_ASSERT(sentHeaders==false);
|
//Q_ASSERT(sentHeaders==false);
|
||||||
headers.insert(name,value);
|
headers.insert(name,value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HttpResponse::setHeader(QByteArray name, int value) {
|
void HttpResponse::setHeader(QByteArray name, int value) {
|
||||||
Q_ASSERT(sentHeaders==false);
|
//Q_ASSERT(sentHeaders==false);
|
||||||
headers.insert(name,QByteArray::number(value));
|
headers.insert(name,QByteArray::number(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -33,7 +33,7 @@ void HttpResponse::setStatus(int statusCode, QByteArray description) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void HttpResponse::writeHeaders() {
|
void HttpResponse::writeHeaders() {
|
||||||
Q_ASSERT(sentHeaders==false);
|
//Q_ASSERT(sentHeaders==false);
|
||||||
QByteArray buffer;
|
QByteArray buffer;
|
||||||
buffer.append("HTTP/1.1 ");
|
buffer.append("HTTP/1.1 ");
|
||||||
buffer.append(QByteArray::number(statusCode));
|
buffer.append(QByteArray::number(statusCode));
|
||||||
@ -67,7 +67,7 @@ void HttpResponse::writeToSocket(QByteArray data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void HttpResponse::write(QByteArray data, bool lastPart) {
|
void HttpResponse::write(QByteArray data, bool lastPart) {
|
||||||
Q_ASSERT(sentLastPart==false);
|
//Q_ASSERT(sentLastPart==false);
|
||||||
if (sentHeaders==false) {
|
if (sentHeaders==false) {
|
||||||
QByteArray connectionMode=headers.value("Connection");
|
QByteArray connectionMode=headers.value("Connection");
|
||||||
if (!headers.contains("Content-Length") && !headers.contains("Transfer-Encoding") && connectionMode!="close" && connectionMode!="Close") {
|
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) {
|
void HttpResponse::setCookie(const HttpCookie& cookie) {
|
||||||
Q_ASSERT(sentHeaders==false);
|
//Q_ASSERT(sentHeaders==false);
|
||||||
if (!cookie.getName().isEmpty()) {
|
if (!cookie.getName().isEmpty()) {
|
||||||
cookies.insert(cookie.getName(),cookie);
|
cookies.insert(cookie.getName(),cookie);
|
||||||
}
|
}
|
||||||
|
@ -42,61 +42,69 @@ void StaticFileController::service(HttpRequest& request, HttpResponse& response)
|
|||||||
response.setStatus(403,"forbidden");
|
response.setStatus(403,"forbidden");
|
||||||
response.write("403 forbidden",true);
|
response.write("403 forbidden",true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//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,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
|
// Check if we have the file in cache
|
||||||
qint64 now=QDateTime::currentMSecsSinceEpoch();
|
//qint64 now=QDateTime::currentMSecsSinceEpoch();
|
||||||
mutex.lock();
|
// mutex.lock();
|
||||||
CacheEntry* entry=cache.object(path);
|
// CacheEntry* entry=cache.object(path);
|
||||||
if (entry && (cacheTimeout==0 || entry->created>now-cacheTimeout)) {
|
//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.
|
// QByteArray document=entry->document; //copy the cached document, because other threads may destroy the cached entry immediately after mutex unlock.
|
||||||
mutex.unlock();
|
// mutex.unlock();
|
||||||
qDebug("StaticFileController: Cache hit for %s",path.data());
|
// qDebug("StaticFileController: Cache hit for %s",path.data());
|
||||||
setContentType(path,response);
|
// setContentType(path,response);
|
||||||
response.setHeader("Cache-Control","max-age="+QByteArray::number(maxAge/1000));
|
// response.setHeader("Cache-Control","max-age="+QByteArray::number(maxAge/1000));
|
||||||
response.write(document);
|
// response.write(document);
|
||||||
}
|
//}
|
||||||
else {
|
//else {
|
||||||
mutex.unlock();
|
|
||||||
qDebug("StaticFileController: Cache miss for %s",path.data());
|
// mutex.unlock();
|
||||||
|
//qDebug("StaticFileController: Cache miss for %s",path.data());
|
||||||
// The file is not in cache.
|
// The file is not in cache.
|
||||||
// If the filename is a directory, append index.html.
|
// If the filename is a directory, append index.html.
|
||||||
if (QFileInfo(docroot+path).isDir()) {
|
if (QFileInfo(docroot+path).isDir()) {
|
||||||
path+="/index.html";
|
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);
|
|
||||||
QString device = session.getDeviceType();
|
|
||||||
fileName = getDeviceAwareFileName(fileName, device, request.getHeader("Accept-Language"), stringPath);
|
|
||||||
QString newPath = stringPath.append(fileName);
|
|
||||||
//END_TODO
|
|
||||||
QFile file(docroot+path);
|
QFile file(docroot+path);
|
||||||
if (file.exists()) {
|
if (file.exists()) {
|
||||||
qDebug("StaticFileController: Open file %s",qPrintable(file.fileName()));
|
qDebug("StaticFileController: Open file %s",qPrintable(file.fileName()));
|
||||||
if (file.open(QIODevice::ReadOnly)) {
|
if (file.open(QIODevice::ReadOnly)) {
|
||||||
setContentType(path,response);
|
setContentType(path,response);
|
||||||
response.setHeader("Cache-Control","max-age="+QByteArray::number(maxAge/1000));
|
//response.setHeader("Cache-Control","max-age="+QByteArray::number(maxAge/1000));
|
||||||
if (file.size()<=maxCachedFileSize) {
|
//if (file.size()<=maxCachedFileSize) {
|
||||||
// Return the file content and store it also in the cache
|
// // Return the file content and store it also in the cache
|
||||||
entry=new CacheEntry();
|
// 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()) {
|
while (!file.atEnd() && !file.error()) {
|
||||||
QByteArray buffer=file.read(65536);
|
response.write(file.read(131072));
|
||||||
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));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
file.close();
|
file.close();
|
||||||
}
|
}
|
||||||
@ -110,7 +118,7 @@ void StaticFileController::service(HttpRequest& request, HttpResponse& response)
|
|||||||
response.setStatus(404,"not found");
|
response.setStatus(404,"not found");
|
||||||
response.write("404 not found",true);
|
response.write("404 not found",true);
|
||||||
}
|
}
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
void StaticFileController::setContentType(QString fileName, HttpResponse& response) const {
|
void StaticFileController::setContentType(QString fileName, HttpResponse& response) const {
|
||||||
@ -182,7 +190,7 @@ QString StaticFileController::getDeviceAwareFileName(QString fileName, QString d
|
|||||||
QString baseName = fi.baseName();
|
QString baseName = fi.baseName();
|
||||||
QString extension = fi.completeSuffix();
|
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())
|
if(QFile(docroot+"/"+path+completeFileName).exists())
|
||||||
return completeFileName; //existe un archivo espec<65>fico para este dispositivo y locales
|
return completeFileName; //existe un archivo espec<65>fico para este dispositivo y locales
|
||||||
|
@ -53,8 +53,8 @@ void FileLogger::refreshSettings() {
|
|||||||
FileLogger::FileLogger(QSettings* settings, const int refreshInterval, QObject* parent)
|
FileLogger::FileLogger(QSettings* settings, const int refreshInterval, QObject* parent)
|
||||||
: Logger(parent)
|
: Logger(parent)
|
||||||
{
|
{
|
||||||
Q_ASSERT(settings!=0);
|
//Q_ASSERT(settings!=0);
|
||||||
Q_ASSERT(refreshInterval>=0);
|
//Q_ASSERT(refreshInterval>=0);
|
||||||
this->settings=settings;
|
this->settings=settings;
|
||||||
file=0;
|
file=0;
|
||||||
if (refreshInterval>0)
|
if (refreshInterval>0)
|
||||||
|
@ -61,7 +61,7 @@ void Logger::msgHandler(const QtMsgType type, const char* message) {
|
|||||||
|
|
||||||
// Abort the program after logging a fatal message
|
// Abort the program after logging a fatal message
|
||||||
if (type>=QtFatalMsg) {
|
if (type>=QtFatalMsg) {
|
||||||
abort();
|
//abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
recursiveMutex.unlock();
|
recursiveMutex.unlock();
|
||||||
|
@ -114,7 +114,7 @@ int Template::setCondition(QString name, bool value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int Template::loop(QString name, int repetitions) {
|
int Template::loop(QString name, int repetitions) {
|
||||||
Q_ASSERT(repetitions>=0);
|
//Q_ASSERT(repetitions>=0);
|
||||||
int count=0;
|
int count=0;
|
||||||
QString startTag="{loop "+name+"}";
|
QString startTag="{loop "+name+"}";
|
||||||
QString elseTag="{else "+name+"}";
|
QString elseTag="{else "+name+"}";
|
||||||
|
@ -31,14 +31,15 @@ void RequestMapper::service(HttpRequest& request, HttpResponse& response) {
|
|||||||
QByteArray path=request.getPath();
|
QByteArray path=request.getPath();
|
||||||
qDebug("RequestMapper: path=%s",path.data());
|
qDebug("RequestMapper: path=%s",path.data());
|
||||||
|
|
||||||
QRegExp folder("/library/.+/folder/[0-9]+/?");//(?page=[0-9]+)?
|
QRegExp folder("/library/.+/folder/[0-9]+/?");//get comic content
|
||||||
QRegExp folderInfo("/library/.+/folder/[0-9]+/info/?");
|
QRegExp folderInfo("/library/.+/folder/[0-9]+/info/?"); //get folder info
|
||||||
QRegExp comic("/library/.+/comic/[0-9]+/?");
|
QRegExp comic("/library/.+/comic/[0-9]+/?"); //get comic info
|
||||||
QRegExp comicClose("/library/.+/comic/[0-9]+/close/?");
|
QRegExp comicOpen("/library/.+/comic/[0-9]+/open/?"); //the server will open for reading the comic
|
||||||
QRegExp cover("/library/.+/cover/[0-9a-f]+.jpg");
|
QRegExp comicClose("/library/.+/comic/[0-9]+/close/?"); //the server will close the comic and free memory
|
||||||
QRegExp comicPage("/library/.+/comic/[0-9]+/page/[0-9]+/?");
|
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();
|
path = QUrl::fromPercentEncoding(path).toLatin1();
|
||||||
|
|
||||||
@ -51,8 +52,8 @@ void RequestMapper::service(HttpRequest& request, HttpResponse& response) {
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
//se comprueba que la sesi<73>n sea la correcta con el fin de evitar accesos no autorizados
|
//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);
|
HttpSession session=Static::sessionStore->getSession(request,response,false);
|
||||||
if(session.contains("ySession"))
|
if(!session.isNull() && session.contains("ySession"))
|
||||||
{
|
{
|
||||||
if(library.indexIn(path)!=-1 && mw->getLibraries().contains(library.cap(1)) )
|
if(library.indexIn(path)!=-1 && mw->getLibraries().contains(library.cap(1)) )
|
||||||
{
|
{
|
||||||
@ -80,7 +81,7 @@ void RequestMapper::service(HttpRequest& request, HttpResponse& response) {
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
response.writeText(library.cap(1));
|
//response.writeText(library.cap(1));
|
||||||
Static::staticFileController->service(request, response);
|
Static::staticFileController->service(request, response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,28 +3,61 @@
|
|||||||
<head>
|
<head>
|
||||||
<link rel="stylesheet" href="/css/reset.css" type="text/css" />
|
<link rel="stylesheet" href="/css/reset.css" type="text/css" />
|
||||||
<link rel="stylesheet" href="/css/styles.css" type="text/css" />
|
<link rel="stylesheet" href="/css/styles.css" type="text/css" />
|
||||||
<title>Login</title>
|
<title>Folder</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="content">
|
<div id="content">
|
||||||
|
|
||||||
<h1>BROWSE AND IMPORT</h1>
|
<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>-->
|
<!--<a href="javascript:javascript:history.go(-1)">up</a>-->
|
||||||
|
<div class="folderContent">
|
||||||
<ul id="itemContainer">
|
<ul id="itemContainer">
|
||||||
{loop element}
|
{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}
|
{end element}
|
||||||
</ul>
|
</ul>
|
||||||
|
<div class="clear"> </div>
|
||||||
<div>{loop index} <a href="{index.url}"> {index.indexname} </a> {end index}</div>
|
</div>
|
||||||
<br />
|
|
||||||
<div>{loop page} <a href="{page.url}"> {page.number} </a> {end page}</div>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="sombra"> </div>
|
<div class="sombra"> </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"> </div>
|
||||||
|
</div>
|
||||||
|
<div class="sombra"> </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"> </div>
|
||||||
|
</div>
|
||||||
|
<div class="sombra"> </div>
|
||||||
|
{end pageIndex}
|
||||||
|
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -9,19 +9,22 @@
|
|||||||
<div id="content">
|
<div id="content">
|
||||||
|
|
||||||
<h1>BROWSE AND IMPORT</h1>
|
<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>-->
|
<!--<a href="javascript:javascript:history.go(-1)">up</a>-->
|
||||||
|
<div class="folderContent">
|
||||||
<ul id="itemContainer">
|
<ul id="itemContainer">
|
||||||
{loop element}
|
{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}
|
{end element}
|
||||||
</ul>
|
</ul>
|
||||||
|
<div class="clear"> </div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="sombra"> </div>
|
<div class="sombra"> </div>
|
||||||
|
|
||||||
|
{if alphaIndex}
|
||||||
<div class="index">
|
<div class="index">
|
||||||
<ul id="alphaIndex">
|
<ul id="alphaIndex">
|
||||||
{loop index}
|
{loop index}
|
||||||
@ -34,6 +37,10 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="sombra"> </div>
|
<div class="sombra"> </div>
|
||||||
|
|
||||||
|
{end alphaIndex}
|
||||||
|
|
||||||
|
|
||||||
|
{if pageIndex}
|
||||||
|
|
||||||
<div class="index">
|
<div class="index">
|
||||||
<ul id="pageIndex">
|
<ul id="pageIndex">
|
||||||
@ -49,5 +56,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="sombra"> </div>
|
<div class="sombra"> </div>
|
||||||
|
|
||||||
|
{end pageIndex}
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -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"> </div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -6,17 +6,17 @@
|
|||||||
<title>Login</title>
|
<title>Login</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="content">
|
<div id="contentLibraries">
|
||||||
<h1>LIBRARIES</h1>
|
<h1>LIBRARIES</h1>
|
||||||
<h2>Select a comic library</h2>
|
<h2>Select a comic library</h2>
|
||||||
<p>
|
<p>
|
||||||
<ul>
|
<ul id="librariesList">
|
||||||
{loop library}
|
{loop library}
|
||||||
<li><a href="/library/{library.name}/folder/1">{library.label}</a></li>
|
<li><a href="/library/{library.name}/folder/1">{library.label}</a></li>
|
||||||
{end library}
|
{end library}
|
||||||
</ul>
|
</ul>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="sombra"> </div>
|
<div class="sombraLibraries"> </div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
@ -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"> </div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -10,7 +10,7 @@
|
|||||||
<h1>LIBRARIES</h1>
|
<h1>LIBRARIES</h1>
|
||||||
<h2>Select a comic library</h2>
|
<h2>Select a comic library</h2>
|
||||||
<p>
|
<p>
|
||||||
<ul>
|
<ul id="librariesList">
|
||||||
{loop library}
|
{loop library}
|
||||||
<li><a href="/library/{library.name}/folder/1">{library.label}</a></li>
|
<li><a href="/library/{library.name}/folder/1">{library.label}</a></li>
|
||||||
{end library}
|
{end library}
|
||||||
|
Reference in New Issue
Block a user