0917d3 | 2013-03-04 | Anders Johansson | |
|
149437 | 2003-07-31 | Anders Johansson | |
|
4eed96 | 2022-06-28 | Henrik Grubbström (Grubba) | | #if constant(roxenp)
|
fc1029 | 2022-06-27 | Henrik Grubbström (Grubba) | | inherit .Variable;
|
0a2948 | 2001-08-22 | Per Hedbor | |
|
5004d1 | 2001-08-22 | Martin Nilsson | |
|
0a2948 | 2001-08-22 | Per Hedbor | |
#define LOCALE(X,Y) \
([string](mixed)Locale.translate("roxen_config",roxenp()->locale->get(),X,Y))
|
b52565 | 2022-06-27 | Henrik Grubbström (Grubba) | | #else
#define LOCALE(X, Y) (Y)
array(int) val = ({ });
array(int) query()
{
return val;
}
#define localtime(X) gmtime(X)
int main(int argc, array(string) argv)
{
int successes;
int failures;
foreach(({
|
8fa1b6 | 2022-06-27 | Henrik Grubbström (Grubba) | | ({ ({ 0, 2, 1, 6, 3, 0, }),
|
b52565 | 2022-06-27 | Henrik Grubbström (Grubba) | |
({ 0, -1 }),
}),
|
8fa1b6 | 2022-06-27 | Henrik Grubbström (Grubba) | | ({ ({ 1, 2, 1, 6, 3, 0, }),
|
b52565 | 2022-06-27 | Henrik Grubbström (Grubba) | |
({ 1655907103, 1655914303 }),
}),
|
8fa1b6 | 2022-06-27 | Henrik Grubbström (Grubba) | | ({ ({ 2, 2, 1, 6, 3, 0, }),
|
b52565 | 2022-06-27 | Henrik Grubbström (Grubba) | |
({ 1655907103, 1656039600 }),
({ 1655993503, 1656039600 }),
({ 1656036703, 1656039600 }),
({ 1656040303, 1656644400 }),
({ 1656040903, 1656644400 }),
({ 1656042703, 1656644400 }),
({ 1656043903, 1656644400 }),
({ 1656079903, 1656644400 }),
}),
|
8fa1b6 | 2022-06-27 | Henrik Grubbström (Grubba) | | ({ ({ 2, 2, 1, 6, 3, 45, }),
({ 1655907103, 1656042300 }),
({ 1655993503, 1656042300 }),
({ 1656036703, 1656042300 }),
({ 1656040303, 1656042300 }),
({ 1656040903, 1656042300 }),
({ 1656042703, 1656647100 }),
({ 1656043903, 1656647100 }),
({ 1656079903, 1656647100 }),
}),
|
55f342 | 2022-08-24 | Henrik Grubbström (Grubba) | | ({ ({ 2, 1, 1, 0, 3, 0 }),
({ 1655907103, 1655953200 }),
({ 1655993503, 1656039600 }),
({ 1656036703, 1656039600 }),
({ 1656040303, 1656126000 }),
({ 1656040903, 1656126000 }),
({ 1656042703, 1656126000 }),
({ 1656043903, 1656126000 }),
({ 1656079903, 1656126000 }),
}),
|
b52565 | 2022-06-27 | Henrik Grubbström (Grubba) | | }), array(array(int)) test) {
val = test[0];
while(1) {
foreach(test[1..], [int when, int expected]) {
int got = get_next(when);
if (got != expected) {
failures++;
werror("Test failed for %O\n"
"When: %d\n"
"%O\n"
"Expected: %d\n"
"%O\n"
"Got: %d\n"
"%O\n",
test,
when, localtime(when),
expected, localtime(expected),
got, localtime(got));
} else {
successes++;
}
}
|
8fa1b6 | 2022-06-27 | Henrik Grubbström (Grubba) | | if ((sizeof(val) > 5) && !val[5]) {
val = val[..4];
continue;
}
|
b52565 | 2022-06-27 | Henrik Grubbström (Grubba) | | break;
}
}
werror("Succeeded on %d, Failed on %d.\n", successes, failures);
return !!failures;
}
|
fc1029 | 2022-06-27 | Henrik Grubbström (Grubba) | | #endif
#define VALS_SORT 0
#define VALS_REPEAT_HOURS 1
#define VALS_REPEAT_COUNT 2
#define VALS_DAY 3
#define VALS_HOUR 4
|
8fa1b6 | 2022-06-27 | Henrik Grubbström (Grubba) | | #define VALS_MINUTE 5
|
fc1029 | 2022-06-27 | Henrik Grubbström (Grubba) | |
|
44128c | 2022-09-13 | Henrik Grubbström (Grubba) | | protected multiset(int(0..2)) valid_sorts = (< 0, 1, 2 >);
|
5004d1 | 2001-08-22 | Martin Nilsson | |
|
0a2948 | 2001-08-22 | Per Hedbor | |
|
44128c | 2022-09-13 | Henrik Grubbström (Grubba) | |
|
0a2948 | 2001-08-22 | Per Hedbor | |
|
97c832 | 2002-04-23 | Henrik Grubbström (Grubba) | |
|
5004d1 | 2001-08-22 | Martin Nilsson | |
|
0a2948 | 2001-08-22 | Per Hedbor | |
|
97c832 | 2002-04-23 | Henrik Grubbström (Grubba) | |
|
5004d1 | 2001-08-22 | Martin Nilsson | |
|
0a2948 | 2001-08-22 | Per Hedbor | |
|
44128c | 2022-09-13 | Henrik Grubbström (Grubba) | |
|
8fa1b6 | 2022-06-27 | Henrik Grubbström (Grubba) | |
|
44128c | 2022-09-13 | Henrik Grubbström (Grubba) | |
|
8fa1b6 | 2022-06-27 | Henrik Grubbström (Grubba) | |
|
0a2948 | 2001-08-22 | Per Hedbor | |
|
e7c340 | 2002-10-03 | Anders Johansson | | array transform_from_form( string what, mapping vl )
|
0a2948 | 2001-08-22 | Per Hedbor | | {
array res = query() + ({});
|
8fa1b6 | 2022-06-27 | Henrik Grubbström (Grubba) | | if(sizeof(res) <= VALS_HOUR) {
res = ({ 0, 2, 1, 6, 3, -1 });
} else if (sizeof(res) <= VALS_MINUTE) {
res += ({ 0 });
}
|
0a2948 | 2001-08-22 | Per Hedbor | |
|
fc1029 | 2022-06-27 | Henrik Grubbström (Grubba) | | res[VALS_SORT] = (int)what;
|
8fa1b6 | 2022-06-27 | Henrik Grubbström (Grubba) | | for(int i=1; i <= VALS_MINUTE; i++) {
|
0a2948 | 2001-08-22 | Per Hedbor | | res[i] = (int)vl[(string)i];
|
8fa1b6 | 2022-06-27 | Henrik Grubbström (Grubba) | | res[i] = max( ({ 0, 1, 1, 0, 0, 0 })[i], res[i] );
res[i] = min( ({ 2, 23, 9, 7, 23, 59 })[i], res[i] );
}
if (!res[VALS_MINUTE]) {
res = res[..VALS_HOUR];
|
0a2948 | 2001-08-22 | Per Hedbor | | }
return res;
}
|
44128c | 2022-09-13 | Henrik Grubbström (Grubba) | | array verify_set_from_form(array val)
{
if ((sizeof(val) >= VALS_SORT) &&
!valid_sorts[val[VALS_SORT]]) {
throw("Invalid operation mode.\n");
}
return ::verify_set_from_form(val);
}
|
96718a | 2019-04-29 | Henrik Grubbström (Grubba) | | protected int mktime(mapping m)
{
int t = predef::mktime(m);
if (m->timezone) {
t += t - predef::mktime(localtime(t));
}
return t;
}
|
8fa1b6 | 2022-06-27 | Henrik Grubbström (Grubba) | | private mapping next_or_same_day(mapping from, int day, int hour, int minute)
|
0a2948 | 2001-08-22 | Per Hedbor | | {
|
e7c340 | 2002-10-03 | Anders Johansson | | if(from->wday==day && from->hour<hour)
return from;
|
8fa1b6 | 2022-06-27 | Henrik Grubbström (Grubba) | | if(from->wday==day && from->hour == hour && from->min<minute)
return from;
|
0a2948 | 2001-08-22 | Per Hedbor | | return next_day(from, day);
}
private mapping next_day(mapping from, int day)
{
|
795b95 | 2020-03-27 | Henrik Grubbström (Grubba) | | int num_days = ((6 + day - from->wday) % 7) + 1;
from->hour = 12;
mapping m = localtime(mktime(from) + num_days * 3600 * 24);
m->hour = from->hour = 0;
|
8fa1b6 | 2022-06-27 | Henrik Grubbström (Grubba) | | m->min = from->min = 0;
|
795b95 | 2020-03-27 | Henrik Grubbström (Grubba) | | return m;
|
0a2948 | 2001-08-22 | Per Hedbor | | }
|
8fa1b6 | 2022-06-27 | Henrik Grubbström (Grubba) | | private mapping next_or_same_time(mapping from, int hour, int minute,
void|int delta)
|
0a2948 | 2001-08-22 | Per Hedbor | | {
|
8fa1b6 | 2022-06-27 | Henrik Grubbström (Grubba) | | if (from->hour == hour) {
if (minute < 0) {
return from;
}
if ((from->min - (from->min % 15)) == minute) {
return from;
}
}
return next_time(from, hour, minute, delta);
|
0a2948 | 2001-08-22 | Per Hedbor | | }
|
8fa1b6 | 2022-06-27 | Henrik Grubbström (Grubba) | | private mapping next_time(mapping from, int hour, int minute, void|int delta)
|
0a2948 | 2001-08-22 | Per Hedbor | | {
if(from->hour<hour) {
from->hour = hour;
|
8fa1b6 | 2022-06-27 | Henrik Grubbström (Grubba) | | if (minute < 0) {
from->min = 0;
} else {
from->min = minute;
}
return from;
} else if ((from->hour == hour) && (from->min < minute)) {
from->min = minute;
|
0a2948 | 2001-08-22 | Per Hedbor | | return from;
}
|
3a9f07 | 2022-08-24 | Henrik Grubbström (Grubba) | | from->min = minute;
|
4dbfcf | 2002-04-25 | Anders Johansson | | return localtime(mktime(from) + (24 - from->hour + hour)*3600 + delta);
|
0a2948 | 2001-08-22 | Per Hedbor | | }
int get_next( int last )
|
5004d1 | 2001-08-22 | Martin Nilsson | |
|
fc1029 | 2022-06-27 | Henrik Grubbström (Grubba) | |
|
5004d1 | 2001-08-22 | Martin Nilsson | |
|
97c832 | 2002-04-23 | Henrik Grubbström (Grubba) | |
|
0a2948 | 2001-08-22 | Per Hedbor | | {
array vals = query();
|
8fa1b6 | 2022-06-27 | Henrik Grubbström (Grubba) | | if (sizeof(vals) == VALS_MINUTE) {
vals += ({ 0 });
}
|
fc1029 | 2022-06-27 | Henrik Grubbström (Grubba) | | if( !vals[VALS_SORT] )
|
0a2948 | 2001-08-22 | Per Hedbor | | return -1;
|
e7c340 | 2002-10-03 | Anders Johansson | |
|
fc1029 | 2022-06-27 | Henrik Grubbström (Grubba) | | if( vals[VALS_SORT] == 1 )
|
0a2948 | 2001-08-22 | Per Hedbor | | if( !last )
return time(1);
else
|
fc1029 | 2022-06-27 | Henrik Grubbström (Grubba) | | return last + 3600 * vals[VALS_REPEAT_HOURS];
|
0a2948 | 2001-08-22 | Per Hedbor | |
mapping m = localtime( last || time(1) );
|
8fa1b6 | 2022-06-27 | Henrik Grubbström (Grubba) | | m->sec = 0;
m->min -= (m->min % 15);
|
fc1029 | 2022-06-27 | Henrik Grubbström (Grubba) | | if( !vals[VALS_DAY] ) {
|
075731 | 2002-10-09 | Anders Johansson | |
if (!last)
{
|
fc1029 | 2022-06-27 | Henrik Grubbström (Grubba) | | for(int i; i<vals[VALS_REPEAT_COUNT]; i++)
|
8fa1b6 | 2022-06-27 | Henrik Grubbström (Grubba) | | m = next_or_same_time( m, vals[VALS_HOUR], vals[VALS_MINUTE] );
|
075731 | 2002-10-09 | Anders Johansson | | return mktime(m);
}
else
{
|
fc1029 | 2022-06-27 | Henrik Grubbström (Grubba) | | for(int i; i<vals[VALS_REPEAT_COUNT]; i++)
|
8fa1b6 | 2022-06-27 | Henrik Grubbström (Grubba) | | m = next_time( m, vals[VALS_HOUR], vals[VALS_MINUTE] );
|
075731 | 2002-10-09 | Anders Johansson | | return mktime(m);
}
}
if (!last)
{
|
fc1029 | 2022-06-27 | Henrik Grubbström (Grubba) | | for(int i; i<vals[VALS_REPEAT_COUNT]; i++)
|
075731 | 2002-10-09 | Anders Johansson | | {
|
fc1029 | 2022-06-27 | Henrik Grubbström (Grubba) | | m = next_or_same_time( next_or_same_day( m, vals[VALS_DAY]-1,
|
8fa1b6 | 2022-06-27 | Henrik Grubbström (Grubba) | | vals[VALS_HOUR]+1,
vals[VALS_MINUTE] ),
vals[VALS_HOUR], vals[VALS_MINUTE], 6*24*3600 );
|
075731 | 2002-10-09 | Anders Johansson | | }
|
0a2948 | 2001-08-22 | Per Hedbor | | }
|
075731 | 2002-10-09 | Anders Johansson | | else
|
4dbfcf | 2002-04-25 | Anders Johansson | | {
|
fc1029 | 2022-06-27 | Henrik Grubbström (Grubba) | | for(int i; i<vals[VALS_REPEAT_COUNT]; i++)
|
075731 | 2002-10-09 | Anders Johansson | | {
|
fc1029 | 2022-06-27 | Henrik Grubbström (Grubba) | | m = next_or_same_time( next_or_same_day( m, vals[VALS_DAY]-1,
|
8fa1b6 | 2022-06-27 | Henrik Grubbström (Grubba) | | vals[VALS_HOUR],
vals[VALS_MINUTE] ),
vals[VALS_HOUR], vals[VALS_MINUTE], 6*24*3600 );
|
075731 | 2002-10-09 | Anders Johansson | | }
|
4dbfcf | 2002-04-25 | Anders Johansson | | }
return mktime(m);
|
0a2948 | 2001-08-22 | Per Hedbor | | }
|
4eed96 | 2022-06-28 | Henrik Grubbström (Grubba) | | #if constant(roxenp)
|
fc1029 | 2022-06-27 | Henrik Grubbström (Grubba) | |
private string checked( int pos, int alt )
{
if(alt==query()[pos])
return " checked='checked'";
return "";
}
|
0a2948 | 2001-08-22 | Per Hedbor | | string render_form( RequestID id, void|mapping additional_args )
{
|
8fa1b6 | 2022-06-27 | Henrik Grubbström (Grubba) | | string res, inp1, inp2, inp3, inp4;
|
fc1029 | 2022-06-27 | Henrik Grubbström (Grubba) | | array vals = query();
|
8fa1b6 | 2022-06-27 | Henrik Grubbström (Grubba) | | if (sizeof(vals) == VALS_MINUTE) {
vals += ({ 0 });
}
|
0a2948 | 2001-08-22 | Per Hedbor | |
|
44128c | 2022-09-13 | Henrik Grubbström (Grubba) | | res = "<table>";
if (valid_sorts[0]) {
res +=
"<tr valign='top'><td><input name='" + path() + "' value='0' type='radio' " +
checked(0,0) + " /></td><td>" + LOCALE(482, "Never") + "</td></tr>\n";
}
if (valid_sorts[1]) {
inp1 = HTML.select(path()+"1", "123456789"/1 + "1011121314151617181920212223"/2, (string)vals[VALS_REPEAT_HOURS]);
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";
}
if (valid_sorts[2]) {
inp1 = HTML.select(path()+"2", "123456789"/1, (string)vals[VALS_REPEAT_COUNT]);
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)vals[VALS_DAY]);
inp3 = HTML.select(path()+"4",
"000102030405060708091011121314151617181920212223"/2,
sprintf("%02d", vals[VALS_HOUR]));
inp4 = HTML.select(path()+"5",
"00153045"/2,
sprintf("%02d", vals[VALS_MINUTE]));
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:%s o'clock."),
inp1, inp2, inp3, inp4) +
"</td></tr>\n";
}
res += "</table>";
|
0a2948 | 2001-08-22 | Per Hedbor | |
return res;
}
string render_view( RequestID id, void|mapping additional_args )
{
array res = query();
|
8fa1b6 | 2022-06-27 | Henrik Grubbström (Grubba) | | if (sizeof(res) == VALS_MINUTE) {
res += ({ 0 });
}
|
fc1029 | 2022-06-27 | Henrik Grubbström (Grubba) | | switch(res[VALS_SORT]) {
|
0a2948 | 2001-08-22 | Per Hedbor | | case 0:
|
9fa11d | 2001-08-24 | Martin Nilsson | | return LOCALE(482, "Never");
|
0a2948 | 2001-08-22 | Per Hedbor | | case 1:
|
fc1029 | 2022-06-27 | Henrik Grubbström (Grubba) | | return sprintf(LOCALE(493, "Every %d hour."), res[VALS_REPEAT_HOURS]);
|
0a2948 | 2001-08-22 | Per Hedbor | | case 2:
string period = ({
|
9fa11d | 2001-08-24 | Martin Nilsson | | LOCALE(484, "Day"),
|
e7c340 | 2002-10-03 | Anders Johansson | | LOCALE(485, "Sunday"),
|
9fa11d | 2001-08-24 | Martin Nilsson | | LOCALE(486, "Monday"),
LOCALE(487, "Tuesday"),
LOCALE(488, "Wednesday"),
LOCALE(489, "Thursday"),
LOCALE(490, "Friday"),
|
e7c340 | 2002-10-03 | Anders Johansson | | LOCALE(491, "Saturday")
|
fc1029 | 2022-06-27 | Henrik Grubbström (Grubba) | | })[res[VALS_DAY]];
|
0a2948 | 2001-08-22 | Per Hedbor | |
|
8fa1b6 | 2022-06-27 | Henrik Grubbström (Grubba) | | return sprintf(LOCALE(494, "Every %d %s at %02d:%02d"),
res[VALS_REPEAT_COUNT], period,
res[VALS_HOUR], res[VALS_MINUTE]);
|
0a2948 | 2001-08-22 | Per Hedbor | | default:
|
9fa11d | 2001-08-24 | Martin Nilsson | | return LOCALE(495, "Error in stored value.");
|
0a2948 | 2001-08-22 | Per Hedbor | | }
}
|
fc1029 | 2022-06-27 | Henrik Grubbström (Grubba) | |
|
44128c | 2022-09-13 | Henrik Grubbström (Grubba) | | protected void create(array(int) default_value, void|int flags,
void|LocaleString std_name, void|LocaleString std_doc,
multiset(int(0..2))|void valid_sorts)
{
if (valid_sorts) {
this_program::valid_sorts &= valid_sorts;
if (!sizeof(this_program::valid_sorts)) {
error("Invalid set of operation modes for Schedule: %O\n", valid_sorts);
}
}
if (sizeof(default_value||({})) &&
!this_program::valid_sorts[default_value[VALS_SORT]]) {
error("Invalid default mode for Schedule: %O\n", default_value[VALS_SORT]);
}
::create(default_value, flags, std_name, std_doc);
}
|
fc1029 | 2022-06-27 | Henrik Grubbström (Grubba) | | #endif
|