calendarengines/versit2/src/ICalContentLineWriter.cpp
changeset 0 f979ecb2b13e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/calendarengines/versit2/src/ICalContentLineWriter.cpp	Tue Feb 02 10:12:19 2010 +0200
@@ -0,0 +1,199 @@
+/*
+* 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:   Implements the definition of CICalContentLineWriter.It writes the ICAL content.
+*
+*/
+
+
+
+// Class include.
+#include "ICalContentLineWriter.h"	// CICalContentLineWriter
+
+//debug
+#include "calendarengines_debug.h"
+
+// System includes.
+#include <s32strm.h>	// RWriteStream
+#include <utf.h>		// CnvUtfConverter
+
+// Constants.
+const TInt KICalMaxLineLength = 75;	// The length of a line allowed by RFC 2445.
+const TInt KICalMaxFoldedLineLength = KICalMaxLineLength - 1;	// Allows for the extra space at the start of the line.
+
+// Line folding literals.
+_LIT8(KICalCRLF,"\r\n");
+_LIT8(KICalFoldLine,"\r\n ");
+
+/**
+Allocates and constructs a new CICalContentLineWriter.
+@return The newly constructed CICalContentLineWriter
+@internalTechnology
+*/
+CICalContentLineWriter* CICalContentLineWriter::NewL(RWriteStream& aStream)
+	{
+	TRACE_ENTRY_POINT;
+	
+	CICalContentLineWriter* self = CICalContentLineWriter::NewLC(aStream);
+	CleanupStack::Pop(self);
+	
+	TRACE_EXIT_POINT;
+	return self;
+	}
+
+/**
+Allocates and constructs a new CICalContentLineWriter.
+The pointer to the new object is left on the Cleanup Stack.
+@return The newly constructed CICalContentLineWriter.
+@internalTechnology
+*/
+CICalContentLineWriter* CICalContentLineWriter::NewLC(RWriteStream& aStream)
+	{
+	TRACE_ENTRY_POINT;
+	
+	CICalContentLineWriter* self = new (ELeave) CICalContentLineWriter(aStream);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	
+	TRACE_EXIT_POINT;
+	return self;
+	}
+	
+/**
+Destructor.
+@internalTechnology
+*/
+CICalContentLineWriter::~CICalContentLineWriter()
+	{
+	TRACE_ENTRY_POINT;
+	
+	delete iCurrentLine;
+	
+	TRACE_EXIT_POINT;
+	}
+	
+/**
+Writes the current content line to the stream after conversion to UTF-8.
+Performs any necessary folding.
+@internalTechnology
+*/
+void CICalContentLineWriter::WriteContentLineL()
+	{
+	TRACE_ENTRY_POINT;
+	
+	// Convert to UTF-8 for writing
+	HBufC8* tmpLine = CnvUtfConverter::ConvertFromUnicodeToUtf8L(*iCurrentLine);
+	CleanupStack::PushL(tmpLine);
+	
+	TInt pos(0);
+	TInt remaining(tmpLine->Length());
+	
+	// Fold the line if longer than 75 octets
+	TInt lineLength(KICalMaxLineLength);
+	
+	while (remaining > lineLength)
+		{
+		iWriteStream.WriteL(tmpLine->Mid(pos), lineLength);
+		iWriteStream.WriteL(KICalFoldLine);
+		pos += lineLength;
+		remaining -= lineLength;
+		lineLength = KICalMaxFoldedLineLength;
+		}
+		
+	// Complete the line
+	iWriteStream.WriteL(tmpLine->Mid(pos));
+	iWriteStream.WriteL(KICalCRLF);	
+
+	CleanupStack::PopAndDestroy(tmpLine);
+	
+	iCurrentLine->Des().SetLength(0);
+	
+	TRACE_EXIT_POINT;
+	}
+	
+/**
+Append the contents of aLine to the current content line being formed.
+iCurrentLine will be reallocated if not enough storage is available
+@param aLine Descriptor to append.
+@internalTechnology
+*/
+void CICalContentLineWriter::AppendL(const TDesC& aLine)
+	{
+	TRACE_ENTRY_POINT;
+	
+	if (!iCurrentLine)
+		{
+		iCurrentLine = HBufC::NewL(KICalMaxLineLength);
+		}
+		
+	if ((iCurrentLine->Length() + aLine.Length()) > iCurrentLine->Des().MaxLength())
+		{
+		// Reallocate the buffer
+		iCurrentLine = iCurrentLine->ReAllocL(iCurrentLine->Des().MaxLength() + aLine.Length());
+		}
+		
+	iCurrentLine->Des().Append(aLine);	
+	TRACE_EXIT_POINT;
+	}
+	
+/**
+Append a character to the current content line being formed.
+iCurrentLine will be reallocated if not enough storage is available.
+@param aCharacter Character to append.
+@internalTechnology
+*/
+void CICalContentLineWriter::AppendL(const TChar& aCharacter)
+	{
+	TRACE_ENTRY_POINT;
+	
+	if (!iCurrentLine)
+		{
+		iCurrentLine = HBufC::NewL(KICalMaxLineLength);
+		}
+		
+	if ((iCurrentLine->Length() + 1) > iCurrentLine->Des().MaxLength())
+		{
+		// Reallocate the buffer - expand by KICalMaxLineLength rather than '1'
+		// to allow space for further expansion without further reallocation.
+		iCurrentLine = iCurrentLine->ReAllocL(iCurrentLine->Des().MaxLength() + KICalMaxLineLength);
+		}
+
+	iCurrentLine->Des().Append(aCharacter);
+	
+	TRACE_EXIT_POINT;
+	}
+
+/**
+Default constructor.
+@internalTechnology
+@param aStream The stream to write to.
+@internalTechnology
+*/
+CICalContentLineWriter::CICalContentLineWriter(RWriteStream& aStream)
+ :	iWriteStream(aStream)
+	{
+	TRACE_ENTRY_POINT;
+	}
+	
+/**
+Second phase construction.
+@internalTechnology
+*/
+void CICalContentLineWriter::ConstructL()
+	{
+	TRACE_ENTRY_POINT;
+	iCurrentLine = HBufC::NewL(KICalMaxLineLength);
+	TRACE_EXIT_POINT;
+	}
+	
+// End of File