Roxen.git / server / etc / modules / Variable.pmod / Schedule.pike

version» Context lines:

Roxen.git/server/etc/modules/Variable.pmod/Schedule.pike:1: + // $Id$ +    inherit Variable.Variable; - inherit "html"; +       //! This class implements a scheduler widget with three main states,   //! never index, index every n:th hour or index every n:th x-day at y   //! o'clock. In the "index every n:th hour" case the range is 1 to 23.   //! In the "index every n:th x-day at y o'clock" the n-range is   //! 1 to 9, the units are day and all the weekdays. The time range for   //! y is all hours in a day.      // Locale macros   //<locale-token project="roxen_config"> LOCALE </locale-token>
Roxen.git/server/etc/modules/Variable.pmod/Schedule.pike:21:   //! @elem int(0..2) sort   //! @int   //! @value 0   //! Never   //! @value 1   //! Every x hour   //! @value 2   //! Every x y at z   //! @endint   //! @elem int(1..23) hour + //! Number of hours between restarts.   //!   //! @elem int(1..9) everynth -  + //! Number of days or weeks to skip between restarts.   //!   //! @elem int(0..7) day   //! @int   //! @value 0   //! Day   //! @value 1   //! Sunday   //! @value 2..7   //! Rest of weekdays   //! @endint   //! @elem int(0..23) time -  + //! Time at which to restart.   //! @endarray - array transform_from_form( string what, void|mapping vl ) + array transform_from_form( string what, mapping vl )   {    array res = query() + ({});    if(sizeof(res)!=5)    res = ({ 0, 2, 1, 6, 3 });       res[0] = (int)what;    for(int i=1; i<5; i++) {    res[i] = (int)vl[(string)i];    res[i] = max( ({ 0, 1, 1, 0, 0 })[i], res[i] );    res[i] = min( ({ 2, 23, 9, 7, 23 })[i], res[i] );
Roxen.git/server/etc/modules/Variable.pmod/Schedule.pike:58:    return res;   }      private string checked( int pos, int alt )   {    if(alt==query()[pos])    return " checked='checked'";    return "";   }    - private mapping next_or_same_day(mapping from, int day) + private mapping next_or_same_day(mapping from, int day, int hour)   { -  if(from->wday==day) return from; +  if(from->wday==day && from->hour<hour) +  return from;    return next_day(from, day);   }      private mapping next_day(mapping from, int day)   {    from->hour = 0;    if(from->wday<day) { -  from->wday = day; -  return from; +  return localtime(mktime(from) + (day - from->wday)*3600*24);    } -  return localtime(mktime(from) + (7-from->wday)*3600*24 + day*3600*24); +  return localtime(mktime(from) + (7 - from->wday + day)*3600*24);   }      private mapping next_or_same_time(mapping from, int hour, void|int delta)   {    if(from->hour==hour) return from;    return next_time(from, hour, delta);   }      private mapping next_time(mapping from, int hour, void|int delta)   {    if(from->hour<hour) {    from->hour = hour;    return from;    } -  return localtime(mktime(from) + (24-from->hour)*3600 + delta + hour*3600); +  return localtime(mktime(from) + (24 - from->hour + hour)*3600 + delta);   }      int get_next( int last )   //! Get the next time that matches this schedule, starting from the   //! posix time @[last]. If last is 0, time(1) will be used instead.   //!   //! @returns   //! When the next scheduled event is, represented by a posix time integer.   //! Note that the returnes time may already have occured, so all return   //! values < time() essentially means go ahead and do it right away.   //! Minutes and seconds are cleared in the return value, so if the scheduler   //! is set to every day at 5 o'clock, and this method is called at 5:42 it   //! will return the posix time representing 5:00, unless of course @[last]   //! was set to a posix time >= 5:00. -  + //! Returns @tt{-1@} if the schedule is disabled (@tt{"Never"@}).   {    array vals = query();    if( !vals[0] )    return -1; -  +  +  // Every n:th hour.    if( vals[0] == 1 )    if( !last )    return time(1);    else    return last + 3600 * vals[1];       mapping m = localtime( last || time(1) );    m->min = m->sec = 0; -  if( !last ) +  if( !vals[3] ) { +  // Every n:th day at x. +  if (!last)    { -  if( !vals[3] ) -  return mktime( next_or_same_time( m, vals[4] ) ); -  return mktime( next_or_same_time( -  next_or_same_day( m, vals[3]-1 ), -  vals[4], 7*24*3600 ) ); +  for(int i; i<vals[2]; i++) +  m = next_or_same_time( m, vals[4] ); +  return mktime(m);    } -  +  else +  { +  for(int i; i<vals[2]; i++) +  m = next_time( m, vals[4] ); +  return mktime(m); +  } +  }    -  m->hour = 0; -  if(!vals[3]) -  return mktime(m)+vals[2]*24*3600 + vals[4]*3600; +  // Every x-day at y. +  if (!last) +  {    for(int i; i<vals[2]; i++) -  m = next_day(m, vals[3]-1); -  return mktime(m) + vals[4]*3600; +  { +  m = next_or_same_time( next_or_same_day( m, vals[3]-1, vals[4]+1 ), +  vals[4], 6*24*3600 );    } -  +  } +  else +  { +  for(int i; i<vals[2]; i++) +  { +  m = next_or_same_time( next_or_same_day( m, vals[3]-1, vals[4] ), +  vals[4], 6*24*3600 ); +  } +  } +  return mktime(m); + }      string render_form( RequestID id, void|mapping additional_args )   {    string res, inp1, inp2, inp3;       res = "<table>"    "<tr valign='top'><td><input name='" + path() + "' value='0' type='radio' " +    checked(0,0) + " /></td><td>" + LOCALE(482, "Never") + "</td></tr>\n";    -  inp1 = select(path()+"1", "123456789"/1 + "1011121314151617181920212223"/2, (string)query()[1]); +  inp1 = HTML.select(path()+"1", "123456789"/1 + "1011121314151617181920212223"/2, (string)query()[1]);       res += "<tr valign='top'><td><input name='" + path() + "' value='1' type='radio' " +    checked(0,1) + " /></td><td>" + sprintf( LOCALE(483, "Every %s hour(s)."), inp1) +    "</td></tr>\n";    -  inp1 = select(path()+"2", "123456789"/1, (string)query()[2]); -  inp2 = select(path()+"3", ({ +  inp1 = HTML.select(path()+"2", "123456789"/1, (string)query()[2]); +  inp2 = HTML.select(path()+"3", ({    ({ "0", LOCALE(484, "Day") }),    ({ "1", LOCALE(485, "Sunday") }),    ({ "2", LOCALE(486, "Monday") }),    ({ "3", LOCALE(487, "Tuesday") }),    ({ "4", LOCALE(488, "Wednesday") }),    ({ "5", LOCALE(489, "Thursday") }),    ({ "6", LOCALE(490, "Friday") }),    ({ "7", LOCALE(491, "Saturday") }) }), (string)query()[3]); -  inp3 = select(path()+"4", "000102030405060708091011121314151617181920212223"/2, +  inp3 = HTML.select(path()+"4", "000102030405060708091011121314151617181920212223"/2,    sprintf("%02d", query()[4]));       res += "<tr valign='top'><td><input name='" + path() + "' value='2' type='radio' " +    checked(0,2) + " /></td>\n<td>" +    sprintf(LOCALE(492, "Every %s %s at %s o'clock."), inp1, inp2, inp3) +    "</td></tr>\n</table>";       return res;   }   
Roxen.git/server/etc/modules/Variable.pmod/Schedule.pike:176:   {    array res = query();    switch(res[0]) {    case 0:    return LOCALE(482, "Never");    case 1:    return sprintf(LOCALE(493, "Every %d hour."), res[1]);    case 2:    string period = ({    LOCALE(484, "Day"), +  LOCALE(485, "Sunday"),    LOCALE(486, "Monday"),    LOCALE(487, "Tuesday"),    LOCALE(488, "Wednesday"),    LOCALE(489, "Thursday"),    LOCALE(490, "Friday"), -  LOCALE(491, "Saturday"), -  LOCALE(485, "Sunday") +  LOCALE(491, "Saturday")    })[query()[3]];       return sprintf(LOCALE(494, "Every %d %s at %02d:00"), res[2], period, res[4]);    default:    return LOCALE(495, "Error in stored value.");    }   }