eventsui/eventshandlerui/eventshandlerserver/src/evtsnoozehandler.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:31:27 +0100
branchRCL_3
changeset 18 870918037e16
parent 0 522cd55cc3d7
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2009 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:  Handler for Snoozing of Event
*
*/


// INCLUDE FILES
#include <centralrepository.h>

#include "evthandlerserverconsts.h"
#include "evtdebug.h"
#include "evtsnoozehandler.h"
#include "evtstoragedomaincrkeys.h"

// EXTERNAL DATA STRUCTURES

// EXTERNAL FUNCTION PROTOTYPES  

// CONSTANTS

// MACROS

// LOCAL CONSTANTS AND MACROS

// MODULE DATA STRUCTURES

// LOCAL FUNCTION PROTOTYPES

// FORWARD DECLARATIONS

// ============================= LOCAL FUNCTIONS ===============================

// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CEvtSnoozeHandler::NewL
// -----------------------------------------------------------------------------
CEvtSnoozeHandler* CEvtSnoozeHandler::NewL(
        	MEvtSnoozeObserver& aSnoozeObserver )
    {
    CEvtSnoozeHandler* self = new ( ELeave ) CEvtSnoozeHandler( aSnoozeObserver );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop();
    return self;
    }

// -----------------------------------------------------------------------------
// CEvtSnoozeHandler::CEvtSnoozeHandler
// -----------------------------------------------------------------------------
CEvtSnoozeHandler::CEvtSnoozeHandler( 
	MEvtSnoozeObserver& aSnoozeObserver )
    : CTimer( EPriorityStandard ), iSnoozeObserver( aSnoozeObserver ), 
		iSnoozeQueue( KEvtItemArrayGranularity ), 
		iSnoozeCompleteQueue( KEvtItemArrayGranularity )
    {
    }

// -----------------------------------------------------------------------------
// CEvtSnoozeHandler::~CEvtSnoozeHandler
// -----------------------------------------------------------------------------
CEvtSnoozeHandler::~CEvtSnoozeHandler()
    {
	if( iIntervalNotifyHandler )
		{
		iIntervalNotifyHandler->StopListening();
		}

	if( iPeriodNotifyHandler )
		{
		iPeriodNotifyHandler->StopListening();
		}

    delete iIntervalNotifyHandler;
	delete iPeriodNotifyHandler;
	delete iSettingSession;
	
	iSnoozeQueue.Reset();
    iSnoozeQueue.Close();
	iSnoozeCompleteQueue.Reset();
    iSnoozeCompleteQueue.Close();
    }

// -----------------------------------------------------------------------------
// CEvtSnoozeHandler::ConstructL
// -----------------------------------------------------------------------------
void CEvtSnoozeHandler::ConstructL()
    {
    EVTUIDEBUG("+ CEvtSnoozeHandler::ConstructL");    
    CTimer::ConstructL();
    CActiveScheduler::Add( this );
    
	// Create the Session to EventsUi Settings
	iSettingSession = CRepository::NewL( TUid::Uid( KCRUidEvtStorageDb ) );
	
	// Create the Cenrep Key observer for Interval and Period.
    iIntervalNotifyHandler = CCenRepNotifyHandler::NewL(*this,
                                                     *iSettingSession,
                                                     CCenRepNotifyHandler::EIntKey,
                                                     KEvtSnoozeInterval);

	iPeriodNotifyHandler = CCenRepNotifyHandler::NewL(*this,
                                                     *iSettingSession,
                                                     CCenRepNotifyHandler::EIntKey,
                                                     KEvtSnoozePeriod);

	// Get the Initial values from settings.
    TInt period;
	User::LeaveIfError( iSettingSession->Get( KEvtSnoozeInterval, iSnoozeInterval ) );
    User::LeaveIfError( iSettingSession->Get( KEvtSnoozePeriod, period ) );

	// Start Listening.
    iIntervalNotifyHandler->StartListeningL();
    iPeriodNotifyHandler->StartListeningL();
    
    iSnoozeCount = 1;
    if( period && iSnoozeInterval/period )
        iSnoozeCount = iSnoozeInterval/period;
        
    EVTUIDEBUG( "- CEvtSnoozeHandler::ConstructL" );
    }

// -----------------------------------------------------------------------------
// CEvtSnoozeHandler::RemoveIfPresent
// -----------------------------------------------------------------------------
void CEvtSnoozeHandler::RemoveIfPresent(const TEvtSnoozeItem& aSnoozeItem)
	{    
    EVTUIDEBUG( "+ CEvtSnoozeHandler::RemoveIfPresent" );	
    
    // Remove if already present
    TIdentityRelation<TEvtSnoozeItem> matcher(TEvtSnoozeItem::Match);
    TInt index = iSnoozeCompleteQueue.Find(aSnoozeItem,matcher);

    if( index != KErrNotFound )
        { 
        iSnoozeCompleteQueue.Remove( index );
        }
    else
        {
        index = iSnoozeQueue.Find(aSnoozeItem,matcher);
        if( index != KErrNotFound )
            { 
            iSnoozeQueue.Remove( index );
            
            // Cancel the timer if it is already snoozing for
            // requested event id
            if( index == 0 )
                {
                Cancel();
                
                // Start the Timer for next Item
                if( !IsActive() && iSnoozeQueue.Count() )
                    At( iSnoozeQueue[ 0 ].iTime );
                }
            }
        }
    
    EVTUIDEBUG( "- CEvtSnoozeHandler::RemoveIfPresent" );
	}

