messagingapp/msgnotifications/msgnotifier/src/msgnotifier_p.cpp
branchRCL_3
changeset 57 ebe688cedc25
--- /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 <msvapi.h>
+#include <ccsclientconversation.h>
+#include <ccsrequesthandler.h>
+#include <ccsconversationentry.h>
+#include <xqservicerequest.h>
+#include <QString>
+#include <w32std.h>
+#include <apgtask.h> 
+#include <XQSettingsManager>
+#include <xqaiwrequest.h>
+#include <xqappmgr.h>
+#include <xqpublishandsubscribeutils.h>
+#include <xqsystemtoneservice.h>
+#include <xqconversions.h>
+#include <QThreadPool>
+
+//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<int>(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<QVariant> 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