// Copyright (c) 2002-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        : sipmanagedprofile
// Part of     : SIP Profile Client
// implementation
// Version     : 1.0
// INCLUDE FILES
//



#include "sipmanagedprofile.h"
#include "sipconcreteprofile.h"
#include "sipprofileregistry.h"
#include "sipmanagedprofileregistry.h"

_LIT8(KSIPProfileExtenstionParameter, "%u");
const TUint KParameterbufLength = 25;

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

// -----------------------------------------------------------------------------
// CSIPManagedProfile::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CSIPManagedProfile* CSIPManagedProfile::NewL(CSIPManagedProfileRegistry* aSIPRegistry)
	{
    CSIPManagedProfile* self = CSIPManagedProfile::NewLC (aSIPRegistry);
    CleanupStack::Pop (self);
    return self;
	}

// -----------------------------------------------------------------------------
// CSIPManagedProfile::NewLC
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CSIPManagedProfile* CSIPManagedProfile::NewLC(CSIPManagedProfileRegistry* aSIPRegistry)
	{
	CSIPManagedProfile* self = new(ELeave)CSIPManagedProfile(aSIPRegistry);
    CleanupStack::PushL (self);
    self->ConstructL ();
    return self;
	}
				
// -----------------------------------------------------------------------------
// CSIPManagedProfile::~CSIPManagedProfile
// -----------------------------------------------------------------------------
//
EXPORT_C CSIPManagedProfile::~CSIPManagedProfile()
	{
	}

// -----------------------------------------------------------------------------
// CSIPManagedProfile::SetType
// -----------------------------------------------------------------------------
//	
EXPORT_C void CSIPManagedProfile::SetType(
	const TSIPProfileTypeInfo& aSIPProfileTypeInfo)
	{
	iSIPProfile->SetProfileType(aSIPProfileTypeInfo);
	}

// -----------------------------------------------------------------------------
// CSIPManagedProfile::SetParameter
// -----------------------------------------------------------------------------
//	
EXPORT_C TInt CSIPManagedProfile::SetParameter(TUint32 aParam, const TDesC8& aVal)
	{
	TRAPD(err, SetParameterL(aParam,aVal));
	return err;
	}

// -----------------------------------------------------------------------------
// CSIPManagedProfile::SetParameter
// -----------------------------------------------------------------------------
//	
EXPORT_C TInt CSIPManagedProfile::SetParameter(TUint32 aParam, TUint32 aVal)
	{
	TRAPD(err, SetParameterL(aParam,aVal));
	return err;
	}

// -----------------------------------------------------------------------------
// CSIPManagedProfile::SetParameter
// -----------------------------------------------------------------------------
//	
EXPORT_C TInt CSIPManagedProfile::SetParameter(TUint32 aParam, TBool aVal)
	{
	TRAPD(err, SetParameterL(aParam,aVal));
	return err;
	}

// -----------------------------------------------------------------------------
// CSIPManagedProfile::SetParameter
// -----------------------------------------------------------------------------
//	
EXPORT_C TInt CSIPManagedProfile::SetParameter(TUint32 aServerType,
	TUint32 aParam, const TDesC8& aVal)
	{
	TRAPD(err, SetParameterL(aServerType,aParam,aVal));
	return err;
	}

// -----------------------------------------------------------------------------
// CSIPManagedProfile::SetParameter
// -----------------------------------------------------------------------------
//	
EXPORT_C TInt CSIPManagedProfile::SetParameter(TUint32 aParam,
	const MDesC8Array& aVal)
	{
	TRAPD(err, SetParameterL(aParam,aVal));
	return err;
	}

// -----------------------------------------------------------------------------
// CSIPManagedProfile::CloneL
// -----------------------------------------------------------------------------
//	
EXPORT_C CSIPManagedProfile* CSIPManagedProfile::CloneL() const
	{
	__ASSERT_ALWAYS(iSIPProfileRegistry, User::Leave(KErrBadHandle));
	CSIPManagedProfile* newCopy = CSIPManagedProfile::NewLC(
		static_cast<CSIPManagedProfileRegistry*>(iSIPProfileRegistry));

	newCopy->SetConcreteProfile(iSIPProfile->CloneL());

	CleanupStack::Pop(newCopy);
	return newCopy;
	}