// -----------------------------------------------------------------------------
// CEvtSnoozeHandler::IsSnoozeQueEmpty
// -----------------------------------------------------------------------------
TBool CEvtSnoozeHandler::IsSnoozeQueEmpty()
	{    
    EVTUIDEBUG( "+ CEvtSnoozeHandler::IsSnoozeQueEmpty" );	
    
    if( IsActive() || iSnoozeCompleteQueue.Count() || iSnoozeCompleteQueue.Count() )
        { 
        return EFalse;
        }
    return ETrue;
	}

// -----------------------------------------------------------------------------
// CEvtSnoozeHandler::Snooze
// -----------------------------------------------------------------------------
void CEvtSnoozeHandler::Snooze(TEvtSnoozeItem aSnoozeItem)
	{    
    EVTUIDEBUG( "+ CEvtSnoozeHandler::Snooze" );	
    
    TTimeIntervalMinutes interval(iSnoozeInterval); 
    aSnoozeItem.iTime.HomeTime();
    
    // Add the Snooze Time
    aSnoozeItem.iTime = aSnoozeItem.iTime + interval;
     
    TIdentityRelation<TEvtSnoozeItem> matcher(TEvtSnoozeItem::Match);
    TInt index = iSnoozeCompleteQueue.Find(aSnoozeItem,matcher);

    if( index != KErrNotFound )
        { 
        // Increment Snooze count
        aSnoozeItem.iCount = iSnoozeCompleteQueue[index].iCount + 1;
        
        // Remove the already present item
        iSnoozeCompleteQueue.Remove( index );
        }
    else
        {
        index = iSnoozeQueue.Find(aSnoozeItem,matcher);
        if( index != KErrNotFound )
            { 
            // Cancel the timer if it is already snoozing for
            // requested event id
            if( index == 0 )
                {
                Cancel();
                }
            
            // Increment Snooze count
            aSnoozeItem.iCount = iSnoozeQueue[index].iCount + 1;
            
            // Remove the already present item
            iSnoozeQueue.Remove( index );
            }
        else
            {
            // First Snooze
            aSnoozeItem.iCount = 1;
            }
        }
    
    // Append this element to the queue
    iSnoozeQueue.Append( aSnoozeItem );
    
    // Start the Timer if it is not already started
    if(!IsActive())
        At( iSnoozeQueue[ 0 ].iTime );
    
    EVTUIDEBUG( "- CEvtSnoozeHandler::Snooze" );
	}

// -----------------------------------------------------------------------------
// CEvtSnoozeHandler::RunL
// -----------------------------------------------------------------------------
void CEvtSnoozeHandler::RunL()
    {
    EVTUIDEBUG1( "+ CEvtSnoozeHandler::RunL %d", iStatus.Int() );
    
    if( iSnoozeQueue.Count() > 1 )
        At( iSnoozeQueue[ 1 ].iTime );
        
    if( iSnoozeQueue[ 0 ].iCount < iSnoozeCount )
        {
        // Notify on Snooze complete
        iSnoozeObserver.SnoozeCompleteL( iSnoozeQueue[ 0 ], ETrue ); 
        
        // Move the snooze item to complete
        iSnoozeCompleteQueue.Append( iSnoozeQueue[ 0 ] );
        iSnoozeQueue.Remove(0);
        }
    else
        {
        // Notify on Snooze complete
        iSnoozeObserver.SnoozeCompleteL( iSnoozeQueue[ 0 ], EFalse); 
        
        // Remove Snoozed Item
        iSnoozeQueue.Remove(0);
        }
        
    EVTUIDEBUG( "- CEvtSnoozeHandler::RunL" );
    }

// -----------------------------------------------------------------------------
// CEvtSnoozeHandler::HandleNotifyInt()
// -----------------------------------------------------------------------------
//
void CEvtSnoozeHandler::HandleNotifyInt(TUint32 aId, TInt aNewValue)
    {

   	if ( aId == KEvtSnoozeInterval )
   		{
   		iSnoozeInterval = aNewValue;
   		}
   	else if ( aId == KEvtSnoozePeriod )
		{
        if( aNewValue && iSnoozeInterval/aNewValue )
            iSnoozeCount = iSnoozeInterval/aNewValue;
   		}
    }

//  End of File