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.

100 lines
2.7 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. time_t temp1 = mktime(&t);
  12. struct tm* temp2 = localtime(&temp1);
  13. return mktime(temp2);
  14. } else {
  15. std::cout << "Parse failed\n";
  16. return -1;
  17. }
  18. }
  19. Event::Event(icalcomponent* event_component, const std::string &file) {
  20. parse(event_component, file);
  21. }
  22. void Event::parse(icalcomponent* event_component, const std::string &file) {
  23. // TODO parse recurring events
  24. uid = icalcomponent_get_uid(event_component);
  25. dtstart = date_to_epoch(icaltime_as_ical_string(icalcomponent_get_dtstart(event_component)));
  26. dtend = date_to_epoch(icaltime_as_ical_string(icalcomponent_get_dtend(event_component)));
  27. summary = std::string(icalcomponent_get_summary(event_component));
  28. filename = file;
  29. parse_alarms(event_component);
  30. }
  31. void Event::parse_alarms(icalcomponent* event_component) {
  32. icalcomponent* c;
  33. for(c = icalcomponent_get_first_component(event_component, ICAL_VALARM_COMPONENT);
  34. c != 0;
  35. c = icalcomponent_get_next_component(event_component, ICAL_VALARM_COMPONENT))
  36. {
  37. alarms.push_back(Alarm(c, dtstart));
  38. }
  39. }
  40. std::string Event::get_uid() const {
  41. return uid;
  42. }
  43. std::string Event::get_summary() const {
  44. return summary;
  45. }
  46. uint32_t Event::get_dtstart() const {
  47. return dtstart;
  48. }
  49. uint32_t Event::get_dtend() const {
  50. return dtend;
  51. }
  52. //uint32_t Event::get_location() const {
  53. // return location;
  54. //}
  55. std::vector<Alarm> Event::get_alarms() const {
  56. return alarms;
  57. }
  58. std::vector<std::string> Event::get_db_row() const {
  59. return {db_safe(uid),
  60. db_safe(summary),
  61. db_safe(std::to_string(dtstart)),
  62. db_safe(std::to_string(dtend)),
  63. db_safe(filename)};
  64. }
  65. std::string Event::update_row_string() const {
  66. return "uid = '" + uid + "', " +
  67. "summary = '" + summary + "', " +
  68. "dtstart = '" + std::to_string(dtstart) + "', " +
  69. "dtend = '" + std::to_string(dtend) + "', " +
  70. "filename = '" + filename + "' ";
  71. }
  72. std::string Event::print() const {
  73. std::string s = "";
  74. s += "UID: " + uid + "\n";
  75. s += "DTSTART: " + std::to_string(dtstart) + "\n";
  76. s += "DTEND: " + std::to_string(dtend) + "\n";
  77. s += "SUMMARY: " + summary + "\n";
  78. s += std::to_string(alarms.size()) + " ALARMS:\n";
  79. for(auto const& a : alarms) {
  80. s += a.print();
  81. }
  82. return s;
  83. }
  84. }