// -----------------------------------------------------------------------------
// CSIPManagedProfile::CSIPManagedProfile
// -----------------------------------------------------------------------------
//	
CSIPManagedProfile::CSIPManagedProfile(CSIPManagedProfileRegistry* aSIPRegistry):
	CSIPProfile(aSIPRegistry)
	{
	}

// -----------------------------------------------------------------------------
// CSIPManagedProfile::SetParameterL
// -----------------------------------------------------------------------------
//	
void CSIPManagedProfile::SetParameterL(TUint32 aParam, const TDesC8& aVal)
	{
	switch (aParam)
		{
		case KSIPProviderName:
			iSIPProfile->SetProviderNameL(aVal);
			break;
		case KSIPUserAor:
			iSIPProfile->SetAORL(aVal);
			break;
		case KSIPPrivateIdentity:
			iSIPProfile->SetPrivateIdentityL(aVal);
			break;
		case KSIPProfileId:
		case KSIPAccessPointId:
		case KSIPSigComp:
		case KSIPSecurityNegotiation:
		case KSIPAutoRegistration:
		case KSIPProfileRegistered:
		case KSIPRegisteredAors:
		case KSIPNegotiatedSecurityMechanism:
		case KSIPDefaultProfile:
		case KSIPContactHeaderParams:
		case KSIPRegistrar:
		case KSIPOutboundProxy:
		case KSIPDigestUserName:
		case KSIPDigestRealm:
		case KSIPServerAddress:
		case KSIPDigestPassword:
		case KSIPHeaders:
		case KSIPSoIpTOS:
			User::Leave(KErrNotFound);
		case KSIPContactHeaderUser:
		    User::Leave(KErrAccessDenied);
		default:
			iSIPProfile->SetExtensionParameterL(aParam, aVal);
		}
	}

// -----------------------------------------------------------------------------
// CSIPManagedProfile::SetParameterL
// -----------------------------------------------------------------------------
//	
void CSIPManagedProfile::SetParameterL(TUint32 aParam, TUint32 aVal)
	{
	switch (aParam)
		{
		case KSIPAccessPointId:
			iSIPProfile->SetIapId(aVal);
			break;		
		case KSIPProfileId:
		case KSIPProviderName:		
		case KSIPSigComp:
		case KSIPSecurityNegotiation:
		case KSIPAutoRegistration:
		case KSIPUserAor:
		case KSIPProfileRegistered:
		case KSIPRegisteredAors:
		case KSIPNegotiatedSecurityMechanism:
		case KSIPDefaultProfile:
		case KSIPContactHeaderParams:
		case KSIPRegistrar:
		case KSIPOutboundProxy:
		case KSIPDigestUserName:
		case KSIPDigestRealm:
		case KSIPServerAddress:
		case KSIPPrivateIdentity:
		case KSIPDigestPassword:
		case KSIPHeaders:
		case KSIPContactHeaderUser:
        case KPrimaryAPN:
        case KSecondaryAPN:
			User::Leave(KErrNotFound);
		case KSIPSnapId:
			__ASSERT_ALWAYS((aVal>0),User::Leave(KErrArgument));
		default:
			iSIPProfile->SetExtensionParameterL(aParam, aVal);
		}
	}

