qtmobility/src/messaging/qmessagefolderfilter_win.cpp
changeset 1 2b40d63a9c3d
child 11 06b8e2af4411
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/qtmobility/src/messaging/qmessagefolderfilter_win.cpp	Fri Apr 16 15:51:22 2010 +0300
@@ -0,0 +1,606 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Qt Mobility Components.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#include "qmessagefolderfilter.h"
+#include "qmessagefolderfilter_p.h"
+
+QTM_BEGIN_NAMESPACE
+
+QMessageFolderFilterPrivate::QMessageFolderFilterPrivate(QMessageFolderFilter *folderFilter)
+    : q_ptr(folderFilter),
+      _operator(Identity),
+      _criterion(None),
+      _equality(QMessageDataComparator::Equal),
+      _inclusion(QMessageDataComparator::Includes),
+      _matchFlags(0),
+      _valid(true),
+      _accountFilter(0),
+      _folderFilter(0)
+{
+}
+
+QMessageFolderFilterPrivate::~QMessageFolderFilterPrivate()
+{
+    foreach(QMessageFolderFilter* filter, _arguments) {
+        delete filter;
+    }
+    _arguments.clear();
+    delete _accountFilter;
+    _accountFilter = 0;
+    delete _folderFilter;
+    _folderFilter = 0;
+}
+
+QMessageFolderFilterPrivate& QMessageFolderFilterPrivate::operator=(const QMessageFolderFilterPrivate &other)
+{
+    _operator = other._operator;
+    _criterion = other._criterion;
+    _ids = other._ids;
+    _accountIds = other._accountIds;
+    _value = other._value;
+    _equality = other._equality;
+    _inclusion = other._inclusion;
+    _matchFlags = other._matchFlags;
+    _valid = other._valid;
+    foreach(QMessageFolderFilter* filter, _arguments) {
+        delete filter;
+    }
+    _arguments.clear();
+    foreach(QMessageFolderFilter* _filter, other._arguments) {
+        _arguments.append(new QMessageFolderFilter(*_filter));
+    }
+
+    delete _accountFilter;
+    _accountFilter = 0;
+    if (other._accountFilter)
+        _accountFilter = new QMessageAccountFilter(*other._accountFilter);
+    delete _folderFilter;
+    _folderFilter = 0;
+    if (other._folderFilter)
+        _folderFilter = new QMessageFolderFilter(*other._folderFilter);
+
+    return *this;
+}
+
+bool QMessageFolderFilterPrivate::operator==(const QMessageFolderFilterPrivate &other) const
+{
+    if  ((_operator != other._operator) ||
+         (_criterion != other._criterion) ||
+         (_ids != other._ids) ||
+         (_accountIds != other._accountIds) ||
+         (_value != other._value) ||
+         (_equality != other._equality) ||
+         (_inclusion != other._inclusion) ||
+         (_matchFlags != other._matchFlags)) {
+             return false;
+    }
+    if (_arguments.count() != other._arguments.count())
+        return false;
+    for(int i = 0; i < _arguments.count(); ++i) {
+        if (*_arguments[i] != *other._arguments[i]) {
+            return false;
+        }
+    }
+    if (_accountFilter || other._accountFilter) {
+        if (!_accountFilter || !other._accountFilter || (*_accountFilter != *other._accountFilter)) {
+            return false;
+        }
+    }
+    if (_folderFilter || other._folderFilter) {
+        if (!_folderFilter || !other._folderFilter || (*_folderFilter != *other._folderFilter)) {
+            return false;
+        }
+    }
+    return true;
+}
+
+bool QMessageFolderFilterPrivate::matchesFolder(const QMessageFolderFilter &filter, const MapiFolderPtr &folder)
+{
+    Qt::CaseSensitivity caseSensitivity(Qt::CaseInsensitive);
+    if (filter.matchFlags() & QMessageDataComparator::MatchCaseSensitive)
+        caseSensitivity = Qt::CaseSensitive;
+
+    QMessageFolderFilterPrivate *f(filter.d_ptr);
+    bool result;
+    bool negate(false);
+    switch (f->_operator) {
+    case Not: // fall through
+    case Nand: // fall through
+    case Nor:
+        negate = true;
+        break;
+    default:
+        break;
+    } // switch
+
+    switch (f->_operator) {
+    case Identity: // fall through
+    case Not: {
+        QMessageFolderFilterPrivate *f(filter.d_ptr);
+
+        if ((f->_criterion == IdEquality) || (f->_criterion == IdInclusion)) {
+            QMessageFolderId folderId(folder->id());
+
+            if (f->_criterion == IdEquality) {
+                bool idEqual(folderId == *f->_ids.begin());
+                result = (f->_equality == QMessageDataComparator::Equal ? idEqual : !idEqual);
+            } else {
+                bool idPresent(f->_ids.contains(folderId));
+                result = (f->_inclusion == QMessageDataComparator::Includes ? idPresent : !idPresent);
+            }
+        } else if ((f->_criterion == NameEquality) || (f->_criterion == NameInclusion)) {
+            QString folderName(folder->name());
+
+            if (f->_criterion == NameEquality) {
+                bool nameEqual(QString::compare(folderName, f->_value, caseSensitivity) == 0);
+                result = (f->_equality == QMessageDataComparator::Equal ? nameEqual : !nameEqual);
+            } else {
+                bool namePartialMatch(folderName.contains(f->_value, caseSensitivity));
+                result = (f->_inclusion == QMessageDataComparator::Includes ? namePartialMatch : !namePartialMatch);
+            }
+        } else if ((f->_criterion == PathEquality) || (f->_criterion == PathInclusion)) {
+            QString folderPath(QMessageFolder(folder->id()).path());
+
+            if (f->_criterion == PathEquality) {
+                bool pathEqual(QString::compare(folderPath, f->_value, caseSensitivity) == 0);
+                result = (f->_equality == QMessageDataComparator::Equal ? pathEqual : !pathEqual);
+            } else {
+                bool pathPartialMatch(folderPath.contains(f->_value, caseSensitivity));
+                result = (f->_inclusion == QMessageDataComparator::Includes ? pathPartialMatch : !pathPartialMatch);
+            }
+        } else if ((f->_criterion == AccountEquality) || (f->_criterion == AccountInclusion)) {
+            QMessageAccountId accountId(folder->accountId());
+
+            if (f->_criterion == AccountEquality) {
+                bool idEqual(accountId == *f->_accountIds.begin());
+                result = (f->_equality == QMessageDataComparator::Equal ? idEqual : !idEqual);
+            } else {
+                bool idPresent(f->_accountIds.contains(accountId));
+                result = (f->_inclusion == QMessageDataComparator::Includes ? idPresent : !idPresent);
+            }
+        } else if ((f->_criterion == ParentEquality) || (f->_criterion == ParentInclusion)) {
+            QMessageFolderId parentId(folder->parentId());
+
+            if (f->_criterion == ParentEquality) {
+                bool idEqual(parentId == *f->_ids.begin());
+                result = (f->_equality == QMessageDataComparator::Equal ? idEqual : !idEqual);
+            } else {
+                bool idPresent(f->_ids.contains(parentId));
+                result = (f->_inclusion == QMessageDataComparator::Includes ? idPresent : !idPresent);
+            }
+        } else if (f->_criterion == AncestorInclusion) {
+            QSet<QMessageFolderId> ancestorIds(folder->ancestorIds().toSet());
+            bool idIncluded(ancestorIds.intersect(f->_ids).isEmpty() == false);
+            result = (f->_inclusion == QMessageDataComparator::Includes ? idIncluded : !idIncluded);
+        } else { // None
+            result = (f->_equality == QMessageDataComparator::Equal);
+        }
+        break;
+    }
+    case And: // fall through
+    case Nand: {
+        result = true;
+        Q_ASSERT(f->_arguments.count());
+        foreach(QMessageFolderFilter *subfilter, f->_arguments) {
+            if (!f->matchesFolder(*subfilter, folder)) {
+                result = false;
+                break;
+            }
+        }
+        break;
+    }
+    case Or: // fall through
+    case Nor: {
+        result = false;
+        Q_ASSERT(f->_arguments.count());
+        foreach(QMessageFolderFilter *subfilter, f->_arguments) {
+            if (f->matchesFolder(*subfilter, folder)) {
+                result = true;
+                break;
+            }
+        }
+        break;
+    }
+    } // switch
+
+    if (negate)
+        result = !result;
+    return result;
+}
+
+QMessageFolderFilter QMessageFolderFilterPrivate::preprocess(QMessageManager::Error *error, MapiSessionPtr session, const QMessageFolderFilter &filter)
+{
+    QMessageFolderFilter result(filter);
+    QMessageFolderFilterPrivate::preprocess(error, session, &result);
+    return result;
+}
+
+void QMessageFolderFilterPrivate::preprocess(QMessageManager::Error *error, MapiSessionPtr session, QMessageFolderFilter *filter)
+{
+    if (!filter)
+        return;
+
+    bool inclusion(filter->d_ptr->_inclusion == QMessageDataComparator::Includes);
+    QMessageFolderFilter result;
+    if (inclusion) {
+        result = ~QMessageFolderFilter();
+    }
+    if (filter->d_ptr->_criterion == ParentAccountFilter) {
+        QList<MapiStorePtr> stores(session->filterStores(error, *filter->d_ptr->_accountFilter));
+        foreach(MapiStorePtr store, stores) {
+            if (inclusion) {
+                result |= QMessageFolderFilter::byParentAccountId(store->id());
+            } else {
+                result &= QMessageFolderFilter::byParentAccountId(store->id(), QMessageDataComparator::NotEqual);
+            }
+        }
+    } else if (filter->d_ptr->_criterion == ParentFolderFilter) {
+        QList<MapiFolderPtr> folders(session->filterFolders(error, *filter->d_ptr->_folderFilter));
+        foreach(MapiFolderPtr folder, folders) {
+            if (inclusion) {
+                result |= QMessageFolderFilter::byParentFolderId(folder->id());
+            } else {
+                result &= QMessageFolderFilter::byParentFolderId(folder->id(), QMessageDataComparator::NotEqual);
+            }
+        }
+    } else if (filter->d_ptr->_criterion == AncestorFolderFilter) {
+        QList<MapiFolderPtr> folders(session->filterFolders(error, *filter->d_ptr->_folderFilter));
+        foreach(MapiFolderPtr folder, folders) {
+            if (inclusion) {
+                result |= QMessageFolderFilter::byAncestorFolderIds(folder->id());
+            } else {
+                result &= QMessageFolderFilter::byAncestorFolderIds(folder->id(), QMessageDataComparator::Excludes);
+            }
+        }
+    } else {
+        foreach(QMessageFolderFilter *subfilter, filter->d_ptr->_arguments) {
+            preprocess(error, session, subfilter);
+        }
+        return;
+    }
+    if (filter->d_ptr->_operator == Not) // must be Not or Identity
+        result = ~result;
+    *filter = result;
+}
+
+QMessageFolderFilter::QMessageFolderFilter()
+    : d_ptr(new QMessageFolderFilterPrivate(this))
+{
+}
+
+QMessageFolderFilter::QMessageFolderFilter(const QMessageFolderFilter &other)
+    : d_ptr(new QMessageFolderFilterPrivate(this))
+{
+    this->operator=(other);
+}
+
+QMessageFolderFilter::~QMessageFolderFilter()
+{
+    delete d_ptr;
+}
+
+QMessageFolderFilter& QMessageFolderFilter::operator=(const QMessageFolderFilter& other)
+{
+    *d_ptr = *other.d_ptr;
+    return *this;
+}
+
+void QMessageFolderFilter::setMatchFlags(QMessageDataComparator::MatchFlags matchFlags)
+{
+    d_ptr->_matchFlags = matchFlags;
+    d_ptr->_valid = true;
+    if (d_ptr->_matchFlags & QMessageDataComparator::MatchFullWord)
+        d_ptr->_valid = false; // Not supported
+    foreach(QMessageFolderFilter *subfilter, d_ptr->_arguments) {
+        subfilter->setMatchFlags(matchFlags);
+    }
+}
+
+QMessageDataComparator::MatchFlags QMessageFolderFilter::matchFlags() const
+{
+    return d_ptr->_matchFlags;
+}
+
+bool QMessageFolderFilter::isEmpty() const
+{
+    return ((d_ptr->_operator == QMessageFolderFilterPrivate::Identity) &&
+            (d_ptr->_criterion == QMessageFolderFilterPrivate::None) && 
+            (d_ptr->_equality == QMessageDataComparator::Equal));
+}
+
+bool QMessageFolderFilterPrivate::isNonMatching(const QMessageFolderFilter &filter)
+{
+    return ((filter.d_ptr->_operator == QMessageFolderFilterPrivate::Not) &&
+            (filter.d_ptr->_criterion == QMessageFolderFilterPrivate::None) && 
+            (filter.d_ptr->_equality == QMessageDataComparator::Equal));
+}
+
+bool QMessageFolderFilter::isSupported() const
+{
+    return d_ptr->_valid;
+}
+
+QMessageFolderFilter QMessageFolderFilter::operator~() const
+{
+    QMessageFolderFilter result(*this);
+    int op = static_cast<int>(d_ptr->_operator) + static_cast<int>(QMessageFolderFilterPrivate::Not);
+    op = op % static_cast<int>(QMessageFolderFilterPrivate::OperatorEnd);
+    result.d_ptr->_operator = static_cast<QMessageFolderFilterPrivate::Operator>(op);
+    return result;
+}
+
+QMessageFolderFilter QMessageFolderFilter::operator&(const QMessageFolderFilter& other) const
+{
+    QMessageFolderFilter result(*this);
+    result &= other;
+    return result;
+}
+
+QMessageFolderFilter QMessageFolderFilter::operator|(const QMessageFolderFilter& other) const
+{
+    QMessageFolderFilter result(*this);
+    result |= other;
+    return result;
+}
+
+const QMessageFolderFilter& QMessageFolderFilter::operator&=(const QMessageFolderFilter& other)
+{
+    if (!d_ptr->_valid || !other.d_ptr->_valid) {
+        QMessageFolderFilter result;
+        result.d_ptr->_valid = false;
+        *this = result;
+        return *this;
+    }
+
+    if (&other == this)
+        return *this;
+    if (isEmpty()) {
+        *this = other;
+        return *this;
+    }
+    if (other.isEmpty())
+        return *this;
+    if (QMessageFolderFilterPrivate::isNonMatching(*this)) {
+        return *this;
+    }
+    if (QMessageFolderFilterPrivate::isNonMatching(other)) {
+        *this = other;
+        return *this;
+    }
+
+    if (d_ptr->_operator != QMessageFolderFilterPrivate::And) {
+        QMessageFolderFilter result;
+        result.d_ptr->_operator = QMessageFolderFilterPrivate::And;
+        result.d_ptr->_arguments.append(new QMessageFolderFilter(*this));
+        *this = result;
+    }
+    d_ptr->_arguments.append(new QMessageFolderFilter(other));
+    return *this;
+}
+
+const QMessageFolderFilter& QMessageFolderFilter::operator|=(const QMessageFolderFilter& other)
+{
+    if (!d_ptr->_valid || !other.d_ptr->_valid) {
+        QMessageFolderFilter result;
+        result.d_ptr->_valid = false;
+        *this = result;
+        return *this;
+    }
+
+    if (&other == this)
+        return *this;
+    if (isEmpty())
+        return *this;
+    if (other.isEmpty()) {
+        *this = other;
+        return *this;
+    }
+    if (QMessageFolderFilterPrivate::isNonMatching(*this)) {
+        *this = other;
+        return *this;
+    }
+    if (QMessageFolderFilterPrivate::isNonMatching(other)) {
+        return *this;
+    }
+
+    if (d_ptr->_operator != QMessageFolderFilterPrivate::Or) {
+        QMessageFolderFilter result;
+        result.d_ptr->_operator = QMessageFolderFilterPrivate::Or;
+        result.d_ptr->_arguments.append(new QMessageFolderFilter(*this));
+        *this = result;
+    }
+    d_ptr->_arguments.append(new QMessageFolderFilter(other));
+    return *this;
+}
+
+bool QMessageFolderFilter::operator==(const QMessageFolderFilter& other) const
+{
+    return (*d_ptr == *other.d_ptr);
+}
+
+QMessageFolderFilter QMessageFolderFilter::byId(const QMessageFolderId &id, QMessageDataComparator::EqualityComparator cmp)
+{
+    if (!id.isValid()) {
+        QMessageFolderFilter result(~QMessageFolderFilter()); // non-matching
+        if (QMessageDataComparator::NotEqual == cmp) {
+            result = ~result;
+        }
+        return result;
+    }
+
+    QMessageFolderFilter result;
+    result.d_ptr->_ids.insert(id);
+    result.d_ptr->_equality = cmp;
+    result.d_ptr->_criterion = QMessageFolderFilterPrivate::IdEquality;
+    return result;
+}
+
+QMessageFolderFilter QMessageFolderFilter::byId(const QMessageFolderIdList &ids, QMessageDataComparator::InclusionComparator cmp)
+{
+    QMessageFolderIdList validIds;
+    foreach(QMessageFolderId id, ids) {
+        if (id.isValid()) {
+            validIds.append(id);
+        }
+    }
+    if (validIds.isEmpty()) {
+        QMessageFolderFilter result(~QMessageFolderFilter()); // non-matching
+        if (QMessageDataComparator::Excludes == cmp) {
+            result = ~result;
+        }
+        return result;
+    }
+
+    QMessageFolderFilter result;
+    result.d_ptr->_ids = validIds.toSet();
+    result.d_ptr->_inclusion = cmp;
+    result.d_ptr->_criterion = QMessageFolderFilterPrivate::IdInclusion;
+    return result;
+}
+
+QMessageFolderFilter QMessageFolderFilter::byId(const QMessageFolderFilter &filter, QMessageDataComparator::InclusionComparator cmp)
+{
+    QMessageFolderFilter result;
+    *result.d_ptr = *filter.d_ptr;
+    if (cmp == QMessageDataComparator::Excludes) {
+        // Invert the sense of comparison
+        result = ~result;
+    }
+    return result;
+}
+
+QMessageFolderFilter QMessageFolderFilter::byName(const QString &value, QMessageDataComparator::EqualityComparator cmp)
+{
+    QMessageFolderFilter result;
+    result.d_ptr->_value = value;
+    result.d_ptr->_equality = cmp;
+    result.d_ptr->_criterion = QMessageFolderFilterPrivate::NameEquality;
+    return result;
+}
+
+QMessageFolderFilter QMessageFolderFilter::byName(const QString &value, QMessageDataComparator::InclusionComparator cmp)
+{
+    QMessageFolderFilter result;
+    result.d_ptr->_value = value;
+    result.d_ptr->_inclusion = cmp;
+    result.d_ptr->_criterion = QMessageFolderFilterPrivate::NameInclusion;
+    return result;
+}
+
+QMessageFolderFilter QMessageFolderFilter::byPath(const QString &value, QMessageDataComparator::EqualityComparator cmp)
+{
+    QMessageFolderFilter result;
+    result.d_ptr->_value = value;
+    result.d_ptr->_equality = cmp;
+    result.d_ptr->_criterion = QMessageFolderFilterPrivate::PathEquality;
+    return result;
+}
+
+QMessageFolderFilter QMessageFolderFilter::byPath(const QString &value, QMessageDataComparator::InclusionComparator cmp)
+{
+    QMessageFolderFilter result;
+    result.d_ptr->_value = value;
+    result.d_ptr->_inclusion = cmp;
+    result.d_ptr->_criterion = QMessageFolderFilterPrivate::PathInclusion;
+    return result;
+}
+
+QMessageFolderFilter QMessageFolderFilter::byParentAccountId(const QMessageAccountId &id, QMessageDataComparator::EqualityComparator cmp)
+{
+    if (!id.isValid()) {
+        QMessageFolderFilter result(~QMessageFolderFilter()); // non-matching
+        if (QMessageDataComparator::NotEqual == cmp) {
+            result = ~result;
+        }
+        return result;
+    }
+    QMessageFolderFilter result;
+    result.d_ptr->_accountIds.insert(id);
+    result.d_ptr->_equality = cmp;
+    result.d_ptr->_criterion = QMessageFolderFilterPrivate::AccountEquality;
+    return result;
+}
+
+QMessageFolderFilter QMessageFolderFilter::byParentAccountId(const QMessageAccountFilter &filter, QMessageDataComparator::InclusionComparator cmp)
+{
+    QMessageFolderFilter result;
+    result.d_ptr->_accountFilter = new QMessageAccountFilter(filter);
+    result.d_ptr->_inclusion = cmp;
+    result.d_ptr->_criterion = QMessageFolderFilterPrivate::ParentAccountFilter;
+    return result;
+}
+
+QMessageFolderFilter QMessageFolderFilter::byParentFolderId(const QMessageFolderId &id, QMessageDataComparator::EqualityComparator cmp)
+{
+    QMessageFolderFilter result;
+    result.d_ptr->_ids.insert(id);
+    result.d_ptr->_equality = cmp;
+    result.d_ptr->_criterion = QMessageFolderFilterPrivate::ParentEquality;
+    return result;
+}
+
+QMessageFolderFilter QMessageFolderFilter::byParentFolderId(const QMessageFolderFilter &filter, QMessageDataComparator::InclusionComparator cmp)
+{
+    QMessageFolderFilter result;
+    result.d_ptr->_folderFilter = new QMessageFolderFilter(filter);
+    result.d_ptr->_inclusion = cmp;
+    result.d_ptr->_criterion = QMessageFolderFilterPrivate::ParentFolderFilter;
+    return result;
+}
+
+QMessageFolderFilter QMessageFolderFilter::byAncestorFolderIds(const QMessageFolderId &id, QMessageDataComparator::InclusionComparator cmp)
+{
+    QMessageFolderFilter result;
+    result.d_ptr->_ids.insert(id);
+    result.d_ptr->_inclusion = cmp;
+    result.d_ptr->_criterion = QMessageFolderFilterPrivate::AncestorInclusion;
+    return result;
+}
+
+QMessageFolderFilter QMessageFolderFilter::byAncestorFolderIds(const QMessageFolderFilter &filter, QMessageDataComparator::InclusionComparator cmp)
+{
+    QMessageFolderFilter result;
+    result.d_ptr->_folderFilter = new QMessageFolderFilter(filter);
+    result.d_ptr->_inclusion = cmp;
+    result.d_ptr->_criterion = QMessageFolderFilterPrivate::AncestorFolderFilter;
+    return result;
+}
+
+QTM_END_NAMESPACE