Ticket #363: time.patch

File time.patch, 30.0 kB (added by Didactylos, 1 year ago)

Patch for custom times bugs. (With a couple of corrections.)

  • client/cs_prefs.C

    old new  
    130130        if (!global_prefs.run_if_user_active && user_active) { 
    131131            return SUSPEND_REASON_USER_ACTIVE; 
    132132        } 
    133         if (global_prefs.suspended_time_of_day(PREFS_CPU)) { 
     133        if (global_prefs.cpu_times.suspended()) { 
    134134            return SUSPEND_REASON_TIME_OF_DAY; 
    135135        } 
    136136    } 
     
    223223    if (!global_prefs.run_if_user_active && user_active) { 
    224224        return SUSPEND_REASON_USER_ACTIVE; 
    225225    } 
    226     if (global_prefs.suspended_time_of_day(PREFS_NETWORK)) { 
     226    if (global_prefs.net_times.suspended()) { 
    227227        return SUSPEND_REASON_TIME_OF_DAY; 
    228228    } 
    229229    return 0; 
  • clientgui/DlgAdvPreferences.cpp

    old new  
    197197 
    198198        // ######### proc usage page 
    199199        // do work between 
    200         *m_txtProcEveryDayStart << DoubleToTimeString(prefs.time_prefs.start_hour);    
    201         *m_txtProcEveryDayStop << DoubleToTimeString(prefs.time_prefs.end_hour); 
     200        *m_txtProcEveryDayStart << DoubleToTimeString(prefs.cpu_times.start_hour);     
     201        *m_txtProcEveryDayStop << DoubleToTimeString(prefs.cpu_times.end_hour); 
    202202        //special day times 
    203203        wxCheckBox* aChks[] = {m_chkProcSunday,m_chkProcMonday,m_chkProcTuesday,m_chkProcWednesday,m_chkProcThursday,m_chkProcFriday,m_chkProcSaturday}; 
    204204        wxTextCtrl* aTxts[] = {m_txtProcSunday,m_txtProcMonday,m_txtProcTuesday,m_txtProcWednesday,m_txtProcThursday,m_txtProcFriday,m_txtProcSaturday}; 
    205205        for(int i=0; i< 7;i++) { 
    206                 if(prefs.week_prefs.days[i].present &&  
    207                        prefs.week_prefs.days[i].time_prefs.start_hour != prefs.week_prefs.days[i].time_prefs.end_hour) { 
    208                         aChks[prefs.week_prefs.days[i].day_of_week]->SetValue(true); 
    209                         wxString timeStr = DoubleToTimeString(prefs.week_prefs.days[i].time_prefs.start_hour) + 
    210                                                                 wxT("-") + DoubleToTimeString(prefs.week_prefs.days[i].time_prefs.end_hour); 
     206        TIME_SPAN* cpu = prefs.cpu_times.week.get(i); 
     207                if(cpu) { 
     208                        aChks[i]->SetValue(true); 
     209                        wxString timeStr = DoubleToTimeString(cpu->start_hour) + 
     210                                                                wxT("-") + DoubleToTimeString(cpu->end_hour); 
    211211                        aTxts[i]->SetValue(timeStr); 
    212212                } 
    213213        } 
     
    231231 
    232232        // ######### net usage page 
    233233        // use network between 
    234         *m_txtNetEveryDayStart << DoubleToTimeString(prefs.time_prefs.net_start_hour); 
    235         *m_txtNetEveryDayStop << DoubleToTimeString(prefs.time_prefs.net_end_hour); 
     234        *m_txtNetEveryDayStart << DoubleToTimeString(prefs.net_times.start_hour); 
     235        *m_txtNetEveryDayStop << DoubleToTimeString(prefs.net_times.end_hour); 
    236236        //special day times 
    237237        wxCheckBox* aChks2[] = {m_chkNetSunday,m_chkNetMonday,m_chkNetTuesday,m_chkNetWednesday,m_chkNetThursday,m_chkNetFriday,m_chkNetSaturday}; 
    238238        wxTextCtrl* aTxts2[] = {m_txtNetSunday,m_txtNetMonday,m_txtNetTuesday,m_txtNetWednesday,m_txtNetThursday,m_txtNetFriday,m_txtNetSaturday}; 
    239239        for(int i=0; i< 7;i++) { 
    240                 if(prefs.week_prefs.days[i].present && 
    241                        prefs.week_prefs.days[i].time_prefs.net_start_hour != prefs.week_prefs.days[i].time_prefs.net_end_hour) { 
    242                         aChks2[prefs.week_prefs.days[i].day_of_week]->SetValue(true); 
    243                         wxString timeStr = DoubleToTimeString(prefs.week_prefs.days[i].time_prefs.net_start_hour) + 
    244                                                                 wxT("-") + DoubleToTimeString(prefs.week_prefs.days[i].time_prefs.net_end_hour); 
     240        TIME_SPAN* net = prefs.net_times.week.get(i); 
     241                if(net) { 
     242                        aChks2[i]->SetValue(true); 
     243                        wxString timeStr = DoubleToTimeString(net->start_hour) + 
     244                                                                wxT("-") + DoubleToTimeString(net->end_hour); 
    245245                        aTxts2[i]->SetValue(timeStr); 
    246246                } 
    247247        } 
     
    300300 
    301301        mask.clear(); 
    302302        //clear special times settings 
    303         prefs.week_prefs.present=false; 
    304         for(int i=0; i< 7;i++) { 
    305                 prefs.week_prefs.days[i].present=false; 
    306                 prefs.week_prefs.days[i].time_prefs.clear(); 
    307         } 
     303    prefs.cpu_times.week.clear(); 
     304    prefs.net_times.week.clear(); 
    308305        //proc page 
    309306        prefs.run_on_batteries=m_chkProcOnBatteries->GetValue(); 
    310307        mask.run_on_batteries=true; 
     
    318315                mask.idle_time_to_run=true; 
    319316        } 
    320317        // 
    321         prefs.time_prefs.start_hour=TimeStringToDouble(m_txtProcEveryDayStart->GetValue()); 
     318        prefs.cpu_times.start_hour=TimeStringToDouble(m_txtProcEveryDayStart->GetValue()); 
    322319        mask.start_hour = true;         
    323320        // 
    324         prefs.time_prefs.end_hour=TimeStringToDouble(m_txtProcEveryDayStop->GetValue()); 
     321        prefs.cpu_times.end_hour=TimeStringToDouble(m_txtProcEveryDayStop->GetValue()); 
    325322        mask.end_hour = true;         
    326323        // 
    327324        wxCheckBox* aChks[] = {m_chkProcSunday,m_chkProcMonday,m_chkProcTuesday,m_chkProcWednesday,m_chkProcThursday,m_chkProcFriday,m_chkProcSaturday}; 
    328325        wxTextCtrl* aTxts[] = {m_txtProcSunday,m_txtProcMonday,m_txtProcTuesday,m_txtProcWednesday,m_txtProcThursday,m_txtProcFriday,m_txtProcSaturday}; 
    329326        for(int i=0; i< 7;i++) { 
    330327                if(aChks[i]->GetValue()) { 
    331                         prefs.week_prefs.present=true; 
    332                         prefs.week_prefs.days[i].day_of_week =i; 
    333                         prefs.week_prefs.days[i].present =true; 
    334328                        wxString timeStr = aTxts[i]->GetValue(); 
    335329                        wxString startStr = timeStr.SubString(0,timeStr.First('-')); 
    336330                        wxString endStr = timeStr.SubString(timeStr.First('-')+1,timeStr.Length()); 
    337                         prefs.week_prefs.days[i].time_prefs.start_hour = TimeStringToDouble(startStr); 
    338                         prefs.week_prefs.days[i].time_prefs.end_hour = TimeStringToDouble(endStr); 
     331            prefs.cpu_times.week.set(i, 
     332                            TimeStringToDouble(startStr), 
     333                            TimeStringToDouble(endStr) 
     334                ); 
    339335                } 
    340336        } 
    341337        m_txtProcSwitchEvery->GetValue().ToDouble(&td); 
     
    377373        prefs.work_buf_additional_days = td; 
    378374        mask.work_buf_additional_days = true; 
    379375        // 
    380         prefs.time_prefs.net_start_hour=TimeStringToDouble(m_txtNetEveryDayStart->GetValue()); 
     376        prefs.net_times.start_hour=TimeStringToDouble(m_txtNetEveryDayStart->GetValue()); 
    381377        mask.net_start_hour = true;         
    382378        // 
    383         prefs.time_prefs.net_end_hour=TimeStringToDouble(m_txtNetEveryDayStop->GetValue()); 
     379        prefs.net_times.end_hour=TimeStringToDouble(m_txtNetEveryDayStop->GetValue()); 
    384380        mask.net_end_hour = true;         
    385381                 
    386382        wxCheckBox* aChks2[] = {m_chkNetSunday,m_chkNetMonday,m_chkNetTuesday,m_chkNetWednesday,m_chkNetThursday,m_chkNetFriday,m_chkNetSaturday}; 
    387383        wxTextCtrl* aTxts2[] = {m_txtNetSunday,m_txtNetMonday,m_txtNetTuesday,m_txtNetWednesday,m_txtNetThursday,m_txtNetFriday,m_txtNetSaturday}; 
    388384        for(int i=0; i< 7;i++) { 
    389385                if(aChks2[i]->GetValue()) { 
    390                         prefs.week_prefs.present=true; 
    391                         prefs.week_prefs.days[i].day_of_week =i; 
    392                         prefs.week_prefs.days[i].present =true; 
    393386                        wxString timeStr = aTxts2[i]->GetValue(); 
    394387                        wxString startStr = timeStr.SubString(0,timeStr.First('-')); 
    395388                        wxString endStr = timeStr.SubString(timeStr.First('-')+1,timeStr.Length()); 
    396                         prefs.week_prefs.days[i].time_prefs.net_start_hour = TimeStringToDouble(startStr); 
    397                         prefs.week_prefs.days[i].time_prefs.net_end_hour = TimeStringToDouble(endStr); 
    398                 } 
     389            prefs.net_times.week.set(i, 
     390                            TimeStringToDouble(startStr), 
     391                            TimeStringToDouble(endStr) 
     392                ); 
     393        } 
    399394        } 
    400395        //disk usage 
    401396        m_txtDiskMaxSpace->GetValue().ToDouble(&td); 
     
    711706        return res==wxYES; 
    712707} 
    713708 
     709 
     710 
  • clientgui/sg_DlgPreferences.cpp

    old new  
    736736    aWorkBetweenBegin.Insert(_("Anytime"), 0); 
    737737 
    738738    m_WorkBetweenBeginCtrl->Append(aWorkBetweenBegin); 
    739     if (display_global_preferences.time_prefs.start_hour == display_global_preferences.time_prefs.end_hour) { 
     739    if (display_global_preferences.cpu_times.start_hour == display_global_preferences.cpu_times.end_hour) { 
    740740        m_strWorkBetweenBegin = _("Anytime"); 
    741741    } else { 
    742         m_strWorkBetweenBegin = astrTimeOfDayStrings[(int)display_global_preferences.time_prefs.start_hour]; 
     742        m_strWorkBetweenBegin = astrTimeOfDayStrings[(int)display_global_preferences.cpu_times.start_hour]; 
    743743    } 
    744744 
    745745    //   End: 
    746746    m_WorkBetweenEndCtrl->Append(wxArrayString(iTimeOfDayArraySize, astrTimeOfDayStrings)); 
    747     m_strWorkBetweenEnd = astrTimeOfDayStrings[(int)display_global_preferences.time_prefs.end_hour]; 
     747    m_strWorkBetweenEnd = astrTimeOfDayStrings[(int)display_global_preferences.cpu_times.end_hour]; 
    748748 
    749749    // Connect to internet only between: 
    750750    //   Start: 
     
    752752    aConnectBetweenBegin.Insert(_("Anytime"), 0); 
    753753 
    754754    m_ConnectBetweenBeginCtrl->Append(aConnectBetweenBegin); 
    755     if (display_global_preferences.time_prefs.net_start_hour == display_global_preferences.time_prefs.net_end_hour) { 
     755    if (display_global_preferences.net_times.start_hour == display_global_preferences.net_times.end_hour) { 
    756756        m_strConnectBetweenBegin = _("Anytime"); 
    757757    } else { 
    758         m_strConnectBetweenBegin = astrTimeOfDayStrings[(int)display_global_preferences.time_prefs.net_start_hour]; 
     758        m_strConnectBetweenBegin = astrTimeOfDayStrings[(int)display_global_preferences.net_times.start_hour]; 
    759759    } 
    760760 
    761761    //   End: 
    762762    m_ConnectBetweenEndCtrl->Append(wxArrayString(iTimeOfDayArraySize, astrTimeOfDayStrings)); 
    763     m_strConnectBetweenEnd = astrTimeOfDayStrings[(int)display_global_preferences.time_prefs.net_end_hour]; 
     763    m_strConnectBetweenEnd = astrTimeOfDayStrings[(int)display_global_preferences.net_times.end_hour]; 
    764764 
    765765    // Use no more than %s of disk space 
    766766    wxArrayString aDiskUsage = wxArrayString(iDiskUsageArraySize, astrDiskUsageStrings); 
     
    912912bool CPanelPreferences::SavePreferenceSettings() { 
    913913    // Do work only between: 
    914914    if (_("Anytime") == m_strWorkBetweenBegin) { 
    915         global_preferences_override.time_prefs.start_hour = 0; 
    916         global_preferences_override.time_prefs.end_hour = 0; 
     915        global_preferences_override.cpu_times.start_hour = 0; 
     916        global_preferences_override.cpu_times.end_hour = 0; 
    917917    } else { 
    918         m_strWorkBetweenBegin.ToLong((long*)&global_preferences_override.time_prefs.start_hour); 
    919         m_strWorkBetweenEnd.ToLong((long*)&global_preferences_override.time_prefs.end_hour); 
     918        m_strWorkBetweenBegin.ToLong((long*)&global_preferences_override.cpu_times.start_hour); 
     919        m_strWorkBetweenEnd.ToLong((long*)&global_preferences_override.cpu_times.end_hour); 
    920920    } 
    921921    global_preferences_mask.start_hour = true;         
    922922    global_preferences_mask.end_hour = true; 
    923923 
    924924    // Connect to internet only between: 
    925925    if (_("Anytime") == m_strConnectBetweenBegin) { 
    926         global_preferences_override.time_prefs.net_start_hour = 0; 
    927         global_preferences_override.time_prefs.net_end_hour = 0; 
     926        global_preferences_override.net_times.start_hour = 0; 
     927        global_preferences_override.net_times.end_hour = 0; 
    928928    } else { 
    929         m_strConnectBetweenBegin.ToLong((long*)&global_preferences_override.time_prefs.net_start_hour); 
    930         m_strConnectBetweenEnd.ToLong((long*)&global_preferences_override.time_prefs.net_end_hour); 
     929        m_strConnectBetweenBegin.ToLong((long*)&global_preferences_override.net_times.start_hour); 
     930        m_strConnectBetweenEnd.ToLong((long*)&global_preferences_override.net_times.end_hour); 
    931931    } 
    932932    global_preferences_mask.net_start_hour = true;         
    933933    global_preferences_mask.net_end_hour = true;         
     
    10851085    EndModal(wxID_OK); 
    10861086} 
    10871087 
     1088 
     1089 
  • lib/prefs.C

    old new  
    4343    memset(this, 0, sizeof(GLOBAL_PREFS_MASK)); 
    4444} 
    4545 
     46void GLOBAL_PREFS_MASK::set_all() { 
     47    run_on_batteries = true; 
     48    run_if_user_active = true; 
     49    idle_time_to_run = true; 
     50    suspend_if_no_recent_input = true; 
     51    start_hour = true; 
     52    end_hour = true; 
     53    net_start_hour = true; 
     54    net_end_hour = true; 
     55    leave_apps_in_memory = true; 
     56    confirm_before_connecting = true; 
     57    hangup_if_dialed = true; 
     58    dont_verify_images = true; 
     59    work_buf_min_days = true; 
     60    work_buf_additional_days = true; 
     61    max_cpus = true; 
     62    cpu_scheduling_period_minutes = true; 
     63    disk_interval = true; 
     64    disk_max_used_gb = true; 
     65    disk_max_used_pct = true; 
     66    disk_min_free_gb = true; 
     67    vm_max_used_frac = true; 
     68        ram_max_used_busy_frac = true; 
     69        ram_max_used_idle_frac = true; 
     70    idle_time_to_run = true; 
     71    max_bytes_sec_up = true; 
     72    max_bytes_sec_down = true; 
     73    cpu_usage_limit = true; 
     74} 
     75 
    4676bool GLOBAL_PREFS_MASK::are_prefs_set() { 
    4777    if (run_on_batteries) return true; 
    4878    if (run_if_user_active) return true; 
    4979    if (idle_time_to_run) return true; 
    5080    if (suspend_if_no_recent_input) return true; 
    51     if (start_hour) return true;         // 0..23; no restriction if start==end 
     81    if (start_hour) return true; 
    5282    if (end_hour) return true; 
    53     if (net_start_hour) return true;     // 0..23; no restriction if start==end 
     83    if (net_start_hour) return true; 
    5484    if (net_end_hour) return true; 
    5585    if (leave_apps_in_memory) return true; 
    5686    if (confirm_before_connecting) return true; 
     
    87117    return false; 
    88118} 
    89119 
     120 
     121// TIME_SPAN implementation 
     122 
     123bool TIME_SPAN::suspended(double hour) const { 
     124 
     125    if (start_hour == end_hour) return false; 
     126    if (start_hour == 0 && end_hour == 24) return false; 
     127    if (start_hour == 24 && end_hour == 0) return true; 
     128    if (start_hour < end_hour) { 
     129        return (hour < start_hour || hour > end_hour); 
     130    } else { 
     131        return (hour >= end_hour && hour < start_hour); 
     132    } 
     133} 
     134 
     135 
     136TIME_SPAN::TimeMode TIME_SPAN::mode() const { 
     137 
     138    if (end_hour == start_hour || (start_hour == 0.0 && end_hour == 24.0)) { 
     139        return Always; 
     140    } else if (start_hour == 24.0 && end_hour == 0.0) { 
     141        return Never; 
     142    } 
     143    return Between; 
     144} 
     145 
     146 
     147// TIME_PREFS implementation 
     148 
    90149void TIME_PREFS::clear() { 
    91150    start_hour = 0; 
    92151    end_hour = 0; 
    93     net_start_hour = 0; 
    94     net_end_hour = 0; 
     152    week.clear(); 
    95153} 
    96154 
     155 
     156bool TIME_PREFS::suspended() const { 
     157    time_t now = time(0); 
     158    struct tm* tmp = localtime(&now); 
     159    double hour = (tmp->tm_hour * 3600 + tmp->tm_min * 60 + tmp->tm_sec) / 3600.; 
     160    int day = tmp->tm_wday; 
     161 
     162    // Use day-specific settings, if they exist: 
     163    const TIME_SPAN* span = week.get(day) ? week.get(day) : this; 
     164 
     165    return span->suspended(hour); 
     166} 
     167 
     168 
     169// WEEK_PREFS implementation 
     170 
     171WEEK_PREFS::WEEK_PREFS() { 
     172 
     173    for (int i = 0; i < 7; i++) { 
     174        days[i] = 0; 
     175    } 
     176} 
     177 
     178 
     179WEEK_PREFS::WEEK_PREFS(const WEEK_PREFS& original) { 
     180 
     181    for (int i = 0; i < 7; i++) { 
     182        TIME_SPAN* time = original.days[i]; 
     183        if (time) { 
     184            days[i] = new TIME_SPAN(time->start_hour, time->end_hour); 
     185        } else { 
     186            days[i] = 0; 
     187        } 
     188    } 
     189} 
     190 
     191 
     192WEEK_PREFS& WEEK_PREFS::operator=(const WEEK_PREFS& rhs) { 
     193 
     194    if (this != &rhs) { 
     195        for (int i = 0; i < 7; i++) { 
     196            TIME_SPAN* time = rhs.days[i]; 
     197            if (time) { 
     198                if (days[i]) { 
     199                    *days[i] = *time; 
     200                } else { 
     201                    days[i] = new TIME_SPAN(*time); 
     202                } 
     203            } else { 
     204                unset(i); 
     205            } 
     206        } 
     207    } 
     208    return *this; 
     209} 
     210 
     211 
     212// Create a deep copy. 
     213void WEEK_PREFS::copy(const WEEK_PREFS& original) { 
     214 
     215    for (int i = 0; i < 7; i++) { 
     216        TIME_SPAN* time = original.days[i]; 
     217        if (time) { 
     218            days[i] = new TIME_SPAN(time->start_hour, time->end_hour); 
     219        } else { 
     220            days[i] = 0; 
     221        } 
     222    } 
     223} 
     224 
     225 
     226WEEK_PREFS::~WEEK_PREFS() { 
     227    clear(); 
     228} 
     229 
     230 
     231void WEEK_PREFS::clear() { 
     232 
     233    for (int i = 0; i < 7; i++) { 
     234        if (days[i]) { 
     235            delete days[i]; 
     236            days[i] = 0; 
     237        } 
     238    } 
     239} 
     240 
     241 
     242TIME_SPAN* WEEK_PREFS::get(int day) const { 
     243 
     244    if (day < 0 || day > 6) return 0; 
     245    return days[day]; 
     246} 
     247 
     248 
     249void WEEK_PREFS::set(int day, double start, double end) { 
     250 
     251    if (day < 0 || day > 6) return; 
     252 
     253    if (days[day]) delete days[day]; 
     254    days[day] = new TIME_SPAN(start, end); 
     255} 
     256 
     257 
     258void WEEK_PREFS::set(int day, TIME_SPAN* time) { 
     259 
     260    if (day < 0 || day > 6) return; 
     261    if (days[day] == time) return; 
     262    if (days[day]) delete days[day]; 
     263 
     264    days[day] = time; 
     265} 
     266 
     267void WEEK_PREFS::unset(int day) { 
     268 
     269    if (day < 0 || day > 6) return; 
     270 
     271    if (days[day]) { 
     272        delete days[day]; 
     273        days[day] = 0; 
     274    } 
     275} 
     276 
    97277// The following values determine how the client behaves 
    98278// if there are no global prefs (e.g. on our very first RPC). 
    99279// These should impose minimal restrictions, 
     
    104284    run_if_user_active = true; 
    105285    idle_time_to_run = 3; 
    106286    suspend_if_no_recent_input = 0; 
    107     time_prefs.clear(); 
     287    cpu_times.clear(); 
     288    net_times.clear(); 
    108289    leave_apps_in_memory = false; 
    109290    confirm_before_connecting = true; 
    110291    hangup_if_dialed = false; 
     
    123304    max_bytes_sec_up = 0; 
    124305    max_bytes_sec_down = 0; 
    125306    cpu_usage_limit = 100; 
    126     week_prefs.present = false; 
    127     week_prefs.clear(); 
    128307    // don't initialize source_project, source_scheduler, 
    129308    // mod_time, host_specific here 
    130309    // since they are outside of <venue> elements, 
     
    140319    confirm_before_connecting = false; 
    141320    hangup_if_dialed = false; 
    142321    dont_verify_images = false; 
    143     for (int i=0; i<7; i++) { 
    144         week_prefs.days[i].present = false; 
    145     } 
    146322} 
    147323 
    148 bool TIME_PREFS::suspended(double hour, int which) { 
    149     double start, end; 
    150     switch (which) { 
    151     case PREFS_CPU: 
    152         start = start_hour; 
    153         end = end_hour; 
    154         break; 
    155     case PREFS_NETWORK: 
    156         start = net_start_hour; 
    157         end = net_end_hour; 
    158         break; 
    159     default: 
    160         return false; 
    161     } 
    162     if (start==end) return false; 
    163     if (start==0 && end==24) return false;  // redundant? 
    164     if (start==24 && end==0) return true; 
    165     if (start < end) { 
    166         return (hour < start || hour > end); 
    167     } else { 
    168         return (hour >= end && hour < start); 
    169     } 
    170 } 
    171  
    172 bool GLOBAL_PREFS::suspended_time_of_day(int which) { 
    173     time_t now = time(0); 
    174     struct tm *tmp = localtime(&now); 
    175     double hour = (tmp->tm_hour*3600 + tmp->tm_min*60 + tmp->tm_sec)/3600.; 
    176     int day = tmp->tm_wday; 
    177  
    178     if (week_prefs.present && week_prefs.days[day].present) { 
    179         return week_prefs.days[day].time_prefs.suspended(hour, which); 
    180     } else { 
    181         return time_prefs.suspended(hour, which); 
    182     } 
    183 } 
    184  
    185324GLOBAL_PREFS::GLOBAL_PREFS() { 
    186325    defaults(); 
    187326} 
     
    202341    return parse_override(xp, host_venue, found_venue, mask); 
    203342} 
    204343 
    205 int DAY_PREFS::parse(XML_PARSER& xp) { 
     344int GLOBAL_PREFS::parse_day(XML_PARSER& xp) { 
    206345    char tag[256]; 
    207346    bool is_tag; 
    208347 
    209     day_of_week = -1; 
    210     time_prefs.clear(); 
     348    int day_of_week = -1; 
     349    bool has_cpu = false; 
     350    bool has_net = false; 
     351    double start_hour = 0; 
     352    double end_hour = 0; 
     353    double net_start_hour = 0; 
     354    double net_end_hour = 0; 
     355 
    211356    while (!xp.get(tag, sizeof(tag), is_tag)) { 
    212357        if (!is_tag) continue; 
    213358        if (!strcmp(tag, "/day_prefs")) { 
    214359            if (day_of_week < 0 || day_of_week > 6) return ERR_XML_PARSE; 
     360            if (has_cpu) { 
     361                cpu_times.week.set(day_of_week, start_hour, end_hour); 
     362            } 
     363            if (has_net) { 
     364                net_times.week.set(day_of_week, net_start_hour, net_end_hour); 
     365            } 
    215366            return 0; 
    216367        } 
    217368        if (xp.parse_int(tag, "day_of_week", day_of_week)) continue; 
    218         if (xp.parse_double(tag, "start_hour", time_prefs.start_hour)) continue; 
    219         if (xp.parse_double(tag, "end_hour", time_prefs.end_hour)) continue; 
    220         if (xp.parse_double(tag, "net_start_hour", time_prefs.net_start_hour)) continue; 
    221         if (xp.parse_double(tag, "net_end_hour", time_prefs.net_end_hour)) continue; 
    222         xp.skip_unexpected(tag, true, "GLOBAL_PREFS::parse"); 
     369        if (xp.parse_double(tag, "start_hour", start_hour)) { 
     370            has_cpu = true; 
     371            continue; 
     372        } 
     373        if (xp.parse_double(tag, "end_hour", end_hour)) { 
     374            has_cpu = true; 
     375            continue; 
     376        } 
     377        if (xp.parse_double(tag, "net_start_hour", net_start_hour)) { 
     378            has_net = true; 
     379            continue; 
     380        } 
     381        if (xp.parse_double(tag, "net_end_hour", net_end_hour)) { 
     382            has_net = true; 
     383            continue; 
     384        } 
     385        xp.skip_unexpected(tag, true, "GLOBAL_PREFS::parse_day"); 
    223386    } 
    224387    return ERR_XML_PARSE; 
    225388} 
    226389 
    227 void WEEK_PREFS::clear() { 
    228     memset(this, 0, sizeof(*this)); 
    229 } 
    230390 
    231391// Parse global prefs, overriding whatever is currently in the structure. 
    232392// 
     
    245405    char tag[256], buf2[256]; 
    246406    bool in_venue = false, in_correct_venue=false, is_tag; 
    247407    double dtemp; 
    248     int retval; 
    249408 
    250409    found_venue = false; 
    251410    mask.clear(); 
     
    304463            mask.suspend_if_no_recent_input = true; 
    305464            continue; 
    306465        } 
    307         if (xp.parse_double(tag, "start_hour", time_prefs.start_hour)) { 
     466        if (xp.parse_double(tag, "start_hour", cpu_times.start_hour)) { 
    308467            mask.start_hour = true; 
    309468            continue; 
    310469        } 
    311         if (xp.parse_double(tag, "end_hour", time_prefs.end_hour)) { 
     470        if (xp.parse_double(tag, "end_hour", cpu_times.end_hour)) { 
    312471            mask.end_hour = true; 
    313472            continue; 
    314473        } 
    315         if (xp.parse_double(tag, "net_start_hour", time_prefs.net_start_hour)) { 
     474        if (xp.parse_double(tag, "net_start_hour", net_times.start_hour)) { 
    316475            mask.net_start_hour = true; 
    317476            continue; 
    318477        } 
    319         if (xp.parse_double(tag, "net_end_hour", time_prefs.net_end_hour)) { 
     478        if (xp.parse_double(tag, "net_end_hour", net_times.end_hour)) { 
    320479            mask.net_end_hour = true; 
    321480            continue; 
    322481        } 
    323482        if (!strcmp(tag, "day_prefs")) { 
    324             DAY_PREFS dp; 
    325             retval = dp.parse(xp); 
    326             if (!retval) { 
    327                 dp.present = true; 
    328                 week_prefs.present = true; 
    329                 week_prefs.days[dp.day_of_week] = dp; 
    330             } 
     483            parse_day(xp); 
    331484            continue; 
    332485        } 
    333486        if (xp.parse_bool(tag, "leave_apps_in_memory", leave_apps_in_memory)) { 
     
    477630        "   <idle_time_to_run>%f</idle_time_to_run>\n" 
    478631        "   <max_bytes_sec_up>%f</max_bytes_sec_up>\n" 
    479632        "   <max_bytes_sec_down>%f</max_bytes_sec_down>\n" 
    480         "   <cpu_usage_limit>%f</cpu_usage_limit>\n" 
    481         "</global_preferences>\n", 
     633        "   <cpu_usage_limit>%f</cpu_usage_limit>\n", 
    482634        mod_time, 
    483635        run_on_batteries?"   <run_on_batteries/>\n":"", 
    484636        run_if_user_active?"   <run_if_user_active/>\n":"", 
    485637        suspend_if_no_recent_input, 
    486         time_prefs.start_hour, 
    487         time_prefs.end_hour, 
    488         time_prefs.net_start_hour, 
    489         time_prefs.net_end_hour, 
     638        cpu_times.start_hour, 
     639        cpu_times.end_hour, 
     640        net_times.start_hour, 
     641        net_times.end_hour, 
    490642        leave_apps_in_memory?"   <leave_apps_in_memory/>\n":"", 
    491643        confirm_before_connecting?"   <confirm_before_connecting/>\n":"", 
    492644        hangup_if_dialed?"   <hangup_if_dialed/>\n":"", 
     
    507659        max_bytes_sec_down, 
    508660        cpu_usage_limit 
    509661    ); 
     662 
     663    for (int i = 0; i < 7; i++) { 
     664                TIME_SPAN* cpu = cpu_times.week.get(i); 
     665        TIME_SPAN* net = net_times.week.get(i); 
     666                //write only when needed 
     667                if (net || cpu) { 
     668                         
     669                        f.printf("   <day_prefs>\n");                            
     670                        f.printf("      <day_of_week>%d</day_of_week>\n", i); 
     671                        if (cpu) { 
     672                                f.printf("      <start_hour>%.02f</start_hour>\n", cpu->start_hour); 
     673                                f.printf("      <end_hour>%.02f</end_hour>\n", cpu->end_hour); 
     674                        } 
     675                        if (net) { 
     676                                f.printf("      <net_start_hour>%.02f</net_start_hour>\n", net->start_hour); 
     677                                f.printf("      <net_end_hour>%.02f</net_end_hour>\n", net->end_hour); 
     678                        } 
     679                        f.printf("   </day_prefs>\n"); 
     680                } 
     681        } 
     682    f.printf("</global_preferences>\n"); 
     683 
    510684    return 0; 
    511685} 
    512686 
     
    537711        ); 
    538712    } 
    539713    if (mask.start_hour) { 
    540         f.printf("   <start_hour>%f</start_hour>\n", time_prefs.start_hour); 
     714        f.printf("   <start_hour>%f</start_hour>\n", cpu_times.start_hour); 
    541715    } 
    542716    if (mask.end_hour) { 
    543         f.printf("   <end_hour>%f</end_hour>\n", time_prefs.end_hour); 
     717        f.printf("   <end_hour>%f</end_hour>\n", cpu_times.end_hour); 
    544718    } 
    545719    if (mask.net_start_hour) { 
    546         f.printf("   <net_start_hour>%f</net_start_hour>\n", time_prefs.net_start_hour); 
     720        f.printf("   <net_start_hour>%f</net_start_hour>\n", net_times.start_hour); 
    547721    } 
    548722    if (mask.net_end_hour) { 
    549         f.printf("   <net_end_hour>%f</net_end_hour>\n", time_prefs.net_end_hour); 
     723        f.printf("   <net_end_hour>%f</net_end_hour>\n", net_times.end_hour); 
    550724    } 
    551725    if (mask.leave_apps_in_memory) { 
    552726        f.printf("   <leave_apps_in_memory>%d</leave_apps_in_memory>\n", 
     
    610784    if (mask.cpu_usage_limit) { 
    611785        f.printf("   <cpu_usage_limit>%f</cpu_usage_limit>\n", cpu_usage_limit); 
    612786    } 
    613         if (week_prefs.present) { 
    614                 for(int i=0; i< 7;i++) { 
    615                         DAY_PREFS dp = week_prefs.days[i]; 
    616                         //write only when needed 
    617                         if(dp.present &&  
    618                                 (dp.time_prefs.start_hour != dp.time_prefs.end_hour ||  
    619                                 dp.time_prefs.net_start_hour != dp.time_prefs.net_end_hour)) { 
    620                                  
    621                                 f.printf("   <day_prefs>\n");                            
    622                                 f.printf("      <day_of_week>%d</day_of_week>\n",dp.day_of_week); 
    623                                 if(dp.time_prefs.start_hour != dp.time_prefs.end_hour) { 
    624                                         f.printf("      <start_hour>%.02f</start_hour>\n",dp.time_prefs.start_hour); 
    625                                         f.printf("      <end_hour>%.02f</end_hour>\n",dp.time_prefs.end_hour); 
    626                                 } 
    627                                 if(dp.time_prefs.net_start_hour != dp.time_prefs.net_end_hour) { 
    628                                         f.printf("      <net_start_hour>%.02f</net_start_hour>\n",dp.time_prefs.net_start_hour); 
    629                                         f.printf("      <net_end_hour>%.02f</net_end_hour>\n",dp.time_prefs.net_end_hour); 
    630                                 } 
    631                                 f.printf("   </day_prefs>\n"); 
     787 
     788        for (int i = 0; i < 7; i++) { 
     789                TIME_SPAN* cpu = cpu_times.week.get(i); 
     790        TIME_SPAN* net = net_times.week.get(i); 
     791                //write only when needed 
     792                if (net || cpu) { 
     793                         
     794                        f.printf("   <day_prefs>\n");                            
     795                        f.printf("      <day_of_week>%d</day_of_week>\n", i); 
     796                        if (cpu) { 
     797                                f.printf("      <start_hour>%.02f</start_hour>\n", cpu->start_hour); 
     798                                f.printf("      <end_hour>%.02f</end_hour>\n", cpu->end_hour); 
    632799                        } 
     800                        if (net) { 
     801                                f.printf("      <net_start_hour>%.02f</net_start_hour>\n", net->start_hour); 
     802                                f.printf("      <net_end_hour>%.02f</net_end_hour>\n", net->end_hour); 
     803                        } 
     804                        f.printf("   </day_prefs>\n"); 
    633805                } 
    634806        } 
     807 
    635808    f.printf("</global_preferences>\n"); 
    636809     
    637810    return 0; 
     
    639812 
    640813const char *BOINC_RCSID_3fb442bb02 = "$Id$"; 
    641814 
     815 
     816 
  • lib/prefs.h

    old new  
    4141    bool run_if_user_active; 
    4242    bool idle_time_to_run; 
    4343    bool suspend_if_no_recent_input; 
    44     bool start_hour;     // 0..23; no restriction if start==end 
     44    bool start_hour; 
    4545    bool end_hour; 
    46     bool net_start_hour;     // 0..23; no restriction if start==end 
     46    bool net_start_hour; 
    4747    bool net_end_hour; 
    4848    bool leave_apps_in_memory; 
    4949    bool confirm_before_connecting; 
     
    6868    void clear(); 
    6969    bool are_prefs_set(); 
    7070    bool are_simple_prefs_set(); 
     71    void set_all(); 
    7172}; 
    7273 
    73 #define PREFS_CPU       0 
    74 #define PREFS_NETWORK   1 
    7574 
    76 struct TIME_PREFS { 
    77     double start_hour;     // 0..24 
    78         // run always if start==end or start==0, end=24 
    79         // don't run at all if start=24, end=0 
    80     double end_hour; 
    81     double net_start_hour;     // 0..24; no restriction if start==end 
    82     double net_end_hour; 
     75// 0..24 
     76// run always if start==end or start==0, end=24 
     77// don't run at all if start=24, end=0 
     78class TIME_SPAN { 
     79public: 
     80    enum TimeMode { 
     81        Always = 7000, 
     82        Never, 
     83        Between, 
     84    }; 
     85    TIME_SPAN() 
     86        : start_hour(0), end_hour(0) {} 
     87    TIME_SPAN(double start, double end) 
     88        : start_hour(start), end_hour(end) {} 
    8389 
    84     void clear(); 
    85     bool suspended(double hour, int which); 
     90    bool        suspended(double hour) const; 
     91    TimeMode    mode() const; 
     92 
     93    double      start_hour; 
     94    double      end_hour; 
     95     
    8696}; 
    8797 
    88 struct DAY_PREFS { 
    89     bool present; 
    90     int day_of_week; 
    91     TIME_PREFS time_prefs; 
    9298 
    93     int parse(XML_PARSER&); 
    94 }; 
     99class WEEK_PREFS { 
     100public: 
     101    WEEK_PREFS(); 
     102    WEEK_PREFS(const WEEK_PREFS& original); 
     103    ~WEEK_PREFS(); 
    95104 
    96 struct WEEK_PREFS { 
    97     bool present;       // at least one day is present 
    98     DAY_PREFS days[7];  // sun..sat 
     105    TIME_SPAN* get(int day) const; 
     106    void set(int day, double start, double end); 
     107    void set(int day, TIME_SPAN* time); 
     108    void unset(int day); 
    99109    void clear(); 
     110    WEEK_PREFS& operator=(const WEEK_PREFS& rhs); 
     111 
     112protected: 
     113    void copy(const WEEK_PREFS& original); 
     114    TIME_SPAN* days[7]; 
     115 
    100116}; 
    101117 
     118 
     119class TIME_PREFS : public TIME_SPAN { 
     120public: 
     121    TIME_PREFS() : TIME_SPAN() {} 
     122    TIME_PREFS(double start, double end) 
     123        : TIME_SPAN(start, end) {} 
     124     
     125    void        clear(); 
     126    bool        suspended() const; 
     127     
     128    WEEK_PREFS  week; 
     129}; 
     130 
     131 
    102132struct GLOBAL_PREFS { 
    103133    int mod_time; 
    104134    bool run_on_batteries; 
     
    111141    bool confirm_before_connecting; 
    112142    bool hangup_if_dialed; 
    113143    bool dont_verify_images; 
    114     TIME_PREFS time_prefs; 
     144    TIME_PREFS cpu_times; 
     145    TIME_PREFS net_times; 
    115146    double work_buf_min_days; 
    116147    double work_buf_additional_days; 
    117148    int max_cpus; 
     
    129160    char source_project[256]; 
    130161    char source_scheduler[256]; 
    131162    bool host_specific; 
    132     WEEK_PREFS week_prefs; 
    133163 
    134164    GLOBAL_PREFS(); 
    135165    void defaults(); 
    136166    void clear_bools(); 
    137167    int parse(XML_PARSER&, const char* venue, bool& found_venue, GLOBAL_PREFS_MASK& mask); 
     168    int parse_day(XML_PARSER&); 
    138169    int parse_override(XML_PARSER&, const char* venue, bool& found_venue, GLOBAL_PREFS_MASK& mask); 
    139170    int parse_file(const char* filename, const char* venue, bool& found_venue); 
    140171    int write(MIOFILE&); 
    141172    int write_subset(MIOFILE&, GLOBAL_PREFS_MASK&); 
    142     bool suspended_time_of_day(int); 
    143173    inline double cpu_scheduling_period() { 
    144174        return cpu_scheduling_period_minutes*60; 
    145175    } 

If this page is incomplete or incorrect, please edit it or add it to the wiki to-do list. To do this, you must be logged in; click Login or Register above.