diff -r fa1df4b99609 -r ebe688cedc25 messagingapp/msgnotifications/msgnotifier/src/msgnotifier_p.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgnotifications/msgnotifier/src/msgnotifier_p.cpp Tue Aug 31 15:11:31 2010 +0300 @@ -0,0 +1,469 @@ +/* + * 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: Listen to conversation server events and parse the + * events. These parse infomation passed to notifications and indications. + * + */ + +// SYSTEM INCLUDES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//USER INCLUDES +#include "msgnotifier.h" +#include "msgnotifier_p.h" +#include "msgstorehandler.h" +#include "msginfodefs.h" +#include "conversationidpsconsts.h" +#include "debugtraces.h" + +// ---------------------------------------------------------------------------- +// MsgNotifierPrivate::MsgNotifierPrivate +// @see MsgNotifierPrivate.h +// ---------------------------------------------------------------------------- +MsgNotifierPrivate::MsgNotifierPrivate(MsgNotifier* MsgNotifier) : + q_ptr(MsgNotifier), mCvServer(NULL), iMsgStoreHandler(NULL), + mSettingsManager(NULL),mPSUtils(NULL) +{ + QDEBUG_WRITE("MsgNotifierPrivate::MsgNotifierPrivate : Enter") + + initL(); + QDEBUG_WRITE("MsgNotifierPrivate::MsgNotifierPrivate : Exit") +} + +// ---------------------------------------------------------------------------- +// MsgNotifierPrivate::~MsgNotifierPrivate +// @see MsgNotifierPrivate.h +// ---------------------------------------------------------------------------- +MsgNotifierPrivate::~MsgNotifierPrivate() +{ + QDEBUG_WRITE("MsgNotifierPrivate::~MsgNotifierPrivate : Enter") + if (mCvServer) { + TRAP_IGNORE(mCvServer->RemoveConversationListChangeEventL(this)); + delete mCvServer; + mCvServer = NULL; + } + + if (iMsgStoreHandler) { + delete iMsgStoreHandler; + iMsgStoreHandler = NULL; + } + + if(mPSUtils) + { + delete mPSUtils; + } + + if(mSettingsManager) + { + delete mSettingsManager; + } + + if(mSts) + { + delete mSts; + mSts = NULL; + } + + QDEBUG_WRITE("MsgNotifierPrivate::~MsgNotifierPrivate : Exit") +} + +// ---------------------------------------------------------------------------- +// MsgNotifierPrivate::initL +// @see MsgNotifierPrivate.h +// ---------------------------------------------------------------------------- +void MsgNotifierPrivate::initL() +{ + QDEBUG_WRITE("MsgNotifierPrivate::initL : Enter") + + mCvServer = CCSRequestHandler::NewL(); + mCvServer->RequestConversationListChangeEventL(this); + iMsgStoreHandler = new MsgStoreHandler(this, mCvServer); + updateUnreadIndications(true); + updateOutboxIndications(); + + QT_TRYCATCH_LEAVING(mSettingsManager = new XQSettingsManager()); + + // define property + QT_TRYCATCH_LEAVING(mPSUtils = new XQPublishAndSubscribeUtils(*mSettingsManager)); + + XQPublishAndSubscribeSettingsKey convIdKey( + KMsgCVIdProperty, KMsgCVIdKey); + bool success = mPSUtils->defineProperty(convIdKey, + XQSettingsManager::TypeInt); + + QDEBUG_WRITE_FORMAT("MsgNotifierPrivate::initL " + "property creation ret value",success) + + // write -1 initially + success = mSettingsManager->writeItemValue(convIdKey,-1); + + QDEBUG_WRITE_FORMAT("MsgNotifierPrivate::initL " + "writing ret value",success) + + QT_TRYCATCH_LEAVING(mSts = new XQSystemToneService()); + + QDEBUG_WRITE("MsgNotifierPrivate::initL : Exit") +} + +// ---------------------------------------------------------------------------- +// MsgNotifierPrivate::AddConversationList +// @see MsgNotifierPrivate.h +// ---------------------------------------------------------------------------- +void MsgNotifierPrivate::AddConversationList( + const CCsClientConversation& aClientConversation) +{ + QCRITICAL_WRITE("MsgNotifierPrivate::AddConversationList : Enter") + + processListEntry(aClientConversation); + updateUnreadIndications(); + + QCRITICAL_WRITE("MsgNotifierPrivate::AddConversationList : Exit") +} + +// ---------------------------------------------------------------------------- +// MsgNotifierPrivate::DeleteConversationList +// @see MsgNotifierPrivate.h +// ---------------------------------------------------------------------------- +void MsgNotifierPrivate::DeleteConversationList( + const CCsClientConversation& /*aClientConversation*/) +{ + QDEBUG_WRITE("MsgNotifierPrivate::DeleteConversationList : Enter") + updateUnreadIndications(); + QDEBUG_WRITE("MsgNotifierPrivate::DeleteConversationList : Exit") +} + +// ---------------------------------------------------------------------------- +// MsgNotifierPrivate::ModifyConversationList +// @see MsgNotifierPrivate.h +// ---------------------------------------------------------------------------- +void MsgNotifierPrivate::ModifyConversationList(const CCsClientConversation& aClientConversation) +{ + QCRITICAL_WRITE("MsgNotifierPrivate::ModifyConversationList : Enter") + + processListEntry(aClientConversation); + updateUnreadIndications(); + + QCRITICAL_WRITE("MsgNotifierPrivate::ModifyConversationList : Exit") +} + +// ---------------------------------------------------------------------------- +// MsgNotifierPrivate::RefreshConversationList +// @see MsgNotifierPrivate.h +// ---------------------------------------------------------------------------- +void MsgNotifierPrivate::RefreshConversationList() +{ + +} + +// ---------------------------------------------------------------------------- +// MsgNotifierPrivate::processListEntry +// @see MsgNotifierPrivate.h +// ---------------------------------------------------------------------------- +void MsgNotifierPrivate::processListEntry( + const CCsClientConversation& aClientConversation) + { + QCRITICAL_WRITE("MsgNotifierPrivate::processListEntry : Enter") + + CCsConversationEntry* convEntry = + aClientConversation.GetConversationEntry(); + + QDEBUG_WRITE_FORMAT("MsgNotifierPrivate::processListEntry Direction", + convEntry->ConversationDir()) + QDEBUG_WRITE_FORMAT("MsgNotifierPrivate::processListEntry New Entry Attribute", + convEntry->IsAttributeSet(ECsAttributeNewEntryAdded)) + QDEBUG_WRITE_FORMAT("MsgNotifierPrivate::processListEntry Unread Attribute", + convEntry->IsAttributeSet(ECsAttributeUnread)) + + if((convEntry->ConversationDir() == ECsDirectionIncoming) + && convEntry->IsAttributeSet(ECsAttributeNewEntryAdded) + && convEntry->IsAttributeSet(ECsAttributeUnread)) + { + QDEBUG_WRITE("processListEntry : Processing data for Notification") + + NotificationData notifData; + notifData.msvEntryId = convEntry->EntryId(); + notifData.mConversationId = aClientConversation.GetConversationEntryId(); + notifData.mMsgType = static_cast(convEntry->GetType()); + + HBufC* displayName = aClientConversation.GetDisplayName(); + HBufC* number = convEntry->Contact(); + HBufC* descrp = convEntry->Description(); + + if(displayName) + { + notifData.mDisplayName = + XQConversions::s60DescToQString(*displayName); + } + if(number) + { + notifData.mContactNum = XQConversions::s60DescToQString(*number); + } + if(descrp) + { + notifData.mDescription = XQConversions::s60DescToQString(*descrp); + } + + //Play new message alert tone. + mSts->playTone(XQSystemToneService::SmsAlertTone); + + // check whether opened cv id and received + // cv id are same and show notification + if( showNotification(notifData.mConversationId )) + { + q_ptr->displayNewMessageNotification(notifData); + QDEBUG_WRITE("processListEntry : Notification display called") + } + + } + + QCRITICAL_WRITE("MsgNotifierPrivate::processListEntry : Exit") + } + +// ---------------------------------------------------------------------------- +// MsgNotifierPrivate::updateUnreadIndications +// @see MsgNotifierPrivate.h +// ---------------------------------------------------------------------------- +void MsgNotifierPrivate::updateUnreadIndications(bool bootup) +{ + QDEBUG_WRITE("MsgNotifierPrivate::updateIndicationsL : Enter") + + int unreadCount(0); + if(bootup) + { + TRAP_IGNORE(unreadCount = iMsgStoreHandler->GetUnreadMessageCountL()); + } + else + { + TRAP_IGNORE(unreadCount = mCvServer->GetTotalUnreadCountL()); + } + + QDEBUG_WRITE_FORMAT("MsgNotifierPrivate::" + "updateIndications unreadCount = ",unreadCount ); + + //activate or deactivate indications based on unread count + q_ptr->updateUnreadIndications(unreadCount); + + QDEBUG_WRITE("MsgNotifierPrivate::updateIndicationsL : Exit") +} + +// ---------------------------------------------------------------------------- +// MsgNotifierPrivate::updateOutboxIndications +// @see MsgNotifierPrivate.h +// ---------------------------------------------------------------------------- +void MsgNotifierPrivate::updateOutboxIndications() +{ + + MsgInfo failedIndicatorData; + MsgInfo pendingIndicatorData; + TInt err = KErrNone; + + TRAP(err, iMsgStoreHandler->GetOutboxEntriesL(failedIndicatorData,pendingIndicatorData)); + + q_ptr->updateOutboxIndications(failedIndicatorData); + q_ptr->updateOutboxIndications(pendingIndicatorData); +} + + +// ---------------------------------------------------------------------------- +// MsgNotifierPrivate::displayOutboxIndications +// @see MsgNotifierPrivate.h +// ---------------------------------------------------------------------------- + +void MsgNotifierPrivate::displayOutboxIndications(MsgInfo data) + { + q_ptr->updateOutboxIndications(data); + } + +// ---------------------------------------------------------------------------- +// MsgNotifierPrivate::displayFailedNote +// @see MsgNotifierPrivate.h +// ---------------------------------------------------------------------------- +void MsgNotifierPrivate::displayFailedNote(MsgInfo info) + { + QDEBUG_WRITE("MsgNotifierPrivate::displayFailedNote start.") + + // check whether opened cv id and received + // cv id are same then dont show failed note + if (!showNotification(info.mConversationId)) + { + return; + } + + //Even if name string is empty we shall add name into args + QString nameString; + + info.mDisplayName.removeDuplicates(); + info.mDisplayName.sort(); + + nameString.append(info.mDisplayName.at(0)); + for (int i = 1; i < info.mDisplayName.count(); ++i) + { + nameString.append(", "); + nameString.append(info.mDisplayName.at(i)); + } + + // create request arguments + QVariantList args; + args << QVariant(nameString); + args << info.mConversationId; + args << info.mMessageType; + + // TODO: use XQAiwRequest + XQServiceRequest snd("messaging.com.nokia.symbian.MsgErrorNotifier", + "displayErrorNote(QVariantList)", false); + + snd << args; + snd.send(); + + QDEBUG_WRITE("MsgNotifierPrivate::displayFailedNote end.") + } + +// ---------------------------------------------------------------------------- +// MsgNotifierPrivate::showNotification +// @see MsgNotifierPrivate.h +// ---------------------------------------------------------------------------- +bool MsgNotifierPrivate::showNotification(int receivedMsgConvId) +{ + bool showNotification = true; + + RWsSession wsSession ; + wsSession.Connect(); + + TApaTaskList taskList( wsSession ); + TApaTask task = taskList.FindApp(KMsgAppUid); // find msgapp is running + + if(task.Exists()) + { + TApaTask foregndtask = taskList.FindByPos(0) ; // foreground app + // compare window group id + // if application is in foregorund, then check the currently + // opened conversation is same as received one. + if(task.WgId() == foregndtask.WgId() ) + { + // get the current conversation ID + XQPublishAndSubscribeSettingsKey convIdKey( KMsgCVIdProperty, + KMsgCVIdKey); + QVariant value = mSettingsManager->readItemValue(convIdKey, + XQSettingsManager::TypeInt); + + int openedConvId = value.toInt(); + if( openedConvId == receivedMsgConvId) + { + showNotification = false; + QDEBUG_WRITE("processListEntry : Notification not shown") + } + } + } + + wsSession.Close(); + return showNotification; +} +// ---------------------------------------------------------------------------- +// MsgNotifierPrivate::PartialDeleteConversationList +// @see mcsconversationclientchangeobserver.h +// ---------------------------------------------------------------------------- +void MsgNotifierPrivate::PartialDeleteConversationList( + const CCsClientConversation& /*aClientConversation*/){/*empty implementation*/} + + +// ---------------------------------------------------------------------------- +// MsgNotifierPrivate::ShowClass0Message +// @see msgnotifier_p.h +// ---------------------------------------------------------------------------- + +void MsgNotifierPrivate::ShowClass0Message(Class0Info& class0Info) +{ + QCRITICAL_WRITE("flashmsgnotifier BEGIN"); + QThreadPool::globalInstance()->start(new Class0SmsServiceTask(class0Info)); + QCRITICAL_WRITE("flashmsgnotifier END"); +} + + + + +// ---------------------------------------------------------------------------- +// Class0SmsServiceTask::Class0SmsServiceTask +// @see msgnotifier_p.h +// ---------------------------------------------------------------------------- +Class0SmsServiceTask::Class0SmsServiceTask(Class0Info& class0Info): +mClass0info(class0Info) + { + } + +// ---------------------------------------------------------------------------- +// Class0SmsServiceTask::~Class0SmsServiceTask +// @see msgnotifier_p.h +// ---------------------------------------------------------------------------- +Class0SmsServiceTask::~Class0SmsServiceTask() + { + } + +// ---------------------------------------------------------------------------- +// Class0SmsServiceTask::run +// @see msgnotifier_p.h +// ---------------------------------------------------------------------------- +void Class0SmsServiceTask::run() + { + QList args; + QString serviceName("flashmsgnotifier"); + QString interfaceName("com.nokia.symbian.IFlashMsgNotifier"); + QString operation("displayFlashMsg(QByteArray)"); + XQAiwRequest* request; + XQApplicationManager appManager; + + request = appManager.create(interfaceName, operation, false); //non-embedded + + if ( request == NULL ) + { + QCRITICAL_WRITE("flashmsgnotifier request == NULL"); + return; + } + + QByteArray ba; + QDataStream stream(&ba, QIODevice::ReadWrite); + stream << mClass0info.body; + stream << mClass0info.address; + stream << mClass0info.alias; + stream << mClass0info.time; + stream << mClass0info.messageId; + + args << ba; + request->setArguments(args); + + if(!request->send()) + { + QString lastErr; + lastErr = request->lastErrorMessage(); + QDEBUG_WRITE_FORMAT("flashmsgnotifier launch failed", lastErr); + } + + QCRITICAL_WRITE("flashmsgnotifier END"); + delete request; + } + +//EOF