omacpadapters/accesspointadapter/Src/CWPAPPhysicalProxy.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 06 Jul 2010 14:06:19 +0300
changeset 42 aa33c2cb9a50
child 56 a9afc3a8dbfa
permissions -rw-r--r--
Revision: 201025 Kit: 2010127

/*
* Copyright (c) 2002 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:    Defines a class, which holds physical proxy information.
*
*/





// INCLUDE FILES

#include "CWPAPPhysicalProxy.h"				// Own header
#include <CWPCharacteristic.h>
#include <CWPParameter.h>
#include <WPAdapterUtil.h>
#include <featmgr.h>
#include "CWPAPLogicalProxy.h"
#include "CWPAPPort.h"
#include "CWPAPNapdef.h"
#include "WPAPAdapter.pan"
#include "CWPLog.h"
#include "WPAPDefs.h"
#include <cmconnectionmethodext.h>

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

// -----------------------------------------------------------------------------
// CWPAPPhysicalProxy::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CWPAPPhysicalProxy* CWPAPPhysicalProxy::NewLC( 
                                            const TDesC& aDefaultName, 
                                            CWPCharacteristic& aCharacteristic, 
    CWPCharacteristic& aLogicalCharacteristic,
    CWPAPPort*& aPort )
	{
	CWPAPPhysicalProxy* self = new(ELeave) CWPAPPhysicalProxy( 
	                                                    aDefaultName, 
                                                        aLogicalCharacteristic,
                                                        aPort ); 
	CleanupStack::PushL( self );
	self->ConstructL();
    aCharacteristic.AcceptL( *self );
	return self;
	}
	
// -----------------------------------------------------------------------------
// Destructor
// -----------------------------------------------------------------------------
//
CWPAPPhysicalProxy::~CWPAPPhysicalProxy()
	{
	delete iPort;

    iNapdefs.ResetAndDestroy();
    iNapdefs.Close();
	}

// -----------------------------------------------------------------------------
// CWPAPPhysicalProxy::ValidateL
// -----------------------------------------------------------------------------
//
TBool CWPAPPhysicalProxy::ValidateL()
	{
	TBool isValid( EFalse );

	// We must have proxy address otherwise this proxy isn't valid.
	if ( iProxyAddr )
		{
		switch ( iPxAddrType )
			{
			case EPxAddrTypeIPv4:
				{
				isValid = WPAdapterUtil::CheckIPv4( iProxyAddr->Value() );
				break;
				}
            case EPxAddrTypeIPv6:
                {
                isValid = FeatureManager::FeatureSupported( KFeatureIdIPv6 )
                    && WPAdapterUtil::CheckIPv6( iProxyAddr->Value() );
                break;
                }
			case EPxAddrTypeUnsupported:
				{
				isValid = EFalse;
				break;
				}
			default: // default value is assumed to be EPxAddrTypeIPv4
				{
				isValid = WPAdapterUtil::CheckIPv4( iProxyAddr->Value() );
				}
			}
		}
	return isValid;
	}

// -----------------------------------------------------------------------------
// CWPAPPhysicalProxy::AddDataL
// -----------------------------------------------------------------------------
//
void CWPAPPhysicalProxy::AddDataL( RCmConnectionMethodExt& aCmItem )
	{  
	LOG("--CWPAP CWPAPPhysicalProxy::AddDataL begin--");	
	TInt err(KErrNone);
	
	// CMManager
	aCmItem.SetStringAttributeL( CMManager::ECmWapIPGatewayAddress, iProxyAddr->Value());
	LOG2("CWPAP EApWapStartPage, value: %S, err: %d",
	                                             &iProxyAddr->Value(), err);

	//CMManager
	aCmItem.SetStringAttributeL( CMManager::ECmIPGateway, iProxyAddr->Value());
	LOG2("CWPAP EApIspIPGateway, value: %S, err: %d",
	                                             &iProxyAddr->Value(), err);

	//CMManager 
	aCmItem.SetStringAttributeL( CMManager::ECmProxyServerName, iProxyAddr->Value() );
	LOG2("CWPAP EApProxyServerAddress, value: %S, err: %d",
	                                                &iProxyAddr->Value(), err);
	                                               

	// Store port data
	if ( iPort )
        {
        iPort->AddDataL( aCmItem );
        }
    
    if ( iLogicalPort)
        {
        iLogicalPort->AddDataL( aCmItem );
        }
    if ( err ) err = 0; // prevent compiler warning
    
	LOG("--CWPAP CWPAPPhysicalProxy::AddDataL end--");	
	}

// -----------------------------------------------------------------------------
// CWPAPPhysicalProxy::AddItemsL
// -----------------------------------------------------------------------------
//
TInt CWPAPPhysicalProxy::AddItemsL( RPointerArray<CWPAPAccesspointItem>& aItems,
                                    CWPAPItemBase* iLogicalProxy, 
                                    CWPAPItemBase* /*iPhysicalProxy*/ ) 
	{
    TInt count( 0 );
    for( TInt i( 0 ); i < iNapdefs.Count(); i++ )
        {
        CWPAPNapdef* pp = iNapdefs[ i ];
        if( pp->ValidateL() )
            {
            count += pp->AddItemsL( aItems, iLogicalProxy, this );
            }
        }

    return count;
    }

