SANKORE-1074

Document navigator: "Add pages from file" isn't work with old UBZ
preferencesAboutTextFull
Anatoly Mihalchenko 12 years ago
parent 5f9f9ea6b5
commit 1130a8aa7e
  1. 76
      src/adaptors/UBImportDocument.cpp
  2. 2
      src/adaptors/UBImportDocument.h
  3. 2
      src/core/UBDocumentManager.cpp
  4. 41
      src/core/UBPersistenceManager.cpp
  5. 7
      src/core/UBPersistenceManager.h
  6. 3
      src/frameworks/UBFileSystemUtils.cpp

@ -56,7 +56,7 @@ QString UBImportDocument::importFileFilter()
} }
QString UBImportDocument::expandFileToDir(const QFile& pZipFile, const QString& pDir) bool UBImportDocument::extractFileToDir(const QFile& pZipFile, const QString& pDir, QString& documentRoot)
{ {
QDir rootDir(pDir); QDir rootDir(pDir);
@ -65,63 +65,45 @@ QString UBImportDocument::expandFileToDir(const QFile& pZipFile, const QString&
if(!zip.open(QuaZip::mdUnzip)) if(!zip.open(QuaZip::mdUnzip))
{ {
qWarning() << "Import failed. Cause zip.open(): " << zip.getZipError(); qWarning() << "Import failed. Cause zip.open(): " << zip.getZipError();
return ""; return false;
} }
zip.setFileNameCodec("UTF-8"); zip.setFileNameCodec("UTF-8");
QuaZipFileInfo info; QuaZipFileInfo info;
QuaZipFile file(&zip); QuaZipFile file(&zip);
// TODO UB 4.x implement a mechanism that can replace an existing
// document based on the UID of the document.
bool createNewDocument = true;
QString documentRootFolder;
// first we search the metadata.rdf to check the document properties
for(bool more = zip.goToFirstFile(); more; more = zip.goToNextFile())
{
if(!zip.getCurrentFileInfo(&info))
{
qWarning() << "Import failed. Cause: getCurrentFileInfo(): " << zip.getZipError();
return "";
}
QFileInfo currentFileInfo(pDir + "/" + file.getActualFileName());
}
if (createNewDocument)
documentRootFolder = UBPersistenceManager::persistenceManager()->generateUniqueDocumentPath();
QFile out; QFile out;
char c; char c;
documentRoot = UBPersistenceManager::persistenceManager()->generateUniqueDocumentPath(pDir);
for(bool more=zip.goToFirstFile(); more; more=zip.goToNextFile()) for(bool more=zip.goToFirstFile(); more; more=zip.goToNextFile())
{ {
if(!zip.getCurrentFileInfo(&info)) if(!zip.getCurrentFileInfo(&info))
{ {
//TOD UB 4.3 O display error to user or use crash reporter //TOD UB 4.3 O display error to user or use crash reporter
qWarning() << "Import failed. Cause: getCurrentFileInfo(): " << zip.getZipError(); qWarning() << "Import failed. Cause: getCurrentFileInfo(): " << zip.getZipError();
return ""; return false;
} }
if(!file.open(QIODevice::ReadOnly)) if(!file.open(QIODevice::ReadOnly))
{ {
qWarning() << "Import failed. Cause: file.open(): " << zip.getZipError(); qWarning() << "Import failed. Cause: file.open(): " << zip.getZipError();
return ""; return false;
} }
if(file.getZipError()!= UNZ_OK) if(file.getZipError()!= UNZ_OK)
{ {
qWarning() << "Import failed. Cause: file.getFileName(): " << zip.getZipError(); qWarning() << "Import failed. Cause: file.getFileName(): " << zip.getZipError();
return ""; return false;
} }
QString newFileName = documentRootFolder + "/" + file.getActualFileName(); QString newFileName = documentRoot + "/" + file.getActualFileName();
QFileInfo newFileInfo(newFileName); QFileInfo newFileInfo(newFileName);
rootDir.mkpath(newFileInfo.absolutePath()); if (!rootDir.mkpath(newFileInfo.absolutePath()))
return false;
out.setFileName(newFileName); out.setFileName(newFileName);
out.open(QIODevice::WriteOnly); if (!out.open(QIODevice::WriteOnly))
return false;
// Slow like hell (on GNU/Linux at least), but it is not my fault. // Slow like hell (on GNU/Linux at least), but it is not my fault.
// Not ZIP/UNZIP package's fault either. // Not ZIP/UNZIP package's fault either.
@ -131,7 +113,7 @@ QString UBImportDocument::expandFileToDir(const QFile& pZipFile, const QString&
{ {
qWarning() << "Import failed. Cause: Unable to write file"; qWarning() << "Import failed. Cause: Unable to write file";
out.close(); out.close();
return ""; return false;
} }
while(file.getChar(&c)) while(file.getChar(&c))
@ -142,13 +124,13 @@ QString UBImportDocument::expandFileToDir(const QFile& pZipFile, const QString&
if(file.getZipError()!=UNZ_OK) if(file.getZipError()!=UNZ_OK)
{ {
qWarning() << "Import failed. Cause: " << zip.getZipError(); qWarning() << "Import failed. Cause: " << zip.getZipError();
return ""; return false;
} }
if(!file.atEnd()) if(!file.atEnd())
{ {
qWarning() << "Import failed. Cause: read all but not EOF"; qWarning() << "Import failed. Cause: read all but not EOF";
return ""; return false;
} }
file.close(); file.close();
@ -156,7 +138,7 @@ QString UBImportDocument::expandFileToDir(const QFile& pZipFile, const QString&
if(file.getZipError()!=UNZ_OK) if(file.getZipError()!=UNZ_OK)
{ {
qWarning() << "Import failed. Cause: file.close(): " << file.getZipError(); qWarning() << "Import failed. Cause: file.close(): " << file.getZipError();
return ""; return false;
} }
} }
@ -166,11 +148,10 @@ QString UBImportDocument::expandFileToDir(const QFile& pZipFile, const QString&
if(zip.getZipError()!=UNZ_OK) if(zip.getZipError()!=UNZ_OK)
{ {
qWarning() << "Import failed. Cause: zip.close(): " << zip.getZipError(); qWarning() << "Import failed. Cause: zip.close(): " << zip.getZipError();
return ""; return false;
} }
return true;
return documentRootFolder;
} }
UBDocumentProxy* UBImportDocument::importFile(const QFile& pFile, const QString& pGroup) UBDocumentProxy* UBImportDocument::importFile(const QFile& pFile, const QString& pGroup)
@ -183,18 +164,18 @@ UBDocumentProxy* UBImportDocument::importFile(const QFile& pFile, const QString&
// first unzip the file to the correct place // first unzip the file to the correct place
QString path = UBSettings::userDocumentDirectory(); QString path = UBSettings::userDocumentDirectory();
QString documentRootFolder = expandFileToDir(pFile, path); QString documentRootFolder;
if(!documentRootFolder.length()){ if(!extractFileToDir(pFile, path, documentRootFolder)){
UBApplication::showMessage(tr("Import of file %1 failed.").arg(fi.baseName())); UBApplication::showMessage(tr("Import of file %1 failed.").arg(fi.baseName()));
return 0; return NULL;
} }
else{
UBDocumentProxy* newDocument = UBPersistenceManager::persistenceManager()->createDocumentFromDir(documentRootFolder, pGroup); UBDocumentProxy* newDocument = UBPersistenceManager::persistenceManager()->createDocumentFromDir(documentRootFolder, pGroup);
UBApplication::showMessage(tr("Import successful.")); UBApplication::showMessage(tr("Import successful."));
return newDocument; return newDocument;
} }
}
bool UBImportDocument::addFileToDocument(UBDocumentProxy* pDocument, const QFile& pFile) bool UBImportDocument::addFileToDocument(UBDocumentProxy* pDocument, const QFile& pFile)
{ {
@ -203,9 +184,18 @@ bool UBImportDocument::addFileToDocument(UBDocumentProxy* pDocument, const QFile
QString path = UBFileSystemUtils::createTempDir(); QString path = UBFileSystemUtils::createTempDir();
QString documentRootFolder = expandFileToDir(pFile, path); QString documentRootFolder;
if (!extractFileToDir(pFile, path, documentRootFolder))
{
UBApplication::showMessage(tr("Import of file %1 failed.").arg(fi.baseName()));
return false;
}
UBPersistenceManager::persistenceManager()->addDirectoryContentToDocument(documentRootFolder, pDocument); if (!UBPersistenceManager::persistenceManager()->addDirectoryContentToDocument(documentRootFolder, pDocument))
{
UBApplication::showMessage(tr("Import of file %1 failed.").arg(fi.baseName()));
return false;
}
UBFileSystemUtils::deleteDir(path); UBFileSystemUtils::deleteDir(path);

@ -37,7 +37,7 @@ class UBImportDocument : public UBDocumentBasedImportAdaptor
virtual bool addFileToDocument(UBDocumentProxy* pDocument, const QFile& pFile); virtual bool addFileToDocument(UBDocumentProxy* pDocument, const QFile& pFile);
private: private:
QString expandFileToDir(const QFile& pZipFile, const QString& pDir); bool extractFileToDir(const QFile& pZipFile, const QString& pDir, QString& documentRoot);
}; };
#endif /* UBIMPORTDOCUMENT_H_ */ #endif /* UBIMPORTDOCUMENT_H_ */

@ -194,7 +194,7 @@ int UBDocumentManager::addFilesToDocument(UBDocumentProxy* document, QStringList
int nImportedDocuments = 0; int nImportedDocuments = 0;
foreach(const QString& fileName, fileNames) foreach(const QString& fileName, fileNames)
{ {
UBApplication::showMessage(tr("Importing file").arg(fileName)); UBApplication::showMessage(tr("Importing file %1").arg(fileName));
QFile file(fileName); QFile file(fileName);
QFileInfo fileInfo(file); QFileInfo fileInfo(file);

@ -667,11 +667,8 @@ void UBPersistenceManager::copyPage(UBDocumentProxy* pDocumentProxy, const int s
int UBPersistenceManager::sceneCount(const UBDocumentProxy* proxy) int UBPersistenceManager::sceneCount(const UBDocumentProxy* proxy)
{ {
return sceneCountInDir(proxy->persistencePath()); const QString pPath = proxy->persistencePath();
}
int UBPersistenceManager::sceneCountInDir(const QString& pPath)
{
int pageIndex = 0; int pageIndex = 0;
bool moreToProcess = true; bool moreToProcess = true;
bool addedMissingZeroPage = false; bool addedMissingZeroPage = false;
@ -709,15 +706,23 @@ int UBPersistenceManager::sceneCountInDir(const QString& pPath)
return pageIndex; return pageIndex;
} }
QStringList UBPersistenceManager::getSceneFileNames(const QString& folder)
QString UBPersistenceManager::generateUniqueDocumentPath()
{ {
QString ubPath = UBSettings::userDocumentDirectory(); QDir dir(folder, "page???.svg", QDir::Name, QDir::Files);
return dir.entryList();
}
QString UBPersistenceManager::generateUniqueDocumentPath(const QString& baseFolder)
{
QDateTime now = QDateTime::currentDateTime(); QDateTime now = QDateTime::currentDateTime();
QString dirName = now.toString("yyyy-MM-dd hh-mm-ss.zzz"); QString dirName = now.toString("yyyy-MM-dd hh-mm-ss.zzz");
return ubPath + QString("/Sankore Document %1").arg(dirName); return baseFolder + QString("/Sankore Document %1").arg(dirName);
}
QString UBPersistenceManager::generateUniqueDocumentPath()
{
return generateUniqueDocumentPath(UBSettings::userDocumentDirectory());
} }
@ -730,22 +735,26 @@ void UBPersistenceManager::generatePathIfNeeded(UBDocumentProxy* pDocumentProxy)
} }
void UBPersistenceManager::addDirectoryContentToDocument(const QString& documentRootFolder, UBDocumentProxy* pDocument) bool UBPersistenceManager::addDirectoryContentToDocument(const QString& documentRootFolder, UBDocumentProxy* pDocument)
{ {
int sourcePageCount = sceneCountInDir(documentRootFolder); QStringList sourceScenes = getSceneFileNames(documentRootFolder);
if (sourceScenes.empty())
return false;
int targetPageCount = pDocument->pageCount(); int targetPageCount = pDocument->pageCount();
for(int sourceIndex = 0 ; sourceIndex < sourcePageCount; sourceIndex++) for(int sourceIndex = 0 ; sourceIndex < sourceScenes.size(); sourceIndex++)
{ {
int targetIndex = targetPageCount + sourceIndex; int targetIndex = targetPageCount + sourceIndex;
QFile svg(documentRootFolder + UBFileSystemUtils::digitFileFormat("/page%1.svg", sourceIndex)); QFile svg(documentRootFolder + "/" + sourceScenes[sourceIndex]);
svg.copy(pDocument->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", targetIndex)); if (!svg.copy(pDocument->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", targetIndex)))
return false;
UBSvgSubsetAdaptor::setSceneUuid(pDocument, targetIndex, QUuid::createUuid()); UBSvgSubsetAdaptor::setSceneUuid(pDocument, targetIndex, QUuid::createUuid());
QFile thumb(documentRootFolder + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", sourceIndex)); QFile thumb(documentRootFolder + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", sourceIndex));
// We can ignore error in this case, thumbnail will be genarated
thumb.copy(pDocument->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", targetIndex)); thumb.copy(pDocument->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", targetIndex));
} }
@ -753,11 +762,15 @@ void UBPersistenceManager::addDirectoryContentToDocument(const QString& document
{ {
qDebug() << "copying " << documentRootFolder << "/" << dir << " to " << pDocument->persistencePath() << "/" + dir; qDebug() << "copying " << documentRootFolder << "/" << dir << " to " << pDocument->persistencePath() << "/" + dir;
UBFileSystemUtils::copyDir(documentRootFolder + "/" + dir, pDocument->persistencePath() + "/" + dir); QDir srcDir(documentRootFolder + "/" + dir);
if (srcDir.exists())
if (!UBFileSystemUtils::copyDir(documentRootFolder + "/" + dir, pDocument->persistencePath() + "/" + dir))
return false;
} }
pDocument->setPageCount(sceneCount(pDocument)); pDocument->setPageCount(sceneCount(pDocument));
return false;
} }

@ -79,13 +79,14 @@ class UBPersistenceManager : public QObject
virtual QStringList allVideos(const QDir& dir); virtual QStringList allVideos(const QDir& dir);
virtual QStringList allWidgets(const QDir& dir); virtual QStringList allWidgets(const QDir& dir);
virtual QString generateUniqueDocumentPath(); QString generateUniqueDocumentPath();
QString generateUniqueDocumentPath(const QString& baseFolder);
QString teacherGuideAbsoluteObjectPath(UBDocumentProxy* pDocumentProxy); QString teacherGuideAbsoluteObjectPath(UBDocumentProxy* pDocumentProxy);
QString addObjectToTeacherGuideDirectory(UBDocumentProxy* proxy, QString pPath); QString addObjectToTeacherGuideDirectory(UBDocumentProxy* proxy, QString pPath);
QString addWidgetToTeacherGuideDirectory(UBDocumentProxy* pDocumentProxy, QString pPath); QString addWidgetToTeacherGuideDirectory(UBDocumentProxy* pDocumentProxy, QString pPath);
virtual void addDirectoryContentToDocument(const QString& documentRootFolder, UBDocumentProxy* pDocument); bool addDirectoryContentToDocument(const QString& documentRootFolder, UBDocumentProxy* pDocument);
virtual void upgradeDocumentIfNeeded(UBDocumentProxy* pDocumentProxy); virtual void upgradeDocumentIfNeeded(UBDocumentProxy* pDocumentProxy);
@ -128,7 +129,7 @@ class UBPersistenceManager : public QObject
int sceneCount(const UBDocumentProxy* pDocumentProxy); int sceneCount(const UBDocumentProxy* pDocumentProxy);
int sceneCountInDir(const QString& pPath); static QStringList getSceneFileNames(const QString& folder);
QList<QPointer<UBDocumentProxy> > allDocumentProxies(); QList<QPointer<UBDocumentProxy> > allDocumentProxies();

@ -273,7 +273,8 @@ bool UBFileSystemUtils::copyDir(const QString& pSourceDirPath, const QString& pT
QDir dirSource(pSourceDirPath); QDir dirSource(pSourceDirPath);
QDir dirTarget(pTargetDirPath); QDir dirTarget(pTargetDirPath);
dirTarget.mkpath(pTargetDirPath); if (!dirTarget.mkpath(pTargetDirPath))
return false;
bool successSoFar = true; bool successSoFar = true;

Loading…
Cancel
Save