--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/pimappsupport/vcardandvcal/tsrc/Observ.CPP Tue Feb 02 10:12:19 2010 +0200
@@ -0,0 +1,339 @@
+// Copyright (c) 2002-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:
+//
+
+#include "Observ.H"
+
+#include <e32test.h>
+#include <vobserv.h>
+#include <versit.h>
+#include <vcal.h>
+#include <vcard.h>
+
+//class CAgnRptDef;
+GLREF_D RTest TheTest;
+
+class CTestVersitObserver : public CBase, public MVersitObserver, public MVersitPlugIn
+ {
+public:
+ inline CTestVersitObserver(RFs& aFsSession) : iFs(aFsSession) {}
+ void Test1L();
+ void Test2L();
+ void Test3L();
+ void TestReccurrenceRulesL();
+public:
+//Pure virtual function from MVersitObserver
+ void VersionSet(CVersitParser* aParser,const TDesC16& aVersion);
+ void NewParser(CVersitParser* aParser);
+//Pure virtual function from MVersitPlugIn
+ TBool AddSpace();
+ TBool DeleteAllSpaces();
+ TBool NeedsBlankLine();
+ void RemoveEscaping(TPtr16& aText);
+ void AddEscaping(HBufC16*& aText);
+ TBool WrapLine(RWriteStream& aStream,TInt& aCurrentLineLength,const TPtr8& aText);
+ TBool EncodingType(Versit::TVersitEncoding& aEncoding,TBool aRequiresEncoding,Versit::TVersitEncoding aDefaultEncoding
+ ,TUid aPropertyUid,TUint aPropertyCharset);
+ const TDesC8& EncodingName(Versit::TVersitEncoding aEncoding);
+private:
+ enum TCountFlags
+ {
+ //Internalising
+ ECountVersionSet=0x00000001,
+ ECountNewParser=0x00000020,
+ ECountAddSpace=0x00000400,
+ ECountDeleteSpace=0x00008000,
+ ECountNeedsBlank=0x00100000,
+ ECountRemoveEscape=0x02000000,
+ //Externalising
+ ECountAddEscape=0x00000001,
+ ECountWrapLine=0x00000100,
+ ECountEncodeType=0x00010000,
+ ECountEncodeName=0x01000000,
+ };
+private:
+ RFs& iFs;
+ CVersitParser* iExpectedParser;
+ TBuf<16> iExpectedVersion;
+ TBuf<16> iExpectedFirstValueRE;
+ TBuf<16> iExpectedFirstValueAE;
+ TBuf8<16> iExpectedFirstValueWL;
+ TInt iExpectedFirstLineLength;
+ TInt iExpectedDefaultEncoding;
+ TUid iExpectedFirstUid;
+ TInt iExpectedEncodingEN;
+ TUint iCount;
+ };
+
+void CTestVersitObserver::VersionSet(CVersitParser* aParser,const TDesC16& aVersion)
+ {
+ if (iExpectedParser)
+ TheTest(iExpectedParser==aParser);
+ if (iExpectedVersion.Length()>0)
+ TheTest(iExpectedVersion==aVersion);
+ iCount+=ECountVersionSet;
+ }
+
+void CTestVersitObserver::NewParser(CVersitParser* aParser)
+ {
+ TheTest(iExpectedParser!=aParser);
+ aParser->SetObserver(this);
+ aParser->SetPlugIn(this);
+ iCount+=ECountNewParser;
+ }
+
+TBool CTestVersitObserver::AddSpace()
+ {
+ iCount+=ECountAddSpace;
+ return ETrue;
+ }
+
+TBool CTestVersitObserver::DeleteAllSpaces()
+ {
+ iCount+=ECountDeleteSpace;
+ return ETrue;
+ }
+
+TBool CTestVersitObserver::NeedsBlankLine()
+ {
+ iCount+=ECountNeedsBlank;
+ return ETrue;
+ }
+
+void CTestVersitObserver::RemoveEscaping(TPtr16& aText)
+ {
+ if (iExpectedFirstValueRE.Length()>0)
+ {
+ TheTest(iExpectedFirstValueRE==aText);
+ iExpectedFirstValueRE.Zero();
+ }
+ iCount+=ECountRemoveEscape;
+ }
+
+void CTestVersitObserver::AddEscaping(HBufC16*& aText)
+ {
+ if (iExpectedFirstValueAE.Length()>0)
+ {
+ TheTest(iExpectedFirstValueAE==*aText);
+ iExpectedFirstValueAE.Zero();
+ }
+ iCount+=ECountAddEscape;
+ }
+
+TBool CTestVersitObserver::WrapLine(RWriteStream& /*aStream*/,TInt& aCurrentLineLength,const TPtr8& aText)
+ {
+ if (iExpectedFirstValueWL.Length()>0)
+ {
+ TheTest(iExpectedFirstValueWL==aText);
+ iExpectedFirstValueWL.Zero();
+ }
+ if (iExpectedFirstLineLength>0)
+ {
+ TheTest(iExpectedFirstLineLength==aCurrentLineLength);
+ iExpectedFirstLineLength=0;
+ }
+ iCount+=ECountWrapLine;
+ return EFalse;
+ }
+
+TBool CTestVersitObserver::EncodingType(Versit::TVersitEncoding& /*aEncoding*/,TBool /*aRequiresEncoding*/
+ ,Versit::TVersitEncoding aDefaultEncoding,TUid aPropertyUid,TUint /*aPropertyCharset*/)
+ {
+ TheTest(iExpectedDefaultEncoding==aDefaultEncoding);
+ if (iExpectedFirstUid.iUid!=0)
+ {
+ TheTest(iExpectedFirstUid==aPropertyUid);
+ iExpectedFirstUid.iUid=0;
+ }
+ iCount+=ECountEncodeType;
+ return EFalse;
+ }
+
+const TDesC8& CTestVersitObserver::EncodingName(Versit::TVersitEncoding aEncoding)
+ {
+ TheTest(iExpectedEncodingEN==aEncoding);
+ iCount+=ECountEncodeName;
+ return KNullDesC8;
+ }
+
+void CTestVersitObserver::Test1L()
+ {
+ RFile file;
+ _LIT(KFileI,"Z:\\TestFiles\\IVCal.VCS");
+ _LIT(KFileP,"C:\\TestFiles\\PVCal.VCS");
+ _LIT(KVersion,"1.0");
+ _LIT8(KVersion8,"1.0");
+ _LIT(KFirstValue,"VCALENDAR");
+ CParserVCal* parser=CParserVCal::NewL();
+ CleanupStack::PushL(parser);
+ parser->SetObserver(this);
+ parser->SetPlugIn(this);
+ TInt start=0;
+ iCount=0;
+ iExpectedParser=parser;
+ iExpectedVersion=KVersion;
+ iExpectedFirstValueRE=KFirstValue;
+ User::LeaveIfError(file.Open(iFs, KFileI, EFileRead));
+ CleanupClosePushL(file);
+ parser->CVersitParser::InternalizeL(file,start);
+ TheTest(iCount==ECountVersionSet+2*ECountNewParser+19*ECountRemoveEscape);
+ CleanupStack::Pop(&file);
+ file.Close();
+ iCount=0;
+ iExpectedDefaultEncoding=Versit::ENoEncoding;
+ iExpectedFirstValueAE=KVersion;
+ iExpectedFirstValueWL=KVersion8;
+ iExpectedFirstLineLength=8;
+ iExpectedFirstUid.iUid=KVersitPropertyHBufCUid;
+ User::LeaveIfError(file.Replace(iFs, KFileP, EFileWrite));
+ CleanupClosePushL(file);
+ parser->CVersitParser::ExternalizeL(file);
+ TheTest(iCount==2*ECountAddEscape+5*ECountWrapLine+13*ECountEncodeType);
+ CleanupStack::PopAndDestroy(2,parser);
+ }
+
+void CTestVersitObserver::Test2L()
+ {
+ RFile file;
+ _LIT(KFileI,"Z:\\TestFiles\\vCard.VCF");
+ _LIT(KFileP,"C:\\TestFiles\\PvCard.VCF");
+ _LIT(KVersion,"2.1");
+ _LIT8(KVersion8,"2.1");
+ _LIT(KFirstValue,"VCARD");
+ CParserVCard* parser=CParserVCard::NewL();
+ CleanupStack::PushL(parser);
+ parser->SetObserver(this);
+ parser->SetPlugIn(this);
+ TInt start=0;
+ iCount=0;
+ iExpectedParser=parser;
+ iExpectedVersion=KVersion;
+ iExpectedFirstValueRE=KFirstValue;
+ User::LeaveIfError(file.Open(iFs, KFileI, EFileRead));
+ CleanupClosePushL(file);
+ parser->CVersitParser::InternalizeL(file,start);
+ TheTest(iCount==ECountVersionSet+ECountAddSpace+5*ECountDeleteSpace+8*ECountRemoveEscape);
+ CleanupStack::Pop(&file);
+ file.Close();
+ iCount=0;
+ iExpectedDefaultEncoding=Versit::ENoEncoding;
+ iExpectedFirstValueAE=KVersion;
+ iExpectedFirstValueWL=KVersion8;
+ iExpectedFirstLineLength=8;
+ iExpectedFirstUid.iUid=KVersitPropertyHBufCUid;
+ User::LeaveIfError(file.Replace(iFs, KFileP, EFileWrite));
+ CleanupClosePushL(file);
+ parser->CVersitParser::ExternalizeL(file);
+ TheTest(iCount==5*ECountAddEscape+5*ECountWrapLine+6*ECountEncodeType);
+ CleanupStack::PopAndDestroy(2,parser);
+ }
+
+void CTestVersitObserver::Test3L()
+ {
+ RFile file;
+ _LIT(KFileI,"Z:\\TestFiles\\Base64.VCF");
+ _LIT(KFileP,"C:\\TestFiles\\PBase64.VCF");
+ _LIT(KFileP1,"C:\\TestFiles\\PBase64a.VCF");
+ _LIT(KVersion,"2.1");
+ _LIT8(KVersion8,"2.1");
+ _LIT(KFirstValue,"VCARD");
+ CParserVCard* parser=CParserVCard::NewL();
+ CleanupStack::PushL(parser);
+ parser->SetObserver(this);
+ parser->SetPlugIn(this);
+ TInt start=0;
+ iCount=0;
+ iExpectedParser=parser;
+ iExpectedVersion=KVersion;
+ iExpectedFirstValueRE=KFirstValue;
+ User::LeaveIfError(file.Open(iFs, KFileI, EFileRead));
+ CleanupClosePushL(file);
+ parser->CVersitParser::InternalizeL(file,start);
+ TheTest(iCount==ECountVersionSet+ECountNeedsBlank+5*ECountRemoveEscape);
+ CleanupStack::Pop(&file);
+ file.Close();
+ iCount=0;
+ iExpectedDefaultEncoding=Versit::ENoEncoding;
+ iExpectedFirstValueAE=KVersion;
+ iExpectedFirstValueWL=KVersion8;
+ iExpectedFirstLineLength=8;
+ iExpectedFirstUid.iUid=KVersitPropertyHBufCUid;
+ iExpectedEncodingEN=Versit::EQuotedPrintableEncoding;
+ User::LeaveIfError(file.Replace(iFs, KFileP, EFileWrite));
+ CleanupClosePushL(file);
+ parser->CVersitParser::ExternalizeL(file);
+ TheTest(iCount==3*ECountAddEscape+2*ECountWrapLine+3*ECountEncodeType+ECountEncodeName);
+ CleanupStack::Pop(&file);
+ file.Close();
+ iCount=0;
+ iExpectedDefaultEncoding=Versit::EBase64Encoding;
+ iExpectedFirstValueAE=KVersion;
+ iExpectedEncodingEN=Versit::EBase64Encoding;
+ User::LeaveIfError(file.Replace(iFs, KFileP1, EFileWrite));
+ CleanupClosePushL(file);
+ parser->SetDefaultEncoding(Versit::EBase64Encoding);
+ parser->CVersitParser::ExternalizeL(file);
+ TheTest(iCount==3*ECountAddEscape+3*ECountEncodeType+3*ECountEncodeName);
+ CleanupStack::PopAndDestroy(2,parser);
+ }
+
+//test for Reccurrence rule in VCal (VCS)
+void CTestVersitObserver::TestReccurrenceRulesL()
+ {
+ RFile file;
+ _LIT(KFileI,"Z:\\TestFiles\\IRDailyVCal.VCS");
+ CParserVCal* parser=CParserVCal::NewL();
+ CleanupStack::PushL(parser);
+ User::LeaveIfError(file.Open(iFs, KFileI, EFileRead));
+ CleanupClosePushL(file);
+ TInt start=0;
+ parser->CVersitParser::InternalizeL(file,start);
+ CleanupStack::Pop(&file);
+ file.Close();
+ CArrayPtr<CVersitParser>* entities= parser->ArrayOfEntities(EFalse);
+ CArrayPtr<CParserProperty>* properties = (*entities)[0]->PropertyL(KVersitTokenRRULE, TUid::Uid(KVCalPropertyRecurrenceUid), EFalse); // don't take ownership
+ CleanupStack::PushL(properties);
+ CParserPropertyValueRecurrence* propertyrecurval = (CParserPropertyValueRecurrence*)((*properties)[0]->Value());
+ TheTest(2 == (propertyrecurval->Value())->iDuration);
+ CleanupStack::PopAndDestroy(properties);
+ CleanupStack::PopAndDestroy(parser);
+ }
+
+GLDEF_C void TestPlugInL(RFs& aFsSession)
+ {
+ _LIT(KTest,"PlugIn Test");
+
+ TheTest.Start(KTest);
+ CTestVersitObserver* test=new(ELeave) CTestVersitObserver(aFsSession);
+ CleanupStack::PushL(test);
+ _LIT(KTest1,"Simple VCal Test");
+
+ TheTest.Next(KTest1);
+ test->Test1L();
+ _LIT(KTest2,"VCard Test");
+
+ TheTest.Next(KTest2);
+ test->Test2L();
+ _LIT(KTest3,"Base64 Test");
+
+ TheTest.Next(KTest3);
+ test->Test3L();
+ //Testing reccurrence rules of VCal (.vcs)
+ _LIT(KTestRRule,"Testing Reccurrence Rules...");
+
+ TheTest.Next(KTestRRule);
+ test->TestReccurrenceRulesL();
+ CleanupStack::PopAndDestroy(test);
+ TheTest.End();
+ }