00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef lint
00021 static const char rcsid[] = "$Id: scripttimer.c,v 1.13 2007-04-14 15:21:13 sven Exp $";
00022 #endif
00023
00024 #include <eggdrop/eggdrop.h>
00025 #include "egg_script_internal.h"
00026
00027 static int script_single_timer(int nargs, int sec, int usec, script_callback_t *callback);
00028 static int script_repeat_timer(int nargs, int sec, int usec, script_callback_t *callback);
00029 static int script_timers(script_var_t *retval);
00030 static int script_timer_info(script_var_t *retval, int timer_id);
00031
00032 static int script_timer(int sec, int usec, script_callback_t *callback, int flags)
00033 {
00034 egg_timeval_t howlong;
00035 int id;
00036
00037 howlong.sec = sec;
00038 howlong.usec = usec;
00039 callback->syntax = (char *)malloc(1);
00040 callback->syntax[0] = 0;
00041 id = timer_create_complex(&howlong, callback->name, callback->callback, callback, flags, callback->owner);
00042 return(id);
00043 }
00044
00045 static int script_single_timer(int nargs, int sec, int usec, script_callback_t *callback)
00046 {
00047 if (nargs < 3) {
00048 sec = usec;
00049 usec = 0;
00050 }
00051
00052 callback->flags |= SCRIPT_CALLBACK_ONCE;
00053 return script_timer(sec, usec, callback, 0);
00054 }
00055
00056 static int script_repeat_timer(int nargs, int sec, int usec, script_callback_t *callback)
00057 {
00058 if (nargs < 3) {
00059 sec = usec;
00060 usec = 0;
00061 }
00062
00063 return script_timer(sec, usec, callback, TIMER_REPEAT);
00064 }
00065
00066 static int script_timers(script_var_t *retval)
00067 {
00068 egg_timer_t *timer;
00069 int ntimers, *timers = NULL;
00070
00071 ntimers = 0;
00072 for (timer = timer_list(); timer; timer = timer->next) {
00073 timers = realloc(timers, sizeof(*timers) * (ntimers+1));
00074 timers[ntimers] = timer->id;
00075 ntimers++;
00076 }
00077
00078
00079 retval->type = SCRIPT_ARRAY | SCRIPT_FREE | SCRIPT_INTEGER;
00080 retval->value = timers;
00081 retval->len = ntimers;
00082 return(0);
00083 }
00084
00085 static int script_timer_info(script_var_t *retval, int timer_id)
00086 {
00087 egg_timeval_t start_time, diff, now;
00088 egg_timer_t *timer;
00089
00090 retval->type = SCRIPT_VAR | SCRIPT_FREE | SCRIPT_ARRAY;
00091 retval->len = 0;
00092
00093 timer = timer_find(timer_id);
00094 if (!timer) return(0);
00095
00096 timer_get_now(&now);
00097
00098
00099
00100
00101
00102 script_list_append(retval, script_string(timer->name, -1));
00103
00104 timer_diff(&timer->howlong, &timer->trigger_time, &start_time);
00105 script_list_append(retval, script_int(start_time.sec));
00106 script_list_append(retval, script_int(start_time.usec));
00107
00108 script_list_append(retval, script_int(timer->howlong.sec));
00109 script_list_append(retval, script_int(timer->howlong.usec));
00110
00111 timer_diff(&start_time, &now, &diff);
00112 script_list_append(retval, script_int(diff.sec));
00113 script_list_append(retval, script_int(diff.usec));
00114
00115 timer_diff(&now, &timer->trigger_time, &diff);
00116 script_list_append(retval, script_int(diff.sec));
00117 script_list_append(retval, script_int(diff.usec));
00118
00119 script_list_append(retval, script_int(timer->trigger_time.sec));
00120 script_list_append(retval, script_int(timer->trigger_time.usec));
00121
00122 return(0);
00123 }
00124
00125 script_command_t script_timer_cmds[] = {
00126 {"", "timer", script_single_timer, NULL, 2, "iic", "seconds ?microseconds? callback", SCRIPT_INTEGER, SCRIPT_VAR_ARGS | SCRIPT_VAR_FRONT | SCRIPT_PASS_COUNT},
00127 {"", "rtimer", script_repeat_timer, NULL, 2, "iic", "seconds ?microseconds? callback", SCRIPT_INTEGER, SCRIPT_VAR_ARGS | SCRIPT_VAR_FRONT | SCRIPT_PASS_COUNT},
00128 {"", "killtimer", timer_destroy, NULL, 1, "i", "timer-id", SCRIPT_INTEGER, 0},
00129 {"", "timers", script_timers, NULL, 0, "", "", 0, SCRIPT_PASS_RETVAL},
00130 {"", "timer_info", script_timer_info, NULL, 1, "i", "timer-id", 0, SCRIPT_PASS_RETVAL},
00131 {0}
00132 };