messagingapp/msgui/appengine/src/conversationsmodel.cpp
changeset 52 12db4185673b
parent 44 36f374c67aa8
child 70 a15d9966050f
--- 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();