// -----------------------------------------------------------------------------
// CWPAPPhysicalProxy::Name
// -----------------------------------------------------------------------------
//
const TDesC& CWPAPPhysicalProxy::Name()
	{
    if( iName )
        {
        return iName->Value();
        }
    else 
        {
        return KNullDesC;
        }
	}

// -----------------------------------------------------------------------------
// CWPAPPhysicalProxy::VisitL
// -----------------------------------------------------------------------------
//
void CWPAPPhysicalProxy::VisitL( CWPCharacteristic& aCharacteristic )
	{
	TInt type = aCharacteristic.Type();
	
	// Accept only KWPPort characteristics
	// One valid port is enough for us
	if ( type == KWPPort && !iPort )
		{
        CWPAPPort* port = CWPAPPort::NewLC( aCharacteristic );

		if ( port->ValidateL() )
			{
			iPort = port;
			CleanupStack::Pop( port );
			}
		else // Data not valid.
			{
			CleanupStack::PopAndDestroy( port );
			}
		}
	}

// -----------------------------------------------------------------------------
// CWPAPPhysicalProxy::VisitL
// -----------------------------------------------------------------------------
//
void CWPAPPhysicalProxy::VisitL( CWPParameter& aParameter)
	{
	TInt id = aParameter.ID();
	const TDesC& value = aParameter.Value();

	if ( value.Length() == 0 )
		{
		// No use to store zero length value.
		return;
		}

	switch ( id )
		{
		case EWPParameterPxAddrFQDN: // iGatewayIPAddress
			{
			// Implementation comments:
			// The value of this field is a domain name but we can't 
			// at the moment resolve this to IP address 
			// (at least from this adapter).
			// Therefore this field can't be used. 
			// EWPParameterPxAddr is supported
			// and should be used.

			/// Validate the domain name
			/// Resolve to IP address

			/* // Uncomment if domain name can be validated and IP address resolved
			// Add only if we haven't already received this field
			if ( !IsReceived( EWPParameterPxAddrFQDN_id ))
				{
				iGatewayIPAddress = &aParameter;
				MarkReceived( EWPParameterPxAddrFQDN_id );
				}
			*/
			break;
			}
		case EWPParameterPxAddr: // iGatewayIPAddress
			{
			// Accept only first occurrence of either PxAddr or PxAddrFQDN
			if ( IsReceived( EWPParameterPxAddrFQDN_id ) ||
				IsReceived( EWPParameterPxAddr_id ) )
				{
				return;
				}
			else 
				{
				// The max allowed lenght for proxy address is 45 bytes. 
				// Nothing is stored if max lenght is exceeded
				if ( aParameter.Value().Length() < 46 )
					{
					iProxyAddr = &aParameter;
					MarkReceived( EWPParameterPxAddr_id );
					}
				}
			break;
			}
		case EWPParameterPxAddrType:
			{
			if ( !IsReceived( EWPParameterPxAddrType_id ) )
				{
				// Only IPv4 addresses are supported.
				if ( value == KIPV4 )
					{
					iPxAddrType = EPxAddrTypeIPv4;
					}
                else if( value == KIPV6 )
                    {
                    iPxAddrType = EPxAddrTypeIPv6;
                    }
				else
					{
					iPxAddrType = EPxAddrTypeUnsupported;
					}
				MarkReceived( EWPParameterPxAddrType_id );
				}
			break;
			}
        case EWPParameterName:
            {
            if( !iName )
                {
                iName = &aParameter;
                }
            break;
            }
		default:
			{
			// Just let through
			}
		}
	}

// -----------------------------------------------------------------------------
// CWPAPPhysicalProxy::VisitL
// -----------------------------------------------------------------------------
//
void CWPAPPhysicalProxy::VisitLinkL( CWPCharacteristic& aLink )
	{
    CWPAPNapdef* item = CWPAPNapdef::NewLC( ETrue,
                                            iDefaultName,
                                            iLogicalCharacteristic,
                                            aLink );
    User::LeaveIfError( iNapdefs.Append( item ) );
    CleanupStack::Pop( item ); // item
    }

// -----------------------------------------------------------------------------
// CWPAPPhysicalProxy::CWPAPPhysicalProxy
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CWPAPPhysicalProxy::CWPAPPhysicalProxy( 
                               const TDesC& aDefaultName, 
                               CWPCharacteristic& aLogicalCharacteristic,
                               CWPAPPort*& aPort ) 
	                         : CWPAPItemBase( aDefaultName ), 
                               iLogicalPort( aPort ),
                               iNapdefs( KInitialArraySize ),
                               iLogicalCharacteristic( aLogicalCharacteristic )
	{
	}

// -----------------------------------------------------------------------------
// CWPAPPhysicalProxy::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CWPAPPhysicalProxy::ConstructL()
	{
	}

// End of File