You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
2.2 KiB

  1. #include <iomanip>
  2. #include <ical/Event.h>
  3. #include <ical/Alarm.h>
  4. #include <db/db.h>
  5. namespace ical {
  6. uint32_t date_to_epoch(const std::string &dt) {
  7. //TODO somewhat hacky as libical should be able to provide us with correct timezone/daylight offsets....
  8. std::tm t = {};
  9. std::istringstream ss(dt);
  10. if (ss >> std::get_time(&t, "%Y%m%dT%H%M%S"))
  11. {
  12. time_t temp1 = mktime(&t);
  13. struct tm* temp2 = gmtime(&temp1);
  14. return mktime(temp2);
  15. }
  16. else
  17. {
  18. std::cout << "Parse failed\n";
  19. return -1;
  20. }
  21. }
  22. Event::Event(icalcomponent* event_component) {
  23. parse(event_component);
  24. }
  25. void Event::parse(icalcomponent* event_component) {
  26. uid = icalcomponent_get_uid(event_component);
  27. dtstart = date_to_epoch(icaltime_as_ical_string(icalcomponent_get_dtstart(event_component)));
  28. dtend = date_to_epoch(icaltime_as_ical_string(icalcomponent_get_dtend(event_component)));
  29. summary = std::string(icalcomponent_get_summary(event_component));
  30. parse_alarms(event_component);
  31. }
  32. void Event::parse_alarms(icalcomponent* event_component) {
  33. icalcomponent* c;
  34. for(c = icalcomponent_get_first_component(event_component, ICAL_VALARM_COMPONENT);
  35. c != 0;
  36. c = icalcomponent_get_next_component(event_component, ICAL_VALARM_COMPONENT))
  37. {
  38. alarms.push_back(Alarm(c, dtstart));
  39. }
  40. }
  41. std::string Event::get_uid() const {
  42. return uid;
  43. }
  44. std::string Event::get_summary() const {
  45. return summary;
  46. }
  47. uint32_t Event::get_dtstart() const {
  48. return dtstart;
  49. }
  50. uint32_t Event::get_dtend() const {
  51. return dtend;
  52. }
  53. std::vector<Alarm> Event::get_alarms() const {
  54. return alarms;
  55. }
  56. std::vector<std::string> Event::get_db_row() const {
  57. return {db_safe(uid),
  58. db_safe(summary),
  59. db_safe(std::to_string(dtstart)),
  60. db_safe(std::to_string(dtend))};
  61. }
  62. std::string Event::print() const {
  63. std::string s = "";
  64. s += "UID: " + uid + "\n";
  65. s += "DTSTART: " + std::to_string(dtstart) + "\n";
  66. s += "DTEND: " + std::to_string(dtend) + "\n";
  67. s += "SUMMARY: " + summary + "\n";
  68. s += std::to_string(alarms.size()) + " ALARMS:\n";
  69. for(auto const& a : alarms) {
  70. s += a.print();
  71. }
  72. return s;
  73. }
  74. }