// 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:
// Name        : sipapnmanager.cpp
// Part of     : SIP Profile Server
// implementation
// Version     : 1.0
//

#include <commsdattypesv1_1.h>
#include <commsdat.h>
#include <commdb.h>
#include <f32file.h>
#include "sipapnmanager.h"
#include "SipProfileLog.h"
#include "sipapnconfigurationhandler.h"

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

// ----------------------------------------------------------------------------
// CSIPApnManager::NewL
// ----------------------------------------------------------------------------
//
CSIPApnManager* CSIPApnManager::NewL( 
    MSIPApnChangeObserver& aObserver )
    {
    CSIPApnManager* self = new (ELeave) CSIPApnManager( aObserver );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    return self;
    }

// ----------------------------------------------------------------------------
// CSIPApnManager::~CSIPApnManager
// ----------------------------------------------------------------------------
//
CSIPApnManager::~CSIPApnManager()
    {
    iHandlers.ResetAndDestroy();
    }

// ----------------------------------------------------------------------------
// CSIPApnManager::UpdateApnL
// ----------------------------------------------------------------------------
//	
void CSIPApnManager::UpdateApnL( TUint32 aIapId, TBool aIsPrimaryApn, const TDesC8& aApn )
	{
    CSIPApnConfigurationHandler* handler = FindIapIdHandler( aIapId );
    if (!handler)
        {
        CreateHandlerL(aIapId);
        handler = FindIapIdHandler(aIapId);
        }
    
        PROFILE_DEBUG1("CSIPApnManager::UpdateApnL(), handler exists")
        handler->UpdateApnL( aIsPrimaryApn, aApn);
	}

// ----------------------------------------------------------------------------
// CSIPApnManager::IsFailed
// ----------------------------------------------------------------------------
//    
TBool CSIPApnManager::IsFailed( TUint32 aIapId )
    {
    CSIPApnConfigurationHandler* handler = FindIapIdHandler( aIapId );
    return (handler && handler->IsFailed());
    }

// ----------------------------------------------------------------------------
// CSIPApnManager::SetFailed
// Setting back to "not-failed" state is allowed only if fatal failure has not
// occured.
// ----------------------------------------------------------------------------
// 
void CSIPApnManager::SetFailed( TUint32 aIapId ,TBool aIsFailed, TBool aIsFatalFailure )
    {
    CSIPApnConfigurationHandler* handler = FindIapIdHandler( aIapId );
    if(handler)
        {
        handler->SetFailed( aIsFailed, aIsFatalFailure );
        }
    }

// ----------------------------------------------------------------------------
// CSIPApnManager::IsPrimaryApnInUse
// ----------------------------------------------------------------------------
//
TBool CSIPApnManager::IsPrimaryApnInUse( TUint32 aIapId )
    {
    CSIPApnConfigurationHandler* handler = FindIapIdHandler( aIapId );
    return ( handler && handler->IsPrimaryApnUsed() );
    }

// ----------------------------------------------------------------------------
// CSIPApnManager::WriteApnL
// ----------------------------------------------------------------------------
//
void CSIPApnManager::WriteApnL( TUint32 aIapId, TBool aIsPrimaryApn, const TDesC8* aApn )
	{
	PROFILE_DEBUG3( "CSIPApnManager::WriteApnL isPrimary", aIsPrimaryApn )
	TBool useSecureAuth = aIsPrimaryApn ? EFalse : ETrue;

	CSIPApnConfigurationHandler* handler = FindIapIdHandler( aIapId );
	    if (!handler)
	        {
	        CreateHandlerL(aIapId);
	        handler = FindIapIdHandler(aIapId);
	        }
	    
	    handler->SetApnL( *aApn, useSecureAuth, ETrue);
	}

// ----------------------------------------------------------------------------
// CSIPApnManager::HasPendingTasks
// ----------------------------------------------------------------------------
//
TBool CSIPApnManager::HasPendingTasks() const
    {    
    TInt count = iHandlers.Count();
    PROFILE_DEBUG3( 
            "CSIPApnManager::HasPendingTasks handler count", count )

    for ( TInt i = 0; i < count; ++i )
        {
        if ( iHandlers[ i ]->HasPendingTasks() )
            {
            PROFILE_DEBUG1( 
                    "CSIPApnManager::HasPendingTasks return ETrue" )
            return ETrue;
            }
        }
    PROFILE_DEBUG1( 
            "CSIPApnManager::HasPendingTasks return EFalse" )
    return EFalse;
    }
