supl/locationomasuplpostester/epos_comasuplpostestermodulecfg/src/epos_comasuplmessagefilereader.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/supl/locationomasuplpostester/epos_comasuplpostestermodulecfg/src/epos_comasuplmessagefilereader.cpp Tue Feb 02 01:06:48 2010 +0200
@@ -0,0 +1,378 @@
+/*
+* Copyright (c) 2005-2006 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: Read instructions from message file
+*
+*/
+
+
+#include <f32file.h>
+#include <e32cmn.h>
+#include <utf.h>
+#include <barsc.h>
+#include <barsread.h>
+#include <epos_comasuplpospayload.h>
+#include "epos_comasuplmessagefilereader.h"
+#include <postester.rsg>
+#include "epos_comasuplmessageinfo.h"
+#include "epos_comasuplpostesterlogger.h"
+
+
+_LIT(KResourcePath, "\\resource\\");
+_LIT(KResourceName, "postester.rsc");
+
+
+_LIT8(KConnectErr, "Error: Could not connect to server.");
+_LIT8(KErrOpen, "Error: Could not open file");
+_LIT8(KParseErr, "Error: Error in Parsing");
+_LIT8(KPayloadErr, "Error: Wrong payload type.");
+_LIT8(KInstructionErr, "Error: Wrong instruction type.");
+_LIT8(KResourceNotFound, "Resource file not found.");
+
+void ResetAndDestroy(TAny* aArray)
+ {
+ ((RPointerArray<COMASuplMessageInfo>*)aArray)->ResetAndDestroy();
+ delete aArray;
+ }
+
+COMASuplMessageFileReader* COMASuplMessageFileReader::
+ NewL( TFileName& aFilePath
+ , COMASuplPosTesterLogger* aLog)
+ {
+ COMASuplMessageFileReader* self = new( ELeave )
+ COMASuplMessageFileReader(aLog);
+ CleanupStack::PushL( self );
+ self->ConstructL( aFilePath );
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+COMASuplMessageFileReader::~COMASuplMessageFileReader()
+ {
+ iRFile.Close();
+ iRFs.Close();
+ delete iFileData;
+ }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+RPointerArray< COMASuplMessageInfo >& COMASuplMessageFileReader::
+ GetMessageListL()
+ {
+ TBool noEoF = ETrue;
+ RPointerArray< COMASuplMessageInfo >* messageArray =
+ new(ELeave)RPointerArray< COMASuplMessageInfo >;
+ CleanupStack::PushL(TCleanupItem(*ResetAndDestroy, messageArray));
+ while(noEoF)
+ {
+ //Read one Message
+ HBufC8* messageBlock = NULL;
+ if(ReadOneMessageBlockL(messageBlock))
+ {
+ CleanupStack::PushL(messageBlock);
+ COMASuplMessageInfo* msgInfo = NULL;
+ GetMsgInfoL(messageBlock, msgInfo);
+ messageArray->Append(msgInfo);
+ CleanupStack::Pop(messageBlock);
+ }
+ else
+ {
+ noEoF = EFalse;
+ }
+ delete messageBlock;
+ }
+ CleanupStack::Pop(messageArray);
+ return *messageArray;
+ }
+
+COMASuplMessageFileReader::COMASuplMessageFileReader(COMASuplPosTesterLogger* aLog)
+ {
+ iLogger = aLog;
+ }
+
+// ---------------------------------------------------------------------------
+// Second phase constructor
+// ---------------------------------------------------------------------------
+//
+
+void COMASuplMessageFileReader::ConstructL(TFileName& aFilePath)
+ {
+ TInt err = KErrGeneral;
+ err = iRFs.Connect();
+ if(err != KErrNone)
+ {
+ iLogger->WriteLine(KConnectErr);
+ User::LeaveIfError(err);
+ }
+ if(0 == aFilePath.Length())
+ {
+ ReadFileInfoFromResourceL();
+ }
+ else
+ {
+ iMsgFileName.Copy(aFilePath);
+ }
+
+ HBufC* filename = HBufC::NewL(iMsgFileName.Length() + 2 * KExtraBuffer);
+ CleanupStack::PushL(filename);
+
+ TPtr filenamePtr = filename->Des();
+ filenamePtr.Copy(_L("Info: Path of Message File Used is: "));
+ filenamePtr.Append(iMsgFileName);
+
+ HBufC8* displayName =
+ CnvUtfConverter::ConvertFromUnicodeToUtf8L(filenamePtr);
+
+ iLogger->WriteLine(*displayName);
+ CleanupStack::PopAndDestroy(filename);
+ delete displayName;
+
+ err = iRFile.Open(iRFs, iMsgFileName, EFileShareReadersOnly);
+ if(err != KErrNone)
+ {
+ iLogger->WriteLine(KErrOpen);
+ User::LeaveIfError(err);
+ }
+ FileDataReaderL();
+ }
+
+// ---------------------------------------------------------------------------
+// Reads complete data of a file in a buffer on heap.
+// ---------------------------------------------------------------------------
+//
+TDesC8& COMASuplMessageFileReader::FileDataReaderL()
+ {
+ TInt fileSize = 0;
+ User::LeaveIfError(iRFile.Size(fileSize));
+ iFileData = HBufC8::NewL(fileSize);
+ TPtr8 data = (iFileData->Des());
+ User::LeaveIfError(iRFile.Read(data));
+ return *iFileData;
+ }
+
+// ---------------------------------------------------------------------------
+// Reads one message block from the buffer which contains complete data
+// of the file.
+// ---------------------------------------------------------------------------
+//
+TBool COMASuplMessageFileReader::ReadOneMessageBlockL(HBufC8*& aMessageBlock)
+ {
+ TInt msgBlockEnd = iFileData->Find(KMsgBlockDelimiter);
+ if(msgBlockEnd > 0)
+ {
+ aMessageBlock = HBufC8::NewL(msgBlockEnd
+ + KMsgBlockDelimiter().Length());
+ aMessageBlock->Des().Copy(iFileData->Ptr(), msgBlockEnd
+ + KMsgBlockDelimiter().Length());
+ iFileData->Des().Delete(0, msgBlockEnd
+ + KMsgBlockDelimiter().Length());
+ return ETrue;
+ }
+ if(iFileData->Length() > 0)
+ {
+ iLogger->WriteLine(KParseErr);
+ User::Leave(KErrNotFound);
+ }
+ return EFalse;
+ }
+
+// ---------------------------------------------------------------------------
+// Extracts "instruction", "payload type" and "payload" from the message
+// block.
+// ---------------------------------------------------------------------------
+//
+
+TInt COMASuplMessageFileReader::ParseMessageBlockL(HBufC8& aMessageBlock
+ , COMASuplMessageInfo::TOMASuplOperationType& aOpType
+ , COMASuplPosPayload& aPayload)
+ {
+
+ TInt payloadType = KErrNotFound;
+ //find \r\n
+ TInt typeDelimLoc = KErrNotFound;
+ TInt opDelimLoc = KErrNotFound;
+ TPtrC8 block = aMessageBlock.Mid(0);
+ opDelimLoc = block.Find(KTypeDelimiter);
+ if(opDelimLoc > 0)
+ {
+ TPtrC8 opType(block.Left(opDelimLoc));
+ aOpType = GetOperationTypeL(opType);
+ if(COMASuplMessageInfo::ESend == aOpType)
+ {
+ TPtrC8 payloadPart = block.Mid(opDelimLoc + KTypeDelimiter().Length());
+ typeDelimLoc = payloadPart.Find(KTypeDelimiter);
+ if(typeDelimLoc > 0)
+ {
+ TPtrC8 type (payloadPart.Left(typeDelimLoc));
+
+ HBufC8* typeToTrim = type.AllocL();
+ typeToTrim->Des().Trim();
+ TLex8 lex(typeToTrim->Des());
+ TInt err = lex.Val(payloadType);
+ delete typeToTrim;
+
+ if(err != KErrNone)
+ {
+ iLogger->WriteLine(KParseErr);
+ User::Leave(err);
+ }
+ TInt endPos = 0;
+ TPtrC8 payloadPtr = payloadPart.Mid(typeDelimLoc +
+ KTypeDelimiter().Length());
+ endPos = payloadPtr.Find(KMsgBlockDelimiter);
+ TPtrC8 onlyPayload = payloadPtr.Left(endPos);
+ HBufC8* payLoadData = onlyPayload.AllocL();//need not delete
+ CleanupStack::PushL(payLoadData);
+ PreparePayLoadL(aPayload, *payLoadData, payloadType);
+ CleanupStack::Pop(payLoadData);
+ }
+ else
+ {
+ iLogger->WriteLine(KParseErr);
+ User::Leave(KErrNotFound);
+ }
+ }
+ else
+ {
+ return KErrNone;
+ }
+ }
+ else
+ {
+ iLogger->WriteLine(KParseErr);
+ User::Leave(KErrNotFound);
+ }
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// Prepares COMASuplPosPayload object from a descriptor.
+// ---------------------------------------------------------------------------
+//
+void COMASuplMessageFileReader::PreparePayLoadL(
+ COMASuplPosPayload& aPayloadObj
+ , HBufC8& aPayload
+ , TInt aPayloadType)
+ {
+ COMASuplPosPayload::TOMASuplPosPayloadType payloadType =
+ COMASuplPosPayload::ETIA801;
+ switch(aPayloadType)
+ {
+ case 0:
+ {
+ payloadType = COMASuplPosPayload::ETIA801;
+ break;
+ }
+ case 1:
+ {
+ payloadType = COMASuplPosPayload::ERRLP;
+ break;
+ }
+ case 2:
+ {
+ payloadType = COMASuplPosPayload::ERRC;
+ break;
+ }
+ default:
+ {
+ iLogger->WriteLine(KPayloadErr);
+ User::Leave(KErrNotFound);
+ }
+
+ }
+ aPayloadObj.SetPosPayload(&aPayload, payloadType);
+ }
+
+// ---------------------------------------------------------------------------
+// Creates a COMASuplMessageInfo object from a message block.
+// ---------------------------------------------------------------------------
+//
+void COMASuplMessageFileReader::GetMsgInfoL(HBufC8* aMessageBlock
+ , COMASuplMessageInfo*& msgInfo)
+ {
+ delete msgInfo;
+
+ COMASuplPosPayload* posPayLoad = COMASuplPosPayload::NewL();
+ CleanupStack::PushL(posPayLoad);
+ COMASuplMessageInfo::TOMASuplOperationType opType = COMASuplMessageInfo::EWait;
+ ParseMessageBlockL(*aMessageBlock, opType, *posPayLoad);
+ msgInfo = COMASuplMessageInfo::NewL(opType, *posPayLoad);
+ CleanupStack::Pop(posPayLoad);
+ delete posPayLoad;
+ }
+
+// ---------------------------------------------------------------------------
+// Provides the type of instruction/operation.
+// ---------------------------------------------------------------------------
+//
+COMASuplMessageInfo::TOMASuplOperationType
+COMASuplMessageFileReader::GetOperationTypeL(const TDesC8& aOpType)
+ {
+ if(aOpType.Compare(KSendOp) == 0)
+ {
+ return COMASuplMessageInfo::ESend;
+ }
+ else
+ {
+ if(aOpType.Compare(KWaitOp) == 0)
+ {
+ return COMASuplMessageInfo::EWait;
+ }
+ else
+ {
+ iLogger->WriteLine(KInstructionErr);
+ User::Leave(KErrNotFound);
+ }
+ }
+ return COMASuplMessageInfo::EWait;
+ }
+
+// ---------------------------------------------------------------------------
+// Reads default message file path and name from the resource file.
+// ---------------------------------------------------------------------------
+//
+void COMASuplMessageFileReader::ReadFileInfoFromResourceL()
+ {
+ TBuf<128> resourceFileName;
+ GetFileAbsolutePathL(resourceFileName);
+
+ RResourceFile resourceFile;
+ CleanupClosePushL(resourceFile);
+ resourceFile.OpenL(iRFs, resourceFileName);
+ resourceFile.ConfirmSignatureL(0);
+ HBufC8* dataBuffer = resourceFile.AllocReadLC(R_POS_TESTER_MSG_FILE_PATH_NAME);
+ TResourceReader theReader;
+ theReader.SetBuffer(dataBuffer);
+ TPtrC textdata = theReader.ReadTPtrC();
+ iMsgFileName.Copy(textdata);
+ CleanupStack::PopAndDestroy(dataBuffer);
+ CleanupStack::PopAndDestroy(&resourceFile);//closing resource file
+ }
+
+void COMASuplMessageFileReader::GetFileAbsolutePathL(TDes& aResourceFileName)
+ {
+ TFindFile findResource(iRFs);
+ TInt err = findResource.FindByDir(KResourceName(), KResourcePath());
+ if(err != KErrNone)
+ {
+ iLogger->WriteLine(KResourceNotFound);
+ User::Leave(err);
+ }
+ aResourceFileName.Copy(findResource.File());
+ }