diff -r 000000000000 -r 72b543305e3a messagingappbase/ncnlist/src/NcnOutboxObserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingappbase/ncnlist/src/NcnOutboxObserver.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,265 @@ +/* +* 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 the class +* +*/ + + + +// INCLUDE FILES +#include +#include // Entry Ids +#include +#include + +#include +#include +#include + +#include "NcnDebug.h" +#include "NcnOutboxSender.h" +#include "NcnOutboxObserver.h" +#include "NcnModelBase.h" +#include "CNcnMsvSessionHandler.h" +#include "CNcnMobileSignalStrengthHandler.h" + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CNcnOutboxObserver::CNcnOutboxObserver +// --------------------------------------------------------- +// +CNcnOutboxObserver::CNcnOutboxObserver( CNcnModelBase* aModel ) : + iModel( aModel ) + { + } + +// --------------------------------------------------------- +// CNcnOutboxObserver::ConstructL +// --------------------------------------------------------- +// +void CNcnOutboxObserver::ConstructL() + { + NCN_RDEBUG( _L("CNcnOutboxObserver::ConstructL - Constructing signal strength handler") ); + + // instantiate the signal strength handler + iSignalStrengthHandler = CNcnMobileSignalStrengthHandler::NewL(); + + // Set observer and start observing, if supported + if( iSignalStrengthHandler->ObservingSupported() ) + { + iSignalStrengthHandler->SetSignalStrengthObserverL( this ); + iSignalStrengthHandler->StartObservingL(); + NCN_RDEBUG( _L("CNcnOutboxObserver::ConstructL - Signal strength observing started") ); + } + else + { + NCN_RDEBUG( _L("CNcnOutboxObserver::ConstructL - Signal strength observing not supported") ); + } + + // add observer to msv session handler + iModel->MsvSessionHandler().AddObserverL( this ); + } + + +// --------------------------------------------------------- +// CNcnOutboxObserver::NewL +// --------------------------------------------------------- +// +CNcnOutboxObserver* CNcnOutboxObserver::NewL( CNcnModelBase* aModel ) + { + // Create the instance of the outbox observer + CNcnOutboxObserver* self = new (ELeave) CNcnOutboxObserver( aModel ); + + // Push it to stack while executing the constructor + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + } + +// --------------------------------------------------------- +// CNcnOutboxObserver::~CNcnOutboxObserver +// --------------------------------------------------------- +// +CNcnOutboxObserver::~CNcnOutboxObserver() + { + if( iModel ) + { + // remove observer from msv session handler + iModel->MsvSessionHandler().RemoveObserver( this ); + } + + delete iSignalStrengthHandler; + + EndSessions(); + } + +// --------------------------------------------------------- +// CNcnOutboxObserver::CheckOutboxAndNotifyL +// --------------------------------------------------------- +// +void CNcnOutboxObserver::CheckOutboxAndNotifyL() + { + NCN_RDEBUG( _L("CNcnOutboxObserver::CheckOutboxAndNotifyL" ) ); + // Check messagecount in outbox + TInt msgCount = iOutboxFolder->Count(); + + // Set msg count to the CR key + NCN_RDEBUG_INT( _L("CNcnOutboxObserver::CheckOutboxAndNotifyL SetCRInt(KNcnMessageCountInOutbox) %d" ), msgCount ); + User::LeaveIfError( iModel->SetCRInt( + KCRUidNcnList, KNcnMessageCountInOutbox, msgCount ) ); + + if( msgCount ) + { + // Turn indicator on, if any messages in outbox + iModel->NotifyPublishAndSubscribe( + KUidSystemCategory, + KPSNcnOutboxStatus, + ENcnDocumentsInOutbox ); + } + else + { + // If no messages in outbox, remove indicator + iModel->NotifyPublishAndSubscribe( + KUidSystemCategory, + KPSNcnOutboxStatus, + ENcnOutboxEmpty ); + } + } + +// --------------------------------------------------------- +// CNcnOutboxObserver::SignalStrengthUpdatedL +// --------------------------------------------------------- +// +void CNcnOutboxObserver::SignalStrengthAndBarUpdatedL( TInt /*aNewSignalValue*/, TInt aNewBarValue ) + { + NCN_RDEBUG_INT( _L("CNcnOutboxObserver::SignalStrengthUpdatedL - Signal bars %d"), aNewBarValue ); + + // pass new bar value to outbox sender + InformOutboxSenderL( aNewBarValue ); + } + +// --------------------------------------------------------- +// CNcnOutboxObserver::InformOutboxSenderL +// --------------------------------------------------------- +// +void CNcnOutboxObserver::InformOutboxSenderL( const TInt& aNetworkBars ) + { + if( iOutboxSender ) + { + NCN_RDEBUG( _L("CNcnOutboxObserver::InformOutboxSenderL - Informing outbox sender.") ); + + iOutboxSender->CheckAndStartSendingL( aNetworkBars ); + } + else + { + NCN_RDEBUG( _L("CNcnOutboxObserver::InformOutboxSenderL - Outbox sender not initialized." ) ); + } + } + +// --------------------------------------------------------- +// CNcnOutboxObserver::StartSessionsL +// --------------------------------------------------------- +// +void CNcnOutboxObserver::StartSessionsL( CMsvSession& aMsvSession ) + { + // Set outbox folder + iOutboxFolder = aMsvSession.GetEntryL( KMsvGlobalOutBoxIndexEntryId ); + iOutboxFolder->AddObserverL( *this ); + + // Remove the Sender, if it exists + delete iOutboxSender; + iOutboxSender = NULL; + + // Check if feature is supported + if( iModel->IsSupported( KNcnOfflineSupport ) ) + { + NCN_RDEBUG( _L("CNcnOutboxObserver::StartSessionsL - Initializing outbox sender.." ) ); + iOutboxSender = CNcnOutboxSender::NewL( iModel, aMsvSession ); + + NCN_RDEBUG( _L("CNcnOutboxObserver::StartSessionsL - Informing outbox sender of network status.." ) ); + + // get current signal bar value + TInt signalBars = 0; + TRAPD( err, signalBars = iSignalStrengthHandler->BarValueL() ); + + // check error + if( err == KErrNone ) + { + NCN_RDEBUG_INT( _L( "CNcnOutboxObserver::StartSessionsL - Got signal bar value %d, notifying.."), signalBars ); + iOutboxSender->CheckAndStartSendingL( signalBars ); + } + else + { + NCN_RDEBUG_INT( _L("CNcnOutboxObserver::StartSessionsL - Failed to get signal bar value (err = %d)"), err ); + } + } + + // Check if there are messages in the OutBox. + CheckOutboxAndNotifyL(); + } + +// --------------------------------------------------------- +// CNcnOutboxObserver::EndSessions +// --------------------------------------------------------- +// +void CNcnOutboxObserver::EndSessions() + { + // Delete Outbox sender + delete iOutboxSender; + iOutboxSender = NULL; + + if( iOutboxFolder ) + { + // Delete outbox folder + iOutboxFolder->RemoveObserver( *this ); + delete iOutboxFolder; + iOutboxFolder = NULL; + } + } + +// --------------------------------------------------------- +// CNcnOutboxObserver::HandleMsvSessionReadyL +// --------------------------------------------------------- +// +void CNcnOutboxObserver::HandleMsvSessionReadyL( CMsvSession& aMsvSession ) + { + StartSessionsL( aMsvSession ); + } +// --------------------------------------------------------- +// CNcnOutboxObserver::HandleMsvSessionClosedL +// --------------------------------------------------------- +// +void CNcnOutboxObserver::HandleMsvSessionClosedL() + { + EndSessions(); + } + +// --------------------------------------------------------- +// CNcnOutboxObserver::HandleEntryEventL +// --------------------------------------------------------- +// +void CNcnOutboxObserver::HandleEntryEventL( + TMsvEntryEvent /*aEvent*/, + TAny* /*aArg1*/, + TAny* /*aArg2*/, + TAny* /*aArg3*/ ) + { + // Count objects in folders for every event + CheckOutboxAndNotifyL(); + } + +// End of File