meetingrequest/mrversit2/src/cesmricalrulesegment.cpp
changeset 0 8466d47a6819
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/meetingrequest/mrversit2/src/cesmricalrulesegment.cpp	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,341 @@
+/*
+* Copyright (c) 2002-2004 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: This file implements class CESMRICalRuleSegment.
+*
+*/
+
+
+// Class include.
+#include "emailtrace.h"
+#include "cesmricalrulesegment.h"	// CESMRICalRuleSegment
+
+//debug
+
+// User includes.
+#include "esmricalkeywords.h"	// Literals
+#include "esmricalerrors.h"		// Error codes
+#include "cesmricalvalue.h"		// CESMRICalValue
+
+/**
+Static factory construction. Not exported as this class is only provided as a
+utility for breaking down recurrence rules into segments - it is only ever
+created by the CESMRICalValue class.
+@param aSource TDesC containing the rule segment information
+@return A new rule segment
+@internalTechnology
+*/
+CESMRICalRuleSegment* CESMRICalRuleSegment::NewL(const TDesC& aSource)
+	{
+    FUNC_LOG;
+	
+	CESMRICalRuleSegment* self = CESMRICalRuleSegment::NewLC(aSource);
+	CleanupStack::Pop(self);
+	
+	return self;
+	}
+
+/**
+Static factory construction. Not exported as this class is only provided as a
+utility for breaking down recurrence rules into segments - it is only ever
+created by the CESMRICalValue class.
+@param aSource TDesC containing the rule segment information
+@return A new rule segment
+@internalTechnology
+*/
+CESMRICalRuleSegment* CESMRICalRuleSegment::NewLC(const TDesC& aSource)
+	{
+    FUNC_LOG;
+	
+	CESMRICalRuleSegment* self = new (ELeave) CESMRICalRuleSegment;
+	CleanupStack::PushL(self);
+	self->ConstructL(aSource);
+	
+	return self;
+	}
+
+/**
+Destructor
+@internalTechnology
+*/
+CESMRICalRuleSegment::~CESMRICalRuleSegment()
+	{
+    FUNC_LOG;
+	
+	iValues.ResetAndDestroy();
+	delete iTypeString;
+	}
+
+/**
+Access method for the segment type as a descriptor.
+@return The segment type as a descriptor or an empty descriptor if no type is
+set.
+@publishedPartner
+*/
+EXPORT_C const TDesC& CESMRICalRuleSegment::TypeName() const
+	{
+    FUNC_LOG;
+	
+	if (iTypeString)
+		{
+		return *iTypeString;
+		}
+		
+	// Else type is not set due to SetTypeL() leaving.
+	return KNullDesC;
+	}
+
+/**
+Access method for the value array.
+@return The value array.
+@publishedPartner
+*/
+EXPORT_C const RPointerArray<CESMRICalValue>& CESMRICalRuleSegment::Values() const
+	{
+	return iValues;
+	}
+	
+/**
+Access method for the segment type as an enumeration.
+@return The segment type as an enumeration.
+@publishedPartner
+*/
+EXPORT_C CESMRICalRuleSegment::TSegmentType CESMRICalRuleSegment::Type() const
+	{
+    FUNC_LOG;
+	return iType;
+	}
+
+/**
+Access method for the segment value as a frequency enumeration. Only the first
+value is used.
+@return The segment value as a frequency.
+@leave Leaves with KErrRuleTypeNotFrequency if this rule segment does not
+contain a frequency.
+@leave Leaves with KErrRuleFrequencyUnknown if the frequency cannot be
+determined.
+@publishedPartner
+*/
+EXPORT_C CESMRICalRuleSegment::TFreq CESMRICalRuleSegment::FreqL() const
+	{
+    FUNC_LOG;
+	
+	// Type MUST be frequency if this method is called.
+	
+	if (iType != ESegFreq)
+		{
+		User::Leave(KErrRuleTypeNotFrequency);
+		}
+	
+	// The rule must have at least one value.
+	// If it has more than one then the first value is taken (for recoverability).
+	if (iValues.Count() == 0)
+		{
+		User::Leave(KErrRuleFrequencyUnknown);
+		}
+	
+	// Compare the first value.
+	const TDesC& firstValue = iValues[0]->TextL();
+	
+	if (firstValue.CompareF(KICalYearly) == 0)
+		{
+		return EFreqYearly;
+		}
+	else if (firstValue.CompareF(KICalMonthly) == 0)
+		{
+		return EFreqMonthly;
+		}
+	else if (firstValue.CompareF(KICalWeekly) == 0)
+		{
+		return EFreqWeekly;
+		}
+	else if (firstValue.CompareF(KICalDaily) == 0)
+		{
+		return EFreqDaily;
+		}
+	else if (firstValue.CompareF(KICalHourly) == 0)
+		{
+		return EFreqHourly;
+		}
+	else if (firstValue.CompareF(KICalMinutely) == 0)
+		{
+		return EFreqMinutely;
+		}
+	else if (firstValue.CompareF(KICalSecondly) == 0)
+		{
+		return EFreqSecondly;
+		}
+	
+	// Else...
+	User::Leave(KErrRuleFrequencyUnknown);
+	
+	return EFreqDaily;	// Never reached.
+	}
+	
+/**
+Constructor
+@internalTechnology
+*/
+CESMRICalRuleSegment::CESMRICalRuleSegment()
+	{
+    FUNC_LOG;
+	}
+
+/**
+Internal construction.
+@param aSource Descriptor containing details of the segment.
+@leave Leaves with KErrInvalidRuleSegment if the rule segment has no "type".
+@leave Leaves with KErrRuleSegmentHasNoValue if the rule segment has no value.
+@leave Leaves if there is an error adding a value to this rule segment.
+@internalTechnology
+*/
+void CESMRICalRuleSegment::ConstructL(const TDesC& aSource)
+	{
+    FUNC_LOG;
+	
+	// We've been passed a descriptor containing the type string followed
+	// by an equals sign followed by (one or more) comma separated values.
+	// All escaping is assumed to have been previously removed.
+	
+	// Get the position of the equals sign.
+	const TInt equalsSignPos = aSource.Locate(KICalEqualsChar);
+	
+	if (equalsSignPos < 1)	// "Type" must be at least one character long.
+		{
+		User::Leave(KErrInvalidRuleSegment);
+		}
+
+	if ((equalsSignPos + 1) >= aSource.Length())	// Value must be at least one character long.
+		{
+		User::Leave(KErrRuleSegmentHasNoValue);
+		}
+
+	// Any text before this point is the type string.
+	SetTypeL(aSource.Left(equalsSignPos));
+	
+	// Any text after this point contains value information
+	TPtrC aRemainder(aSource.Mid(equalsSignPos + 1));
+	
+	while (aRemainder.Length() > 0)
+		{
+		// Find the next comma.
+		TInt endOfValue(aRemainder.Locate(KICalCommaChar));
+		
+		if (endOfValue == KErrNotFound)
+			{
+			endOfValue = aRemainder.Length();
+			}
+		
+		// Add value.
+		if (endOfValue > 0)
+			{
+			CESMRICalValue* val = CESMRICalValue::NewLC();
+			val->SetTextL(aRemainder.Left(endOfValue));
+			User::LeaveIfError(iValues.Append(val));
+			CleanupStack::Pop(val);
+			}
+		
+		// Set the remainder.
+		if (endOfValue < (aRemainder.Length() - 1))	// Value must be at least one character long.
+			{
+			aRemainder.Set(aRemainder.Mid(endOfValue + 1));
+			}
+		else
+			{
+			break;
+			}
+		}
+	
+	}
+
+/**
+Sets the type of a rule segment.
+@param aType The type as a descriptor.
+@internalTechnology
+*/
+void CESMRICalRuleSegment::SetTypeL(const TDesC& aType)
+	{
+    FUNC_LOG;
+
+	// Set the type.
+	
+	if (aType.CompareF(KICalFreq) == 0)
+		{
+		iType = ESegFreq;
+		}
+	else if (aType.CompareF(KICalUntil) == 0)
+		{
+		iType = ESegUntil;
+		}
+	else if (aType.CompareF(KICalCount) == 0)
+		{
+		iType = ESegCount;
+		}
+	else if (aType.CompareF(KICalInterval) == 0)
+		{
+		iType = ESegInterval;
+		}
+	else if (aType.CompareF(KICalBySecond) == 0)
+		{
+		iType = ESegBySecond;
+		}
+	else if (aType.CompareF(KICalByMinute) == 0)
+		{
+		iType = ESegByMinute;
+		}
+	else if (aType.CompareF(KICalByHour) == 0)
+		{
+		iType = ESegByHour;
+		}
+	else if (aType.CompareF(KICalByDay) == 0)
+		{
+		iType = ESegByDay;
+		}
+	else if (aType.CompareF(KICalByMonthDay) == 0)
+		{
+		iType = ESegByMonthDay;
+		}
+	else if (aType.CompareF(KICalByYearDay) == 0)
+		{
+		iType = ESegByYearDay;
+		}
+	else if (aType.CompareF(KICalByWeekNo) == 0)
+		{
+		iType = ESegByWeekNo;
+		}
+	else if (aType.CompareF(KICalByMonth) == 0)
+		{
+		iType = ESegByMonth;
+		}
+	else if (aType.CompareF(KICalBySetPos) == 0)
+		{
+		iType = ESegByPos;
+		}
+	else if (aType.CompareF(KICalWkSt) == 0)
+		{
+		iType = ESegWkSt;
+		}
+	else
+		{
+		iType = ESegExtension;
+		}
+	
+	// Set the type string.
+	delete iTypeString;
+	iTypeString = NULL;
+	iTypeString = aType.AllocL();
+	
+	}
+
+// End of File
+