messagingappbase/ncnlist/src/NcnOutboxSender.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/ncnlist/src/NcnOutboxSender.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,296 @@
+/*
+* Copyright (c) 2004 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:   Implements class
+*
+*/
+
+
+
+// INCLUDE FILES
+#include    "NcnCRHandler.h"
+#include    <CoreApplicationUIsSDKCRKeys.h>
+
+#include    <SenduiMtmUids.h>           // mtm uids
+#include    <msvuids.h>                 // Entry Uids
+#include    <mtmuibas.h>                // CBaseMtmUi
+#include    "NcnOutboxSendOperation.h"
+#include    "NcnOutboxSender.h"
+#include    "NcnModelBase.h"
+
+
+// CONSTANTS
+
+const TInt KNcnListBar0( 0 );
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ----------------------------------------------------
+//  CNcnOutboxSender::NewL
+// ----------------------------------------------------
+//
+CNcnOutboxSender* CNcnOutboxSender::NewL(
+    CNcnModelBase*  aModel,
+    CMsvSession&    aMsvSession )
+    {
+    // Create instance of the outboxsender object
+    CNcnOutboxSender* self =
+        new (ELeave) CNcnOutboxSender( aModel, aMsvSession );
+
+    // Push to cleanupstack for constructphase
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+
+    // Return the object
+    return self;
+    }
+
+// ----------------------------------------------------
+//  CNcnOutboxSender::CNcnOutboxSender
+// ----------------------------------------------------
+//
+CNcnOutboxSender::CNcnOutboxSender(
+    CNcnModelBase*  aModel,
+    CMsvSession&    aMsvSession )
+    :
+    iNcnModel( aModel ), iMsvSession( aMsvSession )
+    {
+    }
+
+// ----------------------------------------------------
+//  CNcnOutboxSender::~CNcnOutboxSender
+// ----------------------------------------------------
+//
+CNcnOutboxSender::~CNcnOutboxSender()
+    {
+    // Stop and delete the sending operation
+    delete iRunningOperation;
+
+    // Check if notification is set
+    if( iFlags & EUserSettingsNotifierSet )
+        {
+        // Remove the notification from list
+        if( iNotifyHandler )
+            {            
+            iNotifyHandler->StopListening();
+		    delete iNotifyHandler;
+            }
+		
+		delete iSession;
+        }
+
+    // Remove the address
+    iNcnModel = NULL;
+    }
+
+// ----------------------------------------------------
+//  CNcnOutboxSender::ConstructL
+// ----------------------------------------------------
+//
+void CNcnOutboxSender::ConstructL()
+    {
+	iNetworkBars = KNcnListBar0;
+
+	iSession = CRepository::NewL( KCRUidCoreApplicationUIs );
+	iNotifyHandler = CCenRepNotifyHandler::NewL( *this, *iSession, CCenRepNotifyHandler::EIntKey, KCoreAppUIsNetworkConnectionAllowed );
+	iNotifyHandler->StartListeningL();
+
+	// Turn flag on for possible error handling cases
+    iFlags |= EUserSettingsNotifierSet;
+
+	CheckBootPhaseL();
+    }
+
+// ----------------------------------------------------
+//  CNcnOutboxSender::StartSendingL
+// ----------------------------------------------------
+//
+void CNcnOutboxSender::StartSendingL()
+    {
+    // Check if the sending is already in progress
+    if( !IsSending() )
+        {
+        // Create instance of Single Operation Watcher
+        CMsvSingleOpWatcher* singleOpWatcher =
+            CMsvSingleOpWatcher::NewL(*this);
+
+        // Push to cleanup stack while creating sending operation
+        CleanupStack::PushL( singleOpWatcher );
+        CMsvOperation* op =
+            CNcnOutboxSendOperation::NewL(
+                iMsvSession, singleOpWatcher->iStatus );
+        CleanupStack::Pop( singleOpWatcher );
+
+        // Set operation
+        singleOpWatcher->SetOperation( op ); // takes immediately ownership
+        iRunningOperation = singleOpWatcher;
+        }
+    }
+
+
+// ----------------------------------------------------
+//  CNcnOutboxSender::CancelSending
+// ----------------------------------------------------
+//
+void CNcnOutboxSender::CancelSending()
+    {
+    // Remove the running operation
+    delete iRunningOperation;
+    iRunningOperation = NULL;
+    }
+
+// ----------------------------------------------------
+//  CNcnOutboxSender::IsSending
+// ----------------------------------------------------
+//
+TBool CNcnOutboxSender::IsSending() const
+    {
+    return ( iRunningOperation != NULL );
+    }
+
+// ----------------------------------------------------
+//  CNcnOutboxSender::OpCompleted
+// ----------------------------------------------------
+//
+void CNcnOutboxSender::OpCompleted(
+    CMsvSingleOpWatcher& /*aOpWatcher*/,
+    TInt /*aCompletionCode*/ )
+    {
+    // Clear flag
+    iFlags &= ~EOffllineSendingNeeded;
+
+    // Errors can be ignored since we try to send only once and
+    // if it fails then it is up to the user...
+    delete iRunningOperation;
+    iRunningOperation = NULL;
+    }
+
+// ----------------------------------------------------
+//  CNcnOutboxSender::HandleNotifyInt
+// ----------------------------------------------------
+//
+void CNcnOutboxSender::HandleNotifyInt(
+    const TUint32 aID,
+    const TInt    aNewValue )
+    {
+    NCN_RDEBUG(_L("CNcnOutboxSender::HandleNotifyInt"));
+	// Check if key is for offline-connecton
+	if( aID == KCoreAppUIsNetworkConnectionAllowed )
+        {
+        NCN_RDEBUG(_L("CNcnOutboxSender::HandleNotifyInt KCoreAppUIsNetworkConnectionAllowed"));
+        // Check if connection is established
+        if( aNewValue == ECoreAppUIsNetworkConnectionAllowed )
+            {
+			NCN_RDEBUG(_L("CNcnOutboxSender::HandleNotifyInt ECoreAppUIsNetworkConnectionAllowed 1"));
+            // Phone switched on again!
+            iFlags |= EOffllineSendingNeeded;
+            
+            NCN_RDEBUG_INT(_L("CNcnOutboxSender::HandleNotifyInt iNetworkBars = %d"), iNetworkBars );
+			if ( iNetworkBars > KNcnListBar0 )
+				{
+				NCN_RDEBUG_INT(_L("CNcnOutboxSender::HandleNotifyInt sending now, iNetworkBars = %d"), iNetworkBars );
+				TRAP_IGNORE( StartSendingL() );
+				}
+            }
+        else
+            {
+			NCN_RDEBUG(_L("CNcnOutboxSender::HandleNotifyInt ECoreAppUIsNetworkConnectionAllowed 0"));
+            // Clear flag
+            iFlags &= ~EOffllineSendingNeeded;
+
+            // Stop sending
+            CancelSending();
+
+			// Set the coverage to 0 in case it didn't come from network in time
+			iNetworkBars = KNcnListBar0;
+            }
+        }
+	}
+
+// ----------------------------------------------------
+//  CNcnOutboxSender::HandleNotifyGeneric
+// ----------------------------------------------------
+//
+void CNcnOutboxSender::HandleNotifyGeneric( const TUint32 /*aID*/ )
+    {
+	//NO OPERATION
+	}
+
+// ----------------------------------------------------
+//  CNcnOutboxSender::HandleNotifyError
+// ----------------------------------------------------
+//
+void CNcnOutboxSender::HandleNotifyError(
+    const TUint32 /*aID*/,
+    const TInt    /*aError*/,
+	CCenRepNotifyHandler* /*aHandler*/ )
+    {
+	//NO OPERATION
+	}
+
+// ----------------------------------------------------
+//  CNcnOutboxSender::CheckAndStartSendingL
+// ----------------------------------------------------
+//
+void CNcnOutboxSender::CheckAndStartSendingL( const TInt& aNetworkBars )
+    {
+	NCN_RDEBUG_INT(_L("CNcnOutboxSender::CheckAndStartSendingL aNetworkBars = %d"), aNetworkBars );
+	iNetworkBars = aNetworkBars;
+    // Check if sending is needed and network is available
+	if ( iFlags & EOffllineSendingNeeded &&
+        aNetworkBars > KNcnListBar0 )
+        {
+		NCN_RDEBUG_INT(_L("CNcnOutboxSender::CheckAndStartSendingL sending now, iNetworkBars = %d"), iNetworkBars );
+        // Start sending
+        StartSendingL();
+		}
+	else
+		{
+		NCN_RDEBUG_INT(_L("CNcnOutboxSender::CheckAndStartSendingL not sending, iNetworkBars = %d"), iNetworkBars );
+		}
+    }
+
+// ----------------------------------------------------
+//  CNcnOutboxSender::CheckBootPhaseL
+// ----------------------------------------------------
+//
+void CNcnOutboxSender::CheckBootPhaseL()
+	{
+    TInt connection;
+
+	TInt err = iSession->Get( KCoreAppUIsNetworkConnectionAllowed, connection );
+
+	if( err == KErrNone )
+        {
+        // Check if connection is established
+        if( connection )
+            {
+			NCN_RDEBUG(_L("CNcnOutboxSender::CheckBootPhaseL KGSNetworkConnectionAllowed 1"));
+            // Phone switched on again!            
+            iFlags |= EOffllineSendingNeeded; 
+			
+			if ( iNetworkBars > KNcnListBar0 )
+				{
+				NCN_RDEBUG_INT(_L("CNcnOutboxSender::CheckBootPhaseL sending now, iNetworkBars = %d"), iNetworkBars );
+				StartSendingL();
+				}
+			}
+		}
+	else
+		{
+		NCN_RDEBUG(_L("CNcnOutboxSender::CheckBootPhaseL Cannot access shared data"));
+		}
+	}
+
+// End of file