@@ -215,45 +215,81 @@ namespace pr {
215
215
auto * newPacket = new dt::TreeModel (true ); // packet
216
216
newPacket->setPacketName (it.key ());
217
217
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);
219
220
packets.append (newPacket);
220
221
}
221
222
numberOFPacks = packets.size ();
222
223
nmbChanged ();
223
224
}
224
225
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) {
226
245
auto size = root->childCount ();
227
246
for (size_t i = 0 ; i < size; i++) {
228
- auto * child = item ->child (i);
247
+ auto * child = root ->child (i);
229
248
if (!child->checked () && !child->isDirectory ()) { // item is unchecked file
230
249
auto fileName = child->fileName ();
231
250
auto it = object.find (fileName);
232
251
if (it != object.end ()) { // found object in packet
233
252
QJsonObject& file = it->toObject ();
234
253
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 () );
236
255
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 ();
239
269
}
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
241
289
}
242
290
}
243
291
}
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);
257
293
}
258
294
259
295
void Project::verify (dt::TreeItem* item) {
0 commit comments