Skip to content

Commit 1fdfa3f

Browse files
committed
email_lib: extract FREQ string parse from ical_parse_rrule into separate function
1 parent 51b745f commit 1fdfa3f

File tree

3 files changed

+40
-21
lines changed

3 files changed

+40
-21
lines changed

include/gromox/ical.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#define ICAL_NAME_LEN 64
1111

1212
enum class ical_frequency {
13-
second, minute, hour, day, week, month, year,
13+
second, minute, hour, day, week, month, year, invalid,
1414
};
1515

1616
enum class rrule_by {

lib/email/ical.cpp

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// SPDX-FileCopyrightText: 2021–2025 grommunio GmbH
33
// This file is part of Gromox.
44
#include <algorithm>
5+
#include <cassert>
56
#include <cerrno>
67
#include <cstdio>
78
#include <cstdlib>
@@ -1558,6 +1559,9 @@ static ical_time ical_next_rrule_itime(ical_rrule *pirrule,
15581559
case ical_frequency::second:
15591560
itime.add_second(req ? pirrule->interval : 1);
15601561
break;
1562+
default:
1563+
assert(false);
1564+
break;
15611565
}
15621566
return itime;
15631567
}
@@ -1693,6 +1697,9 @@ static ical_time ical_next_rrule_itime(ical_rrule *pirrule,
16931697
case ical_frequency::second:
16941698
itime.add_second(1);
16951699
break;
1700+
default:
1701+
assert(false);
1702+
break;
16961703
}
16971704
switch (pirrule->frequency) {
16981705
case ical_frequency::year:
@@ -1723,6 +1730,9 @@ static ical_time ical_next_rrule_itime(ical_rrule *pirrule,
17231730
if (itime.second > pirrule->base_itime.second)
17241731
itime = pirrule->next_base_itime;
17251732
break;
1733+
default:
1734+
assert(false);
1735+
return {};
17261736
}
17271737
return itime;
17281738
}
@@ -1768,9 +1778,25 @@ static void ical_next_rrule_base_itime(ical_rrule *pirrule)
17681778
case ical_frequency::second:
17691779
pirrule->next_base_itime.add_second(pirrule->interval);
17701780
break;
1781+
default:
1782+
assert(false);
1783+
return;
17711784
}
17721785
}
17731786

1787+
static enum ical_frequency parse_freq(const char *s)
1788+
{
1789+
if (s == nullptr) return ical_frequency::invalid;
1790+
else if (strcasecmp(s, "SECONDLY") == 0) return ical_frequency::second;
1791+
else if (strcasecmp(s, "MINUTELY") == 0) return ical_frequency::minute;
1792+
else if (strcasecmp(s, "HOURLY") == 0) return ical_frequency::hour;
1793+
else if (strcasecmp(s, "DAILY") == 0) return ical_frequency::day;
1794+
else if (strcasecmp(s, "WEEKLY") == 0) return ical_frequency::week;
1795+
else if (strcasecmp(s, "MONTHLY") == 0) return ical_frequency::month;
1796+
else if (strcasecmp(s, "YEARLY") == 0) return ical_frequency::year;
1797+
else return ical_frequency::invalid;
1798+
}
1799+
17741800
/*
17751801
* @ptz_component: if NULL, represents UTC
17761802
*
@@ -1781,27 +1807,11 @@ const char *ical_parse_rrule(const ical_component *ptz_component,
17811807
ical_rrule *pirrule)
17821808
{
17831809
*pirrule = {};
1784-
auto pvalue = ical_get_first_subvalue_by_name_internal(pvalue_list, "FREQ");
1785-
if (pvalue == nullptr)
1786-
return "E-2824: RRULE has no FREQ";
1787-
if (strcasecmp(pvalue, "SECONDLY") == 0)
1788-
pirrule->frequency = ical_frequency::second;
1789-
else if (strcasecmp(pvalue, "MINUTELY") == 0)
1790-
pirrule->frequency = ical_frequency::minute;
1791-
else if (strcasecmp(pvalue, "HOURLY") == 0)
1792-
pirrule->frequency = ical_frequency::hour;
1793-
else if (strcasecmp(pvalue, "DAILY") == 0)
1794-
pirrule->frequency = ical_frequency::day;
1795-
else if (strcasecmp(pvalue, "WEEKLY") == 0)
1796-
pirrule->frequency = ical_frequency::week;
1797-
else if (strcasecmp(pvalue, "MONTHLY") == 0)
1798-
pirrule->frequency = ical_frequency::month;
1799-
else if (strcasecmp(pvalue, "YEARLY") == 0)
1800-
pirrule->frequency = ical_frequency::year;
1801-
else
1802-
return "E-2825: RRULE has invalid FREQ";
1810+
pirrule->frequency = parse_freq(ical_get_first_subvalue_by_name_internal(pvalue_list, "FREQ"));
1811+
if (pirrule->frequency == ical_frequency::invalid)
1812+
return "E-2825";
18031813
pirrule->real_frequency = pirrule->frequency;
1804-
pvalue = ical_get_first_subvalue_by_name_internal(pvalue_list, "INTERVAL");
1814+
auto pvalue = ical_get_first_subvalue_by_name_internal(pvalue_list, "INTERVAL");
18051815
if (NULL == pvalue) {
18061816
pirrule->interval = 1;
18071817
} else {
@@ -2039,6 +2049,9 @@ const char *ical_parse_rrule(const ical_component *ptz_component,
20392049
return "E-2865";
20402050
}
20412051
break;
2052+
default:
2053+
assert(false);
2054+
return "E-2824";
20422055
}
20432056
for (const auto &pnv2 : *psetpos_list) {
20442057
long tmp_int = LONG_MIN;
@@ -2124,6 +2137,9 @@ const char *ical_parse_rrule(const ical_component *ptz_component,
21242137
if (pbysecond_list != nullptr)
21252138
itime.second = 0;
21262139
break;
2140+
default:
2141+
assert(false);
2142+
return nullptr;
21272143
}
21282144
pirrule->base_itime = itime;
21292145
ical_next_rrule_base_itime(pirrule);

lib/mapi/oxcical.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -599,6 +599,9 @@ static const char *oxcical_parse_rrule(const ical_component &tzcom,
599599
apr->recur_pat.pts.dayofmonth = tmp_int;
600600
}
601601
break;
602+
default:
603+
assert(false);
604+
return nullptr;
602605
}
603606
if (calendartype == CAL_HIJRI) {
604607
if (patterntype == rptMonth) {

0 commit comments

Comments
 (0)