diff -r 000000000000 -r 9cfd9a3ee49c networkprotocolmodules/networkprotocolmodule/LbsProtocolModule/src/cconfigmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/networkprotocolmodules/networkprotocolmodule/LbsProtocolModule/src/cconfigmanager.cpp Tue Feb 02 01:50:39 2010 +0200 @@ -0,0 +1,215 @@ +// Copyright (c) 2006-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: +// This file provides the implementation of the class that manages +// configuration of Test Protocol Module operation. +// +// + +#include +#include "cconfigmanager.h" + +/** Static constructor. +@return A new instance of the CConfigManager class +*/ +CConfigManager* CConfigManager::NewL() + { + CConfigManager* self = new (ELeave) CConfigManager(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + + +/** Standard constructor. +*/ +CConfigManager::CConfigManager() + { + } + + +/** Standard destructor. +*/ +CConfigManager::~CConfigManager() + { + iDecisionTable.Close(); + } + + +/** Private second-stage constructor. +*/ +void CConfigManager::ConstructL() + { + LoadDecisionDataL(); + } + + +/** Load external decision table data. +This retrieves decision table entries from the external data source which +has been installed as part of the system configuration. + +This data is stored in the internal decision table in rows and columns +that represent the current and new operations, respectively. +*/ +void CConfigManager::LoadDecisionDataL() + { + // Pre-allocate table space + iDecisionTable.ReserveL(KMaxOperationTypes * KMaxOperationTypes); + + // Open central repository + CRepository* repository = CRepository::NewLC(TUid::Uid(KMyRepositoryUid)); + + // For each row - current operation + for (TInt row = 0; row < KMaxOperationTypes; row++) + { + // For each column - new operation + for (TInt col = 0; col < KMaxOperationTypes; col++) + { + // Retrieve an item from central repository using a UID + // which is derived from the row and column numbers + TInt dataValue = -1; + TUint32 uid = (row * KMaxOperationTypes) + col + 1; + TConflictResult value = KDefaultDecision; // initialise to default + if (KErrNone == repository->Get(uid, dataValue)) + { + // Convert entry value to decision value + switch (dataValue) + { + case 0: + value = EConflictRejectNew; + break; + case 1: +#ifdef PM_HACK_FOR_INC103104 + value = EConflictRejectNew; +#else + value = EConflictQueueNew; +#endif //PM_HACK_FOR_INC103104 + break; + case 2: + value = EConflictCancelCurrent; + break; + case 3: + value = EConflictQueueCurrent; + break; + default: + value = EConflictNone; + break; + }; + } + + iDecisionTable.Append(value); + } + } + + // Close central repository + CleanupStack::PopAndDestroy(repository); + } + + +/** Get conflict decision. +Generates a conflict decision based on the nature of a current operation, +and the nature of a new operation. + +@param aCurrentOp The current operation +@param aNewOp The new operation for which a decision is required +@return TConflictDecision The conflict decision: + EConflictNone - This implies there is no current operation + and the new operation is simply started + EConflictRejectNew - The new operation is rejected and any + current operation proceeds unaffected + EConflictQueueNew - The new operation is queued awaiting + completion of any current operation + EConflictCancelCurrent - The current operation is cancelled and + the new operation is started + EConflictQueueCurrent - The current operation is queued an awaits + the completion of the new operation +*/ +CConfigManager::TConflictResult CConfigManager::ConflictDecision(const TConflictOperation& aCurrentOp, const TConflictOperation& aNewOp) const + { + TConflictResult result = KDefaultDecision; // initialise to default decision + TInt currentOpIndex; + TInt newOpIndex; + + // Get table row index - current operation + currentOpIndex = DecisionTableIndex(aCurrentOp); + if (0 <= currentOpIndex) + { + // Get table column index - new operation + newOpIndex = DecisionTableIndex(aNewOp); + if (0 <= newOpIndex) + { + // Retrieve entry using row and column index values + result = iDecisionTable[(currentOpIndex*KMaxOperationTypes) + newOpIndex]; + } + } + + return result; + } + + +/** Get an index for the specified operation. +*/ +TInt CConfigManager::DecisionTableIndex(const TConflictOperation& aOperation) const + { + TInt index = -1; // initialised to an invalid index + + // What type of operation is specified? + switch (aOperation.iOperation) + { + + case EOpMoLr: + case EOpNbLr: + index = KMoLr; + break; + + case EOpMtLr: + case EOpNiLr: + if (EPriorityEmergency == aOperation.iPriority) + { + index = KEmergency; + } + else + { + index = KMtLr; + } + break; + + case EOpX3p: + // What priority of X3P is specified? + switch (aOperation.iPriority) + { + case EPriorityLow: + index = KX3pLow; + break; + + case EPriorityMedium: + index = KX3pMid; + break; + + case EPriorityHigh: + index = KX3pHi; + break; + + default: + break; + }; + break; + + default: + break; + }; + + return index; + } +