messagingapp/msgui/appengine/src/conversationsmodel.cpp
changeset 25 84d9eb65b26f
parent 23 238255e8b033
child 27 e4592d119491
child 37 518b245aa84c
--- a/messagingapp/msgui/appengine/src/conversationsmodel.cpp	Fri Apr 16 14:56:15 2010 +0300
+++ b/messagingapp/msgui/appengine/src/conversationsmodel.cpp	Mon May 03 12:29:07 2010 +0300
@@ -25,217 +25,201 @@
 #include "unidatamodelplugininterface.h"
 #include <ccsconversationentry.h>
 #include <QFile>
+#include <QFileInfo>
 
 // LOCAL CONSTANTS
-const QString MMSStr("mms");
 
 //---------------------------------------------------------------
 // ConversationsModel::ConversationsModel
 // Constructor
 //---------------------------------------------------------------
-ConversationsModel::ConversationsModel(
-    ConversationMsgStoreHandler* msgStoreHandler,
-    QObject* parent): QStandardItemModel(parent),
-    mMsgStoreHandler(msgStoreHandler)
-            {
-            iDataModelPluginLoader = new UniDataModelLoader;
-            iDataModelPluginLoader->loadPlugins();
-            iMmsDataPlugin = iDataModelPluginLoader->getDataModelPlugin(MMSStr);
-            }
-
+ConversationsModel::ConversationsModel(ConversationMsgStoreHandler* msgStoreHandler,
+    QObject* parent) :
+    QStandardItemModel(parent), mMsgStoreHandler(msgStoreHandler)
+{
+    iDataModelPluginLoader = new UniDataModelLoader;
+    iMmsDataPlugin = iDataModelPluginLoader->getDataModelPlugin(ConvergedMessage::Mms);
+    iBioMsgPlugin = iDataModelPluginLoader->getDataModelPlugin(ConvergedMessage::BioMsg);
+}
 
 //---------------------------------------------------------------
 // ConversationsModel::~ConversationsModel
 // Destructor
 //---------------------------------------------------------------
 ConversationsModel::~ConversationsModel()
