diff -r 000000000000 -r 1bce908db942 natplugins/natpcliprovisioningnatfwadapter/src/wpnatfwitem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/natplugins/natpcliprovisioningnatfwadapter/src/wpnatfwitem.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,1212 @@ +/* +* Copyright (c) 2006 - 2007 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: Holds and stores one NAT/FW settings item. +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include +#include "WPAdapterUtil.h" +//#include "versit.h" + +// Central Repository keys for NAT-FW Traversal settings +#include +#include +#include "wpnatfwitem.h" +#include "natfwdomainspecificitem.h" +#include "natfwiapspecificitem.h" +#include "natfwdefaults.h" +#include "wpnatfwdebug.h" +#include "stunserveritem.h" +#include "turnserveritem.h" + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------------------------- +// CWPNATFWItem::NewL +// +// --------------------------------------------------------------------------- +// +CWPNATFWItem* CWPNATFWItem::NewL() + { + CWPNATFWItem* self = new (ELeave) CWPNATFWItem; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CWPNATFWItem::ConstructL +// +// --------------------------------------------------------------------------- +// +void CWPNATFWItem::ConstructL() + { + DBG_PRINT( "CWPNATFWItem::ConstructL - begin" ); + // Initialization with empty string or KNotSaved + iItemId = TUint( KNotSaved ); + iName = HBufC::NewL( 0 ); + iAppRef = HBufC8::NewL( 0 ); + iSaveData = HBufC8::NewL( 0 ); + iSavedDomainId = HBufC8::NewL( 0 ); + DBG_PRINT( "CWPNATFWItem::ConstructL - end" ); + } + +// --------------------------------------------------------------------------- +// CWPNATFWItem::~CWPNATFWItem +// +// --------------------------------------------------------------------------- +// +CWPNATFWItem::~CWPNATFWItem() + { + DBG_PRINT( "CWPNATFWItem::~CWPNATFWItem - begin" ); + iDomainItems.ResetAndDestroy(); + iDomainItems.Close(); + iIAPItems.ResetAndDestroy(); + iIAPItems.Close(); + delete iName; + delete iAppRef; + delete iSaveData; + delete iSavedDomainId; + DBG_PRINT( "CWPNATFWItem::~CWPNATFWItem - end" ); + } + +// --------------------------------------------------------------------------- +// CWPNATFWItem::SetItemId +// +// --------------------------------------------------------------------------- +// +void CWPNATFWItem::SetItemId( TUint aItemId ) + { + iItemId = aItemId; + } + +// --------------------------------------------------------------------------- +// CWPNATFWItem::SetNameL +// +// --------------------------------------------------------------------------- +// +void CWPNATFWItem::SetNameL( const TDesC& aName ) + { + delete iName; + iName = NULL; + iName = aName.AllocL(); + } + +// --------------------------------------------------------------------------- +// CWPNATFWItem::SetAppRefL +// +// --------------------------------------------------------------------------- +// +void CWPNATFWItem::SetAppRefL( const TDesC8& aAppRef ) + { + delete iAppRef; + iAppRef = NULL; + iAppRef = aAppRef.AllocL(); + } + +// --------------------------------------------------------------------------- +// CWPNATFWItem::AppRef +// +// --------------------------------------------------------------------------- +// +const TDesC8& CWPNATFWItem::AppRef() const + { + return *iAppRef; + } + +// --------------------------------------------------------------------------- +// CWPNATFWItem::AddDomainSpecific +// +// --------------------------------------------------------------------------- +// +void CWPNATFWItem::AddDomainSpecificL( CNATFWDomainSpecificItem* + aNATFWDomainSpecificItem ) + { + __ASSERT_ALWAYS( aNATFWDomainSpecificItem != NULL, + User::Leave( KErrArgument ) ); + iDomainItems.AppendL( aNATFWDomainSpecificItem ); + } + +// --------------------------------------------------------------------------- +// CWPNATFWItem::AddIAPSpecific +// +// --------------------------------------------------------------------------- +// +void CWPNATFWItem::AddIAPSpecificL( CNATFWIAPSpecificItem* + aNATFWIAPSpecificItem ) + { + __ASSERT_ALWAYS( aNATFWIAPSpecificItem != NULL, + User::Leave( KErrArgument ) ); + iIAPItems.AppendL( aNATFWIAPSpecificItem ); + } + +// --------------------------------------------------------------------------- +// CWPNATFWItem::IAPItems +// +// --------------------------------------------------------------------------- +// +const RPointerArray& CWPNATFWItem::IAPItems() const + { + return iIAPItems; + } + +// --------------------------------------------------------------------------- +// CWPNATFWItem::Name +// +// --------------------------------------------------------------------------- +// +const TDesC& CWPNATFWItem::Name() const + { + return *iName; + } + +// --------------------------------------------------------------------------- +// CWPNATFWItem::ItemId +// +// --------------------------------------------------------------------------- +// +TUint CWPNATFWItem::ItemId() const + { + return iItemId; + } + +// --------------------------------------------------------------------------- +// CWPNATFWItem::CreateIceSettingsL +// +// --------------------------------------------------------------------------- +// +void CWPNATFWItem::CreateIceSettingsL( CRepository* aRepository, TInt aIndex, + TUint aKey ) + { + __ASSERT_ALWAYS( aRepository != NULL, User::Leave( KErrBadHandle ) ); + + DBG_PRINT( "CWPNATFWItem::CreateIceSettingsL - begin" ); + TUint32 currentDomainKey( KErrNone ); + currentDomainKey = aKey|KUNSAFProtocolsDomainMask; + currentDomainKey &= KUNSAFProtocolsKeyMask; + + // ============================== + // ICE: NatUtilities + // ============================== + // + User::LeaveIfError( aRepository->Create( + currentDomainKey|KUNSAFProtocolsNATUtilities, + iDomainItems[aIndex]->NatUtilities() ) ); + + // ============================== + // ICE: Host preference + // ============================== + // + User::LeaveIfError( aRepository->Create( + currentDomainKey|KUNSAFProtocolsHostPref, + iDomainItems[aIndex]->HostPref() ) ); + + // ============================== + // ICE: Server-reflexive preference + // ============================== + // + User::LeaveIfError( aRepository->Create( + currentDomainKey|KUNSAFProtocolsServerRefPref, + iDomainItems[aIndex]->ServerRefPref() ) ); + + // ============================== + // ICE: Relay-preference + // ============================== + // + User::LeaveIfError( aRepository->Create( + currentDomainKey|KUNSAFProtocolsRelayPref, + iDomainItems[aIndex]->RelayPref() ) ); + + // ============================== + // ICE: Peer-reflexive preference + // ============================== + // + User::LeaveIfError( aRepository->Create( + currentDomainKey|KUNSAFProtocolsPeerRefPref, + iDomainItems[aIndex]->PeerRefPref() ) ); + + // ============================== + // ICE: IPv4 preference + // ============================== + // + User::LeaveIfError( aRepository->Create( + currentDomainKey|KUNSAFProtocolsIPV4Pref, + iDomainItems[aIndex]->IPv4Pref() ) ); + + // ============================== + // ICE: IPv6 preference + // ============================== + // + User::LeaveIfError( aRepository->Create( + currentDomainKey|KUNSAFProtocolsIPV6Pref, + iDomainItems[aIndex]->IPv6Pref() ) ); + + // ============================== + // ICE: VPN preference + // ============================== + // + User::LeaveIfError( aRepository->Create( + currentDomainKey|KUNSAFProtocolsVPNPref, + iDomainItems[aIndex]->VpnPref() ) ); + + // ============================== + // ICE: UDP preference + // ============================== + // + User::LeaveIfError( aRepository->Create( + currentDomainKey|KUNSAFProtocolsUDPPref, + iDomainItems[aIndex]->UdpPref() ) ); + + // ============================== + // ICE: TCP preference + // ============================== + // + User::LeaveIfError( aRepository->Create( + currentDomainKey|KUNSAFProtocolsTCPPref, + iDomainItems[aIndex]->TcpPref() ) ); + + // ============================== + // ICE: TCP-active preference + // ============================== + // + User::LeaveIfError( aRepository->Create( + currentDomainKey|KUNSAFProtocolsTCPActivePref, + iDomainItems[aIndex]->TcpActivePref() ) ); + + // ============================== + // ICE: TCP-passive preference + // ============================== + // + User::LeaveIfError( aRepository->Create( + currentDomainKey|KUNSAFProtocolsTCPPassivePref, + iDomainItems[aIndex]->TcpPassivePref() ) ); + + // ============================== + // ICE: TCP-simultaneous-open preference + // ============================== + // + User::LeaveIfError( aRepository->Create( + currentDomainKey|KUNSAFProtocolsTCPSimultPref, + iDomainItems[aIndex]->TcpSimultPref() ) ); + + DBG_PRINT( "CWPNATFWItem::CreateIceSettingsL - end" ); + } + +// --------------------------------------------------------------------------- +// CWPNATFWItem::CreateTurnSettingsL +// +// --------------------------------------------------------------------------- +// +void CWPNATFWItem::CreateTurnSettingsL( CRepository* aRepository, TInt aIndex, + TUint aKey ) + { + __ASSERT_ALWAYS( aRepository != NULL, User::Leave( KErrBadHandle ) ); + + DBG_PRINT( "CWPNATFWItem::CreateTurnSettingsL - begin" ); + TUint32 currentDomainKey( KErrNone ); + currentDomainKey = aKey|KUNSAFProtocolsDomainMask; + currentDomainKey &= KUNSAFProtocolsKeyMask; + + iDomainItems[aIndex]->StoreTurnServerItemsL( aRepository, + currentDomainKey ); + + DBG_PRINT( "CWPNATFWItem::CreateTurnSettingsL - end" ); + } + +// --------------------------------------------------------------------------- +// CWPNATFWItem::CreateStunSettingsL +// +// --------------------------------------------------------------------------- +// +void CWPNATFWItem::CreateStunSettingsL( CRepository* aRepository, TInt aIndex, + TUint aKey, HBufC8* aTmpSavedata ) + { + __ASSERT_ALWAYS( aRepository != NULL, User::Leave( KErrBadHandle ) ); + __ASSERT_ALWAYS( aTmpSavedata != NULL, User::Leave( KErrArgument ) ); + + DBG_PRINT( "CWPNATFWItem::CreateStunSettingsL - begin" ); + TUint32 currentDomainKey( KErrNone ); + currentDomainKey = aKey|KUNSAFProtocolsDomainMask; + currentDomainKey &= KUNSAFProtocolsKeyMask; + + TUint32 currentNewDomainKey = currentDomainKey; + currentNewDomainKey = aKey|KUNSAFProtocolsFieldTypeMask; + currentNewDomainKey ^= KUNSAFProtocolsFieldTypeMask; + + TUint32 stunKey; + stunKey = KUNSAFProtocolsSubTableFieldTypeMask; + stunKey ^= KUNSAFProtocolsSubTableFieldTypeMask; + stunKey |= currentNewDomainKey; + + // Store "additional STUN servers". + iDomainItems[aIndex]->StoreStunServerItemsL( aRepository, stunKey, + currentNewDomainKey ); + + // ============================== + // STUNServerAddress + // ============================== + // + User::LeaveIfError( aRepository->Create( + KUNSAFProtocolsSTUNServerMask|currentDomainKey, + iDomainItems[aIndex]->GetSTUNAddr() ) ); + + // Set the same value into STUN server table. + User::LeaveIfError( aRepository->Create( + KUNSAFProtocolsSTUNAddressMask|stunKey, + iDomainItems[aIndex]->GetSTUNAddr() ) ); + + // ============================== + // STUNServerPort + // ============================== + // + User::LeaveIfError( aRepository->Create( + KUNSAFProtocolsSTUNServerPortMask|currentDomainKey, + ( TInt )iDomainItems[aIndex]->GetSTUNPort() ) ); + + // Set the same value into STUN server table. + User::LeaveIfError( aRepository->Create( + KUNSAFProtocolsSTUNPortMask|stunKey, + ( TInt )iDomainItems[aIndex]->GetSTUNPort() ) ); + + // ============================== + // NATRefreshUDP + // ============================== + // + User::LeaveIfError( aRepository->Create( + KUNSAFProtocolsDomainIntervalUDPMask|currentDomainKey, + iDomainItems[aIndex]->GetNATRefreshUDP() ) ); + + // ============================== + // NATRefreshTCP + // ============================== + // + User::LeaveIfError( aRepository->Create( + KUNSAFProtocolsDomainIntervalTCPMask|currentDomainKey, + iDomainItems[aIndex]->GetNATRefreshTCP() ) ); + + // ============================== + // EnableCRLFRefresh + // ============================== + // + User::LeaveIfError( aRepository->Create( + KUNSAFProtocolsDomainEnableCRLFRefresh|currentDomainKey, + iDomainItems[aIndex]->GetEnableCRLFRefresh() ) ); + + // ============================== + // STUNServerUsername + // ============================== + // + User::LeaveIfError( aRepository->Create( + KUNSAFProtocolsSTUNUsernameMask|stunKey, + iDomainItems[aIndex]->GetSTUNUsername() ) ); + + // ============================== + // STUNServerPassword + // ============================== + // + User::LeaveIfError( aRepository->Create( + KUNSAFProtocolsSTUNPasswordMask|stunKey, + iDomainItems[aIndex]->GetSTUNPassword() ) ); + + // ============================== + // STUNSharedSecret + // ============================== + // + User::LeaveIfError( aRepository->Create( currentDomainKey| + KUNSAFProtocolsDomainSharedSecretNotSupported, + iDomainItems[aIndex]->DisableStunSharedSecret() ) ); + + // ============================== + // StartPortRange + // ============================== + // + User::LeaveIfError( aRepository->Create( + currentDomainKey|KUNSAFProtocolsPortPoolStartPortMask, + iDomainItems[aIndex]->StartPortRange() ) ); + + // ============================== + // EndPortRange + // ============================== + // + User::LeaveIfError( aRepository->Create( + currentDomainKey|KUNSAFProtocolsPortPoolEndPortMask, + iDomainItems[aIndex]->EndPortRange() ) ); + + // ============================== + // UsedNATProtocol + // ============================== + // + User::LeaveIfError( aRepository->Create( + currentDomainKey|KUNSAFProtocolsUsedNATProtocolMask, + iDomainItems[aIndex]->UsedNatProtocol() ) ); + + if ( 0 == aIndex ) + { + HBufC8* tmpId = HBufC8::NewL( KMaxCharsInTUint32 ); + + // APPREF is always reference to first domain specific + // characteristic. + tmpId->Des().AppendNum( + currentDomainKey|KUNSAFProtocolsDomainMask ); + delete iSavedDomainId; + iSavedDomainId = NULL; + iSavedDomainId = tmpId; + tmpId = NULL; + } + DBG_PRINT( "CWPNATFWItem::CreateStunSettingsL - end" ); + } + +// --------------------------------------------------------------------------- +// CWPNATFWItem::CreateIapSettingsL +// +// --------------------------------------------------------------------------- +// +void CWPNATFWItem::CreateIapSettingsL( CRepository* aRepository, + HBufC8* aTmpSavedata ) + { + __ASSERT_ALWAYS( aRepository != NULL, User::Leave( KErrBadHandle ) ); + __ASSERT_ALWAYS( aTmpSavedata != NULL, User::Leave( KErrArgument ) ); + + DBG_PRINT( "CWPNATFWItem::CreateIapSettingsL - begin" ); + for ( TInt counter = 0; counter < iIAPItems.Count(); counter++ ) + { + RArray keys; + CleanupClosePushL( keys ); + + // Get next free IAP key + aRepository->FindL( KUNSAFProtocolsIAPIdMask, + KUNSAFProtocolsFieldTypeMask, keys ); + TInt keyCount = keys.Count(); + TUint32 tmp ( 0 ); + if ( keyCount > 0 ) + { + tmp = keys[keyCount - 1] + 1; + } + else + { + tmp = KUNSAFProtocolsIAPTableMask; + } + + TUint32 currentIAPKey( KErrNone ); + currentIAPKey = tmp|KUNSAFProtocolsIAPIdMask; + currentIAPKey &= KUNSAFProtocolsKeyMask; + + // ============================== + // IAPId + // ============================== + // + User::LeaveIfError( aRepository->Create( + currentIAPKey|KUNSAFProtocolsIAPIdMask, + (TInt)iIAPItems[counter]->GetIAPId() ) ); + + aTmpSavedata->Des().AppendNumFixedWidth( + currentIAPKey|KUNSAFProtocolsIAPIdMask, + EDecimal, KMaxCharsInTUint32 ); + + // ============================== + // IntervalUDP + // ============================== + // + + // If there are no domain entries and no value for UDP + // refresh interval has been set for IAP item, use default value. + if ( ( 0 == iDomainItems.Count() ) && + KNotSet == iIAPItems[counter]->GetIntervalUDP() ) + { + iIAPItems[counter]->SetIntervalUDP( + KDefaultUDPRefreshInterval ); + } + if ( KNotSet != iIAPItems[counter]->GetIntervalUDP() ) + { + User::LeaveIfError( aRepository->Create( + KUNSAFProtocolsIntervalUDPMask|currentIAPKey, + iIAPItems[counter]->GetIntervalUDP() ) ); + } + + // ============================== + // IntervalTCP + // ============================== + // + + // If there are no domain entries and no value for TCP + // refresh interval has been set for IAP item, use default value. + if ( ( 0 == iDomainItems.Count() ) && + KNotSet == iIAPItems[counter]->GetIntervalTCP() ) + { + iIAPItems[counter]->SetIntervalTCP( + KDefaultTCPRefreshInterval ); + } + if ( KNotSet != iIAPItems[counter]->GetIntervalTCP() ) + { + User::LeaveIfError( aRepository->Create( + KUNSAFProtocolsIntervalTCPMask|currentIAPKey, + iIAPItems[counter]->GetIntervalTCP() ) ); + } + + // ============================== + // STUNRetransmitTimer + // ============================== + // + User::LeaveIfError( aRepository->Create( + KUNSAFProtocolsSTUNRetransmitTimerMask| + currentIAPKey, iIAPItems[counter]-> + GetSTUNRetransmitTimer() ) ); + keys.Close(); + CleanupStack::PopAndDestroy( &keys ); + }//for + DBG_PRINT( "CWPNATFWItem::CreateIapSettingsL - end" ); + } + +// --------------------------------------------------------------------------- +// CWPNATFWItem::UpdateIceSettingsL +// +// --------------------------------------------------------------------------- +// +void CWPNATFWItem::UpdateIceSettingsL( CRepository* aRepository, TInt aIndex, + TUint aKey ) + { + __ASSERT_ALWAYS( aRepository != NULL, User::Leave( KErrBadHandle ) ); + + DBG_PRINT( "CWPNATFWItem::UpdateIceSettingsL - begin" ); + TUint32 currentDomainKey( KErrNone ); + currentDomainKey = aKey|KUNSAFProtocolsDomainMask; + currentDomainKey &= KUNSAFProtocolsKeyMask; + TInt err ( KErrNone ); + + // ============================== + // ICE: NAT Utilities + // ============================== + // + err = aRepository->Set( + currentDomainKey|KUNSAFProtocolsNATUtilities, + iDomainItems[aIndex]->NatUtilities() ); + if ( KErrNotFound == err ) + { + err = aRepository->Create( + currentDomainKey|KUNSAFProtocolsNATUtilities, + iDomainItems[aIndex]->NatUtilities() ); + } + User::LeaveIfError( err ); + + // ============================== + // ICE: Host preference + // ============================== + // + err = aRepository->Set( + currentDomainKey|KUNSAFProtocolsHostPref, + iDomainItems[aIndex]->HostPref() ); + if ( KErrNotFound == err ) + { + err = aRepository->Create( + currentDomainKey|KUNSAFProtocolsHostPref, + iDomainItems[aIndex]->HostPref() ); + } + User::LeaveIfError( err ); + + // ============================== + // ICE: Server-reflexive preference + // ============================== + // + err = aRepository->Set( + currentDomainKey|KUNSAFProtocolsServerRefPref, + iDomainItems[aIndex]->ServerRefPref() ); + if ( KErrNotFound == err ) + { + err = aRepository->Create( + currentDomainKey|KUNSAFProtocolsServerRefPref, + iDomainItems[aIndex]->ServerRefPref() ); + } + User::LeaveIfError( err ); + + // ============================== + // ICE: Relay-preference + // ============================== + // + err = aRepository->Set( + currentDomainKey|KUNSAFProtocolsRelayPref, + iDomainItems[aIndex]->RelayPref() ); + if ( KErrNotFound == err ) + { + err = aRepository->Create( + currentDomainKey|KUNSAFProtocolsRelayPref, + iDomainItems[aIndex]->RelayPref() ); + } + User::LeaveIfError( err ); + + // ============================== + // ICE: Peer-reflexive preference + // ============================== + // + err = aRepository->Set( + currentDomainKey|KUNSAFProtocolsPeerRefPref, + iDomainItems[aIndex]->PeerRefPref() ); + if ( KErrNotFound == err ) + { + err = aRepository->Create( + currentDomainKey|KUNSAFProtocolsPeerRefPref, + iDomainItems[aIndex]->PeerRefPref() ); + } + User::LeaveIfError( err ); + + // ============================== + // ICE: IPv4 preference + // ============================== + // + err = aRepository->Set( + currentDomainKey|KUNSAFProtocolsIPV4Pref, + iDomainItems[aIndex]->IPv4Pref() ); + if ( KErrNotFound == err ) + { + err = aRepository->Create( + currentDomainKey|KUNSAFProtocolsIPV4Pref, + iDomainItems[aIndex]->IPv4Pref() ); + } + User::LeaveIfError( err ); + + // ============================== + // ICE: IPv6 preference + // ============================== + // + err = aRepository->Set( + currentDomainKey|KUNSAFProtocolsIPV6Pref, + iDomainItems[aIndex]->IPv6Pref() ); + if ( KErrNotFound == err ) + { + err = aRepository->Create( + currentDomainKey|KUNSAFProtocolsIPV6Pref, + iDomainItems[aIndex]->IPv6Pref() ); + } + User::LeaveIfError( err ); + + // ============================== + // ICE: VPN preference + // ============================== + // + err = aRepository->Set( + currentDomainKey|KUNSAFProtocolsVPNPref, + iDomainItems[aIndex]->VpnPref() ); + if ( KErrNotFound == err ) + { + err = aRepository->Create( + currentDomainKey|KUNSAFProtocolsVPNPref, + iDomainItems[aIndex]->VpnPref() ); + } + User::LeaveIfError( err ); + + // ============================== + // ICE: UDP preference + // ============================== + // + err = aRepository->Set( + currentDomainKey|KUNSAFProtocolsUDPPref, + iDomainItems[aIndex]->UdpPref() ); + if ( KErrNotFound == err ) + { + err = aRepository->Create( + currentDomainKey|KUNSAFProtocolsUDPPref, + iDomainItems[aIndex]->UdpPref() ); + } + User::LeaveIfError( err ); + + // ============================== + // ICE: TCP preference + // ============================== + // + err = aRepository->Set( + currentDomainKey|KUNSAFProtocolsTCPPref, + iDomainItems[aIndex]->TcpPref() ); + if ( KErrNotFound == err ) + { + err = aRepository->Create( + currentDomainKey|KUNSAFProtocolsTCPPref, + iDomainItems[aIndex]->TcpPref() ); + } + User::LeaveIfError( err ); + + // ============================== + // ICE: TCP-active preference + // ============================== + // + err = aRepository->Set( + currentDomainKey|KUNSAFProtocolsTCPActivePref, + iDomainItems[aIndex]->TcpActivePref() ); + if ( KErrNotFound == err ) + { + err = aRepository->Create( + currentDomainKey|KUNSAFProtocolsTCPActivePref, + iDomainItems[aIndex]->TcpActivePref() ); + } + User::LeaveIfError( err ); + + // ============================== + // ICE: TCP-passive preference + // ============================== + // + err = aRepository->Set( + currentDomainKey|KUNSAFProtocolsTCPPassivePref, + iDomainItems[aIndex]->TcpPassivePref() ); + if ( KErrNotFound == err ) + { + err = aRepository->Create( + currentDomainKey|KUNSAFProtocolsTCPPassivePref, + iDomainItems[aIndex]->TcpPassivePref() ); + } + User::LeaveIfError( err ); + + // ============================== + // ICE: TCP-simultaneous-open preference + // ============================== + // + err = aRepository->Set( + currentDomainKey|KUNSAFProtocolsTCPSimultPref, + iDomainItems[aIndex]->TcpSimultPref() ); + if ( KErrNotFound == err ) + { + err = aRepository->Create( + currentDomainKey|KUNSAFProtocolsTCPSimultPref, + iDomainItems[aIndex]->TcpSimultPref() ); + } + User::LeaveIfError( err ); + + DBG_PRINT( "CWPNATFWItem::UpdateIceSettingsL - end" ); + } + +// --------------------------------------------------------------------------- +// CWPNATFWItem::UpdateTurnSettingsL +// +// --------------------------------------------------------------------------- +// +void CWPNATFWItem::UpdateTurnSettingsL( CRepository* aRepository, TInt aIndex, + TUint aKey ) + { + __ASSERT_ALWAYS( aRepository != NULL, User::Leave( KErrBadHandle ) ); + + DBG_PRINT( "CWPNATFWItem::UpdateTurnSettingsL - begin" ); + TUint32 currentDomainKey( KErrNone ); + currentDomainKey = aKey|KUNSAFProtocolsDomainMask; + currentDomainKey &= KUNSAFProtocolsKeyMask; + + iDomainItems[aIndex]->StoreTurnServerItemsL( aRepository, + currentDomainKey ); + + DBG_PRINT( "CWPNATFWItem::UpdateTurnSettingsL - end" ); + } + +// --------------------------------------------------------------------------- +// CWPNATFWItem::UpdateStunSettingsL +// +// --------------------------------------------------------------------------- +// +void CWPNATFWItem::UpdateStunSettingsL( CRepository* aRepository, TInt aIndex, + TUint aKey, HBufC8* aTmpSavedata ) + { + __ASSERT_ALWAYS( aRepository != NULL, User::Leave( KErrBadHandle ) ); + __ASSERT_ALWAYS( aTmpSavedata != NULL, User::Leave( KErrArgument ) ); + + DBG_PRINT( "CWPNATFWItem::UpdateStunSettingsL - begin" ); + TUint32 currentDomainKey( KErrNone ); + currentDomainKey = aKey|KUNSAFProtocolsDomainMask; + currentDomainKey &= KUNSAFProtocolsKeyMask; + + TUint32 currentNewDomainKey = currentDomainKey; + currentNewDomainKey = aKey|KUNSAFProtocolsFieldTypeMask; + currentNewDomainKey ^= KUNSAFProtocolsFieldTypeMask; + + TUint32 stunKey; + stunKey = KUNSAFProtocolsSubTableFieldTypeMask; + stunKey ^= KUNSAFProtocolsSubTableFieldTypeMask; + stunKey |= currentNewDomainKey; + + // Store "additional STUN servers". + iDomainItems[aIndex]->StoreStunServerItemsL( aRepository, stunKey, + currentNewDomainKey ); + + TInt err ( KErrNone ); + + // ============================== + // STUNServerAddress + // ============================== + // + err = aRepository->Set( + KUNSAFProtocolsSTUNServerMask|currentDomainKey, + iDomainItems[aIndex]->GetSTUNAddr() ); + if ( KErrNotFound == err ) + { + err = aRepository->Create( + KUNSAFProtocolsSTUNServerMask|currentDomainKey, + iDomainItems[aIndex]->GetSTUNAddr() ); + } + User::LeaveIfError( err ); + + // Set the same value into STUN server table. + err = aRepository->Set( + KUNSAFProtocolsSTUNAddressMask|stunKey, + iDomainItems[aIndex]->GetSTUNAddr() ); + if ( KErrNotFound == err ) + { + err = aRepository->Create( + KUNSAFProtocolsSTUNAddressMask|stunKey, + iDomainItems[aIndex]->GetSTUNAddr() ); + } + User::LeaveIfError( err ); + + // ============================== + // STUNServerPort + // ============================== + // + err = aRepository->Set( + KUNSAFProtocolsSTUNServerPortMask|currentDomainKey, + ( TInt )iDomainItems[aIndex]->GetSTUNPort() ); + if ( KErrNotFound == err ) + { + err = aRepository->Create( + KUNSAFProtocolsSTUNServerPortMask|currentDomainKey, + ( TInt )iDomainItems[aIndex]->GetSTUNPort() ); + } + User::LeaveIfError( err ); + + // Set the same value into STUN server table. + err = aRepository->Set( + KUNSAFProtocolsSTUNPortMask|stunKey, + ( TInt )iDomainItems[aIndex]->GetSTUNPort() ); + if ( KErrNotFound == err ) + { + err = aRepository->Create( + KUNSAFProtocolsSTUNPortMask|stunKey, + ( TInt )iDomainItems[aIndex]->GetSTUNPort() ); + } + User::LeaveIfError( err ); + + // ============================== + // NATRefreshUDP + // ============================== + // + err = aRepository->Set( + KUNSAFProtocolsDomainIntervalUDPMask|currentDomainKey, + iDomainItems[aIndex]->GetNATRefreshUDP() ); + if ( KErrNotFound == err ) + { + err = aRepository->Create( + KUNSAFProtocolsDomainIntervalUDPMask|currentDomainKey, + iDomainItems[aIndex]->GetNATRefreshUDP() ); + } + User::LeaveIfError( err ); + + // ============================== + // NATRefreshTCP + // ============================== + // + err = aRepository->Set( + KUNSAFProtocolsDomainIntervalTCPMask|currentDomainKey, + iDomainItems[aIndex]->GetNATRefreshTCP() ); + if ( KErrNotFound == err ) + { + err = aRepository->Create( + KUNSAFProtocolsDomainIntervalTCPMask|currentDomainKey, + iDomainItems[aIndex]->GetNATRefreshTCP() ); + } + User::LeaveIfError( err ); + + // ============================== + // EnableCRLFRefresh + // ============================== + // + err = aRepository->Set( + KUNSAFProtocolsDomainEnableCRLFRefresh| + currentDomainKey, iDomainItems[aIndex]-> + GetEnableCRLFRefresh() ); + if ( KErrNotFound == err ) + { + err = aRepository->Create( + KUNSAFProtocolsDomainEnableCRLFRefresh|currentDomainKey, + iDomainItems[aIndex]->GetEnableCRLFRefresh() ); + } + User::LeaveIfError( err ); + + // ============================== + // STUNServerUsername + // ============================== + // + err = aRepository->Set( + KUNSAFProtocolsSTUNUsernameMask|stunKey, + iDomainItems[aIndex]->GetSTUNUsername() ); + if ( KErrNotFound == err ) + { + err = aRepository->Create( + KUNSAFProtocolsSTUNUsernameMask|stunKey, + iDomainItems[aIndex]->GetSTUNUsername() ); + } + User::LeaveIfError( err ); + + // ============================== + // STUNServerPassword + // ============================== + // + err = aRepository->Set( + KUNSAFProtocolsSTUNPasswordMask|stunKey, + iDomainItems[aIndex]->GetSTUNPassword() ); + if ( KErrNotFound == err ) + { + err = aRepository->Create( + KUNSAFProtocolsSTUNPasswordMask|stunKey, + iDomainItems[aIndex]->GetSTUNPassword() ); + + } + User::LeaveIfError( err ); + + // ============================== + // STUNSharedSecret + // ============================== + // + err = aRepository->Set( currentDomainKey| + KUNSAFProtocolsDomainSharedSecretNotSupported, + iDomainItems[aIndex]->DisableStunSharedSecret() ); + if ( KErrNotFound == err ) + { + err = aRepository->Create( currentDomainKey| + KUNSAFProtocolsDomainSharedSecretNotSupported, + iDomainItems[aIndex]->DisableStunSharedSecret() ); + } + User::LeaveIfError( err ); + + // ============================== + // StartPortRange + // ============================== + // + err = aRepository->Set( + currentDomainKey|KUNSAFProtocolsPortPoolStartPortMask, + iDomainItems[aIndex]->StartPortRange() ); + if ( KErrNotFound == err ) + { + err = aRepository->Create( + currentDomainKey|KUNSAFProtocolsPortPoolStartPortMask, + iDomainItems[aIndex]->StartPortRange() ); + } + User::LeaveIfError( err ); + + // ============================== + // EndPortRange + // ============================== + // + err = aRepository->Set( + currentDomainKey|KUNSAFProtocolsPortPoolEndPortMask, + iDomainItems[aIndex]->EndPortRange() ); + if ( KErrNotFound == err ) + { + err = aRepository->Create( + currentDomainKey|KUNSAFProtocolsPortPoolEndPortMask, + iDomainItems[aIndex]->EndPortRange() ); + } + User::LeaveIfError( err ); + + // ============================== + // UsedNATProtocol + // ============================== + // + err = aRepository->Set( + currentDomainKey|KUNSAFProtocolsUsedNATProtocolMask, + iDomainItems[aIndex]->UsedNatProtocol() ); + if ( KErrNotFound == err ) + { + err = aRepository->Create( + currentDomainKey|KUNSAFProtocolsUsedNATProtocolMask, + iDomainItems[aIndex]->UsedNatProtocol() ); + } + User::LeaveIfError( err ); + + if ( 0 == aIndex ) + { + HBufC8* tmpId = HBufC8::NewL( KMaxCharsInTUint32 ); + + // APPREF is always reference to first domain specific + // characteristic. + + tmpId->Des().AppendNum( + currentDomainKey|KUNSAFProtocolsDomainMask ); + + delete iSavedDomainId; + iSavedDomainId = NULL; + iSavedDomainId = tmpId; + tmpId = NULL; + } + + DBG_PRINT( "CWPNATFWItem::UpdateStunSettingsL - end" ); + } + +// --------------------------------------------------------------------------- +// CWPNATFWItem::StoreL +// 1) Save domain specific settings. +// 2) Save iap specific settings. +// --------------------------------------------------------------------------- +// +void CWPNATFWItem::StoreL() + { + DBG_PRINT( "CWPNATFWItem::StoreL - begin" ); + + // Central Repository for NAT-FW Traversal settings + CRepository* rep = CRepository::NewLC( KCRUidUNSAFProtocols ); // CS:1 + + // For savedata + HBufC8* tmpSavedata = HBufC8::NewLC( KMaxCharsInTUint32 * + ( iIAPItems.Count() + iDomainItems.Count() ) ); // CS:2 + + // ============================== + // DomainSpecific + // add commands + // ============================== + // + for ( TInt counter = 0; counter < iDomainItems.Count(); counter++ ) + { + DBG_PRINT( "CWPNATFWItem::StoreL - Save DomainSpecific settings.." ); + + RArray keys; + CleanupClosePushL( keys ); // CS:3 + + // Get next free Domain key. + rep->FindL( KUNSAFProtocolsDomainMask, + KUNSAFProtocolsFieldTypeMask, keys ); + TInt keyCount = keys.Count(); + TInt tmp = 0; + if ( keyCount > 0 ) + { + tmp = keys[keyCount - 1] + 1; + } + else + { + tmp = KUNSAFProtocolsDomainTableMask; + } + + DBG_PRINT_2( "CWPNATFWItem::StoreL - Domain key is %d", tmp ); + // Before adding check whether there already are settings + // for this domain. + rep->FindEqL( KUNSAFProtocolsDomainMask, KUNSAFProtocolsFieldTypeMask, + iDomainItems[counter]->GetDomain(), keys ); + TBool updateValue ( EFalse ); + if ( keys.Count() ) + { + tmp = keys[0]; + updateValue = ETrue; + } + + if ( !updateValue ) + { + // Domain + TUint32 currentDomainKey( KErrNone ); + currentDomainKey = tmp|KUNSAFProtocolsDomainMask; + currentDomainKey &= KUNSAFProtocolsKeyMask; + + User::LeaveIfError( rep->Create( + currentDomainKey|KUNSAFProtocolsDomainMask, + iDomainItems[counter]->GetDomain() ) ); + + // Append to saved keys if creation was successful. + tmpSavedata->Des().AppendNumFixedWidth( currentDomainKey| + KUNSAFProtocolsDomainMask, EDecimal, KMaxCharsInTUint32 ); + + // STUN + CreateStunSettingsL( rep, counter, tmp, tmpSavedata ); + + // ICE + CreateIceSettingsL( rep, counter, tmp ); + + // TURN + CreateTurnSettingsL( rep, counter, tmp ); + } + else + { + // Domain + TUint32 currentDomainKey( KErrNone ); + currentDomainKey = tmp|KUNSAFProtocolsDomainMask; + currentDomainKey &= KUNSAFProtocolsKeyMask; + + User::LeaveIfError( rep->Set( + currentDomainKey|KUNSAFProtocolsDomainMask, + iDomainItems[counter]->GetDomain() ) ); + + tmpSavedata->Des().AppendNumFixedWidth( + currentDomainKey|KUNSAFProtocolsDomainMask, + EDecimal, KMaxCharsInTUint32 ); + + // STUN + UpdateStunSettingsL( rep, counter, tmp, tmpSavedata ); + + // ICE + UpdateIceSettingsL( rep, counter, tmp ); + + // TURN + UpdateTurnSettingsL( rep, counter, tmp ); + } + + keys.Close(); + CleanupStack::PopAndDestroy( &keys ); // CS:2 + + DBG_PRINT( "CWPNATFWItem::StoreL - DomainSpecific settings saved." ); + } + + // ============================== + // IAPSpecific + // add commands + // ============================== + // + + CreateIapSettingsL( rep, tmpSavedata ); + + DBG_PRINT( "CWPNATFWItem::StoreL - IAP specific settings saved." ); + + // set whole savedata for possibility to delete settings afterwards. + if ( tmpSavedata->Length() ) + { + delete iSaveData; + iSaveData = NULL; + CleanupStack::Pop( tmpSavedata ); + iSaveData = tmpSavedata; + tmpSavedata = NULL; + } + else + { + CleanupStack::PopAndDestroy( tmpSavedata ); // CS:1 + } + CleanupStack::PopAndDestroy( rep ); // CS:0 + + DBG_PRINT( "CWPNATFWItem::StoreL - end" ); + } + +// --------------------------------------------------------------------------- +// CWPNATFWItem::SaveData +// +// --------------------------------------------------------------------------- +// +const TDesC8& CWPNATFWItem::SaveData() const + { + // In iSaveData we have all keys that are created/updated. + return *iSaveData; + } + +// --------------------------------------------------------------------------- +// CWPNATFWItem::SavedDomainId +// +// --------------------------------------------------------------------------- +// +const TDesC8& CWPNATFWItem::SavedDomainId() const + { + return *iSavedDomainId; + } + +// End of File