messagingapp/msgui/appengine/src/conversationsmodel.cpp
changeset 27 e4592d119491
parent 25 84d9eb65b26f
child 47 5b14749788d7
equal deleted inserted replaced
25:84d9eb65b26f 27:e4592d119491
    21 #include "convergedmessage.h"
    21 #include "convergedmessage.h"
    22 #include "s60qconversions.h"
    22 #include "s60qconversions.h"
    23 #include "conversationsengineutility.h"
    23 #include "conversationsengineutility.h"
    24 #include "unidatamodelloader.h"
    24 #include "unidatamodelloader.h"
    25 #include "unidatamodelplugininterface.h"
    25 #include "unidatamodelplugininterface.h"
       
    26 #include "ringbc.h"
       
    27 #include "msgcontacthandler.h"
    26 #include <ccsconversationentry.h>
    28 #include <ccsconversationentry.h>
       
    29 
       
    30 #include "debugtraces.h"
       
    31 
    27 #include <QFile>
    32 #include <QFile>
    28 #include <QFileInfo>
    33 #include <QFileInfo>
    29 
    34 #include <s32mem.h>
    30 // LOCAL CONSTANTS
    35 #include <ccsdefs.h>
       
    36 
       
    37 //CONSTANTS
       
    38 _LIT(KDbFileName, "c:[2002A542]conversations.db");
       
    39 // preview sql query
       
    40 _LIT(KSelectConvMsgsStmt, "SELECT message_id, subject, body_text, preview_path, msg_property FROM conversation_messages WHERE message_id=:message_id ");
    31 
    41 
    32 //---------------------------------------------------------------
    42 //---------------------------------------------------------------
    33 // ConversationsModel::ConversationsModel
    43 // ConversationsModel::ConversationsModel
    34 // Constructor
    44 // Constructor
    35 //---------------------------------------------------------------
    45 //---------------------------------------------------------------
    36 ConversationsModel::ConversationsModel(ConversationMsgStoreHandler* msgStoreHandler,
    46 ConversationsModel::ConversationsModel(ConversationMsgStoreHandler* msgStoreHandler,
    37     QObject* parent) :
    47     QObject* parent) :
    38     QStandardItemModel(parent), mMsgStoreHandler(msgStoreHandler)
    48     QStandardItemModel(parent), mMsgStoreHandler(msgStoreHandler), iSqlDbOpen(EFalse)
    39 {
    49 {
       
    50     //Open SQL DB
       
    51     if (KErrNone == iSqlDb.Open(KDbFileName))
       
    52     {
       
    53         iSqlDbOpen = ETrue;
       
    54     }
    40     iDataModelPluginLoader = new UniDataModelLoader;
    55     iDataModelPluginLoader = new UniDataModelLoader;
    41     iMmsDataPlugin = iDataModelPluginLoader->getDataModelPlugin(ConvergedMessage::Mms);
    56     iMmsDataPlugin = iDataModelPluginLoader->getDataModelPlugin(ConvergedMessage::Mms);
    42     iBioMsgPlugin = iDataModelPluginLoader->getDataModelPlugin(ConvergedMessage::BioMsg);
    57     iBioMsgPlugin = iDataModelPluginLoader->getDataModelPlugin(ConvergedMessage::BioMsg);
    43 }
    58 }
    44 
    59 
    46 // ConversationsModel::~ConversationsModel
    61 // ConversationsModel::~ConversationsModel
    47 // Destructor
    62 // Destructor
    48 //---------------------------------------------------------------
    63 //---------------------------------------------------------------
    49 ConversationsModel::~ConversationsModel()
    64 ConversationsModel::~ConversationsModel()
    50 {
    65 {
       
    66     //Close SQL-DB
       
    67     iSqlDb.Close();
       
    68 
    51     if (iDataModelPluginLoader) {
    69     if (iDataModelPluginLoader) {
    52         delete iDataModelPluginLoader;
    70         delete iDataModelPluginLoader;
    53         iDataModelPluginLoader = NULL;
    71         iDataModelPluginLoader = NULL;
    54     }
    72     }
    55 }
    73 }
   242 // ConversationsModel::populateItem
   260 // ConversationsModel::populateItem
   243 // @see header
   261 // @see header
   244 //---------------------------------------------------------------
   262 //---------------------------------------------------------------
   245 void ConversationsModel::populateItem(QStandardItem& item, const CCsConversationEntry& entry)
   263 void ConversationsModel::populateItem(QStandardItem& item, const CCsConversationEntry& entry)
   246 {
   264 {
       
   265     QCRITICAL_WRITE("ConversationsModel::populateItem start.");
       
   266 
   247     int msgId = entry.EntryId();
   267     int msgId = entry.EntryId();
   248     // id
   268     // id
   249     item.setData(msgId, ConvergedMsgId);
   269     item.setData(msgId, ConvergedMsgId);
   250 
   270 
   251     // description
   271     // description
   302         item.setData(ConvergedMessage::Outbox, MessageLocation);
   322         item.setData(ConvergedMessage::Outbox, MessageLocation);
   303     }
   323     }
   304 
   324 
   305     //message specific handling    
   325     //message specific handling    
   306     if (msgType == ConvergedMessage::Mms) {
   326     if (msgType == ConvergedMessage::Mms) {
       
   327         QCRITICAL_WRITE("ConversationsModel::populateItem  MMS start.")
   307         handleMMS(item, entry);
   328         handleMMS(item, entry);
       
   329         QCRITICAL_WRITE("ConversationsModel::populateItem MMS end.")
   308     }
   330     }
   309     else if(msgType == ConvergedMessage::MmsNotification) {
   331     else if(msgType == ConvergedMessage::MmsNotification) {
   310         item.setData(subject, Subject);
   332         item.setData(subject, Subject);
   311         handleMMSNotification(item, entry);
   333         handleMMSNotification(item, entry);
   312     }
   334     }
   318     }
   340     }
   319     else {
   341     else {
   320         // sms bodytext
   342         // sms bodytext
   321         item.setData(subject, BodyText);
   343         item.setData(subject, BodyText);
   322     }
   344     }
       
   345 
       
   346     QCRITICAL_WRITE("ConversationsModel::populateItem end.");
   323 }
   347 }
   324 
   348 
   325 //---------------------------------------------------------------
   349 //---------------------------------------------------------------
   326 // ConversationsModel::handleMMS
   350 // ConversationsModel::handleMMS
   327 // @see header
   351 // @see header
   328 //---------------------------------------------------------------
   352 //---------------------------------------------------------------
   329 void ConversationsModel::handleMMS(QStandardItem& item, const CCsConversationEntry& entry)
   353 void ConversationsModel::handleMMS(QStandardItem& item, const CCsConversationEntry& entry)
   330 {
   354 {
   331     iMmsDataPlugin->setMessageId(entry.EntryId());
   355     //msg_id
   332     if (iMmsDataPlugin->attachmentCount() > 0) {
   356     int msgId = entry.EntryId();
   333         item.setData(ConvergedMessage::Attachment, MessageProperty);
   357 
   334     }
   358     bool isEntryInDb = false;
   335 
   359     TInt err = KErrNone;
   336     int slideCount = iMmsDataPlugin->slideCount();
   360     
   337     bool isBodyTextSet = false;
   361     //check if db is open and query db
   338     QString textContent;
   362     if (iSqlDbOpen)
   339     QStringList attachmentPaths;
   363     {
   340 
   364         RSqlStatement sqlSelectStmt;
   341     for (int i = 0; i < slideCount; ++i) {
   365         err = sqlSelectStmt.Prepare(iSqlDb, KSelectConvMsgsStmt);
   342         UniMessageInfoList objectList = iMmsDataPlugin->slideContent(i);
   366 
   343         for (int index = 0; index < objectList.count(); ++index) {
   367         // move to fallback option
   344             attachmentPaths.append(objectList[index]->path());
   368         if (KErrNone == err)
   345             if (!isBodyTextSet && objectList[index]->mimetype().contains("text")) {
   369             {
   346                 QFile file(objectList[index]->path());
   370             TInt msgIdIndex = sqlSelectStmt.ParameterIndex(_L(":message_id"));
   347                 if(file.open(QIODevice::ReadOnly))
   371             TInt subjectIndex = sqlSelectStmt.ColumnIndex(_L("subject"));
       
   372             TInt bodyIndex = sqlSelectStmt.ColumnIndex(_L("body_text"));
       
   373             TInt previewPathIndex = sqlSelectStmt.ColumnIndex(
       
   374                     _L("preview_path"));
       
   375             TInt msgpropertyIndex = sqlSelectStmt.ColumnIndex(
       
   376                     _L("msg_property"));
       
   377 
       
   378             err = sqlSelectStmt.BindInt(msgIdIndex, msgId);
       
   379             
       
   380             // populate item
       
   381             if ((KErrNone == err) && (sqlSelectStmt.Next() == KSqlAtRow))
   348                 {
   382                 {
       
   383                 RBuf subjectBuffer;
       
   384                 subjectBuffer.Create(sqlSelectStmt.ColumnSize(subjectIndex));
       
   385                 sqlSelectStmt.ColumnText(subjectIndex, subjectBuffer);
       
   386 
       
   387                 item.setData(
       
   388                         S60QConversions::s60DescToQString(subjectBuffer),
       
   389                         Subject);
       
   390                 subjectBuffer.Close();
       
   391 
       
   392                 RBuf bodyBuffer;
       
   393                 bodyBuffer.Create(sqlSelectStmt.ColumnSize(bodyIndex));
       
   394                 sqlSelectStmt.ColumnText(bodyIndex, bodyBuffer);
       
   395 
       
   396                 item.setData(S60QConversions::s60DescToQString(bodyBuffer),
       
   397                         BodyText);
       
   398                 bodyBuffer.Close();
       
   399 
       
   400                 RBuf previewPathBuffer;
       
   401                 previewPathBuffer.Create(sqlSelectStmt.ColumnSize(
       
   402                         previewPathIndex));
       
   403                 sqlSelectStmt.ColumnText(previewPathIndex, previewPathBuffer);
       
   404 
       
   405                 //Rightnow set inside attachments
       
   406                 item.setData(S60QConversions::s60DescToQString(
       
   407                         previewPathBuffer), Attachments);
       
   408                 previewPathBuffer.Close();
       
   409 
       
   410                 int msgProperty = 0;
       
   411                 msgProperty = sqlSelectStmt.ColumnInt(msgpropertyIndex);
       
   412                 item.setData(msgProperty, MessageProperty);
       
   413 
       
   414                 //set flag to disable fallback option
       
   415                 isEntryInDb = true;
       
   416                 }
       
   417             }
       
   418         sqlSelectStmt.Close();
       
   419         }
       
   420 
       
   421     //fallback option incase of db operation failure or enry not found in DB
       
   422     //populate from data plugins
       
   423     if (!isEntryInDb || err != KErrNone)
       
   424     {
       
   425         iMmsDataPlugin->setMessageId(entry.EntryId());
       
   426         int msgProperty = 0;
       
   427 
       
   428         if (iMmsDataPlugin->attachmentCount() > 0)
       
   429         {
       
   430             msgProperty |= EPreviewAttachment;
       
   431         }
       
   432 
       
   433         //subject
       
   434         item.setData(iMmsDataPlugin->subject(), Subject);
       
   435 
       
   436         int slideCount = iMmsDataPlugin->slideCount();
       
   437         bool isBodyTextSet = false;
       
   438         bool isAudioSet = false;
       
   439         bool isImageSet = false;
       
   440         bool isVideoSet = false;
       
   441         QString textContent;
       
   442         QString videoPath;
       
   443         QString imagePath;
       
   444 
       
   445         for (int i = 0; i < slideCount; ++i)
       
   446         {
       
   447             UniMessageInfoList objectList = iMmsDataPlugin->slideContent(i);
       
   448             for (int index = 0; index < objectList.count(); ++index)
       
   449             {
       
   450                 if (!isBodyTextSet && objectList[index]->mimetype().contains(
       
   451                     "text"))
       
   452                 {
       
   453                     QFile file(objectList[index]->path());
       
   454                     file.open(QIODevice::ReadOnly);
   349                     textContent = file.readAll();
   455                     textContent = file.readAll();
   350                     item.setData(textContent, BodyText);
   456                     item.setData(textContent, BodyText);
   351                     isBodyTextSet = true;
   457                     isBodyTextSet = true;
   352                     file.close();
   458                     file.close();
   353                 }
   459                 }
       
   460                 if (!isImageSet && objectList[index]->mimetype().contains(
       
   461                     "image"))
       
   462                 {
       
   463                     isImageSet = true;
       
   464                     msgProperty |= EPreviewImage;
       
   465                     imagePath = objectList[index]->path();
       
   466                 }
       
   467                 if (!isAudioSet && objectList[index]->mimetype().contains(
       
   468                     "audio"))
       
   469                 {
       
   470                     msgProperty |= EPreviewAudio;
       
   471                     isAudioSet = true;
       
   472                 }
       
   473                 if (!isVideoSet && objectList[index]->mimetype().contains(
       
   474                     "video"))
       
   475                 {
       
   476                     isVideoSet = true;
       
   477                     msgProperty |= EPreviewVideo;
       
   478                     videoPath = objectList[index]->path();
       
   479                 }
   354             }
   480             }
   355         }
   481             foreach(UniMessageInfo* slide,objectList)
   356         foreach(UniMessageInfo* slide,objectList)
   482                 {
   357             {
   483                     delete slide;
   358                 delete slide;
   484                 }
   359             }
   485         }
   360     }
   486         //populate item  with the attachment list
   361     //populate item  with the attachment list
   487         if (isVideoSet)
   362     item.setData(attachmentPaths.join("|"), Attachments);
   488         {
   363     if (entry.IsAttributeSet(ECsAttributeHighPriority)) {
   489             item.setData(videoPath, Attachments);
       
   490         }
       
   491         else if (isImageSet)
       
   492         {
       
   493             item.setData(imagePath, Attachments);
       
   494         }
       
   495         //populate msgProperty
       
   496         item.setData(msgProperty, MessageProperty);
       
   497     }
       
   498 
       
   499     // fill other attributes
       
   500     if (entry.IsAttributeSet(ECsAttributeHighPriority))
       
   501     {
   364         item.setData(ConvergedMessage::High, MessagePriority);
   502         item.setData(ConvergedMessage::High, MessagePriority);
   365     }
   503     }
   366     else if (entry.IsAttributeSet(ECsAttributeLowPriority)) {
   504     else if (entry.IsAttributeSet(ECsAttributeLowPriority))
       
   505     {
   367         item.setData(ConvergedMessage::Low, MessagePriority);
   506         item.setData(ConvergedMessage::Low, MessagePriority);
   368     }
   507     }
   369     //subject
       
   370     item.setData(iMmsDataPlugin->subject(), Subject);
       
   371 }
   508 }
   372 
   509 
   373 //---------------------------------------------------------------
   510 //---------------------------------------------------------------
   374 // ConversationsModel::handleMMSNotification
   511 // ConversationsModel::handleMMSNotification
   375 // @see header
   512 // @see header
   376 //---------------------------------------------------------------
   513 //---------------------------------------------------------------
   377 void ConversationsModel::handleMMSNotification(QStandardItem& item,
   514 void ConversationsModel::handleMMSNotification(QStandardItem& item,
   378     const CCsConversationEntry& entry)
   515     const CCsConversationEntry& entry)
   379 {
   516 {
   380     // set context to current entry
   517     // set context to current entry
   381     mMsgStoreHandler->setNotificationMessageId(entry.EntryId());
   518     TRAPD(err, mMsgStoreHandler->setNotificationMessageIdL(entry.EntryId()));
       
   519     if(err != KErrNone)
       
   520     {
       
   521         return;
       
   522     }
   382     
   523     
   383     // fetch relevent info to show in CV
   524     // fetch relevent info to show in CV
   384     // msg size
   525     // msg size
   385     QString estimatedMsgSizeStr = 
   526     QString estimatedMsgSizeStr = QString("%1").arg(0);
   386             mMsgStoreHandler->NotificationMsgSize();
   527     estimatedMsgSizeStr.append(" Kb");
       
   528     TRAP_IGNORE(estimatedMsgSizeStr = 
       
   529             mMsgStoreHandler->NotificationMsgSizeL());
   387     
   530     
   388     // msg class type
   531     // msg class type
   389     QString classInfoStr = mMsgStoreHandler->NotificationClass();
   532     QString classInfoStr = mMsgStoreHandler->NotificationClass();
   390     
   533     
   391     // notification expiry date
   534     // notification expiry date
   443     {
   586     {
   444         //message sub-type
   587         //message sub-type
   445         item.setData(ConvergedMessage::VCard, MessageSubType);
   588         item.setData(ConvergedMessage::VCard, MessageSubType);
   446 
   589 
   447         //parse vcf file to get the details
   590         //parse vcf file to get the details
   448         QString displayName = ConversationsEngineUtility::getVcardDisplayName(description);
   591         QString displayName = MsgContactHandler::getVCardDisplayName(
       
   592                 description);
   449         item.setData(displayName, BodyText);
   593         item.setData(displayName, BodyText);
   450     }    
   594     }    
   451     else 
   595     else 
   452     {
   596     {
   453         if (description.contains(".vcs")) // "vCalendar"
   597         if (description.contains(".vcs")) // "vCalendar"
   480         if (iBioMsgPlugin->attachmentCount() > 0) {
   624         if (iBioMsgPlugin->attachmentCount() > 0) {
   481             UniMessageInfoList attList = iBioMsgPlugin->attachmentList();
   625             UniMessageInfoList attList = iBioMsgPlugin->attachmentList();
   482             QString attachmentPath = attList[0]->path();
   626             QString attachmentPath = attList[0]->path();
   483 
   627 
   484             //get display-name and set as bodytext
   628             //get display-name and set as bodytext
   485             QString displayName = ConversationsEngineUtility::getVcardDisplayName(attachmentPath);
   629             QString displayName = 
       
   630                     MsgContactHandler::getVCardDisplayName(
       
   631                             attachmentPath);
   486             item.setData(displayName, BodyText);
   632             item.setData(displayName, BodyText);
   487 
   633 
   488             // clear attachement list : its allocated at data model
   634             // clear attachement list : its allocated at data model
   489             while (!attList.isEmpty()) {
   635             while (!attList.isEmpty()) {
   490                 delete attList.takeFirst();
   636                 delete attList.takeFirst();
   491             }
   637             }
   492         }
   638         }
   493     }
   639     }
   494     else if (ConvergedMessage::VCal == msgSubType) {
   640     else if (ConvergedMessage::VCal == msgSubType) {
   495         //not supported
   641         //not supported
       
   642     }
       
   643     else if (ConvergedMessage::RingingTone == msgSubType) {
       
   644         if (iBioMsgPlugin->attachmentCount() > 0) {
       
   645             UniMessageInfoList attList = iBioMsgPlugin->attachmentList();
       
   646             QString attachmentPath = attList[0]->path();
       
   647 
       
   648             //get tone title, and set as bodytext
       
   649             RingBc ringBc;
       
   650             item.setData(ringBc.toneTitle(attachmentPath), BodyText);
       
   651             while (!attList.isEmpty()) {
       
   652                 delete attList.takeFirst();
       
   653             }
       
   654         }
       
   655 
   496     }
   656     }
   497     else {
   657     else {
   498         // description
   658         // description
   499         HBufC* description = entry.Description();
   659         HBufC* description = entry.Description();
   500         QString subject("");
   660         QString subject("");
   503             item.setData(subject, BodyText);
   663             item.setData(subject, BodyText);
   504         }
   664         }
   505     }
   665     }
   506 }
   666 }
   507 
   667 
       
   668 //---------------------------------------------------------------
       
   669 // ConversationsModel::getDBHandle()
       
   670 // @see header
       
   671 //---------------------------------------------------------------
       
   672 RSqlDatabase& ConversationsModel::getDBHandle(TBool& isOpen)
       
   673 {
       
   674     isOpen = iSqlDbOpen;
       
   675     return iSqlDb;
       
   676 }
   508 //EOF
   677 //EOF