новые иконки в OpenBoard
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
OpenBoard/src/transition/UniboardSankoreTransition.cpp

294 lines
11 KiB

13 years ago
/*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
14 years ago
#include "UniboardSankoreTransition.h"
#include "core/UBSettings.h"
#include "frameworks/UBDesktopServices.h"
#include "frameworks/UBFileSystemUtils.h"
#include "core/UBApplication.h"
#include "core/UBPersistenceManager.h"
#include "gui/UBMainWindow.h"
14 years ago
#include "core/memcheck.h"
14 years ago
UniboardSankoreTransition::UniboardSankoreTransition(QObject *parent) :
QObject(parent)
, mTransitionDlg(NULL)
, mThread(NULL)
14 years ago
{
mOldSankoreDirectory = UBFileSystemUtils::normalizeFilePath(UBDesktopServices::storageLocation(QDesktopServices::DataLocation));
mUniboardSourceDirectory = UBFileSystemUtils::normalizeFilePath(UBDesktopServices::storageLocation(QDesktopServices::DataLocation));
#if defined(Q_WS_MACX)
mOldSankoreDirectory.replace("Sankore/Sankore 3.1", "Sankore");
mUniboardSourceDirectory.replace("Sankore/Sankore 3.1", "Uniboard");
#else
mUniboardSourceDirectory.replace("Sankore/Sankore 3.1", "Mnemis/Uniboard");
#endif
connect(this, SIGNAL(docAdded(UBDocumentProxy*)), UBPersistenceManager::persistenceManager(), SIGNAL(documentCreated(UBDocumentProxy*)));
14 years ago
}
UniboardSankoreTransition::~UniboardSankoreTransition()
14 years ago
{
if(NULL != mTransitionDlg)
{
delete mTransitionDlg;
mTransitionDlg = NULL;
}
if(mThread){
delete mThread;
mThread = NULL;
}
14 years ago
}
void UniboardSankoreTransition::rollbackDocumentsTransition(QFileInfoList& fileInfoList)
{
QFileInfoList::iterator fileInfo;
for (fileInfo = fileInfoList.begin(); fileInfo != fileInfoList.end(); fileInfo += 1) {
if (fileInfo->isDir() && fileInfo->fileName().startsWith("Uniboard Document ")){
QString sankoreDocumentName = fileInfo->fileName();
sankoreDocumentName.replace("Uniboard","Sankore");
QString sankoreDocumentDirectoryPath = UBSettings::uniboardDocumentDirectory() + "/" + sankoreDocumentName;
if (QFileInfo(sankoreDocumentDirectoryPath).exists()){
UBFileSystemUtils::deleteDir(sankoreDocumentDirectoryPath);
}
}
}
}
bool UniboardSankoreTransition::checkDocumentDirectory(QString& documentDirectoryPath)
{
bool result = true;
result = updateSankoreHRef(documentDirectoryPath);
QString sankoreWidgetPath = documentDirectoryPath + "/widgets";
result &= updateIndexWidget(sankoreWidgetPath);
return result;
}
14 years ago
void UniboardSankoreTransition::documentTransition()
{
if (QFileInfo(mUniboardSourceDirectory).exists() || QFileInfo(mOldSankoreDirectory).exists()){
QString uniboardDocumentDirectory = mUniboardSourceDirectory + "/document";
QFileInfoList fileInfoList = UBFileSystemUtils::allElementsInDirectory(uniboardDocumentDirectory);
fileInfoList << UBFileSystemUtils::allElementsInDirectory(mOldSankoreDirectory + "/document");
QString backupDirectoryPath = UBFileSystemUtils::normalizeFilePath(UBDesktopServices::storageLocation(QDesktopServices::DesktopLocation));
if (fileInfoList.count() != 0){
mTransitionDlg = new UBUpdateDlg(NULL, fileInfoList.count(), backupDirectoryPath);
connect(mTransitionDlg, SIGNAL(updateFiles()), this, SLOT(startDocumentTransition()));
connect(this, SIGNAL(transitionFinished(bool)), mTransitionDlg, SLOT(onFilesUpdated(bool)));
mTransitionDlg->show();
}
}
else{
UBApplication::mainWindow->information(tr("Import old Uniboard/Sankore documents"), tr("There are no documents that should be imported"));
}
}
void UniboardSankoreTransition::startDocumentTransition()
{
mThread = new UniboardSankoreThread(this);
mThread->start();
connect(this,SIGNAL(transitioningFile(QString)),mTransitionDlg,SLOT(transitioningFile(QString)));
}
bool UniboardSankoreTransition::checkPage(QString& sankorePagePath)
{
QFile file(sankorePagePath);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return false;
QByteArray documentByteArray = file.readAll();
file.close();
QString sankoreDirectory = sankorePagePath.left(sankorePagePath.indexOf("/page"));
sankoreDirectory = QUrl::fromLocalFile(sankoreDirectory).toString();
QString documentString(documentByteArray);
QRegExp videoRegExp("<video(.*)xlink:href=\"(.*)videos/(.*)/>");
videoRegExp.setMinimal(true);
documentString.replace(videoRegExp,"<video\\1xlink:href=\"videos/\\3/>");
QRegExp audioRegExp("<audio(.*)xlink:href=\"(.*)audios/(.*)/>");
audioRegExp.setMinimal(true);
documentString.replace(audioRegExp,"<audio\\1xlink:href=\"audios/\\3/>");
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
return false;
file.write(documentString.toAscii());
file.close();
return true;
}
bool UniboardSankoreTransition::checkWidget(QString& sankoreWidgetIndexPath)
{
QFile file(sankoreWidgetIndexPath);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return false;
QByteArray documentByteArray = file.readAll();
file.close();
QString documentString(documentByteArray);
QRegExp swfOriginFilePathRegExp("<param name=\"movie\" value=\"(.*)\">");
swfOriginFilePathRegExp.setMinimal(true);
swfOriginFilePathRegExp.indexIn(documentString);
QString origin = swfOriginFilePathRegExp.cap(1);
if(origin.contains("http://")){
// an url is the source of the swf. The source is kept as is.
return true;
}
//changing the path
QRegExp swfDataPathRegExp("<object(.*)data=\"(.*)interactive content/Web/(.*)\"(.*)>");
swfDataPathRegExp.setMinimal(true);
documentString.replace(swfDataPathRegExp,"<object\\1data=\"\\3\">");
QRegExp swfMoviePathRegExp("<param name=\"movie\" value=\"(.*)interactive content/Web/(.*)\">");
swfMoviePathRegExp.setMinimal(true);
documentString.replace(swfMoviePathRegExp,"<param name=\"movie\" value=\"\\2\">");
//copy the swf on the right place
QRegExp swfFileNameRegExp("<param name=\"movie\" value=\"(.*)\">");
swfFileNameRegExp.setMinimal(true);
swfFileNameRegExp.indexIn(documentString);
QString swfFileName = swfFileNameRegExp.cap(1);
int lastDirectoryLevel = sankoreWidgetIndexPath.lastIndexOf("/");
if (lastDirectoryLevel == -1)
lastDirectoryLevel = sankoreWidgetIndexPath.lastIndexOf("\\");
QString destination(sankoreWidgetIndexPath.left(lastDirectoryLevel) + "/" + swfFileName);
QFile(origin).copy(destination);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
return false;
file.write(documentString.toAscii());
file.close();
return true;
}
bool UniboardSankoreTransition::updateIndexWidget(QString& sankoreWidgetPath)
{
bool result = true;
QFileInfoList fileInfoList = UBFileSystemUtils::allElementsInDirectory(sankoreWidgetPath);
QFileInfoList::iterator fileInfo;
for (fileInfo = fileInfoList.begin(); fileInfo != fileInfoList.end() && result; fileInfo += 1) {
if (fileInfo->fileName().endsWith("wgt")){
QString path = fileInfo->absolutePath() + "/" + fileInfo->fileName() + "/index.html";
if (QFile(path).exists())
result = checkWidget(path);
path = fileInfo->absolutePath() + "/" + fileInfo->fileName() + "/index.htm";
if (QFile(path).exists())
result &= checkWidget(path);
}
}
return result;
}
bool UniboardSankoreTransition::updateSankoreHRef(QString& sankoreDocumentPath)
{
bool result = true;
QFileInfoList fileInfoList = UBFileSystemUtils::allElementsInDirectory(sankoreDocumentPath);
QFileInfoList::iterator fileInfo;
for (fileInfo = fileInfoList.begin(); fileInfo != fileInfoList.end() && result; fileInfo += 1) {
if (fileInfo->fileName().endsWith("svg")){
QString path = fileInfo->absolutePath() + "/" + fileInfo->fileName();
result = checkPage(path);
}
}
return result;
}
void UniboardSankoreTransition::executeTransition()
{
bool result = false;
QString backupDestinationPath = mTransitionDlg->backupPath() + "/OldSankoreAndUniboardVersionsBackup";
result = UBFileSystemUtils::copyDir(mUniboardSourceDirectory + "/document", backupDestinationPath);
result &= UBFileSystemUtils::copyDir(mOldSankoreDirectory + "/document", backupDestinationPath);
14 years ago
QString uniboardDocumentDirectory = mUniboardSourceDirectory + "/document";
14 years ago
QFileInfoList fileInfoList = UBFileSystemUtils::allElementsInDirectory(uniboardDocumentDirectory);
fileInfoList.append(UBFileSystemUtils::allElementsInDirectory(mOldSankoreDirectory + "/document"));
14 years ago
QFileInfoList::iterator fileInfo;
QString sankoreDocumentDirectory = UBSettings::uniboardDocumentDirectory();
14 years ago
for (fileInfo = fileInfoList.begin(); fileInfo != fileInfoList.end() && result; fileInfo += 1) {
if (fileInfo->isDir() && (fileInfo->fileName().startsWith("Uniboard Document ") || fileInfo->fileName().startsWith("Sankore Document "))){
14 years ago
QString sankoreDocumentName = fileInfo->fileName();
emit transitioningFile(sankoreDocumentName);
14 years ago
sankoreDocumentName.replace("Uniboard","Sankore");
QString sankoreDocumentPath = sankoreDocumentDirectory + "/" + sankoreDocumentName;
result = UBFileSystemUtils::copyDir(fileInfo->filePath(),sankoreDocumentPath);
result &= updateSankoreHRef(sankoreDocumentPath);
QString sankoreWidgetPath = sankoreDocumentDirectory + "/" + sankoreDocumentName + "/widgets";
result &= updateIndexWidget(sankoreWidgetPath);
14 years ago
}
}
if (!result){
qWarning() << "The transition has failed";
14 years ago
rollbackDocumentsTransition(fileInfoList);
UBFileSystemUtils::deleteDir(backupDestinationPath);
14 years ago
}
else{
UBFileSystemUtils::deleteDir(mOldSankoreDirectory);
14 years ago
UBFileSystemUtils::deleteDir(mUniboardSourceDirectory);
}
emit transitionFinished(result);
}
UniboardSankoreThread::UniboardSankoreThread(QObject* parent):QThread(parent)
{
}
UniboardSankoreThread::~UniboardSankoreThread()
{
}
void UniboardSankoreThread::run()
{
UniboardSankoreTransition* pTransition = dynamic_cast<UniboardSankoreTransition*>(parent());
pTransition->executeTransition();
}