summaryrefslogtreecommitdiff
path: root/rockworkd/platformintegration/ubuntu/organizeradapter.cpp
blob: 9d697ca98810d445892520bb4e35de217a8f7ac7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include "organizeradapter.h"

#include <QOrganizerItemFetchRequest>
#include <QDebug>
#include <QOrganizerEventOccurrence>
#include <QOrganizerItemDetail>

QTORGANIZER_USE_NAMESPACE

#define MANAGER           "eds"
#define MANAGER_FALLBACK  "memory"

OrganizerAdapter::OrganizerAdapter(QObject *parent) : QObject(parent)
{
    QString envManager(qgetenv("ALARM_BACKEND"));
    if (envManager.isEmpty())
        envManager = MANAGER;
    if (!QOrganizerManager::availableManagers().contains(envManager)) {
        envManager = MANAGER_FALLBACK;
    }
    m_manager = new QOrganizerManager(envManager);
    m_manager->setParent(this);
    connect(m_manager, &QOrganizerManager::dataChanged, this, &OrganizerAdapter::refresh);
}

void OrganizerAdapter::refresh()
{
    QList<CalendarEvent> items;
    foreach (const QOrganizerItem &item, m_manager->items()) {
        QOrganizerEvent organizerEvent(item);
        if (organizerEvent.displayLabel().isEmpty()) {
            continue;
        }
        CalendarEvent event;
        event.setId(organizerEvent.id().toString());
        event.setTitle(organizerEvent.displayLabel());
        event.setDescription(organizerEvent.description());
        event.setStartTime(organizerEvent.startDateTime());
        event.setEndTime(organizerEvent.endDateTime());
        event.setLocation(organizerEvent.location());
        event.setComment(organizerEvent.comments().join(";"));
        event.setIsAllDay(organizerEvent.isAllDay());
        // on allDay events, the time portion of QDateTime is not valid. let's fix that
        if (organizerEvent.isAllDay() && !organizerEvent.startDateTime().isValid() && organizerEvent.startDateTime().date().isValid()) {
            QDateTime fixedStartTime;
            fixedStartTime.setTime(QTime(12, 0));
            fixedStartTime.setDate(organizerEvent.startDateTime().date());
            event.setStartTime(fixedStartTime);
        }

        QStringList attendees;
        foreach (const QOrganizerItemDetail &attendeeDetail, organizerEvent.details(QOrganizerItemDetail::TypeEventAttendee)) {
            attendees.append(attendeeDetail.value(QOrganizerItemDetail::TypeEventAttendee + 1).toString());
        }
        event.setGuests(attendees);
        event.setRecurring(organizerEvent.recurrenceRules().count() > 0);

        items.append(event);

        quint64 startTimestamp = QDateTime::currentMSecsSinceEpoch();
        startTimestamp -= (1000 * 60 * 60 * 24 * 7);

        foreach (const QOrganizerItem &occurranceItem, m_manager->itemOccurrences(item, QDateTime::fromMSecsSinceEpoch(startTimestamp), QDateTime::currentDateTime().addDays(7))) {
            QOrganizerEventOccurrence organizerOccurrance(occurranceItem);
            event.generateNewUuid();
            event.setId(organizerOccurrance.id().toString());
            event.setStartTime(organizerOccurrance.startDateTime());
            event.setEndTime(organizerOccurrance.endDateTime());
            items.append(event);
        }
    }

    if (m_items != items) {
        m_items = items;
        emit itemsChanged(m_items);
    }

}

QList<CalendarEvent> OrganizerAdapter::items() const
{
    return m_items;
}