--- a/messagingapp/msgui/appengine/src/conversationsmodel.cpp Tue Jul 06 14:12:40 2010 +0300
+++ b/messagingapp/msgui/appengine/src/conversationsmodel.cpp Wed Aug 18 09:45:25 2010 +0300
@@ -47,6 +47,9 @@
//selecet preview-icon query
_LIT(KSelectPreviewIconStmt,"SELECT message_id, preview_icon FROM conversation_messages WHERE message_id = :message_id ");
+//selecet vcard-path query
+_LIT(KSelectVCardStmt,"SELECT message_id, msg_processingstate, preview_path FROM conversation_messages WHERE message_id = :message_id ");
+
// preview-cache max cost (items)
const int CACHE_COST = 50;
//Preview thumbnail size
@@ -435,36 +438,46 @@
// use entry to populate model only when,
// entry is present in DB and its processing is over.
RBuf subjectBuffer;
- subjectBuffer.Create(sqlSelectStmt.ColumnSize(
- subjectIndex));
- sqlSelectStmt.ColumnText(subjectIndex, subjectBuffer);
-
- item.setData(XQConversions::s60DescToQString(
- subjectBuffer), Subject);
- subjectBuffer.Close();
-
+ if( subjectBuffer.Create(
+ sqlSelectStmt.ColumnSize(
+ subjectIndex)) == KErrNone)
+ {
+ sqlSelectStmt.ColumnText(subjectIndex, subjectBuffer);
+ item.setData(
+ XQConversions::s60DescToQString(
+ subjectBuffer), Subject);
+ subjectBuffer.Close();
+ }
+
RBuf bodyBuffer;
- bodyBuffer.Create(sqlSelectStmt.ColumnSize(bodyIndex));
- sqlSelectStmt.ColumnText(bodyIndex, bodyBuffer);
-
- item.setData(
- XQConversions::s60DescToQString(bodyBuffer),
- BodyText);
- bodyBuffer.Close();
+ if (bodyBuffer.Create(
+ sqlSelectStmt.ColumnSize(
+ bodyIndex)) == KErrNone)
+ {
+ sqlSelectStmt.ColumnText(bodyIndex, bodyBuffer);
+ item.setData(
+ XQConversions::s60DescToQString(
+ bodyBuffer), BodyText);
+ bodyBuffer.Close();
+ }
RBuf previewPathBuffer;
- previewPathBuffer.Create(sqlSelectStmt.ColumnSize(
- previewPathIndex));
- sqlSelectStmt.ColumnText(previewPathIndex,
- previewPathBuffer);
+ QString attachmentPath;
+ if (previewPathBuffer.Create(
+ sqlSelectStmt.ColumnSize(
+ previewPathIndex)) == KErrNone)
+ {
+ sqlSelectStmt.ColumnText(
+ previewPathIndex,
+ previewPathBuffer);
- //Rightnow set inside attachments
- QString attachmentPath(XQConversions::s60DescToQString(
- previewPathBuffer));
-
- item.setData(attachmentPath, Attachments);
- previewPathBuffer.Close();
-
+ //Rightnow set inside attachments
+ attachmentPath = XQConversions::s60DescToQString(
+ previewPathBuffer);
+ item.setData(attachmentPath, Attachments);
+ previewPathBuffer.Close();
+ }
+
int msgProperty = 0;
msgProperty = sqlSelectStmt.ColumnInt(msgpropertyIndex);
item.setData(msgProperty, MessageProperty);
@@ -555,7 +568,14 @@
{
QFile file(objectList[index]->path());
file.open(QIODevice::ReadOnly);
- textContent = file.readAll();
+ QByteArray textArray;
+ textArray = file.readAll();
+ char *data = new char[textArray.size()+1];
+ strcpy(data,textArray.data());
+ //This is needed since MMS text content
+ //is stored in UTF8 format
+ textContent = textContent.fromUtf8(data,strlen(data));
+ delete []data;
item.setData(textContent, BodyText);
isBodyTextSet = true;
file.close();
@@ -663,21 +683,6 @@
}
// fetch relevent info to show in CV
- // msg size
- QString estimatedMsgSizeStr = QString("%1").arg(0);
- estimatedMsgSizeStr.append(" Kb");
- TRAP_IGNORE(estimatedMsgSizeStr =
- mMsgStoreHandler->NotificationMsgSizeL());
-
- // 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;
@@ -685,19 +690,15 @@
// create data for bodytext role
QString dataText;
- dataText.append("Size: "); // TODO: use logical str name
- dataText.append(estimatedMsgSizeStr);
+ dataText.append(mMsgStoreHandler->NotificationMsgSize());
dataText.append(QChar::LineSeparator);
- dataText.append("Class: "); // TODO: use logical str name
- dataText.append(classInfoStr);
+ dataText.append(mMsgStoreHandler->NotificationClass());
dataText.append(QChar::LineSeparator);
- dataText.append("Expiry date: "); //TODO: use logical str name
- dataText.append(expiryTimeStr);
+ dataText.append(mMsgStoreHandler->NotificationExpiryDate());
if(!statusStr.isEmpty())
{
dataText.append(QChar::LineSeparator);
dataText.append(statusStr);
- dataText.append(QChar::LineSeparator); //Temp fix to be removed
}
// set fetched data to roles
@@ -718,40 +719,36 @@
//---------------------------------------------------------------
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 = XQConversions::s60DescToQString(*(entry.Description()));
-
- if (description.contains(".vcf") || description.contains(".ics")) // "vCard"
{
- //message sub-type
- item.setData(ConvergedMessage::VCard, MessageSubType);
+ int msgSubType = ConversationsEngineUtility::messageSubType(
+ entry.GetType());
+
+ if (msgSubType == ConvergedMessage::VCard)
+ {
+ handleVCard(item, entry.EntryId());
+ }
+ else
+ {
+ QString description = XQConversions::s60DescToQString(
+ *(entry.Description()));
- //parse vcf file to get the details
- QString displayName = MsgContactHandler::getVCardDisplayName(
- description);
- item.setData(displayName, BodyText);
- }
- else
- {
- if (description.contains(".vcs")) // "vCalendar"
- {
+ if (msgSubType == ConvergedMessage::VCal) // "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);
+ }
}
-}
//---------------------------------------------------------------
// ConversationsModel::handleBioMessages
@@ -759,30 +756,16 @@
//---------------------------------------------------------------
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 =
- MsgContactHandler::getVCardDisplayName(
- attachmentPath);
- item.setData(displayName, BodyText);
- item.setData(attachmentPath, Attachments);
-
- // clear attachement list : its allocated at data model
- while (!attList.isEmpty()) {
- delete attList.takeFirst();
- }
+ if (ConvergedMessage::VCard == msgSubType)
+ {
+ handleVCard(item, entry.EntryId());
}
- }
else if (ConvergedMessage::VCal == msgSubType) {
//not supported
}
else if (ConvergedMessage::RingingTone == msgSubType) {
+ iBioMsgPlugin->setMessageId(entry.EntryId());
if (iBioMsgPlugin->attachmentCount() > 0) {
UniMessageInfoList attList = iBioMsgPlugin->attachmentList();
QString attachmentPath = attList[0]->path();
@@ -963,6 +946,116 @@
}
//---------------------------------------------------------------
+// ConversationsModel::handleVCard()
+// @see header
+//---------------------------------------------------------------
+void ConversationsModel::handleVCard(QStandardItem& item, int msgId)
+ {
+ //sql query to get vcard-path from DB
+ bool vCardParsed = false;
+
+ if (iSqlDbOpen)
+ {
+ RSqlStatement sqlSelectVcardStmt;
+ TInt err = sqlSelectVcardStmt.Prepare(iSqlDb, KSelectVCardStmt);
+
+ QCRITICAL_WRITE_FORMAT("Error from Prepare()", err)
+
+ if (err == KErrNone)
+ {
+ //msg_id
+ TInt msgIdIndex = sqlSelectVcardStmt.ParameterIndex(
+ _L(":message_id"));
+ sqlSelectVcardStmt.BindInt(msgIdIndex, msgId);
+ // state
+ TInt msgProcessingStateIndex = sqlSelectVcardStmt.ColumnIndex(
+ _L("msg_processingstate"));
+
+ // get vacrd-path from DB
+ err = sqlSelectVcardStmt.Next();
+ QCRITICAL_WRITE_FORMAT("Error from Next()", err)
+
+ if (err == KSqlAtRow)
+ {
+ int msgProcessingState = 0;
+ msgProcessingState = sqlSelectVcardStmt.ColumnInt(
+ msgProcessingStateIndex);
+ if (msgProcessingState == EPreviewMsgProcessed)
+ {
+ //path-index
+ TInt previewPathIndex = sqlSelectVcardStmt.ColumnIndex(
+ _L("preview_path"));
+
+ //Get vcard-path data from path-index
+ RSqlColumnReadStream stream;
+ err = stream.ColumnBinary(sqlSelectVcardStmt,
+ previewPathIndex);
+
+ QCRITICAL_WRITE_FORMAT("Error from ColumnBinary()", err)
+
+ if (err == KErrNone)
+ {
+ RBuf vCardPathBuffer;
+ if (vCardPathBuffer.Create(
+ sqlSelectVcardStmt.ColumnSize(
+ previewPathIndex)) == KErrNone)
+ {
+ sqlSelectVcardStmt.ColumnText(
+ previewPathIndex,
+ vCardPathBuffer);
+
+ //set inside attachments
+ QString attachmentPath(
+ XQConversions::s60DescToQString(
+ vCardPathBuffer));
+ item.setData(attachmentPath, Attachments);
+
+ //get display-name and set as bodytext
+ QString displayName =
+ MsgContactHandler::getVCardDisplayName(
+ attachmentPath);
+ item.setData(displayName, BodyText);
+
+ vCardPathBuffer.Close();
+ vCardParsed = true;
+
+ QCRITICAL_WRITE("vcard parsing complete.")
+ }
+ }
+ //close stream
+ stream.Close();
+ }
+ }
+ }
+ sqlSelectVcardStmt.Close();
+ }
+
+ // fallback, if not parsed in DB, parse from store
+ if (!vCardParsed)
+ {
+ iBioMsgPlugin->setMessageId(msgId);
+
+ if (iBioMsgPlugin->attachmentCount() > 0)
+ {
+ UniMessageInfoList attList = iBioMsgPlugin->attachmentList();
+ QString attachmentPath = attList[0]->path();
+
+ //get display-name and set as bodytext
+ QString displayName = MsgContactHandler::getVCardDisplayName(
+ attachmentPath);
+ item.setData(displayName, BodyText);
+ item.setData(attachmentPath, Attachments);
+
+ // clear attachement list : its allocated at data model
+ while (!attList.isEmpty())
+ {
+ delete attList.takeFirst();
+ }
+ }
+ }
+ }
+
+//---------------------------------------------------------------
// ConversationsModel::clearModel()
// @see header
//---------------------------------------------------------------
@@ -972,6 +1065,10 @@
previewIconCache.clear();
}
+//---------------------------------------------------------------
+// ConversationsModel::emitConversationViewEmpty()
+// @see header
+//---------------------------------------------------------------
void ConversationsModel:: emitConversationViewEmpty()
{
emit conversationViewEmpty();