ProgressData.cc
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00012 #include <iostream>
00013 #include "zypp/base/Logger.h"
00014 #include "zypp/base/InputStream.h"
00015 #include "zypp/base/String.h"
00016
00017 #include "zypp/ProgressData.h"
00018
00019 using std::endl;
00020
00021 #undef ZYPP_BASE_LOGGER_LOGGROUP
00022 #define ZYPP_BASE_LOGGER_LOGGROUP "Progress"
00023
00025 namespace zypp
00026 {
00027
00029
00030
00031
00032
00033 bool ProgressData::report()
00034 {
00035 bool goOn = true;
00036 bool doReport = false;
00037
00038
00039 if ( hasRange() )
00040 {
00041 value_type newVal = _d->_val * 100;
00042 newVal /= ( _d->_max - _d->_min );
00043
00044 if ( newVal - _d->_last_val > 20
00045 || Date::now() - _d->_last_send > 1
00046 || ( newVal == 100 && _d->_last_send != 100 )
00047 || _d->_state == END )
00048 {
00049 _d->_last_val = newVal;
00050 _d->_last_send = Date::now();
00051 doReport = true;
00052 }
00053 }
00054 else
00055 {
00056 if ( Date::now() - _d->_last_send > 1 || _d->_state == END )
00057 {
00058 _d->_last_val = _d->_val;
00059 _d->_last_send = Date::now();
00060 doReport = true;
00061 }
00062 }
00063
00064
00065 if ( doReport )
00066 {
00067 if ( _d->_state == INIT )
00068 {
00069 _d->_state = RUN;
00070 }
00071
00072 if ( _d->_receiver )
00073 {
00074 goOn = _d->_receiver( *this );
00075 }
00076 else
00077 {
00078 if ( _d->_state != END )
00079 {
00080 XXX << str::form( "{#%u|%s}(%lld%s)",
00081 numericId(), name().c_str(),
00082 _d->_last_val, ( hasRange() ? "%" : "!" ) ) << endl;
00083 }
00084 else
00085 {
00086 DBG << str::form( "{#%u|%s}END", numericId(), name().c_str() ) << endl;
00087 }
00088 }
00089 }
00090
00091
00092 if ( ! goOn && _d->_state != END )
00093 {
00094 WAR << "User request to ABORT pending action. "
00095 << str::form( "{#%u|%s}(%lld%s)",
00096 numericId(), name().c_str(),
00097 _d->_last_val, ( hasRange() ? "%" : "!" ) ) << endl;
00098 }
00099 return goOn;
00100 }
00101
00102
00103
00104
00105
00106
00107 std::ostream & operator<<( std::ostream & str, const ProgressData & obj )
00108 {
00109 if ( obj.hasRange() )
00110 {
00111 return str << str::form( "{%u|%s}[%lld,%lld](%lld)%lld%%)",
00112 obj.numericId(), obj.name().c_str(),
00113 obj.min(), obj.max(), obj.val(), obj.reportValue() );
00114 }
00115 return str << str::form( "{%u|%s}[-,-](%lld)",
00116 obj.numericId(), obj.name().c_str(),
00117 obj.val() );
00118 }
00119
00120
00121
00122
00123
00124
00125 ProgressData makeProgressData( const InputStream & input_r )
00126 {
00127 ProgressData ret;
00128 ret.name( input_r.name() );
00129 if ( input_r.size() > 0 )
00130 ret.range( input_r.size() );
00131 return ret;
00132 }
00133
00134 CombinedProgressData::CombinedProgressData( ProgressData &pd,
00135 ProgressData::value_type weight )
00136 : _weight(weight),
00137 _last_value(0),
00138 _pd(pd)
00139 {
00140
00141 }
00142
00143 bool CombinedProgressData::operator()( const ProgressData &progress )
00144 {
00145 if ( progress.reportAlive() || ( _weight == 0 ) )
00146 return _pd.tick();
00147
00148
00149 float increment = ((float)(progress.val() - _last_value))/(progress.max() - progress.min());
00150
00151 float parent_factor = (float)(_weight)/(_pd.max() - _pd.min());
00152
00153 float real_increment = parent_factor*increment;
00154 _last_value = progress.val();
00155 return _pd.incr( (int)( (_pd.max()-_pd.min()) * real_increment) );
00156 }
00157
00159 }