aboutsummaryrefslogtreecommitdiffstats
path: root/src/encoderUUE.cpp
diff options
context:
space:
mode:
authorVincent Richard <[email protected]>2005-09-03 12:48:59 +0000
committerVincent Richard <[email protected]>2005-09-03 12:48:59 +0000
commitf777b659b9bd43f90c3f8b224ad296e42d89a02b (patch)
tree20f08abf13d3f2cb3ff1bfaa83348d1f69cc20d9 /src/encoderUUE.cpp
parentUpdated code to use smart pointers. (diff)
downloadvmime-f777b659b9bd43f90c3f8b224ad296e42d89a02b.tar.gz
vmime-f777b659b9bd43f90c3f8b224ad296e42d89a02b.zip
Added progression notifications.
Diffstat (limited to 'src/encoderUUE.cpp')
-rw-r--r--src/encoderUUE.cpp38
1 files changed, 36 insertions, 2 deletions
diff --git a/src/encoderUUE.cpp b/src/encoderUUE.cpp
index 3e0ebea7..1312075f 100644
--- a/src/encoderUUE.cpp
+++ b/src/encoderUUE.cpp
@@ -59,7 +59,8 @@ static inline const unsigned char UUDECODE(const unsigned char c)
}
-const utility::stream::size_type encoderUUE::encode(utility::inputStream& in, utility::outputStream& out)
+const utility::stream::size_type encoderUUE::encode(utility::inputStream& in,
+ utility::outputStream& out, utility::progressionListener* progress)
{
in.reset(); // may not work...
@@ -71,6 +72,7 @@ const utility::stream::size_type encoderUUE::encode(utility::inputStream& in, ut
static_cast <string::size_type>(46));
utility::stream::size_type total = 0;
+ utility::stream::size_type inTotal = 0;
// Output the prelude text ("begin [mode] [filename]")
out << "begin";
@@ -88,6 +90,9 @@ const utility::stream::size_type encoderUUE::encode(utility::inputStream& in, ut
utility::stream::value_type inBuffer[64];
utility::stream::value_type outBuffer[64];
+ if (progress)
+ progress->start(0);
+
while (!in.eof())
{
// Process up to 45 characters per line
@@ -117,16 +122,24 @@ const utility::stream::size_type encoderUUE::encode(utility::inputStream& in, ut
out.write(outBuffer, j + 2);
total += j + 2;
+ inTotal += inLength;
+
+ if (progress)
+ progress->progress(inTotal, inTotal);
}
out << "end\r\n";
total += 5;
+ if (progress)
+ progress->stop(inTotal);
+
return (total);
}
-const utility::stream::size_type encoderUUE::decode(utility::inputStream& in, utility::outputStream& out)
+const utility::stream::size_type encoderUUE::decode(utility::inputStream& in,
+ utility::outputStream& out, utility::progressionListener* progress)
{
in.reset(); // may not work...
@@ -135,11 +148,15 @@ const utility::stream::size_type encoderUUE::decode(utility::inputStream& in, ut
utility::stream::value_type outBuffer[64];
utility::stream::size_type total = 0;
+ utility::stream::size_type inTotal = 0;
bool stop = false;
std::fill(inBuffer, inBuffer + sizeof(inBuffer), 0);
+ if (progress)
+ progress->start(0);
+
while (!stop && !in.eof())
{
// Get the line length
@@ -175,6 +192,8 @@ const utility::stream::size_type encoderUUE::decode(utility::inputStream& in, ut
inBuffer[3] == 'n' &&
parserHelpers::isSpace(inBuffer[4]))
{
+ inTotal += 5;
+
utility::stream::value_type c = 0;
utility::stream::size_type count = 0;
@@ -188,9 +207,15 @@ const utility::stream::size_type encoderUUE::decode(utility::inputStream& in, ut
buffer[count++] = c;
}
+ inTotal += count;
+
if (c != '\n')
{
// OOPS! Weird line. Don't try to decode more...
+
+ if (progress)
+ progress->stop(inTotal);
+
return (total);
}
@@ -240,6 +265,7 @@ const utility::stream::size_type encoderUUE::decode(utility::inputStream& in, ut
(inBuffer[2] == '\r' || inBuffer[2] == '\n'))
{
stop = true;
+ inTotal += 3;
continue;
}
@@ -255,6 +281,8 @@ const utility::stream::size_type encoderUUE::decode(utility::inputStream& in, ut
break;
}
+ inTotal += (inLength - inPos);
+
// Decode data
for (utility::stream::size_type i = 0, j = 0 ; i < inLength ; i += 4, j += 3)
{
@@ -281,8 +309,14 @@ const utility::stream::size_type encoderUUE::decode(utility::inputStream& in, ut
out.write(outBuffer, outLength);
std::fill(inBuffer, inBuffer + sizeof(inBuffer), 0);
+
+ if (progress)
+ progress->progress(inTotal, inTotal);
}
+ if (progress)
+ progress->stop(inTotal);
+
return (total);
}