--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/serialserver/packetloopbackcsy/src/LoopbackConfig.cpp Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,223 @@
+// Copyright (c) 2004-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 handles retrieving settings from the config file for the loopback test driver
+//
+//
+
+/**
+ @file
+*/
+
+
+#include <e32base.h>
+#include <e32std.h>
+#include <e32property.h>
+
+#include <cs_port.h>
+#include "SLOGGER.H"
+#include <d32comm.h>
+#include <c32comm.h>
+#include <e32hal.h>
+
+#include "LoopbackConfig.h"
+
+const TUint KStdDelimiter=','; // < Standard Delimiter for config file (a comma)
+// config element indicies for elements common to both packet and serial mode
+const TUint KFirstPortConfigElementIndex = 0;
+const TUint KSecondPortConfigElementIndex = 1;
+const TUint KDelayConfigElementIndex = 2;
+// config element indicies for packet mode
+const TUint KQueueLengthConfigElementIndex = 3;
+const TUint KPacketLengthConfigElementIndex = 4;
+// config element indicies for serial mode
+const TUint KTotalBufferSizeConfigElementIndex = 3;
+
+CLoopbackConfig* CLoopbackConfig::NewL()
+ {
+ CLoopbackConfig* me = new(ELeave) CLoopbackConfig();
+ CleanupStack::PushL(me);
+ me->ConstructL();
+ CleanupStack::Pop(me);
+ return me;
+ }
+
+CLoopbackConfig::CLoopbackConfig() : iConfigItems(NULL)
+ {}
+
+CLoopbackConfig::~CLoopbackConfig()
+ {
+ delete iConfigItems;
+ }
+
+void CLoopbackConfig::ConstructL()
+ {
+ RFs fs;
+ User::LeaveIfError(fs.Connect());
+ CTestConfig* configFile = CTestConfig::NewLC(fs, KConfigFileDir, KLoopbackConfigFilename);
+
+ TBuf8<KMaxName> sectionName;
+ TInt testNum = 0;
+ CTestConfigSection* configSection = NULL;
+ TBool foundSection = EFalse;
+ if (KErrNone == GetTestNumber(testNum))
+ {
+ sectionName.Format(KSectionNameFormat, testNum);
+ configSection = configFile->Section(sectionName);
+ if(configSection != NULL)
+ {
+ foundSection = ETrue;
+ }
+ }
+ if (!foundSection)
+ {
+ // use the [Defaults] section
+ configSection = configFile->Section(KScriptDefaults);
+ }
+ if(configSection == NULL)
+ {
+ CleanupStack::PopAndDestroy(configFile);
+ return;
+ }
+
+ // if retrieving the port type fails, we leave it at the default
+ iPortType = EPacketLoopbackPortType;
+ const CTestConfigItem* item = NULL;
+ item = configSection->Item(KSerialLoopbackPortType);
+ if (item != NULL)
+ {
+ iPortType = ESerialLoopbackPortType;
+ }
+
+ TUint portCount = configSection->ItemCount(KPort);
+ // CArrayFixFlat doesn't like a count of 0 for some reason
+ if (portCount == 0)
+ portCount = 1;
+ iConfigItems = new(ELeave) CArrayFixFlat<TLoopbackConfigItem>(portCount);
+ for (TInt i = 0; i < configSection->ItemCount(KPort); i++)
+ {
+ TLoopbackConfigItem newItem;
+ const CTestConfigItem* item = configSection->Item(KPort, i);
+ if(item == NULL)
+ continue;
+ else
+ {
+ TInt elementValue = 0;
+ TInt ret = CTestConfig::GetElement(item->Value(), KStdDelimiter,
+ KFirstPortConfigElementIndex, elementValue);
+ if(ret == KErrNone)
+ {
+ newItem.iPortA = elementValue;
+ }
+
+ ret = CTestConfig::GetElement(item->Value(), KStdDelimiter,
+ KSecondPortConfigElementIndex, elementValue);
+ if(ret == KErrNone)
+ {
+ newItem.iPortB = elementValue;
+ }
+
+ ret = CTestConfig::GetElement(item->Value(), KStdDelimiter, KDelayConfigElementIndex,
+ elementValue);
+ if(ret == KErrNone)
+ {
+ newItem.iDelay = elementValue;
+ }
+
+ if (ESerialLoopbackPortType == iPortType)
+ {
+ ret = CTestConfig::GetElement(item->Value(), KStdDelimiter,
+ KTotalBufferSizeConfigElementIndex, elementValue);
+ if(ret == KErrNone)
+ {
+ newItem.iBufferSize = elementValue;
+ }
+ }
+ else
+ {
+ ret = CTestConfig::GetElement(item->Value(), KStdDelimiter,
+ KQueueLengthConfigElementIndex, elementValue);
+ if(ret == KErrNone)
+ {
+ newItem.iQueueLength = elementValue;
+ }
+
+ ret = CTestConfig::GetElement(item->Value(),KStdDelimiter,
+ KPacketLengthConfigElementIndex, elementValue);
+ if(ret == KErrNone)
+ {
+ newItem.iPacketLength = elementValue;
+ }
+ }
+ }
+ iConfigItems->AppendL(newItem);
+ }
+
+ CleanupStack::PopAndDestroy(configFile);
+ }
+
+/**
+ @return The number of config items found
+ */
+TUint CLoopbackConfig::Count() const
+ {
+ return iConfigItems->Count();
+ }
+
+/**
+ @return The configured port type - either packet or serial
+ */
+TPortType CLoopbackConfig::PortType() const
+ {
+ return iPortType;
+ }
+
+/**
+ Retrieves the settings from the config file for the given port
+
+ @param aUnit The port number to retrieve the settings for
+ @param aPort This method assigns the settings to this object
+
+ @return KErrNone if the port corresponding to aUnit is found, KErrNotFound otherwise
+ */
+TInt CLoopbackConfig::GetPortSettings(TUint aUnit, TLoopbackConfigItem& aPortSettings) const
+ {
+ for (TInt i = 0; i < iConfigItems->Count(); i++)
+ {
+ if ((iConfigItems->At(i).iPortA == aUnit) || (iConfigItems->At(i).iPortB == aUnit))
+ {
+ LOGTEXT2(_L8("Found port settings for unit = %d"), aUnit);
+ aPortSettings = iConfigItems->At(i);
+ return KErrNone;
+ }
+ }
+ LOGTEXT2(_L8("Could not find port settings for unit = %d"), aUnit);
+ return KErrNotFound;
+ }
+
+TInt CLoopbackConfig::GetTestNumber(TInt& aTestNumber)
+/**
+ * Retrieve the test number.
+ * Use the test number corresonding the the publish and subsciber property KPSLoopbackCsyTestNumber
+ */
+ {
+ TInt ret0 = RProperty::Get(KUidPSPacketLoopbackCsyCategory, KPSLoopbackCsyTestNumber,
+ aTestNumber);
+ if (ret0 == KErrNone && aTestNumber >= 0)
+ {
+ LOGTEXT2(_L8("Got system property KPSLoopbackCsyTestNumber. testNumber=%d"), aTestNumber);
+ return KErrNone;
+ }
+ return KErrNotFound;
+ }
+