sl@0: // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: sl@0: #include "mppsmoketestlib.h" sl@0: #include sl@0: //#include "xmlengtesterdef.h" sl@0: //#include sl@0: sl@0: /** sl@0: * Utility fcn to compare two files ( skip or not skip white space ). sl@0: * @param aSrcFile full filename of a file you want to check/compare. sl@0: * @param aVerificationFile fill filename of a correct output file, aSrcFile will be compared to this to verify it's validity. sl@0: * @param aSkipWhiteSpace do not include whitespace when comparing the two files. sl@0: * @return Symbian OS error code. sl@0: */ sl@0: TInt CMultipartTestContainer::CompareFilesL( TPtrC aSrcFile, TPtrC aVerificationFile, sl@0: TBool aSkipWhiteSpace) sl@0: { sl@0: _LIT(KSourceFileError,"Source file error."); sl@0: _LIT(KPatternFileError,"Pattern file error."); sl@0: _LIT(KComparePassed,"Files compare test PASSED."); sl@0: _LIT(KCompareFailed,"Files compare test FAILED."); sl@0: sl@0: TInt nResult = KErrNone; sl@0: sl@0: TBool skipWhite = FALSE; sl@0: TBool foundRes = FALSE; sl@0: TBool foundRef = FALSE; sl@0: sl@0: RFs fs; sl@0: User::LeaveIfError(fs.Connect()); sl@0: CleanupClosePushL(fs); sl@0: sl@0: RFile srcFile; sl@0: RFile referenceFile; sl@0: sl@0: TFileName srcFileName; sl@0: TFileName referenceFileName; sl@0: sl@0: TPtrC SrcFile = aSrcFile; sl@0: TPtrC ReferenceFile = aVerificationFile; sl@0: if (aSkipWhiteSpace) sl@0: { sl@0: skipWhite = TRUE; sl@0: } sl@0: sl@0: if ( nResult == KErrNone ) sl@0: { sl@0: srcFileName.Copy(SrcFile); sl@0: referenceFileName.Copy(ReferenceFile); sl@0: sl@0: if(srcFile.Open(fs, srcFileName, EFileStream|EFileRead) == KErrNone) sl@0: { sl@0: // Does reference file exist. sl@0: if(referenceFile.Open(fs, referenceFileName, EFileStream|EFileRead) == KErrNone) sl@0: { sl@0: // Integer variables for compare to length of files (result and reference). sl@0: TInt resSize; sl@0: TInt refSize; sl@0: sl@0: srcFile.Size(resSize); sl@0: referenceFile.Size(refSize); sl@0: sl@0: // Next compare one letter at the time, but only if files have same length. sl@0: if(skipWhite) sl@0: { sl@0: TBuf8<1> resBuf; sl@0: TBuf8<1> refBuf; sl@0: nResult = KErrNone; sl@0: TInt j = 0; sl@0: TInt i = 0; sl@0: sl@0: //for(TInt i = 0; i < Size; i++) sl@0: while (TRUE) sl@0: { sl@0: foundRes = FALSE; sl@0: foundRef = FALSE; sl@0: // Read result file sl@0: while(i < (resSize + 1)) sl@0: { sl@0: i++; sl@0: srcFile.Read(resBuf); sl@0: resBuf.Trim(); sl@0: if ( resBuf.Length() > 0) sl@0: { sl@0: foundRes = TRUE; sl@0: break; sl@0: } sl@0: } sl@0: sl@0: // Read reference file sl@0: while(j < (refSize + 1)) sl@0: { sl@0: j++; sl@0: referenceFile.Read(refBuf); sl@0: refBuf.Trim(); sl@0: if ( refBuf.Length() > 0) sl@0: { sl@0: foundRef = TRUE; sl@0: break; sl@0: } sl@0: } sl@0: sl@0: // Compare single letter at the time. sl@0: if( ( i < resSize ) && ( j < refSize ) && (resBuf[0] != refBuf[0]) ) sl@0: { sl@0: nResult = KErrGeneral; sl@0: break; sl@0: } sl@0: if( (i == (resSize + 1)) && (j < refSize) && foundRef) sl@0: { sl@0: nResult = KErrGeneral; sl@0: break; sl@0: } sl@0: if( (i < resSize) && (j == (refSize + 1)) && foundRes) sl@0: { sl@0: nResult = KErrGeneral; sl@0: break; sl@0: } sl@0: if ((i > resSize) && (j > refSize)) sl@0: break; sl@0: } sl@0: } sl@0: else sl@0: { sl@0: if (resSize != refSize) sl@0: nResult = KErrGeneral; sl@0: else sl@0: { sl@0: TBuf8<1> resBuf; sl@0: TBuf8<1> refBuf; sl@0: nResult = KErrNone; sl@0: for(TInt i = 0; i < resSize; i++) sl@0: { sl@0: // Read result file sl@0: srcFile.Read(resBuf); sl@0: sl@0: // Read reference file sl@0: referenceFile.Read(refBuf); sl@0: sl@0: // Compare single letter at the time. sl@0: sl@0: if(resBuf[0] != refBuf[0]) sl@0: { sl@0: nResult = KErrGeneral; sl@0: break; sl@0: } sl@0: } sl@0: } sl@0: } sl@0: referenceFile.Close(); sl@0: srcFile.Close(); sl@0: } sl@0: else sl@0: { sl@0: nResult = KErrGeneral; sl@0: INFO_PRINTF1(KPatternFileError); sl@0: } sl@0: srcFile.Close(); sl@0: } sl@0: else sl@0: { sl@0: nResult = KErrGeneral; sl@0: INFO_PRINTF1(KSourceFileError); sl@0: } sl@0: sl@0: } sl@0: sl@0: CleanupStack::PopAndDestroy(&fs); sl@0: sl@0: if ( nResult == KErrNone) sl@0: { sl@0: INFO_PRINTF1(KComparePassed); sl@0: } sl@0: else sl@0: { sl@0: INFO_PRINTF1(KCompareFailed); sl@0: } sl@0: sl@0: return nResult; sl@0: } sl@0: sl@0: CMultipartTestContainer::CMultipartTestContainer(CTestExecuteLogger& aLogger) sl@0: : iLog(aLogger) sl@0: { sl@0: } sl@0: sl@0: /** sl@0: * @param aLogger TEF logger from CTestStep. sl@0: */ sl@0: void CMultipartTestContainer::ConstructL() sl@0: { sl@0: } sl@0: sl@0: /** sl@0: * @param aLogger TEF logger from CTestStep. sl@0: */ sl@0: CMultipartTestContainer* CMultipartTestContainer::NewLC(CTestExecuteLogger& aLogger) sl@0: { sl@0: CMultipartTestContainer* self = new (ELeave) CMultipartTestContainer(aLogger); sl@0: sl@0: CleanupStack::PushL( self ); sl@0: self->ConstructL(); sl@0: sl@0: return self; sl@0: sl@0: } sl@0: sl@0: /** sl@0: * @param aLogger TEF logger from CTestStep. sl@0: */ sl@0: CMultipartTestContainer* CMultipartTestContainer::NewL(CTestExecuteLogger &aLogger) sl@0: { sl@0: CMultipartTestContainer* self = NewLC(aLogger ); sl@0: CleanupStack::Pop( self ); sl@0: sl@0: return self; sl@0: sl@0: } sl@0: sl@0: CMultipartTestContainer::~CMultipartTestContainer() sl@0: { sl@0: } sl@0: sl@0: /** sl@0: * Read a file from the hard drive. sl@0: * sl@0: * @param aFileName full filename to read in. sl@0: * @return contents of the file. sl@0: */ sl@0: HBufC8* CMultipartTestContainer::ReadFileLC(const TDesC& aFileName) sl@0: { sl@0: RFs rfs; sl@0: RFile file; sl@0: User::LeaveIfError(rfs.Connect()); sl@0: CleanupClosePushL(rfs); sl@0: User::LeaveIfError(file.Open(rfs, aFileName, EFileRead)); sl@0: CleanupClosePushL(file); sl@0: TInt size; sl@0: User::LeaveIfError(file.Size(size)); sl@0: HBufC8* buf = HBufC8::NewLC(size); sl@0: TPtr8 bufPtr(buf->Des()); sl@0: User::LeaveIfError(file.Read(bufPtr)); sl@0: CleanupStack::Pop(); // buf sl@0: CleanupStack::PopAndDestroy(2); // file, rfs sl@0: CleanupStack::PushL(buf); sl@0: return buf; sl@0: } sl@0: sl@0: /** sl@0: * Write the file to the hard drive. sl@0: * sl@0: * @param aFileName sl@0: * @param aBodyPartArray sl@0: */ sl@0: void CMultipartTestContainer::WriteFileL( const TDesC& aFileName, sl@0: RPointerArray& aBodyPartArray ) sl@0: { sl@0: RFs fs; sl@0: fs.Connect(); sl@0: CleanupClosePushL(fs); sl@0: RFile output; sl@0: TInt err = output.Open(fs, aFileName, EFileWrite); sl@0: if (err == KErrNotFound) sl@0: { sl@0: User::LeaveIfError(output.Create(fs, aFileName, EFileWrite)); sl@0: } sl@0: sl@0: // output file sl@0: TInt size = aBodyPartArray.Count(); sl@0: TInt i; sl@0: _LIT8(KEol, "\r\n"); sl@0: for (i = 0; i < size; i++) sl@0: { sl@0: sl@0: CBodyPart* bodyPart = aBodyPartArray[i]; sl@0: sl@0: if( bodyPart->Url().Ptr() ) sl@0: { sl@0: output.Write(_L8("***************Ur")); sl@0: output.Write(KEol); sl@0: RBuf8 narrow; sl@0: err = narrow.Create(bodyPart->Url().Length()*2); sl@0: if (err != KErrNone) sl@0: { sl@0: INFO_PRINTF1(_L("Error printing Url to output file; continueing...")); sl@0: } sl@0: narrow.Copy(bodyPart->Url()); sl@0: output.Write(narrow.Left(narrow.Length())); sl@0: output.Write(KEol); sl@0: } sl@0: if( bodyPart->ContentID().Ptr() ) sl@0: { sl@0: output.Write(_L8("***************ContentID")); sl@0: output.Write(KEol); sl@0: output.Write(bodyPart->ContentID() ); sl@0: output.Write(KEol); sl@0: } sl@0: if( bodyPart->Charset().Ptr() ) sl@0: { sl@0: output.Write(_L8("***************Charset")); sl@0: output.Write(KEol); sl@0: output.Write( bodyPart->Charset() ); sl@0: output.Write(KEol); sl@0: } sl@0: if( bodyPart->ContentType().Ptr() ) sl@0: { sl@0: output.Write(_L8("***************ContentType")); sl@0: output.Write(KEol); sl@0: output.Write( bodyPart->ContentType() ); sl@0: output.Write(KEol); sl@0: } sl@0: if( bodyPart->Headers().Ptr() ) sl@0: { sl@0: output.Write(_L8("***************Headers")); sl@0: output.Write(KEol); sl@0: output.Write(bodyPart->Headers() ); sl@0: output.Write(KEol); sl@0: } sl@0: if( bodyPart->Body().Ptr() ) sl@0: { sl@0: output.Write(_L8("***************Body")); sl@0: output.Write(KEol); sl@0: output.Write(bodyPart->Body() ); sl@0: output.Write(KEol); sl@0: } sl@0: output.Write(_L8("=========================================part ends")); sl@0: output.Write(KEol); sl@0: sl@0: } // end of loop sl@0: sl@0: output.Close(); sl@0: CleanupStack::PopAndDestroy(1, &fs); sl@0: fs.Close(); sl@0: } sl@0: sl@0: sl@0: /** sl@0: * Write the data to a file. sl@0: * sl@0: * @param aFileName filename to write the data to. sl@0: * @param aData data to write. sl@0: */ sl@0: void CMultipartTestContainer::WriteToDiskL( const TDesC& aFileName, sl@0: const TDesC8& aData ) sl@0: { sl@0: RFs fsSession; sl@0: RFile file; sl@0: TInt status( KErrNone ); sl@0: User::LeaveIfError( fsSession.Connect() ); sl@0: status = file.Replace( fsSession, aFileName, EFileWrite|EFileShareAny); sl@0: if( status == KErrNone ) sl@0: { sl@0: file.Write( aData ); sl@0: } sl@0: file.Close(); sl@0: } sl@0: sl@0: sl@0: /** sl@0: * Parse a file with base64 encoding. sl@0: * sl@0: * @param aFile filename to be read in. sl@0: * @param aUrl ??? //DEBUG sl@0: * @param aOutput name out output file. sl@0: */ sl@0: void CMultipartTestContainer::ParseFileL( const TDesC& aFile, sl@0: const TDesC& aUrl, sl@0: const TDesC& aOutput ) sl@0: { sl@0: // body sl@0: HBufC8* data = ReadFileLC( aFile ); sl@0: // content type sl@0: _LIT8(KMultipartMixed, "multipart/mixed"); sl@0: // boundary sl@0: _LIT8(KBoundary1, "KBoundary"); sl@0: // body part array sl@0: RPointerArray bodyPartArray; sl@0: sl@0: // parse sl@0: TInt err; sl@0: if( aUrl.Ptr() ) sl@0: { sl@0: TRAP( err, MultipartParser::ParseL( *data, KMultipartMixed, KBoundary1, aUrl, bodyPartArray ) ); sl@0: } sl@0: else sl@0: { sl@0: TRAP( err, MultipartParser::ParseL( *data, KMultipartMixed, KBoundary1, aFile, bodyPartArray ) ); sl@0: } sl@0: if (err != KErrNone) sl@0: { sl@0: INFO_PRINTF1(_L("Error parsing file.")); sl@0: } sl@0: sl@0: // output sl@0: WriteFileL( aOutput, bodyPartArray); sl@0: sl@0: // clean up memory sl@0: CleanupStack::PopAndDestroy(); // data sl@0: // clean up body part array and its content sl@0: TInt size = bodyPartArray.Count(); sl@0: TInt i; sl@0: for (i = 0; i < size; i++) sl@0: { sl@0: delete bodyPartArray[i]; sl@0: } sl@0: bodyPartArray.Reset(); sl@0: }