emailuis/nmailui/src/nmapplication.cpp
changeset 54 997a02608b3a
parent 53 bf7eb7911fc5
child 59 16ed8d08d0b1
--- a/emailuis/nmailui/src/nmapplication.cpp	Wed Jun 23 18:00:21 2010 +0300
+++ b/emailuis/nmailui/src/nmapplication.cpp	Tue Jul 06 14:04:34 2010 +0300
@@ -1,307 +1,320 @@
 /*
-* Copyright (c) 2009 - 2010 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:
-*
-*/
+ * Copyright (c) 2009-2010 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:
+ *
+ */
 
 #include "nmuiheaders.h"
-#ifdef Q_OS_SYMBIAN
 #include <email_services_api.h>
 #include <e32base.h>
-#else
-#define NM_WINS_ENV
-#endif
 
 static const QString NmSendServiceName = "nmail.com.nokia.symbian.IFileShare";
 
 /*!
-	\class NmApplication
-	\brief Application class, creates main window and handles view switching
+    \class NmApplication
+    \brief Application class, creates main window and handles view switching.
 */
 
 /*!
-    Constructor
+    Constructor.
 */
-NmApplication::NmApplication(QObject *parent)
-:QObject(parent),
-mMainWindow(NULL),
-mViewStack(NULL),
-mActiveViewId(NmUiViewNone),
-mUiEngine(NULL),
-mBackAction(NULL),
-mExtensionManager(NULL),
-mMbListModel(NULL),
-mServiceViewId(NmUiViewNone),
-mForegroundService(false),
-mEffects(NULL),
-mAttaManager(NULL),
-mSettingsViewLauncher(NULL),
-mViewReady(false),
-mQueryDialog(NULL)
+NmApplication::NmApplication(QObject *parent, quint32 accountId)
+: QObject(parent),
+  mMainWindow(NULL),
+  mViewStack(NULL),
+  mActiveViewId(NmUiViewNone),
+  mUiEngine(NULL),
+  mBackAction(NULL),
+  mExtensionManager(NULL),
+  mMbListModel(NULL),
+  mServiceViewId(NmUiViewNone),
+  mForegroundService(false),
+  mEffects(NULL),
+  mAttaManager(NULL),
+  mSettingsViewLauncher(NULL),
+  mViewReady(false),
+  mQueryDialog(NULL),
+  mBackButtonPressed(false)
 {
-    NM_FUNCTION;
-
-    // TEMPORARY WORKAROUND TO PREVENT PANIC User panic 66, where there is
-    // a PushL call to cleanup stack without any TRAP.
-#ifdef Q_OS_SYMBIAN
     TRAP_IGNORE(mUiEngine = NmUiEngine::instance());
-#else
-    mUiEngine = NmUiEngine::instance();
-#endif
-
+    
     // Create network access manager and cache for application use.
     mNetManager = new NmViewerViewNetManager(*mUiEngine);
     QNetworkDiskCache *cache = new QNetworkDiskCache();
-    cache->setCacheDirectory(QDesktopServices::storageLocation(QDesktopServices::CacheLocation));
+    cache->setCacheDirectory(
+        QDesktopServices::storageLocation(QDesktopServices::CacheLocation));
     mNetManager->setCache(cache);
-
+    
     createMainWindow();
-
-    // attachment manager can be shared between viewer and editor, ownership in application class
+    
+    // Attachment manager can be shared between viewer and editor.
+    // The application class has the ownership.
     mAttaManager = new NmAttachmentManager(*mUiEngine);
-
-#ifndef NM_WINS_ENV
+    
     mSendServiceInterface =
-            new NmSendServiceInterface(NmSendServiceName, NULL, *mUiEngine, this);
+        new NmSendServiceInterface(NmSendServiceName, NULL, *mUiEngine, this);
     mSendServiceInterface2 =
-            new NmSendServiceInterface(emailFullServiceNameSend, NULL, *mUiEngine, this);
+        new NmSendServiceInterface(emailFullServiceNameSend, NULL, *mUiEngine, this);
     mUriServiceInterface =
         new NmUriServiceInterface(NULL, *mUiEngine, this);
     mMailboxServiceInterface =
-            new NmMailboxServiceInterface(NULL, *mUiEngine, this);
+        new NmMailboxServiceInterface(NULL, *mUiEngine, this);
     mViewerServiceInterface =
-            new NmViewerServiceInterface(NULL, this, *mUiEngine);
-#endif
-
+        new NmViewerServiceInterface(NULL, this, *mUiEngine);
+    
+    if(accountId != 0) {
+        QVariant mailbox;
+        mailbox.setValue(mUiEngine->getPluginIdByMailboxId(accountId).id());
+        mMailboxServiceInterface->displayInboxByMailboxId(mailbox);
+    }
+    
     mEffects = new NmUiEffects(*mMainWindow);
 }
 
 /*!
-    Destructor
+    Destructor.
 */
 NmApplication::~NmApplication()
 {
-    NM_FUNCTION;
-
-    if (mQueryDialog){
+    if (mQueryDialog) {
         delete mQueryDialog;
-        mQueryDialog=NULL;
+        mQueryDialog = NULL;
     }
-
-#ifndef NM_WINS_ENV
-	delete mSendServiceInterface;
-	delete mSendServiceInterface2;
-	delete mUriServiceInterface;
-	delete mMailboxServiceInterface;
-	delete mViewerServiceInterface;
-#endif
-
-	resetViewStack();
+    
+    delete mSendServiceInterface;
+    delete mSendServiceInterface2;
+    delete mUriServiceInterface;
+    delete mMailboxServiceInterface;
+    delete mViewerServiceInterface;
+    
+    resetViewStack();
     delete mViewStack;
+    
     NmIcons::freeIcons();
     NmUiEngine::releaseInstance(mUiEngine);
     mUiEngine = NULL;
+    
     delete mBackAction;
+    
+    // Workaround: the main window has to be closed (hidden) before deleting
+    // the extension manager in order to prevent the main window's title bar
+    // from showing when the application is closed.
+    if (mMainWindow) {
+        // Workaround: assert failure may happen if an open main window is
+        // deleted.
+        mMainWindow->close();
+    }
+    
     delete mExtensionManager;
-    if (mNetManager){
-        if (mNetManager->cache()){
+    
+    if (mNetManager) {
+        if (mNetManager->cache()) {
             mNetManager->cache()->clear();
         }
     delete mNetManager;
-    mNetManager=NULL;
+    mNetManager = NULL;
     }
-    // Effects needs to be deleted before MainWindow.
+    
+    // Effects need to be deleted before MainWindow.
     delete mEffects;
-    if (mMainWindow) {
-        // workaround: assert failure may happen otherwise
-        mMainWindow->close();
-    }
     delete mMainWindow;
     delete mAttaManager;
     delete mSettingsViewLauncher;
 }
 
 /*!
-    Main application window creation
+    Main application window creation.
 */
 void NmApplication::createMainWindow()
 {
     NM_FUNCTION;
-
-#ifndef NM_WINS_ENV
+    
     bool service = XQServiceUtil::isService();
-#else
-    bool service = false;
-#endif
-
-    // Register custom widget files
+    
+    // Register custom widget files.
     HbStyleLoader::registerFilePath(":nmmessagelistviewitem.widgetml");
     HbStyleLoader::registerFilePath(":nmmessagelistviewitem.css");
     HbStyleLoader::registerFilePath(":nmviewerheader.widgetml");
     HbStyleLoader::registerFilePath(":nmviewerheader.css");
-
-    // Create main window
+    
+    // Create main window.
     mMainWindow = new HbMainWindow();
-
-    // Connect to lazy loading signal
+    
+    // Connect to lazy loading signal.
     QObject::connect(mMainWindow, SIGNAL(viewReady ()),
                      this, SLOT(viewReady()));
-
-    // Create extension manager
+    
+    // Create extension manager.
     mExtensionManager = new NmUiExtensionManager();
-
-    // Create view stack
+    
+    // Create view stack.
     mViewStack = new QStack<NmBaseView*>;
-
-    // Create back action and connect it to prepareForPopView()
+    
+    // Create back action and connect it to prepareForPopView().
     if (mMainWindow) {
         mBackAction = new HbAction(Hb::BackNaviAction,this);
-        connect(mBackAction, SIGNAL(triggered()), this, SLOT(prepareForPopView()));
-
-        // Show mainwindow
-        // Services will active it when the view is ready
+        connect(mBackAction,
+                SIGNAL(triggered()),
+                this,
+                SLOT(prepareForPopView()));
+        
+        // Show mainwindow.
+        // Services will active it when the view is ready.
         if (!service) {
             mMainWindow->show();
         }
     }
-
-    // async operation completion related notifications
-    connect(
-        mUiEngine, SIGNAL(operationCompleted(const NmOperationCompletionEvent &)),
-        this, SLOT(handleOperationCompleted(const NmOperationCompletionEvent &)));
-
+    
+    // Asynchronous operation completion related notifications.
+    connect(mUiEngine,
+            SIGNAL(operationCompleted(const NmOperationCompletionEvent &)),
+            this,
+            SLOT(handleOperationCompleted(const NmOperationCompletionEvent &)));
+    
     mMbListModel = &mUiEngine->mailboxListModel();
-
-    // Start application to mailbox view
-    // If started as service, there is no need to create views
+    
+    // ----------------------------------------------------------------------
+    // TODO: Remove or comment out the following code block when the mail
+    //       wizard starts to work with Mfe.
+    // ----------------------------------------------------------------------
+    // Start application to mailbox view. If started as service, there is no
+    // need to create views.
     if (!service) {
         NmUiStartParam *startParam = new NmUiStartParam(NmUiViewMailboxList);
         enterNmUiView(startParam);
     }
-
-    // Start to filter main window events to get "end key" event in all possible situations. Using
-    // event() is not enough to catch the event as it is only called if the view widget has the
-    // focus. Note: if key capturing (xqkeycapture.h) is required it is probably best to implement
-    // an own QMainWindow class and do the capturing there, not in the views.
-    mMainWindow->installEventFilter(this);
+    // ----------------------------------------------------------------------
+    
+    if (mMainWindow) {
+        // Start to filter main window events to get "end key" event in all
+        // possible situations. Using event()is not enough to catch the event
+        // as it is only called if the view widget has the focus. Note: if
+        // key capturing (xqkeycapture.h) is required it is probably best to
+        // implement an own QMainWindow class and do the capturing there, not
+        // in the views.
+        mMainWindow->installEventFilter(this);
+        // Optimize the custom paint functions.
+        // Currently effects to NmViewerHeader::paint() and
+        // NmAttachmentListWidget::paint().
+        mMainWindow->setOptimizationFlag(QGraphicsView::DontSavePainterState);    
+    }
 }
 
 /*!
-    Slot. React to view ready signal and call
-    current view method.
+    Slot. React to view ready signal and call current view method.
 */
 void NmApplication::viewReady()
 {
-    NM_FUNCTION;
-
     mViewReady = true;
-    if (!mViewStack->isEmpty()) {
+    if (mViewStack && !mViewStack->isEmpty()) {
     	NmBaseView *currentView = mViewStack->top();
-        if (currentView){
+        if (currentView) {
             currentView->viewReady();
         }
     }
 }
 
 /*!
-    Event filter. End key is filtered from the main window and either the view takes case of the
-	or the app is exited by default.
+    Event filter. End key is filtered from the main window and either the
+    view takes case of the or the app is exited by default.
 */
 bool NmApplication::eventFilter(QObject *obj, QEvent *event)
 {
-    NM_FUNCTION;
-
-    bool consumed = false;
-
+    bool consumed(false);
+    
     if (obj && obj == mMainWindow && event && event->type() == QEvent::KeyPress) {
         QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
-
-        if (keyEvent->key() == Qt::Key_No) { // end key, the "red" key
-
-            // exit application if no pending operations are on-going
+        if (keyEvent->key() == Qt::Key_No) {
+            // End key, the "red" key.
+            // Exit application if no pending operations are on-going.
         }
     }
-
+    
     if (!consumed) {
         consumed = QObject::eventFilter(obj, event);
     }
-
+    
     return consumed;
 }
 
 /*!
-    Push view to view stack
+    Push view to view stack.
 */
 void NmApplication::pushView(NmBaseView *newView)
 {
-    NM_FUNCTION;
-
-    if (newView) {
-        NM_COMMENT("nmailui: view exists");
+    if (newView && mViewStack) {
+        NM_COMMENT("NmApplication::pushView() : view exists.");
         newView->setNavigationAction(mBackAction);
-
-        // Store view to be hidden
+        
+        // Store view to be hidden.
         NmBaseView *hideView(NULL);
         if (!mViewStack->isEmpty()) {
             hideView = mViewStack->top();
         }
 		else {
-			// viewReady should be informed immediatelly
+			// viewReady should be informed immediately.
 			if (mViewReady) {
 				newView->viewReady();
 			}
 		}
-
-        // activate new view
-    	NM_COMMENT("nmailui: addView");
+        
+        // Activate new view.
+    	NM_COMMENT("NmApplication::pushView() : add view.");
         mMainWindow->addView(newView);
         mViewStack->push(newView);
         mMainWindow->setCurrentView(newView);
         mActiveViewId=newView->nmailViewId();
-
-        // Set toolbars orientation
+        
+        // Set toolbars orientation.
         HbToolBar *tb = newView->toolBar();
-        if(tb){
+        if (tb) {
             tb->setOrientation(Qt::Horizontal);
         }
-
-        // hide old view
-        NM_COMMENT("nmailui: removeView");
-        if (hideView){
+        
+        // Hide old view.
+        NM_COMMENT("NmApplication::pushView() : remove view.");
+        if (hideView) {
             mMainWindow->removeView(hideView);
         }
-
-        NM_COMMENT("nmailui: pushView done");
     }
 }
 
 /*!
-    Ask from view that is it ok to pop view. This kind of 2-phase popView is needed
-    because view may show query dialog for user response.
+    Ask from view that is it ok to pop view. This kind of 2-phase popView is
+    needed because view may show query dialog for user response.
  */
 void NmApplication::prepareForPopView()
 {
-    if (mViewStack->size() > 0) {
-        // Get view pointer
+    if (mViewStack && mViewStack->size() > 0) {
+        // Get view pointer.
         NmBaseView *view = mViewStack->top();
-
-        // View will call/signal popView if exitting is ok.
-        view->okToExitView();
+        if (view){
+			NmUiViewId topViewId = view->nmailViewId();
+			
+			// We must know in popView, are we coming with back button from
+			// message view to prevent the send animation.
+			if (topViewId == NmUiViewMessageEditor) {
+				mBackButtonPressed = true;
+			}
+            
+            // View will call/signal popView if exitting is ok.
+            view->okToExitView();        
+        }
     }
-    // If the view stack is now empty quit the app
-    // This happens also when the app has been started as a service
-    else if (mViewStack->size() == 0) {
+    // If the view stack is now empty quit the app. This happens also when
+    // the app has been started as a service
+    else if (mViewStack && mViewStack->size() == 0) {
         exitApplication();
     }
 }
@@ -311,71 +324,72 @@
 */
 void NmApplication::popView()
 {
-    NM_FUNCTION;
-
-    if (mViewStack->size() > 0) {
-        // Get view pointer
-        NmBaseView *view = mViewStack->top();
-
-        // ask view if it's ok to exit
-        NmUiViewId topViewId = view->nmailViewId();
-
-        // Prepare for send animation if returing from editor and message has been sent.
-        if (topViewId == NmUiViewMessageEditor && mUiEngine->isSendingMessage()) {
-            mEffects->prepareEffect(NmUiEffects::NmEditorSendMessageAnimation);
-        }
-        mViewStack->pop();
-        // Call custom exit function
-        view->aboutToExitView();
-        // Remove view from stack.
-        mMainWindow->removeView(view);
-
-        // if we were in editor and sent a message, pop viewer from stack first
-        // so we can go straight to mail list
-        if (!mViewStack->isEmpty() && topViewId == NmUiViewMessageEditor &&
-            mUiEngine->isSendingMessage() &&
-            mViewStack->top()->nmailViewId() == NmUiViewMessageViewer) {
-            NmBaseView *tmpView = mViewStack->pop();
-            mMainWindow->removeView(tmpView);
-            delete tmpView;
-            tmpView = NULL;
-        }
-
-        if (!mViewStack->isEmpty()) {
-            // Activate next view in stack
-            NmBaseView *showView = mViewStack->top();
-            mMainWindow->addView(showView);
-            mMainWindow->setCurrentView(showView);
-            // Store activated view id
-            mActiveViewId=showView->nmailViewId();
-            // Perform send animation if requested.
-            mEffects->startEffect(NmUiEffects::NmEditorSendMessageAnimation);
-        }
-
-        delete view;
-        view = NULL;
-
-#ifndef NM_WINS_ENV
-        // If view was started as service, move the app now
-        // to the background, unless it was started when the app
-        // was already in foreground..
-        if (mServiceViewId == topViewId) {
-            mServiceViewId = NmUiViewNone;
-            NM_COMMENT("Returned from service view");
-
-            // if started as embedded or while the app was in foreground,
-            // do not hide the app
-            if (!XQServiceUtil::isEmbedded() &&
-                !mForegroundService) {
-                XQServiceUtil::toBackground(true);
+    if (mViewStack && mViewStack->size() > 0) {
+        NmBaseView *view = mViewStack->top();    
+        if (view) {
+            // Get top view id.
+            NmUiViewId topViewId = view->nmailViewId();
+            
+            // Prepare for send animation if returing from editor and message
+            // has been sent.
+            if (topViewId == NmUiViewMessageEditor && mUiEngine->isSendingMessage()) {
+				// If we are coming from message editor with back button.
+				// do not prepare the send animation.
+				if (!mBackButtonPressed) {
+					mEffects->prepareEffect(NmUiEffects::NmEditorSendMessageAnimation);
+				}
+	        }
+            mBackButtonPressed = false;
+            mViewStack->pop();
+            // Call custom exit function.
+            view->aboutToExitView();
+            // Remove view from stack.
+            mMainWindow->removeView(view);
+            
+            // If we were in editor and sent a message, pop viewer from stack
+            // first so we can go straight to mail list.
+            if (!mViewStack->isEmpty() && topViewId == NmUiViewMessageEditor &&
+                mUiEngine->isSendingMessage() &&
+                mViewStack->top()->nmailViewId() == NmUiViewMessageViewer) {
+                NmBaseView *tmpView = mViewStack->pop();
+                mMainWindow->removeView(tmpView);
+                delete tmpView;
+                tmpView = NULL;
+            }
+            
+            if (!mViewStack->isEmpty()) {
+                // Activate next view in stack.
+                NmBaseView *showView = mViewStack->top();
+                mMainWindow->addView(showView);
+                mMainWindow->setCurrentView(showView);
+                // Store activated view id.
+                mActiveViewId=showView->nmailViewId();
+                // Perform send animation if requested.
+                mEffects->startEffect(NmUiEffects::NmEditorSendMessageAnimation);
+            }
+            
+            delete view;
+            view = NULL;
+            
+            // If view was started as service, move the app now to the
+            // background, unless it was started when the app was already in
+            // foreground.
+            if (mServiceViewId == topViewId) {
+                mServiceViewId = NmUiViewNone;
+                NM_COMMENT("NmApplication::popView() : returned from service view.");
+                // If started as embedded or while the app was in foreground,
+                // do not hide the app.
+                if (!XQServiceUtil::isEmbedded() &&
+                    !mForegroundService) {
+                    XQServiceUtil::toBackground(true);
+                }
             }
         }
-#endif
     }
-
-    // If the view stack is now empty quit the app
-    // This happens also when the app has been started as a service
-    if (mViewStack->size()==0) {
+    
+    // If the view stack is now empty quit the app. This happens also when
+    // the app has been started as a service.
+    if (mViewStack && mViewStack->size() == 0) {
         exitApplication();
     }
 }
@@ -385,48 +399,46 @@
 */
 void NmApplication::resetViewStack()
 {
-    NM_FUNCTION;
-
     if (mViewStack && !mViewStack->isEmpty()) {
 	    int viewCount = mViewStack->count();
         // Pop and destroy all views
-	    for (int i=0;i<viewCount;i++) {
+	    for (int i=0 ; i < viewCount ; i++) {
 		    NmBaseView *view = mViewStack->pop();
             mMainWindow->removeView(view);
             delete view;
         }
-	    mActiveViewId=NmUiViewNone;
+	    mActiveViewId = NmUiViewNone;
     }
 }
 
 /*!
-    Function activates view based on viewId parameter.
-    If requested view is already open, it is requested to reload.
-    Otherwise view object is created and pushed to view stack
+    Function activates view based on viewId parameter. If requested view is
+    already open, it is requested to reload. Otherwise view object is created
+    and pushed to view stack.
 */
-void NmApplication::enterNmUiView(NmUiStartParam* startParam)
+void NmApplication::enterNmUiView(NmUiStartParam *startParam)
 {
     NM_FUNCTION;
-
-    // Check the validity of start parameter object
+    
+    // Check the validity of start parameter object.
     if (startParam) {
-
+        
         if (startParam->service() && mMainWindow) {
-			// When the message list is started as a service previous views are removed
-			// from the stack. Open editors are not closed.
-			// Also if the view is same than the new one, keep it open (reload the content).
-
-
-		    // reset the foreground service flag while popping the views
+			// When the message list is started as a service previous views
+            // are removed from the stack. Open editors are not closed. Also
+            // if the view is same than the new one, keep it open (reload the
+            // content).
+            
+		    // Reset the foreground service flag while popping the views.
 		    bool previousForegroundService = mForegroundService;
 		    mForegroundService = true;
-
-		    // at least one view must remain in the stack
-			while (mViewStack->count()>1) {
+		    
+		    // At least one view must remain in the stack.
+			while (mViewStack->count( )> 1) {
 			    NmUiViewId topId = mViewStack->top()->nmailViewId();
-			    if (topId!=NmUiViewMessageEditor &&
-			        topId!=NmUiViewMailboxList &&
-			        topId!=startParam->viewId()) {
+			    if (topId != NmUiViewMessageEditor &&
+			        topId != NmUiViewMailboxList &&
+			        topId != startParam->viewId()) {
 			        prepareForPopView();
 			    }
 			    else {
@@ -436,11 +448,11 @@
 			}
 			mForegroundService = previousForegroundService;
         }
-
-        // Check whether requested view is already active
-        // and if so, ask it to reload contents with new start parameter data
-        // Do not reuse the view if started as service to editor view (ShareUI)
-        if (mActiveViewId==startParam->viewId() &&
+        
+        // Check whether requested view is already active and if so, ask it
+        // to reload contents with new start parameter data. Do not reuse the
+        // view if started as service to editor view (ShareUI).
+        if (mActiveViewId == startParam->viewId() &&
         	(!startParam->service() || mActiveViewId!=NmUiViewMessageEditor)) {
             mViewStack->top()->reloadViewContents(startParam);
         }
@@ -457,7 +469,7 @@
                 case NmUiViewMessageList:
                 {
                     // Check the topmost view. If it is an editor, do not open
-                    // a new mail list view
+                    // a new mail list view.
                     if (startParam->service() && !mViewStack->isEmpty() &&
                         mViewStack->top()->nmailViewId()==NmUiViewMessageEditor) {
                         break;
@@ -478,14 +490,14 @@
                         mViewStack->top()->nmailViewId() == NmUiViewMessageEditor) {
                         break;
                     }
-
+                    
                     NmMessageListModel &model =
                         mUiEngine->messageListModelForSearch(startParam->mailboxId());
-
+                    
                     NmMessageSearchListView *searchListView = new NmMessageSearchListView(
                         *this, startParam, *mUiEngine, model,
                         new HbDocumentLoader(mMainWindow));
-
+                    
                     pushView(searchListView);
                 }
                 break;
@@ -497,31 +509,29 @@
                     pushView(new NmEditorView(*this, startParam, *mUiEngine, *mAttaManager));
                     break;
                 default:
-                    // Reset view stack and exit application
+                    // Reset view stack and exit application.
                     delete startParam;
-                    startParam=NULL;
+                    startParam = NULL;
                     resetViewStack();
                     break;
             }
         }
-
+        
         if (startParam && startParam->service()) {
-            // Store the view id that was launched as service
+            // Store the view id that was launched as service.
             mServiceViewId = mActiveViewId;
 		}
     }
 }
 
 /*!
-    Function can be used from views to exit the application
-    View stack is cleared. Views can connect exit menu
-    selection to this slot.
+    Function can be used from views to exit the application. View stack is
+    cleared. Views can connect exit menu selection to this slot.
 */
 void NmApplication::exitApplication()
 {
     NM_FUNCTION;
-
-#ifndef NM_WINS_ENV
+    
     delete mSendServiceInterface;
     mSendServiceInterface = NULL;
     delete mSendServiceInterface2;
@@ -532,69 +542,57 @@
     mMailboxServiceInterface = NULL;
     delete mViewerServiceInterface;
     mViewerServiceInterface = NULL;
-#endif
     resetViewStack();
-    // Do housekeeping if needed.
     qApp->quit();
 }
 
 /*!
-   Exit the application in the next event loop
+   Exit the application in the next event loop.
 */
 void NmApplication::delayedExitApplication()
 {
-    NM_FUNCTION;
-
-    // Exit the application in the next event loop
-    QTimer::singleShot(0, this, SLOT(exitApplication()));
+    // Exit the application in the next event loop.
+    QMetaObject::invokeMethod(this, "exitApplication", Qt::QueuedConnection);
 }
 
 /*!
     Getter for main window instance.
 */
-HbMainWindow* NmApplication::mainWindow()
+HbMainWindow *NmApplication::mainWindow()
 {
-    NM_FUNCTION;
-
     return mMainWindow;
 }
 
 /*!
-    Getter for main UI extension manager
+    Getter for main UI extension manager.
 */
-NmUiExtensionManager& NmApplication::extManager()
+NmUiExtensionManager &NmApplication::extManager()
 {
-    NM_FUNCTION;
-
     return *mExtensionManager;
 }
 
 /*!
-    Getter for network access manager
+    Getter for network access manager.
 */
-NmViewerViewNetManager& NmApplication::networkAccessManager()
+NmViewerViewNetManager &NmApplication::networkAccessManager()
 {
-    NM_FUNCTION;
-
     return *mNetManager;
 }
 
 /*!
-    screen size. Function returns curtent screen size
+    Get the screen size. Function returns curtent screen size.
 */
 QSize NmApplication::screenSize()
 {
-    NM_FUNCTION;
-
     QSize ret(0,0);
     if (mMainWindow){
         HbDeviceProfile currentP = HbDeviceProfile::current();
         HbDeviceProfile altP(currentP.alternateProfileName());
         QSize curPSize = currentP.logicalSize();
         QSize altPSize = altP.logicalSize();
-        if (mMainWindow->orientation()==Qt::Horizontal){
-            // Get wide profile size in landscape
-            if (curPSize.width()>altPSize.width()){
+        if (mMainWindow->orientation() == Qt::Horizontal) {
+            // Get wide profile size in landscape.
+            if (curPSize.width() > altPSize.width()) {
                 ret = curPSize;
             }
             else{
@@ -602,8 +600,8 @@
             }
         }
         else {
-            // Get narrow profile size in portrait
-            if (curPSize.width()<altPSize.width()){
+            // Get narrow profile size in portrait.
+            if (curPSize.width() < altPSize.width()) {
                 ret = curPSize;
             }
             else{
@@ -615,72 +613,65 @@
 }
 
 /*!
-    handles all asynchronous operation's completions at UI level
+    Handles all asynchronous operation's completions at UI level.
 */
 void NmApplication::handleOperationCompleted(const NmOperationCompletionEvent &event)
 {
-    NM_FUNCTION;
-
-    if(event.mCompletionCode != NmNoError && event.mCompletionCode != NmCancelError) {
-        if(event.mOperationType == Synch && event.mCompletionCode == NmAuthenticationError) {
-            mLastOperationMailbox=event.mMailboxId;
-            if (mQueryDialog){
+    if (event.mCompletionCode != NmNoError && event.mCompletionCode != NmCancelError) {
+        if (event.mOperationType == Synch && event.mCompletionCode == NmAuthenticationError) {
+            mLastOperationMailbox = event.mMailboxId;
+            if (mQueryDialog) {
                 delete mQueryDialog;
-                mQueryDialog=NULL;
+                mQueryDialog = NULL;
             }
             mQueryDialog = NmUtilities::displayQuestionNote(hbTrId("txt_mail_dialog_address_or_password_incorrect"),
                                                     this, SLOT(launchSettings(HbAction*)));
         }
-        if(event.mOperationType == Synch && event.mCompletionCode == NmServerConnectionError) {
+        if (event.mOperationType == Synch && event.mCompletionCode == NmServerConnectionError) {
             mLastOperationMailbox=event.mMailboxId;
-            if (mQueryDialog){
+            if (mQueryDialog) {
                 delete mQueryDialog;
-                mQueryDialog=NULL;
+                mQueryDialog = NULL;
             }
             mQueryDialog = NmUtilities::displayQuestionNote(hbTrId("txt_mail_dialog_server_settings_incorrect"),
                                                     this, SLOT(launchSettings(HbAction*)));
         }
-        // following applies to all operation/event types
-        if(event.mCompletionCode == NmConnectionError) {
+        // Following applies to all operation/event types.
+        if (event.mCompletionCode == NmConnectionError) {
             NmUtilities::displayWarningNote(hbTrId("txt_mail_dialog_mail_connection_error"));
         }
     }
 }
 
 /*!
-    launches settings view of the specified mailbox
+    Launches settings view of the specified mailbox.
 */
 void NmApplication::launchSettings(HbAction* action)
 {
-    NM_FUNCTION;
-
-    // Check whether yes button was pressed
+    // Check whether yes button was pressed.
     if (mQueryDialog&& action == mQueryDialog->actions().at(0)) {
-        // create settingslauncher if doesn't exist
+        // Create settingslauncher if doesn't exist.
         if(!mSettingsViewLauncher) {
             mSettingsViewLauncher = new NmSettingsViewLauncher();
             }
-
-        if(mSettingsViewLauncher) {
-            // mailboxname required
-            NmMailboxMetaData *mailboxMetaData = mUiEngine->mailboxById(mLastOperationMailbox); // no ownership
-            if( mailboxMetaData ) {
-                // launch
-                mSettingsViewLauncher->launchSettingsView(mLastOperationMailbox, mailboxMetaData->name());
-            }
+        // Mailboxname required.
+        NmMailboxMetaData *mailboxMetaData = mUiEngine->mailboxById(mLastOperationMailbox); // No ownership.
+        if( mailboxMetaData ) {
+            // Launch.
+            mSettingsViewLauncher->launchSettingsView(mLastOperationMailbox, mailboxMetaData->name());
         }
     }
 }
 
 /*!
 	Stores the visibility state, e.g. when the service was launched.
-	\return true if the app was visible
+	\return true if the app was visible.
 */
 bool NmApplication::updateVisibilityState()
 {
-    // At the moment there is no good way to check the foreground state
+    // At the moment there is no good way to check the foreground state.
     QWindowSurface *surface = mMainWindow->windowSurface();
-	mForegroundService = (surface != NULL);
-	NM_COMMENT(QString("NmApplication::updateVisibilityState fg=%1").arg(mForegroundService));
+	mForegroundService = (surface != 0);
+	NM_COMMENT(QString("NmApplication::updateVisibilityState() : mForegroundService == %1").arg(mForegroundService));
 	return mForegroundService;
 }