diff -r 238255e8b033 -r 84d9eb65b26f messagingapp/msgui/appengine/src/conversationsmodel.cpp --- 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 #include +#include // 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