mirror of
https://gitea.msk.dinamika-avia.ru/Constanta-Design/RRJServer.git
synced 2026-03-27 19:45:43 +03:00
443 lines
12 KiB
C++
443 lines
12 KiB
C++
#include <QThread>
|
||
#include <QXmlStreamReader>
|
||
#include "assetsmanager.h"
|
||
|
||
AssetsManager::AssetsManager(QObject *parent) : QObject(parent)
|
||
{
|
||
qDebug() << "AssetsManager init thread ID " << QThread::currentThreadId();
|
||
}
|
||
|
||
void AssetsManager::initialize(UpdateController* updateContoller)
|
||
{
|
||
qDebug() << "AssetsManager::initialize thread ID " << QThread::currentThreadId();
|
||
|
||
this->updateController = updateContoller;
|
||
//connect(this,&AssetsManager::sigSaveVersion,updateContoller,&UpdateController::saveVersionToFile);
|
||
datas = new QList<StreamingVersionData*>;
|
||
}
|
||
|
||
void AssetsManager::fillDatas()
|
||
{
|
||
QByteArray array;
|
||
QFile file(versionListFile);
|
||
|
||
if(!file.exists())
|
||
{
|
||
return;
|
||
}
|
||
|
||
datas->clear();
|
||
|
||
file.open(QIODevice::ReadOnly);
|
||
array = file.readAll();
|
||
file.close();
|
||
QXmlStreamReader xmlReader(array);
|
||
|
||
xmlReader.readNext();
|
||
QString name = xmlReader.name().toString();
|
||
|
||
while(!xmlReader.atEnd())
|
||
{
|
||
name = xmlReader.name().toString();
|
||
|
||
if(!xmlReader.isStartElement()) {
|
||
xmlReader.readNext();
|
||
continue;
|
||
}
|
||
|
||
if(xmlReader.name() == "VersionList")
|
||
{
|
||
xmlReader.readNext();
|
||
|
||
while (!xmlReader.atEnd())
|
||
{
|
||
if(xmlReader.isStartElement())
|
||
{
|
||
if(xmlReader.name() == "VersionData")
|
||
{
|
||
StreamingVersionData *data = new StreamingVersionData();
|
||
|
||
foreach(const QXmlStreamAttribute &attr,xmlReader.attributes())
|
||
{
|
||
QString name = attr.name().toString();
|
||
QString value = attr.value().toString();
|
||
|
||
if(name == "Version")
|
||
data->setViewName(value);
|
||
else if(name == "Created")
|
||
data->setCreateData(QDateTime::fromString(value));
|
||
else if(name == "isChangeable")
|
||
data->setIsChangeable(value.toInt());
|
||
else if(name == "author")
|
||
data->setAuthor(value);
|
||
|
||
}
|
||
|
||
datas->append(data);
|
||
}
|
||
}
|
||
|
||
xmlReader.readNext();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void AssetsManager::setVersionList(QList<StreamingVersionData*> *streamingVersion)
|
||
{
|
||
datas->clear();
|
||
datas = streamingVersion;
|
||
}
|
||
|
||
bool AssetsManager::findDuplicate(QString name)
|
||
{
|
||
QListIterator<StreamingVersionData*> iterator(*datas);
|
||
|
||
while (iterator.hasNext())
|
||
{
|
||
if (iterator.next()->getViewName() == name) return true;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
QString AssetsManager::setVersion(QString versionName)
|
||
{
|
||
QListIterator<StreamingVersionData*> iterator(*datas);
|
||
|
||
while (iterator.hasNext())
|
||
{
|
||
StreamingVersionData *version = iterator.next();
|
||
|
||
if (version->getViewName() == versionName)
|
||
{
|
||
currentVersionData = version;
|
||
saveVersionToFile(currentVersionData);
|
||
|
||
Logger::instance().log("Set Version of materials: " + versionName);
|
||
|
||
emit signal_setVersion(versionName);
|
||
|
||
return version->getAbsolutPath();
|
||
}
|
||
}
|
||
|
||
return "none";
|
||
}
|
||
|
||
QList<FileData> *AssetsManager::prepareLocalPathList(QList<FileData> *fileData)
|
||
{
|
||
QList<FileData> *completeList = fileData;
|
||
|
||
for(int i = 0; i < completeList->count();i++)
|
||
{
|
||
FileData fileData = completeList->at(i);
|
||
|
||
int index = fileData.path.indexOf(currentVersionData->getViewName());
|
||
if(index != -1)
|
||
{
|
||
fileData.path = Tools::createRealPath(fileData.path,currentVersionData); //делаем в полный путь
|
||
completeList->replace(i,fileData);
|
||
}
|
||
else
|
||
{
|
||
fileData.path = Tools::createRootPath(fileData.path);
|
||
}
|
||
|
||
}
|
||
|
||
return completeList;
|
||
}
|
||
|
||
QList<FileData> *AssetsManager::prepareRealPathList(QList<FileData> *fileData)
|
||
{
|
||
QList<FileData> *completeList = fileData;
|
||
|
||
for(int i = 0; i < completeList->count();i++)
|
||
{
|
||
FileData fileData = completeList->at(i);
|
||
if(fileData.path.contains(streamingAssetsFolderName))
|
||
{
|
||
fileData.path = Tools::createStreamingToRealPath(fileData.path,currentVersionData);
|
||
}
|
||
else
|
||
{
|
||
fileData.path = Tools::createRealPath(fileData.path,currentVersionData); //делаем в полный путь
|
||
}
|
||
|
||
completeList->replace(i,fileData);
|
||
}
|
||
|
||
return completeList;
|
||
}
|
||
|
||
void AssetsManager::addVersion(StreamingVersionData *data)
|
||
{
|
||
datas->push_back(data);
|
||
}
|
||
|
||
void AssetsManager::createCopyVersion(QString versionName,QString newVersionName,QString author)
|
||
{
|
||
qDebug() << "AssetsManager::createCopyVersion thread ID " << QThread::currentThreadId();
|
||
StreamingVersionData* data = new StreamingVersionData;
|
||
|
||
data->setAbsolutePath(Tools::createSharedPath("/" + newVersionName));
|
||
data->setAuthor(author);
|
||
data->setIsChangeable(true);
|
||
data->setViewName(newVersionName);
|
||
data->setCreateData(QDateTime::currentDateTime());
|
||
datas->append(data);
|
||
|
||
qDebug() << "Version for copy " << versionName;
|
||
qDebug() << "New version name " << newVersionName;
|
||
|
||
//берем путь до копии
|
||
//преобразуем в реальный путь
|
||
QString sourcePath = QDir::currentPath() + "/" + sharedDataFolderName + "/" + versionName;
|
||
QString destinationPath = QDir::currentPath() + "/" + sharedDataFolderName + "/" + newVersionName;
|
||
|
||
QDir sourceDir(sourcePath);
|
||
|
||
if(!sourceDir.exists())
|
||
{
|
||
qDebug() << "Версии нет в SharedData";
|
||
return;
|
||
}
|
||
|
||
QDir destinationDir(destinationPath);
|
||
if(destinationDir.exists())
|
||
{
|
||
qDebug() << "Папка уже существует";
|
||
return;
|
||
}
|
||
|
||
//Создаем папку в Shared с новым именем
|
||
QDir().mkdir(destinationPath);
|
||
copyAllRecurse(sourcePath,destinationPath);
|
||
//добавляем в список текущих ассетов
|
||
updateController->calculateFullHash();
|
||
updateController->changeAssetVersion(newVersionName);
|
||
updateController->sendNewVersionList();
|
||
//повторно отправляем список версий из папки shared
|
||
|
||
}
|
||
|
||
void AssetsManager::deleteVersion(QString versionName)
|
||
{
|
||
QMutableListIterator<StreamingVersionData*> iterator(*datas);
|
||
|
||
//если версия равна текущей - игнор
|
||
if (currentVersionData->getViewName() == versionName)
|
||
return;
|
||
|
||
while (iterator.hasNext())
|
||
{
|
||
StreamingVersionData *version = iterator.next();
|
||
|
||
//проверка на наличие указанной версии
|
||
if (version->getViewName() == versionName)
|
||
{
|
||
//удаление папки
|
||
QString verFolderPath = QDir::currentPath() + "/" + sharedDataFolderName + "/" + versionName;
|
||
QDir dir(verFolderPath);
|
||
dir.removeRecursively();
|
||
|
||
//удаление хэша
|
||
QString hashPath = QDir::currentPath() + "/" + staticDataFolderName + "/" + versionName + "Hash.xml";
|
||
QFile file(hashPath);
|
||
|
||
if(file.exists()){
|
||
file.remove();
|
||
}
|
||
|
||
//удаление
|
||
datas->removeOne(version);
|
||
break;
|
||
}
|
||
}
|
||
|
||
updateController->calculateSharedHash();
|
||
updateController->sendNewVersionList();
|
||
}
|
||
|
||
void AssetsManager::copyAllRecurse(QString source,QString destination)
|
||
{
|
||
|
||
//Копируем все объекты туда
|
||
QDir sourceDir(source);
|
||
|
||
foreach(QString folder,sourceDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot))
|
||
{
|
||
QString destPath = destination + QDir::separator() + folder;
|
||
sourceDir.mkpath(destPath);
|
||
copyAllRecurse(source + QDir::separator() + folder,destPath);
|
||
}
|
||
|
||
foreach(QString file,sourceDir.entryList(QDir::Files))
|
||
{
|
||
QFile::copy(source + QDir::separator() + file,destination + QDir::separator() + file);
|
||
}
|
||
}
|
||
|
||
void AssetsManager::writeVersionsToFile(QList<StreamingVersionData*> version,bool isFirst)
|
||
{
|
||
QList<SXmlAnswerTag> listTag;
|
||
datas->clear();
|
||
QFile file(versionListFile);
|
||
|
||
foreach(StreamingVersionData* ver,version)
|
||
{
|
||
SAttribute attribute1 = {"Version", ver->getViewName()};
|
||
SAttribute attribute2 = {"Created", ver->getCreateData().toString()};
|
||
SAttribute attribute3;
|
||
SAttribute attribute4;
|
||
|
||
if(isFirst)
|
||
{
|
||
QString author = tr("LLC Constanta-Design");
|
||
attribute4 = {"author",author};
|
||
ver->setAuthor(author);
|
||
|
||
if(ver->getViewName() == "base")
|
||
attribute3 = {"isChangeable",QString::number(false)};
|
||
else
|
||
attribute3 = {"isChangeable",QString::number(true)};
|
||
|
||
}else
|
||
{
|
||
attribute3 ={"isChangeable",QString::number(ver->getIsChangeable())};
|
||
attribute4 = {"author",ver->getAuthor()};
|
||
}
|
||
|
||
|
||
QList<SAttribute> listAttr = {attribute1, attribute2,attribute3,attribute4};
|
||
SXmlAnswerTag tag = {"VersionData", listAttr};
|
||
|
||
listTag.append(tag);
|
||
datas->append(ver);
|
||
}
|
||
|
||
file.open(QIODevice::WriteOnly);
|
||
|
||
QXmlStreamWriter xmlWriter(&file);
|
||
xmlWriter.setAutoFormatting(true);
|
||
xmlWriter.writeStartDocument();
|
||
xmlWriter.writeStartElement("VersionList");
|
||
|
||
foreach(SXmlAnswerTag tag,listTag)
|
||
{
|
||
xmlWriter.writeStartElement(tag.elementName);
|
||
|
||
foreach(SAttribute attribute,tag.attr)
|
||
{
|
||
xmlWriter.writeAttribute(attribute.name,attribute.value);
|
||
}
|
||
|
||
xmlWriter.writeEndElement();
|
||
}
|
||
|
||
xmlWriter.writeEndElement();
|
||
xmlWriter.writeEndDocument();
|
||
file.close();
|
||
}
|
||
|
||
void AssetsManager::createFirstVersionListXML(QList<StreamingVersionData*> version)
|
||
{
|
||
QFile file(versionListFile);
|
||
QList<StreamingVersionData*> *temp = new QList<StreamingVersionData*>();
|
||
if(!file.exists())
|
||
{
|
||
writeVersionsToFile(version,true);
|
||
}
|
||
else
|
||
{
|
||
|
||
if(datas->count() == 0) fillDatas();
|
||
|
||
foreach(StreamingVersionData* ver,version)
|
||
{
|
||
foreach(StreamingVersionData* data,*datas)
|
||
{
|
||
if(ver->getViewName() == data->getViewName())
|
||
{
|
||
StreamingVersionData *tempData = new StreamingVersionData;
|
||
|
||
tempData->fill(data);
|
||
tempData->setAbsolutePath(ver->getAbsolutPath());
|
||
temp->append(tempData);
|
||
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
writeVersionsToFile(*temp,false);
|
||
}
|
||
|
||
}
|
||
|
||
QString AssetsManager::getLastVersion()
|
||
{
|
||
QString result;
|
||
QFile file(version);
|
||
|
||
if (!file.exists()) return setVersion("base");
|
||
|
||
if (file.open(QIODevice::ReadOnly))
|
||
{
|
||
QXmlStreamReader reader(file.readAll());
|
||
|
||
while (!reader.atEnd())
|
||
{
|
||
reader.readNext();
|
||
|
||
foreach(const QXmlStreamAttribute &attr,reader.attributes())
|
||
{
|
||
QString name = attr.name().toString();
|
||
QString value = attr.value().toString();
|
||
|
||
if(name == "Version")
|
||
{
|
||
result = value;
|
||
qDebug() << value;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return setVersion(result);
|
||
}
|
||
|
||
void AssetsManager::saveVersionToFile(StreamingVersionData *streamingVersion) //TODO: переименовать и перебросить в AssetManager
|
||
{
|
||
QFile file(version);
|
||
file.open(QFile::WriteOnly);
|
||
|
||
QXmlStreamWriter xmlWriter(&file);
|
||
xmlWriter.setAutoFormatting(true);
|
||
xmlWriter.writeStartDocument();
|
||
|
||
xmlWriter.writeStartElement("VersionData");
|
||
xmlWriter.writeAttribute("Version",streamingVersion->getViewName());
|
||
xmlWriter.writeAttribute("Created",streamingVersion->getCreateData().toString());
|
||
xmlWriter.writeAttribute("isChangeable",QString::number(streamingVersion->getIsChangeable()));
|
||
xmlWriter.writeAttribute("author",streamingVersion->getAuthor());
|
||
|
||
xmlWriter.writeEndElement();
|
||
xmlWriter.writeEndDocument();
|
||
|
||
file.close();
|
||
}
|
||
|
||
AssetsManager::~AssetsManager()
|
||
{
|
||
|
||
}
|
||
|
||
StreamingVersionData *AssetsManager::getCurrentVersionData() const
|
||
{
|
||
return currentVersionData;
|
||
}
|
||
|