voipplugins/sipconnectionprovider/inc/scpsubservice.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 18 Jan 2010 20:12:36 +0200
changeset 0 a4daefaec16c
permissions -rw-r--r--
Revision: 201001 Kit: 201003

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


#ifndef T_SCPSUBSERVICE_H
#define T_SCPSUBSERVICE_H

#include <e32std.h>
#include <cchservice.h>

#include "scpdefs.h"
#include "scpsipconnectionobserver.h"

class MCchServiceObserver;
class MScpSubServiceObserver;
class CScpServiceHandlerBase;
class TScpSubServiceState;
class CScpServiceStorage;
class CScpProfileHandler;
class CScpService;

/**
 *  SCP sub service.
 *  @lib sipconnectionprovider.dll
 */
class CScpSubService : public CBase,
                       public MScpConnectionObserver
    {    
public:

    enum TEnableState
        {
        EScpNoRequest,
        EScpEnabled,
        EScpDisabled,
        EScpRefreshed
        };

    static CScpSubService* NewL( TInt aId, 
                                 TInt aSubServiceId,
                                 TCCHSubserviceType aSubServiceType,
                                 CScpService& aService );

        
    /**
     * Destructor
     */ 
    ~CScpSubService();

    /**
     * Enables this sub service
     */ 
    void EnableL();

    /**
     * Disables this sub service
     * @return Symbian error codes
     */ 
    TInt Disable();

    /**
     * Returns internal id of this subservice
     * @return Internal id
     */ 
    TInt Id() const;

    /**
     * Returns service id of this subservice
     * @return Sub service id
     */ 
    TInt SubServiceId() const;

    /**
     * Return state of the subservice
     * @return State
     */ 
    TCCHSubserviceState State() const;

    /**
     * Returns sub service type of the subservice
     * @return Sub service type
     */ 
    TCCHSubserviceType SubServiceType() const;

    /**
     * Returns service storage
     * @return Service storage
     */
    CScpServiceStorage& ServiceStorage() const;

    /**
     * Returns profile handler
     * @return Service storage
     */
    CScpProfileHandler& ProfileHandler() const;

    /**
     * Sets sip profile id for the subservice
     * @param aSipProfileId Sip profile id
     */ 
    void SetSipProfileId( TInt aSipProfileId );
    
    /**
     * Returns sip profile id of the subservice
     * @return sip profile id
     */ 
    TInt SipProfileId() const;

    /**
     * Sets enable requested state
     * @param aEnableRequestedState State
     */ 
    void SetEnableRequestedState( TEnableState aEnableRequestedState );  

    /**
     * Return info about if enable or disable is requested
     * @return Enable requested state
     */ 
    TEnableState EnableRequestedState() const;  

    /**
     * Raises the flag that sub service is succesfully disconnected
     * its service (e.g. unsubscribed message received from network).
     * When disconnected it's ok for this sub service to disable SIP 
     * profile
     * @param aSubServiceDisconnected Sub service disconnected
     */ 
    void SetSubServiceDisconnected( TBool aSubServiceDisconnected );

    /**
     * Return Sub service disconnceted flag
     * @return Sub service disconnected
     */ 
    TBool SubServiceDisconnected() const; 

    /**
     * Sets access point for the sub service
     * @param aApId Access point
     */ 
    void SetApId( TUint32 aApId );

    /**
     * Returns access point id of the subservice
     * @return Access point id
     */    
    TUint32 ApId() const;

    /**
     * Sets snap id or the subservice
     * @param aSnapId Snap id
     */ 
    void SetSnapId( TUint32 aSnapId );

    /**
     * Returns the iap type the subservice is using
     * @return Iap type
     */ 
    TScpIapType GetIapType() const;

    /**
     * Returns snap id id of the subservice
     * @return Snap id
     */ 
    TUint32 SnapId() const;

    /**
     * Returns service handler
     */
    CScpServiceHandlerBase& ServiceHandler() const;

    /**
     * Handle connection event. Based on event a corresponging 
     * method from current state is called.
     * @param aEvent Connection event
     */
    void HandleConnectionEvent( TScpConnectionEvent aEvent );

    /**
     * Returns last reported error from a state change
     * @return Last error
     */
    TInt LastReportedError() const;
    
    /**
     * Last reported error setter
     * @param aError error which to be set
     */
    void SetLastReportedError( const TInt aError );

    /**
     * Sets the sub service as reserved
     * @param aReserved Reserved
     */
    void SetReserved( TBool aReserved );

    /**
     * Returns reserved info of the sub service
     * @return ETrue if reserved
     */
    TBool IsReserved() const;
    
    /**
     * Returns roaming info of the sub service
     * @return ETrue if roaming
     */
    TBool IsRoaming() const;
    
    /**
     * Set subservice observer
     */
    void SetSubServiceObserver( MScpSubServiceObserver* aSubServiceObserver );
    
    /**
     * Enable counter getter.
     */
    TInt EnableCounter();
    
    /**
     * Reset enable counter.
     */
    void ResetEnableCounter();

private:

    /**
     * Constructor
     */ 
    CScpSubService( TInt aId, 
                    TInt aSubServiceId,
                    TCCHSubserviceType aType,
                    CScpService& aService );

    /**
     * 2nd phase constructor
     */
    void ConstructL();
   
    /**
     * TScpStates use this function to change the state
     * of the subservice.
     * @param aState New state
     * @param aError CCH errors
     */ 
    void ChangeState( TCCHSubserviceState aState, TInt aError );
    
    /**
     * Adds presencehandler to voip's subserviceobserver if 
     * presencesubservice exists.
     */
    void SetPresenceToObserveVoIP();

    /**
     * Enable occured.
     */
    void EnableOccured();

private:

    /**
     * Internal id.
     */       
    TInt iId;

    /**
     * Service id.
     */     
    TInt iSubServiceId;

    /**
     * Subservice type.
     */     
    TCCHSubserviceType iSubServiceType;

    /**
     * Service that contains this sub service
     */
    CScpService& iService;

    /**
     * Service handler. Owned.
     */ 
    CScpServiceHandlerBase* iServiceHandler;
    
    /**
     * Protocol profile id.
     */     
    TInt iSipProfileId;

    /**
     * Enable requested state
     */     
    TEnableState iEnableRequestedState;

    /**
     * Sub service disconnected
     */
    TBool iSubServiceDisconnected;
            
    /**
     * IAP id.
     */     
    TUint32 iApId;
    
    /**
     * Snap id.
     */     
    TUint32 iSnapId;

    /**
     * Last reported error
     */
    TInt iLastReportedError;

    /**
     * Reserved
     */
    TBool iReserved;
    
    /**
     * Indicates is roaming ongoing
     */
    TBool iRoaming;

    /**
     * Points to current sub service state.
     */
    TScpSubServiceState* iSubServiceState;
    
    /**
     * Sub service observer
     */
     MScpSubServiceObserver* iSubServiceObserver;
     
     /**
      * Counting enable requests, max count is sub service specific
      */
     TInt iEnableCounter;

private:

    // Needs access to call the private ChangeState
    friend class TScpSubServiceState;

#ifdef _DEBUG
    friend class T_CScpService;
    friend class T_CScpServiceStorage;
    friend class T_CScpServiceManager;
    friend class T_CScpVmbxHandler;
    friend class T_CScpVoipHandler;
    friend class T_CScpPresenceHandler;
    friend class T_CScpImHandler;
#endif
    };    

#endif // T_SCPDEFS_H