convergedconnectionhandler/cchserver/src/cchwakeupeventnotifier.cpp
changeset 0 a4daefaec16c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/convergedconnectionhandler/cchserver/src/cchwakeupeventnotifier.cpp	Mon Jan 18 20:12:36 2010 +0200
@@ -0,0 +1,324 @@
+/*
+* Copyright (c) 2006-2007 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:  CCCHWakeUpEventNotifier implementation
+*
+*/
+
+
+// INCLUDE FILES
+#include <spnotifychange.h>
+#include <CoreApplicationUIsSDKCRKeys.h>
+
+#include "cchwakeupeventnotifier.h"
+#include "cchwakeupeventobserver.h"
+#include "cchlogger.h"
+#include "cchetelnetworkstatusnotifier.h"
+
+// EXTERNAL DATA STRUCTURES
+// None
+
+// EXTERNAL FUNCTION PROTOTYPES
+// None
+
+// CONSTANTS
+const TInt KOfflineTimeout = 500000;
+
+// MACROS
+// None
+
+// LOCAL CONSTANTS AND MACROS
+// None
+
+// MODULE DATA STRUCTURES
+// None
+
+// LOCAL FUNCTION PROTOTYPES
+//None
+
+// FORWARD DECLARATIONS
+// None
+
+// ============================= LOCAL FUNCTIONS =============================
+
+
+// ============================ MEMBER FUNCTIONS =============================
+
+// ---------------------------------------------------------------------------
+// CCCHWakeUpEventNotifier::CCCHWakeUpEventNotifier
+// C++ default constructor can NOT contain any code, that might leave.
+// ---------------------------------------------------------------------------
+//
+CCchWakeUpEventNotifier::CCchWakeUpEventNotifier( 
+    MCchWakeUpEventObserver& aWakeUpEventObserver ) :
+    CActive( CActive::EPriorityStandard ),
+    iWakeUpEventObserver( aWakeUpEventObserver )
+    {
+    CCHLOGSTRING( "CCchWakeUpEventNotifier::CCchWakeUpEventNotifier" );
+    CActiveScheduler::Add( this );
+    }
+
+// ---------------------------------------------------------------------------
+// CCchWakeUpEventNotifier::ConstructL
+// Symbian 2nd phase constructor can leave.
+// ---------------------------------------------------------------------------
+//
+void CCchWakeUpEventNotifier::ConstructL()
+    {
+    CCHLOGSTRING( "CCchWakeUpEventNotifier::ConstructL" );
+    
+    iSPSNotifier = CSPNotifyChange::NewL( *this );
+    iCchEtelNetworkNotifier = CCchEtelNetworkStatusNotifier::NewL( *this );
+    iOfflineRepository = CRepository::NewL( KCRUidCoreApplicationUIs );
+    iOfflineTimer = CPeriodic::NewL( CPeriodic::EPriorityStandard );
+    
+    StartL();
+    }
+
+// ---------------------------------------------------------------------------
+// CCchWakeUpEventNotifier::NewL
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CCchWakeUpEventNotifier* CCchWakeUpEventNotifier::NewL(
+    MCchWakeUpEventObserver& aWakeUpEventObserver )
+    {
+    CCchWakeUpEventNotifier* self = CCchWakeUpEventNotifier::NewLC(
+            aWakeUpEventObserver );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CCchWakeUpEventNotifier::NewLC
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CCchWakeUpEventNotifier* CCchWakeUpEventNotifier::NewLC(
+    MCchWakeUpEventObserver& aWakeUpEventObserver )
+    {
+    CCchWakeUpEventNotifier* self = new (ELeave)CCchWakeUpEventNotifier(
+            aWakeUpEventObserver );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+// Destructor
+CCchWakeUpEventNotifier::~CCchWakeUpEventNotifier()
+    {
+    Cancel();
+    delete iOfflineTimer;
+    delete iSPSNotifier;
+    delete iCchEtelNetworkNotifier;
+    delete iOfflineRepository;
+    }
+
+// ---------------------------------------------------------------------------
+// CCchWakeUpEventNotifier::MobileNetworkNoService
+// Handles mobile network events.
+// ---------------------------------------------------------------------------
+//
+void CCchWakeUpEventNotifier::MobileNetworkNoService()
+    {
+    CCHLOGSTRING( "CCchWakeUpEventNotifier::MobileNetworkNoService IN" );
+    
+    if ( iObservationOngoing )
+        {
+        iWakeUpEventObserver.WakeUp();
+        }
+    
+    CCHLOGSTRING( "CCchWakeUpEventNotifier::MobileNetworkNoService OUT" );
+    }
+
+// ---------------------------------------------------------------------------
+// CCchWakeUpEventNotifier::HandleNotifyChange
+// Handles change events generated by spsettings.
+// ---------------------------------------------------------------------------
+//
+void CCchWakeUpEventNotifier::HandleNotifyChange( TServiceId /* aServiceId */ )
+    {
+    CCHLOGSTRING( "CCchWakeUpEventNotifier::HandleNotifyChange IN" );
+    
+    if ( iObservationOngoing )
+        {
+        iWakeUpEventObserver.WakeUp();
+        }
+
+    CCHLOGSTRING( "CCchWakeUpEventNotifier::HandleNotifyChange OUT" );
+    }
+
+// ---------------------------------------------------------------------------
+// CCchWakeUpEventNotifier::HandleError
+// Handles errors generated by spsettings.
+// ---------------------------------------------------------------------------
+//
+void CCchWakeUpEventNotifier::HandleError( TInt /*aError*/ )
+    {
+    CCHLOGSTRING( "CCchWakeUpEventNotifier::HandleError IN OUT" );
+    }
+
+// ----------------------------------------------------------------------------
+// CCchWakeUpEventNotifier::Cancel()
+//
+// ----------------------------------------------------------------------------
+//
+void CCchWakeUpEventNotifier::DoCancel()
+    {
+    CCHLOGSTRING("CCchWakeUpEventNotifier::DoCancel()"); 
+    iOfflineRepository->NotifyCancel( KCoreAppUIsNetworkConnectionAllowed );
+    iSPSNotifier->NotifyChangeCancel();
+    CancelOfflineTimer();
+    }
+
+// ----------------------------------------------------------------------------
+// CCchWakeUpEventNotifier::RunL()
+//
+// ----------------------------------------------------------------------------
+//
+void CCchWakeUpEventNotifier::RunL()
+    {
+    CCHLOGSTRING("CCchWakeUpEventNotifier::RunL() IN");
+    
+    iOfflineRepository->Get( 
+            KCoreAppUIsNetworkConnectionAllowed, iNetworkConnectionAllowed );
+    if ( ECoreAppUIsNetworkConnectionNotAllowed == iNetworkConnectionAllowed )
+        {
+        // Start 0.5s timer, after timeout if cellular network is still down 
+        // send wakeup event to our client. Why timer -> we can avoid situtation 
+        // where cellular network is down for very short period.
+        if ( !iOfflineTimer->IsActive() )
+            {
+            CCHLOGSTRING("CCchWakeUpEventNotifier::RunL -> Start timer");
+            StartOfflineTimer( CCchWakeUpEventNotifier::OfflineTimeout );
+            }
+        }
+    
+    StartL();
+    
+    CCHLOGSTRING("CCchWakeUpEventNotifier::RunL() OUT"); 
+    }
+
+// ----------------------------------------------------------------------------
+// CCchWakeUpEventNotifier::RunError()
+//
+// ----------------------------------------------------------------------------
+//
+TInt CCchWakeUpEventNotifier::RunError( TInt /*aError*/ )
+    {
+    CCHLOGSTRING("CCchWakeUpEventNotifier::RunError IN OUT"); 
+    return KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// CCchWakeUpEventNotifier::StartL()
+//
+// ----------------------------------------------------------------------------
+//
+void CCchWakeUpEventNotifier::StartL()
+    {
+    CCHLOGSTRING("CCchWakeUpEventNotifier::StartL IN");
+
+    iObservationOngoing = ETrue;
+    if ( !IsActive() )
+        {  
+        RIdArray serviceIds;
+        iSPSNotifier->NotifyChangeL( serviceIds );
+        
+        iOfflineRepository->NotifyRequest( 
+                KCoreAppUIsNetworkConnectionAllowed, iStatus );
+        SetActive();
+        }
+    
+    CCHLOGSTRING("CCchWakeUpEventNotifier::StartL OUT");
+    }
+
+// ----------------------------------------------------------------------------
+// CCchWakeUpEventNotifier::StopL()
+//
+// ----------------------------------------------------------------------------
+//
+void CCchWakeUpEventNotifier::Stop()
+    {
+    CCHLOGSTRING("CCchWakeUpEventNotifier::Stop IN");
+    iObservationOngoing = EFalse;
+    Cancel();
+    CCHLOGSTRING("CCchWakeUpEventNotifier::Stop OUT");
+    }
+
+// -----------------------------------------------------------------------------
+// CCchWakeUpEventNotifier::StartOfflineTimer
+//
+// -----------------------------------------------------------------------------
+//
+void CCchWakeUpEventNotifier::StartOfflineTimer( TInt (*aFunction)(TAny* aPtr) )
+    {
+    if( !iOfflineTimer->IsActive() )
+        {
+        iOfflineTimer->Start( 
+            KOfflineTimeout , 0, TCallBack( aFunction, this ) );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CCchWakeUpEventNotifier::CancelOfflineTimer
+//
+// -----------------------------------------------------------------------------
+//
+void CCchWakeUpEventNotifier::CancelOfflineTimer()
+    {
+    if( iOfflineTimer->IsActive() )
+        {
+        iOfflineTimer->Cancel();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CCchWakeUpEventNotifier::OfflineTimeout
+//
+// -----------------------------------------------------------------------------
+//
+TInt CCchWakeUpEventNotifier::OfflineTimeout( TAny* aSelf )
+    {
+    CCchWakeUpEventNotifier* self = 
+        static_cast<CCchWakeUpEventNotifier*>( aSelf );
+    self->HandleOfflineTimeout();
+    return 0;
+    }
+
+// -----------------------------------------------------------------------------
+// CCchWakeUpEventNotifier::HandleOfflineTimeout
+//
+// -----------------------------------------------------------------------------
+//
+void CCchWakeUpEventNotifier::HandleOfflineTimeout()
+    {
+    CCHLOGSTRING( "CCchWakeUpEventNotifier::HandleOfflineTimeout IN" );
+    
+    CancelOfflineTimer();
+    iOfflineRepository->Get( 
+        KCoreAppUIsNetworkConnectionAllowed, iNetworkConnectionAllowed );
+
+    if ( ECoreAppUIsNetworkConnectionNotAllowed == iNetworkConnectionAllowed )
+        {
+        // Mode is still offline, send notify to our client
+        iWakeUpEventObserver.WakeUp();
+        }
+        
+    CCHLOGSTRING( "CCchWakeUpEventNotifier::HandleOfflineTimeout OUT" );
+    }
+
+// ========================== OTHER EXPORTED FUNCTIONS =======================
+
+//  End of File
+