Skip to content

Commit 7746be8

Browse files
committed
patcher fix
1 parent c38248c commit 7746be8

File tree

2 files changed

+57
-21
lines changed

2 files changed

+57
-21
lines changed

Patcher/Source/Project/Project.cpp

Lines changed: 56 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -215,45 +215,81 @@ namespace pr {
215215
auto* newPacket = new dt::TreeModel(true); //packet
216216
newPacket->setPacketName(it.key());
217217
dt::TreeItem* item = dt::TreeModel::getObject().rootItemPtr();
218-
readPacket(newPacket->rootItemPtr(), pack["Files"].toObject(), item);
218+
std::filesystem::path p;
219+
readPacket(newPacket->rootItemPtr(), pack["Files"].toObject(), item, p);
219220
packets.append(newPacket);
220221
}
221222
numberOFPacks = packets.size();
222223
nmbChanged();
223224
}
224225

225-
void Project::readPacket(dt::TreeItem* item, QJsonObject& object, dt::TreeItem* root) {
226+
namespace {
227+
void addDeleted(QJsonObject& object, dt::TreeItem* root, std::filesystem::path path) {
228+
for (auto& it = object.begin(); it != object.end(); it++) {
229+
QJsonObject& pack = it->toObject();
230+
if (!pack.isEmpty() && !pack.begin()->isObject()) { // for sure object is file
231+
auto size = std::stoll(pack["Size"].toString().toStdString());
232+
auto& sha = pack["Sha"].toString();
233+
auto* appended = root->appendChildren({ it.key(), (path / it.key().toStdString()).c_str() }, false, sha, size);
234+
appended->setState(dt::TreeItem::fileState::DELETED);
235+
} else {
236+
auto* appended = root->appendChildren({ it.key(), (path / it.key().toStdString()).c_str() }, true, "", 0);
237+
appended->setState(dt::TreeItem::fileState::DELETED);
238+
addDeleted(pack, appended, path / it.key().toStdString());
239+
}
240+
}
241+
}
242+
}
243+
244+
void Project::readPacket(dt::TreeItem* item, QJsonObject& object, dt::TreeItem* root, std::filesystem::path path) {
226245
auto size = root->childCount();
227246
for (size_t i = 0; i < size; i++) {
228-
auto* child = item->child(i);
247+
auto* child = root->child(i);
229248
if (!child->checked() && !child->isDirectory()) { // item is unchecked file
230249
auto fileName = child->fileName();
231250
auto it = object.find(fileName);
232251
if (it != object.end()) { // found object in packet
233252
QJsonObject& file = it->toObject();
234253
if (!file.isEmpty() && !file.begin()->isObject()) { // for sure object is file
235-
auto& size = file["Size"].toString().toStdString();
254+
auto size = std::stoll(file["Size"].toString().toStdString());
236255
auto& sha = file["Sha"].toString();
237-
auto* appended = item->appendChildren({ it.key(), fullPath.generic_string().c_str() }, false, , std::stoll(size));
238-
verify(appended);
256+
auto* appended = item->appendChildren({ it.key(), child->path() }, false, sha, size);
257+
bool sizeCmp = size == child->fileSize(), shaCmp = sha == child->fileSha();
258+
if (!sizeCmp || !shaCmp) {
259+
appended->setState(dt::TreeItem::fileState::CHANGED);
260+
} else if (sizeCmp && shaCmp) {
261+
appended->setState(dt::TreeItem::fileState::SAME);
262+
} else {
263+
//problem
264+
}
265+
child->markRemove();
266+
} else {
267+
std::cout << "file: "; //todo
268+
throw std::exception();
239269
}
240-
child->
270+
child->check(); // mark as checked
271+
object.erase(it);
272+
} else { // not found = new file apered
273+
274+
}
275+
276+
} else if (child->isDirectory()) {
277+
auto fileName = child->fileName();
278+
auto it = object.find(fileName);
279+
if (it != object.end()) { // found object in packet
280+
QJsonObject& file = it->toObject();
281+
if (!file.isEmpty()) {
282+
auto* appended = item->appendChildren({ it.key(), child->path() }, true, "", 0);
283+
appended->setState(dt::TreeItem::fileState::SAME);
284+
readPacket(child, file, appended, path / fileName.toStdString());
285+
}
286+
object.erase(it);
287+
child->markRemove();
288+
child->check(); // mark as checked
241289
}
242290
}
243291
}
244-
for (auto& it = object.begin(); it != object.end(); it++) {
245-
QJsonObject& file = it->toObject();
246-
if (!file.isEmpty() && !file.begin()->isObject()) { //file
247-
auto& size = file["Size"].toString().toStdString();
248-
auto* appended = item->appendChildren({ it.key(), fullPath.generic_string().c_str() }, false, file["Sha"].toString(), std::stoll(size));
249-
verify(appended);
250-
} else {
251-
auto* appended = item->appendChildren({ it.key(), fullPath.generic_string().c_str() }, true, "", 0);
252-
verify(appended);
253-
readPacket(appended, file, fullPath);
254-
}
255-
fullPath = fullPath.parent_path();
256-
}
292+
addDeleted(object, item, path);
257293
}
258294

259295
void Project::verify(dt::TreeItem* item) {

Patcher/Source/Project/Project.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ namespace pr {
7676
void insertFileData(std::filesystem::path file);
7777
bool newProject() { return newProject_; }
7878
void insertData(dt::TreeItem* item, QJsonObject& object);
79-
void readPacket(dt::TreeItem* item, QJsonObject& object, dt::TreeItem* root);
79+
void readPacket(dt::TreeItem* item, QJsonObject& object, dt::TreeItem* root, std::filesystem::path path);
8080
void verify(dt::TreeItem* item);
8181
Q_INVOKABLE void loadProject();
8282
signals:

0 commit comments

Comments
 (0)