tcpiputils/networkaddressandporttranslation/src/naptutil.cpp
changeset 0 af10295192d8
--- /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<CCDIAPRecord*>(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<CCDLANServiceRecord*>(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<CCDServiceRecordBase *>(iap->iService.iLinkedRecord);
+	TInt ignoreThis;
+
+	CMDBField<TDesC>* cdbLoadBool = static_cast<CMDBField<TDesC>*>(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);
+}