Index: src/libchcore/TTaskStatsSnapshot.cpp =================================================================== diff -u -N -r12a1725bfd04b0f55fd0fda302975fdcd4174943 -ra5f396da5ed5ffb3fcd9fdf22afb5a7fd07e1ab8 --- src/libchcore/TTaskStatsSnapshot.cpp (.../TTaskStatsSnapshot.cpp) (revision 12a1725bfd04b0f55fd0fda302975fdcd4174943) +++ src/libchcore/TTaskStatsSnapshot.cpp (.../TTaskStatsSnapshot.cpp) (revision a5f396da5ed5ffb3fcd9fdf22afb5a7fd07e1ab8) @@ -22,51 +22,192 @@ // ============================================================================ #include "stdafx.h" #include "TTaskStatsSnapshot.h" +#include "MathFunctions.h" BEGIN_CHCORE_NAMESPACE //////////////////////////////////////////////////////////////////////////////// // TTaskStatsSnapshot members TTaskStatsSnapshot::TTaskStatsSnapshot() : - m_tCurrentSubTaskStats(), + m_tSubTasksStats(), m_bTaskIsRunning(false), - m_eCurrentSubOperationType(eSubOperation_None), - m_timeElapsed(0), - m_dTaskProgress(0.0) + m_ullTimeElapsed(0), + m_iThreadPriority(0), + m_strDestinationPath(), + m_filters(), + m_eTaskState(eTaskState_None), + m_strTaskID(), + m_eOperationType(eOperation_None), + m_bIgnoreDirectories(false), + m_bCreateEmptyFiles(false), + m_ullCurrentBufferSize(0), + m_stSessionUniqueID(0), + m_bCacheFilled(false), + m_ullProcessedCount(0), + m_ullTotalCount(0), + m_ullProcessedSize(0), + m_ullTotalSize(0), + m_dTaskCountSpeed(0.0), + m_dTaskSizeSpeed(0.0), + m_dCombinedProgress(0.0) { } -TTaskStatsSnapshot::TTaskStatsSnapshot(const TTaskStatsSnapshot& rSrc) : - m_tCurrentSubTaskStats(rSrc.m_tCurrentSubTaskStats), - m_bTaskIsRunning(rSrc.m_bTaskIsRunning), - m_eCurrentSubOperationType(rSrc.m_eCurrentSubOperationType), - m_timeElapsed(rSrc.m_timeElapsed), - m_dTaskProgress(rSrc.m_dTaskProgress) +void TTaskStatsSnapshot::Clear() { + m_tSubTasksStats.Clear(); + m_bTaskIsRunning = false; + m_ullTimeElapsed = 0; + m_iThreadPriority = 0; + m_strDestinationPath.Clear(); + m_filters.Clear(); + m_eTaskState = eTaskState_None; + m_strTaskID.Clear(); + m_eOperationType = eOperation_None; + m_bIgnoreDirectories = false; + m_bCreateEmptyFiles = false; + m_ullCurrentBufferSize = 0; + m_stSessionUniqueID = 0; + m_bCacheFilled = false; + m_ullProcessedCount = 0; + m_ullTotalCount = 0; + m_ullProcessedSize = 0; + m_ullTotalSize = 0; + m_dTaskCountSpeed = 0.0; + m_dTaskSizeSpeed = 0.0; + m_dCombinedProgress = 0.0; } -TTaskStatsSnapshot& TTaskStatsSnapshot::operator=(const TTaskStatsSnapshot& rSrc) +void TTaskStatsSnapshot::CalculateProgressAndSpeeds() const { - if(this != &rSrc) + m_bCacheFilled = false; + m_ullProcessedCount = 0; + m_ullTotalCount = 0; + m_ullProcessedSize = 0; + m_ullTotalSize = 0; + m_dTaskCountSpeed = 0.0; + m_dTaskSizeSpeed = 0.0; + m_dCombinedProgress = 0.0; + + size_t stCount = m_tSubTasksStats.GetSubTaskSnapshotCount(); + for(size_t stIndex = 0; stIndex < stCount; ++stIndex) { - m_tCurrentSubTaskStats = rSrc.m_tCurrentSubTaskStats; - m_bTaskIsRunning = rSrc.m_bTaskIsRunning; - m_eCurrentSubOperationType = rSrc.m_eCurrentSubOperationType; - m_timeElapsed = rSrc.m_timeElapsed; - m_dTaskProgress = rSrc.m_dTaskProgress; + TSubTaskStatsSnapshotPtr spSubtaskStats = m_tSubTasksStats.GetSubTaskSnapshotAt(stIndex); + + m_ullProcessedCount += spSubtaskStats->GetProcessedCount(); + m_ullTotalCount += spSubtaskStats->GetTotalCount(); + + m_ullProcessedSize += spSubtaskStats->GetProcessedSize(); + m_ullTotalSize += spSubtaskStats->GetTotalSize(); + + m_dTaskCountSpeed += spSubtaskStats->GetCountSpeed(); + m_dTaskSizeSpeed += spSubtaskStats->GetSizeSpeed(); } - return *this; + // we're treating each of the items as 512B object to process + // to have some balance between items' count and items' size in + // progress information + unsigned long long ullProcessed = 512ULL * m_ullProcessedCount + m_ullProcessedSize; + unsigned long long ullTotal = 512ULL * m_ullTotalCount + m_ullTotalSize; + + if(ullTotal != 0) + m_dCombinedProgress = Math::Div64(ullProcessed, ullTotal); + + m_bCacheFilled = true; } -void TTaskStatsSnapshot::Clear() +unsigned long long TTaskStatsSnapshot::GetProcessedCount() const { - m_tCurrentSubTaskStats.Clear(); - m_bTaskIsRunning = false; - m_eCurrentSubOperationType = eSubOperation_None; - m_timeElapsed = 0; - m_dTaskProgress = 0.0; + if(!m_bCacheFilled) + CalculateProgressAndSpeeds(); + + return m_ullProcessedCount; } +unsigned long long TTaskStatsSnapshot::GetTotalCount() const +{ + if(!m_bCacheFilled) + CalculateProgressAndSpeeds(); + + return m_ullTotalCount; +} + +unsigned long long TTaskStatsSnapshot::GetProcessedSize() const +{ + if(!m_bCacheFilled) + CalculateProgressAndSpeeds(); + + return m_ullProcessedSize; +} + +unsigned long long TTaskStatsSnapshot::GetTotalSize() const +{ + if(!m_bCacheFilled) + CalculateProgressAndSpeeds(); + + return m_ullTotalSize; +} + +double TTaskStatsSnapshot::GetCountSpeed() const +{ + if(!m_bCacheFilled) + CalculateProgressAndSpeeds(); + + return m_dTaskCountSpeed; +} + +double TTaskStatsSnapshot::GetSizeSpeed() const +{ + if(!m_bCacheFilled) + CalculateProgressAndSpeeds(); + + return m_dTaskSizeSpeed; +} + +double TTaskStatsSnapshot::GetCombinedProgress() const +{ + if(!m_bCacheFilled) + CalculateProgressAndSpeeds(); + + return m_dCombinedProgress; +} + +double TTaskStatsSnapshot::GetAvgCountSpeed() const +{ + if(!m_bCacheFilled) + CalculateProgressAndSpeeds(); + + if(m_ullTimeElapsed) + return Math::Div64(m_ullProcessedCount, m_ullTimeElapsed / 1000); + else + return 0.0; +} + +double TTaskStatsSnapshot::GetAvgSizeSpeed() const +{ + if(!m_bCacheFilled) + CalculateProgressAndSpeeds(); + + if(m_ullTimeElapsed) + return Math::Div64(m_ullProcessedSize, m_ullTimeElapsed / 1000); + else + return 0.0; +} + +unsigned long long TTaskStatsSnapshot::GetEstimatedTotalTime() const +{ + if(!m_bCacheFilled) + CalculateProgressAndSpeeds(); + + double dProgress = 0.0; + if(m_ullTotalSize != 0) + dProgress = Math::Div64(m_ullProcessedSize, m_ullTotalSize); + + if(dProgress == 0.0) + return std::numeric_limits::max(); + else + return (unsigned long long)(m_ullTimeElapsed * (1.0 / dProgress)); +} + END_CHCORE_NAMESPACE