homescreensrv_plat/sapi_menucontent/mcsservice/src/mcsrequestnotification.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:54:17 +0200
changeset 0 79c6a41cd166
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* Copyright (c) 2008 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:  
*
*/


#include "mcsdef.h"
#include "mcsmenu.h"
#include "mcsmenufilter.h"

#include "mcsrequestnotification.h"
#include "mcsservice.h"
#include "mcsconstants.h"


// ---------------------------------------------------------------------------
// two-phased constructor
// ---------------------------------------------------------------------------
CMCSReqNotification* CMCSReqNotification::NewL( RMenu& aMCS )
    {
    CMCSReqNotification* self = new (ELeave) CMCSReqNotification();
    CleanupStack::PushL( self );
    self->ConstructL(aMCS);
    CleanupStack::Pop( self );
    return self;
    }
    
// ---------------------------------------------------------------------------
// destructor
// ---------------------------------------------------------------------------
CMCSReqNotification::~CMCSReqNotification()
    {
    Cancel();

  //  delete iRunningApps;
    }

// ---------------------------------------------------------------------------
// default constructor
// ---------------------------------------------------------------------------
CMCSReqNotification::CMCSReqNotification() : CActive( EPriorityStandard )
    {
  
    }

// ---------------------------------------------------------------------------
// second phase constructor
// ---------------------------------------------------------------------------
void CMCSReqNotification::ConstructL( RMenu& aMCS)
    {
    TInt err = KErrNone;
    err = iNotifier.Open(aMCS);
    iMCS = aMCS;
    iIsNotification = EFalse;
    if(err != KErrNone)
        {
        User::Leave( err );
        }
    }

// ---------------------------------------------------------------------------
// Inherited from CActive class 
// ---------------------------------------------------------------------------
//
void CMCSReqNotification::DoCancel()
    {
    iNotifier.Close();
    }

// ---------------------------------------------------------------------------
// Inherited from CActive class 
// ---------------------------------------------------------------------------
//
void CMCSReqNotification::RunL()
    {
    TInt event = iStatus.Int();
    if( event != KErrCancel )
        {
        if(iIsNotification)
            {
            if(event)
                {
                iCallback->NotifyResultL( event, (TAny*) &iFolderId );
                iStatus = KRequestPending; 
                iNotifier.Notify(iFolderId, iEvents, iStatus );
                SetActive();
                }
            else
                { 
                if(event != KErrCancel)// error in notification
                    {
                    iCallback->NotifyResultL( event, (TAny*) &iFolderId );
                    }
                }
             }
        else
            {
            iIsNotification = ETrue;
            iStatus = KRequestPending; 
            iNotifier.Notify(iFolderId, iEvents, iStatus );
            SetActive();
            }    
        }
    }
    
// ---------------------------------------------------------------------------
// Activates the asynchronous request
// ---------------------------------------------------------------------------
//
void CMCSReqNotification::ActivateRequest( TInt aReason )
    {
    iStatus = KRequestPending; 
    SetActive();
    TRequestStatus* temp = &iStatus;
    User::RequestComplete( temp, aReason );
    }


// ---------------------------------------------------------------------------
// Start event's notifications 
// ---------------------------------------------------------------------------
//
void CMCSReqNotification::StartNotificationL(TInt aFolderId, 
        TInt aEvent, MMCSCallback* aCallback )
    {
    if(IsActive() )
      {
      User::Leave( KErrInUse );
      }
    iCallback = aCallback;
    iFolderId = aFolderId;
    iEvents = aEvent;
    CActiveScheduler::Add ( this );
    ActivateRequest( KErrNone );
    }

// ---------------------------------------------------------------------------
// Stop event's notifications 
// ---------------------------------------------------------------------------
//
void CMCSReqNotification::StopNotificationL()
    {
    if ( !IsActive() )
        {
        User::Leave(KErrNotFound);  
        }
    else
        {
        TRAP_IGNORE( iCallback->NotifyResultL( KErrCancel, NULL ));
        }
    }