diff -r 6a20128ce557 -r ebfee66fde93 messagingapp/msgui/appengine/src/conversationssummarymodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgui/appengine/src/conversationssummarymodel.cpp Fri Jun 04 10:25:39 2010 +0100 @@ -0,0 +1,384 @@ +/* + * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: + * + */ + +#include "conversationssummarymodel.h" +#include "conversationsenginedefines.h" +#include "conversationsengineutility.h" +#include "s60qconversions.h" +#include "convergedmessage.h" +#include "unidatamodelloader.h" +#include "unidatamodelplugininterface.h" +#include "ringbc.h" +#include "msgcontacthandler.h" +#include +#include +#include +#include + +//--------------------------------------------------------------- +// ConversationsSummaryModel::ConversationsSummaryModel +// @see header +//--------------------------------------------------------------- +ConversationsSummaryModel::ConversationsSummaryModel(QObject* parent) +:QStandardItemModel(parent) + { + } + +//--------------------------------------------------------------- +// ConversationsSummaryModel::~ConversationsSummaryModel +// @see header +//--------------------------------------------------------------- +ConversationsSummaryModel::~ConversationsSummaryModel() +{ + +} + +//--------------------------------------------------------------- +// ConversationsSummaryModel::data +// @see header +//--------------------------------------------------------------- +QVariant ConversationsSummaryModel::data(const QModelIndex & index , + int role ) const +{ + QVariant value; + QStandardItem* item = itemFromIndex(index); + switch(role) + { + case ConversationId: + { + value = item->data(ConversationId); + break; + } + case UnReadStatus: + { + value = item->data(UnReadStatus); + break; + } + case ContactId: + { + value = item->data(ContactId); + break; + } + case ConvergedMsgId: + { + value = item->data(ConvergedMsgId); + break; + } + case UnreadCount: + { + value = item->data(UnreadCount); + break; + } + case TimeStamp: + { + value = item->data(TimeStamp); + break; + } + case SendingState: + { + value = item->data(SendingState); + 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: + { + value = item->data(ConversationAddress); + break; + } + case DisplayName: + { + value = item->data(DisplayName); + break; + } + case Avatar: + { + value = item->data(Avatar); + break; + } + case Direction: + { + value = item->data(Direction); + break; + } + default: + { + //No matching role found, set invalid variant. + value = QVariant(); + break; + } + } + return value; +} + + +//--------------------------------------------------------------- +// ConversationsSummaryModel::addRow +// @see header +//--------------------------------------------------------------- +void ConversationsSummaryModel::addRow( + const CCsClientConversation& conversation) + { + int convId = conversation.GetConversationEntryId(); + + //match convId in model, if found update else add item + QModelIndexList indexList = this->match(index(0, 0), + ConversationId, + convId, 1, Qt::MatchExactly); + + // if not found, add new item + if ( indexList.count() == 0 ) + { + QStandardItem* item = new QStandardItem(); + populateItem(*item,conversation); + appendRow(item); + } + else + { + // Update an existing item + QModelIndex index = indexList[0]; + QStandardItem* item = this->item(index.row(), 0); + populateItem(*item,conversation); + } + } + +//--------------------------------------------------------------- +// ConversationsSummaryModel::deleteRow +// @see header +//--------------------------------------------------------------- +void ConversationsSummaryModel::deleteRow(qint64 convId) + { + //match, if found remove item + QModelIndexList indexList = this->match(index(0, 0), + ConversationId, + convId, 1, Qt::MatchExactly); + + if( indexList.count() == 1 ) + { + QModelIndex index = indexList[0]; + this->removeRow(index.row()); + } + } + +//--------------------------------------------------------------- +// ConversationsSummaryModel::populateItem +// @see header +//--------------------------------------------------------------- +void ConversationsSummaryModel::populateItem(QStandardItem& item, + const CCsClientConversation& conversation) + { + //get entry + CCsConversationEntry* conEntry = conversation.GetConversationEntry(); + //error scenario + if(conEntry == NULL) + return; + + // message details + // conversation-id + item.setData(conversation.GetConversationEntryId(), ConversationId); + // message-id + item.setData(conEntry->EntryId(), ConvergedMsgId); + // send status + item.setData(conEntry->GetSendState(),SendingState); + // direction + item.setData(conEntry->ConversationDir(), Direction); + //msg-type + int msgType = ConversationsEngineUtility::messageType(conEntry->GetType()); + item.setData(msgType, MessageType); + //message sub-type + item.setData(ConversationsEngineUtility::messageSubType(conEntry->GetType()), MessageSubType); + + //handle BT messages, needs to be revisited again, once vcal/vcard over BT issue is fixed + if(ConvergedMessage::BT == msgType) + { + handleBlueToothMessages(item, *conEntry); + } + else if(msgType == ConvergedMessage::BioMsg) + { + handleBioMessages(item, *conEntry); + } + else + { + // description + HBufC* body = conEntry->Description(); + if( body && body->Length()) + { + QString bodytext(S60QConversions::s60DescToQString(*body)); + item.setData(bodytext, BodyText); + item.setData(bodytext, Subject ); + } + } + + + // time stamp + TTime unixEpoch(KUnixEpoch); + TTimeIntervalSeconds seconds; + TTime timeStamp(conEntry->TimeStamp() ); + timeStamp.SecondsFrom(unixEpoch, seconds); + item.setData(seconds.Int(), TimeStamp); + + // unread count + item.setData(conversation.GetUnreadMessageCount(), UnreadCount); + + // contact details + HBufC* disName = conversation.GetDisplayName(); + QString displayName(""); + //display name + if(disName && disName->Length()) + { + displayName = S60QConversions::s60DescToQString(*disName); + item.setData(displayName,DisplayName); + } + + // contact number + HBufC* contactno = conEntry->Contact(); + QString contactNumber(""); + if ( contactno && contactno->Length() ) + { + contactNumber = S60QConversions::s60DescToQString(*contactno); + } + item.setData(contactNumber, ConversationAddress); + + //set the contactId + int contactId = conversation.GetContactId(); + item.setData(contactId, ContactId); + + // unread status + item.setData(conEntry->IsAttributeSet(ECsAttributeUnread),UnReadStatus); + } + + +//--------------------------------------------------------------- +// ConversationsModel::handleBlueToothMessages +// @see header +//--------------------------------------------------------------- +void ConversationsSummaryModel::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 = MsgContactHandler::getVCardDisplayName( + description); + item.setData(displayName, BodyText); + } + else + { + if (description.contains(".vcs")) // "vCalendar" + { + //message sub-type + item.setData(ConvergedMessage::VCal, MessageSubType); + } + else + { + //message sub-type + item.setData(ConvergedMessage::None, MessageSubType); + } + //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); + } +} + +//--------------------------------------------------------------- +// ConversationsSummaryModel::handleBioMessages +// @see header +//--------------------------------------------------------------- +void ConversationsSummaryModel::handleBioMessages(QStandardItem& item, const CCsConversationEntry& entry) +{ + UniDataModelLoader* pluginLoader = new UniDataModelLoader; + UniDataModelPluginInterface* bioMsgPlugin = pluginLoader->getDataModelPlugin(ConvergedMessage::BioMsg); + bioMsgPlugin->setMessageId(entry.EntryId()); + + int msgSubType = ConversationsEngineUtility::messageSubType(entry.GetType()); + if (ConvergedMessage::VCard == msgSubType) { + if (bioMsgPlugin->attachmentCount() > 0) { + UniMessageInfoList attList = bioMsgPlugin->attachmentList(); + QString attachmentPath = attList[0]->path(); + + //get display-name and set as bodytext + QString displayName = MsgContactHandler::getVCardDisplayName( + attachmentPath); + item.setData(displayName, BodyText); + + // clear attachement list : its allocated at data model + while (!attList.isEmpty()) { + delete attList.takeFirst(); + } + } + } + else if (ConvergedMessage::VCal == msgSubType) { + //not supported + } + else if (ConvergedMessage::RingingTone == msgSubType) { + if (bioMsgPlugin->attachmentCount() > 0) { + UniMessageInfoList attList = bioMsgPlugin->attachmentList(); + QString attachmentPath = attList[0]->path(); + + //get tone title, and set as bodytext + RingBc ringBc; + item.setData(ringBc.toneTitle(attachmentPath), BodyText); + while (!attList.isEmpty()) { + delete attList.takeFirst(); + } + } + } + else { + // description + HBufC* description = entry.Description(); + QString subject(""); + if (description && description->Length()) { + subject = (S60QConversions::s60DescToQString(*description)); + item.setData(subject, BodyText); + } + } + + delete pluginLoader; +} +// EOF