diff -r 516a867811c3 -r d3981f4fe6a4 omadmadapters/connmoadapter/src/NapBranch.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadmadapters/connmoadapter/src/NapBranch.cpp Fri Jun 11 13:29:40 2010 +0300 @@ -0,0 +1,1350 @@ +/* + * ============================================================================== + * Copyright (c) 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: + * + * ============================================================================== + */ +#include +#include +#include +#include +#include +#include +#include "NapBranch.h" +#include "Utils.h" +#include "AddBuffer.h" +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "NapBranchTraces.h" +#endif +// ------------------------------------------------------------------------------------------------ +// Constants +// ------------------------------------------------------------------------------------------------ +// NAP Branch +_LIT8( KCMDdfID, "ID" ); +_LIT8( KCMDdfName, "Name" ); +_LIT8( KCMDdfAddrType, "AddrType" ); +_LIT8( KCMDdfAddr, "Addr" ); +_LIT8( KCMDdfIP, "IP" ); +_LIT8( KCMDdfAuthInfo, "AuthInfo" ); +_LIT8( KCMDdfAuthType, "AuthType" ); +_LIT8( KCMDdfBearerType, "BearerType" ); +_LIT8( KCMDdfBearerParams, "BearerParams" ); +_LIT8( KCMDdfIPv4, "IPv4" ); +_LIT8( KCMDdfAutoConfig, "AutoConfig" ); +_LIT8( KCMDdfIPAddr, "IPAddr" ); +_LIT8( KCMDdfNetMask, "NetMask" ); +_LIT8( KCMDdfGateway, "Gateway" ); +_LIT8( KCMDdfAutoDNS, "AutoDNS" ); +_LIT8( KCMDdfDNS, "DNS" ); +_LIT8( KCMDdfServers, "Servers" ); +_LIT8( KCMDdfServer, "Server" ); +_LIT8( KCMDdfAuthName, "AuthName" ); +_LIT8( KCMDdfAuthSecret, "AuthSecret" ); +// NAP Child URI List +_LIT8( KCMNapFields, "ID/Name/AddrType/Addr/IP/AuthInfo/BearerType" ); +_LIT8( KCMNIPFields, "IPv4" ); +_LIT8( KCMNIPv4Fields, "AutoConfig/IPAddr/NetMask/Gateway/AutoDNS/DNS" ); +_LIT8( KCMNDNSFields, "Servers" ); +_LIT8( KCMNAuthInfoFields, "AuthType/AuthName/AuthSecret" ); +_LIT8( KCMNDNSServersFields, "Addr"); +_LIT8( KSlash, "/" ); +_LIT8( KDynamicNapNode, "NAP/*" ); +_LIT8( KDynamicNapNodeChildUri, "NAP/*/*" ); +_LIT8( KDynamicIPNode, "NAP/*/IP" ); +_LIT8( KDynamicIPNodeChildUri, "NAP/*/IP/*" ); +_LIT8( KDynamicIPv4Node, "NAP/*/IP/IPv4" ); +_LIT8( KDynamicIPv4NodeChildUri, "NAP/*/IP/IPv4/*" ); +_LIT8( KDynamicIPv4DnsNode, "NAP/*/IP/IPv4/DNS" ); +_LIT8( KDynamicIPv4DnsNodeChildUri, "NAP/*/IP/IPv4/DNS/*" ); +_LIT8( KDynamicIPv4DnsServersNode, "NAP/*/IP/IPv4/DNS/Servers" ); +_LIT8( KDynamicIPv4DnsServersNodeChildUri, "NAP/*/IP/IPv4/DNS/Servers/*" ); +_LIT8( KDynamicIPv4DnsServersNodeChildUriNodes, "NAP/*/IP/IPv4/DNS/Servers/*/*"); +_LIT8( KDynamicAuthInfoNode, "NAP/*/AuthInfo"); +_LIT8( KDynamicAuthInfoNodeChildUri, "NAP/*/AuthInfo/*"); +_LIT8( KNapBearerTypeUri, "NAP/*/BearerType"); +_LIT8( KNapAddrUri, "NAP/*/Addr"); +_LIT8( KNapDNSAddr1Uri, "NAP/*/Server1/Addr"); +_LIT8( KNapDNSAddr2Uri, "NAP/*/Server2/Addr"); +_LIT8( KNapIPv4AddrUri, "NAP/*/IPv4/*Addr"); +_LIT8( KPacketDataBearerType, "3GPPPS"); +_LIT8( KGPRSAddrType, "APN"); +_LIT8( KGPRSAuthType, "PAP"); + + +TInt const KInvalidBearerType = 0; +TInt const KBufferExpandSize = 128; +TInt const KNumOfNAPNodes = 8; +TInt const KMaxResultSize = 64; +TInt const KMaxDnsAddr = 2; +_LIT8( KFalse, "False"); +_LIT8( KTrue, "True"); + +_LIT8( KDynamicNodePrefix, "NAPId" ); + +// ======== LOCAL FUNCTIONS ========= +//----------------------------------------------------------------------------- +// TUint32 CNapBranch::CheckForUnmodifiableFieldL() +//----------------------------------------------------------------------------- +CSmlDmAdapter::TError CNapBranch::GetUnmodifiableFieldValueL( + const TDesC8& aUri, CBufBase* aResult) + { + OstTraceExt1( TRACE_NORMAL, CNAPBRANCH_GETUNMODIFIABLEFIELDVALUEL_ENTRY, + "ENTRY: CNapBranch::GetUnmodifiableFieldValueL;aUri=%s", aUri ); + + CSmlDmAdapter::TError retval( CSmlDmAdapter::ENotFound ); + TPtrC8 nodeName = CUtils::GetLastURISeg( aUri ); + + if ( nodeName.Match( KCMDdfAddrType ) != KErrNotFound ) + { + aResult->InsertL( 0, KGPRSAddrType ); + retval = CSmlDmAdapter::EOk; + } + else if ( nodeName.Match( KCMDdfBearerType ) != KErrNotFound ) + { + aResult->InsertL( 0, KPacketDataBearerType ); + retval = CSmlDmAdapter::EOk; + } + else if ( nodeName.Match( KCMDdfAuthType ) != KErrNotFound ) + { + aResult->InsertL( 0, KGPRSAuthType ); + retval = CSmlDmAdapter::EOk; + } + else if ( nodeName.Match( KCMDdfID ) != KErrNotFound ) + { + TPtrC8 dynamicNode = GetDynamicNAPNodeUri( aUri ); + aResult->InsertL( 0, dynamicNode ); + retval = CSmlDmAdapter::EOk; + } + + OstTrace1( TRACE_NORMAL, CNAPBRANCH_GETUNMODIFIABLEFIELDVALUEL_EXIT, + "EXIT: CNapBranch::GetUnmodifiableFieldValueL;retval=%{TError}", retval ); + + return retval; + } +//----------------------------------------------------------------------------- +// CSmlDmAdapter::TErrorCNapBranch::GetLeafData() +//----------------------------------------------------------------------------- +CSmlDmAdapter::TError CNapBranch::GetLeafDataL(const TDesC8& aURI, + RCmConnectionMethodExt& aCm, CBufBase* aResult) + { + OstTraceExt1( TRACE_NORMAL, CNAPBRANCH_GETLEAFDATAL_ENTRY, + "ENTRY: CNapBranch::GetLeafDataL;aURI=%s", aURI ); + + TUint32 attributeRef( 0 ); + CSmlDmAdapter::TError status = CSmlDmAdapter::EOk; + HBufC16* resultTmp; + + attributeRef = MapUriToCmAttribute( aURI ); + switch ( attributeRef ) + { + case CMManager::ECmName: + case CMManager::EPacketDataIPNameServer1: + case CMManager::EPacketDataIPNameServer2: + case CMManager::EPacketDataAPName: + case CMManager::EPacketDataIFAuthName: + case CMManager::EPacketDataIPAddr: + case CMManager::EPacketDataIPNetmask: + case CMManager::EPacketDataIPGateway: + resultTmp = aCm.GetStringAttributeL( attributeRef ); + CleanupStack::PushL( resultTmp ); + aResult->InsertL( 0, CUtils::ConvertTo8LC( *resultTmp ) ); + CleanupStack::PopAndDestroy(); // ConvertTo8LC + CleanupStack::PopAndDestroy( resultTmp ); + break; + case CMManager::EPacketDataIPAddrFromServer: + case CMManager::EPacketDataIPDNSAddrFromServer: + if ( aCm.GetBoolAttributeL( attributeRef ) ) + { + aResult->InsertL( 0, KTrue ); + } + else + { + aResult->InsertL( 0, KFalse ); + } + + break; + default: + status = GetUnmodifiableFieldValueL( aURI, aResult ); + break; + } + OstTrace1( TRACE_NORMAL, CNAPBRANCH_GETLEAFDATAL_EXIT, + "EXIT: CNapBranch::GetLeafDataL;status=%{TError}", status ); + + return status; + } + +//----------------------------------------------------------------------------- +// CNapBranch::GetUnmodifiableFieldAddResult() +//----------------------------------------------------------------------------- +CSmlDmAdapter::TError CNapBranch::GetUnmodifiableFieldAddResult( + const TDesC8& aUri, const TDesC8& aObject) + { + OstTraceExt1( TRACE_NORMAL, CNAPBRANCH_GETUNMODIFIABLEFIELDADDRESULT_ENTRY, + "ENTRY: CNapBranch::GetUnmodifiableFieldAddResult;aUri=%s", aUri ); + + CSmlDmAdapter::TError retval( CSmlDmAdapter::ENotFound ); + TPtrC8 nodeName = CUtils::GetLastURISeg( aUri ); + + if ( nodeName.Match( KCMDdfAddrType ) != KErrNotFound ) + { + if ( aObject.Match( KGPRSAddrType ) != KErrNotFound ) + { + retval = CSmlDmAdapter::EOk; + } + else + { + retval = CSmlDmAdapter::EInvalidObject; + } + } + else if ( nodeName.Match( KCMDdfAuthType ) != KErrNotFound ) + { + if ( aObject.Match( KGPRSAuthType ) != KErrNotFound ) + { + retval = CSmlDmAdapter::EOk; + } + else + { + retval = CSmlDmAdapter::EInvalidObject; + } + } + + OstTrace1( TRACE_NORMAL, DUP1_CNAPBRANCH_GETUNMODIFIABLEFIELDADDRESULT_EXIT, + "EXIT: CNapBranch::GetUnmodifiableFieldAddResult;retval=%{TError}", retval ); + + return retval; + } +//----------------------------------------------------------------------------- +// CNapBranch::MapUriToCmAttribute(() +//----------------------------------------------------------------------------- +TUint32 CNapBranch::MapUriToCmAttribute(const TDesC8& aUri) + { + OstTraceExt1( TRACE_NORMAL, CNAPBRANCH_MAPURITOCMATTRIBUTE_ENTRY, + "ENTRY: CNapBranch::MapUriToCmAttribute;aUri=%s", aUri ); + + TUint32 retval( 0 ); + + TPtrC8 nodeName = CUtils::GetLastURISeg( aUri ); + + OstTraceExt1( TRACE_NORMAL, CNAPBRANCH_MAPURITOCMATTRIBUTE_GET_NODE, + "CNapBranch::MapUriToCmAttribute;nodeName=%s", nodeName ); + + if ( nodeName.Match( KCMDdfName ) != KErrNotFound ) + { + retval = CMManager::ECmName; + } + else if ( nodeName.Match( KCMDdfAddr ) != KErrNotFound ) + { + // IP branch and NAP branch have both "Addr" leaf. Select between them. + if ( aUri.Match( KNapAddrUri ) != KErrNotFound && + aUri.Match( KNapIPv4AddrUri ) == KErrNotFound ) + { + retval = CMManager::EPacketDataAPName; + } + else if ( aUri.Match( KNapDNSAddr1Uri ) != KErrNotFound ) + { + retval = CMManager::EPacketDataIPNameServer1; + } + else if ( aUri.Match( KNapDNSAddr2Uri ) != KErrNotFound ) + { + retval = CMManager::EPacketDataIPNameServer2; + } + } + else if ( nodeName.Match( KCMDdfBearerType ) != KErrNotFound ) + { + retval = CMManager::ECmBearerType; + } + else if ( nodeName.Match( KCMDdfAuthName ) != KErrNotFound ) + { + retval = CMManager::EPacketDataIFAuthName; + } + else if ( nodeName.Match( KCMDdfAuthSecret ) != KErrNotFound ) + { + retval = CMManager::EPacketDataIFAuthPass; + } + else if ( nodeName.Match( KCMDdfAutoConfig ) != KErrNotFound ) + { + retval = CMManager::EPacketDataIPAddrFromServer; + } + else if ( nodeName.Match( KCMDdfIPAddr ) != KErrNotFound ) + { + retval = CMManager::EPacketDataIPAddr; + } + else if ( nodeName.Match( KCMDdfNetMask ) != KErrNotFound ) + { + retval = CMManager::EPacketDataIPNetmask; + } + else if ( nodeName.Match( KCMDdfGateway ) != KErrNotFound ) + { + retval = CMManager::EPacketDataIPGateway; + } + else if ( nodeName.Match( KCMDdfAutoDNS )!= KErrNotFound ) + { + retval = CMManager::EPacketDataIPDNSAddrFromServer; + } + + OstTrace1( TRACE_NORMAL, CNAPBRANCH_MAPURITOCMATTRIBUTE_EXIT, + "EXIT: CNapBranch::MapUriToCmAttribute;retval=%{TError}", retval ); + + return retval; + } +//----------------------------------------------------------------------------- +// void CNapBranch::SetLeafData() +//----------------------------------------------------------------------------- +void CNapBranch::SetLeafDataL(const TDesC8& aURI, const TDesC8& aObject, + TInt aStatusRef, RCmConnectionMethodExt& aCm) + { + OstTraceExt1( TRACE_FLOW, CNAPBRANCH_SETLEAFDATAL_ENTRY, + "ENTRY: CNapBranch::SetLeafDataL;aURI=%s", aURI ); + + TUint32 attributeRef( 0 ); + TBool tmpBool = EFalse; + CSmlDmAdapter::TError status = CSmlDmAdapter::EOk; + + attributeRef = MapUriToCmAttribute( aURI ); + OstTrace1( TRACE_NORMAL, CNAPBRANCH_SETLEAFDATAL_GET_CMATTRIB, + "CNapBranch::SetLeafDataL;CM Attribute:;attributeRef=%{TConnectionMethodCommonAttributes}", + attributeRef ); + + switch ( attributeRef ) + { + case CMManager::ECmName: + case CMManager::EPacketDataIPNameServer1: + case CMManager::EPacketDataIPNameServer2: + case CMManager::EPacketDataAPName: + case CMManager::EPacketDataIFAuthName: + case CMManager::EPacketDataIFAuthPass: + case CMManager::EPacketDataIPAddr: + case CMManager::EPacketDataIPNetmask: + case CMManager::EPacketDataIPGateway: + aCm.SetStringAttributeL( attributeRef, CUtils::ConvertTo16LC( aObject ) ); + CleanupStack::PopAndDestroy(); // ConvertTo16LC + break; + case CMManager::EPacketDataIPAddrFromServer: + case CMManager::EPacketDataIPDNSAddrFromServer: + if ( CUtils::DesToBool( aObject, tmpBool ) == KErrNone ) + { + aCm.SetBoolAttributeL( attributeRef, tmpBool ); + } + else + { + status = CSmlDmAdapter::EInvalidObject; + } + break; + case CMManager::ECmBearerType: + // BearerType is already set when CM was created. + break; + default: + // Attribute field was not from CM. Check if value is hard coded to CM. + status = GetUnmodifiableFieldAddResult( aURI, aObject ); + break; + } + iCallback->SetStatusL( aStatusRef, status ); + OstTrace1( TRACE_NORMAL, CNAPBRANCH_SETLEAFDATAL_EXIT, + "EXIT: CNapBranch::SetLeafDataL;status=%{TError}", status ); + } + +//----------------------------------------------------------------------------- +// TBool CNapBranch::SetNodeData() +//----------------------------------------------------------------------------- +void CNapBranch::SetNodeDataL(CConnMoNodeElement* aNode, + RCmConnectionMethodExt& aCm) + { + OstTraceExt1( TRACE_NORMAL, CNAPBRANCH_SETNODEDATAL_ENTRY, + "ENTRY: CNapBranch::SetNodeDataL;aNode->iUri=%s", aNode->iUri ); + + if ( aNode->iParentLUID.Length() == 0 ) + { + TBuf8<16> addLUID; + _LIT8( KFormat, "%d" ); + addLUID.Format( KFormat, aCm.GetIntAttributeL( CMManager::ECmId ) ); + + iCallback->SetMappingL( aNode->iUri, addLUID ); + iCallback->SetStatusL( aNode->iStatusRef, CSmlDmAdapter::EOk ); + + OstTrace0( TRACE_NORMAL, CNAPBRANCH_SETNODEDATAL_OK, + "CNapBranch::SetNodeDataL; CSmlDmAdapter::EOk" ); + } + else + { + iCallback->SetStatusL( aNode->iStatusRef, CSmlDmAdapter::EAlreadyExists ); + OstTrace0( TRACE_NORMAL, CNAPBRANCH_SETNODEDATAL_EXISTS, + "CNapBranch::SetNodeDataL; CSmlDmAdapter::EAlreadyExists" ); + } + OstTrace0( TRACE_NORMAL, CNAPBRANCH_SETNODEDATAL_EXIT, + "EXIT: CNapBranch::SetNodeDataL" ); + } + +//----------------------------------------------------------------------------- +// TBool CNapBranch::FindNewCmType +//----------------------------------------------------------------------------- +TBool CNapBranch::FindNewCmType(TUint32& aBearerType) + { + OstTrace0( TRACE_NORMAL, CNAPBRANCH_FINDNEWCMTYPE_ENTRY, "ENTRY: CNapBranch::FindNewCmType" ); + + TBool retval = EFalse; + // Find bearer type for creating a connection methdod + CConnMoNodeElement* processNode = iBuffer->CacheFind( KNapBearerTypeUri ); + if ( processNode ) + { + if ( processNode->iObject.Match( KPacketDataBearerType ) != KErrNotFound ) + { + OstTraceExt1( TRACE_NORMAL, CNAPBRANCH_FINDNEWCMTYPE_3GPP, + "CNapBranch::FindNewCmType;Bearer Type: %s", KPacketDataBearerType ); + + aBearerType = KUidPacketDataBearerType; + retval = ETrue; + } + else + { + aBearerType = KInvalidBearerType; + } + } + OstTrace1( TRACE_NORMAL, CNAPBRANCH_FINDNEWCMTYPE_EXIT, + "EXIT: CNapBranch::FindNewCmType;retval=%d", retval ); + + return retval; + } +//----------------------------------------------------------------------------- +// TBool CNapBranch::AllMandatoryNapFieldsFound() +//----------------------------------------------------------------------------- +TBool CNapBranch::AllMandatoryNapFieldsFound() + { + OstTrace0( TRACE_NORMAL, CNAPBRANCH_ALLMANDATORYNAPFIELDSFOUND_ENTRY, + "ENTRY: CNapBranch::AllMandatoryNapFieldsFound" ); + + TBool retval = ETrue; + + // Check that NAP Address addition is found + if ( !iBuffer->CacheFind( KNapAddrUri ) ) + { + retval = EFalse; + } + // Check that dynamic nap node addition is found + if ( !iBuffer->CacheFindDynamicNode( KDynamicNapNode ) ) + { + retval = EFalse; + } + + OstTrace1( TRACE_NORMAL, CNAPBRANCH_ALLMANDATORYNAPFIELDSFOUND_EXIT, + "EXIT: CNapBranch::AllMandatoryNapFieldsFound;retval=%d", retval ); + + return retval; + } +//----------------------------------------------------------------------------- +// TBool CNapBranch::NapChildURIListL +// TBool CNapBranch::NapChildURIList( ) +//----------------------------------------------------------------------------- +void CNapBranch::NapChildURIListL(const TDesC8& aURI, const CArrayFix< + TSmlDmMappingInfo>& aPreviousURISegmentList, TInt aResultsRef, + TInt aStatusRef, CBufBase& aCurrentURISegmentList) + { + OstTraceExt1( TRACE_NORMAL, CNAPBRANCH_NAPCHILDURILISTL_ENTRY, + "ENTRY: CNapBranch::NapChildURIListL;aURI=%s", aURI ); + + RArray CmArray; + CleanupClosePushL( CmArray ); + + TPtrC8 napTree = CUtils::GetEndOfURIFromSeg( aURI, KCMDdfNAP ); + + GetAllConnectionMethodsL( CmArray, *iCmManager ); + + for (TInt i = 0; i < CmArray.Count(); i++ ) + { + TBuf8 addURISeg; + if ( !CheckPreviousURIList( aPreviousURISegmentList, CmArray[i], addURISeg ) ) + { + // Connection Method not found in previous URI list + addURISeg.Append( aURI ); + addURISeg.Append( KSlash ); + addURISeg.Append( KDynamicNodePrefix ); + + addURISeg.AppendNumFixedWidth( CmArray[i], EDecimal, 3); + + TBuf8<16> addLUID; + _LIT8( KFormat, "%d" ); + addLUID.Format( KFormat, CmArray[i] ); + + OstTraceExt1( TRACE_NORMAL, + CNAPBRANCH_NAPCHILDURILISTL_ADDED_TO_LIST, + "CNapBranch::NapChildURIListL;Added to list: URI=%s", addURISeg ); + + iCallback->SetMappingL( addURISeg, addLUID ); + } + + // Child is the last segment in uri + aCurrentURISegmentList.InsertL( aCurrentURISegmentList.Size(), + CUtils::GetLastURISeg(addURISeg) ); + aCurrentURISegmentList.InsertL( aCurrentURISegmentList.Size(), KSlash ); + } + iCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EOk ); + iCallback->SetResultsL( aResultsRef, aCurrentURISegmentList, KNullDesC8 ); + + CleanupStack::PopAndDestroy( &CmArray ); + + OstTrace0( TRACE_NORMAL, CNAPBRANCH_NAPCHILDURILISTL_EXIT, + "EXIT: CNapBranch::NapChildURIListL" ); + } +//----------------------------------------------------------------------------- +// CSmlDmAdapter::TError CNapBranch::DeleteObjectL +//----------------------------------------------------------------------------- +CSmlDmAdapter::TError CNapBranch::DeleteObjectL(const TDesC8& aURI, + const TDesC8& aLUID) + { + OstTrace0( TRACE_NORMAL, CNAPBRANCH_DELETEOBJECTL_PRIVATE_ENTRY, + "ENTRY: CNapBranch::DeleteObjectL" ); + + CSmlDmAdapter::TError status = CSmlDmAdapter::ENotFound; + + // If this is for pre-defined node then get CM id xxx from URI (NAP/NAPIdxxx) + TInt cmId = GetCmIdFromURIL( aURI ); + + RCmConnectionMethodExt cm; + + if( aLUID.Length() > 0 ) + { + cmId = CUtils::IntLUID( aLUID ); + } + + // Check, if referred connection method exists + if ( GetConnectionMethodLC( *iCmManager, cm, cmId ) ) + { + cm.DeleteL(); + status = CSmlDmAdapter::EOk; + OstTrace1( TRACE_NORMAL, CNAPBRANCH_DELETEOBJECTL_PRIVATE_DELETE, + "CNapBranch::DeleteObjectL; Connection Method=%u deleted.", cmId ); + } + + CleanupStack::PopAndDestroy( &cm ); + + OstTrace1( TRACE_NORMAL, CNAPBRANCH_DELETEOBJECTL_PRIVATE_EXIT, + "EXIT: CNapBranch::DeleteObjectL;status=%{TError}", status ); + + return status; + } + +// ======== MEMBER FUNCTIONS ======== +//----------------------------------------------------------------------------- +// CNapBranch* CNapBranch::NewL( ) +//----------------------------------------------------------------------------- +CNapBranch* CNapBranch::NewL(MSmlDmCallback* aDmCallback, + CAddBuffer* aBuffer, RCmManagerExt* aCmManagerExt) + { + OstTraceFunctionEntry1( CNAPBRANCH_NEWL_ENTRY, ( TUint )( aDmCallback ) ); + + CNapBranch* self = new (ELeave) CNapBranch( aDmCallback ); + CleanupStack::PushL(self); + + self->ConstructL( aBuffer, aCmManagerExt ); + + CleanupStack::Pop(self); + + OstTraceFunctionExit1( CNAPBRANCH_NEWL_EXIT, ( TUint )( self ) ); + return self; + } + +//------------------------------------------------------------------------------ +// CNapBranch::CNapBranch() +//------------------------------------------------------------------------------ +CNapBranch::CNapBranch(MSmlDmCallback* aDmCallback) : + CBranchBase(aDmCallback) + { + OstTraceFunctionEntry1( CNAPBRANCH_CONSTRUCTOR_ENTRY, this ); + + iCallback = aDmCallback; + + OstTraceFunctionExit1( CNAPBRANCH_CONSTRUCTOR_EXIT, this ); + } + +//------------------------------------------------------------------------------ +// CNapBranch::~CNapBranch() +//------------------------------------------------------------------------------ +CNapBranch::~CNapBranch() + { + OstTraceFunctionEntry1( CNAPBRANCH_DESTRUCTOR_ENTRY, this ); + + OstTraceFunctionExit1( CNAPBRANCH_DESTRUCTOR_EXIT, this ); + } + +//============================================= +// CNapBranch::ConstructL() +// Second phase constructor. +//============================================= +void CNapBranch::ConstructL(CAddBuffer* aBuffer, RCmManagerExt* aCmManagerExt) + { + OstTraceFunctionEntry1( CNAPBRANCH_CONSTRUCTL_ENTRY, this ); + + iBuffer = aBuffer; + iCmManager = aCmManagerExt; + + OstTraceFunctionExit1( CNAPBRANCH_CONSTRUCTL_EXIT, this ); + } + +//------------------------------------------------------------------------------ +// void CNapBranch::DDFStructureL() +//------------------------------------------------------------------------------ +void CNapBranch::DDFStructureL(MSmlDmDDFObject& aDDF) + { + OstTraceFunctionEntry0( CNAPBRANCH_DDFSTRUCTUREL_ENTRY ); + + // + // Set rest acceptable operations for data itself + // + TSmlDmAccessTypes aclTypesNoDelete; + aclTypesNoDelete.SetGet(); + aclTypesNoDelete.SetReplace(); + aclTypesNoDelete.SetAdd(); + + TSmlDmAccessTypes aclTypesNoGet; + aclTypesNoGet.SetReplace(); + aclTypesNoGet.SetAdd(); + aclTypesNoGet.SetDelete(); + + TSmlDmAccessTypes aclTypesOnlyGet; + aclTypesOnlyGet.SetGet(); + + MSmlDmDDFObject& nIDDDF = aDDF.AddChildObjectL( KCMDdfID ); // ID + CUtils::FillNodeInfoL( nIDDDF, + aclTypesOnlyGet, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EChr, + KNullDesC8 ); + + MSmlDmDDFObject& nNameDDF = aDDF.AddChildObjectL( KCMDdfName ); // Name + CUtils::FillNodeInfoL( nNameDDF, + aclTypesNoDelete, + MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EChr, + KNullDesC8 ); + + MSmlDmDDFObject& nAddrTypeDDF = aDDF.AddChildObjectL( KCMDdfAddrType ); // AddrType + CUtils::FillNodeInfoL( nAddrTypeDDF, + aclTypesNoDelete, + MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EChr, + KNullDesC8 ); + + MSmlDmDDFObject& nAddrDDF = aDDF.AddChildObjectL( KCMDdfAddr ); // Addr + CUtils::FillNodeInfoL( nAddrDDF, + aclTypesNoDelete, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EChr, + KNullDesC8 ); + + MSmlDmDDFObject& nIPDDF = aDDF.AddChildObjectL( KCMDdfIP ); // IP + CUtils::FillNodeInfoL( nIPDDF, + aclTypesNoDelete, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::ENode, + KNullDesC8 ); + + MSmlDmDDFObject& nIPv4DDF = nIPDDF.AddChildObjectL( KCMDdfIPv4 ); // IPv4 + CUtils::FillNodeInfoL( nIPv4DDF, + aclTypesNoDelete, + MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::ENode, + KNullDesC8 ); + IpBranchDDFStructureL( nIPv4DDF ); + + MSmlDmDDFObject& nAuthInfoDDF = aDDF.AddChildObjectL( KCMDdfAuthInfo ); // AuthInfo + CUtils::FillNodeInfoL( nAuthInfoDDF, + aclTypesNoDelete, + MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::ENode, + KNullDesC8 ); + + MSmlDmDDFObject& nAuthNameDDF = nAuthInfoDDF.AddChildObjectL( KCMDdfAuthName ); // AuthName + CUtils::FillNodeInfoL( nAuthNameDDF, + aclTypesNoDelete, + MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EChr, + KNullDesC8 ); + + MSmlDmDDFObject& nAuthTypeDDF = nAuthInfoDDF.AddChildObjectL( KCMDdfAuthType ); // AuthType + CUtils::FillNodeInfoL( nAuthTypeDDF, + aclTypesNoDelete, + MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EChr, + KNullDesC8 ); + + MSmlDmDDFObject& nAuthSecretDDF = nAuthInfoDDF.AddChildObjectL( KCMDdfAuthSecret ); // AuthSecret + CUtils::FillNodeInfoL( nAuthSecretDDF, + aclTypesNoGet, + MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EChr, + KNullDesC8 ); + + MSmlDmDDFObject& nBearerTypeDDF = aDDF.AddChildObjectL( KCMDdfBearerType ); // BearerType + CUtils::FillNodeInfoL( nBearerTypeDDF, + aclTypesNoDelete, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EChr, + KNullDesC8 ); + + MSmlDmDDFObject& nBearerParamsDDF = aDDF.AddChildObjectL( KCMDdfBearerParams ); // BearerParams + CUtils::FillNodeInfoL( nBearerParamsDDF, + aclTypesNoDelete, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::ENode, + KNullDesC8 ); + + OstTraceFunctionExit0( CNAPBRANCH_DDFSTRUCTUREL_EXIT ); + } + +// ------------------------------------------------------------------------------------- +// CNapBranch::IpBranchDDFStructureL +// ------------------------------------------------------------------------------------- +void CNapBranch::IpBranchDDFStructureL(MSmlDmDDFObject& nIPvXDDF) + { + OstTraceFunctionEntry0( CNAPBRANCH_IPBRANCHDDFSTRUCTUREL_ENTRY ); + + // + // Set rest acceptable operations for data itself + // + TSmlDmAccessTypes aclTypesNoDelete; + aclTypesNoDelete.SetGet(); + aclTypesNoDelete.SetReplace(); + aclTypesNoDelete.SetAdd(); + + MSmlDmDDFObject& nAutoConfigDDF = nIPvXDDF.AddChildObjectL( KCMDdfAutoConfig ); // AutoConfig + CUtils::FillNodeInfoL( nAutoConfigDDF, + aclTypesNoDelete, + MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EChr, + KNullDesC8 ); + + MSmlDmDDFObject& nIPAddrDDF = nIPvXDDF.AddChildObjectL( KCMDdfIPAddr ); // IPAddr + CUtils::FillNodeInfoL( nIPAddrDDF, + aclTypesNoDelete, + MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EChr, + KNullDesC8 ); + + MSmlDmDDFObject& nNetMaskDDF = nIPvXDDF.AddChildObjectL( KCMDdfNetMask ); // NetMask + CUtils::FillNodeInfoL( nNetMaskDDF, + aclTypesNoDelete, + MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EChr, + KNullDesC8 ); + + MSmlDmDDFObject& nGatewayDDF = nIPvXDDF.AddChildObjectL( KCMDdfGateway ); // Gateway + CUtils::FillNodeInfoL( nGatewayDDF, + aclTypesNoDelete, + MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EChr, + KNullDesC8 ); + + MSmlDmDDFObject& nAutoDNSDDF = nIPvXDDF.AddChildObjectL( KCMDdfAutoDNS ); // AutoDNS + CUtils::FillNodeInfoL( nAutoDNSDDF, + aclTypesNoDelete, + MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EBool, + KNullDesC8 ); + + MSmlDmDDFObject& nDNSDDF = nIPvXDDF.AddChildObjectL( KCMDdfDNS ); // DNS + CUtils::FillNodeInfoL( nDNSDDF, + aclTypesNoDelete, + MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::ENode, + KNullDesC8 ); + + MSmlDmDDFObject& nServersDDF = nDNSDDF.AddChildObjectL( KCMDdfServers ); // Servers + CUtils::FillNodeInfoL( nServersDDF, + aclTypesNoDelete, + MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::ENode, + KNullDesC8 ); + + MSmlDmDDFObject& nServersRootDDF = nServersDDF.AddChildObjectGroupL(); // Servers/ + CUtils::FillNodeInfoL( nServersRootDDF, + aclTypesNoDelete, + MSmlDmDDFObject::EOneOrMore, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::ENode, + KNullDesC8 ); + + MSmlDmDDFObject& nAddrDDF = nServersRootDDF.AddChildObjectL( KCMDdfAddr ); // Addr + CUtils::FillNodeInfoL( nAddrDDF, + aclTypesNoDelete, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EChr, + KNullDesC8 ); + + OstTraceFunctionExit0( CNAPBRANCH_IPBRANCHDDFSTRUCTUREL_EXIT ); + } + +// ------------------------------------------------------------------------------------- +// CNapBranch::UpdateLeafObjectL +// ------------------------------------------------------------------------------------- +void CNapBranch::UpdateLeafObjectL(const TDesC8& aURI, const TDesC8& aLUID, + const TDesC8& aObject, const TDesC8& /*aType*/, TInt aStatusRef) + { + OstTraceExt1( TRACE_NORMAL, CNAPBRANCH_UPDATELEAFOBJECTL_ENTRY, + "ENTRY: CNapBranch::UpdateLeafObjectL;aURI=%s", aURI ); + + // If this is for pre-defined node then get CM id xxx from URI (NAP/NAPIdxxx) + TInt cmId = GetCmIdFromURIL( aURI ); + + if ( aLUID.Length() == 0 && cmId == KErrNotFound ) + { + // New node, add to buffer + iBuffer->AddNodeToBufferL( aURI, aLUID, aObject, aStatusRef ); + } + else + { + // Existing node, update data immediately + TInt err( KErrNone ); + RCmConnectionMethodExt cm; + if ( cmId == KErrNotFound ) + { + cmId = CUtils::IntLUID( aLUID ); + } + + TRAP( err, cm = iCmManager->ConnectionMethodL( cmId ) ); + CleanupClosePushL( cm ); + + if ( !err ) + { + OstTrace0( TRACE_NORMAL, CNAPBRANCH_UPDATELEAFOBJECTL, "CNapBranch::UpdateLeafObjectL; Update existing node data immediately." ); + SetLeafDataL( aURI, aObject, aStatusRef, cm ); + cm.UpdateL(); + } + else + { + OstTrace0( TRACE_NORMAL, DUP1_CNAPBRANCH_UPDATELEAFOBJECTL, "CNapBranch::UpdateLeafObjectL; Stale LUID - Buffer setting." ); + iBuffer->AddNodeToBufferL( aURI, KNullDesC8, aObject, aStatusRef ); + } + + CleanupStack::PopAndDestroy( &cm ); + } + + OstTrace0( TRACE_NORMAL, CNAPBRANCH_UPDATELEAFOBJECTL_EXIT, + "EXIT: CNapBranch::UpdateLeafObjectL" ); + } + +// ------------------------------------------------------------------------------------- +// CNapBranch::DeleteObjectL +// ------------------------------------------------------------------------------------- +void CNapBranch::DeleteObjectL(const TDesC8& aURI, const TDesC8& aLUID, + TInt aStatusRef) + { + OstTraceExt1( TRACE_NORMAL, CNAPBRANCH_DELETEOBJECTL_ENTRY, + "ENTRY: CNapBranch::DeleteObjectL;aURI=%s", aURI ); + + CSmlDmAdapter::TError status = CSmlDmAdapter::EError; + + TPtrC8 napTree = CUtils::GetEndOfURIFromSeg( aURI, KCMDdfNAP ); + + if ( napTree.Match( KDynamicNapNode ) != KErrNotFound && + napTree.Match( KDynamicNapNodeChildUri ) == KErrNotFound ) + { + + status = DeleteObjectL( aURI, aLUID ); + + } + + iCallback->SetStatusL( aStatusRef, status ); + + OstTrace1( TRACE_NORMAL, CNAPBRANCH_DELETEOBJECTL_EXIT, + "EXIT: CNapBranch::DeleteObjectL;status=%{TError}", status ); + } + +// ------------------------------------------------------------------------------------- +// CNapBranch::FetchLeafObjectL +// ------------------------------------------------------------------------------------- +void CNapBranch::FetchLeafObjectL(const TDesC8& aURI, const TDesC8& aLUID, + const TDesC8& aType, TInt aResultsRef, TInt aStatusRef) + { + OstTraceExt1( TRACE_NORMAL, CNAPBRANCH_FETCHLEAFOBJECTL_ENTRY, + "ENTRY: CNapBranch::FetchLeafObjectL;aURI=%s", aURI ); + TInt cmId( KErrNotFound ); + if ( aLUID.Length() > 0 ) + { + cmId = CUtils::IntLUID( aLUID ); + } + else + { + // If this is for pre-defined node then get CM id xxx from URI (NAP/NAPIdxxx) + cmId = GetCmIdFromURIL( aURI ); + } + if ( cmId != KErrNotFound ) + { + CBufBase* result = CBufFlat::NewL( KBufferExpandSize ); + CleanupStack::PushL( result ); + + // Open connection method. + RCmConnectionMethodExt cm; + TRAPD(err, cm = iCmManager->ConnectionMethodL( cmId ) ); + if (err != KErrNone ) + { + CleanupStack::PopAndDestroy( result ); + iCallback->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound ); + OstTrace0( TRACE_NORMAL, CNAPBRANCH_DUP_FETCHLEAFOBJECTL_NOT_FOUND, "CSmlDmAdapter::ENotFound" ); + return; + } + CleanupClosePushL( cm ); + + // Find data from CM + CSmlDmAdapter::TError status = GetLeafDataL( aURI, + cm, + result ); + + OstTrace1( TRACE_NORMAL, CNAPBRANCH_FETCHLEAFOBJECTL_STATUS, + "CNapBranch::FetchLeafObjectL;status=%{TError}", status ); + + if ( status == CSmlDmAdapter::EOk ) + { + iCallback->SetResultsL( aResultsRef, *result, aType ); + } + iCallback->SetStatusL( aStatusRef, status ); + + CleanupStack::PopAndDestroy( &cm ); + CleanupStack::PopAndDestroy( result ); + } + else + { + iCallback->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound ); + OstTrace0( TRACE_NORMAL, CNAPBRANCH_FETCHLEAFOBJECTL_NOT_FOUND, "CSmlDmAdapter::ENotFound" ); + } + OstTrace0( TRACE_NORMAL, CNAPBRANCH_FETCHLEAFOBJECTL_EXIT, "EXIT: CNapBranch::FetchLeafObjectL" ); + } + +// ------------------------------------------------------------------------------------- +// CNapBranch::FetchLeafObjectSizeL +// ------------------------------------------------------------------------------------- +void CNapBranch::FetchLeafObjectSizeL(const TDesC8& aURI, + const TDesC8& aLUID, const TDesC8& aType, TInt aResultsRef, + TInt aStatusRef) + { + OstTraceExt1( TRACE_NORMAL, CNAPBRANCH_FETCHLEAFOBJECTSIZEL_ENTRY, + "ENTRY: CNapBranch::FetchLeafObjectSizeL;aURI=%s", aURI ); + TInt cmId( KErrNotFound ); + if ( aLUID.Length() > 0 ) + { + cmId = CUtils::IntLUID( aLUID ); + } + else + { + // If this is for pre-defined node then get CM id xxx from URI (NAP/NAPIdxxx) + cmId = GetCmIdFromURIL( aURI ); + } + if ( cmId != KErrNotFound ) + { + CBufBase* result = CBufFlat::NewL( KBufferExpandSize ); + CleanupStack::PushL(result); + + // Open connection method. + RCmConnectionMethodExt cm; + TRAPD(err, cm = iCmManager->ConnectionMethodL( cmId ) ); + if (err != KErrNone ) + { + CleanupStack::PopAndDestroy( result ); + iCallback->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound ); + OstTrace0( TRACE_NORMAL, CNAPBRANCH_DUP1_FETCHLEAFOBJECTL_NOT_FOUND, "CSmlDmAdapter::ENotFound" ); + return; + } + CleanupClosePushL( cm ); + + // Find data from CM + CSmlDmAdapter::TError status = GetLeafDataL( aURI, + cm, + result ); + + OstTrace1( TRACE_NORMAL, CNAPBRANCH_FETCHLEAFOBJECTSIZEL_STATUS, + "CNapBranch::FetchLeafObjectSizeL;status=%{TError}", status ); + + if ( status == CSmlDmAdapter::EOk ) + { + TInt size = result->Size(); + TBuf8 sizeStr; + sizeStr.AppendNum( size ); + + result->Reset(); + result->InsertL( 0, sizeStr ); + + iCallback->SetResultsL( aResultsRef, *result, aType); + } + iCallback->SetStatusL( aStatusRef, status ); + + CleanupStack::PopAndDestroy( &cm ); + CleanupStack::PopAndDestroy( result ); + } + else + { + iCallback->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound ); + OstTrace0( TRACE_NORMAL, CNAPBRANCH_FETCHLEAFOBJECTSIZEL_NOT_FOUND, + "CNapBranch::FetchLeafObjectSizeL;CSmlDmAdapter::ENotFound" ); + } + OstTrace0( TRACE_NORMAL, CNAPBRANCH_FETCHLEAFOBJECTSIZEL_EXIT, + "EXIT: CNapBranch::FetchLeafObjectSizeL" ); + } + +// ------------------------------------------------------------------------------------- +// CNapBranch::ChildURIListL +// ------------------------------------------------------------------------------------- +void CNapBranch::ChildURIListL(const TDesC8& aURI, const TDesC8& aLUID, + const CArrayFix& aPreviousURISegmentList, + TInt aResultsRef, TInt aStatusRef) + { + OstTraceExt1( TRACE_NORMAL, CNAPBRANCH_CHILDURILISTL_ENTRY, + "ENTRY: CNapBranch::ChildURIListL;aURI=%s", aURI ); + + + TPtrC8 napTree = CUtils::GetEndOfURIFromSeg( aURI,KCMDdfNAP ); + + CBufBase* currentURISegmentList = CBufFlat::NewL( KSmlMaxURISegLen ); + CleanupStack::PushL( currentURISegmentList ); + + // First handle ./NAP as a special case + if ( napTree.Match( KCMDdfNAP ) != KErrNotFound ) + { + NapChildURIListL( aURI, + aPreviousURISegmentList, + aResultsRef, + aStatusRef, + *currentURISegmentList ); + CleanupStack::PopAndDestroy( currentURISegmentList ); + return; + } + + // Then check if the CM exists. Use LUID or predefined ID + TInt cmId( KErrNotFound ); + if ( aLUID.Length() > 0 ) + { + cmId = CUtils::IntLUID( aLUID ); + } + else + { + // If this is for pre-defined node then get CM id xxx from URI (NAP/NAPIdxxx) + cmId = GetCmIdFromURIL( aURI ); + } + // If after this cmId is still not found then the branch does not exist + if ( cmId == KErrNotFound ) + { + iCallback->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound ); + CleanupStack::PopAndDestroy( currentURISegmentList ); + OstTrace0( TRACE_NORMAL, DUP1_CNAPBRANCH_CHILDURILISTL, "CNapBranch::ChildURIListL; CSmlDmAdapter::ENotFound" ); + return; + } + + RCmConnectionMethodExt cm; + // Check it the method actually can be found + if ( !GetConnectionMethodLC( *iCmManager, cm, cmId ) ) + { + iCallback->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound ); + CleanupStack::PopAndDestroy( &cm ); + CleanupStack::PopAndDestroy( currentURISegmentList ); + OstTrace0( TRACE_NORMAL, DUP2_CNAPBRANCH_CHILDURILISTL, "CNapBranch::ChildURIListL; CSmlDmAdapter::ENotFound" ); + return; + } + CleanupStack::PopAndDestroy( &cm ); + + if ( napTree.Match( KDynamicNapNode ) != KErrNotFound && + napTree.Match( KDynamicNapNodeChildUri ) == KErrNotFound ) + { + currentURISegmentList->InsertL( currentURISegmentList->Size(), KCMNapFields ); + iCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EOk ); + iCallback->SetResultsL( aResultsRef, *currentURISegmentList, KNullDesC8 ); + } + // ./NAP/*/IP + + else if ( napTree.Match( KDynamicIPNode ) != KErrNotFound && + napTree.Match( KDynamicIPNodeChildUri ) == KErrNotFound ) + { + currentURISegmentList->InsertL( currentURISegmentList->Size(), KCMNIPFields ); + iCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EOk ); + iCallback->SetResultsL( aResultsRef, *currentURISegmentList, KNullDesC8 ); + } + // ./NAP/*/IP/IPv4 + + else if ( napTree.Match( KDynamicIPv4Node ) != KErrNotFound && + napTree.Match( KDynamicIPv4NodeChildUri ) == KErrNotFound ) + { + currentURISegmentList->InsertL( currentURISegmentList->Size(), KCMNIPv4Fields ); + iCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EOk ); + iCallback->SetResultsL( aResultsRef, *currentURISegmentList, KNullDesC8 ); + } + // ./NAP/*/IP/IPv4/DNS + + else if ( napTree.Match( KDynamicIPv4DnsNode ) != KErrNotFound && + napTree.Match( KDynamicIPv4DnsNodeChildUri ) == KErrNotFound ) + { + currentURISegmentList->InsertL( currentURISegmentList->Size(), KCMNDNSFields ); + iCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EOk ); + iCallback->SetResultsL( aResultsRef, *currentURISegmentList, KNullDesC8 ); + } + // ./NAP/*/IP/IPv4/DNS/Servers + + else if ( napTree.Match( KDynamicIPv4DnsServersNode ) != KErrNotFound ) + { + GetAllDynamicNodesL( aURI, + aLUID, + aPreviousURISegmentList, + aResultsRef, + aStatusRef, + *iCmManager, + *currentURISegmentList, + KCMDdfServer, + KMaxDnsAddr, + iCallback ); + } + // ./NAP/*/IP/IPv4/DNS/Servers* + + else if ( napTree.Match( KDynamicIPv4DnsServersNodeChildUri ) != KErrNotFound && + napTree.Match( KDynamicIPv4DnsServersNodeChildUriNodes ) == KErrNotFound ) + { + currentURISegmentList->InsertL( currentURISegmentList->Size(), KCMNDNSServersFields ); + iCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EOk ); + iCallback->SetResultsL( aResultsRef, *currentURISegmentList, KNullDesC8 ); + } + // ./NAP/*/AuthInfo + + else if ( napTree.Match( KDynamicAuthInfoNode ) != KErrNotFound && + napTree.Match( KDynamicAuthInfoNodeChildUri ) == KErrNotFound ) + { + currentURISegmentList->InsertL( currentURISegmentList->Size(), KCMNAuthInfoFields ); + iCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EOk ); + iCallback->SetResultsL( aResultsRef, *currentURISegmentList, KNullDesC8 ); + } + else + { + iCallback->SetStatusL( aStatusRef, CSmlDmAdapter::ENotFound ); + OstTrace0( TRACE_NORMAL, CNAPBRANCH_CHILDURILISTL, + "CNapBranch::ChildURIListL; CSmlDmAdapter::ENotFound" ); + } + + CleanupStack::PopAndDestroy( currentURISegmentList ); + + OstTrace0( TRACE_NORMAL, DUP1_CNAPBRANCH_CHILDURILISTL_EXIT, + "EXIT: CNapBranch::ChildURIListL" ); + } + +// ------------------------------------------------------------------------------------- +// CNapBranch::AddNodeObjectL +// ------------------------------------------------------------------------------------- +void CNapBranch::AddNodeObjectL(const TDesC8& aURI, + const TDesC8& aParentLUID, TInt aStatusRef) + { + OstTraceExt1( TRACE_NORMAL, CNAPBRANCH_ADDNODEOBJECTL_ENTRY, + "ENTRY: CNapBranch::AddNodeObjectL;aURI=%s", aURI ); + + if ( aParentLUID.Length() == 0 ) + { + // If this is for pre-defined node then get CM id xxx from URI (NAP/NAPIdxxx) + TInt cmId = GetCmIdFromURIL( aURI ); + RCmConnectionMethodExt cm; + // Check if CM exists + if ( cmId != KErrNotFound && GetConnectionMethodLC( *iCmManager, cm, cmId ) ) + { + CleanupStack::PopAndDestroy( &cm ); + // Pre-defined CM already exists for this ID. + // NAPs must be added in one message. If luid is given add is done to existing AP or node + iCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EAlreadyExists ); + OstTrace0( TRACE_NORMAL, CNAPBRANCH_ADDNODEOBJECTL, + "CNapBranch::AddNodeObjectL; CSmlDmAdapter::EAlreadyExists because tried to add in predefined node format that exists" ); + return; + } + if ( cmId != KErrNotFound ) + { + CleanupStack::PopAndDestroy( &cm ); + } + + // New node, add to buffer + iBuffer->AddNodeToBufferL( aURI, aParentLUID, aStatusRef ); + //iCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EOk ); + OstTrace0( TRACE_NORMAL, CNAPBRANCH_ADDNODEOBJECTL_NEW_NODE, + "CNapBranch::AddNodeObjectL;New node -> Add to buffer." ); + } + else + { + // Sanity check: If the dynamic name of the NAP node has is the same as deleted previously and + // DM Framework hasn't updated the tree, it will give the LUID when calling this method. Thus, + // it's needed to check that the connection method really exists. + TBuf8 parentLUID; + parentLUID.Zero(); + parentLUID = aParentLUID; + RCmConnectionMethodExt cm; + if ( !GetConnectionMethodLC( *iCmManager, cm, CUtils::IntLUID( parentLUID) ) ) + { + if(aParentLUID.Length() > 0) + { + TInt ret = iCallback->RemoveMappingL(KConnMoAdapterUid, + GetDynamicNAPNodeUri( aURI ), ETrue ); + if(ret) + { + iCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EError ); + CleanupStack::PopAndDestroy( &cm ); + return; + } + } + // New node, add to buffer + iBuffer->AddNodeToBufferL( aURI, KNullDesC8, aStatusRef ); + OstTrace0( TRACE_NORMAL, CNAPBRANCH_ADDNODEOBJECTL_NEW_NODE2, + "CNapBranch::AddNodeObjectL;New node -> Add to buffer." ); + } + else + { + // NAPs must be added in one message. If luid is given add is done to existing AP or node + iCallback->SetStatusL( aStatusRef, CSmlDmAdapter::EAlreadyExists ); + OstTrace0( TRACE_NORMAL, CNAPBRANCH_ADDNODEOBJECTL_ALLREADY_EXISTS, + "CNapBranch::AddNodeObjectL; CSmlDmAdapter::EAlreadyExists" ); + } + + CleanupStack::PopAndDestroy( &cm ); + } + OstTrace0( TRACE_NORMAL, CNAPBRANCH_ADDNODEOBJECTL_EXIT, "EXIT: CNapBranch::AddNodeObjectL" ); + + } + +// ------------------------------------------------------------------------------------- +// CNapBranch::ProcessNodeBufferL() +// ------------------------------------------------------------------------------------- +void CNapBranch::ProcessBufferL() + { + OstTrace0( TRACE_NORMAL, CNAPBRANCH_PROCESSBUFFERL_ENTRY, "ENTRY: CNapBranch::ProcessBufferL" ); + + TUint32 bearerType; + + RPointerArray napNodes( KNumOfNAPNodes ); + CleanupClosePushL( napNodes ); + + while ( iBuffer->GetGroup( KCMDdfNAP, &napNodes ) != KErrNotFound ) + { + + if ( FindNewCmType( bearerType ) && AllMandatoryNapFieldsFound() ) + { + // Create new connection method and update nodes + RCmConnectionMethodExt cm = iCmManager->CreateConnectionMethodL( bearerType ); + CleanupClosePushL( cm ); + cm.UpdateL(); + + for ( TInt i = 0; i < napNodes.Count(); ++i ) + { + if ( napNodes[i]->iLeaf ) + { + // Leaf data found + SetLeafDataL( napNodes[i]->iUri, + napNodes[i]->iObject, + napNodes[i]->iStatusRef, cm ); + napNodes[i]->iProcessed = ETrue; + } + else + { + // Node has no leaf data + SetNodeDataL( napNodes[i], cm); + napNodes[i]->iProcessed = ETrue; + } + } + cm.UpdateL(); + CleanupStack::PopAndDestroy( &cm ); + } + else + { + for ( TInt i = 0; i < napNodes.Count(); ++i ) + { + iCallback->SetStatusL( napNodes[i]->iStatusRef, CSmlDmAdapter::EError ); + napNodes[i]->iProcessed = ETrue; + } + } + napNodes.Reset(); + } + CleanupStack::Pop( &napNodes ); + napNodes.Close(); + + OstTrace0( TRACE_NORMAL, CNAPBRANCH_PROCESSBUFFERL_EXIT, "EXIT: CNapBranch::ProcessBufferL" ); + + } + +//------------------------------------------------------------------------------ +// TPtrC8 CUtils::GetDynamicAPNodeUri( const TDesC8& aURI ) +// returns NAP/xxx URI +//------------------------------------------------------------------------------ +TPtrC8 CNapBranch::GetDynamicNAPNodeUri(const TDesC8& aURI) + { + + OstTraceExt1( TRACE_NORMAL, CNAPBRANCH_GETDYNAMICNAPNODEURI, "CNapBranch::GetDynamicNAPNodeUri;aURI=%s", aURI ); + + TInt i= 0; + for ( i = aURI.Find( KCMDdfNAP ) + 4; i < aURI.Length(); i++ ) + { + if( aURI[i] == '/' ) + { + break; + } + } + OstTraceExt1( TRACE_NORMAL, DUP1_CNAPBRANCH_GETDYNAMICNAPNODEURI, "CNapBranch::GetDynamicNAPNodeUri;return URI=%s", aURI.Left( i ) ); + + return aURI.Left( i ); + } + +//-------------------------------------------------------------------- +//TInt CNapBranch::IsNAPUriFormatMatchPredefined(const TDesC8 & aURI) +// +//------------------------------------------------------------------- + + +TBool CNapBranch::IsNAPUriFormatMatchPredefined(const TDesC8 & aURI) +{ + if( aURI.Match( _L8( "NAP/NAPId*" ) ) != KErrNotFound ) + { + return ETrue; + } + else + { + return EFalse; + } +} +//------------------------------------------------------------------------------ +// TUint32 CNapBranch::GetAPIdFromURIL(const TDesC8& aURI) +// Get NAP id for given aURI +//------------------------------------------------------------------------------ +TInt CNapBranch::GetCmIdFromURIL(const TDesC8& aURI) + { + TInt ret(KErrNotFound); + + if( !IsNAPUriFormatMatchPredefined( aURI ) ) + { + // Cannot get CmIds from any other format URIs than predefined + return ret; + } + + TLex8 lex; + // Find xxx from ./NAP/NAPIdxxx/... + TInt start = aURI.Find( KDynamicNodePrefix ) + KDynamicNodePrefix().Length(); + lex = aURI.Mid( start, 3 ); + lex.Val( ret ); + + return ret; + }