--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/creator/engine/src/creator_calendarelement.cpp Tue Aug 31 15:15:20 2010 +0300
@@ -0,0 +1,595 @@
+/*
+* Copyright (c) 2010 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 "creator_calendarelement.h"
+#include "creator_traces.h"
+#include "creator_calendar.h"
+
+using namespace creatorcalendar;
+
+CCreatorCalendarElement* CCreatorCalendarElement::NewL(CCreatorEngine* aEngine, const TDesC& aName, const TDesC& aContext )
+ {
+ CCreatorCalendarElement* self = new (ELeave) CCreatorCalendarElement(aEngine);
+ CleanupStack::PushL(self);
+ self->ConstructL(aName, aContext);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+void CCreatorCalendarElement::FillEntryParamsL(TEntryType aType, const RPointerArray<CCreatorScriptElement>& fields, CCalenderInterimParameters* parameters)
+ {
+ if( parameters == 0 )
+ return;
+
+ TBool startResolved = EFalse;
+ TBool endResolved = EFalse;
+
+ for( TInt i = 0; i < fields.Count(); ++i )
+ {
+ TPtrC elemName = fields[i]->Name();
+ TPtrC elemContent = fields[i]->Content();
+ const CCreatorScriptAttribute* randomAttr = fields[i]->FindAttributeByName(KRandomLength);
+
+ if( elemName == KSummary || elemName == KDescription )
+ {
+ if( randomAttr || elemContent.Length() == 0 )
+ {
+ TPtrC reason;
+ if( aType == EAppointment )
+ {
+ reason.Set(iEngine->RandomString (CCreatorEngine::EMeetingReason ));
+ }
+ else if( aType == EEvent )
+ {
+ reason.Set(iEngine->RandomString(CCreatorEngine::EMemoText));
+ }
+ else if( aType == EReminder )
+ {
+ reason.Set(iEngine->RandomString(CCreatorEngine::EReminderText));
+ }
+ else if( aType == EAnniversary )
+ {
+ reason.Set(iEngine->RandomString(CCreatorEngine::EAnniversaryReason));
+ }
+ else if( aType == ETodo )
+ {
+ reason.Set(iEngine->RandomString(CCreatorEngine::EToDoText));
+ }
+
+ if( elemName == KDescription )
+ {
+ delete parameters->iDescription;
+ parameters->iDescription = 0;
+ parameters->iDescription = HBufC::NewL(reason.Length());
+ parameters->iDescription->Des().Copy(reason);
+ }
+ else if(elemName == KSummary)
+ {
+ delete parameters->iSummary;
+ parameters->iSummary = 0;
+ parameters->iSummary = HBufC::NewL(reason.Length());
+ parameters->iSummary->Des().Copy(reason);
+ }
+ }
+ else if( elemName == KDescription )
+ {
+ delete parameters->iDescription;
+ parameters->iDescription = 0;
+ parameters->iDescription = HBufC::NewL(elemContent.Length());
+ parameters->iDescription->Des().Copy(elemContent);
+ }
+ else if( elemName == KSummary)
+ {
+ delete parameters->iSummary;
+ parameters->iSummary = 0;
+ parameters->iSummary = HBufC::NewL(elemContent.Length());
+ parameters->iSummary->Des().Copy(elemContent);
+ }
+ }
+ else if( elemName == KLocation )
+ {
+ delete parameters->iLocation;
+ parameters->iLocation = 0;
+
+ if( randomAttr || elemContent.Length() == 0 )
+ {
+ TPtrC reason = iEngine->RandomString (CCreatorEngine::EMeetingPlace );
+ parameters->iLocation = HBufC::NewL(reason.Length());
+ parameters->iLocation->Des().Copy(reason);
+ }
+ else
+ {
+ parameters->iLocation = HBufC::NewL(elemContent.Length());
+ parameters->iLocation->Des().Copy(elemContent);
+ }
+ }
+ else if( elemName == KStarttime )
+ {
+ if( randomAttr || elemContent.Length() == 0 )
+ {
+ // Random start time used. If end time is already resolved, let's use that one for the basis.
+ if( endResolved )
+ {
+ parameters->iStartTime = iEngine->RandomTime(parameters->iEndTime, CCreatorEngine::EDatePast);
+ }
+ else
+ {
+ // Past or future:
+ CCreatorEngine::TRandomDateType pastOrfuture =
+ (CCreatorEngine::TRandomDateType) iEngine->RandomNumber((TInt) CCreatorEngine::EDatePast,
+ (TInt) CCreatorEngine::EDateFuture);
+
+ parameters->iStartTime =
+ iEngine->RandomTime(iEngine->RandomDate(pastOrfuture), pastOrfuture);
+ }
+ }
+ else
+ {
+ parameters->iStartTime = ConvertToDateTimeL(elemContent);
+ }
+ startResolved = ETrue;
+ }
+ else if( elemName == KEndtime )
+ {
+ if( randomAttr || elemContent.Length() == 0 )
+ {
+ // Random end time used. If start time is already resolved, let's use that one.
+ if( startResolved )
+ {
+ parameters->iEndTime = iEngine->RandomTime(parameters->iStartTime, CCreatorEngine::EDateFuture);
+ }
+ else
+ {
+ // Past or future:
+ CCreatorEngine::TRandomDateType pastOrfuture =
+ (CCreatorEngine::TRandomDateType) iEngine->RandomNumber((TInt) CCreatorEngine::EDatePast,
+ (TInt) CCreatorEngine::EDateFuture);
+
+ parameters->iEndTime =
+ iEngine->RandomTime(iEngine->RandomDate(pastOrfuture), pastOrfuture);
+ }
+ }
+ else
+ {
+ parameters->iEndTime = ConvertToDateTimeL(elemContent);
+ }
+ if( aType == ETodo )
+ {
+ parameters->iTodoDueTime = parameters->iEndTime;
+ }
+ }
+ else if( elemName == KRecurrentFreq )
+ {
+ TInt randomFreq = 0;
+ if( randomAttr || elemContent.Length() == 0 )
+ {
+ randomFreq = iEngine->RandomNumber(1, 4);
+ }
+ if(randomFreq == 1 || CompareIgnoreCase(elemContent, KDaily) == 0 )
+ parameters->iRecurrentFrequency = TCalRRule::EDaily;
+ else if( randomFreq == 2 || CompareIgnoreCase(elemContent, KWeekly) == 0 )
+ parameters->iRecurrentFrequency = TCalRRule::EWeekly;
+ else if( randomFreq == 3 || CompareIgnoreCase(elemContent, KMonthly) == 0 )
+ parameters->iRecurrentFrequency = TCalRRule::EMonthly;
+ else if( randomFreq == 4 || CompareIgnoreCase(elemContent, KYearly) == 0 )
+ parameters->iRecurrentFrequency = TCalRRule::EYearly;
+ else
+ parameters->iRecurrentFrequency = TCalRRule::EInvalid;
+ }
+ else if( elemName == KRecurrentInterval )
+ {
+ if( randomAttr || elemContent.Length() == 0 )
+ {
+ parameters->iRecurrentInterval = iEngine->RandomNumber(1,7);
+ }
+ else
+ {
+ parameters->iRecurrentInterval = ConvertStrToIntL(elemContent);
+ }
+ }
+ else if( elemName == KRecurrentFrom )
+ {
+ if( randomAttr || elemContent.Length() == 0 )
+ {
+ if( startResolved )
+ {
+ // Let's use the start time if it's resolved.
+ parameters->iRecurrentStartTime = parameters->iStartTime;
+ }
+ else
+ {
+ parameters->iRecurrentStartTime = iEngine->RandomDate(CCreatorEngine::EDateFuture);
+ }
+ }
+ else
+ {
+ parameters->iRecurrentStartTime = ConvertToDateTimeL(elemContent);
+ }
+ }
+ else if( elemName == KRecurrentTo )
+ {
+ if( randomAttr || elemContent.Length() == 0 )
+ {
+ parameters->iRepeatingCount = iEngine->RandomNumber(1, 6);
+ //parameters->iRecurrentEndTime = iEngine->RandomDate(CCreatorEngine::EDateFuture);
+ }
+ else
+ {
+ parameters->iRecurrentEndTime = ConvertToDateTimeL(elemContent);
+ }
+ }
+ else if( elemName == KRepeatingCount )
+ {
+ if( randomAttr || elemContent.Length() == 0 )
+ {
+ parameters->iRepeatingCount = iEngine->RandomNumber(1, 52);
+ }
+ else
+ {
+ parameters->iRepeatingCount = ConvertStrToIntL(elemContent);
+ }
+ }
+ else if( elemName == KAlarmtime )
+ {
+ if( randomAttr || elemContent.Length() == 0 )
+ {
+ parameters->iUseRandomAlarmTime = ETrue;
+ }
+ else
+ {
+ parameters->iAlarmTime = ConvertToDateTimeL(elemContent);
+ }
+ }
+ else if( elemName == KOrganizername )
+ {
+ delete parameters->iOrganizerName;
+ parameters->iOrganizerName = 0;
+ if( randomAttr || elemContent.Length() == 0 )
+ {
+ TPtrC name = iEngine->RandomString (CCreatorEngine::EFirstName );
+ parameters->iOrganizerName = HBufC::NewL(name.Length());
+ parameters->iOrganizerName->Des().Copy(name);
+ }
+ else
+ {
+ parameters->iOrganizerName = HBufC::NewL(elemContent.Length());
+ parameters->iOrganizerName->Des().Copy(elemContent);
+ }
+ }
+ else if( elemName == KOrganizeremail )
+ {
+ delete parameters->iOrganizerEmail;
+ parameters->iOrganizerEmail = 0;
+ if( randomAttr || elemContent.Length() == 0 )
+ {
+ TDesC* email = iEngine->CreateEmailAddressLC();
+ parameters->iOrganizerEmail = (HBufC*) email;
+ CleanupStack::Pop(); // email
+ }
+ else
+ {
+ parameters->iOrganizerEmail = HBufC::NewL(elemContent.Length());
+ parameters->iOrganizerEmail->Des().Copy(elemContent);
+ }
+ }
+ else if( elemName == KStatus )
+ {
+ if( randomAttr || elemContent.Length() == 0 )
+ {
+ if( aType == ETodo )
+ {
+ parameters->iStatus = (CCalEntry::TStatus) iEngine->RandomNumber(CCalEntry::ETodoNeedsAction, CCalEntry::ETodoInProcess);
+ }
+ else
+ {
+ parameters->iStatus = (CCalEntry::TStatus) iEngine->RandomNumber(CCalEntry::ETentative, CCalEntry::ECancelled);
+ }
+ }
+ else if( CompareIgnoreCase(elemContent, KCalStatusTentative) == 0 )
+ {
+ parameters->iStatus = CCalEntry::ETentative;
+ }
+ else if( CompareIgnoreCase(elemContent, KCalStatusConfirmed) == 0 )
+ {
+ parameters->iStatus = CCalEntry::EConfirmed;
+ }
+ else if( CompareIgnoreCase(elemContent, KCalStatusCancelled) == 0 )
+ {
+ parameters->iStatus = CCalEntry::ECancelled;
+ }
+ else if( CompareIgnoreCase(elemContent, KCalStatusNeedsAction) == 0 )
+ {
+ parameters->iStatus = CCalEntry::ETodoNeedsAction;
+ }
+ else if( CompareIgnoreCase(elemContent, KCalStatusCompleted) == 0 )
+ {
+ parameters->iStatus = CCalEntry::ETodoCompleted;
+ }
+ else if( CompareIgnoreCase(elemContent, KCalStatusInProcess) == 0 )
+ {
+ parameters->iStatus = CCalEntry::ETodoInProcess;
+ }
+ else
+ {
+ parameters->iStatus = CCalEntry::ENullStatus;
+ }
+ }
+ else if( elemName == KPriority )
+ {
+ if( randomAttr || elemContent.Length() == 0 )
+ {
+ parameters->iTodoPriority = iEngine->RandomNumber(1,3);
+ }
+ else if( CompareIgnoreCase(elemContent, KPriorityHigh) == 0)
+ {
+ parameters->iTodoPriority = 1;
+ }
+ else if( CompareIgnoreCase(elemContent, KPriorityMedium) == 0)
+ {
+ parameters->iTodoPriority = 2;
+ }
+ else if( CompareIgnoreCase(elemContent, KPriorityLow) == 0 )
+ {
+ parameters->iTodoPriority = 3;
+ }
+ else
+ {
+ parameters->iTodoPriority = ConvertStrToIntL(elemContent);
+ }
+ }
+ else if( elemName == KAttendees )
+ {
+ const RPointerArray<CCreatorScriptElement>& attendeesSubElems = fields[i]->SubElements();
+ for( TInt j = 0; j < attendeesSubElems.Count(); ++j )
+ {
+ TPtrC eName = attendeesSubElems[j]->Name();
+ TPtrC eContent = attendeesSubElems[j]->Content();
+ if( eName == KContactSetRef )
+ {
+ AppendContactSetReferenceL(*attendeesSubElems[j], parameters->iAttendeeLinkIds);
+ }
+ else if( eName == KAttendee )
+ {
+ CCreatorCalenderAttendee* calAtt = CCreatorCalenderAttendee::NewL();
+ CleanupStack::PushL(calAtt);
+ const RPointerArray<CCreatorScriptElement>& attendeeFields = attendeesSubElems[j]->SubElements();
+ // Make sure that at least email is given:
+ if(attendeeFields.Count() == 0 )
+ {
+ CCreatorScriptElement* emailField = CCreatorScriptElement::NewL(iEngine, KEmail );
+ CleanupStack::PushL(emailField);
+ fields[i]->SubElements().AppendL(emailField);
+ CleanupStack::Pop(); // emailField
+ }
+ for( TInt k = 0; k < attendeeFields.Count(); ++k )
+ {
+ const CCreatorScriptAttribute* randomAttr = attendeeFields[k]->FindAttributeByName(KRandomLength);
+ TPtrC attElemName = attendeeFields[k]->Name();
+ TPtrC attElemCont = attendeeFields[k]->Content();
+ if( attElemName == KCommonname )
+ {
+ if( randomAttr || attElemCont.Length() == 0)
+ {
+ // Random data:
+ calAtt->SetCommonNameL(iEngine->RandomString(CCreatorEngine::EFirstName));
+ }
+ else
+ {
+ calAtt->SetCommonNameL(attElemCont);
+ }
+ }
+ else if( attElemName == KEmail )
+ {
+ if( randomAttr || attElemCont.Length() == 0)
+ {
+ // Random data:
+ TDesC* email = iEngine->CreateEmailAddressLC();
+ calAtt->SetEmailAddressL(*email);
+ CleanupStack::PopAndDestroy(); // email
+ }
+ else
+ {
+ calAtt->SetEmailAddressL(attElemCont);
+ }
+ }
+ else if( attElemName == KRole )
+ {
+ if( randomAttr || attElemCont.Length() == 0)
+ {
+ // Random role:
+ CCalAttendee::TCalRole randomRole =
+ (CCalAttendee::TCalRole) iEngine->RandomNumber(
+ (TInt) CCalAttendee::EReqParticipant,
+ (TInt) CCalAttendee::EChair);
+ calAtt->SetRole(randomRole);
+ }
+ else if( CompareIgnoreCase(attElemCont, KRoleRequired) == 0 )
+ {
+ calAtt->SetRole(CCalAttendee::EReqParticipant);
+ }
+ else if( CompareIgnoreCase(attElemCont, KRoleOptional) == 0 )
+ {
+ calAtt->SetRole(CCalAttendee::EOptParticipant);
+ }
+ else if( CompareIgnoreCase(attElemCont, KRoleNonPart) == 0 )
+ {
+ calAtt->SetRole(CCalAttendee::ENonParticipant);
+ }
+ else if( CompareIgnoreCase(attElemCont, KRoleChair) == 0 )
+ {
+ calAtt->SetRole(CCalAttendee::EChair);
+ }
+ }
+ else if( attElemName == KStatus )
+ {
+ if( randomAttr || attElemCont.Length() == 0)
+ {
+ // Random role:
+ CCalAttendee::TCalStatus randomStatus =
+ (CCalAttendee::TCalStatus) iEngine->RandomNumber(
+ (TInt) CCalAttendee::ENeedsAction,
+ (TInt) CCalAttendee::EInProcess);
+ calAtt->SetStatus(randomStatus);
+ }
+ else if( CompareIgnoreCase(attElemCont, KStatusNeedsAction) == 0 )
+ {
+ calAtt->SetStatus(CCalAttendee::ENeedsAction);
+ }
+ else if( CompareIgnoreCase(attElemCont, KStatusAccepted) == 0 )
+ {
+ calAtt->SetStatus(CCalAttendee::EAccepted);
+ }
+ else if( CompareIgnoreCase(attElemCont, KStatusTentative) == 0 )
+ {
+ calAtt->SetStatus(CCalAttendee::ETentative);
+ }
+ else if( CompareIgnoreCase(attElemCont, KStatusConfirmed) == 0 )
+ {
+ calAtt->SetStatus(CCalAttendee::EConfirmed);
+ }
+ else if( CompareIgnoreCase(attElemCont, KStatusDeclined) == 0 )
+ {
+ calAtt->SetStatus(CCalAttendee::EDeclined);
+ }
+ else if( CompareIgnoreCase(attElemCont, KStatusCompleted) == 0 )
+ {
+ calAtt->SetStatus(CCalAttendee::ECompleted);
+ }
+ else if( CompareIgnoreCase(attElemCont, KStatusDelegated) == 0 )
+ {
+ calAtt->SetStatus(CCalAttendee::EDelegated);
+ }
+ else if( CompareIgnoreCase(attElemCont, KStatusInProcess) == 0 )
+ {
+ calAtt->SetStatus(CCalAttendee::EInProcess);
+ }
+ }
+ }
+ parameters->iAttendees.AppendL(calAtt);
+ CleanupStack::Pop(); // calAtt
+ }
+ }
+ }
+ }
+ }
+
+void CCreatorCalendarElement::ExecuteCommandL()
+ {
+ LOGSTRING("Creator: CCreatorCalendarElement::ExecuteCommandL");
+ // Amount of calendar entries:
+ const CCreatorScriptAttribute* calEntryAmountAttr = this->FindAttributeByName(KAmount);
+ const CCreatorScriptAttribute* calEntryTypeAttr = this->FindAttributeByName(KType);
+ TInt entryAmount = 1;
+ if( calEntryAmountAttr )
+ {
+ entryAmount = ConvertStrToIntL(calEntryAmountAttr->Value());
+ }
+ if( calEntryTypeAttr == 0 )
+ {
+ LOGSTRING("ERROR in CCreatorCalendarElement::ExecuteCommandL: Type attribute is missing.");
+ User::Leave(KErrGeneral); // type is required attribute
+ }
+
+ // Find fields element:
+ CCreatorScriptElement* fieldsElement = FindSubElement(KFields);
+
+ for( TInt cI = 0; cI < entryAmount; ++cI )
+ {
+ CCalenderInterimParameters* param = new (ELeave) CCalenderInterimParameters;
+ CleanupStack::PushL(param);
+ if( CompareIgnoreCase(calEntryTypeAttr->Value(), KCalTypeAppointment) == 0 )
+ {
+ if( fieldsElement && fieldsElement->SubElements().Count() > 0 )
+ {
+ FillEntryParamsL(EAppointment, fieldsElement->SubElements(), param);
+ iEngine->AppendToCommandArrayL(ECmdCreateCalendarEntryAppointments, param);
+ }
+ else
+ {
+ iEngine->AppendToCommandArrayL(ECmdCreateCalendarEntryAppointments, 0, entryAmount);
+ CleanupStack::PopAndDestroy(param);
+ break; // We can step out from the for-loop, because the amount is given to engine.
+ }
+ }
+ else if( CompareIgnoreCase(calEntryTypeAttr->Value(), KCalTypeEvent ) == 0 )
+ {
+ if( fieldsElement && fieldsElement->SubElements().Count() > 0 )
+ {
+ FillEntryParamsL(EEvent, fieldsElement->SubElements(), param);
+ iEngine->AppendToCommandArrayL(ECmdCreateCalendarEntryEvents, param);
+ }
+ else
+ {
+ iEngine->AppendToCommandArrayL(ECmdCreateCalendarEntryEvents, 0, entryAmount);
+ CleanupStack::PopAndDestroy(param);
+ break; // We can step out from the for-loop, because the amount is given to engine.
+ }
+ }
+ else if( CompareIgnoreCase(calEntryTypeAttr->Value(), KCalTypeReminder ) == 0 )
+ {
+ if( fieldsElement && fieldsElement->SubElements().Count() > 0 )
+ {
+ FillEntryParamsL(EReminder, fieldsElement->SubElements(), param);
+ iEngine->AppendToCommandArrayL(ECmdCreateCalendarEntryReminders, param);
+ }
+ else
+ {
+ iEngine->AppendToCommandArrayL(ECmdCreateCalendarEntryReminders, 0, entryAmount);
+ CleanupStack::PopAndDestroy(param);
+ break; // We can step out from the for-loop, because the amount is given to engine.
+ }
+ }
+ else if( CompareIgnoreCase(calEntryTypeAttr->Value(), KCalTypeAnniversary ) == 0 )
+ {
+ if( fieldsElement && fieldsElement->SubElements().Count() > 0 )
+ {
+ FillEntryParamsL(EAnniversary, fieldsElement->SubElements(), param);
+ iEngine->AppendToCommandArrayL(ECmdCreateCalendarEntryAnniversaries, param);
+ }
+ else
+ {
+ iEngine->AppendToCommandArrayL(ECmdCreateCalendarEntryAnniversaries, 0, entryAmount);
+ CleanupStack::PopAndDestroy(param);
+ break; // We can step out from the for-loop, because the amount is given to engine.
+ }
+ }
+ else if( CompareIgnoreCase(calEntryTypeAttr->Value(), KCalTypeTodo ) == 0 )
+ {
+ if( fieldsElement && fieldsElement->SubElements().Count() > 0 )
+ {
+ FillEntryParamsL(ETodo, fieldsElement->SubElements(), param);
+ iEngine->AppendToCommandArrayL(ECmdCreateCalendarEntryToDos, param);
+ }
+ else
+ {
+ iEngine->AppendToCommandArrayL(ECmdCreateCalendarEntryToDos, 0, entryAmount);
+ CleanupStack::PopAndDestroy(param);
+ break; // We can step out from the for-loop, because the amount is given to engine.
+ }
+ }
+ CleanupStack::Pop(); // param
+ }
+ }
+
+CCreatorCalendarElement::CCreatorCalendarElement(CCreatorEngine* aEngine)
+:
+CCreatorScriptElement(aEngine)
+ {
+ iIsCommandElement = ETrue;
+ }