summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/IcePatch2/Client.cpp72
-rw-r--r--cpp/src/IcePatch2/FileServerI.cpp46
-rw-r--r--cpp/src/IcePatch2/FileServerI.h8
-rw-r--r--cpp/src/IcePatch2/Util.cpp108
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)
{