summaryrefslogtreecommitdiffstats
path: root/logic/assets/AssetsMigrateTask.cpp
blob: 7c1f52040d1b812f8e440dffce57794abad081e9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include "AssetsMigrateTask.h"
#include "MultiMC.h"
#include "logger/QsLog.h"
#include <QJsonObject>
#include <QJsonDocument>
#include <QDirIterator>
#include <QCryptographicHash>
#include "gui/dialogs/CustomMessageBox.h"
#include <QDesktopServices>

AssetsMigrateTask::AssetsMigrateTask(int expected, QObject *parent)
	: Task(parent)
{
	this->m_expected = expected;
}

void AssetsMigrateTask::executeTask()
{
	this->setStatus(tr("Migrating legacy assets..."));
	this->setProgress(0);

	QDir assets_dir("assets");
	if (!assets_dir.exists())
	{
		emitFailed("Assets directory didn't exist");
		return;
	}
	assets_dir.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);
	int base_length = assets_dir.path().length();

	QList<QString> blacklist = {"indexes", "objects", "virtual"};

	if (!assets_dir.exists("objects"))
		assets_dir.mkdir("objects");
	QDir objects_dir("assets/objects");

	QDirIterator iterator(assets_dir, QDirIterator::Subdirectories);
	int successes = 0;
	int failures = 0;
	while (iterator.hasNext())
	{
		QString currentDir = iterator.next();
		currentDir = currentDir.remove(0, base_length + 1);

		bool ignore = false;
		for (QString blacklisted : blacklist)
		{
			if (currentDir.startsWith(blacklisted))
				ignore = true;
		}

		if (!iterator.fileInfo().isDir() && !ignore)
		{
			QString filename = iterator.filePath();

			QFile input(filename);
			input.open(QIODevice::ReadOnly | QIODevice::WriteOnly);
			QString sha1sum =
				QCryptographicHash::hash(input.readAll(), QCryptographicHash::Sha1)
					.toHex()
					.constData();

			QString object_name = filename.remove(0, base_length + 1);
			QLOG_DEBUG() << "Processing" << object_name << ":" << sha1sum << input.size();

			QString object_tlk = sha1sum.left(2);
			QString object_tlk_dir = objects_dir.path() + "/" + object_tlk;

			QDir tlk_dir(object_tlk_dir);
			if (!tlk_dir.exists())
				objects_dir.mkdir(object_tlk);

			QString new_filename = tlk_dir.path() + "/" + sha1sum;
			QFile new_object(new_filename);
			if (!new_object.exists())
			{
				bool rename_success = input.rename(new_filename);
				QLOG_DEBUG() << " Doesn't exist, copying to" << new_filename << ":"
							 << QString::number(rename_success);
				if (rename_success)
					successes++;
				else
					failures++;
			}
			else
			{
				input.remove();
				QLOG_DEBUG() << " Already exists, deleting original and not copying.";
			}

			this->setProgress(100 * ((successes + failures) / (float) this->m_expected));
		}
	}

	if (successes + failures == 0)
	{
		this->setProgress(100);
		QLOG_DEBUG() << "No legacy assets needed importing.";
	}
	else
	{
		QLOG_DEBUG() << "Finished copying legacy assets:" << successes << "successes and"
					 << failures << "failures.";

		this->setStatus("Cleaning up legacy assets...");
		this->setProgress(100);

		QDirIterator cleanup_iterator(assets_dir);

		while (cleanup_iterator.hasNext())
		{
			QString currentDir = cleanup_iterator.next();
			currentDir = currentDir.remove(0, base_length + 1);

			bool ignore = false;
			for (QString blacklisted : blacklist)
			{
				if (currentDir.startsWith(blacklisted))
					ignore = true;
			}

			if (cleanup_iterator.fileInfo().isDir() && !ignore)
			{
				QString path = cleanup_iterator.filePath();
				QDir folder(path);

				QLOG_DEBUG() << "Cleaning up legacy assets folder:" << path;

				folder.removeRecursively();
			}
		}
	}

	if(failures > 0)
	{
		emitFailed(QString("Failed to migrate %1 legacy assets").arg(failures));
	}
	else
	{
		emitSucceeded();
	}
}