diff -r 000000000000 -r af10295192d8 tcpiputils/networkaddressandporttranslation/src/naptutil.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tcpiputils/networkaddressandporttranslation/src/naptutil.cpp Tue Jan 26 15:23:49 2010 +0200 @@ -0,0 +1,120 @@ +// Copyright (c) 2008-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: +// Implements client hardware address fetching. +// +// + +/** + @file + @internalTechnology +*/ +#include "naptutil.h" + +/** + * Fucntion to fetch the IP from CommsDb, and Traps any leave. + * @internalTechnology + * @param aIapId - IAP identifier + * @param aClientIp - Returns the fetched IP address + */ + +TInt TNaptUtil::GetClientIp(TInt aIapId, TUint32& aClientIp) +{ + TRAPD(err, GetClientIpFromCommsL(aIapId, aClientIp)); + return err; +} + + +/** + * Open the IAP record + * @internalTechnology + * @param aDbSession - Commsdb session + * @param aIapRecord - IAP record + * @param aIapId - IAP identifier + */ +void TNaptUtil::OpenIAPViewLC(CMDBSession*& aSession, CCDIAPRecord*& aIapRecord, TInt aIapId) + { +#ifdef SYMBIAN_NON_SEAMLESS_NETWORK_BEARER_MOBILITY + aSession = CMDBSession::NewLC(KCDVersion1_2); +#else + aSession = CMDBSession::NewLC(KCDVersion1_1); +#endif + + // Reveal hidden or private IAP records if a licensee has chosen to protect a record + // using one of these flags - the API to do this is public so internal components + // have to support the use of such records. + aSession->SetAttributeMask(ECDHidden | ECDPrivate); + + aIapRecord = static_cast(CCDRecordBase::RecordFactoryL(KCDTIdIAPRecord)); + CleanupStack::PushL(aIapRecord); + + aIapRecord->SetRecordId(aIapId); + + aIapRecord->LoadL(*aSession); + } +/** + * Initialize the service link + * @internalTechnology + * @param aDbSession - Commsdb session + * @param aIapRecord - IAP record + */ +void TNaptUtil::InitialServiceLinkL(CMDBSession* aDbSession, CCDIAPRecord* aIapRecord) + { + if (aIapRecord->iService.iLinkedRecord == 0) + { + const TDesC& servType = aIapRecord->iServiceType; + + if (servType.CompareF(TPtrC(KCDTypeNameLANService))==0) + { + aIapRecord->iService.iLinkedRecord = static_cast(CCDRecordBase::RecordFactoryL(KCDTIdLANServiceRecord)); + } + else + { + User::Leave(KErrBadName); + } + aIapRecord->iService.iLinkedRecord->SetRecordId(aIapRecord->iService); + } + aIapRecord->iService.iLinkedRecord->LoadL(*aDbSession); + } +/** + * Fetch the server IP address from comms and generate client ID + * @internalTechnology + * @param aIapId - IAP identifier + * @param aClientIp - Returns the fetched IP address + */ +void TNaptUtil::GetClientIpFromCommsL(TInt aIapId, TUint32& aClientIp) +{ + CMDBSession* session; + CCDIAPRecord* iap; + + // next call leaves session and iap object on cleanupstack + OpenIAPViewLC(session, iap, aIapId); + CCDServiceRecordBase* service = NULL; + InitialServiceLinkL(session, iap); + service = static_cast(iap->iService.iLinkedRecord); + TInt ignoreThis; + + CMDBField* cdbLoadBool = static_cast*>(service->GetFieldByNameL(KCDTypeNameIpAddr, ignoreThis)); + TInetAddr inetAddr; + inetAddr.Input(*cdbLoadBool); + TUint32 serverAddr = inetAddr.Address(); + TUint32 hostId = (serverAddr & ~KInetAddrNetMaskC) + 1; + if (hostId >= 255) + { + hostId = 1; + } + aClientIp = (serverAddr & KInetAddrNetMaskC) | hostId; + service = NULL; + CleanupStack::PopAndDestroy(iap); + CleanupStack::PopAndDestroy(session); +}