// ----------------------------------------------------------------------------
// CSIPApnManager::CSIPApnManager
// ----------------------------------------------------------------------------
//
CSIPApnManager::CSIPApnManager( MSIPApnChangeObserver& aObserver ) :
    iObserver( aObserver )
    {
    }
    
// ----------------------------------------------------------------------------
// CSIPApnManager::ConstructL
// Read APNs from settings file but don't write to CommsDat yet. If IMS profile
// has APNs, use them instead. APN is written to CommsDat when the operation
// (register, deregister, update..) that caused IMS agent to be loaded, starts
// (CSIPIMSProfileAgent::SelectInitialApnL).
// ----------------------------------------------------------------------------
//    
void CSIPApnManager::ConstructL()
    {
    PROFILE_DEBUG1("CSIPApnManager::ConstructL()" )  
    }

// ----------------------------------------------------------------------------
// CSIPApnManager::FindIapIdHandler
// ----------------------------------------------------------------------------
//
CSIPApnConfigurationHandler* CSIPApnManager::FindIapIdHandler( TUint32 aIapId )
    {
    CSIPApnConfigurationHandler* handler = NULL;
    TBool found(EFalse);
    
    for(TInt i =0; i<iHandlers.Count() && !found ; i++)
        {
        if (iHandlers[i]->HandlerIapId()== aIapId)
            {
            PROFILE_DEBUG3("CSIPApnManager::FindIapIdHandler, found handler for aIapId", aIapId )
            found = ETrue;
            handler = iHandlers[ i ];
            }
        }
    
    return handler;
    }

// ----------------------------------------------------------------------------
// CSIPApnManager::CreateHandlerL
// ----------------------------------------------------------------------------
//
void CSIPApnManager::CreateHandlerL( TUint32 aIapId )
	{
    PROFILE_DEBUG1( 
            "CSIPApnManager::CreateHandlerL , enter" )
    PROFILE_DEBUG3( 
        "CSIPApnManager::CreateHandlerL for IapId", aIapId )

    CSIPApnConfigurationHandler* Handler = 
        CSIPApnConfigurationHandler::NewL( iObserver, aIapId);
    CleanupStack::PushL( Handler );
    iHandlers.AppendL( Handler );
    CleanupStack::Pop( Handler );
    PROFILE_DEBUG1( 
              "CSIPApnManager::CreateHandlerL, exit" )
	}

// ----------------------------------------------------------------------------
// CSIPApnManager::IsIapGPRSL
// ----------------------------------------------------------------------------
//
TBool CSIPApnManager::IsIapGPRSL( TUint32 aIapId )
    {
    TBool isIapGPRS(EFalse);          
    using namespace CommsDat;        
    CMDBSession* db = CMDBSession::NewL( KCDVersion1_1 );
    CleanupStack::PushL( db );
    // Set any attributes if any
    db->SetAttributeMask( ECDHidden );    
    // Create an iap record
    CCDIAPRecord* iapRecord = 
            static_cast<CCDIAPRecord*>(
                    CCDRecordBase::RecordFactoryL( KCDTIdIAPRecord ) );
    CleanupStack::PushL( iapRecord );        
    iapRecord->SetRecordId( aIapId );
    iapRecord->LoadL( *db );  
    TPtrC bearerType(iapRecord->iBearerType);
    if(bearerType.CompareF(TPtrC(KCDTypeNameModemBearer)) == 0)
        {
        isIapGPRS = ETrue;
        }
    
    db->ClearAttributeMask( ECDHidden );
    
    CleanupStack::PopAndDestroy( iapRecord );
    CleanupStack::PopAndDestroy( db );
    PROFILE_DEBUG3(
                    "CSIPApnConfigurationHandler::IsIapGPRSL(),isIapGPRS", isIapGPRS )
    return isIapGPRS;
    }
// End of File
