diff --git a/autotests/conflictresolvertest.cpp b/autotests/conflictresolvertest.cpp index 8f6024b..1f2cc27 100644 --- a/autotests/conflictresolvertest.cpp +++ b/autotests/conflictresolvertest.cpp @@ -1,334 +1,334 @@ /* Copyright (C) 2010 Casey Link Copyright (C) 2009-2010 Klaralvdalens Datakonsult AB, a KDAB Group company This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "conflictresolvertest.h" #include "conflictresolver.h" #include #include #include #include #include using namespace IncidenceEditorNG; void ConflictResolverTest::insertAttendees() { for (const CalendarSupport::FreeBusyItem::Ptr &item : qAsConst(attendees)) { resolver->insertAttendee(item); } } void ConflictResolverTest::addAttendee(const QString &email, const KCalendarCore::FreeBusy::Ptr &fb, KCalendarCore::Attendee::Role role) { QString name = QStringLiteral("attendee %1").arg(attendees.count()); CalendarSupport::FreeBusyItem::Ptr item(new CalendarSupport::FreeBusyItem(KCalendarCore::Attendee(name, email, false, KCalendarCore::Attendee::Accepted, role), nullptr)); item->setFreeBusy(KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(*fb.data()))); attendees << item; } void ConflictResolverTest::initTestCase() { parent = new QWidget; init(); } void ConflictResolverTest::init() { base = QDateTime::currentDateTime().addDays(1); end = base.addSecs(10 * 60 * 60); resolver = new ConflictResolver(parent, parent); } void ConflictResolverTest::cleanup() { delete resolver; resolver = nullptr; attendees.clear(); } void ConflictResolverTest::simpleTest() { KCalendarCore::Period meeting(end.addSecs(-3 * 60 * 60), KCalendarCore::Duration(2 * 60 * 60)); addAttendee(QStringLiteral("albert@einstein.net"), KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << meeting))); insertAttendees(); static const int resolution = 15 * 60; resolver->setResolution(resolution); resolver->setEarliestDateTime(base); resolver->setLatestDateTime(end); resolver->findAllFreeSlots(); QVERIFY(resolver->availableSlots().size() == 2); KCalendarCore::Period first = resolver->availableSlots().at(0); QCOMPARE(first.start(), base); QCOMPARE(first.end(), meeting.start()); KCalendarCore::Period second = resolver->availableSlots().at(1); QEXPECT_FAIL("", "Got broken in revision f17b9a8c975588ad7cf4ce8b94ab8e32ac193ed8", Continue); QCOMPARE(second.start(), meeting.end().addSecs(resolution)); //add 15 minutes because the //free block doesn't start until //the next timeslot QCOMPARE(second.end(), end); } void ConflictResolverTest::stillPrettySimpleTest() { KCalendarCore::Period meeting1(base, KCalendarCore::Duration(2 * 60 * 60)); KCalendarCore::Period meeting2(base.addSecs(60 * 60), KCalendarCore::Duration(2 * 60 * 60)); KCalendarCore::Period meeting3(end.addSecs(-3 * 60 * 60), KCalendarCore::Duration(2 * 60 * 60)); addAttendee(QStringLiteral("john.f@kennedy.com"), KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << meeting1 << meeting3))); addAttendee(QStringLiteral("elvis@rock.com"), KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << meeting2 << meeting3))); addAttendee(QStringLiteral("albert@einstein.net"), KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << meeting3))); insertAttendees(); static const int resolution = 15 * 60; resolver->setResolution(resolution); resolver->setEarliestDateTime(base); resolver->setLatestDateTime(end); resolver->findAllFreeSlots(); QVERIFY(resolver->availableSlots().size() == 2); KCalendarCore::Period first = resolver->availableSlots().at(0); QEXPECT_FAIL("", "Got broken in revision f17b9a8c975588ad7cf4ce8b94ab8e32ac193ed8", Continue); QCOMPARE(first.start(), meeting2.end().addSecs(resolution)); QCOMPARE(first.end(), meeting3.start()); KCalendarCore::Period second = resolver->availableSlots().at(1); QEXPECT_FAIL("", "Got broken in revision f17b9a8c975588ad7cf4ce8b94ab8e32ac193ed8", Continue); QCOMPARE(second.start(), meeting3.end().addSecs(resolution)); //add 15 minutes because the //free block doesn't start until //the next timeslot QCOMPARE(second.end(), end); } #define _time(h, m) QDateTime(base.date(), QTime(h, m)) void ConflictResolverTest::akademy2010() { // based off akademy 2010 schedule // first event was at 9:30, so lets align our start time there base.setTime(QTime(9, 30)); end = base.addSecs(8 * 60 * 60); KCalendarCore::Period opening(_time(9, 30), _time(9, 45)); KCalendarCore::Period keynote(_time(9, 45), _time(10, 30)); KCalendarCore::Period sevenPrinciples(_time(10, 30), _time(11, 15)); KCalendarCore::Period commAsService(_time(10, 30), _time(11, 15)); KCalendarCore::Period kdeForums(_time(11, 15), _time(11, 45)); KCalendarCore::Period oviStore(_time(11, 15), _time(11, 45)); // 10 min break KCalendarCore::Period highlights(_time(12, 0), _time(12, 45)); KCalendarCore::Period styles(_time(12, 0), _time(12, 45)); KCalendarCore::Period wikimedia(_time(12, 45), _time(13, 15)); KCalendarCore::Period avalanche(_time(12, 45), _time(13, 15)); KCalendarCore::Period pimp(_time(13, 15), _time(13, 45)); KCalendarCore::Period direction(_time(13, 15), _time(13, 45)); // lunch 1 hr 25 min lunch KCalendarCore::Period blurr(_time(15, 15), _time(16, 00)); KCalendarCore::Period plasma(_time(15, 15), _time(16, 00)); // for ( int i = 1; i < 80; ++i ) { - // adds 80 people (adds the same 8 peopl 10 times) + // adds 80 people (adds the same 8 people 10 times) addAttendee(QStringLiteral("akademyattendee1@email.com"), KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << opening << keynote << oviStore << wikimedia << direction))); addAttendee(QStringLiteral("akademyattendee2@email.com"), KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << opening << keynote << commAsService << highlights << pimp))); addAttendee(QStringLiteral("akademyattendee3@email.com"), KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << opening << kdeForums << styles << pimp << plasma))); addAttendee(QStringLiteral("akademyattendee4@email.com"), KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << opening << keynote << oviStore << pimp << blurr))); addAttendee(QStringLiteral("akademyattendee5@email.com"), KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << keynote << oviStore << highlights << avalanche))); addAttendee(QStringLiteral("akademyattendee6@email.com"), KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << opening << keynote << commAsService << highlights))); addAttendee(QStringLiteral("akademyattendee7@email.com"), KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << opening << kdeForums << styles << avalanche << pimp << plasma))); addAttendee(QStringLiteral("akademyattendee8@email.com"), KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << opening << keynote << oviStore << wikimedia << blurr))); // } insertAttendees(); const int resolution = 5 * 60; resolver->setResolution(resolution); resolver->setEarliestDateTime(base); resolver->setLatestDateTime(end); // QBENCHMARK { resolver->findAllFreeSlots(); // } QVERIFY(resolver->availableSlots().size() == 3); QEXPECT_FAIL("", "Got broken in revision f17b9a8c975588ad7cf4ce8b94ab8e32ac193ed8", Abort); QCOMPARE(resolver->availableSlots().at(0).duration(), KCalendarCore::Duration(10 * 60)); QCOMPARE(resolver->availableSlots().at(1).duration(), KCalendarCore::Duration(1 * 60 * 60 + 25 * 60)); QVERIFY(resolver->availableSlots().at(2).start() > plasma.end()); } void ConflictResolverTest::testPeriodIsLargerThenTimeframe() { base.setDate(QDate(2010, 7, 29)); base.setTime(QTime(7, 30)); end.setDate(QDate(2010, 7, 29)); end.setTime(QTime(8, 30)); KCalendarCore::Period testEvent(_time(5, 45), _time(8, 45)); addAttendee(QStringLiteral("kdabtest1@demo.kolab.org"), KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << testEvent))); addAttendee(QStringLiteral("kdabtest2@demo.kolab.org"), KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List()))); insertAttendees(); resolver->setEarliestDateTime(base); resolver->setLatestDateTime(end); resolver->findAllFreeSlots(); QCOMPARE(resolver->availableSlots().size(), 0); } void ConflictResolverTest::testPeriodBeginsBeforeTimeframeBegins() { base.setDate(QDate(2010, 7, 29)); base.setTime(QTime(7, 30)); end.setDate(QDate(2010, 7, 29)); end.setTime(QTime(9, 30)); KCalendarCore::Period testEvent(_time(5, 45), _time(8, 45)); addAttendee(QStringLiteral("kdabtest1@demo.kolab.org"), KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << testEvent))); addAttendee(QStringLiteral("kdabtest2@demo.kolab.org"), KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List()))); insertAttendees(); resolver->setEarliestDateTime(base); resolver->setLatestDateTime(end); resolver->findAllFreeSlots(); QCOMPARE(resolver->availableSlots().size(), 1); KCalendarCore::Period freeslot = resolver->availableSlots().at(0); QCOMPARE(freeslot.start(), _time(8, 45)); QCOMPARE(freeslot.end(), end); } void ConflictResolverTest::testPeriodEndsAfterTimeframeEnds() { base.setDate(QDate(2010, 7, 29)); base.setTime(QTime(7, 30)); end.setDate(QDate(2010, 7, 29)); end.setTime(QTime(9, 30)); KCalendarCore::Period testEvent(_time(8, 00), _time(9, 45)); addAttendee(QStringLiteral("kdabtest1@demo.kolab.org"), KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << testEvent))); addAttendee(QStringLiteral("kdabtest2@demo.kolab.org"), KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List()))); insertAttendees(); resolver->setEarliestDateTime(base); resolver->setLatestDateTime(end); resolver->findAllFreeSlots(); QCOMPARE(resolver->availableSlots().size(), 1); KCalendarCore::Period freeslot = resolver->availableSlots().at(0); QCOMPARE(freeslot.duration(), KCalendarCore::Duration(30 * 60)); QCOMPARE(freeslot.start(), base); QCOMPARE(freeslot.end(), _time(8, 00)); } void ConflictResolverTest::testPeriodEndsAtSametimeAsTimeframe() { base.setDate(QDate(2010, 7, 29)); base.setTime(QTime(7, 45)); end.setDate(QDate(2010, 7, 29)); end.setTime(QTime(8, 45)); KCalendarCore::Period testEvent(_time(5, 45), _time(8, 45)); addAttendee(QStringLiteral("kdabtest1@demo.kolab.org"), KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << testEvent))); addAttendee(QStringLiteral("kdabtest2@demo.kolab.org"), KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List()))); insertAttendees(); resolver->setEarliestDateTime(base); resolver->setLatestDateTime(end); resolver->findAllFreeSlots(); QCOMPARE(resolver->availableSlots().size(), 0); } QTEST_MAIN(ConflictResolverTest) diff --git a/src/incidencedefaults.h b/src/incidencedefaults.h index 177744a..ea8e442 100644 --- a/src/incidencedefaults.h +++ b/src/incidencedefaults.h @@ -1,119 +1,119 @@ /* Copyright (C) 2010 Bertjan Broeksema Copyright (c) 2010 Klarälvdalens Datakonsult AB, a KDAB Group company This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef INCIDENCEEDITOR_INCIDENCEDEFAULTS_H #define INCIDENCEEDITOR_INCIDENCEDEFAULTS_H #include "incidenceeditor_export.h" #include namespace IncidenceEditorNG { class IncidenceDefaultsPrivate; /** * @brief The IncidenceDefaults class */ class INCIDENCEEDITOR_EXPORT IncidenceDefaults { public: explicit IncidenceDefaults(bool cleanupAttachmentTEmporaryFiles = false); IncidenceDefaults(const IncidenceDefaults &other); ~IncidenceDefaults(); IncidenceDefaults &operator=(const IncidenceDefaults &other); /** Sets the attachments that are added by default to incidences. */ void setAttachments(const QStringList &attachments, const QStringList &attachmentMimetypes = QStringList(), const QStringList &attachmentLabels = QStringList(), bool inlineAttachment = false); /** Sets the attendees that are added by default to incidences. @param attendees Expected to be of the form "name name " */ void setAttendees(const QStringList &attendees); /** Sets the list of identities to be used for the user. The items in the list are expected to be of the form: "name [name] ". If the list is empty, it is assumed that no valid identities are configured. @param fullEmails The list of name email pairs that the user has configured as identities. */ void setFullEmails(const QStringList &fullEmails); /** This is used to do a smarter guess about which identity to use for the organizer. - If the groupware server is not set, the first avaialble identity will be used. + If the groupware server is not set, the first available identity will be used. @param domain The gropuware server domain name without any protocol prefixes (e.g. demo.kolab.org). */ void setGroupWareDomain(const QString &domain); /** Sets the incidence related to the incidence for which to set the defaults. For example the parent todo of a new sub todo. */ void setRelatedIncidence(const KCalendarCore::Incidence::Ptr &incidence); /** Set the start date/time to use for passed incidences. This defaults to the current start date/time. The main purpose of this method is supporting defaults for new incidences that where created with a given time slot. @param startDT The start date time to set on the incidence. */ void setStartDateTime(const QDateTime &startDT); /** Set the end date/time to use for passed incidences. This defaults to the current start date/time. The main purpose of this method is supporting defaults for new incidences that where created with a given time slot. @param endDT The start date time to set on the incidence. */ void setEndDateTime(const QDateTime &endDT); /** Sets the default values for @param incidence. This method is merely meant for new incidences. However, it will clear out all fields and set them to default values. @param incidence The incidence that will get default values for all of its field. */ void setDefaults(const KCalendarCore::Incidence::Ptr &incidence) const; /** * Returns minimal incidence defaults: e-mails and groupware domain. * * TODO: See if this is always called when using IncidenceDefaults. * If yes, this should be done inside ctor. */ Q_REQUIRED_RESULT static IncidenceDefaults minimalIncidenceDefaults(bool cleanupAttachmentTempFiles = false); // Returns the e-mail address used for the organizer when we can't find anything useful // This is something like "invalid@invalid" Q_REQUIRED_RESULT static QString invalidEmailAddress(); private: IncidenceDefaultsPrivate *const d_ptr; Q_DECLARE_PRIVATE(IncidenceDefaults) }; } #endif diff --git a/src/resourceitem.h b/src/resourceitem.h index 2cccfa5..fa5fad2 100644 --- a/src/resourceitem.h +++ b/src/resourceitem.h @@ -1,130 +1,130 @@ /* * Copyright 2014 Sandro Knauß * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License or (at your option) version 3 or any later version * accepted by the membership of KDE e.V. (or its successor approved * by the membership of KDE e.V.), which shall act as a proxy * defined in Section 14 of version 3 of the license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #ifndef RESOURCEITEM_H #define RESOURCEITEM_H #include #include #include #include #include #include namespace IncidenceEditorNG { class ResourceItem : public QObject { Q_OBJECT public: - /* Copied from http://qt-project.org/doc/qt-4.8/itemviews-editabletreemodel.html: - * QT 4.8: Editable Tree Model Example + /* Copied from https://doc.qt.io/qt-5/qtwidgets-itemviews-editabletreemodel-example.html: + * Editable Tree Model Example */ /** A shared pointer to an ResourceItem object. */ typedef QSharedPointer Ptr; ResourceItem(const KLDAP::LdapDN &dn, const QStringList &attrs, const KLDAP::LdapClient &ldapClient, const ResourceItem::Ptr &parent = ResourceItem::Ptr()); ~ResourceItem(); Q_REQUIRED_RESULT ResourceItem::Ptr child(int number); Q_REQUIRED_RESULT int childCount() const; Q_REQUIRED_RESULT int columnCount() const; Q_REQUIRED_RESULT QVariant data(int column) const; Q_REQUIRED_RESULT QVariant data(const QString &column) const; Q_REQUIRED_RESULT bool insertChild(int position, const ResourceItem::Ptr &item); Q_REQUIRED_RESULT ResourceItem::Ptr parent(); Q_REQUIRED_RESULT bool removeChildren(int position, int count); Q_REQUIRED_RESULT int childNumber() const; private: QList childItems; QVector itemData; ResourceItem::Ptr parentItem; Q_SIGNALS: void searchFinished(); public: /* Returns the attributes of the requested ldapObject. * */ const QStringList &attributes() const; /* Returns the ldapObject, that is used as data source. * */ const KLDAP::LdapObject &ldapObject() const; /* Set the ldapObject, either directly via this function * or use startSearch to request the ldapServer for the ldapObject * with the dn specified via the constructor. * */ void setLdapObject(const KLDAP::LdapObject &); /* The used ldapClient. * */ const KLDAP::LdapClient &ldapClient() const; /* Start querying the ldapServer for a object that name is dn * */ void startSearch(); private: /* data source * */ KLDAP::LdapObject mLdapObject; /* dn of the ldapObject * */ const KLDAP::LdapDN dn; /* Attributes of the ldapObject to request and the header of the Item * */ QStringList mAttrs; /* ldapClient to request * */ KLDAP::LdapClient mLdapClient; private: /* Answer of the LdapServer for the given dn * */ void slotLDAPResult(const KLDAP::LdapClient &, const KLDAP::LdapObject &); }; } //@cond PRIVATE Q_DECLARE_TYPEINFO(IncidenceEditorNG::ResourceItem::Ptr, Q_MOVABLE_TYPE); Q_DECLARE_METATYPE(IncidenceEditorNG::ResourceItem::Ptr) //@endcond #endif // RESOURCEITEM_H diff --git a/src/resourcemodel.h b/src/resourcemodel.h index abd086a..f85e36c 100644 --- a/src/resourcemodel.h +++ b/src/resourcemodel.h @@ -1,128 +1,128 @@ /* * Copyright 2014 Sandro Knauß * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License or (at your option) version 3 or any later version * accepted by the membership of KDE e.V. (or its successor approved * by the membership of KDE e.V.), which shall act as a proxy * defined in Section 14 of version 3 of the license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #ifndef RESOURCEMODEL_H #define RESOURCEMODEL_H #include "resourceitem.h" #include #include #include #include namespace IncidenceEditorNG { class ResourceModel : public QAbstractItemModel { Q_OBJECT public: - /* Copied from http://qt-project.org/doc/qt-4.8/itemviews-editabletreemodel.html: - * QT 4.8: Editable Tree Model Example + /* Copied from https://doc.qt.io/qt-5/qtwidgets-itemviews-editabletreemodel-example.html: + * Editable Tree Model Example */ enum Roles { Resource = Qt::UserRole, FullName }; explicit ResourceModel(const QStringList &headers, QObject *parent = nullptr); ~ResourceModel() override; Q_REQUIRED_RESULT QVariant data(const QModelIndex &index, int role) const override; Q_REQUIRED_RESULT QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; Q_REQUIRED_RESULT QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override; Q_REQUIRED_RESULT QModelIndex parent(const QModelIndex &index) const override; Q_REQUIRED_RESULT int rowCount(const QModelIndex &parent = QModelIndex()) const override; Q_REQUIRED_RESULT int columnCount(const QModelIndex &parent = QModelIndex()) const override; Q_REQUIRED_RESULT Qt::ItemFlags flags(const QModelIndex &index) const override; Q_REQUIRED_RESULT bool removeRows(int position, int rows, const QModelIndex &parent = QModelIndex()) override; private: ResourceItem *getItem(const QModelIndex &index) const; ResourceItem::Ptr rootItem; public: /* Start search on LDAP Server with the given string. * If the model is not ready to search, the string is cached and is executed afterwards. */ void startSearch(const QString &); private: /* Start search with cached string (stored in searchString) * */ void startSearch(); /* Search for collections of resources * */ KLDAP::LdapClientSearch ldapSearchCollections; /* Search for matching resources * */ KLDAP::LdapClientSearch ldapSearch; /* Map from dn of resource -> collectionItem * A Resource can be part of different collection, so a QMuliMap is needed * */ QMultiMap ldapCollectionsMap; /* A Set of all collection ResourceItems * */ QSet ldapCollections; /* Cached searchString (set by startSearch(QString)) * */ QString searchString; /* Is the search of collections ended * */ bool foundCollection; /* List of all attributes in LDAP an the headers of the model * */ QStringList headers; private: /* Slot for founded collections * */ void slotLDAPCollectionData(const KLDAP::LdapResultObject::List &); /* Slot for matching resources * */ void slotLDAPSearchData(const KLDAP::LdapResultObject::List &); }; } #endif // RESOURCEMODEL_H