diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/IcePatch2/Client.cpp | 72 | ||||
-rw-r--r-- | cpp/src/IcePatch2/FileServerI.cpp | 46 | ||||
-rw-r--r-- | cpp/src/IcePatch2/FileServerI.h | 8 | ||||
-rw-r--r-- | cpp/src/IcePatch2/Util.cpp | 108 |
4 files changed, 82 insertions, 152 deletions
diff --git a/cpp/src/IcePatch2/Client.cpp b/cpp/src/IcePatch2/Client.cpp index 78edbe8d26d..c5627a191d2 100644 --- a/cpp/src/IcePatch2/Client.cpp +++ b/cpp/src/IcePatch2/Client.cpp @@ -177,14 +177,19 @@ IcePatch2::Client::run(int argc, char* argv[]) FileTree0 tree0; getFileTree0(infoSeq, tree0); - + FileInfoSeq removeFiles; FileInfoSeq updateFiles; - if(tree0.checksum != fileServer->getChecksum0()) + ByteSeq empty(20, 0); + + if(tree0.checksum != fileServer->getChecksum()) { - ByteSeqSeq checksum1Seq = fileServer->getChecksum1Seq(); - if(checksum1Seq.size() != 256) + string progress = "0%"; + cout << "Getting list of files to patch: " << progress << flush; + + ByteSeqSeq checksum0Seq = fileServer->getChecksum0Seq(); + if(checksum0Seq.size() != 256) { cerr << argv[0] << ": server returned illegal value" << endl; return EXIT_FAILURE; @@ -192,41 +197,40 @@ IcePatch2::Client::run(int argc, char* argv[]) for(int node0 = 0; node0 < 256; ++node0) { - if(tree0.nodes[node0].checksum != checksum1Seq[node0]) + if(tree0.nodes[node0].checksum != checksum0Seq[node0]) { - ByteSeqSeq checksum2Seq = fileServer->getChecksum2Seq(node0); - if(checksum2Seq.size() != 256) - { - cerr << argv[0] << ": server returned illegal value" << endl; - return EXIT_FAILURE; - } - - for(int node1 = 0; node1 < 256; ++node1) - { - if(tree0.nodes[node0].nodes[node1].checksum != checksum2Seq[node1]) - { - FileInfoSeq fileSeq = fileServer->getFileInfoSeq(node0, node1); - sort(fileSeq.begin(), fileSeq.end(), FileInfoCompare()); - - set_difference(tree0.nodes[node0].nodes[node1].files.begin(), - tree0.nodes[node0].nodes[node1].files.end(), - fileSeq.begin(), - fileSeq.end(), - back_inserter(removeFiles), - FileInfoCompare()); - - set_difference(fileSeq.begin(), - fileSeq.end(), - tree0.nodes[node0].nodes[node1].files.begin(), - tree0.nodes[node0].nodes[node1].files.end(), - back_inserter(updateFiles), - FileInfoCompare()); - } - } + FileInfoSeq fileSeq = fileServer->getFileInfo1Seq(node0); + + sort(fileSeq.begin(), fileSeq.end(), FileInfoCompare()); + + set_difference(tree0.nodes[node0].files.begin(), + tree0.nodes[node0].files.end(), + fileSeq.begin(), + fileSeq.end(), + back_inserter(removeFiles), + FileInfoCompare()); + + set_difference(fileSeq.begin(), + fileSeq.end(), + tree0.nodes[node0].files.begin(), + tree0.nodes[node0].files.end(), + back_inserter(updateFiles), + FileInfoCompare()); + } + + for(unsigned int i = 0; i < progress.size(); ++i) + { + cout << '\b'; } + ostringstream s; + s << (node0 + 1) * 100 / 256 << '%'; + progress = s.str(); + cout << progress << flush; } } + cout << endl; + sort(removeFiles.begin(), removeFiles.end(), FileInfoCompare()); sort(updateFiles.begin(), updateFiles.end(), FileInfoCompare()); diff --git a/cpp/src/IcePatch2/FileServerI.cpp b/cpp/src/IcePatch2/FileServerI.cpp index 85fdc5bb6ce..313b14e3247 100644 --- a/cpp/src/IcePatch2/FileServerI.cpp +++ b/cpp/src/IcePatch2/FileServerI.cpp @@ -26,59 +26,21 @@ IcePatch2::FileServerI::FileServerI(const FileInfoSeq& infoSeq) { FileTree0& tree0 = const_cast<FileTree0&>(_tree0); getFileTree0(infoSeq, tree0); - -/* - assert(tree0.nodes.size() == 256); - for(int i = 0; i < 256; ++i) - { - FileTree1& tree1 = tree0.nodes[i]; - assert(tree1.nodes.size() == 256); - for(int j = 0; j < 256; ++j) - { - FileTree2& tree2 = tree1.nodes[j]; - } - } - - cout << "Summary ===> " << bytesToString(tree0.checksum) << endl; -*/ } FileInfoSeq -IcePatch2::FileServerI::getFileInfoSeq(Int node0, Int node1, const Current&) const +IcePatch2::FileServerI::getFileInfo1Seq(Int node0, const Current&) const { if(node0 < 0 || node0 > 255) { throw NodeOutOfRangeException(); } - if(node1 < 0 || node1 > 255) - { - throw NodeOutOfRangeException(); - } - - return _tree0.nodes[node0].nodes[node1].files; -} - -ByteSeqSeq -IcePatch2::FileServerI::getChecksum2Seq(Int node0, const Current&) const -{ - if(node0 < 0 || node0 > 255) - { - throw NodeOutOfRangeException(); - } - - ByteSeqSeq checksums(256); - - for(int node1 = 0; node1 < 256; ++node1) - { - checksums[node1] = _tree0.nodes[node0].nodes[node1].checksum; - } - - return checksums; + return _tree0.nodes[node0].files; } ByteSeqSeq -IcePatch2::FileServerI::getChecksum1Seq(const Current&) const +IcePatch2::FileServerI::getChecksum0Seq(const Current&) const { ByteSeqSeq checksums(256); @@ -91,7 +53,7 @@ IcePatch2::FileServerI::getChecksum1Seq(const Current&) const } ByteSeq -IcePatch2::FileServerI::getChecksum0(const Current&) const +IcePatch2::FileServerI::getChecksum(const Current&) const { return _tree0.checksum; } diff --git a/cpp/src/IcePatch2/FileServerI.h b/cpp/src/IcePatch2/FileServerI.h index 29136554afe..f5f20dcbfcd 100644 --- a/cpp/src/IcePatch2/FileServerI.h +++ b/cpp/src/IcePatch2/FileServerI.h @@ -22,13 +22,11 @@ public: FileServerI(const FileInfoSeq&); - FileInfoSeq getFileInfoSeq(Ice::Int, Ice::Int, const Ice::Current&) const; + FileInfoSeq getFileInfo1Seq(Ice::Int, const Ice::Current&) const; - ByteSeqSeq getChecksum2Seq(Ice::Int, const Ice::Current&) const; + ByteSeqSeq getChecksum0Seq(const Ice::Current&) const; - ByteSeqSeq getChecksum1Seq(const Ice::Current&) const; - - Ice::ByteSeq getChecksum0(const Ice::Current&) const; + Ice::ByteSeq getChecksum(const Ice::Current&) const; Ice::ByteSeq getFileCompressed(const std::string&, Ice::Int pos, Ice::Int num, const Ice::Current&) const; diff --git a/cpp/src/IcePatch2/Util.cpp b/cpp/src/IcePatch2/Util.cpp index b1c1adf8439..a1682caba19 100644 --- a/cpp/src/IcePatch2/Util.cpp +++ b/cpp/src/IcePatch2/Util.cpp @@ -718,6 +718,43 @@ IcePatch2::loadFileInfoSeq(const string& path, FileInfoSeq& infoSeq) } void +IcePatch2::getFileTree1(const FileInfoSeq& infoSeq, FileTree1& tree1) +{ + if(infoSeq.empty()) + { + tree1.files.clear(); + tree1.checksum.resize(20, 0); + } + else + { + tree1.files.reserve(infoSeq.size()); + + FileInfoSeq::const_iterator p = infoSeq.begin(); + + ByteSeq allChecksums; + allChecksums.resize(infoSeq.size() * 20); + ByteSeq::iterator q = allChecksums.begin(); + + while(p < infoSeq.end()) + { + tree1.files.push_back(*p); + + assert(p->checksum.size() == 20); + copy(p->checksum.begin(), p->checksum.end(), q); + + ++p; + q += 20; + } + + sort(tree1.files.begin(), tree1.files.end(), FileInfoCompare()); + + tree1.checksum.resize(20); + SHA1(reinterpret_cast<unsigned char*>(&allChecksums[0]), allChecksums.size(), + reinterpret_cast<unsigned char*>(&tree1.checksum[0])); + } +} + +void IcePatch2::getFileTree0(const FileInfoSeq& infoSeq, FileTree0& tree0) { tree0.nodes.resize(256); @@ -751,77 +788,6 @@ IcePatch2::getFileTree0(const FileInfoSeq& infoSeq, FileTree0& tree0) reinterpret_cast<unsigned char*>(&tree0.checksum[0])); } -void -IcePatch2::getFileTree1(const FileInfoSeq& infoSeq, FileTree1& tree1) -{ - tree1.nodes.resize(256); - - ByteSeq allChecksums; - allChecksums.resize(256 * 20); - ByteSeq::iterator q = allChecksums.begin(); - - for(int i = 0; i < 256; ++i) - { - FileInfoSeq infoSeq2; - - for(FileInfoSeq::const_iterator p = infoSeq.begin(); p != infoSeq.end(); ++p) - { - if(i == static_cast<int>(p->checksum[20 - 1])) - { - infoSeq2.push_back(*p); - } - } - - getFileTree2(infoSeq2, tree1.nodes[i]); - - assert(tree1.nodes[i].checksum.size() == 20); - copy(tree1.nodes[i].checksum.begin(), tree1.nodes[i].checksum.end(), q); - - q += 20; - } - - tree1.checksum.resize(20); - SHA1(reinterpret_cast<unsigned char*>(&allChecksums[0]), allChecksums.size(), - reinterpret_cast<unsigned char*>(&tree1.checksum[0])); -} - -void -IcePatch2::getFileTree2(const FileInfoSeq& infoSeq, FileTree2& tree2) -{ - if(infoSeq.empty()) - { - tree2.files.clear(); - tree2.checksum.resize(20, 0); - } - else - { - tree2.files.reserve(infoSeq.size()); - - FileInfoSeq::const_iterator p = infoSeq.begin(); - - ByteSeq allChecksums; - allChecksums.resize(infoSeq.size() * 20); - ByteSeq::iterator q = allChecksums.begin(); - - while(p < infoSeq.end()) - { - tree2.files.push_back(*p); - - assert(p->checksum.size() == 20); - copy(p->checksum.begin(), p->checksum.end(), q); - - ++p; - q += 20; - } - - sort(tree2.files.begin(), tree2.files.end(), FileInfoCompare()); - - tree2.checksum.resize(20); - SHA1(reinterpret_cast<unsigned char*>(&allChecksums[0]), allChecksums.size(), - reinterpret_cast<unsigned char*>(&tree2.checksum[0])); - } -} - ostream& IcePatch2::operator<<(ostream& os, const FileInfo& info) { |