-    {
-    if(iDataModelPluginLoader)
-    {
+{
+    if (iDataModelPluginLoader) {
         delete iDataModelPluginLoader;
         iDataModelPluginLoader = NULL;
     }
-    }
+}
 
 //---------------------------------------------------------------
 // ConversationsModel::data
 // @see header
 //---------------------------------------------------------------
-QVariant ConversationsModel::data(const QModelIndex & index , int role ) const
+QVariant ConversationsModel::data(const QModelIndex & index, int role) const
 {
     QVariant value;
     QStandardItem* item = itemFromIndex(index);
-    switch(role)
+    switch (role) {
+    case ConversationId:
+    {
+        value = item->data(ConversationId);
+        break;
+    }
+    case UnReadStatus:
+    {
+        value = item->data(UnReadStatus);
+        break;
+    }
+    case ContactId:
+    {
+        value = item->data(ContactId);
+        break;
+    }
+    case TimeStamp:
+    {
+        value = item->data(TimeStamp);
+        break;
+    }
+    case ConvergedMsgId:
+    {
+        value = item->data(ConvergedMsgId);
+        break;
+    }
+    case MessageProperty:
+    {
+        value = item->data(MessageProperty);
+        break;
+    }
+    case MessageType:
+    {
+        value = item->data(MessageType);
+        break;
+    }
+    case MessageSubType:
+    {
+        value = item->data(MessageSubType);
+        break;
+    }
+    case Subject:
+    {
+        value = item->data(Subject);
+        break;
+    }
+    case BodyText:
+    {
+        value = item->data(BodyText);
+        break;
+    }
+    case ConversationAddress:
     {
-        case ConversationId:
-        {
-            value = item->data(ConversationId);
-            break;
-        }
-        case UnReadStatus:
-        {
-            value = item->data(UnReadStatus);
-            break;
-        }
-        case ContactId:
-        {
-            value = item->data(ContactId);
-            break;
-        }
-        case TimeStamp:
-        {
-            value = item->data(TimeStamp);
-            break;
-        }
-        case ConvergedMsgId:
-        {
-            value = item->data(ConvergedMsgId);
-            break;
-        }
-        case MessageProperty:
-        {
-            value = item->data(MessageProperty);
-            break;
-        }
-        case MessageType:
-        {
-            value = item->data(MessageType);
-            break;
-        }
-        case Subject:
-        {
-            value = item->data(Subject);
-            break;
-        }
-        case BodyText:
-        {
-            value = item->data(BodyText);
-            break;
-        }
-        case ConversationAddress:
-        {
-            value = item->data(ConversationAddress);
-            break;
-        }
-        case Direction:
-        {
-            value = item->data(Direction);
-            break;
-        }
-        case SendingState:
-        {
-            value = item->data(SendingState);
-            break;
-        }
-        case MessagePriority:
-        {
-            value = item->data(MessagePriority);
-            break;
-        }
-        case Attachments:
-        {
-            value = item->data(Attachments);
-            break;
-        }
-        case MessageLocation:
-        {
-            value = item->data(MessageLocation);
-            break;
-        }
-        case MessageStore:
-        {
-            value = item->data(MessageStore);
-            break;
-        }
-        case ConversationAlias:
-        {
-            value = item->data(ConversationAlias);
-            break;
-        }
-        case UnreadCount:
-        {
-
-            value = item->data(UnreadCount);
-            break;
-        }
-        case FirstName: // Fall through start
-            value = item->data(FirstName);
-            break;
-        case LastName:
-            value = item->data(LastName);
-            break;
-        case NickName:
-            value = item->data(NickName);
-            break;
-        case Avatar:    // Fall througn end
-            value = item->data(Avatar);
-            break;
-        default:
-        {
-                //No matching role found, set invalid variant
-                value = QVariant();
-                break;
-        }
-      }
-        return value;
+        value = item->data(ConversationAddress);
+        break;
+    }
+    case Direction:
+    {
+        value = item->data(Direction);
+        break;
+    }
+    case SendingState:
+    {
+        value = item->data(SendingState);
+        break;
+    }
+    case MessagePriority:
+    {
+        value = item->data(MessagePriority);
+        break;
+    }
+    case Attachments:
+    {
+        value = item->data(Attachments);
+        break;
+    }
+    case MessageLocation:
+    {
+        value = item->data(MessageLocation);
+        break;
+    }
+    case MessageStore:
+    {
+        value = item->data(MessageStore);
+        break;
+    }
+    case ConversationAlias:
+    {
+        value = item->data(ConversationAlias);
+        break;
+    }
+    case UnreadCount:
+    {
+        value = item->data(UnreadCount);
+        break;
+    }
+    case DisplayName: // Fall through start
+        value = item->data(DisplayName);
+        break;    
+    case Avatar: // Fall througn end
+        value = item->data(Avatar);
+        break;
+    case NotificationStatus:
+        value = item->data(NotificationStatus);
+        break;
+    default:
+    {
+        //No matching role found, set invalid variant
+        value = QVariant();
+        break;
+    }
+    }
+    return value;
 }
 
 //---------------------------------------------------------------
 // ConversationsModel::addRow
 // @see header
 //---------------------------------------------------------------
