Ticket #363: time.patch

File time.patch, 30.0 KB (added by Didactylos, 17 years ago)

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

  • client/cs_prefs.C

     
    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

     
    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

     
    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

     
    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

     
    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    }