Index: src/libchcore/TSubTaskStatsSnapshot.cpp
===================================================================
diff -u -r12a1725bfd04b0f55fd0fda302975fdcd4174943 -r9b8cccbee0fcfeca28a112cc0253a7641f73f74f
--- src/libchcore/TSubTaskStatsSnapshot.cpp	(.../TSubTaskStatsSnapshot.cpp)	(revision 12a1725bfd04b0f55fd0fda302975fdcd4174943)
+++ src/libchcore/TSubTaskStatsSnapshot.cpp	(.../TSubTaskStatsSnapshot.cpp)	(revision 9b8cccbee0fcfeca28a112cc0253a7641f73f74f)
@@ -23,6 +23,8 @@
 #include "stdafx.h"
 #include "TSubTaskStatsSnapshot.h"
 #include "DataBuffer.h"
+#include <boost/numeric/conversion/cast.hpp>
+#include "MathFunctions.h"
 
 BEGIN_CHCORE_NAMESPACE
 
@@ -36,7 +38,11 @@
 	m_stProcessedCount(0),
 	m_iCurrentBufferIndex(TBufferSizes::eBuffer_Default),
 	m_strCurrentPath(0),
-	m_timeElapsed(0)
+	m_timeElapsed(0),
+	m_dSizeSpeed(0),
+	m_dCountSpeed(0),
+	m_ullCurrentItemProcessedSize(0),
+	m_ullCurrentItemTotalSize(0)
 {
 }
 
@@ -48,9 +54,12 @@
 	m_stProcessedCount(rSrc.m_stProcessedCount),
 	m_iCurrentBufferIndex(rSrc.m_iCurrentBufferIndex),
 	m_strCurrentPath(rSrc.m_strCurrentPath),
-	m_timeElapsed(rSrc.m_timeElapsed)
+	m_timeElapsed(rSrc.m_timeElapsed),
+	m_dSizeSpeed(rSrc.m_dSizeSpeed),
+	m_dCountSpeed(rSrc.m_dCountSpeed),
+	m_ullCurrentItemProcessedSize(rSrc.m_ullCurrentItemProcessedSize),
+	m_ullCurrentItemTotalSize(rSrc.m_ullCurrentItemTotalSize)
 {
-
 }
 
 TSubTaskStatsSnapshot& TSubTaskStatsSnapshot::operator=(const TSubTaskStatsSnapshot& rSrc)
@@ -63,6 +72,10 @@
 	m_iCurrentBufferIndex = rSrc.m_iCurrentBufferIndex;
 	m_strCurrentPath = rSrc.m_strCurrentPath;
 	m_timeElapsed = rSrc.m_timeElapsed;
+	m_dSizeSpeed = rSrc.m_dSizeSpeed;
+	m_dCountSpeed = rSrc.m_dCountSpeed;
+	m_ullCurrentItemProcessedSize = rSrc.m_ullCurrentItemProcessedSize;
+	m_ullCurrentItemTotalSize = rSrc.m_ullCurrentItemTotalSize;
 
 	return *this;
 }
@@ -77,6 +90,53 @@
 	m_iCurrentBufferIndex = TBufferSizes::eBuffer_Default;
 	m_strCurrentPath = 0;
 	m_timeElapsed = 0;
+	m_dSizeSpeed = 0;
+	m_dCountSpeed = 0;
+	m_ullCurrentItemProcessedSize = 0;
+	m_ullCurrentItemTotalSize = 0;
 }
 
+double TSubTaskStatsSnapshot::CalculateProgressInPercent() const
+{
+	if(m_ullTotalSize != 0)
+		return Math::Div64(m_ullProcessedSize, m_ullTotalSize);
+	else
+		return 0.0;
+}
+
+unsigned long long TSubTaskStatsSnapshot::GetEstimatedTotalTime() const
+{
+	double dProgress = CalculateProgressInPercent();
+	if(dProgress == 0.0)
+		return std::numeric_limits<unsigned long long>::max();
+	else
+		return (unsigned long long)(m_timeElapsed * (1.0 / dProgress));
+}
+
+void TSubTaskStatsSnapshot::SetSizeSpeed(double dSizeSpeed)
+{
+	m_dSizeSpeed = dSizeSpeed;
+}
+
+void TSubTaskStatsSnapshot::SetCountSpeed(double dCountSpeed)
+{
+	m_dCountSpeed = dCountSpeed;
+}
+
+double TSubTaskStatsSnapshot::GetAvgSizeSpeed() const
+{
+	if(m_timeElapsed)
+		return Math::Div64(m_ullProcessedSize, m_timeElapsed / 1000);
+	else
+		return 0.0;
+}
+
+double TSubTaskStatsSnapshot::GetAvgCountSpeed() const
+{
+	if(m_timeElapsed)
+		return Math::Div64(m_stProcessedCount, m_timeElapsed / 1000);
+	else
+		return 0.0;
+}
+
 END_CHCORE_NAMESPACE