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