Roxen.git/
server/
etc/
modules/
Variable.pmod/
Schedule.pike
Branch:
Tag:
Non-build tags
All tags
No tags
2001-08-22
2001-08-22 15:41:53 by Per Hedbor <ph@opera.com>
0a294850c3a6474c084f5b897eba120741de9079 (
178
lines) (+
178
/-
0
)
[
Show
|
Annotate
]
Branch:
5.2
Schedule variable
Rev: server/etc/modules/Variable.pmod/Schedule.pike:1.1
1:
+
inherit Variable.Variable;
+
inherit "html";
-
+
// Locale macros
+
//<locale-token project="roxen_config"> LOCALE </locale-token>
+
+
#define LOCALE(X,Y) \
+
([string](mixed)Locale.translate("roxen_config",roxenp()->locale->get(),X,Y))
+
+
//! @array
+
//! @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
+
//! @elem int(1..9) everynth
+
//! @elem int(0..7) day
+
//! @int
+
//! @value 0
+
//! Day
+
//! @value 1
+
//! Sunday
+
//! @value 2..7
+
//! Rest of weekdays
+
//! @endint
+
//! @elem int(0.23) time
+
//! @endarray
+
array transform_from_form( string what, void|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] );
+
}
+
+
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)
+
{
+
if(from->wday==day) 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) + (7-from->wday)*3600*24 + 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);
+
}
+
+
int get_next( int last )
+
//! Get the next time that matches this schedule, starting with @[last].
+
//! If last is 0, time(1) will be used instead.
+
{
+
array vals = query();
+
if( !vals[0] )
+
return -1;
+
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] )
+
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 ) );
+
}
+
+
m->hour = 0;
+
if(!vals[3])
+
return mktime(m)+vals[2]*24*3600 + vals[4]*3600;
+
for(int i; i<vals[2]; i++)
+
m = next_day(m, vals[3]-1);
+
return mktime(m) + vals[4]*3600;
+
}
+
+
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(91, "Never") + "</td></tr>\n";
+
+
inp1 = 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(92, "Every %s hour(s)."), inp1) +
+
"</td></tr>\n";
+
+
inp1 = select(path()+"2", "123456789"/1, (string)query()[2]);
+
inp2 = select(path()+"3", ({
+
({ "0", LOCALE(93, "Day") }),
+
({ "1", LOCALE(100, "Sunday") }),
+
({ "2", LOCALE(94, "Monday") }),
+
({ "3", LOCALE(95, "Tuesday") }),
+
({ "4", LOCALE(96, "Wednesday") }),
+
({ "5", LOCALE(97, "Thursday") }),
+
({ "6", LOCALE(98, "Friday") }),
+
({ "7", LOCALE(99, "Saturday") }) }), (string)query()[3]);
+
inp3 = 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(101, "Every %s %s at %s o'clock."), inp1, inp2, inp3) +
+
"</td></tr>\n</table>";
+
+
return res;
+
}
+
+
string render_view( RequestID id, void|mapping additional_args )
+
{
+
array res = query();
+
switch(res[0]) {
+
case 0:
+
return LOCALE(91, "Never");
+
case 1:
+
return sprintf(LOCALE(108, "Every %d hour."), res[1]);
+
case 2:
+
string period = ({
+
LOCALE(93, "Day"),
+
LOCALE(94, "Monday"),
+
LOCALE(95, "Tuesday"),
+
LOCALE(96, "Wednesday"),
+
LOCALE(97, "Thursday"),
+
LOCALE(98, "Friday"),
+
LOCALE(99, "Saturday"),
+
LOCALE(100, "Sunday")
+
})[query()[3]];
+
+
return sprintf(LOCALE(109, "Every %d %s at %02d:00"), res[2], period, res[4]);
+
default:
+
return LOCALE(110, "Error in stored value.");
+
}
+
}
Newline at end of file added.