meetingrequest/mrversit2/src/cesmricalcontentlinewriter.cpp
changeset 0 8466d47a6819
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/meetingrequest/mrversit2/src/cesmricalcontentlinewriter.cpp	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,187 @@
+/*
+* 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: This file implements class CESMRICalContentLineWriter.
+*
+*/
+
+
+// Class include.
+#include "emailtrace.h"
+#include "cesmricalcontentlinewriter.h" // CESMRICalContentLineWriter
+
+//debug
+
+// System includes.
+#include <s32strm.h>    // RWriteStream
+#include <utf.h>        // CnvUtfConverter
+
+namespace{
+// 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 ");
+}//namespace
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CESMRICalContentLineWriter::NewL
+// ---------------------------------------------------------------------------
+//
+CESMRICalContentLineWriter* CESMRICalContentLineWriter::NewL(RWriteStream& aStream)
+    {
+    FUNC_LOG;
+
+    CESMRICalContentLineWriter* self = CESMRICalContentLineWriter::NewLC(aStream);
+    CleanupStack::Pop(self);
+
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRICalContentLineWriter::NewLC
+// ---------------------------------------------------------------------------
+//
+CESMRICalContentLineWriter* CESMRICalContentLineWriter::NewLC(RWriteStream& aStream)
+    {
+    FUNC_LOG;
+
+    CESMRICalContentLineWriter* self = new (ELeave) CESMRICalContentLineWriter(aStream);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRICalContentLineWriter::~CESMRICalContentLineWriter
+// ---------------------------------------------------------------------------
+//
+CESMRICalContentLineWriter::~CESMRICalContentLineWriter()
+    {
+    FUNC_LOG;
+
+    delete iCurrentLine;
+
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRICalContentLineWriter::WriteContentLineL
+// ---------------------------------------------------------------------------
+//
+void CESMRICalContentLineWriter::WriteContentLineL()
+    {
+    FUNC_LOG;
+
+    // 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);
+
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRICalContentLineWriter::AppendL
+// ---------------------------------------------------------------------------
+//
+void CESMRICalContentLineWriter::AppendL(const TDesC& aLine)
+    {
+    FUNC_LOG;
+
+    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);
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRICalContentLineWriter::AppendL
+// ---------------------------------------------------------------------------
+//
+void CESMRICalContentLineWriter::AppendL(const TChar& aCharacter)
+    {
+    FUNC_LOG;
+
+    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);
+
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRICalContentLineWriter::CESMRICalContentLineWriter
+// ---------------------------------------------------------------------------
+//
+CESMRICalContentLineWriter::CESMRICalContentLineWriter(RWriteStream& aStream)
+ :  iWriteStream(aStream)
+    {
+    FUNC_LOG;
+    //do nothing
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRICalContentLineWriter::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CESMRICalContentLineWriter::ConstructL()
+    {
+    FUNC_LOG;
+    iCurrentLine = HBufC::NewL(KICalMaxLineLength);
+    }
+
+// End of File
+