dbcreator/commsdatcreator/Src/cdcprocessorvpn.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 04 Oct 2010 00:43:42 +0300
changeset 66 ed07dcc72692
parent 0 5a93021fdf25
permissions -rw-r--r--
Revision: 201038 Kit: 201039

/*
* Copyright (c) 2005 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:   Implementation of the class CProcessorVpn
*
*/




// INCLUDE FILES

#include "cdcprocessorvpn.h"
#include "cdclogger.h"
#include "cdctagcontainer.h"

#include <cmpluginvpndef.h>
#include <cmpluginbaseeng.h>
#include <cmconnectionmethoddef.h>
#include <cmdestinationext.h>
#include <cmmanagerext.h>
#include <datamobilitycommsdattypes.h>

using namespace CMManager;

// CONSTANTS

const TUint32 KDefaultPortNum = 80;

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

// ---------------------------------------------------------
// CProcessorVpn::NewL
// ---------------------------------------------------------
//
CProcessorVpn* CProcessorVpn::NewL( CReaderBase* aFileReader,
                                    RCmManagerExt& aCmManager,
                                    RPointerArray< RCmConnectionMethodExt >& aPluginArray,
                                    RPointerArray< HBufC >& aPluginNames,
                                    RPointerArray< HBufC >& aUnderLying )
    {
    CProcessorVpn* self = new ( ELeave ) CProcessorVpn( aFileReader,
                                                        aCmManager,
                                                        aPluginArray,
                                                        aPluginNames,
                                                        aUnderLying );
    CleanupStack::PushL( self );

    // From base class
    self->ConstructL();
    CleanupStack::Pop( self ); // self
    return self;
    }
    
    
// ---------------------------------------------------------
// CProcessorVpn::~CProcessorVpn
// ---------------------------------------------------------
//
CProcessorVpn::~CProcessorVpn()
    {
    }
     
     
// ---------------------------------------------------------
// CProcessorVpn::ConstructL
// ---------------------------------------------------------
//
void CProcessorVpn::ConstructL()
    {
    }


// ---------------------------------------------------------
// CProcessorVpn::CProcessorVpn
// ---------------------------------------------------------
//
CProcessorVpn::CProcessorVpn( CReaderBase* aFileReader,
                              RCmManagerExt& aCmManager,
                              RPointerArray< RCmConnectionMethodExt >& aPluginArray,
                              RPointerArray< HBufC >& aPluginNames,
                              RPointerArray< HBufC >& aUnderLying  ) :
                              
                              CProcessorBase( aFileReader,
                                              aCmManager,
                                              aPluginArray,
                                              aPluginNames )
    {
    iUnderLying = &aUnderLying;
    iBearerType = KPluginVPNBearerTypeUid;
    }

// ---------------------------------------------------------
// CProcessorVpn::ProcessTagL
// ---------------------------------------------------------
//
void CProcessorVpn::ProcessUnderLyingL( RPointerArray< RCmDestinationExt >& aDestArray,
                                        RPointerArray< HBufC >& aDestNames )
    {
    iDestArray = &aDestArray;
    iDestName = &aDestNames;
    
    for( TInt i(0); i < iUnderLying->Count(); i++ )
        {
        // Finds the vpn IAP by its name
        RCmConnectionMethodExt* iPlugin = FindPluginL( (*iUnderLying)[i] );
        if( iPlugin != NULL )
            {
            CLOG_WRITE_FORMAT( "Underlying set for:%S", (*iUnderLying)[i] );  
            
            // Finds the underlying IAP by its name
            i++;
            RCmConnectionMethodExt* up = FindPluginL( (*iUnderLying)[i] );
            if( up != NULL )
                {
                iPlugin->SetIntAttributeL( ECmNextLayerIapId,
                            up->GetIntAttributeL( ECmIapId ) );
                iPlugin->UpdateL();                            

                CLOG_WRITE_FORMAT( "Underlying IAP Set:%S", (*iUnderLying)[i] );  
                }
            else
                {
                // Underlyinf can be destination. If not IAP finds destination.
                RCmDestinationExt* ud = FindDestinationL( (*iUnderLying)[i] );
                if( ud != NULL )
                    {
                    iPlugin->SetIntAttributeL( ECmNextLayerSNAPId, ud->Id() );
                    iPlugin->UpdateL();                            

                    CLOG_WRITE_FORMAT( "Underlying SNAP Set: %S", (*iUnderLying)[i] );  
                    }
                }    
            }
        }
    }


// ---------------------------------------------------------
// CProcessorVpn::ProcessTagL
// ---------------------------------------------------------
//
void CProcessorVpn::ProcessSpecialFieldsL( TInt aField, HBufC* aPtrTag, TInt /*aDx*/ )
    {
        CLOG_WRITE_FORMAT( "field: %d", aField );  
        switch ( aField )
            {
	        case ECmProxyProtocolName:
	        	{
	        	// Do not enable proxy in this case yet
	        	iPlugin.SetStringAttributeL( aField, *aPtrTag );
	        	break;
	        	}
            
            case ECmProxyServerName:
                {
                // First set proxy usage to enabled
                if( !iProxyEnabled )
                    {
                    iPlugin.SetBoolAttributeL( ECmProxyUsageEnabled, ETrue );
                    iProxyEnabled = ETrue;
                    }
                // Long text
                iPlugin.SetStringAttributeL( aField, *aPtrTag );
                break;
                }
            case ECmProxyPortNumber:
                {
                // First set proxy usage to enabled
                if( !iProxyEnabled )
                    {
                    iPlugin.SetBoolAttributeL( ECmProxyUsageEnabled, ETrue );
                    iProxyEnabled = ETrue;
                    }
                 // TUint32 and should be read as text.
                TPtrC16 portptr = aPtrTag->Right( aPtrTag->Length() );
                TLex16 lex( portptr );
                TUint32 portnum( 0 );
                if ( lex.Val( portnum, EDecimal ) == KErrNone )
                    {
                    iPlugin.SetIntAttributeL( aField, portnum );
                    }
                else 
                    {
                    //no valid data is given - default value is used
                    iPlugin.SetIntAttributeL( aField, KDefaultPortNum );
                    CLOG_WRITE( "! Error : Invalid port number. Default:80");  
                    }
                break;
                }
            case EVPN_IapName: // Underlying IAP/destination
                {
                if( !iName )
                    {
                    TInt len = aPtrTag->Length();
                
                    iName = HBufC::NewL( 8 + len );
                    TPtr name = iName->Des();
                    name.Append( _L( "VPN to " ) );
                    name.Append( *aPtrTag );
                    
                    SetGeneralFieldL( ECmName, iName );
                    
                    }
                    
                // Adds vpnIAP name - underlying IAP/Dest name pair to a list
                if( iName )
                    {
                    iUnderLying->AppendL( iName->AllocL() );
                    iUnderLying->AppendL( aPtrTag->AllocL() );
                    }
                break;
                }
            case EVpnServicePolicy:
            ////case ECmName:                //fall through
                {
                iPlugin.SetStringAttributeL( aField, *aPtrTag );
                if( !iName )
                    {
                    iName = aPtrTag->AllocLC();
                    }

                break;
                }
            default:
                {
                break;
                }
            }//switch
    }

// End of File.