diff -r 000000000000 -r 72b543305e3a messagingappbase/ncnlist/src/NcnOutboxSender.cpp --- /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 + +#include // mtm uids +#include // Entry Uids +#include // 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