usbmgmt/usbmgr/device/classdrivers/ncm/classcontroller/src/ncmiapreader.cpp
branchRCL_3
changeset 15 f92a4f87e424
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/device/classdrivers/ncm/classcontroller/src/ncmiapreader.cpp	Tue Aug 31 17:01:47 2010 +0300
@@ -0,0 +1,210 @@
+/*
+* Copyright (c) 2010 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: 
+*
+*/
+
+/**
+ * @file
+ * @internalComponent
+ */
+
+#include <e32debug.h>
+#include <commdb.h>
+
+#ifdef OVERDUMMY_NCMCC
+#include <usb/testncmcc/dummy_essock.h>
+#else
+#include <commdbconnpref.h>
+#endif
+
+#include <commsdattypesv1_1.h> 
+
+#include "ncmiapreaderobserver.h"
+#include "ncmiapreader.h"
+
+// For OST Tracing
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "ncmiapreaderTraces.h"
+#endif
+
+
+_LIT(KNcmIapReaderPanic, "UsbNcmIapReader"); // must be <=16 chars
+
+// Panic codes
+enum TNcmIapReaderPanicCode
+    {
+    ENcmIapReaderPanicOutstandingRequest = 1,
+    ENcmIapReaderPanicTooManyIAPs = 2,
+    ENcmIapReaderEndMark
+    };
+
+// NCM configuration item names
+_LIT(KBearerNifName, "ethint");
+_LIT(KBearerLddFileName, "eusbcsc");
+_LIT(KBearerPktDrvName, "ncmpkt.drv");
+
+/**
+ * Constructs a CNcmIapReader object.
+ * @param aObserver An MNcmIAPReaderObserver instance which handles IAP reading completing
+ * @param aConnPref The reference of the NCM connection aConnPref
+ */
+CNcmIapReader::CNcmIapReader(MNcmIAPReaderObserver& aObserver, TCommDbConnPref& aConnPref)
+: CActive(CActive::EPriorityStandard),
+      iObserver(aObserver),
+      iConnPref(aConnPref)
+	{
+	OstTraceFunctionEntryExt( CNCMIAPREADER_CNCMIAPREADER_ENTRY, this );
+	CActiveScheduler::Add(this);		
+	OstTraceFunctionExit1( CNCMIAPREADER_CNCMIAPREADER_EXIT, this );
+	}
+
+/**
+ * Destructor.
+ */
+CNcmIapReader::~CNcmIapReader()
+	{
+	OstTraceFunctionEntry0( CNCMIAPREADER_CNCMIAPREADER_ENTRY_DESTRUCTOR );
+	
+	Cancel();
+	OstTraceFunctionExit0( CNCMIAPREADER_CNCMIAPREADER_ENTRY_DESTRUCTOR_EXIT );
+	}
+
+/**
+ * Start the connection.
+ */
+void CNcmIapReader::Start()
+	{
+	OstTraceFunctionEntry0( CNCMIAPREADER_START_ENTRY );
+	
+	__ASSERT_ALWAYS(!IsActive(), 
+	        User::Panic(KNcmIapReaderPanic, ENcmIapReaderPanicOutstandingRequest));
+    
+    SetActive();
+    TRequestStatus* status = &iStatus;
+    User::RequestComplete(status, KErrNone);
+	
+	OstTraceFunctionExit0( CNCMIAPREADER_START_EXIT );
+	}
+
+/**
+ * Implements cancellation of an outstanding request.
+ */
+void CNcmIapReader::DoCancel()
+	{
+	OstTraceFunctionEntry0( CNCMIAPREADER_DOCANCEL_ENTRY );
+	
+    TRequestStatus* status = &iStatus;
+    User::RequestComplete(status, KErrCancel);
+	OstTraceFunctionExit0( CNCMIAPREADER_DOCANCEL_EXIT );
+	}
+
+/**
+ * Simulate an async way and give
+ * the scheduler a chance to schedule all AOs.
+ */
+void CNcmIapReader::RunL()
+	{
+	OstTraceFunctionEntry0( CNCMIAPREADER_RUNL_ENTRY );
+	
+	// Reading
+	TRAPD(err, SearchNcmIapL())
+	OstTrace1( TRACE_NORMAL, CNCMIAPREADER_RUNL_GETIAP, "Get NCM IAP with error code %d", err );
+	
+
+	// Complete connection manager
+	iObserver.MicoHandleIAPReadingComplete(err);
+	OstTraceFunctionExit0( CNCMIAPREADER_RUNL_EXIT );
+	}
+
+/**
+ * Search NCM IAP in current commDB and set it into the ncm connection manager.
+ */
+void CNcmIapReader::SearchNcmIapL()
+    {
+    OstTraceFunctionEntry0( CNCMIAPREADER_GETNCMIAPIDL_ENTRY );
+    
+    using namespace CommsDat;
+    CMDBSession* dbs = CMDBSession::NewLC(KCDLatestVersion); // Current version is 1.1
+    
+    CMDBRecordSet<CCDLANBearerRecord>* lanBearerTable = 
+            new (ELeave) CMDBRecordSet<CCDLANBearerRecord>(KCDTIdLANBearerRecord);
+    CleanupStack::PushL(lanBearerTable);
+    // Load the table into memory
+    lanBearerTable->LoadL(*dbs);
+ 
+    TInt numLanBearers = lanBearerTable->iRecords.Count();    
+    OstTrace1( TRACE_NORMAL, CNCMIAPREADER_GETNCMIAPIDL_COUNT_LAN_BEARER, "Found %d Lan Bearer!", numLanBearers );
+    TInt chosenLanBearer = KErrNotFound;
+    TInt i = 0;
+    for(i = 0; i<numLanBearers; i++)
+        {
+        CCDLANBearerRecord* lanBearer = 
+                static_cast<CCDLANBearerRecord*>(lanBearerTable->iRecords[i]);
+        if ((lanBearer->iLanBearerNifName.GetL().Compare(KBearerNifName()) == 0) &&
+            (lanBearer->iLanBearerLddFilename.GetL().Compare(KBearerLddFileName()) == 0) &&
+            (lanBearer->iLanBearerPacketDriverName.GetL().Compare(KBearerPktDrvName()) == 0))
+            {
+            // Matched all check points. We found LAN bearer for NCM
+            chosenLanBearer = lanBearer->RecordId();
+            break;
+            }
+        }
+    CleanupStack::PopAndDestroy(lanBearerTable); // lanBearerTable
+    if (KErrNotFound == chosenLanBearer)
+        {
+        OstTrace0( TRACE_ERROR, CNCMIAPREADER_GETNCMIAPIDL, "Can not find NCM Lan Bearer!" );
+        User::Leave(KErrNotFound);
+        }
+    OstTrace1( TRACE_NORMAL, CNCMIAPREADER_GETNCMIAPIDL_CHOSEN_LAN_BEARER, "Chosen Lan Bearer %d!", chosenLanBearer );
+    
+    CMDBRecordSet<CCDIAPRecord> * iapTable = 
+            new (ELeave) CMDBRecordSet<CCDIAPRecord>(KCDTIdIAPRecord);
+    CleanupStack::PushL(iapTable);
+    // Load the table into memory
+    iapTable->LoadL(*dbs);
+
+    TInt numIaps = iapTable->iRecords.Count();
+    TInt chosenIAP = KErrNotFound;
+    TInt iapLanBearer = KErrNotFound;
+    for (i = 0; i < numIaps; i++)
+        {
+        CCDIAPRecord* iap =
+                static_cast<CCDIAPRecord*> (iapTable->iRecords[i]);
+        OstTrace1( TRACE_NORMAL, CNCMIAPREADER_GETNCMIAPIDL_RECORD_ID, "Id of current IAP is %d!", iap->RecordId() );
+        OstTrace1( TRACE_NORMAL, CNCMIAPREADER_GETNCMIAPIDL_RECORD_BEARER_ID, "Lan Bearer Id of current IAP is %d!", TMDBElementId(iap->iBearer) );
+        iapLanBearer = TMDBElementId(iap->iBearer);
+        if ((iap->iBearerType.GetL().Compare(TPtrC(KCDTypeNameLANBearer)) == 0) && 
+                (iapLanBearer == chosenLanBearer))
+            {
+            // NCM IAP found!
+            // Panic if there is more than NCM IAP found
+            OstTrace1( TRACE_NORMAL, CNCMIAPREADER_SEARCHNCMIAPL_ONLY_ONE_NCM_IAP, "NCM IAP found: Current chosenIAP value is %d", chosenIAP );
+            
+            __ASSERT_ALWAYS(KErrNotFound == chosenIAP, User::Panic(KNcmIapReaderPanic, ENcmIapReaderPanicTooManyIAPs));
+            chosenIAP = iap->RecordId();
+            break;
+            }
+        }
+    CleanupStack::PopAndDestroy(2, dbs); // iapTable, dbs    
+    if(chosenIAP == KErrNotFound)
+        {
+        OstTrace0( TRACE_ERROR, CNCMIAPREADER_GETNCMIAPIDL_NOT_FOUND, "Can not find NCM IAP!" );
+        User::Leave(KErrNotFound);
+        }
+    OstTrace1( TRACE_NORMAL, CNCMIAPREADER_GETNCMIAPIDL_CHOSEN_IAP_ID, "Chosen IAP is %d!", chosenIAP );
+    iConnPref.SetIapId(chosenIAP);
+    OstTraceFunctionExit0( CNCMIAPREADER_GETNCMIAPIDL_EXIT );
+    }