Roxen.git
/
server
/
etc
/
modules
/
Variable.pmod
/
Schedule.pike
version
»
Context lines:
10
20
40
80
file
none
3
Roxen.git/server/etc/modules/Variable.pmod/Schedule.pike:1:
// $Id$
-
inherit Variable.Variable;
+
#if constant(roxen)
+
inherit
/*
Variable
*/
.Variable;
//! 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> #define LOCALE(X,Y) \ ([string](mixed)Locale.translate("roxen_config",roxenp()->locale->get(),X,Y))
-
+
#endif
+
+
#define VALS_SORT 0
+
#define VALS_REPEAT_HOURS 1
+
#define VALS_REPEAT_COUNT 2
+
#define VALS_DAY 3
+
#define VALS_HOUR 4
+
//! Transforms the form variables given in the @[vl] attribute //! to the internal time representation as follows. //! //! @array //! @elem int(0..2) sort //! @int //! @value 0 //! Never //! @value 1 //! Every x hour
Roxen.git/server/etc/modules/Variable.pmod/Schedule.pike:45:
//! @endint //! @elem int(0..23) time //! Time at which to restart. //! @endarray 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[
VALS_SORT
] = (int)what;
+
for(int i=1; i
<
= VALS_HOUR
; 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 "";
-
}
-
+
protected int mktime(mapping m) { int t = predef::mktime(m); if (m->timezone) { // Compensate for cases where predef::mktime() is broken. // Cf [WS-469]. t += t - predef::mktime(localtime(t)); } return t; }
Roxen.git/server/etc/modules/Variable.pmod/Schedule.pike:114:
} 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
+
//! Note that the
returned
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
] )
+
if( !vals[
VALS_SORT
] )
return -1; // Every n:th hour.
-
if( vals[
0
] == 1 )
+
if( vals[
VALS_SORT
] == 1 )
if( !last ) return time(1); else
-
return last + 3600 * vals[
1
];
+
return last + 3600 * vals[
VALS_REPEAT_HOURS
];
mapping m = localtime( last || time(1) ); m->min = m->sec = 0;
-
if( !vals[
3
] ) {
+
if( !vals[
VALS_DAY
] ) {
// Every n:th day at x. if (!last) {
-
for(int i; i<vals[
2
]; i++)
-
m = next_or_same_time( m, vals[
4
] );
+
for(int i; i<vals[
VALS_REPEAT_COUNT
]; i++)
+
m = next_or_same_time( m, vals[
VALS_HOUR
] );
return mktime(m); } else {
-
for(int i; i<vals[
2
]; i++)
-
m = next_time( m, vals[
4
] );
+
for(int i; i<vals[
VALS_REPEAT_COUNT
]; i++)
+
m = next_time( m, vals[
VALS_HOUR
] );
return mktime(m); } } // Every x-day at y. if (!last) {
-
for(int i; i<vals[
2
]; i++)
+
for(int i; i<vals[
VALS_REPEAT_COUNT
]; i++)
{
-
m = next_or_same_time( next_or_same_day( m, vals[
3
]-1, vals[
4
]+1 ),
-
vals[
4
], 6*24*3600 );
+
m = next_or_same_time( next_or_same_day( m, vals[
VALS_DAY
]-1,
+
vals[
VALS_HOUR
]+1 ),
+
vals[
VALS_HOUR
], 6*24*3600 );
} } else {
-
for(int i; i<vals[
2
]; i++)
+
for(int i; i<vals[
VALS_REPEAT_COUNT
]; i++)
{
-
m = next_or_same_time( next_or_same_day( m, vals[
3
]-1, vals[
4
] ),
-
vals[
4
], 6*24*3600 );
+
m = next_or_same_time( next_or_same_day( m, vals[
VALS_DAY
]-1,
+
vals[
VALS_HOUR
] ),
+
vals[
VALS_HOUR
], 6*24*3600 );
} } return mktime(m); }
-
+
#if constant(roxen)
+
+
private string checked( int pos, int alt )
+
{
+
if(alt==query()[pos])
+
return " checked='checked'";
+
return "";
+
}
+
string render_form( RequestID id, void|mapping additional_args ) { string res, inp1, inp2, inp3;
-
+
array vals = query();
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 = HTML.select(path()+"1", "123456789"/1 + "1011121314151617181920212223"/2, (string)
query()
[
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";
-
inp1 = HTML.select(path()+"2", "123456789"/1, (string)
query()
[
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)
query()
[
3
]);
-
inp3 = HTML.select(path()+"4", "000102030405060708091011121314151617181920212223"/2,
-
sprintf("%02d",
query()
[
4
]));
+
({ "7", LOCALE(491, "Saturday") }) }), (string)
vals
[
VALS_DAY
]);
+
inp3 = HTML.select(path()+"4",
+
"000102030405060708091011121314151617181920212223"/2,
+
sprintf("%02d",
vals
[
VALS_HOUR
]));
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; } string render_view( RequestID id, void|mapping additional_args ) { array res = query();
-
switch(res[
0
]) {
+
switch(res[
VALS_SORT
]) {
case 0: return LOCALE(482, "Never"); case 1:
-
return sprintf(LOCALE(493, "Every %d hour."), res[
1
]);
+
return sprintf(LOCALE(493, "Every %d hour."), res[
VALS_REPEAT_HOURS
]);
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")
-
})[
query()
[
3
]];
+
})[
res
[
VALS_DAY
]];
-
return sprintf(LOCALE(494, "Every %d %s at %02d:00"), res[
2
], period, res[
4
]);
+
return sprintf(LOCALE(494, "Every %d %s at %02d:00"),
+
res[
VALS_REPEAT_COUNT
], period, res[
VALS_HOUR
]);
default: return LOCALE(495, "Error in stored value."); } }
-
+
+
#endif