/qt-mobility-opensource-src-1.2.2/src/messaging/qmessageaccountfilter_maemo6.cpp

# · C++ · 523 lines · 428 code · 54 blank · 41 comment · 136 complexity · 7be3493ed0600de10f758c5f3a735de9 MD5 · raw file

  1. /****************************************************************************
  2. **
  3. ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
  4. ** All rights reserved.
  5. ** Contact: Nokia Corporation (qt-info@nokia.com)
  6. **
  7. ** This file is part of the Qt Mobility Components.
  8. **
  9. ** $QT_BEGIN_LICENSE:LGPL$
  10. ** GNU Lesser General Public License Usage
  11. ** This file may be used under the terms of the GNU Lesser General Public
  12. ** License version 2.1 as published by the Free Software Foundation and
  13. ** appearing in the file LICENSE.LGPL included in the packaging of this
  14. ** file. Please review the following information to ensure the GNU Lesser
  15. ** General Public License version 2.1 requirements will be met:
  16. ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
  17. **
  18. ** In addition, as a special exception, Nokia gives you certain additional
  19. ** rights. These rights are described in the Nokia Qt LGPL Exception
  20. ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
  21. **
  22. ** GNU General Public License Usage
  23. ** Alternatively, this file may be used under the terms of the GNU General
  24. ** Public License version 3.0 as published by the Free Software Foundation
  25. ** and appearing in the file LICENSE.GPL included in the packaging of this
  26. ** file. Please review the following information to ensure the GNU General
  27. ** Public License version 3.0 requirements will be met:
  28. ** http://www.gnu.org/copyleft/gpl.html.
  29. **
  30. ** Other Usage
  31. ** Alternatively, this file may be used in accordance with the terms and
  32. ** conditions contained in a signed written agreement between you and Nokia.
  33. **
  34. **
  35. **
  36. **
  37. **
  38. ** $QT_END_LICENSE$
  39. **
  40. ****************************************************************************/
  41. #include "qmessageaccountfilter.h"
  42. #include "qmessageaccountfilter_p.h"
  43. QTM_BEGIN_NAMESPACE
  44. QMessageAccountFilterPrivate::QMessageAccountFilterPrivate(QMessageAccountFilter *accountFilter)
  45. : q_ptr(accountFilter)
  46. {
  47. }
  48. QMessageAccountFilterPrivate::~QMessageAccountFilterPrivate()
  49. {
  50. }
  51. bool QMessageAccountFilterPrivate::lessThan(const QMessageAccountFilter filter1, const QMessageAccountFilter filter2)
  52. {
  53. if (filter1.d_ptr->_field == filter2.d_ptr->_field) {
  54. if (filter1.d_ptr->_comparatorType == filter2.d_ptr->_comparatorType) {
  55. return filter1.d_ptr->_comparatorValue < filter2.d_ptr->_comparatorValue;
  56. }
  57. return filter1.d_ptr->_comparatorType < filter2.d_ptr->_comparatorType;
  58. }
  59. return filter1.d_ptr->_field < filter2.d_ptr->_field;
  60. }
  61. void QMessageAccountFilterPrivate::changeComparatorValuesToOpposite(QMessageAccountFilter& filter)
  62. {
  63. if (filter.d_ptr->_filterList.count() == 0) {
  64. if (filter.d_ptr->_comparatorType == QMessageAccountFilterPrivate::Equality) {
  65. QMessageDataComparator::EqualityComparator cmp(static_cast<QMessageDataComparator::EqualityComparator>(filter.d_ptr->_comparatorValue));
  66. if (cmp == QMessageDataComparator::Equal) {
  67. filter.d_ptr->_comparatorValue = static_cast<int>(QMessageDataComparator::NotEqual);
  68. } else {
  69. filter.d_ptr->_comparatorValue = static_cast<int>(QMessageDataComparator::Equal);
  70. }
  71. } else { // Inclusion
  72. QMessageDataComparator::InclusionComparator cmp(static_cast<QMessageDataComparator::InclusionComparator>(filter.d_ptr->_comparatorValue));
  73. if (cmp == QMessageDataComparator::Includes) {
  74. filter.d_ptr->_comparatorValue = static_cast<int>(QMessageDataComparator::Excludes);
  75. } else { // Excludes
  76. filter.d_ptr->_comparatorValue = static_cast<int>(QMessageDataComparator::Includes);
  77. }
  78. }
  79. } else {
  80. for (int i=0; i < filter.d_ptr->_filterList.count(); i++) {
  81. for (int j=0; j < filter.d_ptr->_filterList[i].count(); j++) {
  82. QMessageAccountFilterPrivate::changeComparatorValuesToOpposite(filter.d_ptr->_filterList[i][j]);
  83. }
  84. }
  85. }
  86. }
  87. void QMessageAccountFilterPrivate::changeANDsAndORsToOpposite(QMessageAccountFilter& filter)
  88. {
  89. if (filter.d_ptr->_filterList.count() > 0) {
  90. QMessageAccountFilter oldFilter = filter;
  91. filter.d_ptr->_filterList.clear();
  92. for (int i=0; i < oldFilter.d_ptr->_filterList.count(); i++) {
  93. if (i == 0) {
  94. for (int j=0; j < oldFilter.d_ptr->_filterList[i].count(); j++) {
  95. if (j == 0) {
  96. filter.d_ptr->_filterList.append(QMessageAccountFilterPrivate::SortedMessageAccountFilterList());
  97. filter.d_ptr->_filterList[0] << QMessageAccountFilter(oldFilter.d_ptr->_filterList[i][j]);
  98. } else {
  99. filter |= oldFilter.d_ptr->_filterList[i][j];
  100. }
  101. }
  102. } else {
  103. QMessageAccountFilter tempFilter;
  104. for (int j=0; j < oldFilter.d_ptr->_filterList[i].count(); j++) {
  105. if (j == 0) {
  106. tempFilter = oldFilter.d_ptr->_filterList[i][j];
  107. } else {
  108. tempFilter |= oldFilter.d_ptr->_filterList[i][j];
  109. }
  110. }
  111. filter &= tempFilter;
  112. }
  113. }
  114. for (int i=0; i < filter.d_ptr->_filterList.count(); i++) {
  115. qSort(filter.d_ptr->_filterList[i].begin(), filter.d_ptr->_filterList[i].end(), QMessageAccountFilterPrivate::lessThan);
  116. }
  117. }
  118. }
  119. void QMessageAccountFilterPrivate::applyNot(QMessageAccountFilter& filter)
  120. {
  121. QMessageAccountFilterPrivate::changeComparatorValuesToOpposite(filter);
  122. QMessageAccountFilterPrivate::changeANDsAndORsToOpposite(filter);
  123. }
  124. bool QMessageAccountFilterPrivate::filter(const QMessageAccount &messageAccount, const QMessageAccountFilterPrivate &filter)
  125. {
  126. if ((filter._field == QMessageAccountFilterPrivate::None) &&
  127. (filter._filterList.count() == 0)) {
  128. if (filter._notFilter) {
  129. return false;
  130. } else {
  131. return true;
  132. }
  133. }
  134. Qt::CaseSensitivity caseSensitivity = (filter._matchFlags & QMessageDataComparator::MatchCaseSensitive) ? Qt::CaseSensitive : Qt::CaseInsensitive;
  135. switch (filter._field) {
  136. case QMessageAccountFilterPrivate::Id:
  137. {
  138. if (filter._comparatorType == QMessageAccountFilterPrivate::Equality) {
  139. QMessageDataComparator::EqualityComparator cmp(static_cast<QMessageDataComparator::EqualityComparator>(filter._comparatorValue));
  140. if (cmp == QMessageDataComparator::Equal) {
  141. if (messageAccount.id().toString() == filter._value.toString()) {
  142. return true;
  143. }
  144. } else { // NotEqual
  145. if (!(messageAccount.id().toString() == filter._value.toString())) {
  146. return true;
  147. }
  148. }
  149. } else if (filter._comparatorType == QMessageAccountFilterPrivate::Inclusion) {
  150. QMessageDataComparator::InclusionComparator cmp(static_cast<QMessageDataComparator::InclusionComparator>(filter._comparatorValue));
  151. if (cmp == QMessageDataComparator::Includes) {
  152. if (filter._ids.contains(messageAccount.id())) {
  153. return true;
  154. }
  155. } else { // Excludes
  156. if (!filter._ids.contains(messageAccount.id())) {
  157. return true;
  158. }
  159. }
  160. }
  161. break;
  162. }
  163. case QMessageAccountFilterPrivate::Name:
  164. {
  165. if (filter._comparatorType == QMessageAccountFilterPrivate::Equality) {
  166. QMessageDataComparator::EqualityComparator cmp(static_cast<QMessageDataComparator::EqualityComparator>(filter._comparatorValue));
  167. if (cmp == QMessageDataComparator::Equal) {
  168. if (messageAccount.name().compare(filter._value.toString(),caseSensitivity) == 0) {
  169. return true;
  170. }
  171. } else { // NotEqual
  172. if (messageAccount.name().compare(filter._value.toString(),caseSensitivity) != 0) {
  173. return true;
  174. }
  175. }
  176. } else if (filter._comparatorType == QMessageAccountFilterPrivate::Inclusion) {
  177. QMessageDataComparator::InclusionComparator cmp(static_cast<QMessageDataComparator::InclusionComparator>(filter._comparatorValue));
  178. if (cmp == QMessageDataComparator::Includes) {
  179. if (messageAccount.name().contains(filter._value.toString(),caseSensitivity)) {
  180. return true;
  181. }
  182. } else { // Excludes
  183. if (!messageAccount.name().contains(filter._value.toString(),caseSensitivity)) {
  184. return true;
  185. }
  186. }
  187. }
  188. break;
  189. }
  190. case QMessageAccountFilterPrivate::None:
  191. break;
  192. }
  193. return false;
  194. }
  195. bool QMessageAccountFilterPrivate::filter(const QMessageAccount &messageAccount) const
  196. {
  197. if (!_valid) {
  198. return false;
  199. }
  200. bool result = false;
  201. if (_filterList.count() == 0) {
  202. result = QMessageAccountFilterPrivate::filter(messageAccount, *this);
  203. } else {
  204. for (int i=0; i < _filterList.count(); i++) {
  205. for (int j=0; j < _filterList[i].count(); j++) {
  206. result = QMessageAccountFilterPrivate::filter(messageAccount, *_filterList[i][j].d_ptr);
  207. if (result == false) {
  208. break;
  209. }
  210. }
  211. if (result == true) {
  212. break;
  213. }
  214. }
  215. }
  216. return result;
  217. }
  218. QMessageAccountFilterPrivate* QMessageAccountFilterPrivate::implementation(const QMessageAccountFilter &filter)
  219. {
  220. return filter.d_ptr;
  221. }
  222. QMessageAccountFilter::QMessageAccountFilter()
  223. : d_ptr(new QMessageAccountFilterPrivate(this))
  224. {
  225. d_ptr->_matchFlags = 0;
  226. d_ptr->_valid = true; // Empty filter is valid
  227. d_ptr->_notFilter = false;
  228. d_ptr->_ids = QMessageAccountIdList();
  229. d_ptr->_value = QVariant();
  230. d_ptr->_field = QMessageAccountFilterPrivate::None;
  231. d_ptr->_comparatorType = QMessageAccountFilterPrivate::Equality;
  232. d_ptr->_comparatorValue = 0;
  233. }
  234. QMessageAccountFilter::QMessageAccountFilter(const QMessageAccountFilter &other)
  235. : d_ptr(new QMessageAccountFilterPrivate(this))
  236. {
  237. this->operator=(other);
  238. }
  239. QMessageAccountFilter::~QMessageAccountFilter()
  240. {
  241. delete d_ptr;
  242. }
  243. QMessageAccountFilter& QMessageAccountFilter::operator=(const QMessageAccountFilter& other)
  244. {
  245. if (&other == this)
  246. return *this;
  247. d_ptr->_matchFlags = other.d_ptr->_matchFlags;
  248. d_ptr->_valid = other.d_ptr->_valid;
  249. d_ptr->_notFilter = other.d_ptr->_notFilter;
  250. d_ptr->_ids = other.d_ptr->_ids;
  251. d_ptr->_value = other.d_ptr->_value;
  252. d_ptr->_field = other.d_ptr->_field;
  253. d_ptr->_comparatorType = other.d_ptr->_comparatorType;
  254. d_ptr->_comparatorValue = other.d_ptr->_comparatorValue;
  255. d_ptr->_filterList = other.d_ptr->_filterList;
  256. return *this;
  257. }
  258. void QMessageAccountFilter::setMatchFlags(QMessageDataComparator::MatchFlags matchFlags)
  259. {
  260. d_ptr->_matchFlags = matchFlags;
  261. }
  262. QMessageDataComparator::MatchFlags QMessageAccountFilter::matchFlags() const
  263. {
  264. return d_ptr->_matchFlags;
  265. }
  266. bool QMessageAccountFilter::isEmpty() const
  267. {
  268. return ((d_ptr->_field == QMessageAccountFilterPrivate::None) &&
  269. (d_ptr->_notFilter == false) &&
  270. (d_ptr->_filterList.count()) == 0);
  271. }
  272. bool QMessageAccountFilter::isSupported() const
  273. {
  274. return d_ptr->_valid;
  275. }
  276. QMessageAccountFilter QMessageAccountFilter::operator~() const
  277. {
  278. QMessageAccountFilter result(*this);
  279. if (result.isEmpty()) {
  280. result.d_ptr->_notFilter = true;
  281. } else {
  282. if (result.d_ptr->_notFilter) {
  283. result.d_ptr->_notFilter = false;
  284. } else {
  285. QMessageAccountFilterPrivate::applyNot(result);
  286. }
  287. }
  288. return result;
  289. }
  290. QMessageAccountFilter QMessageAccountFilter::operator&(const QMessageAccountFilter& other) const
  291. {
  292. QMessageAccountFilter result(*this);
  293. result &= other;
  294. return result;
  295. }
  296. QMessageAccountFilter QMessageAccountFilter::operator|(const QMessageAccountFilter& other) const
  297. {
  298. QMessageAccountFilter result(*this);
  299. result |= other;
  300. return result;
  301. }
  302. const QMessageAccountFilter& QMessageAccountFilter::operator&=(const QMessageAccountFilter& other)
  303. {
  304. if (&other == this) {
  305. return *this;
  306. }
  307. if (isEmpty()) {
  308. *this = other;
  309. return *this;
  310. }
  311. if (other.isEmpty()) {
  312. return *this;
  313. }
  314. if (d_ptr->_notFilter) {
  315. return *this;
  316. }
  317. if (other.d_ptr->_notFilter) {
  318. *this = other;
  319. return *this;
  320. }
  321. if (d_ptr->_filterList.count() == 0) {
  322. QMessageAccountFilter newFilter = QMessageAccountFilter(*this);
  323. d_ptr->_filterList.append(QMessageAccountFilterPrivate::SortedMessageAccountFilterList());
  324. d_ptr->_filterList[0] << newFilter;
  325. d_ptr->_value = QVariant();
  326. d_ptr->_field = QMessageAccountFilterPrivate::None;
  327. d_ptr->_comparatorType = QMessageAccountFilterPrivate::Equality;
  328. d_ptr->_comparatorValue = 0;
  329. }
  330. int i = 0;
  331. while (i < d_ptr->_filterList.count()) {
  332. if (other.d_ptr->_filterList.count() == 0) {
  333. d_ptr->_filterList[i] << other;
  334. qSort(d_ptr->_filterList[i].begin(), d_ptr->_filterList[i].end(), QMessageAccountFilterPrivate::lessThan);
  335. } else {
  336. int j = 0;
  337. int k = i;
  338. while (j < other.d_ptr->_filterList.count()) {
  339. if (j+1 < other.d_ptr->_filterList.count()) {
  340. d_ptr->_filterList.insert(k+j+1,QMessageAccountFilterPrivate::SortedMessageAccountFilterList());
  341. d_ptr->_filterList[k+j+1] << d_ptr->_filterList[k+j];
  342. i++;
  343. }
  344. d_ptr->_filterList[k+j] << other.d_ptr->_filterList[j];
  345. if (d_ptr->_filterList[k+j].count() > 1) {
  346. qSort(d_ptr->_filterList[k+j].begin(), d_ptr->_filterList[k+j].end(), QMessageAccountFilterPrivate::lessThan);
  347. }
  348. j++;
  349. }
  350. }
  351. i++;
  352. }
  353. d_ptr->_valid = d_ptr->_valid & other.d_ptr->_valid;
  354. return *this;
  355. }
  356. const QMessageAccountFilter& QMessageAccountFilter::operator|=(const QMessageAccountFilter& other)
  357. {
  358. if (&other == this) {
  359. return *this;
  360. }
  361. if (isEmpty()) {
  362. return *this;
  363. }
  364. if (other.isEmpty()) {
  365. *this = other;
  366. return *this;
  367. }
  368. if (d_ptr->_notFilter) {
  369. *this = other;
  370. return *this;
  371. }
  372. if (other.d_ptr->_notFilter) {
  373. return *this;
  374. }
  375. if (d_ptr->_filterList.count() == 0) {
  376. QMessageAccountFilter newFilter = QMessageAccountFilter(*this);
  377. d_ptr->_filterList.append(QMessageAccountFilterPrivate::SortedMessageAccountFilterList());
  378. d_ptr->_filterList[d_ptr->_filterList.count()-1] << newFilter;
  379. d_ptr->_value = QVariant();
  380. d_ptr->_field = QMessageAccountFilterPrivate::None;
  381. d_ptr->_comparatorType = QMessageAccountFilterPrivate::Equality;
  382. d_ptr->_comparatorValue = 0;
  383. }
  384. if (other.d_ptr->_filterList.count() == 0) {
  385. d_ptr->_filterList.append(QMessageAccountFilterPrivate::SortedMessageAccountFilterList());
  386. d_ptr->_filterList[d_ptr->_filterList.count()-1] << other;
  387. } else {
  388. d_ptr->_filterList << other.d_ptr->_filterList;
  389. }
  390. d_ptr->_valid = d_ptr->_valid & other.d_ptr->_valid;
  391. return *this;
  392. }
  393. bool QMessageAccountFilter::operator==(const QMessageAccountFilter& other) const
  394. {
  395. if (d_ptr->_filterList.count() != other.d_ptr->_filterList.count()) {
  396. return false;
  397. }
  398. if (d_ptr->_filterList.count() == 0) {
  399. return (d_ptr->_notFilter == other.d_ptr->_notFilter &&
  400. d_ptr->_field == other.d_ptr->_field &&
  401. d_ptr->_value == other.d_ptr->_value &&
  402. d_ptr->_ids == other.d_ptr->_ids &&
  403. d_ptr->_comparatorType == other.d_ptr->_comparatorType &&
  404. d_ptr->_comparatorValue == other.d_ptr->_comparatorValue);
  405. } else { // List
  406. for (int i=0; i < d_ptr->_filterList.count(); i++) {
  407. if (d_ptr->_filterList[i].count() != other.d_ptr->_filterList[i].count()) {
  408. return false;
  409. }
  410. for (int j=0; j < d_ptr->_filterList[i].count(); j++) {
  411. if (!(d_ptr->_filterList[i][j] == other.d_ptr->_filterList[i][j])) {
  412. return false;
  413. }
  414. }
  415. }
  416. }
  417. return true;
  418. }
  419. QMessageAccountFilter QMessageAccountFilter::byId(const QMessageAccountId &id, QMessageDataComparator::EqualityComparator cmp)
  420. {
  421. QMessageAccountFilter result;
  422. result.d_ptr->_field = QMessageAccountFilterPrivate::Id;
  423. result.d_ptr->_value = id.toString();
  424. result.d_ptr->_comparatorType = QMessageAccountFilterPrivate::Equality;
  425. result.d_ptr->_comparatorValue = static_cast<int>(cmp);
  426. result.d_ptr->_valid = true;
  427. return result;
  428. }
  429. QMessageAccountFilter QMessageAccountFilter::byId(const QMessageAccountIdList &ids, QMessageDataComparator::InclusionComparator cmp)
  430. {
  431. QMessageAccountFilter result;
  432. result.d_ptr->_field = QMessageAccountFilterPrivate::Id;
  433. result.d_ptr->_ids = ids;
  434. result.d_ptr->_comparatorType = QMessageAccountFilterPrivate::Inclusion;
  435. result.d_ptr->_comparatorValue = static_cast<int>(cmp);
  436. result.d_ptr->_valid = true;
  437. return result;
  438. }
  439. QMessageAccountFilter QMessageAccountFilter::byId(const QMessageAccountFilter &filter, QMessageDataComparator::InclusionComparator cmp)
  440. {
  441. QMessageAccountFilter result;
  442. *result.d_ptr = *filter.d_ptr;
  443. if (cmp == QMessageDataComparator::Excludes) {
  444. // Invert the sense of comparison
  445. result = ~result;
  446. }
  447. return result;
  448. }
  449. QMessageAccountFilter QMessageAccountFilter::byName(const QString &value, QMessageDataComparator::EqualityComparator cmp)
  450. {
  451. QMessageAccountFilter result;
  452. result.d_ptr->_field = QMessageAccountFilterPrivate::Name;
  453. result.d_ptr->_value = value;
  454. result.d_ptr->_comparatorType = QMessageAccountFilterPrivate::Equality;
  455. result.d_ptr->_comparatorValue = static_cast<int>(cmp);
  456. result.d_ptr->_valid = true;
  457. return result;
  458. }
  459. QMessageAccountFilter QMessageAccountFilter::byName(const QString &value, QMessageDataComparator::InclusionComparator cmp)
  460. {
  461. QMessageAccountFilter result;
  462. result.d_ptr->_field = QMessageAccountFilterPrivate::Name;
  463. result.d_ptr->_value = value;
  464. result.d_ptr->_comparatorType = QMessageAccountFilterPrivate::Inclusion;
  465. result.d_ptr->_comparatorValue = static_cast<int>(cmp);
  466. result.d_ptr->_valid = true;
  467. return result;
  468. }
  469. QTM_END_NAMESPACE