45 _LIT(KSelectConvMsgsStmt, "SELECT message_id, msg_processingstate, subject, body_text, preview_path, msg_property, preview_icon FROM conversation_messages WHERE message_id=:message_id "); |
45 _LIT(KSelectConvMsgsStmt, "SELECT message_id, msg_processingstate, subject, body_text, preview_path, msg_property, preview_icon FROM conversation_messages WHERE message_id=:message_id "); |
46 |
46 |
47 //selecet preview-icon query |
47 //selecet preview-icon query |
48 _LIT(KSelectPreviewIconStmt,"SELECT message_id, preview_icon FROM conversation_messages WHERE message_id = :message_id "); |
48 _LIT(KSelectPreviewIconStmt,"SELECT message_id, preview_icon FROM conversation_messages WHERE message_id = :message_id "); |
49 |
49 |
|
50 //selecet vcard-path query |
|
51 _LIT(KSelectVCardStmt,"SELECT message_id, msg_processingstate, preview_path FROM conversation_messages WHERE message_id = :message_id "); |
|
52 |
50 // preview-cache max cost (items) |
53 // preview-cache max cost (items) |
51 const int CACHE_COST = 50; |
54 const int CACHE_COST = 50; |
52 //Preview thumbnail size |
55 //Preview thumbnail size |
53 const int KWidth = 9.5 * 6.7; |
56 const int KWidth = 9.5 * 6.7; |
54 const int KHeight = 9.5 * 6.7; |
57 const int KHeight = 9.5 * 6.7; |
433 if (msgProcessingState == EPreviewMsgProcessed) |
436 if (msgProcessingState == EPreviewMsgProcessed) |
434 { |
437 { |
435 // use entry to populate model only when, |
438 // use entry to populate model only when, |
436 // entry is present in DB and its processing is over. |
439 // entry is present in DB and its processing is over. |
437 RBuf subjectBuffer; |
440 RBuf subjectBuffer; |
438 subjectBuffer.Create(sqlSelectStmt.ColumnSize( |
441 if( subjectBuffer.Create( |
439 subjectIndex)); |
442 sqlSelectStmt.ColumnSize( |
440 sqlSelectStmt.ColumnText(subjectIndex, subjectBuffer); |
443 subjectIndex)) == KErrNone) |
441 |
444 { |
442 item.setData(XQConversions::s60DescToQString( |
445 sqlSelectStmt.ColumnText(subjectIndex, subjectBuffer); |
443 subjectBuffer), Subject); |
446 item.setData( |
444 subjectBuffer.Close(); |
447 XQConversions::s60DescToQString( |
445 |
448 subjectBuffer), Subject); |
|
449 subjectBuffer.Close(); |
|
450 } |
|
451 |
446 RBuf bodyBuffer; |
452 RBuf bodyBuffer; |
447 bodyBuffer.Create(sqlSelectStmt.ColumnSize(bodyIndex)); |
453 if (bodyBuffer.Create( |
448 sqlSelectStmt.ColumnText(bodyIndex, bodyBuffer); |
454 sqlSelectStmt.ColumnSize( |
449 |
455 bodyIndex)) == KErrNone) |
450 item.setData( |
456 { |
451 XQConversions::s60DescToQString(bodyBuffer), |
457 sqlSelectStmt.ColumnText(bodyIndex, bodyBuffer); |
452 BodyText); |
458 item.setData( |
453 bodyBuffer.Close(); |
459 XQConversions::s60DescToQString( |
|
460 bodyBuffer), BodyText); |
|
461 bodyBuffer.Close(); |
|
462 } |
454 |
463 |
455 RBuf previewPathBuffer; |
464 RBuf previewPathBuffer; |
456 previewPathBuffer.Create(sqlSelectStmt.ColumnSize( |
465 QString attachmentPath; |
457 previewPathIndex)); |
466 if (previewPathBuffer.Create( |
458 sqlSelectStmt.ColumnText(previewPathIndex, |
467 sqlSelectStmt.ColumnSize( |
459 previewPathBuffer); |
468 previewPathIndex)) == KErrNone) |
460 |
469 { |
461 //Rightnow set inside attachments |
470 sqlSelectStmt.ColumnText( |
462 QString attachmentPath(XQConversions::s60DescToQString( |
471 previewPathIndex, |
463 previewPathBuffer)); |
472 previewPathBuffer); |
464 |
473 |
465 item.setData(attachmentPath, Attachments); |
474 //Rightnow set inside attachments |
466 previewPathBuffer.Close(); |
475 attachmentPath = XQConversions::s60DescToQString( |
467 |
476 previewPathBuffer); |
|
477 item.setData(attachmentPath, Attachments); |
|
478 previewPathBuffer.Close(); |
|
479 } |
|
480 |
468 int msgProperty = 0; |
481 int msgProperty = 0; |
469 msgProperty = sqlSelectStmt.ColumnInt(msgpropertyIndex); |
482 msgProperty = sqlSelectStmt.ColumnInt(msgpropertyIndex); |
470 item.setData(msgProperty, MessageProperty); |
483 item.setData(msgProperty, MessageProperty); |
471 |
484 |
472 RSqlColumnReadStream stream; |
485 RSqlColumnReadStream stream; |
553 if (!isBodyTextSet && objectList[index]->mimetype().contains( |
566 if (!isBodyTextSet && objectList[index]->mimetype().contains( |
554 "text")) |
567 "text")) |
555 { |
568 { |
556 QFile file(objectList[index]->path()); |
569 QFile file(objectList[index]->path()); |
557 file.open(QIODevice::ReadOnly); |
570 file.open(QIODevice::ReadOnly); |
558 textContent = file.readAll(); |
571 QByteArray textArray; |
|
572 textArray = file.readAll(); |
|
573 char *data = new char[textArray.size()+1]; |
|
574 strcpy(data,textArray.data()); |
|
575 //This is needed since MMS text content |
|
576 //is stored in UTF8 format |
|
577 textContent = textContent.fromUtf8(data,strlen(data)); |
|
578 delete []data; |
559 item.setData(textContent, BodyText); |
579 item.setData(textContent, BodyText); |
560 isBodyTextSet = true; |
580 isBodyTextSet = true; |
561 file.close(); |
581 file.close(); |
562 } |
582 } |
563 if (!isVideoSet && !isImageSet && objectList[index]->mimetype().contains( |
583 if (!isVideoSet && !isImageSet && objectList[index]->mimetype().contains( |
661 { |
681 { |
662 return; |
682 return; |
663 } |
683 } |
664 |
684 |
665 // fetch relevent info to show in CV |
685 // fetch relevent info to show in CV |
666 // msg size |
|
667 QString estimatedMsgSizeStr = QString("%1").arg(0); |
|
668 estimatedMsgSizeStr.append(" Kb"); |
|
669 TRAP_IGNORE(estimatedMsgSizeStr = |
|
670 mMsgStoreHandler->NotificationMsgSizeL()); |
|
671 |
|
672 // msg class type |
|
673 QString classInfoStr = mMsgStoreHandler->NotificationClass(); |
|
674 |
|
675 // notification expiry date |
|
676 //TODO: Need to do localization of digits used to show expiry time |
|
677 TTime expiryTime; |
|
678 QString expiryTimeStr; |
|
679 mMsgStoreHandler->NotificationExpiryDate(expiryTime, expiryTimeStr); |
|
680 |
|
681 // notification state e.g. waiting, retrieving etc |
686 // notification state e.g. waiting, retrieving etc |
682 QString statusStr; |
687 QString statusStr; |
683 int status; |
688 int status; |
684 mMsgStoreHandler->NotificationStatus(status, statusStr); |
689 mMsgStoreHandler->NotificationStatus(status, statusStr); |
685 |
690 |
686 // create data for bodytext role |
691 // create data for bodytext role |
687 QString dataText; |
692 QString dataText; |
688 dataText.append("Size: "); // TODO: use logical str name |
693 dataText.append(mMsgStoreHandler->NotificationMsgSize()); |
689 dataText.append(estimatedMsgSizeStr); |
|
690 dataText.append(QChar::LineSeparator); |
694 dataText.append(QChar::LineSeparator); |
691 dataText.append("Class: "); // TODO: use logical str name |
695 dataText.append(mMsgStoreHandler->NotificationClass()); |
692 dataText.append(classInfoStr); |
|
693 dataText.append(QChar::LineSeparator); |
696 dataText.append(QChar::LineSeparator); |
694 dataText.append("Expiry date: "); //TODO: use logical str name |
697 dataText.append(mMsgStoreHandler->NotificationExpiryDate()); |
695 dataText.append(expiryTimeStr); |
|
696 if(!statusStr.isEmpty()) |
698 if(!statusStr.isEmpty()) |
697 { |
699 { |
698 dataText.append(QChar::LineSeparator); |
700 dataText.append(QChar::LineSeparator); |
699 dataText.append(statusStr); |
701 dataText.append(statusStr); |
700 dataText.append(QChar::LineSeparator); //Temp fix to be removed |
|
701 } |
702 } |
702 |
703 |
703 // set fetched data to roles |
704 // set fetched data to roles |
704 item.setData(status, NotificationStatus); |
705 item.setData(status, NotificationStatus); |
705 item.setData(dataText, BodyText); |
706 item.setData(dataText, BodyText); |
716 // ConversationsModel::handleBlueToothMessages |
717 // ConversationsModel::handleBlueToothMessages |
717 // @see header |
718 // @see header |
718 //--------------------------------------------------------------- |
719 //--------------------------------------------------------------- |
719 void ConversationsModel::handleBlueToothMessages(QStandardItem& item, |
720 void ConversationsModel::handleBlueToothMessages(QStandardItem& item, |
720 const CCsConversationEntry& entry) |
721 const CCsConversationEntry& entry) |
721 { |
722 { |
722 //TODO, needs to be revisited again, once BT team provides the solution for |
723 int msgSubType = ConversationsEngineUtility::messageSubType( |
723 //BT received as Biomsg issue. |
724 entry.GetType()); |
724 QString description = XQConversions::s60DescToQString(*(entry.Description())); |
725 |
725 |
726 if (msgSubType == ConvergedMessage::VCard) |
726 if (description.contains(".vcf") || description.contains(".ics")) // "vCard" |
727 { |
727 { |
728 handleVCard(item, entry.EntryId()); |
728 //message sub-type |
729 } |
729 item.setData(ConvergedMessage::VCard, MessageSubType); |
|
730 |
|
731 //parse vcf file to get the details |
|
732 QString displayName = MsgContactHandler::getVCardDisplayName( |
|
733 description); |
|
734 item.setData(displayName, BodyText); |
|
735 } |
|
736 else |
730 else |
737 { |
731 { |
738 if (description.contains(".vcs")) // "vCalendar" |
732 QString description = XQConversions::s60DescToQString( |
739 { |
733 *(entry.Description())); |
|
734 |
|
735 if (msgSubType == ConvergedMessage::VCal) // "vCalendar" |
|
736 { |
740 //message sub-type |
737 //message sub-type |
741 item.setData(ConvergedMessage::VCal, MessageSubType); |
738 item.setData(ConvergedMessage::VCal, MessageSubType); |
742 } |
739 } |
743 else |
740 else |
744 { |
741 { |
745 //message sub-type |
742 //message sub-type |
746 item.setData(ConvergedMessage::None, MessageSubType); |
743 item.setData(ConvergedMessage::None, MessageSubType); |
747 } |
744 } |
748 //for BT messages we show filenames for all other (except vcard) messages |
745 //for BT messages we show filenames for all other (except vcard) messages |
749 //get filename and set as body |
746 //get filename and set as body |
750 QFileInfo fileinfo(description); |
747 QFileInfo fileinfo(description); |
751 QString filename = fileinfo.fileName(); |
748 QString filename = fileinfo.fileName(); |
752 item.setData(filename, BodyText); |
749 item.setData(filename, BodyText); |
753 } |
750 } |
754 } |
751 } |
755 |
752 |
756 //--------------------------------------------------------------- |
753 //--------------------------------------------------------------- |
757 // ConversationsModel::handleBioMessages |
754 // ConversationsModel::handleBioMessages |
758 // @see header |
755 // @see header |
759 //--------------------------------------------------------------- |
756 //--------------------------------------------------------------- |
760 void ConversationsModel::handleBioMessages(QStandardItem& item, const CCsConversationEntry& entry) |
757 void ConversationsModel::handleBioMessages(QStandardItem& item, const CCsConversationEntry& entry) |
761 { |
758 { |
762 iBioMsgPlugin->setMessageId(entry.EntryId()); |
|
763 int msgSubType = ConversationsEngineUtility::messageSubType(entry.GetType()); |
759 int msgSubType = ConversationsEngineUtility::messageSubType(entry.GetType()); |
764 if (ConvergedMessage::VCard == msgSubType) { |
760 if (ConvergedMessage::VCard == msgSubType) |
765 if (iBioMsgPlugin->attachmentCount() > 0) { |
761 { |
766 UniMessageInfoList attList = iBioMsgPlugin->attachmentList(); |
762 handleVCard(item, entry.EntryId()); |
767 QString attachmentPath = attList[0]->path(); |
763 } |
768 |
|
769 //get display-name and set as bodytext |
|
770 QString displayName = |
|
771 MsgContactHandler::getVCardDisplayName( |
|
772 attachmentPath); |
|
773 item.setData(displayName, BodyText); |
|
774 item.setData(attachmentPath, Attachments); |
|
775 |
|
776 // clear attachement list : its allocated at data model |
|
777 while (!attList.isEmpty()) { |
|
778 delete attList.takeFirst(); |
|
779 } |
|
780 } |
|
781 } |
|
782 else if (ConvergedMessage::VCal == msgSubType) { |
764 else if (ConvergedMessage::VCal == msgSubType) { |
783 //not supported |
765 //not supported |
784 } |
766 } |
785 else if (ConvergedMessage::RingingTone == msgSubType) { |
767 else if (ConvergedMessage::RingingTone == msgSubType) { |
|
768 iBioMsgPlugin->setMessageId(entry.EntryId()); |
786 if (iBioMsgPlugin->attachmentCount() > 0) { |
769 if (iBioMsgPlugin->attachmentCount() > 0) { |
787 UniMessageInfoList attList = iBioMsgPlugin->attachmentList(); |
770 UniMessageInfoList attList = iBioMsgPlugin->attachmentList(); |
788 QString attachmentPath = attList[0]->path(); |
771 QString attachmentPath = attList[0]->path(); |
789 |
772 |
790 //get tone title, and set as bodytext |
773 //get tone title, and set as bodytext |
961 QCRITICAL_WRITE("ConversationsModel::updatePreviewIcon end.") |
944 QCRITICAL_WRITE("ConversationsModel::updatePreviewIcon end.") |
962 |
945 |
963 } |
946 } |
964 |
947 |
965 //--------------------------------------------------------------- |
948 //--------------------------------------------------------------- |
|
949 // ConversationsModel::handleVCard() |
|
950 // @see header |
|
951 //--------------------------------------------------------------- |
|
952 void ConversationsModel::handleVCard(QStandardItem& item, int msgId) |
|
953 { |
|
954 //sql query to get vcard-path from DB |
|
955 bool vCardParsed = false; |
|
956 |
|
957 if (iSqlDbOpen) |
|
958 { |
|
959 RSqlStatement sqlSelectVcardStmt; |
|
960 TInt err = sqlSelectVcardStmt.Prepare(iSqlDb, KSelectVCardStmt); |
|
961 |
|
962 QCRITICAL_WRITE_FORMAT("Error from Prepare()", err) |
|
963 |
|
964 if (err == KErrNone) |
|
965 { |
|
966 //msg_id |
|
967 TInt msgIdIndex = sqlSelectVcardStmt.ParameterIndex( |
|
968 _L(":message_id")); |
|
969 sqlSelectVcardStmt.BindInt(msgIdIndex, msgId); |
|
970 // state |
|
971 TInt msgProcessingStateIndex = sqlSelectVcardStmt.ColumnIndex( |
|
972 _L("msg_processingstate")); |
|
973 |
|
974 // get vacrd-path from DB |
|
975 err = sqlSelectVcardStmt.Next(); |
|
976 QCRITICAL_WRITE_FORMAT("Error from Next()", err) |
|
977 |
|
978 if (err == KSqlAtRow) |
|
979 { |
|
980 int msgProcessingState = 0; |
|
981 msgProcessingState = sqlSelectVcardStmt.ColumnInt( |
|
982 msgProcessingStateIndex); |
|
983 if (msgProcessingState == EPreviewMsgProcessed) |
|
984 { |
|
985 //path-index |
|
986 TInt previewPathIndex = sqlSelectVcardStmt.ColumnIndex( |
|
987 _L("preview_path")); |
|
988 |
|
989 //Get vcard-path data from path-index |
|
990 RSqlColumnReadStream stream; |
|
991 err = stream.ColumnBinary(sqlSelectVcardStmt, |
|
992 previewPathIndex); |
|
993 |
|
994 QCRITICAL_WRITE_FORMAT("Error from ColumnBinary()", err) |
|
995 |
|
996 if (err == KErrNone) |
|
997 { |
|
998 RBuf vCardPathBuffer; |
|
999 if (vCardPathBuffer.Create( |
|
1000 sqlSelectVcardStmt.ColumnSize( |
|
1001 previewPathIndex)) == KErrNone) |
|
1002 { |
|
1003 sqlSelectVcardStmt.ColumnText( |
|
1004 previewPathIndex, |
|
1005 vCardPathBuffer); |
|
1006 |
|
1007 //set inside attachments |
|
1008 QString attachmentPath( |
|
1009 XQConversions::s60DescToQString( |
|
1010 vCardPathBuffer)); |
|
1011 item.setData(attachmentPath, Attachments); |
|
1012 |
|
1013 //get display-name and set as bodytext |
|
1014 QString displayName = |
|
1015 MsgContactHandler::getVCardDisplayName( |
|
1016 attachmentPath); |
|
1017 item.setData(displayName, BodyText); |
|
1018 |
|
1019 vCardPathBuffer.Close(); |
|
1020 vCardParsed = true; |
|
1021 |
|
1022 QCRITICAL_WRITE("vcard parsing complete.") |
|
1023 } |
|
1024 } |
|
1025 //close stream |
|
1026 stream.Close(); |
|
1027 } |
|
1028 } |
|
1029 } |
|
1030 sqlSelectVcardStmt.Close(); |
|
1031 } |
|
1032 |
|
1033 // fallback, if not parsed in DB, parse from store |
|
1034 if (!vCardParsed) |
|
1035 { |
|
1036 iBioMsgPlugin->setMessageId(msgId); |
|
1037 |
|
1038 if (iBioMsgPlugin->attachmentCount() > 0) |
|
1039 { |
|
1040 UniMessageInfoList attList = iBioMsgPlugin->attachmentList(); |
|
1041 QString attachmentPath = attList[0]->path(); |
|
1042 |
|
1043 //get display-name and set as bodytext |
|
1044 QString displayName = MsgContactHandler::getVCardDisplayName( |
|
1045 attachmentPath); |
|
1046 item.setData(displayName, BodyText); |
|
1047 item.setData(attachmentPath, Attachments); |
|
1048 |
|
1049 // clear attachement list : its allocated at data model |
|
1050 while (!attList.isEmpty()) |
|
1051 { |
|
1052 delete attList.takeFirst(); |
|
1053 } |
|
1054 } |
|
1055 } |
|
1056 } |
|
1057 |
|
1058 //--------------------------------------------------------------- |
966 // ConversationsModel::clearModel() |
1059 // ConversationsModel::clearModel() |
967 // @see header |
1060 // @see header |
968 //--------------------------------------------------------------- |
1061 //--------------------------------------------------------------- |
969 void ConversationsModel::clearModel() |
1062 void ConversationsModel::clearModel() |
970 { |
1063 { |
971 clear(); |
1064 clear(); |
972 previewIconCache.clear(); |
1065 previewIconCache.clear(); |
973 } |
1066 } |
974 |
1067 |
|
1068 //--------------------------------------------------------------- |
|
1069 // ConversationsModel::emitConversationViewEmpty() |
|
1070 // @see header |
|
1071 //--------------------------------------------------------------- |
975 void ConversationsModel:: emitConversationViewEmpty() |
1072 void ConversationsModel:: emitConversationViewEmpty() |
976 { |
1073 { |
977 emit conversationViewEmpty(); |
1074 emit conversationViewEmpty(); |
978 } |
1075 } |
979 //EOF |
1076 //EOF |