qtmobility/src/messaging/qmtmengine_symbian.cpp
changeset 8 71781823f776
parent 4 90517678cc4f
child 11 06b8e2af4411
equal deleted inserted replaced
5:453da2cfceef 8:71781823f776
    86 #include <cmsvrecipientlist.h>
    86 #include <cmsvrecipientlist.h>
    87 #include <imapset.h>
    87 #include <imapset.h>
    88 #include <miutmsg.h>
    88 #include <miutmsg.h>
    89 #include <charconv.h>
    89 #include <charconv.h>
    90 #include <imcvtext.h> // KImcvMultipart declaration
    90 #include <imcvtext.h> // KImcvMultipart declaration
       
    91 #include <smscmds.h>
    91 
    92 
    92 #include <QTextCodec>
    93 #include <QTextCodec>
       
    94 #include <messagingutil_p.h>
       
    95 
    93 
    96 
    94 QTM_BEGIN_NAMESPACE
    97 QTM_BEGIN_NAMESPACE
    95 
    98 
    96 const TInt KWaitAfterReceivedMessage = 100000; // = 0.1 seconds
    99 const TInt KWaitAfterReceivedMessage = 100000; // = 0.1 seconds
    97 #define KDocumentsEntryIdValue    0x1008
   100 #define KDocumentsEntryIdValue    0x1008
   103 {
   106 {
   104     iFsSession.Connect();
   107     iFsSession.Connect();
   105     CActiveScheduler::Add(this);
   108     CActiveScheduler::Add(this);
   106     iTimer.CreateLocal();
   109     iTimer.CreateLocal();
   107 
   110 
   108     TRAPD(err, 
   111     TRAPD(err,
   109         ipMsvSession = CMsvSession::OpenSyncL(*this);
   112         ipMsvSession = CMsvSession::OpenSyncL(*this);
   110         iSessionReady = ETrue;
   113         iSessionReady = ETrue;
   111         ipClientMtmReg = CClientMtmRegistry::NewL(*ipMsvSession);
   114         ipClientMtmReg = CClientMtmRegistry::NewL(*ipMsvSession);
   112         ipSmsMtm = static_cast<CSmsClientMtm*>(ipClientMtmReg->NewMtmL(KUidMsgTypeSMS));
   115         ipSmsMtm = static_cast<CSmsClientMtm*>(ipClientMtmReg->NewMtmL(KUidMsgTypeSMS));
   113         ipMmsMtm = static_cast<CMmsClientMtm*>(ipClientMtmReg->NewMtmL(KUidMsgTypeMultimedia));
   116         ipMmsMtm = static_cast<CMmsClientMtm*>(ipClientMtmReg->NewMtmL(KUidMsgTypeMultimedia));
   117         );
   120         );
   118     Q_UNUSED(err)
   121     Q_UNUSED(err)
   119 
   122 
   120     // Create & Add SMS Account
   123     // Create & Add SMS Account
   121     TRAPD(accountError,
   124     TRAPD(accountError,
   122         iSMSAccountidAsString = QString::number(mtmServiceEntryIdL(CMTMEngine::MTMTypeSMS));
   125         iSMSAccountidAsString = SymbianHelpers::addIdPrefix(QString::number(mtmServiceEntryIdL(CMTMEngine::MTMTypeSMS)),SymbianHelpers::EngineTypeMTM);
   123         QMessageAccount smsAcc = QMessageAccountPrivate::from(QMessageAccountId(iSMSAccountidAsString),
   126         QMessageAccount smsAcc = QMessageAccountPrivate::from(QMessageAccountId(iSMSAccountidAsString),
   124                                                               QString("SMS"),
   127                                                               QString("SMS"),
   125                                                               mtmServiceEntryIdL(CMTMEngine::MTMTypeSMS),
   128                                                               mtmServiceEntryIdL(CMTMEngine::MTMTypeSMS),
   126                                                               0,
   129                                                               0,
   127                                                               QMessage::Sms);
   130                                                               QMessage::Sms);
   128         iAccounts.insert(iSMSAccountidAsString, smsAcc);
   131         iAccounts.insert(iSMSAccountidAsString, smsAcc);
   129 
   132 
   130 
   133 
   131         // Create & Add MMS Account
   134         // Create & Add MMS Account
   132         iMMSAccountidAsString = QString::number(mtmServiceEntryIdL(CMTMEngine::MTMTypeMMS));
   135         iMMSAccountidAsString = SymbianHelpers::addIdPrefix(QString::number(mtmServiceEntryIdL(CMTMEngine::MTMTypeMMS)),SymbianHelpers::EngineTypeMTM);
   133         QMessageAccount mmsAcc = QMessageAccountPrivate::from(QMessageAccountId(iMMSAccountidAsString),
   136         QMessageAccount mmsAcc = QMessageAccountPrivate::from(QMessageAccountId(iMMSAccountidAsString),
   134                                                               QString("MMS"),
   137                                                               QString("MMS"),
   135                                                               mtmServiceEntryIdL(CMTMEngine::MTMTypeMMS),
   138                                                               mtmServiceEntryIdL(CMTMEngine::MTMTypeMMS),
   136                                                               0,
   139                                                               0,
   137                                                               QMessage::Mms | QMessage::Email);
   140                                                               QMessage::Mms | QMessage::Email);
   373     TSmtpAccount defaultAccount;
   376     TSmtpAccount defaultAccount;
   374     TInt err = pEmailAccounts->DefaultSmtpAccountL(defaultAccount);    
   377     TInt err = pEmailAccounts->DefaultSmtpAccountL(defaultAccount);    
   375     if (err == KErrNone) {
   378     if (err == KErrNone) {
   376         QString idAsString;
   379         QString idAsString;
   377         if (defaultAccount.iRelatedService != 0) {
   380         if (defaultAccount.iRelatedService != 0) {
   378             idAsString = QString::number(defaultAccount.iRelatedService);
   381             idAsString = SymbianHelpers::addIdPrefix(QString::number(defaultAccount.iRelatedService),SymbianHelpers::EngineTypeMTM);
   379         } else {
   382         } else {
   380             idAsString = QString::number(defaultAccount.iSmtpService);
   383             idAsString = SymbianHelpers::addIdPrefix(QString::number(defaultAccount.iSmtpService),SymbianHelpers::EngineTypeMTM);
   381         }
   384         }
   382         if (!iAccounts.contains(idAsString)) {
   385         if (!iAccounts.contains(idAsString)) {
   383             QMessageAccount account = QMessageAccountPrivate::from(QMessageAccountId(idAsString),
   386             QMessageAccount account = QMessageAccountPrivate::from(QMessageAccountId(idAsString),
   384                                                                    QString::fromUtf16(defaultAccount.iSmtpAccountName.Ptr(), defaultAccount.iSmtpAccountName.Length()),
   387                                                                    QString::fromUtf16(defaultAccount.iSmtpAccountName.Ptr(), defaultAccount.iSmtpAccountName.Length()),
   385                                                                    defaultAccount.iRelatedService,
   388                                                                    defaultAccount.iRelatedService,
   396 
   399 
   397     RArray<TImapAccount> imapAccounts(10);
   400     RArray<TImapAccount> imapAccounts(10);
   398     pEmailAccounts->GetImapAccountsL(imapAccounts);
   401     pEmailAccounts->GetImapAccountsL(imapAccounts);
   399     CleanupClosePushL(imapAccounts);
   402     CleanupClosePushL(imapAccounts);
   400     for (int i=0; i < imapAccounts.Count(); i++) {
   403     for (int i=0; i < imapAccounts.Count(); i++) {
   401         QString idAsString = QString::number(imapAccounts[i].iImapService);
   404         QString idAsString = SymbianHelpers::addIdPrefix(QString::number(imapAccounts[i].iImapService),SymbianHelpers::EngineTypeMTM);
   402         if (!iAccounts.contains(idAsString)) {
   405         if (!iAccounts.contains(idAsString)) {
   403             QMessageAccount account = QMessageAccountPrivate::from(QMessageAccountId(idAsString),
   406             QMessageAccount account = QMessageAccountPrivate::from(QMessageAccountId(idAsString),
   404                                                                    QString::fromUtf16(imapAccounts[i].iImapAccountName.Ptr(), imapAccounts[i].iImapAccountName.Length()),
   407                                                                    QString::fromUtf16(imapAccounts[i].iImapAccountName.Ptr(), imapAccounts[i].iImapAccountName.Length()),
   405                                                                    imapAccounts[i].iImapService,
   408                                                                    imapAccounts[i].iImapService,
   406                                                                    imapAccounts[i].iSmtpService,
   409                                                                    imapAccounts[i].iSmtpService,
   414     
   417     
   415     RArray<TPopAccount> popAccounts(10);
   418     RArray<TPopAccount> popAccounts(10);
   416     pEmailAccounts->GetPopAccountsL(popAccounts);
   419     pEmailAccounts->GetPopAccountsL(popAccounts);
   417     CleanupClosePushL(popAccounts);
   420     CleanupClosePushL(popAccounts);
   418     for (int i=0; i < popAccounts.Count(); i++) {
   421     for (int i=0; i < popAccounts.Count(); i++) {
   419         QString idAsString = QString::number(popAccounts[i].iPopService);
   422         QString idAsString = SymbianHelpers::addIdPrefix(QString::number(popAccounts[i].iPopService),SymbianHelpers::EngineTypeMTM);
   420         if (!iAccounts.contains(idAsString)) {
   423         if (!iAccounts.contains(idAsString)) {
   421             QMessageAccount account = QMessageAccountPrivate::from(QMessageAccountId(QString::number(popAccounts[i].iPopService)),
   424             QMessageAccount account = QMessageAccountPrivate::from(QMessageAccountId(SymbianHelpers::addIdPrefix(QString::number(popAccounts[i].iPopService),SymbianHelpers::EngineTypeMTM)),
   422                                                                    QString::fromUtf16(popAccounts[i].iPopAccountName.Ptr(), popAccounts[i].iPopAccountName.Length()),
   425                                                                    QString::fromUtf16(popAccounts[i].iPopAccountName.Ptr(), popAccounts[i].iPopAccountName.Length()),
   423                                                                    popAccounts[i].iPopService,
   426                                                                    popAccounts[i].iPopService,
   424                                                                    popAccounts[i].iSmtpService,
   427                                                                    popAccounts[i].iSmtpService,
   425                                                                    QMessage::Email);
   428                                                                    QMessage::Email);
   426             iAccounts.insert(idAsString, account);
   429             iAccounts.insert(idAsString, account);
   433     RArray<TSmtpAccount> smtpAccounts(10);
   436     RArray<TSmtpAccount> smtpAccounts(10);
   434     pEmailAccounts->GetSmtpAccountsL(smtpAccounts);
   437     pEmailAccounts->GetSmtpAccountsL(smtpAccounts);
   435     CleanupClosePushL(smtpAccounts);
   438     CleanupClosePushL(smtpAccounts);
   436     for (int i=0; i < smtpAccounts.Count(); i++) {
   439     for (int i=0; i < smtpAccounts.Count(); i++) {
   437         if (smtpAccounts[i].iRelatedService == 0) {
   440         if (smtpAccounts[i].iRelatedService == 0) {
   438             QString idAsString = QString::number(smtpAccounts[i].iSmtpService);
   441             QString idAsString = SymbianHelpers::addIdPrefix(QString::number(smtpAccounts[i].iSmtpService),SymbianHelpers::EngineTypeMTM);
   439             if (!iAccounts.contains(idAsString)) {
   442             if (!iAccounts.contains(idAsString)) {
   440                 QMessageAccount account = QMessageAccountPrivate::from(QMessageAccountId(QString::number(smtpAccounts[i].iSmtpService)),
   443                 QMessageAccount account = QMessageAccountPrivate::from(QMessageAccountId(SymbianHelpers::addIdPrefix(QString::number(smtpAccounts[i].iSmtpService),SymbianHelpers::EngineTypeMTM)),
   441                                                                        QString::fromUtf16(smtpAccounts[i].iSmtpAccountName.Ptr(), smtpAccounts[i].iSmtpAccountName.Length()),
   444                                                                        QString::fromUtf16(smtpAccounts[i].iSmtpAccountName.Ptr(), smtpAccounts[i].iSmtpAccountName.Length()),
   442                                                                        smtpAccounts[i].iRelatedService,
   445                                                                        smtpAccounts[i].iRelatedService,
   443                                                                        smtpAccounts[i].iSmtpService,
   446                                                                        smtpAccounts[i].iSmtpService,
   444                                                                        QMessage::Email);
   447                                                                        QMessage::Email);
   445                 iAccounts.insert(idAsString, account);
   448                 iAccounts.insert(idAsString, account);
   697         return true;
   700         return true;
   698 }
   701 }
   699 
   702 
   700 void CMTMEngine::showMessageL(const QMessageId &id)
   703 void CMTMEngine::showMessageL(const QMessageId &id)
   701 {
   704 {
   702     long int messageId = id.toString().toLong();
   705     long int messageId = SymbianHelpers::stripIdPrefix(id.toString()).toLong();
   703     
   706     
   704     CMsvEntry* pEntry = ipMsvSession->GetEntryL(messageId);
   707     CMsvEntry* pEntry = ipMsvSession->GetEntryL(messageId);
   705     CleanupStack::PushL(pEntry);
   708     CleanupStack::PushL(pEntry);
   706     CBaseMtm* mtm = ipClientMtmReg->NewMtmL(pEntry->Entry().iMtm);
   709     CBaseMtm* mtm = ipClientMtmReg->NewMtmL(pEntry->Entry().iMtm);
   707     CleanupStack::PushL(mtm);
   710     CleanupStack::PushL(mtm);
   965 
   968 
   966 void CMTMEngine::retrieveL(const QMessageId &messageId, const QMessageContentContainerId& id)
   969 void CMTMEngine::retrieveL(const QMessageId &messageId, const QMessageContentContainerId& id)
   967 {
   970 {
   968     Q_UNUSED(id); // all attachments are retrieved (cannot retrieve only one)
   971     Q_UNUSED(id); // all attachments are retrieved (cannot retrieve only one)
   969     
   972     
   970     long int messId = messageId.toString().toLong();
   973     long int messId = SymbianHelpers::stripIdPrefix(messageId.toString()).toLong();
   971     
   974     
   972     CMsvEntry* pEntry = ipMsvSession->GetEntryL(messId);
   975     CMsvEntry* pEntry = ipMsvSession->GetEntryL(messId);
   973     CleanupStack::PushL(pEntry);
   976     CleanupStack::PushL(pEntry);
   974     
   977     
   975     CMsvEntrySelection* sel = new(ELeave) CMsvEntrySelection;
   978     CMsvEntrySelection* sel = new(ELeave) CMsvEntrySelection;
  1072             return true;
  1075             return true;
  1073 }
  1076 }
  1074 
  1077 
  1075 void CMTMEngine::retrieveBodyL(const QMessageId& id) const
  1078 void CMTMEngine::retrieveBodyL(const QMessageId& id) const
  1076 {
  1079 {
  1077     long int messageId = id.toString().toLong();
  1080     long int messageId = SymbianHelpers::stripIdPrefix(id.toString()).toLong();
  1078     
  1081     
  1079     CMsvEntry* pEntry = ipMsvSession->GetEntryL(messageId);
  1082     CMsvEntry* pEntry = ipMsvSession->GetEntryL(messageId);
  1080     CleanupStack::PushL(pEntry);
  1083     CleanupStack::PushL(pEntry);
  1081     
  1084     
  1082     CMsvEntrySelection* sel = new(ELeave) CMsvEntrySelection;
  1085     CMsvEntrySelection* sel = new(ELeave) CMsvEntrySelection;
  1179             return true;
  1182             return true;
  1180 }
  1183 }
  1181 
  1184 
  1182 void CMTMEngine::retrieveHeaderL(const QMessageId& id) const
  1185 void CMTMEngine::retrieveHeaderL(const QMessageId& id) const
  1183 {
  1186 {
  1184     long int messageId = id.toString().toLong();
  1187     long int messageId = SymbianHelpers::stripIdPrefix(id.toString()).toLong();
  1185     
  1188     
  1186     CMsvEntry* pEntry = ipMsvSession->GetEntryL(messageId);
  1189     CMsvEntry* pEntry = ipMsvSession->GetEntryL(messageId);
  1187     CleanupStack::PushL(pEntry);
  1190     CleanupStack::PushL(pEntry);
  1188     
  1191     
  1189     CMsvEntrySelection* sel = new(ELeave) CMsvEntrySelection;
  1192     CMsvEntrySelection* sel = new(ELeave) CMsvEntrySelection;
  1323     releaseCMsvEntryAndPopFromCleanupStack(pEntry);
  1326     releaseCMsvEntryAndPopFromCleanupStack(pEntry);
  1324 }
  1327 }
  1325 
  1328 
  1326 bool CMTMEngine::removeMessageL(const QMessageId &id, QMessageManager::RemovalOption /*option*/)
  1329 bool CMTMEngine::removeMessageL(const QMessageId &id, QMessageManager::RemovalOption /*option*/)
  1327 {
  1330 {
  1328     long int messageId = id.toString().toLong();
  1331     long int messageId = SymbianHelpers::stripIdPrefix(id.toString()).toLong();
  1329     CMsvEntry* pEntry = ipMsvSession->GetEntryL(messageId);
  1332     CMsvEntry* pEntry = ipMsvSession->GetEntryL(messageId);
  1330     CleanupStack::PushL(pEntry);
  1333     CleanupStack::PushL(pEntry);
  1331     
  1334     
  1332     if (pEntry->Entry().iMtm == KUidMsgTypeSMS) {
  1335     if (pEntry->Entry().iMtm == KUidMsgTypeSMS) {
  1333         if (!ipSmsMtm)
  1336         if (!ipSmsMtm)
  1762 
  1765 
  1763     delete iMessageQueries[index].findOperation;
  1766     delete iMessageQueries[index].findOperation;
  1764     iMessageQueries.removeAt(index);
  1767     iMessageQueries.removeAt(index);
  1765 }
  1768 }
  1766 
  1769 
       
  1770 
  1767 void CMTMEngine::applyOffsetAndLimitToMsgIds(QMessageIdList& idList, int offset, int limit) const
  1771 void CMTMEngine::applyOffsetAndLimitToMsgIds(QMessageIdList& idList, int offset, int limit) const
  1768 {
  1772 {
  1769     if (offset > 0) {
  1773     if (offset > 0) {
  1770         if (offset > idList.count()) {
  1774         if (offset > idList.count()) {
  1771             idList.clear();
  1775             idList.clear();
  1810         switch (pf->_field) {
  1814         switch (pf->_field) {
  1811         case QMessageFolderFilterPrivate::Id:
  1815         case QMessageFolderFilterPrivate::Id:
  1812             {
  1816             {
  1813             if (pf->_comparatorType == QMessageFolderFilterPrivate::Equality) {
  1817             if (pf->_comparatorType == QMessageFolderFilterPrivate::Equality) {
  1814                 QMessageDataComparator::EqualityComparator cmp(static_cast<QMessageDataComparator::EqualityComparator>(pf->_comparatorValue));
  1818                 QMessageDataComparator::EqualityComparator cmp(static_cast<QMessageDataComparator::EqualityComparator>(pf->_comparatorValue));
  1815                 if (pf->_value.toString().length() > 0) {
  1819                 if (pf->_value.toString().length() > QString(SymbianHelpers::mtmPrefix).length()) {
  1816                     bool folderOk = false;
  1820                     bool folderOk = false;
  1817                     long int folderId = folderIdFromQMessageFolderId(QMessageFolderId(pf->_value.toString()));
  1821                     long int folderId = folderIdFromQMessageFolderId(QMessageFolderId(pf->_value.toString()));
  1818                     CMsvEntry* pEntry = retrieveCMsvEntryAndPushToCleanupStack(folderId);
  1822                     CMsvEntry* pEntry = retrieveCMsvEntryAndPushToCleanupStack(folderId);
  1819                     if (pEntry) {
  1823                     if (pEntry) {
  1820                         if (pEntry->Entry().iType == KUidMsvFolderEntry) {
  1824                         if (pEntry->Entry().iType == KUidMsvFolderEntry) {
  1924         case QMessageFolderFilterPrivate::ParentAccountId:
  1928         case QMessageFolderFilterPrivate::ParentAccountId:
  1925             {
  1929             {
  1926             if (pf->_comparatorType == QMessageFolderFilterPrivate::Equality) {
  1930             if (pf->_comparatorType == QMessageFolderFilterPrivate::Equality) {
  1927                 QMessageDataComparator::EqualityComparator cmp(static_cast<QMessageDataComparator::EqualityComparator>(pf->_comparatorValue));
  1931                 QMessageDataComparator::EqualityComparator cmp(static_cast<QMessageDataComparator::EqualityComparator>(pf->_comparatorValue));
  1928                 if (cmp == QMessageDataComparator::Equal) {
  1932                 if (cmp == QMessageDataComparator::Equal) {
  1929                     if (pf->_value.toString().length() > 0) {
  1933                     if (pf->_value.toString().length() > QString(SymbianHelpers::mtmPrefix).length()) {
  1930                         ids = folderIdsByAccountId(QMessageAccountId(pf->_value.toString()));
  1934                         ids = folderIdsByAccountId(QMessageAccountId(pf->_value.toString()));
  1931                     }
  1935                     }
  1932                 } else { // NotEqual
  1936                 } else { // NotEqual
  1933                     ids = allFolders();
  1937                     ids = allFolders();
  1934                     if (pf->_value.toString().length() > 0) {
  1938                     if (pf->_value.toString().length() > QString(SymbianHelpers::mtmPrefix).length()) {
  1935                         QMessageFolderIdList ids2 = folderIdsByAccountId(QMessageAccountId(pf->_value.toString()));
  1939                         QMessageFolderIdList ids2 = folderIdsByAccountId(QMessageAccountId(pf->_value.toString()));
  1936                         for (int i = 0; i < ids2.count(); i++) {
  1940                         for (int i = 0; i < ids2.count(); i++) {
  1937                             ids.removeOne(ids2[i]);
  1941                             ids.removeOne(ids2[i]);
  1938                         }
  1942                         }
  1939                     }
  1943                     }
  1961                         if (entry.iType == KUidMsvFolderEntry) {
  1965                         if (entry.iType == KUidMsvFolderEntry) {
  1962                             CMsvEntrySelection* pSelection = pEntry->ChildrenWithTypeL(KUidMsvFolderEntry);
  1966                             CMsvEntrySelection* pSelection = pEntry->ChildrenWithTypeL(KUidMsvFolderEntry);
  1963                             CleanupStack::PushL(pSelection);
  1967                             CleanupStack::PushL(pSelection);
  1964                             if (pSelection->Count() > 0) {
  1968                             if (pSelection->Count() > 0) {
  1965                                 for(TInt i = 0; i < pSelection->Count(); i++) {
  1969                                 for(TInt i = 0; i < pSelection->Count(); i++) {
  1966                                     ids.append(QMessageFolderId(QString::number(pSelection->At(i))));
  1970                                     ids.append(QMessageFolderId(SymbianHelpers::addIdPrefix(QString::number(pSelection->At(i)),SymbianHelpers::EngineTypeMTM)));
  1967                                 }
  1971                                 }
  1968                             }
  1972                             }
  1969                             CleanupStack::PopAndDestroy(pSelection);
  1973                             CleanupStack::PopAndDestroy(pSelection);
  1970                         }
  1974                         }
  1971                         releaseCMsvEntryAndPopFromCleanupStack(pEntry);
  1975                         releaseCMsvEntryAndPopFromCleanupStack(pEntry);
  2090     QString nullString = "00000000";
  2094     QString nullString = "00000000";
  2091     QString serviceEntryIdString = QString::number(serviceEntryId);
  2095     QString serviceEntryIdString = QString::number(serviceEntryId);
  2092     serviceEntryIdString = nullString.left(8-serviceEntryIdString.length()) + serviceEntryIdString;
  2096     serviceEntryIdString = nullString.left(8-serviceEntryIdString.length()) + serviceEntryIdString;
  2093     QString folderIdString = QString::number(folderId);
  2097     QString folderIdString = QString::number(folderId);
  2094     folderIdString = nullString.left(8-folderIdString.length()) + folderIdString;
  2098     folderIdString = nullString.left(8-folderIdString.length()) + folderIdString;
  2095     return serviceEntryIdString+folderIdString;
  2099     return SymbianHelpers::addIdPrefix(serviceEntryIdString+folderIdString,SymbianHelpers::EngineTypeMTM);
  2096 }
  2100 }
  2097 
  2101 
  2098 TMsvId CMTMEngine::serviceEntryIdFromQMessageFolderId(const QMessageFolderId& folderId) const
  2102 TMsvId CMTMEngine::serviceEntryIdFromQMessageFolderId(const QMessageFolderId& folderId) const
  2099 {
  2103 {
  2100     return folderId.toString().left(8).toLong(); 
  2104     return SymbianHelpers::stripIdPrefix(folderId.toString()).left(8).toLong(); 
  2101 }
  2105 }
  2102 
  2106 
  2103 TMsvId CMTMEngine::folderIdFromQMessageFolderId(const QMessageFolderId& folderId) const
  2107 TMsvId CMTMEngine::folderIdFromQMessageFolderId(const QMessageFolderId& folderId) const
  2104 {
  2108 {
  2105     return folderId.toString().right(8).toLong(); 
  2109     return SymbianHelpers::stripIdPrefix(folderId.toString()).right(8).toLong(); 
  2106 }
  2110 }
  2107 
  2111 
  2108 void CMTMEngine::handleNestedFiltersFromFolderFilter(QMessageFolderFilter &filter) const
  2112 void CMTMEngine::handleNestedFiltersFromFolderFilter(QMessageFolderFilter &filter) const
  2109 {
  2113 {
  2110     QMessageFolderFilterPrivate* pMFFilter = QMessageFolderFilterPrivate::implementation(filter);
  2114     QMessageFolderFilterPrivate* pMFFilter = QMessageFolderFilterPrivate::implementation(filter);
  2308 
  2312 
  2309 QMessage CMTMEngine::messageL(const QMessageId& id) const
  2313 QMessage CMTMEngine::messageL(const QMessageId& id) const
  2310 {
  2314 {
  2311     QMessage message;
  2315     QMessage message;
  2312 
  2316 
  2313     long int messageId = id.toString().toLong();
  2317     long int messageId = SymbianHelpers::stripIdPrefix(id.toString()).toLong();
  2314     CMsvEntry* pEntry = ipMsvSession->GetEntryL(messageId);
  2318     CMsvEntry* pEntry = ipMsvSession->GetEntryL(messageId);
  2315     CleanupStack::PushL(pEntry);
  2319     CleanupStack::PushL(pEntry);
  2316     
  2320     
  2317     if (pEntry->Entry().iMtm == KUidMsgTypeSMS) {
  2321     if (pEntry->Entry().iMtm == KUidMsgTypeSMS) {
  2318         if (!ipSmsMtm)
  2322         if (!ipSmsMtm)
  2427         // parentFolderId was not defined for new Message
  2431         // parentFolderId was not defined for new Message
  2428         // => Message will be created into defined standard Folder (Default value is Drafts Folder)
  2432         // => Message will be created into defined standard Folder (Default value is Drafts Folder)
  2429         destinationFolderId =  standardFolderId(message.standardFolder());
  2433         destinationFolderId =  standardFolderId(message.standardFolder());
  2430     }
  2434     }
  2431     
  2435     
  2432     // Current entry is the Draft folder.    
  2436     // Switch current SMS MTM context to folder entry    
  2433     ipSmsMtm->SwitchCurrentEntryL(destinationFolderId);     
  2437     ipSmsMtm->SwitchCurrentEntryL(destinationFolderId);
  2434     // Create a new SMS message entry as a child of the current context.    
  2438 
  2435     ipSmsMtm->CreateMessageL(KUidMsgTypeSMS.iUid);     
  2439     // Create a new SMS message entry as a child of the current context
  2436     TMsvEntry entry = ipSmsMtm->Entry().Entry();
  2440     //
  2437     
  2441     // Note: CreateMessageL sets following values to new message entry:
       
  2442     //       entry.iType = KUidMsvMessageEntry;
       
  2443     //       entry.iRelatedId = <ID of the current SMS service>;
       
  2444     //       entry.iServiceId = KMsvLocalServiceIndexEntryId;
       
  2445     //       entry.iMtm = <SMS Message Type UID>;
       
  2446     //       entry.SetVisible(EFalse);
       
  2447     //       entry.SetInPreparation(ETrue);
       
  2448     //       entry.iDate.UniversalTime(); <= Not set in older platforms
       
  2449     //
       
  2450     // Note: CreateMessageL automatically creates SMS header
       
  2451     //       that contains default service settings & default
       
  2452     //       service center address
       
  2453     //
       
  2454     // Note: CreateMessageL switches current SMS MTM context to
       
  2455     //       a new SMS message context
       
  2456     ipSmsMtm->CreateMessageL(KUidMsgTypeSMS.iUid);
       
  2457     
       
  2458     // Get the current context (new message context)
       
  2459     CMsvEntry& newMessageContext = ipSmsMtm->Entry();
       
  2460     
       
  2461     // Copy entry values from the new message context index entry
       
  2462     TMsvEntry entry = newMessageContext.Entry();
       
  2463     
       
  2464     // Set priority values to message entry
  2438     switch (message.priority()) {
  2465     switch (message.priority()) {
  2439     case QMessage::HighPriority:
  2466     case QMessage::HighPriority:
  2440         entry.SetPriority(EMsvHighPriority);
  2467         entry.SetPriority(EMsvHighPriority);
  2441         break;
  2468         break;
  2442     case QMessage::NormalPriority:
  2469     case QMessage::NormalPriority:
  2444         break;
  2471         break;
  2445     case QMessage::LowPriority:
  2472     case QMessage::LowPriority:
  2446         entry.SetPriority(EMsvLowPriority);
  2473         entry.SetPriority(EMsvLowPriority);
  2447         break;
  2474         break;
  2448     }
  2475     }
       
  2476     
       
  2477     // Set message read status to message entry
  2449     if (message.status() & QMessage::Read) { 
  2478     if (message.status() & QMessage::Read) { 
  2450         entry.SetUnread(false);
  2479         entry.SetUnread(false);
  2451         entry.SetNew(false);
  2480         entry.SetNew(false);
  2452     } else {
  2481     } else {
  2453         entry.SetUnread(true);
  2482         entry.SetUnread(true);
  2454         entry.SetNew(true);
  2483         entry.SetNew(true);
  2455     }
  2484     }
  2456     ipSmsMtm->Entry().ChangeL(entry);
  2485     
  2457     
  2486     // Set first message addressee to message entry
       
  2487     // and all message addressees to SMS message
  2458     QList<QMessageAddress> list(message.to());
  2488     QList<QMessageAddress> list(message.to());
  2459     if (!list.empty()){
  2489     if (!list.empty()){
  2460         TPtrC16 receiver(KNullDesC);
  2490         TPtrC16 receiver(KNullDesC);
  2461         QString qreceiver;
  2491         QString qreceiver;
  2462         for (int i = 0; i < list.size(); ++i) {
  2492         for (int i = 0; i < list.size(); ++i) {
  2463             qreceiver = list.at(i).addressee();
  2493             qreceiver = list.at(i).addressee();
  2464             receiver.Set(reinterpret_cast<const TUint16*>(qreceiver.utf16()));
  2494             receiver.Set(reinterpret_cast<const TUint16*>(qreceiver.utf16()));
       
  2495             if (i == 0) {
       
  2496                 // Set addressee to message entry 
       
  2497                 entry.iDetails.Set(receiver);
       
  2498             }
       
  2499             // Add addressee to SMS message
  2465             ipSmsMtm->AddAddresseeL(receiver); 
  2500             ipSmsMtm->AddAddresseeL(receiver); 
  2466             ipSmsMtm->SaveMessageL();
  2501         }
  2467             }
  2502     }
  2468     }
  2503     
  2469     
  2504     // Set body to message entry and SMS message
  2470     CMsvStore* store = ipSmsMtm->Entry().EditStoreL(); 
       
  2471     CleanupStack::PushL(store);
       
  2472     
       
  2473     QString body = message.textContent();
  2505     QString body = message.textContent();
  2474     if (!body.isEmpty()){
  2506     if (!body.isEmpty()){
  2475         TPtrC16 msg(reinterpret_cast<const TUint16*>(body.utf16()));
  2507         TPtrC16 msg(reinterpret_cast<const TUint16*>(body.utf16()));
  2476         if (!ipRichText) {
  2508 
  2477             ipCharFormatLayer = CCharFormatLayer::NewL();
  2509         // Set body to message entry 
  2478             ipParaFormatLayer = CParaFormatLayer::NewL();
  2510         entry.iDescription.Set(msg);
  2479             ipRichText=CRichText::NewL(ipParaFormatLayer,ipCharFormatLayer);
  2511 
  2480         }
  2512         // Set body to SMS message
  2481         ipRichText->Reset();
  2513         CRichText& body = ipSmsMtm->Body();
  2482         ipRichText->InsertL(0, msg);
  2514         body.Reset();
  2483         store->StoreBodyTextL(*ipRichText);
  2515         body.InsertL(0, msg);
  2484         store->CommitL();
  2516     }
  2485     } 
  2517 
  2486     CleanupStack::PopAndDestroy(store);
  2518     // Set date to message entry
  2487     
  2519     if (!message.receivedDate().isNull() || !message.date().isNull()) {
       
  2520         if (!message.date().isNull()) {
       
  2521             entry.iDate = qDateTimeToSymbianTTime(message.date());
       
  2522         } else {
       
  2523             entry.iDate = qDateTimeToSymbianTTime(message.receivedDate());
       
  2524         }
       
  2525     }
       
  2526     
       
  2527     // Set new message's context's index entry to the specified values.
       
  2528     // <=> Changes are set into cache only
       
  2529     newMessageContext.ChangeL(entry);
       
  2530     
       
  2531     // Commit cached changes to the storage
       
  2532     // Note: SaveMessageL sets following values to message entry:
       
  2533     //       entry.SetVisible(ETrue);
       
  2534     //       entry.SetInPreparation(EFalse);
       
  2535     ipSmsMtm->SaveMessageL();  
       
  2536 
       
  2537     // Get message id from new SMS message index entry 
  2488     QMessagePrivate* privateMessage = QMessagePrivate::implementation(message);
  2538     QMessagePrivate* privateMessage = QMessagePrivate::implementation(message);
  2489     privateMessage->_id = QMessageId(QString::number(entry.Id()));
  2539     privateMessage->_id = QMessageId(SymbianHelpers::addIdPrefix(QString::number(entry.Id())));
  2490     
       
  2491     if (!message.receivedDate().isNull() || !message.date().isNull()) {
       
  2492         // Change the date to given date
       
  2493         CMsvEntry* pEntry = ipMsvSession->GetEntryL(entry.Id());
       
  2494         CleanupStack::PushL(pEntry);
       
  2495         TMsvEntry changedEntry = pEntry->Entry();
       
  2496         if (!message.date().isNull()) {
       
  2497             changedEntry.iDate = qDateTimeToSymbianTTime(message.date());
       
  2498         } else {
       
  2499             changedEntry.iDate = qDateTimeToSymbianTTime(message.receivedDate());
       
  2500         }
       
  2501         pEntry->ChangeL(changedEntry);
       
  2502         CleanupStack::PopAndDestroy(pEntry);
       
  2503     }
       
  2504 }
  2540 }
  2505 
  2541 
  2506 bool CMTMEngine::sendSMS(QMessage &message)
  2542 bool CMTMEngine::sendSMS(QMessage &message)
  2507 {
  2543 {
  2508     if (!iSessionReady) {
  2544     if (!iSessionReady) {
  2515     }
  2551     }
  2516     
  2552     
  2517     return true;
  2553     return true;
  2518 }
  2554 }
  2519 
  2555 
       
  2556 bool CMTMEngine::validateSMS()
       
  2557 {
       
  2558     
       
  2559     // Validate SMS body.
       
  2560     TMsvPartList result(KMsvMessagePartNone);
       
  2561     result = ipSmsMtm->ValidateMessage(KMsvMessagePartBody);
       
  2562     if (result != KMsvMessagePartNone ) {
       
  2563         return false;
       
  2564     }
       
  2565     
       
  2566     // Validate SMS recipient
       
  2567     result = ipSmsMtm->ValidateMessage(KMsvMessagePartRecipient);
       
  2568     if ( result != KMsvMessagePartNone ) {
       
  2569         return false;
       
  2570     }
       
  2571     
       
  2572     return true;
       
  2573 }
       
  2574 
  2520 void CMTMEngine::sendSMSL(QMessage &message)
  2575 void CMTMEngine::sendSMSL(QMessage &message)
  2521 {
  2576 {
  2522     if (!iSessionReady) {
  2577     if (!iSessionReady) {
  2523         User::Leave(KErrNotReady);
  2578         User::Leave(KErrNotReady);
  2524     }
  2579     }
  2525     
  2580 
  2526     if (!message.id().isValid()) {
  2581     if (!message.id().isValid()) {
  2527         QMessagePrivate::setStandardFolder(message, QMessage::DraftsFolder);
  2582         QMessagePrivate::setStandardFolder(message, QMessage::DraftsFolder);
  2528         storeSMSL(message);
  2583         storeSMSL(message);
  2529     }
  2584     }
  2530     
  2585 
  2531     long int messageId = message.id().toString().toLong();
  2586     long int messageId = SymbianHelpers::stripIdPrefix(message.id().toString()).toLong();
  2532     if (messageId == 0) {
  2587     if (messageId == 0) {
  2533         User::Leave(KErrNotReady);
  2588         User::Leave(KErrNotReady);
  2534     }
  2589     }
  2535     
  2590 
  2536     CMsvEntry* pMsvEntry = retrieveCMsvEntryAndPushToCleanupStack(messageId);
  2591     // Switch current SMS MTM context to message entry    
  2537     CMsvOperationWait* pMsvOperationWait = CMsvOperationWait::NewLC();
  2592     ipSmsMtm->SwitchCurrentEntryL(messageId);
  2538     
  2593     
  2539     ipSmsMtm->SwitchCurrentEntryL(pMsvEntry->Entry().Parent());
  2594     // Load the cache with the message data 
  2540     // Following sends SMS and _moves_ SMS from Drafts Folder to Sent Folder
  2595     ipSmsMtm->LoadMessageL(); 
  2541     CMsvOperation* pMsvOperation = ipSmsMtm->Entry().CopyL(messageId, ipSmsMtm->ServiceId(), pMsvOperationWait->iStatus);
  2596     
  2542     pMsvOperationWait->Start();
  2597     // Copy entry values from the message context index entry
  2543     CActiveScheduler::Start();
  2598     TMsvEntry entry = ipSmsMtm->Entry().Entry();    
  2544     delete pMsvOperation;    
  2599 
  2545     
  2600     // Update date to UniversalTime
  2546     CleanupStack::PopAndDestroy(pMsvOperationWait);
  2601     // <=> Date field is used to control message send time
  2547     releaseCMsvEntryAndPopFromCleanupStack(pMsvEntry);    
  2602     entry.iDate.UniversalTime();
       
  2603 
       
  2604     // Update message sending state
       
  2605     entry.SetSendingState(KMsvSendStateWaiting);
       
  2606     
       
  2607     // Set SMS Service & delivery settings to the SMS header
       
  2608     CSmsHeader& smsHeader = ipSmsMtm->SmsHeader();
       
  2609     CSmsSettings* pSmsSettings = CSmsSettings::NewL();
       
  2610     CleanupStack::PushL(pSmsSettings);
       
  2611  
       
  2612     pSmsSettings->CopyL(ipSmsMtm->ServiceSettings());
       
  2613     pSmsSettings->SetDelivery(ESmsDeliveryImmediately);
       
  2614     pSmsSettings->SetDeliveryReport(EFalse);
       
  2615     smsHeader.SetSmsSettingsL(*pSmsSettings);
       
  2616  
       
  2617     if (smsHeader.Message().ServiceCenterAddress().Length() == 0) {
       
  2618         CSmsSettings* pSmsServiceSettings = &(ipSmsMtm->ServiceSettings());
       
  2619         if (!pSmsServiceSettings->ServiceCenterCount()) {
       
  2620             User::Leave(KErrNotReady);
       
  2621         } else {
       
  2622             CSmsNumber* pSmsCenterNumber = CSmsNumber::NewL();
       
  2623             CleanupStack::PushL(pSmsCenterNumber);
       
  2624             pSmsCenterNumber->SetAddressL((pSmsServiceSettings->GetServiceCenter(pSmsServiceSettings->DefaultServiceCenter())).Address());
       
  2625             smsHeader.Message().SetServiceCenterAddressL(pSmsCenterNumber->Address());
       
  2626             CleanupStack::PopAndDestroy(pSmsCenterNumber);
       
  2627         }
       
  2628     }
       
  2629  
       
  2630     CleanupStack::PopAndDestroy(pSmsSettings);    
       
  2631 
       
  2632     // Update message's context's index entry to the new values.
       
  2633     // <=> Changes are set into cache only
       
  2634     ipSmsMtm->Entry().ChangeL(entry);
       
  2635     
       
  2636     // Commit cached changes to the storage
       
  2637     ipSmsMtm->SaveMessageL();
       
  2638     
       
  2639     if (validateSMS()) {
       
  2640         // Switch current SMS MTM context to SMS message parent folder entry
       
  2641         ipSmsMtm->SwitchCurrentEntryL(ipSmsMtm->Entry().Entry().Parent());
       
  2642         
       
  2643         CMsvOperationWait* pMsvOperationWait = CMsvOperationWait::NewLC();
       
  2644     
       
  2645         // Move SMS Message to Outbox
       
  2646         CMsvOperation* pMsvOperation = ipSmsMtm->Entry().MoveL(messageId,
       
  2647                                                                KMsvGlobalOutBoxIndexEntryId,
       
  2648                                                                pMsvOperationWait->iStatus);
       
  2649         pMsvOperationWait->Start();
       
  2650         CActiveScheduler::Start();
       
  2651         delete pMsvOperation;
       
  2652         
       
  2653         // Send SMS Message
       
  2654         CMsvEntrySelection* pMsvEntrySelection = new(ELeave) CMsvEntrySelection;
       
  2655         CleanupStack::PushL(pMsvEntrySelection);
       
  2656     
       
  2657         // Add SMS Message Id to selection
       
  2658         pMsvEntrySelection->AppendL(messageId); 
       
  2659      
       
  2660         // Add selection (containing SMS Message Id) to task scheduler
       
  2661         TBuf8<1> dummyParams;
       
  2662         pMsvOperation = ipSmsMtm->InvokeAsyncFunctionL(ESmsMtmCommandScheduleCopy,
       
  2663                                                        *pMsvEntrySelection,
       
  2664                                                        dummyParams,
       
  2665                                                        pMsvOperationWait->iStatus);
       
  2666         pMsvOperationWait->Start();
       
  2667         CActiveScheduler::Start();
       
  2668         delete pMsvOperation;    
       
  2669      
       
  2670         CleanupStack::PopAndDestroy(pMsvEntrySelection);    
       
  2671     
       
  2672         CleanupStack::PopAndDestroy(pMsvOperationWait);
       
  2673     } else {
       
  2674         User::Leave(KErrCorrupt);
       
  2675     }
  2548 }
  2676 }
  2549 
  2677 
  2550 void CMTMEngine::storeMMSL(QMessage &message)
  2678 void CMTMEngine::storeMMSL(QMessage &message)
  2551 {
  2679 {
  2552     if (!iSessionReady) {
  2680     if (!iSessionReady) {
  2735     }
  2863     }
  2736          
  2864          
  2737     CleanupStack::PopAndDestroy(); // store    
  2865     CleanupStack::PopAndDestroy(); // store    
  2738     
  2866     
  2739     QMessagePrivate* privateMessage = QMessagePrivate::implementation(message);
  2867     QMessagePrivate* privateMessage = QMessagePrivate::implementation(message);
  2740     privateMessage->_id = QMessageId(QString::number(indexEntry)); 
  2868     privateMessage->_id = QMessageId(SymbianHelpers::addIdPrefix(QString::number(indexEntry,SymbianHelpers::EngineTypeMTM)));
  2741     // Save the changes
  2869     // Save the changes
  2742     ipMmsMtm->SaveMessageL();
  2870     ipMmsMtm->SaveMessageL();
  2743     
  2871     
  2744     if (!message.receivedDate().isNull() || !message.date().isNull()) {
  2872     if (!message.receivedDate().isNull() || !message.date().isNull()) {
  2745         // Change the date to given date
  2873         // Change the date to given date
  2761     if (!iSessionReady) {
  2889     if (!iSessionReady) {
  2762         User::Leave(KErrNotReady);
  2890         User::Leave(KErrNotReady);
  2763     }
  2891     }
  2764     
  2892     
  2765     QMessageId id = message.id();
  2893     QMessageId id = message.id();
  2766     long int messageId = id.toString().toLong();
  2894     long int messageId = SymbianHelpers::stripIdPrefix(id.toString()).toLong();
  2767     if (messageId == 0)
  2895     if (messageId == 0)
  2768         return;
  2896         return;
  2769     
  2897     
  2770     CMsvEntry* entry = ipMsvSession->GetEntryL(messageId);
  2898     CMsvEntry* entry = ipMsvSession->GetEntryL(messageId);
  2771     CleanupStack::PushL(entry);
  2899     CleanupStack::PushL(entry);
  2847     if (!iSessionReady) {
  2975     if (!iSessionReady) {
  2848         User::Leave(KErrNotReady);
  2976         User::Leave(KErrNotReady);
  2849     }
  2977     }
  2850     
  2978     
  2851     QMessageId id = message.id();
  2979     QMessageId id = message.id();
  2852     long int messageId = id.toString().toLong();
  2980     long int messageId = SymbianHelpers::stripIdPrefix(id.toString()).toLong();
  2853     if (messageId == 0)
  2981     if (messageId == 0)
  2854         return;
  2982         return;
  2855     
  2983     
  2856     ipMmsMtm->SwitchCurrentEntryL(messageId);
  2984     ipMmsMtm->SwitchCurrentEntryL(messageId);
  2857     ipMmsMtm->LoadMessageL();
  2985     ipMmsMtm->LoadMessageL();
  3040     if (!iSessionReady) {
  3168     if (!iSessionReady) {
  3041         User::Leave(KErrNotReady);
  3169         User::Leave(KErrNotReady);
  3042     }
  3170     }
  3043 
  3171 
  3044     QMessageId id = message.id();
  3172     QMessageId id = message.id();
  3045     long int messageId = id.toString().toLong();
  3173     long int messageId = SymbianHelpers::stripIdPrefix(id.toString()).toLong();
  3046     if (messageId == 0)
  3174     if (messageId == 0)
  3047         return;
  3175         return;
  3048     
  3176     
  3049     CMsvEntry* pEntry = ipMsvSession->GetEntryL(messageId);
  3177     CMsvEntry* pEntry = ipMsvSession->GetEntryL(messageId);
  3050     TUid mtmUid = pEntry->Entry().iMtm;
  3178     TUid mtmUid = pEntry->Entry().iMtm;
  3308         QMessagePrivate::setStandardFolder(message, QMessage::OutboxFolder);
  3436         QMessagePrivate::setStandardFolder(message, QMessage::OutboxFolder);
  3309         storeMMSL(message);
  3437         storeMMSL(message);
  3310         messageCreated = true;
  3438         messageCreated = true;
  3311     }
  3439     }
  3312     
  3440     
  3313     long int messageId = message.id().toString().toLong();
  3441     long int messageId = SymbianHelpers::stripIdPrefix(message.id().toString()).toLong();
  3314     if (messageId == 0) {
  3442     if (messageId == 0) {
  3315         User::Leave(KErrNotReady);
  3443         User::Leave(KErrNotReady);
  3316     }
  3444     }
  3317 
  3445 
  3318     CMsvEntry* pMsvEntry = retrieveCMsvEntryAndPushToCleanupStack(messageId);
  3446     CMsvEntry* pMsvEntry = retrieveCMsvEntryAndPushToCleanupStack(messageId);
  3652     releaseCMsvEntryAndPopFromCleanupStack(pMsvEntry);
  3780     releaseCMsvEntryAndPopFromCleanupStack(pMsvEntry);
  3653 
  3781 
  3654     CleanupStack::PopAndDestroy(pMsvOperationWait);
  3782     CleanupStack::PopAndDestroy(pMsvOperationWait);
  3655     
  3783     
  3656     QMessagePrivate* privateMessage = QMessagePrivate::implementation(message);
  3784     QMessagePrivate* privateMessage = QMessagePrivate::implementation(message);
  3657     privateMessage->_id = QMessageId(QString::number(newMessageId)); 
  3785     privateMessage->_id = QMessageId(SymbianHelpers::addIdPrefix(QString::number(newMessageId),SymbianHelpers::EngineTypeMTM));
  3658 }
  3786 }
  3659 
  3787 
  3660 void CMTMEngine::sendEmailL(QMessage &message)
  3788 void CMTMEngine::sendEmailL(QMessage &message)
  3661 {
  3789 {
  3662     if (!iSessionReady) {
  3790     if (!iSessionReady) {
  3681         message.setParentAccountId(accountId);
  3809         message.setParentAccountId(accountId);
  3682         storeEmailL(message);
  3810         storeEmailL(message);
  3683         messageCreated = true;
  3811         messageCreated = true;
  3684     }    
  3812     }    
  3685     
  3813     
  3686     long int messageId = message.id().toString().toLong();
  3814     long int messageId = SymbianHelpers::stripIdPrefix(message.id().toString()).toLong();
  3687     if (messageId == 0) {
  3815     if (messageId == 0) {
  3688         User::Leave(KErrNotReady);
  3816         User::Leave(KErrNotReady);
  3689     }    
  3817     }    
  3690 
  3818 
  3691     CMsvEntry* pMsvEntry = retrieveCMsvEntryAndPushToCleanupStack(messageId);
  3819     CMsvEntry* pMsvEntry = retrieveCMsvEntryAndPushToCleanupStack(messageId);
  4436                            aMsgType == KUidMsgTypeIMAP4) {
  4564                            aMsgType == KUidMsgTypeIMAP4) {
  4437                     message.setType(QMessage::Email);
  4565                     message.setType(QMessage::Email);
  4438                 } else {
  4566                 } else {
  4439                     message.setType(QMessage::NoType);
  4567                     message.setType(QMessage::NoType);
  4440                 }
  4568                 }
  4441             } else if ((privateMessageFilter->_field == QMessageFilterPrivate::StandardFolder) && 
  4569             } else if ((privateMessageFilter->_field == QMessageFilterPrivate::StandardFolder) &&
  4442                        (aMsgType == KUidMsgTypeSMS || aMsgType == KUidMsgTypeMultimedia)) {
  4570                        (aMsgType == KUidMsgTypeSMS || aMsgType == KUidMsgTypeMultimedia)) {
  4443                 if (aFolderId == KMsvGlobalInBoxIndexEntryId) {
  4571                 if (aFolderId == KMsvGlobalInBoxIndexEntryId) {
  4444                     QMessagePrivate::setStandardFolder(message,QMessage::InboxFolder);
  4572                     QMessagePrivate::setStandardFolder(message,QMessage::InboxFolder);
  4445                 } else if (aFolderId == KMsvDraftEntryId) {
  4573                 } else if (aFolderId == KMsvDraftEntryId) {
  4446                     QMessagePrivate::setStandardFolder(message,QMessage::DraftsFolder);
  4574                     QMessagePrivate::setStandardFolder(message,QMessage::DraftsFolder);
  4447                 } else if (aFolderId == KMsvSentEntryId) {
  4575                 } else if (aFolderId == KMsvSentEntryId) {
  4448                     QMessagePrivate::setStandardFolder(message,QMessage::SentFolder);
  4576                     QMessagePrivate::setStandardFolder(message,QMessage::SentFolder);
  4449                 } else if (aFolderId == KMsvDeletedEntryFolderEntryId) {
  4577                 } else if (aFolderId == KMsvDeletedEntryFolderEntryId) {
  4450                     QMessagePrivate::setStandardFolder(message,QMessage::TrashFolder);
  4578                     QMessagePrivate::setStandardFolder(message,QMessage::TrashFolder);
  4451                 }       
  4579                 }
  4452             } else if (!messageRetrieved) {
  4580             } else if (!messageRetrieved) {
  4453                 message = this->message(QMessageId(QString::number(aMessageId)));
  4581                 message = this->message(QMessageId(SymbianHelpers::addIdPrefix(QString::number(aMessageId),SymbianHelpers::EngineTypeMTM)));
  4454                 if (message.type() == QMessage::NoType) {
  4582                 if (message.type() == QMessage::NoType) {
  4455                     unableToReadAndFilterMessage = true;
  4583                     unableToReadAndFilterMessage = true;
  4456                     matchingFilters.clear();
  4584                     matchingFilters.clear();
  4457                     break;
  4585                     break;
  4458                 } else {
  4586                 } else {
  4500             tryToDeliverMessageNotifications();
  4628             tryToDeliverMessageNotifications();
  4501         } else {
  4629         } else {
  4502             // No pending notification events for this messageId.
  4630             // No pending notification events for this messageId.
  4503             // => Deliver notification immediately
  4631             // => Deliver notification immediately
  4504             ipMessageStorePrivate->messageNotification(notificationType,
  4632             ipMessageStorePrivate->messageNotification(notificationType,
  4505                                                        QMessageId(QString::number(aMessageId)),
  4633                                                        QMessageId(SymbianHelpers::addIdPrefix(QString::number(aMessageId),SymbianHelpers::EngineTypeMTM)),
  4506                                                        matchingFilters);
  4634                                                        matchingFilters);
  4507         }
  4635         }
  4508     } else if (unableToReadAndFilterMessage) {
  4636     } else if (unableToReadAndFilterMessage) {
  4509         if (notificationType != QMessageStorePrivate::Removed) {
  4637         if (notificationType != QMessageStorePrivate::Removed) {
  4510             MessageEvent event;
  4638             MessageEvent event;
  4536         while (count--) {
  4664         while (count--) {
  4537             // Try to deliver the oldest message event notification first
  4665             // Try to deliver the oldest message event notification first
  4538             MessageEvent event = iUndeliveredMessageEvents[0];
  4666             MessageEvent event = iUndeliveredMessageEvents[0];
  4539             bool eventHandlingPossible = true;
  4667             bool eventHandlingPossible = true;
  4540             if (event.notificationType != QMessageStorePrivate::Removed && event.unfiltered) {
  4668             if (event.notificationType != QMessageStorePrivate::Removed && event.unfiltered) {
  4541                 QMessage message = this->message(QMessageId(QString::number(event.messageId)));
  4669                 QMessage message = this->message(QMessageId(SymbianHelpers::addIdPrefix(QString::number(event.messageId),SymbianHelpers::EngineTypeMTM)));
  4542                 if (message.type() == QMessage::NoType) {
  4670                 if (message.type() == QMessage::NoType) {
  4543                     eventHandlingPossible = false;
  4671                     eventHandlingPossible = false;
  4544                 } else {
  4672                 } else {
  4545                     event.matchingFilters.clear();
  4673                     event.matchingFilters.clear();
  4546                     // Copy the filter map to protect against modification during traversal
  4674                     // Copy the filter map to protect against modification during traversal
  4567                 iUndeliveredMessageEvents.removeFirst();
  4695                 iUndeliveredMessageEvents.removeFirst();
  4568                 iDeliveryTriesCounter = 0;
  4696                 iDeliveryTriesCounter = 0;
  4569                 if (event.matchingFilters.count() > 0) { 
  4697                 if (event.matchingFilters.count() > 0) { 
  4570                     // Deliver message event notification
  4698                     // Deliver message event notification
  4571                     ipMessageStorePrivate->messageNotification(event.notificationType,
  4699                     ipMessageStorePrivate->messageNotification(event.notificationType,
  4572                                                                QMessageId(QString::number(event.messageId)),
  4700                                                                QMessageId(SymbianHelpers::addIdPrefix(QString::number(event.messageId),SymbianHelpers::EngineTypeMTM)),
  4573                                                                event.matchingFilters);
  4701                                                                event.matchingFilters);
  4574                 }
  4702                 }
  4575             } else {
  4703             } else {
  4576                 // New message entry was NOT ready to be read
  4704                 // New message entry was NOT ready to be read
  4577                 iDeliveryTriesCounter++;
  4705                 iDeliveryTriesCounter++;
  4705             // => return all messages
  4833             // => return all messages
  4706             ipEntrySelection = new(ELeave)CMsvEntrySelection;
  4834             ipEntrySelection = new(ELeave)CMsvEntrySelection;
  4707             getAllMessagesL(iOrdering);
  4835             getAllMessagesL(iOrdering);
  4708             iIdList = QMessageIdList();
  4836             iIdList = QMessageIdList();
  4709             for (int i=0; i < ipEntrySelection->Count(); i++) {
  4837             for (int i=0; i < ipEntrySelection->Count(); i++) {
  4710                 iIdList.append(QMessageId(QString::number((*ipEntrySelection)[i]))); 
  4838                 iIdList.append(QMessageId(SymbianHelpers::addIdPrefix(QString::number((*ipEntrySelection)[i]),SymbianHelpers::EngineTypeMTM)));
  4711             }
  4839             }
  4712         }
  4840         }
  4713         iNumberOfHandledFilters++;
  4841         iNumberOfHandledFilters++;
  4714         iTimer.After(iStatus, 1);
  4842         iTimer.After(iStatus, 1);
  4715         if (!IsActive()) {
  4843         if (!IsActive()) {
  4791     case QMessageFilterPrivate::Id:
  4919     case QMessageFilterPrivate::Id:
  4792         {
  4920         {
  4793         iNumberOfHandledFilters++;
  4921         iNumberOfHandledFilters++;
  4794         if (pf->_comparatorType == QMessageFilterPrivate::Equality) { // QMessageId
  4922         if (pf->_comparatorType == QMessageFilterPrivate::Equality) { // QMessageId
  4795             QMessageDataComparator::EqualityComparator cmp(static_cast<QMessageDataComparator::EqualityComparator>(pf->_comparatorValue));
  4923             QMessageDataComparator::EqualityComparator cmp(static_cast<QMessageDataComparator::EqualityComparator>(pf->_comparatorValue));
  4796             if (!pf->_value.isNull() && pf->_value.toString().length() > 0) {
  4924             if (!pf->_value.isNull() && pf->_value.toString().length() > QString(SymbianHelpers::mtmPrefix).length()) {
  4797                 if (cmp == QMessageDataComparator::Equal) {
  4925                 if (cmp == QMessageDataComparator::Equal) {
  4798                     long int messageId = pf->_value.toString().toLong();
  4926                     long int messageId = SymbianHelpers::stripIdPrefix(pf->_value.toString()).toLong();
  4799                     CMsvEntry* pEntry = iOwner.retrieveCMsvEntryAndPushToCleanupStack(messageId);
  4927                     CMsvEntry* pEntry = iOwner.retrieveCMsvEntryAndPushToCleanupStack(messageId);
  4800                     if (pEntry) {
  4928                     if (pEntry) {
  4801                         const TMsvEntry& entry = pEntry->Entry();
  4929                         const TMsvEntry& entry = pEntry->Entry();
  4802                         if (entry.iType == KUidMsvMessageEntry) {
  4930                         if (entry.iType == KUidMsvMessageEntry) {
  4803                             ipEntrySelection = new(ELeave)CMsvEntrySelection;
  4931                             ipEntrySelection = new(ELeave)CMsvEntrySelection;
  4807                     }
  4935                     }
  4808                     iResultCorrectlyOrdered = true;
  4936                     iResultCorrectlyOrdered = true;
  4809                 } else { // NotEqual
  4937                 } else { // NotEqual
  4810                     ipEntrySelection = new(ELeave)CMsvEntrySelection;
  4938                     ipEntrySelection = new(ELeave)CMsvEntrySelection;
  4811                     getAllMessagesL(iOrdering);
  4939                     getAllMessagesL(iOrdering);
  4812                     long int messageId = pf->_value.toString().toLong();
  4940                     long int messageId = SymbianHelpers::stripIdPrefix(pf->_value.toString()).toLong();
  4813                     for (int i=0; i < ipEntrySelection->Count(); i++) {
  4941                     for (int i=0; i < ipEntrySelection->Count(); i++) {
  4814                         if (ipEntrySelection->At(i) == messageId) {
  4942                         if (ipEntrySelection->At(i) == messageId) {
  4815                             ipEntrySelection->Delete(i);
  4943                             ipEntrySelection->Delete(i);
  4816                             break;
  4944                             break;
  4817                         }
  4945                         }
  4827             QMessageDataComparator::InclusionComparator cmp(static_cast<QMessageDataComparator::InclusionComparator>(pf->_comparatorValue));
  4955             QMessageDataComparator::InclusionComparator cmp(static_cast<QMessageDataComparator::InclusionComparator>(pf->_comparatorValue));
  4828             if (pf->_ids.count() > 0) { // QMessageIdList
  4956             if (pf->_ids.count() > 0) { // QMessageIdList
  4829                 if (cmp == QMessageDataComparator::Includes) {
  4957                 if (cmp == QMessageDataComparator::Includes) {
  4830                     ipEntrySelection = new(ELeave)CMsvEntrySelection;
  4958                     ipEntrySelection = new(ELeave)CMsvEntrySelection;
  4831                     for (int i=0; i < pf->_ids.count(); i++) {
  4959                     for (int i=0; i < pf->_ids.count(); i++) {
  4832                         long int messageId = pf->_ids[i].toString().toLong();
  4960                         long int messageId = SymbianHelpers::stripIdPrefix(pf->_ids[i].toString()).toLong();
  4833                         CMsvEntry* pEntry = iOwner.retrieveCMsvEntryAndPushToCleanupStack(messageId);
  4961                         CMsvEntry* pEntry = iOwner.retrieveCMsvEntryAndPushToCleanupStack(messageId);
  4834                         if (pEntry) {
  4962                         if (pEntry) {
  4835                             const TMsvEntry& entry = pEntry->Entry();
  4963                             const TMsvEntry& entry = pEntry->Entry();
  4836                             if (entry.iType == KUidMsvMessageEntry) {
  4964                             if (entry.iType == KUidMsvMessageEntry) {
  4837                                 ipEntrySelection->AppendL(messageId);
  4965                                 ipEntrySelection->AppendL(messageId);
  4841                     }
  4969                     }
  4842                 } else { // Excludes
  4970                 } else { // Excludes
  4843                     ipEntrySelection = new(ELeave)CMsvEntrySelection;
  4971                     ipEntrySelection = new(ELeave)CMsvEntrySelection;
  4844                     getAllMessagesL(iOrdering);
  4972                     getAllMessagesL(iOrdering);
  4845                     for (int i=0; i < pf->_ids.count(); i++) {
  4973                     for (int i=0; i < pf->_ids.count(); i++) {
  4846                         long int messageId = pf->_ids[i].toString().toLong();
  4974                         long int messageId = SymbianHelpers::stripIdPrefix(pf->_ids[i].toString()).toLong();
  4847                         for (int i=0; i < ipEntrySelection->Count(); i++) {
  4975                         for (int i=0; i < ipEntrySelection->Count(); i++) {
  4848                             if (ipEntrySelection->At(i) == messageId) {
  4976                             if (ipEntrySelection->At(i) == messageId) {
  4849                                 ipEntrySelection->Delete(i);
  4977                                 ipEntrySelection->Delete(i);
  4850                                 break;
  4978                                 break;
  4851                             }
  4979                             }
  4942     case QMessageFilterPrivate::ParentFolderId:
  5070     case QMessageFilterPrivate::ParentFolderId:
  4943         {
  5071         {
  4944         if (pf->_comparatorType == QMessageFilterPrivate::Equality) { // QMessageFolderId
  5072         if (pf->_comparatorType == QMessageFilterPrivate::Equality) { // QMessageFolderId
  4945             QMessageDataComparator::EqualityComparator cmp(static_cast<QMessageDataComparator::EqualityComparator>(pf->_comparatorValue));
  5073             QMessageDataComparator::EqualityComparator cmp(static_cast<QMessageDataComparator::EqualityComparator>(pf->_comparatorValue));
  4946             if (cmp == QMessageDataComparator::Equal) {
  5074             if (cmp == QMessageDataComparator::Equal) {
  4947                 long int folderId = iOwner.folderIdFromQMessageFolderId(QMessageFolderId(pf->_value.toString())); 
  5075                 long int folderId = iOwner.folderIdFromQMessageFolderId(QMessageFolderId(pf->_value.toString()));
  4948                 long int serviceEntryId = iOwner.serviceEntryIdFromQMessageFolderId(QMessageFolderId(pf->_value.toString()));
  5076                 long int serviceEntryId = iOwner.serviceEntryIdFromQMessageFolderId(QMessageFolderId(pf->_value.toString()));
  4949                 QMessageAccount messageAccount = iOwner.account(iOwner.accountIdByServiceId(serviceEntryId));
  5077                 QMessageAccount messageAccount = iOwner.account(iOwner.accountIdByServiceId(serviceEntryId));
  4950                 if (messageAccount.messageTypes() == QMessage::Email) {
  5078                 if (messageAccount.messageTypes() == QMessage::Email) {
  4951                     iNumberOfHandledFilters++;
  5079                     iNumberOfHandledFilters++;
  4952                     CMsvEntryFilter* pFilter = CMsvEntryFilter::NewLC();
  5080                     CMsvEntryFilter* pFilter = CMsvEntryFilter::NewLC();
  5347             SetActive();
  5475             SetActive();
  5348         }
  5476         }
  5349     } else {
  5477     } else {
  5350         iIdList = QMessageIdList();
  5478         iIdList = QMessageIdList();
  5351         for (int i=0; i < ipEntrySelection->Count(); i++) {
  5479         for (int i=0; i < ipEntrySelection->Count(); i++) {
  5352             iIdList.append(QMessageId(QString::number((*ipEntrySelection)[i]))); 
  5480             iIdList.append(QMessageId(SymbianHelpers::addIdPrefix(QString::number((*ipEntrySelection)[i]),SymbianHelpers::EngineTypeMTM)));
  5353         }
  5481         }
  5354         iTimer.After(iStatus, 100);
  5482         iTimer.After(iStatus, 100);
  5355         if (!IsActive()) {
  5483         if (!IsActive()) {
  5356             SetActive();
  5484             SetActive();
  5357         }
  5485         }
  5365     } else {
  5493     } else {
  5366         if (ipMsvFindOperation) {
  5494         if (ipMsvFindOperation) {
  5367             const CMsvFindResultSelection& findResultSelection = ipMsvFindOperation->GetFindResult();
  5495             const CMsvFindResultSelection& findResultSelection = ipMsvFindOperation->GetFindResult();
  5368             QMessageIdList msgIds;
  5496             QMessageIdList msgIds;
  5369             for (int i=0; i < findResultSelection.Count(); i++) {
  5497             for (int i=0; i < findResultSelection.Count(); i++) {
  5370                 msgIds.append(QMessageId(QString::number(findResultSelection[i].iId))); 
  5498                 msgIds.append(QMessageId(SymbianHelpers::addIdPrefix(QString::number(findResultSelection[i].iId),SymbianHelpers::EngineTypeMTM)));
  5371             }
  5499             }
  5372             iOwner.filterAndOrderMessagesReady(true, iOperationId, msgIds, iNumberOfHandledFilters, iResultCorrectlyOrdered);
  5500             iOwner.filterAndOrderMessagesReady(true, iOperationId, msgIds, iNumberOfHandledFilters, iResultCorrectlyOrdered);
  5373         } else {
  5501         } else {
  5374             iOwner.filterAndOrderMessagesReady(true, iOperationId, iIdList, iNumberOfHandledFilters, iResultCorrectlyOrdered);
  5502             iOwner.filterAndOrderMessagesReady(true, iOperationId, iIdList, iNumberOfHandledFilters, iResultCorrectlyOrdered);
  5375         }
  5503         }