mirror of
https://salsa.debian.org/dskoll/remind.git
synced 2026-04-17 14:59:20 +02:00
First semi-sorta-working time zone adjustment.
This commit is contained in:
48
src/dorem.c
48
src/dorem.c
@@ -35,6 +35,43 @@ static int ComputeTrigDuration(TimeTrig const *t);
|
||||
|
||||
static int CalledEnterTimezone = 0;
|
||||
|
||||
static int AdjustTriggerForTimeZone(Trigger const *trig, int dse, TimeTrig *tim)
|
||||
{
|
||||
int y, m, d, hour, minute;
|
||||
int r;
|
||||
struct tm tm;
|
||||
if (!trig->tz) {
|
||||
/* Already local time - no adjustments needed */
|
||||
return dse;
|
||||
}
|
||||
FromDSE(dse, &y, &m, &d);
|
||||
hour = tim->ttime_orig / 60;
|
||||
minute = tim->ttime_orig % 60;
|
||||
|
||||
r = tz_convert(y, m, d, hour, minute, trig->tz, LocalTimeZone, &tm);
|
||||
if (r != 1) {
|
||||
Wprint(tr("Error adjusting trigger to local time zone"));
|
||||
return dse;
|
||||
}
|
||||
|
||||
dse = DSE(tm.tm_year+1900, tm.tm_mon, tm.tm_mday);
|
||||
tim->ttime = tm.tm_hour * 60 + tm.tm_min;
|
||||
SaveAllTriggerInfo(trig, tim, dse, tim->ttime, 1);
|
||||
if (DebugFlag & DB_PRTTRIG) {
|
||||
fprintf(ErrFp, "%s(%s): Trig(tz_adj %s) = %s, %d %s, %d AT %02d:%02d",
|
||||
GetCurrentFilename(), line_range(LineNoStart, LineNo), trig->tz,
|
||||
get_day_name(dse % 7), tm.tm_mday, get_month_name(tm.tm_mon),
|
||||
1900 + tm.tm_year, tim->ttime / 60, tim->ttime % 60);
|
||||
if (tim->duration != NO_TIME) {
|
||||
fprintf(ErrFp, " DURATION %02d:%02d",
|
||||
(tim->duration / 60),
|
||||
(tim->duration % 60));
|
||||
}
|
||||
fprintf(ErrFp, "\n");
|
||||
}
|
||||
return dse;
|
||||
}
|
||||
|
||||
static void ExitTimezone(char const *tz)
|
||||
{
|
||||
if (!CalledEnterTimezone) {
|
||||
@@ -396,7 +433,9 @@ int DoRem(ParsePtr p)
|
||||
PurgeEchoLine("%s\n", "#!P: Cannot purge SATISFY-type reminders");
|
||||
}
|
||||
PurgeEchoLine("%s\n", CurLine);
|
||||
EnterTimezone(trig.tz);
|
||||
r=DoSatRemind(&trig, &tim, p);
|
||||
ExitTimezone(trig.tz);
|
||||
if (r) {
|
||||
if (r == E_CANT_TRIG && trig.maybe_uncomputable) {
|
||||
r = OK;
|
||||
@@ -523,6 +562,11 @@ int DoRem(ParsePtr p)
|
||||
}
|
||||
|
||||
r = OK;
|
||||
|
||||
/* Adjust trigger date/time to time zone */
|
||||
if (dse >= 0) {
|
||||
dse = AdjustTriggerForTimeZone(&trig, dse, &tim);
|
||||
}
|
||||
if (ShouldTriggerReminder(&trig, &tim, dse, &err)) {
|
||||
/* Filter unwanted events/todos */
|
||||
if (todo_filtered(&trig)) {
|
||||
@@ -755,6 +799,7 @@ int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim)
|
||||
DBufInit(&(trig->tags));
|
||||
trig->passthru[0] = 0;
|
||||
tim->ttime = NO_TIME;
|
||||
tim->ttime_orig = NO_TIME;
|
||||
tim->delta = DefaultTDelta;
|
||||
tim->rep = NO_REP;
|
||||
tim->duration = NO_TIME;
|
||||
@@ -827,6 +872,7 @@ int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim)
|
||||
trig->m = m;
|
||||
trig->d = d;
|
||||
tim->ttime = (tok.val % MINUTES_PER_DAY);
|
||||
tim->ttime_orig = tim->ttime;
|
||||
break;
|
||||
|
||||
case T_WkDay:
|
||||
@@ -882,6 +928,7 @@ int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim)
|
||||
DBufFree(&buf);
|
||||
if (tim->ttime != NO_TIME) return E_TIME_TWICE;
|
||||
tim->ttime = tok.val;
|
||||
tim->ttime_orig = tok.val;
|
||||
r = ParseTimeTrig(s, tim);
|
||||
if (r) return r;
|
||||
trig->duration_days = ComputeTrigDuration(tim);
|
||||
@@ -1200,6 +1247,7 @@ static int ParseTimeTrig(ParsePtr s, TimeTrig *tim)
|
||||
DBufFree(&buf);
|
||||
if (tim->ttime != NO_TIME) return E_TIME_TWICE;
|
||||
tim->ttime = tok.val;
|
||||
tim->ttime_orig = tok.val;
|
||||
break;
|
||||
|
||||
case T_Delta:
|
||||
|
||||
@@ -3891,7 +3891,7 @@ int tz_set_tz(char const *tz)
|
||||
return r;
|
||||
}
|
||||
|
||||
static int tz_convert(int year, int month, int day,
|
||||
int tz_convert(int year, int month, int day,
|
||||
int hour, int minute,
|
||||
char const *src_tz, char const *tgt_tz,
|
||||
struct tm *tm)
|
||||
|
||||
@@ -2045,7 +2045,7 @@ FreeTrig(Trigger *t)
|
||||
FreeTrigInfoChain(t->infos);
|
||||
}
|
||||
if (t->tz) {
|
||||
free(t->tz);
|
||||
free( (void *) t->tz);
|
||||
}
|
||||
t->tz = NULL;
|
||||
t->infos = NULL;
|
||||
@@ -2080,6 +2080,7 @@ ClearLastTriggers(void)
|
||||
FreeTrig(&LastTrigger);
|
||||
|
||||
LastTimeTrig.ttime = NO_TIME;
|
||||
LastTimeTrig.ttime_orig = NO_TIME;
|
||||
LastTimeTrig.delta = NO_DELTA;
|
||||
LastTimeTrig.rep = NO_REP;
|
||||
LastTimeTrig.duration = NO_TIME;
|
||||
|
||||
@@ -297,3 +297,4 @@ void set_cloexec(int fd);
|
||||
int system_to_stderr(char const *cmd);
|
||||
int system1(char const *cmd);
|
||||
int tz_set_tz (char const *tz);
|
||||
int tz_convert(int year, int month, int day, int hour, int minute, char const *src_tz, char const *tgt_tz, struct tm *tm);
|
||||
|
||||
@@ -157,6 +157,7 @@ typedef struct {
|
||||
|
||||
/* A time trigger */
|
||||
typedef struct {
|
||||
int ttime_orig;
|
||||
int ttime;
|
||||
int nexttime;
|
||||
int delta;
|
||||
|
||||
Reference in New Issue
Block a user