pimappservices/calendar/tsrc/T_VCAL2.CPP
changeset 0 f979ecb2b13e
child 31 97232defd20e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pimappservices/calendar/tsrc/T_VCAL2.CPP	Tue Feb 02 10:12:19 2010 +0200
@@ -0,0 +1,724 @@
+// Copyright (c) 1997-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 <e32test.h>
+#include <s32file.h>
+
+#include <caldataexchange.h>
+#include <caldataformat.h>
+#include <calentryview.h>
+#include <calalarm.h>
+#include <caliterator.h>
+
+#include <tz.h> //Conversion between local and UTC times
+
+#include "caltestlib.h"
+#include "caltestoom.h"
+
+LOCAL_D RTest test(_L("T_VCAL2"));
+#define KMaxDateStringLength	30
+
+_LIT(KTestCalendarFile,"c:t_vcal2");
+
+_LIT(KLongSoundNameExportFile,"vCalLongSoundNameExport.vcs");
+
+
+_LIT8(KOOMEntry, 	"BEGIN:VCALENDAR\r\n"
+					"VERSION:1.0\r\n"
+					"BEGIN:VEVENT\r\n"
+					"DESCRIPTION:description\r\n"
+					"ATTACH:attachment\r\n"
+					"SUMMARY:summary\r\n"
+					"CLASS:PUBLIC\r\n"
+					"DTSTART:19990915T090000Z\r\n"
+					"DTEND:19990915T100000Z\r\n"
+					"END:VEVENT\r\n"
+					"END:VCALENDAR\r\n");
+
+//From EXT-5G2CUY "SyncML/versit: Updated VCALENDAR with empty RRULE crash the phone"
+_LIT8(KMissingRRule, "BEGIN:VCALENDAR\r\n"
+					 "VERSION:1.0\r\n"
+					 "BEGIN:VEVENT\r\n"
+					 "UID:4\r\n"
+					 "SUMMARY:test\r\n"
+					 "DTSTART:20021120T090000Z\r\n"
+					 "DTEND:20021120T100000Z\r\n"
+					 "X-EPOCAGENDAENTRYTYPE:APPOINTMENT\r\n"
+					 "CLASS:PUBLIC\r\n"
+					 "DCREATED:20021120T000000Z\r\n"
+					 "RRULE:\r\n"
+					 "LAST-MODIFIED:20021120T122700Z\r\n"
+					 "PRIORITY:0\r\n"
+					 "STATUS:NEEDS ACTION\r\n"
+					 "END:VEVENT\r\n"
+					 "END:VCALENDAR\r\n");
+					
+_LIT8(KEmptyAlarm,	"BEGIN:VCALENDAR\r\n"
+                    "VERSION:1.0\r\n"
+                    "BEGIN:VEVENT\r\n"
+					"UID:8\r\n"
+					"SUMMARY:empty alarm\r\n"
+					"DTSTART:20020916T090000Z\r\n"
+					"DTEND:20020916T100000Z\r\n"
+					"X-EPOCAGENDAENTRYTYPE:APPOINTMENT\r\n"
+					"AALARM:\r\n"
+					"CLASS:PUBLIC\r\n"
+					"DCREATED:20020919T000000Z\r\n"
+					"LAST-MODIFIED:20020919T082100Z\r\n"
+					"PRIORITY:0\r\n"
+					"STATUS:NEEDS ACTION\r\n"
+					"END:VEVENT\r\n"
+                    "END:VCALENDAR\r\n");
+
+_LIT8(KTodoCompletedEntry,	"BEGIN:VCALENDAR\r\n"
+							"VERSION:1.0\r\n"
+							"BEGIN:VTODO\r\n"
+							"DUE:20001224T120000Z\r\n"
+							"SUMMARY:Buy Christmas Presents\r\n"
+							"STATUS:COMPLETED\r\n"
+							"PRIORITY:3\r\n"
+							"END:VTODO\r\n"
+							"END:VCALENDAR\r\n");
+
+_LIT8(KLongSoundNameAlarmExport, "AALARM;TYPE=X-EPOCSOUND:20020809T083900Z;;;");
+_LIT8(KLongSoundName,	"BEGIN:VCALENDAR\r\n"
+						"VERSION:1.0\r\n"
+						"TZ:+00\r\n"
+						"DAYLIGHT:TRUE;+01;20020407T010000;20021031T020000;-05;-04\r\n"
+						"BEGIN:VEVENT\r\n"
+						"DTSTART:20040809T090000Z\r\n"
+						"DTEND:20040809T100000Z\r\n"
+						"LAST-MODIFIED:20040804T060600Z\r\n"
+						"PRIORITY:4\r\n"
+						"CLASS:CONFIDENTIAL\r\n"
+						"SUMMARY:An event\r\n"
+						"AALARM;TYPE=X-EPOCSOUND:20020809T093900;;0;BigSoundNamewwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww.mp3\r\n"
+						"END:VEVENT\r\n"
+						"END:VCALENDAR\r\n");
+
+_LIT8(KAlarmedEntry, 	"BEGIN:VCALENDAR\r\n"
+						"VERSION:1.0\r\n" 
+						"BEGIN:VEVENT\r\n"
+						"CLASS:PUBLIC\r\n"
+						"DTSTART:20010607T090000\r\n"
+						"DTEND:20010607T093000\r\n"
+						"AALARM:20010607T084500\r\n"
+						"SUMMARY:SUMMARY\r\n"
+						"DESCRIPTION:DESCRIPTION\r\n"
+						"END:VEVENT\r\n"
+						"END:VCALENDAR\r\n");
+
+
+_LIT8(KPtr,				 "BEGIN:VCALENDAR\r\n" "PRODID:-//Microsoft Corporation//Outlook MIMEDIR//EN\r\n"
+                         "VERSION:1.0\r\n"
+						 "BEGIN:VEVENT\r\n"
+						 "STATUS:ACCEPTED\r\n"
+						 "DTSTART:20010418T120000Z\r\n"
+						 "DTEND:20010418T130000Z\r\n"
+						 "LOCATION:Pub\r\n"
+						 "SUMMARY:Eat lunch\r\n"
+						 "DESCRIPTION:Working lunch with Example Team. Discuss the preliminary work for new Gee-Whiz promo.\r\n"
+						 "PRIORITY:2\r\n"
+						 "ATTACH:memo\r\n"
+                         "END:VEVENT\r\n"
+						 "BEGIN:VEVENT\r\n"
+						 "STATUS:CONFIRMED\r\n"
+						 "DTSTART:20010418T120000Z\r\n"
+						 "DTEND:20010418T130000Z\r\n"
+						 "LOCATION:Trendy Night Club\r\n"
+						 "SUMMARY:Party!!!\r\n"
+						 "DESCRIPTION:Get your glad rags on for the night of the year. Get down to the Example Night Club. Starts 8.00pm. \r\n"
+						 "PRIORITY:2\r\n"
+						 "ATTACH:memo\r\n"
+                         "END:VEVENT\r\n"
+						 "BEGIN:VEVENT\r\n"
+						 "STATUS:DECLINED\r\n"
+						 "DTSTART:20010418T120000Z\r\n"
+						 "DTEND:20010418T130000Z\r\n"
+						 "LOCATION:Lecture Hall\r\n"
+						 "SUMMARY:Train Timetables Lecture \r\n"
+						 "DESCRIPTION:An exciting journey through the history of railway timetables.\r\n"
+						 "PRIORITY:2\r\n"
+						 "ATTACH:memo\r\n"
+                         "END:VEVENT\r\n"
+						 "BEGIN:VTODO\r\n"					// todo entry
+						 "X-EPOCAGENDAENTRYTYPE:TODO\r\n"
+						 "STATUS:TENTATIVE\r\n"
+						 "DESCRIPTION:to-do item with priority 1\r\n"
+						 "CLASS:PUBLIC\r\n"
+						 "DCREATED:20000113T000000Z\r\n"
+						 "LAST-MODIFIED:20000113T115900Z\r\n"
+						 "PRIORITY:1\r\n"
+						 "END:VTODO\r\n"
+						 "BEGIN:VTODO\r\n"					// todo entry
+						 "X-EPOCAGENDAENTRYTYPE:TODO\r\n"
+						 "STATUS:SENT\r\n"
+						 "SUMMARY:to-do item with priority 2\r\n"
+						 "CLASS:PUBLIC\r\n"
+						 "DCREATED:20000113T000000Z\r\n"
+						 "LAST-MODIFIED:20000113T115900Z\r\n"
+						 "PRIORITY:2\r\n"
+						 "END:VTODO\r\n"
+						 "BEGIN:VTODO\r\n"					// Holiday todo entry - completed
+						 "STATUS:COMPLETED\r\n"
+						 "X-EPOCAGENDAENTRYTYPE:TODO\r\n"
+						 "SUMMARY:Book Holiday\r\n"
+						 "DESCRIPTION:Need a holiday. Book somewhere nice and warm.\r\n"
+						 "CLASS:PUBLIC\r\n"
+						 "DCREATED:20010113T000000Z\r\n"
+						 "COMPLETED:20010125T113000Z\r\n"
+						 "LAST-MODIFIED:20000113T115900Z\r\n"
+						 "PRIORITY:1\r\n"
+						 "END:VTODO\r\n"
+						 "BEGIN:VTODO\r\n"					// Holiday todo entry - uncompleted
+						 "X-EPOCAGENDAENTRYTYPE:TODO\r\n"
+						 "STATUS:DELEGATED\r\n"
+						 "DESCRIPTION:Pack Holiday clothes todo\r\n"
+						 "CLASS:PUBLIC\r\n"
+						 "DCREATED:20010420T000000Z\r\n"
+						 "LAST-MODIFIED:20010313T115900Z\r\n"
+						 "PRIORITY:3\r\n"
+						 "END:VTODO\r\n"
+						 "BEGIN:VTODO\r\n"					// todo entry
+						 "X-EPOCAGENDAENTRYTYPE:TODO\r\n"
+						 "STATUS:NEEDS ACTION\r\n"
+						 "SUMMARY:Gas Bill\r\n"
+						 "DESCRIPTION:Pay this before they cut us off!\r\n"
+						 "CLASS:PUBLIC\r\n"
+						 "DCREATED:20000213T000000Z\r\n"
+						 "LAST-MODIFIED:20000213T115900Z\r\n"
+						 "PRIORITY:4\r\n"
+                         "END:VTODO\r\n"
+ 						 "BEGIN:VTODO\r\n"
+ 						 "UID:6\r\n"
+ 						 "X-EPOCAGENDAENTRYTYPE:TODO\r\n"
+ 						 "DTSTART:19991101T100000\r\n" //no duedate  - should not cause a problem when retrieving
+ 						 "END:VTODO\r\n"
+ 						 "BEGIN:VTODO\r\n"
+ 						 "UID:7\r\n"
+ 						 "X-EPOCAGENDAENTRYTYPE:TODO\r\n"
+ 						 "END:VTODO\r\n"
+ 						 "BEGIN:VEVENT\r\n"
+						 "STATUS:NEEDS ACTION\r\n"
+						 "DTSTART:20010421T120000Z\r\n"
+						 "DTEND:20010421T180000Z\r\n"
+						 "LOCATION:Cardiff\r\n"
+						 "DESCRIPTION:\r\n"  // This should not cause a problem!!
+						 "SUMMARY: FOOTBALL MATCH FINAL\r\n"
+						 "PRIORITY:2\r\n"
+						 "ATTACH:memo\r\n"
+                         "END:VEVENT\r\n"
+ 						 "BEGIN:VEVENT\r\n"
+						 "STATUS:NEEDS ACTION\r\n"
+						 "DTSTART:20010421T120000Z\r\n"
+						 "DTEND:20010421T180000Z\r\n"
+						 "LOCATION:Meeting Room 1\r\n"
+						 "SUMMARY:MIME Lecture\r\n"
+						 "DESCRIPTION;ENCODING=QUOTED-PRINTABLE:"
+						 "  MIME (Multipurpose Internet Mail Extensions) Part Two:=0D=0A"
+						 "  Message Header Extensions for Non-ASCII Text=0D=0A"
+						 "  Status of this Memo =0D=0A="
+						 "  This RFC specifies an Internet standards track protocol for the Interne="
+						 "  t community, and requests discussion and suggestions for improvements. ="
+						 "  Please refer to the current edition of the Internet Official Protocol S="
+						 "  tandards for the standardization state and status of this protocol.  Di="
+						 "  stribution of this memo is unlimited.=0D=0AAbstract=0D=0A"
+						 "  This memo describes an extension to the message format defined in RFC 1="
+						 "  521 [1], to allow the representation of character sets other than ASCII="
+						 "  in RFC 822 (STD 11) message headers.  The extensions described were des="
+						 "  igned to be highly compatible with existing Internet mailhandling softw="
+						 "  are, and to be easily implemented in mail readers that support RFC 1521="
+						 "  .=0D=0A   1. Introduction =0D=0A"
+						 "  RFC 1521 describes a mechanism for denoting textual body parts which are="
+						 "  coded in various character sets, as well as methods for encoding such bo="
+						 "  dy parts as sequences of printable ASCII characters.  This memo describe="
+						 "  s similar techniques to allow the encoding of non-ASCII text in various ="
+						 "  portions of a RFC 822 [2] message header, in a manner which is unlikely ="
+						 "  to confuse existing message handling software. Like the encoding techniq="
+						 "  ues described in RFC 1521, the techniques outlined here were designed to="
+						 "  allow the use of non-ASCII characters in message headers in a way which ="
+						 "  is unlikely to be disturbed by the quirks of existing Internet mail hand="
+						 "  ling programs.  In particular, some mail relaying programs are known to ="
+						 "  (a) delete some message header fields while retaining others, (b) rearra="
+						 "  nge the order of addresses in To or Cc fields, (c) rearrange the (vertic="
+						 "  al) order of header fields, and/or (d) \"wrap\" message headers at diffe="
+						 "  rent places than those in the original message.  In addition, some mail ="
+						 "  reading programs are known to have difficulty correctly parsing message=0D=0A"
+						 "  headers which, while legal according to RFC 822, make use of backslash-q="
+						 "  uoting to \"hide\" special characters such as \"<\", \",\", or \":\", or="
+						 "  which exploit other infrequently-used features of that  specification.=0D=0A"
+						 "  While it is unfortunate that these programs do not correctly interpret R="
+						 "  FC 822 headers, to \"break\" these programs would cause severe operation="
+						 "  al problems for the Internet mail system.  The extensions described in t="
+						 "  his memo therefore do not rely on little- used features of RFC 822. Inst="
+						 "  ead, certain sequences of \"ordinary\" printable ASCII characters (known="
+						 "  as \"encoded-words\") are reserved for use as encoded data.  The syntax ="
+						 "  of encoded-words is such that they are unlikely to \"accidentally\" appe="
+						 "  ar as normal text in message headers. Furthermore, the characters used i="
+						 "  n encoded-words are restricted to those which do not have special meanin="
+						 "  gs in the context in which the encoded-word appears.Generally,an \"encod="
+						 "  ed-word\" is a sequence of printable ASCII characters that begins with \"="
+						 "  =? \", ends with \"?=\", and has two \"?\"s in between.  It specifies a ="
+						 "  character set and an encoding method, and also includes the original tex="
+						 "  t encoded as graphic ASCII characters, according to the rules for that e="
+						 "  ncoding method.=0D=0A"
+						 "  A mail composer that implements this specification will provide a means ="
+						 "  of inputting non-ASCII text in header fields, but will translate these f="
+						 "  ields (or appropriate portions of these fields) into encoded-words befor="
+						 "  e inserting them into the message header. A mail reader that implements ="
+						 "  this specification will recognize encoded-words when they appear in cert="
+						 "  ain portions of the message header.  Instead of displaying the encoded-w="
+						 "  ord \"as is\", it will reverse the encoding and display the original tex="
+						 "  t in the designated character set.\r\n"
+						 "PRIORITY:2\r\n"
+						 "ATTACH:memo\r\n"
+                         "END:VEVENT\r\n"
+						 "BEGIN:VEVENT\r\n"
+						 "STATUS:NEEDS ACTION\r\n"
+						 "DTSTART:20010421T120000Z\r\n"
+						 "DTEND:20010421T180000Z\r\n"
+						 "LOCATION:Example Restaurant\r\n"
+						 "SUMMARY:Meal for 4\r\n"
+						 "DESCREPTION:Book early to get a good table and reservation time.\r\n"
+						 "PRIORITY:2\r\n"
+						 "ATTACH:memo\r\n"
+                         "END:VEVENT\r\n"
+                         "END:VCALENDAR\r\n");
+                         
+_LIT8(KPtr2,			"BEGIN:VCALENDAR\r\n"	//Entry for Japan's time zone
+                         "VERSION:1.0\r\n"
+                         "TZ:+09\r\n"
+                         "BEGIN:VEVENT\r\n"
+                         "DTSTART:20020201T040000Z\r\n"
+                         "DTEND:20020201T050000Z\r\n"
+                         "AALARM:20020201T035000Z;;1;\r\n"
+                         "LAST-MODIFIED:20020513T154705Z\r\n"
+                         "PRIORITY:4\r\n"
+                         "CLASS:CONFIDENTIAL\r\n"
+                         "SUMMARY:S1\r\n"
+                         "ATTENDEE;STATUS=CONFIRMED;RSVP=NO:Example Company\r\n"
+                         "END:VEVENT\r\n"
+                         "BEGIN:VEVENT\r\n"
+                         "DTSTART:20020501T040000Z\r\n"
+                         "DTEND:20020501T050000Z\r\n"
+                         "AALARM:20020501T035000Z;;2;\r\n"
+                         "LAST-MODIFIED:20020513T154734Z\r\n"
+                         "PRIORITY:4\r\n"
+                         "CLASS:CONFIDENTIAL\r\n"
+                         "SUMMARY:S1\r\n"
+                         "ATTENDEE;STATUS=CONFIRMED;RSVP=NO:Example Company\r\n"
+                         "END:VEVENT\r\n"
+                         "END:VCALENDAR\r\n\r\n"		//End of entry for Japan
+                         "BEGIN:VCALENDAR\r\n"			//Entry for UK's time zone
+                         "VERSION:1.0\r\n"
+                         "TZ:+00\r\n"
+                         "DAYLIGHT:TRUE;+01;20020331T000000;20021031T020000;+00;+01\r\n"
+                         "BEGIN:VEVENT\r\n"
+                         "DTSTART:20020202T040000Z\r\n"
+                         "DTEND:20020202T050000Z\r\n"
+                         "AALARM:20020202T035000Z;;1;\r\n"
+                         "LAST-MODIFIED:20020513T155829Z\r\n"
+                         "PRIORITY:4\r\n"
+                         "CLASS:CONFIDENTIAL\r\n"
+                         "SUMMARY:S1\r\n"
+                         "ATTENDEE;STATUS=CONFIRMED;RSVP=NO:Example Company\r\n"
+                         "END:VEVENT\r\n"
+                         "BEGIN:VEVENT\r\n"
+                         "DTSTART:20020502T040000Z\r\n"
+                         "DTEND:20020502T050000Z\r\n"
+                         "AALARM:20020502T035000Z;;2;\r\n"
+                         "LAST-MODIFIED:20020513T155906Z\r\n"
+                         "PRIORITY:4\r\n"
+                         "CLASS:CONFIDENTIAL\r\n"
+                         "SUMMARY:S1\r\n"
+                         "ATTENDEE;STATUS=CONFIRMED;RSVP=NO:Example Company\r\n"
+                         "END:VEVENT\r\n"
+                         "END:VCALENDAR\r\n\r\n"		//End of entry for UK
+                         "BEGIN:VCALENDAR\r\n"			//Entry for New York's time zone
+                         "VERSION:1.0\r\n"
+                         "TZ:-05\r\n"
+                         "DAYLIGHT:TRUE;-04;20020407T010000;20021031T020000;-05;-04\r\n"
+                         "BEGIN:VEVENT\r\n"
+                         "DTSTART:20020203T040000Z\r\n"
+                         "DTEND:20020203T050000Z\r\n"
+                         "AALARM:20020203T035000Z;;1;\r\n"
+                         "LAST-MODIFIED:20020513T161055Z\r\n"
+                         "PRIORITY:4\r\n"
+                         "CLASS:CONFIDENTIAL\r\n"
+                         "SUMMARY:S1\r\n"
+                         "ATTENDEE;STATUS=CONFIRMED;RSVP=NO:Example Company\r\n"
+                         "END:VEVENT\r\n"
+                         "BEGIN:VEVENT\r\n"
+                         "DTSTART:20020503T040000Z\r\n"
+                         "DTEND:20020503T050000Z\r\n"
+                         "AALARM:20020503T035000Z;;2;\r\n"
+                         "LAST-MODIFIED:20020513T161133Z\r\n"
+                         "PRIORITY:4\r\n"
+                         "CLASS:CONFIDENTIAL\r\n"
+                         "SUMMARY:S1\r\n"
+                         "ATTENDEE;STATUS=CONFIRMED;RSVP=NO:Example Company\r\n"
+                         "END:VEVENT\r\n"
+                         "END:VCALENDAR\r\n");			//End of entry for New York
+
+//This vcal caused a leave with KerrNotSupported when a new entry
+//whose datetime has not been set is used to setalarm
+_LIT8(KAlarmVCal,     "BEGIN:VCALENDAR\r\n"
+                        "VERSION:1.0\r\n"
+                        "BEGIN:VTODO\r\n"
+                        "X-EPOCAGENDAENTRYTYPE:TODO\r\n"
+                        "SUMMARY:Task2\r\n"
+                        "DTSTART:20090520T000000\r\n"
+                        "DUE:20090522T000000\r\n"
+                        "CLASS:PUBLIC\r\n"
+                        "PRIORITY:2\r\n"
+                        "AALARM:20090522T080000;;;\r\n"
+                        "STATUS:NEEDS ACTION\r\n"
+                        "END:VTODO\r\n"
+                        "END:VCALENDAR\r\n");
+
+class CTestApp : public CBase , public MCalTestOomCallBack
+	{
+public:
+	static CTestApp* NewL();
+	~CTestApp();
+	
+	void DoImportL(const TDesC8& aVCalendar);
+	void DoTodoCompletedImportL(const TDesC8& aVCalendar);
+	void DoTZImportL(const TDesC8& aVCalendar, RPointerArray<CCalEntry>& aReadStream);
+	void DoSyncMLImportL(const TDesC8& aVCalendar);
+	void DoLongSoundNameImportL(const TDesC& aExportFileName, const TDesC8& aVCalendar);
+	void OomImportL(const TDesC8& aVCalendarFile);
+	void DoImportInvalidAlarmL(const TDesC& aFileName, const TDesC8& aVCalendar);
+	void DoTodoNullDueDateImportL();
+	
+private:
+	void ConstructL();
+	
+public: // from MCalOomTestCallBack
+	void OomTestL(TType /*aType*/, TInt /*aFailAt*/);
+	
+private:
+	CCalTestLibrary* iCalTestLib;
+	CCalDataExchange* iCalDataExchange;
+	
+	TDesC8* iVCalendar; // used in oom test
+	TDesC* iFileName; // used in oom test
+	};
+	
+CTestApp* CTestApp::NewL()
+	{
+	CTestApp* self = new(ELeave) CTestApp;
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+	
+void CTestApp::ConstructL()
+	{
+	iCalTestLib = CCalTestLibrary::NewL();
+	iCalTestLib->ReplaceFileL(KTestCalendarFile);
+	iCalTestLib->OpenFileL(KTestCalendarFile);
+	iCalDataExchange = CCalDataExchange::NewL(iCalTestLib->GetSession());
+	}
+	
+CTestApp::~CTestApp()
+	{
+	TRAP_IGNORE(iCalTestLib->DeleteFileL(KTestCalendarFile, ETrue));
+	delete iCalDataExchange;
+	delete iCalTestLib;
+	}
+
+void CTestApp::DoImportL(const TDesC8& aVCalendar)
+	{
+	RPointerArray<CCalEntry> entryArray;
+	CleanupResetAndDestroyPushL(entryArray);
+	
+	iCalTestLib->ImportL(aVCalendar, entryArray);
+	
+	TInt numSuc;
+	iCalTestLib->SynCGetEntryViewL().StoreL(entryArray, numSuc);
+	
+	CleanupStack::PopAndDestroy(&entryArray);
+	}
+
+
+void CTestApp::DoTodoCompletedImportL(const TDesC8& aVCalendar)
+	{
+	test.Next(_L("Importing All entries - doTodoCompletedImportL"));
+
+	
+	// Create ptr array for new entries
+	RPointerArray<CCalEntry> entryArray;
+	CleanupResetAndDestroyPushL(entryArray);
+	
+	iCalTestLib->ImportL(aVCalendar, entryArray);
+
+	const TInt KSize = entryArray.Count(); //must be one
+	for (TInt i(0) ; i < KSize; ++i)
+		{
+		CCalEntry* entry = entryArray[i];
+		test(entry->CompletedTimeL().TimeLocalL() != Time::NullTTime() && (entry->StatusL() == CCalEntry::ETodoCompleted));
+		}
+
+	CleanupStack::PopAndDestroy(&entryArray);	// entryArray.Close()
+	}
+
+void CTestApp::DoTodoNullDueDateImportL()
+ 	{
+    test.Next(_L("doTodoNullDueDateImportL"));
+
+ 	_LIT(KDateString,"%*E%*D%X%*N%*Y %1 %2 '%3");
+ 	TBuf<KMaxDateStringLength> dateString;
+ 	
+ 	CCalIter* calIter = CCalIter::NewL(iCalTestLib->GetSession());
+ 	CleanupStack::PushL(calIter);
+ 	
+ 	TInt iCount = 0;
+ 	
+ 	for (TDesC8* guid = &const_cast<TDesC8&>(calIter->FirstL());
+ 			guid->Compare(KNullDesC8) != 0;
+ 			guid = &const_cast<TDesC8&>(calIter->NextL()))
+ 		{
+ 		test.Printf(_L("Retrieving Start and End Dates"));
+ 		iCount++;
+ 		
+ 		RPointerArray<CCalEntry> entryArray;
+ 		CleanupResetAndDestroyPushL(entryArray);
+ 		iCalTestLib->SynCGetEntryViewL().FetchL(*guid, entryArray);
+ 
+ 		// Extract EndDate and StartDate
+ 		TTime tenddate = entryArray[0]->EndTimeL().TimeLocalL();
+ 		TTime tstartdate = entryArray[0]->StartTimeL().TimeLocalL();
+ 		if (tstartdate == Time::NullTTime())
+ 			{
+ 			test.Printf(_L("Start date is NullTTime"));
+ 			}
+ 		else
+ 			{
+ 			tstartdate.FormatL(dateString,KDateString);
+ 		  	test.Printf(_L("Start date is  %S"), &dateString);
+ 			}
+ 		if (tenddate == Time::NullTTime())
+ 			{
+ 			test.Printf(_L("End date is NullTTime"));
+ 			}
+ 		else
+ 			{
+ 			tenddate.FormatL(dateString,KDateString);
+ 		  	test.Printf(_L("End date is  %S"), &dateString);
+ 			}
+ 
+ 		CleanupStack::PopAndDestroy(&entryArray);
+ 
+ 		test.Printf(_L("\n"));
+ 		}
+ 	CleanupStack::PopAndDestroy(calIter);
+ 	}
+ 
+void CTestApp::DoTZImportL(const TDesC8& aVCalendar, RPointerArray<CCalEntry>& aEntryArray)
+	{
+	const TInt KMinPerHour=60;
+	// Create array for new entries
+	
+	iCalTestLib->ImportL(aVCalendar, aEntryArray);
+
+	const TInt KSize = aEntryArray.Count();
+	
+	for (TInt i(0); i < KSize; ++i)
+		{
+		CCalEntry* entry = aEntryArray[i];
+		
+		TTime ttime = entry->StartTimeL().TimeUtcL(); //system local time
+		TInt minutes = ttime.DateTime().Hour() * KMinPerHour + ttime.DateTime().Minute();
+		test(minutes == 4*KMinPerHour);
+	
+		ttime = entry->EndTimeL().TimeUtcL(); // system local
+		minutes = ttime.DateTime().Hour() * KMinPerHour + ttime.DateTime().Minute();
+		test(minutes == 5*KMinPerHour);
+		
+		CCalAlarm* alarm = entry->AlarmL();
+		CleanupStack::PushL(alarm);
+		TDateTime alarmTime = (entry->StartTimeL().TimeUtcL() - alarm->TimeOffset()).DateTime();
+		test(alarmTime.Hour()==3 && alarmTime.Minute()==50);
+		CleanupStack::PopAndDestroy(alarm);
+		}
+
+	}
+
+
+void CTestApp::DoSyncMLImportL(const TDesC8& aVCalendar)
+	{
+	RPointerArray<CCalEntry> entryArray;
+	CleanupClosePushL(entryArray);
+	
+	iCalTestLib->ImportL(aVCalendar, entryArray);
+
+	TLocale locale;
+
+	test.Next(_L("Importing1: JAPAN"));
+
+	
+	DoTZImportL(aVCalendar, entryArray);
+
+	test.Next(_L("Importing2: UK"));
+
+	DoTZImportL(aVCalendar, entryArray);
+
+	test.Next(_L("Importing3: New York"));
+
+	DoTZImportL(aVCalendar, entryArray);
+	
+	CleanupStack::PopAndDestroy(&entryArray);
+
+	locale.Set();
+	}
+
+/*
+In a vCal entry if the sound file name is too long then the given name will be
+ignored and alarm entry will be added with empty sound name.
+
+1. Import vCal file with long sound name
+2. Export the same entry into another file
+3. Open the exported file and check for sound name, should be empty.
+*/
+
+
+void CTestApp::DoLongSoundNameImportL(const TDesC& aExportFileName, const TDesC8& aVCalendar)
+	{
+	test.Next(_L("Import with too long sound file name"));
+
+	
+	RPointerArray<CCalEntry> entryArray;
+	CleanupResetAndDestroyPushL(entryArray);
+	
+	iCalTestLib->ImportL(aVCalendar, entryArray);
+	
+	const TInt KSize = entryArray.Count();
+	test(KSize == 1);
+	TLocale locale;
+
+	// Export the entry into another file
+	iCalTestLib->ExportL(aExportFileName, entryArray);
+	locale.Set();
+
+	// Read exported entry and search for sound name, should be empty
+	// get the file size
+	RFile exportFile;
+	iCalTestLib->TestRegister().OpenTempFileLC(exportFile, aExportFileName);
+	TInt pos = 0;
+	exportFile.Seek(ESeekEnd,pos);
+	TInt fileLength = pos;
+	pos = 0;
+	exportFile.Seek(ESeekStart,pos);
+
+	HBufC8* buff = HBufC8::NewLC(fileLength);
+	TPtr8 pBuff(buff->Des());
+	exportFile.Read(pBuff,fileLength);
+	TInt err = pBuff.Find(KLongSoundNameAlarmExport());
+	test(err != KErrNotFound);
+
+	CleanupStack::PopAndDestroy(buff);
+	CleanupStack::PopAndDestroy(&exportFile);
+	CleanupStack::PopAndDestroy(&entryArray);
+	}
+	
+void CTestApp::OomImportL(const TDesC8& aVCalendar)
+	{
+	iVCalendar = const_cast<TDesC8*>(&aVCalendar);
+	CCalSession& calSession = iCalTestLib->GetSession();
+	CalTestOom::OutOfMemoryTestL(*this, EClient, calSession);
+	CalTestOom::OutOfMemoryTestL(*this, EServer, calSession);
+	}
+	
+void CTestApp::OomTestL(TType /*aType*/, TInt /*aFailAt*/)
+	{
+	test.Printf(_L("."));
+	DoImportL(*iVCalendar);
+	}
+
+static void DoMainL()
+	{
+	CTestApp* testApp = CTestApp::NewL();
+	CleanupStack::PushL(testApp);
+
+	test.Printf(_L("Import under normal conditions\n"));
+	testApp->DoImportL(KPtr);
+	
+	test.Printf(_L("Import as if from SX_syncml \n"));
+	testApp->DoImportL(KAlarmedEntry);
+	
+	test.Printf(_L("Importing todo completed entry\n"));
+	testApp->DoTodoCompletedImportL(KTodoCompletedEntry);
+
+	test.Printf(_L("Importing todo nullduedate entry\n"));
+ 	testApp->DoTodoNullDueDateImportL();
+
+	test.Printf(_L("Import an empty alarm\n"));
+	testApp->DoImportL(KEmptyAlarm);
+	
+	test.Printf(_L("Missing RRULE property\n"));
+	testApp->DoImportL(KMissingRRule);
+	
+	test.Printf(_L("Import as if from SyncML Server\n"));
+	testApp->DoSyncMLImportL(KPtr2);
+	
+	test.Printf(_L("Import with too long sound file name\n"));
+	testApp->DoLongSoundNameImportL(KLongSoundNameExportFile, KLongSoundName);
+	
+	test.Printf(_L("Import with simulated heap failure\n"));
+	testApp->OomImportL(KOOMEntry);
+	
+	//This vcal caused a leave with KerrNotSupported when a new entry
+	//whose datetime has not been set is used to setalarm	
+	test.Printf(_L("Import a vcal with alarm information\n"));
+	testApp->DoImportL(KAlarmVCal);
+	
+	CleanupStack::PopAndDestroy(testApp);
+	}
+
+
+/**
+
+@SYMTestCaseID     PIM-T-VCAL2-0001
+
+*/
+
+TInt E32Main()
+	{
+	__UHEAP_MARK;
+	test.Start(_L("@SYMTESTCaseID:PIM-T-VCAL2-0001 T_VCAL2"));
+
+	test.Title();
+	
+	CActiveScheduler* scheduler=new CActiveScheduler;
+	CActiveScheduler::Install(scheduler);
+	
+	CTrapCleanup* theCleanup = CTrapCleanup::New();
+	
+	TRAPD(ret, DoMainL());
+	
+	test(ret==KErrNone);
+	
+	delete theCleanup;
+	delete scheduler;
+	
+	test.End();
+	test.Close();
+	
+	__UHEAP_MARKEND;
+	return KErrNone;
+	}
+