-void ConversationsModel::addRow(
-    const CCsConversationEntry& entry,
-    bool dynamicUpdate)
+void ConversationsModel::addRow(const CCsConversationEntry& entry, bool dynamicUpdate)
 {
-    int msgId = entry.EntryId();	
+    int msgId = entry.EntryId();
     //match, if found update else add item
-    QModelIndexList indexList = this->match(index(0, 0), 
-        ConvergedMsgId, 
-        msgId, -1, Qt::MatchExactly);
+    QModelIndexList indexList = this->match(index(0, 0), ConvergedMsgId, msgId, -1,
+        Qt::MatchExactly);
 
     // if not found, add new item
-    if ( indexList.count() == 0 )
-    {    
+    if (indexList.count() == 0) {
         QStandardItem* item = new QStandardItem();
-        populateItem(*item,entry);
-        if(!dynamicUpdate)
-        {
-            insertRow(0,item);    
+        populateItem(*item, entry);
+        if (!dynamicUpdate) {
+            insertRow(0, item);
         }
-        else
-        {    
+        else {
             int i;
-            for( i= rowCount()-1; i >=0  ; --i)
-            {
-                QStandardItem* modelItem = this->item(i,0);
-                if( modelItem->data(ConvergedMsgId).toInt() < 
-                        item->data(ConvergedMsgId).toInt())
-                {
-                    if( i == rowCount()-1)
-                    {
+            for (i = rowCount() - 1; i >= 0; --i) {
+                QStandardItem* modelItem = this->item(i, 0);
+                if (modelItem->data(ConvergedMsgId).toInt() < item->data(ConvergedMsgId).toInt()) {
+                    if (i == rowCount() - 1) {
                         appendRow(item);
                     }
-                    else
-                    {    
-                        insertRow(i+1,item);
+                    else {
+                        insertRow(i + 1, item);
                     }
                     return;
                 }
             }
-            if( i == 0 )
-            {
-                insertRow(0,item);
+            if (i == 0) {
+                insertRow(0, item);
             }
         }
     }
-    else
-    {
+    else {
         // Update an existing item
         QModelIndex index = indexList[0];
         QStandardItem* item = this->item(index.row(), 0);
-        populateItem(*item,entry);
-        }
+        populateItem(*item, entry);
+    }
 }
 
 //---------------------------------------------------------------
@@ -243,27 +227,23 @@
 // @see header
 //---------------------------------------------------------------
 void ConversationsModel::deleteRow(int msgId)
-    {
+{
     //match, if found remove item
-    QModelIndexList indexList = this->match(index(0, 0), 
-            ConvergedMsgId, 
-            msgId, 1, Qt::MatchExactly);
+    QModelIndexList indexList =
+        this->match(index(0, 0), ConvergedMsgId, msgId, 1, Qt::MatchExactly);
 
-    if( indexList.count() == 1 )
-        {
+    if (indexList.count() == 1) {
         QModelIndex index = indexList[0];
         this->removeRow(index.row());
-        }
     }
-
+}
 
 //---------------------------------------------------------------
 // ConversationsModel::populateItem
 // @see header
 //---------------------------------------------------------------
-void ConversationsModel::populateItem(QStandardItem& item, 
-        const CCsConversationEntry& entry)
-    {
+void ConversationsModel::populateItem(QStandardItem& item, const CCsConversationEntry& entry)
+{
     int msgId = entry.EntryId();
     // id
     item.setData(msgId, ConvergedMsgId);
@@ -271,117 +251,258 @@
     // description
     HBufC* description = entry.Description();
     QString subject("");
-    if( description && description->Length())
-        {
-        subject = (S60QConversions::s60DescToQString(*description));
-        item.setData(subject, Subject); 
-        }
+    if (description && description->Length()) {
+        subject = (S60QConversions::s60DescToQString(*description));     
+    }
 
     // time stamp 
     TTime unixEpoch(KUnixEpoch);
     TTimeIntervalSeconds seconds;
-    TTime timeStamp(entry.TimeStamp() );
+    TTime timeStamp(entry.TimeStamp());
     timeStamp.SecondsFrom(unixEpoch, seconds);
     item.setData(seconds.Int(), TimeStamp);
 
     //contact details
     HBufC* contact = entry.Contact();
-    if( contact && contact->Length())
-        {
+    if (contact && contact->Length()) {
         item.setData(S60QConversions::s60DescToQString(*contact), ConversationAddress);
-        }
+    }
 
     // message type.
-    item.setData(ConversationsEngineUtility::messageType(entry.GetType()), MessageType);
+    int msgType = ConversationsEngineUtility::messageType(entry.GetType());
+    item.setData(msgType, MessageType);
+
+    //message sub-type
+    item.setData(ConversationsEngineUtility::messageSubType(entry.GetType()), MessageSubType);
+
     // unread status
-    if(entry.IsAttributeSet(ECsAttributeUnread))
-    {    
-    item.setData(true,UnReadStatus);
+    if (entry.IsAttributeSet(ECsAttributeUnread)) {
+        item.setData(true, UnReadStatus);
     }
-    else
-    {
-    item.setData(false,UnReadStatus);
+    else {
+        item.setData(false, UnReadStatus);
     }
-    
+
     //sending state
     item.setData(entry.GetSendState(), SendingState);
     // direction
     item.setData(entry.ConversationDir(), Direction);
 
     //location
-    if(entry.ConversationDir() == ECsDirectionIncoming)
-    {
+    if (entry.ConversationDir() == ECsDirectionIncoming) {
         item.setData(ConvergedMessage::Inbox, MessageLocation);
     }
-    else if(entry.IsAttributeSet(ECsAttributeDraft))
-    {
+    else if (entry.IsAttributeSet(ECsAttributeDraft)) {
         item.setData(ConvergedMessage::Draft, MessageLocation);
     }
-    else if(entry.IsAttributeSet(ECsAttributeSent))
-    {
+    else if (entry.IsAttributeSet(ECsAttributeSent)) {
         item.setData(ConvergedMessage::Sent, MessageLocation);
     }
-    else
-    {
+    else {
         item.setData(ConvergedMessage::Outbox, MessageLocation);
     }
 
-    //message specific handling
-    TCsType msgType = entry.GetType();
-    if(msgType == ECsMMS)
-    {
-        iMmsDataPlugin->setMessageId(entry.EntryId());
-
-        if( iMmsDataPlugin->attachmentCount() > 0 )
-        {
-        item.setData(ConvergedMessage::Attachment,MessageProperty);
-        }
+    //message specific handling    
+    if (msgType == ConvergedMessage::Mms) {
+        handleMMS(item, entry);
+    }
+    else if(msgType == ConvergedMessage::MmsNotification) {
+        item.setData(subject, Subject);
+        handleMMSNotification(item, entry);
+    }
+    else if (msgType == ConvergedMessage::BT) {
+        handleBlueToothMessages(item, entry);
+    }
+    else if (msgType == ConvergedMessage::BioMsg) {
+        handleBioMessages(item, entry);
+    }
+    else {
+        // sms bodytext
+        item.setData(subject, BodyText);
+    }
+}
 
-        int slideCount = iMmsDataPlugin->slideCount();
-        bool isBodyTextSet = false;
-        QString textContent;
-        QStringList attachmentPaths;
+//---------------------------------------------------------------
+// ConversationsModel::handleMMS
+// @see header
+//---------------------------------------------------------------
+void ConversationsModel::handleMMS(QStandardItem& item, const CCsConversationEntry& entry)
+{
+    iMmsDataPlugin->setMessageId(entry.EntryId());
+    if (iMmsDataPlugin->attachmentCount() > 0) {
+        item.setData(ConvergedMessage::Attachment, MessageProperty);
+    }
 
-        for( int i=0; i < slideCount; ++i )
-        {
-            UniMessageInfoList objectList = iMmsDataPlugin->slideContent(i);
-            for( int index=0; index < objectList.count() ; ++index )
-            {
-                attachmentPaths.append(objectList[index]->path());
-                if( !isBodyTextSet && objectList[index]->mimetype().contains("text") )
+    int slideCount = iMmsDataPlugin->slideCount();
+    bool isBodyTextSet = false;
+    QString textContent;
+    QStringList attachmentPaths;
+
+    for (int i = 0; i < slideCount; ++i) {
+        UniMessageInfoList objectList = iMmsDataPlugin->slideContent(i);
+        for (int index = 0; index < objectList.count(); ++index) {
+            attachmentPaths.append(objectList[index]->path());
+            if (!isBodyTextSet && objectList[index]->mimetype().contains("text")) {
+                QFile file(objectList[index]->path());
+                if(file.open(QIODevice::ReadOnly))
                 {
-                    QFile file(objectList[index]->path());
-                    file.open(QIODevice::ReadOnly);
                     textContent = file.readAll();
                     item.setData(textContent, BodyText);
                     isBodyTextSet = true;
                     file.close();
                 }
             }
-            foreach(UniMessageInfo* slide,objectList)
-                {
-                delete slide;
-                }
         }
-        //populate item  with the attachment list
-        item.setData(attachmentPaths.join("|"),Attachments);
-        if(entry.IsAttributeSet(ECsAttributeHighPriority))
+        foreach(UniMessageInfo* slide,objectList)
+            {
+                delete slide;
+            }
+    }
+    //populate item  with the attachment list
+    item.setData(attachmentPaths.join("|"), Attachments);
+    if (entry.IsAttributeSet(ECsAttributeHighPriority)) {
+        item.setData(ConvergedMessage::High, MessagePriority);
+    }
+    else if (entry.IsAttributeSet(ECsAttributeLowPriority)) {
+        item.setData(ConvergedMessage::Low, MessagePriority);
+    }
+    //subject
+    item.setData(iMmsDataPlugin->subject(), Subject);
+}
+
+//---------------------------------------------------------------
+// ConversationsModel::handleMMSNotification
+// @see header
+//---------------------------------------------------------------
+void ConversationsModel::handleMMSNotification(QStandardItem& item,
+    const CCsConversationEntry& entry)
+{
+    // set context to current entry
+    mMsgStoreHandler->setNotificationMessageId(entry.EntryId());
+    
+    // fetch relevent info to show in CV
+    // msg size
+    QString estimatedMsgSizeStr = 
+            mMsgStoreHandler->NotificationMsgSize();
+    
+    // msg class type
+    QString classInfoStr = mMsgStoreHandler->NotificationClass();
+    
+    // notification expiry date
+    //TODO: Need to do localization of digits used to show expiry time
+    TTime expiryTime;
+    QString expiryTimeStr;
+    mMsgStoreHandler->NotificationExpiryDate(expiryTime, expiryTimeStr);
+    
+    // notification state e.g. waiting, retrieving etc
+    QString statusStr;
+    int status;
+    mMsgStoreHandler->NotificationStatus(status, statusStr);
+    
+    // create data for bodytext role
+    QString dataText;
+    dataText.append("Size: "); // TODO: use logical str name
+    dataText.append(estimatedMsgSizeStr);
+    dataText.append(QChar::LineSeparator);
+    dataText.append("Class: "); // TODO: use logical str name
+    dataText.append(classInfoStr);
+    dataText.append(QChar::LineSeparator);
+    dataText.append("Expiry date: "); //TODO: use logical str name
+    dataText.append(expiryTimeStr);
+    if(!statusStr.isEmpty())
+    {
+        dataText.append(QChar::LineSeparator);
+        dataText.append(statusStr);
+        dataText.append(QChar::LineSeparator); //Temp fix to be removed
+    }
+
+    // set fetched data to roles
+    item.setData(status, NotificationStatus);
+    item.setData(dataText, BodyText);
+
+    if (entry.IsAttributeSet(ECsAttributeHighPriority)) {
+        item.setData(ConvergedMessage::High, MessagePriority);
+    }
+    else if (entry.IsAttributeSet(ECsAttributeLowPriority)) {
+        item.setData(ConvergedMessage::Low, MessagePriority);
+    }
+}
+
+//---------------------------------------------------------------
+// ConversationsModel::handleBlueToothMessages
+// @see header
+//---------------------------------------------------------------
+void ConversationsModel::handleBlueToothMessages(QStandardItem& item,
+    const CCsConversationEntry& entry)
+{
+    //TODO, needs to be revisited again, once BT team provides the solution for
+    //BT received as Biomsg issue.
+    QString description = S60QConversions::s60DescToQString(*(entry.Description()));
+
+    if (description.contains(".vcf") || description.contains(".ics")) // "vCard"
+    {
+        //message sub-type
+        item.setData(ConvergedMessage::VCard, MessageSubType);
+
+        //parse vcf file to get the details
+        QString displayName = ConversationsEngineUtility::getVcardDisplayName(description);
+        item.setData(displayName, BodyText);
+    }    
+    else 
+    {
+        if (description.contains(".vcs")) // "vCalendar"
         {
-            item.setData(ConvergedMessage::High,MessagePriority);
+            //message sub-type
+            item.setData(ConvergedMessage::VCal, MessageSubType);
+        }
+        else
+        {
+            //message sub-type
+            item.setData(ConvergedMessage::None, MessageSubType);
         }
-        else if(entry.IsAttributeSet(ECsAttributeLowPriority))
-        {
-            item.setData(ConvergedMessage::Low,MessagePriority);
+        //for BT messages we show filenames for all other (except vcard) messages
+        //get filename and set as body
+        QFileInfo fileinfo(description);
+        QString filename = fileinfo.fileName();
+        item.setData(filename, BodyText);
+    }
+}
+
+//---------------------------------------------------------------
+// ConversationsModel::handleBioMessages
+// @see header
+//---------------------------------------------------------------
+void ConversationsModel::handleBioMessages(QStandardItem& item, const CCsConversationEntry& entry)
+{
+    iBioMsgPlugin->setMessageId(entry.EntryId());
+    int msgSubType = ConversationsEngineUtility::messageSubType(entry.GetType());
+    if (ConvergedMessage::VCard == msgSubType) {
+        if (iBioMsgPlugin->attachmentCount() > 0) {
+            UniMessageInfoList attList = iBioMsgPlugin->attachmentList();
+            QString attachmentPath = attList[0]->path();
+
+            //get display-name and set as bodytext
+            QString displayName = ConversationsEngineUtility::getVcardDisplayName(attachmentPath);
+            item.setData(displayName, BodyText);
+
+            // clear attachement list : its allocated at data model
+            while (!attList.isEmpty()) {
+                delete attList.takeFirst();
+            }
         }
     }
-    else
-    {
-        // sms bodytext
-        item.setData(subject, BodyText);
+    else if (ConvergedMessage::VCal == msgSubType) {
+        //not supported
     }
-
-    //presence
-    //TODO
+    else {
+        // description
+        HBufC* description = entry.Description();
+        QString subject("");
+        if (description && description->Length()) {
+            subject = (S60QConversions::s60DescToQString(*description));
+            item.setData(subject, BodyText);
+        }
     }
+}
 
 //EOF