// -----------------------------------------------------------------------------
// CSIPManagedProfile::SetParameterL
// -----------------------------------------------------------------------------
//	
void CSIPManagedProfile::SetParameterL(TUint32 aParam, TBool aVal)
	{
	switch (aParam)
		{
		case KSIPDefaultProfile:
			__ASSERT_ALWAYS(aVal, User::Leave(KErrArgument));
			iSIPProfile->SetDefault(aVal);
			break;
		case KSIPSigComp:
			iSIPProfile->EnableSigComp(aVal);
			break;
		case KSIPAutoRegistration:
			iSIPProfile->SetAutoRegistrationEnabled(aVal);
			break;
		case KSIPSecurityNegotiation:
			iSIPProfile->EnableSecurityNegotiation(aVal);
			break;		
		case KSIPProfileId:
		case KSIPProviderName:
		case KSIPAccessPointId:		
		case KSIPUserAor:
		case KSIPProfileRegistered:
		case KSIPRegisteredAors:
		case KSIPNegotiatedSecurityMechanism:		
		case KSIPContactHeaderParams:
		case KSIPRegistrar:
		case KSIPOutboundProxy:
		case KSIPDigestUserName:
		case KSIPDigestRealm:
		case KSIPServerAddress:
		case KSIPPrivateIdentity:
		case KSIPDigestPassword:
		case KSIPHeaders:
		case KSIPContactHeaderUser:
		case KSIPSoIpTOS:
		case KSIPSnapId:
        case KPrimaryAPN:
        case KSecondaryAPN:
			User::Leave(KErrNotFound);			
		default:
			iSIPProfile->SetExtensionParameterL(aParam, aVal);
		}
	}

// -----------------------------------------------------------------------------
// CSIPManagedProfile::SetParameterL
// -----------------------------------------------------------------------------
//	
void CSIPManagedProfile::SetParameterL(TUint32 aServerType,
	TUint32 aParam, const TDesC8& aVal)
	{
	switch (aParam)
		{
		case KSIPDigestRealm:
		case KSIPDigestUserName:
		case KSIPDigestPassword:
			iSIPProfile->SetServerParameterL(aServerType, aParam, aVal);
			break;
		case KSIPServerAddress:
			iSIPProfile->SetServerL(aServerType, aVal);
			break;
		case KSIPProfileId:
		case KSIPProviderName:
		case KSIPAccessPointId:
		case KSIPSigComp:
		case KSIPSecurityNegotiation:
		case KSIPAutoRegistration:
		case KSIPUserAor:
		case KSIPProfileRegistered:
		case KSIPRegisteredAors:
		case KSIPNegotiatedSecurityMechanism:
		case KSIPDefaultProfile:
		case KSIPContactHeaderParams:
		case KSIPRegistrar:
		case KSIPOutboundProxy:
		case KSIPPrivateIdentity:
		case KSIPContactHeaderUser:
		case KSIPSoIpTOS:	
		case KSIPSnapId:
        case KPrimaryAPN:
        case KSecondaryAPN:
		User::Leave(KErrNotFound);
		default:
			TBuf8<KParameterbufLength> buf;
			buf.Format(KSIPProfileExtenstionParameter, aParam);
			iSIPProfile->SetServerExtensionParameterL(
				aServerType, buf, aVal);
		}
	}

// -----------------------------------------------------------------------------
// CSIPManagedProfile::SetParameterL
// -----------------------------------------------------------------------------
//	
void CSIPManagedProfile::SetParameterL(TUint32 aParam,
	const MDesC8Array& aVal)
	{
	switch (aParam)
		{
		case KSIPContactHeaderParams:
			iSIPProfile->SetContactHeaderParamsL(aVal);
			break;
		case KSIPHeaders:
			iSIPProfile->SetSIPHeadersL(aVal);
			break;		
		case KSIPProfileId:
		case KSIPProviderName:
		case KSIPAccessPointId:
		case KSIPSigComp:
		case KSIPSecurityNegotiation:
		case KSIPAutoRegistration:
		case KSIPUserAor:
		case KSIPProfileRegistered:
		case KSIPRegisteredAors:
		case KSIPNegotiatedSecurityMechanism:
		case KSIPDefaultProfile:		
		case KSIPRegistrar:
		case KSIPOutboundProxy:
		case KSIPDigestUserName:
		case KSIPDigestRealm:
		case KSIPServerAddress:
		case KSIPPrivateIdentity:
		case KSIPDigestPassword:
		case KSIPContactHeaderUser:
		case KSIPSoIpTOS: 	
		case KSIPSnapId:
        case KPrimaryAPN:
        case KSecondaryAPN:
		User::Leave(KErrNotFound);
		default:
			iSIPProfile->SetExtensionParameterL(aParam, aVal);
		}
	}
