messagingappbase/ncnlist/src/NcnOutboxObserver.cpp
changeset 0 72b543305e3a
child 14 c6838af47512
--- /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    <e32def.h>
+#include    <msvids.h>              // Entry Ids
+#include	<e32property.h>
+#include	<PSVariables.h>
+
+#include    <NcnListInternalPSKeys.h>
+#include    <NcnListInternalCRKeys.h>
+#include    <NcnListSDKPSKeys.h>
+
+#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