aboutsummaryrefslogtreecommitdiffstats
path: root/src/encoderQP.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/encoderQP.cpp
parentUpdated code to use smart pointers. (diff)
downloadvmime-f777b659b9bd43f90c3f8b224ad296e42d89a02b.tar.gz
vmime-f777b659b9bd43f90c3f8b224ad296e42d89a02b.zip
Added progression notifications.
Diffstat (limited to 'src/encoderQP.cpp')
-rw-r--r--src/encoderQP.cpp34
1 files changed, 32 insertions, 2 deletions
diff --git a/src/encoderQP.cpp b/src/encoderQP.cpp
index a021a051..edaf4a4a 100644
--- a/src/encoderQP.cpp
+++ b/src/encoderQP.cpp
@@ -85,7 +85,8 @@ const unsigned char encoderQP::sm_hexDecodeTable[256] =
#endif // VMIME_BUILDING_DOC
-const utility::stream::size_type encoderQP::encode(utility::inputStream& in, utility::outputStream& out)
+const utility::stream::size_type encoderQP::encode(utility::inputStream& in,
+ utility::outputStream& out, utility::progressionListener* progress)
{
in.reset(); // may not work...
@@ -109,6 +110,10 @@ const utility::stream::size_type encoderQP::encode(utility::inputStream& in, uti
int outBufferPos = 0;
utility::stream::size_type total = 0;
+ utility::stream::size_type inTotal = 0;
+
+ if (progress)
+ progress->start(0);
while (bufferPos < bufferLength || !in.eof())
{
@@ -267,6 +272,11 @@ const utility::stream::size_type encoderQP::encode(utility::inputStream& in, uti
outBufferPos += 3;
curCol = 0;
}
+
+ ++inTotal;
+
+ if (progress)
+ progress->progress(inTotal, inTotal);
}
// Flush remaining output buffer
@@ -276,11 +286,15 @@ const utility::stream::size_type encoderQP::encode(utility::inputStream& in, uti
total += outBufferPos;
}
+ if (progress)
+ progress->stop(inTotal);
+
return (total);
}
-const utility::stream::size_type encoderQP::decode(utility::inputStream& in, utility::outputStream& out)
+const utility::stream::size_type encoderQP::decode(utility::inputStream& in,
+ utility::outputStream& out, utility::progressionListener* progress)
{
in.reset(); // may not work...
@@ -295,6 +309,7 @@ const utility::stream::size_type encoderQP::decode(utility::inputStream& in, uti
int outBufferPos = 0;
utility::stream::size_type total = 0;
+ utility::stream::size_type inTotal = 0;
while (bufferPos < bufferLength || !in.eof())
{
@@ -321,6 +336,8 @@ const utility::stream::size_type encoderQP::decode(utility::inputStream& in, uti
// Decode the next sequence (hex-encoded byte or printable character)
unsigned char c = static_cast <unsigned char>(buffer[bufferPos++]);
+ ++inTotal;
+
switch (c)
{
case '=':
@@ -335,6 +352,8 @@ const utility::stream::size_type encoderQP::decode(utility::inputStream& in, uti
{
c = static_cast <unsigned char>(buffer[bufferPos++]);
+ ++inTotal;
+
switch (c)
{
// Ignore soft line break ("=\r\n" or "=\n")
@@ -348,7 +367,10 @@ const utility::stream::size_type encoderQP::decode(utility::inputStream& in, uti
}
if (bufferPos < bufferLength)
+ {
++bufferPos;
+ ++inTotal;
+ }
break;
@@ -370,6 +392,8 @@ const utility::stream::size_type encoderQP::decode(utility::inputStream& in, uti
{
const unsigned char next = static_cast <unsigned char>(buffer[bufferPos++]);
+ ++inTotal;
+
const unsigned char value =
sm_hexDecodeTable[c] * 16
+ sm_hexDecodeTable[next];
@@ -412,6 +436,9 @@ const utility::stream::size_type encoderQP::decode(utility::inputStream& in, uti
}
}
+
+ if (progress)
+ progress->progress(inTotal, inTotal);
}
// Flush remaining output buffer
@@ -421,6 +448,9 @@ const utility::stream::size_type encoderQP::decode(utility::inputStream& in, uti
total += outBufferPos;
}
+ if (progress)
+ progress->stop(inTotal);
+
return (total);
}