#include #include #include #include namespace ical { uint32_t date_to_epoch(const std::string &dt) { //TODO somewhat hacky as libical should be able to provide us with correct timezone/daylight offsets.... std::tm t = {}; std::istringstream ss(dt); if (ss >> std::get_time(&t, "%Y%m%dT%H%M%S")) { time_t temp1 = mktime(&t); struct tm* temp2 = gmtime(&temp1); return mktime(temp2); } else { std::cout << "Parse failed\n"; return -1; } } Event::Event(icalcomponent* event_component) { parse(event_component); } void Event::parse(icalcomponent* event_component) { uid = icalcomponent_get_uid(event_component); dtstart = date_to_epoch(icaltime_as_ical_string(icalcomponent_get_dtstart(event_component))); dtend = date_to_epoch(icaltime_as_ical_string(icalcomponent_get_dtend(event_component))); summary = std::string(icalcomponent_get_summary(event_component)); parse_alarms(event_component); } void Event::parse_alarms(icalcomponent* event_component) { icalcomponent* c; for(c = icalcomponent_get_first_component(event_component, ICAL_VALARM_COMPONENT); c != 0; c = icalcomponent_get_next_component(event_component, ICAL_VALARM_COMPONENT)) { alarms.push_back(Alarm(c, dtstart)); } } std::string Event::get_uid() const { return uid; } std::string Event::get_summary() const { return summary; } uint32_t Event::get_dtstart() const { return dtstart; } uint32_t Event::get_dtend() const { return dtend; } std::vector Event::get_alarms() const { return alarms; } std::vector Event::get_db_row() const { return {db_safe(uid), db_safe(summary), db_safe(std::to_string(dtstart)), db_safe(std::to_string(dtend))}; } std::string Event::print() const { std::string s = ""; s += "UID: " + uid + "\n"; s += "DTSTART: " + std::to_string(dtstart) + "\n"; s += "DTEND: " + std::to_string(dtend) + "\n"; s += "SUMMARY: " + summary + "\n"; s += std::to_string(alarms.size()) + " ALARMS:\n"; for(auto const& a : alarms) { s += a.print(); } return s; } }