--- /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);
+}