email/imap4mtm/imapsession/src/cimapcapability.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imap4mtm/imapsession/src/cimapcapability.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,164 @@
+// Copyright (c) 2006-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 "cimapcapability.h"
+#include "cimapcapabilityinfo.h"
+#include "ctransportmanager.h"
+#include "moutputstream.h"
+#include "cimapsessionconsts.h"
+#include "imappaniccodes.h"
+
+_LIT8(KTxtCapabilityFormat, "%d CAPABILITY\r\n");
+
+/**
+The factory constructor. Part of two phased construction.
+@param aCapabilityInfo Output parameter that will hold the capability information upon successful completion of this command.
+*/
+CImapCapability* CImapCapability::NewL(CImapFolderInfo* aSelectedFolderData, TInt aLogId, CImapCapabilityInfo& aCapabilityInfo)
+	{
+	CImapCapability* self = new(ELeave) CImapCapability(aSelectedFolderData, aLogId, aCapabilityInfo);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+/**
+
+*/
+void CImapCapability::ConstructL()
+	{
+	}
+	
+/**
+Constructor.
+@param aCapabilityInfo Output parameter that will hold the capability information upon successful completion of this command.
+*/
+CImapCapability::CImapCapability(CImapFolderInfo* aSelectedFolderData, TInt aLogId, CImapCapabilityInfo& aCapabilityInfo)
+	: CImapCommandEx(aSelectedFolderData, aLogId)
+	, iCapabilityInfo(aCapabilityInfo)
+	{
+	}
+		
+/**
+Destructor.
+*/
+CImapCapability::~CImapCapability()
+	{
+	}
+	
+/**
+Responsible for sending the IMAP capability command to the remote server to 
+perform the desired action the IMAP client wishes. The data will be sent 
+to the remote server on the output stream provided. 
+It is assumed the output stream has already been set up and ready to use.
+
+@param aTagId	Used to generate the IMAP tag that identifies the message.
+@param aStream	The output stream on which the message will be sent.
+*/
+void CImapCapability::SendMessageL(TInt aTagId, MOutputStream& aStream)
+	{
+	iTagId = aTagId;
+	TInt bufferLength = KTxtCapabilityFormat.iTypeLength - 2 + TagLength(aTagId); // -2 for "%d"
+
+	__ASSERT_DEBUG(iOutputBuffer==NULL, TImapServerPanic::ImapPanic(TImapServerPanic::ECommandOutputBufferNotNull));
+	iOutputBuffer = HBufC8::NewL(bufferLength);
+	iOutputBuffer->Des().Format(KTxtCapabilityFormat, iTagId);
+	
+	// Send the data on the output stream
+	aStream.SendDataReq(*iOutputBuffer);
+	}
+
+CImapCommand::TParseBlockResult CImapCapability::ParseUntaggedResponseL()
+	{
+	TParseBlockResult result = ENotRecognised;
+	if (GetNextPart().CompareF(KTxtImapCapability) == 0)
+		{
+		ParseCapabilityDataL(iUnparsedData);
+		result = ECompleteUntagged;
+		}
+		
+	return result;
+	}
+	
+/**
+Parses capability-data, which can be received 
+as part of an untagged CAPABILITY response,
+or as part of the response-code of a tagged LOGIN OK response.
+	(i.e. as the data in the square brackets)
+It assumes that the "CAPABILITY" item has already been identified
+@param the capability-data, but without the "CAPABILITY" string at the front.  And with no square brackets.
+*/
+void CImapCapability::ParseCapabilityDataL(const TDesC8& aCapabilityData)
+	{
+	// From RFC3501 section 9
+	//
+	// capability-data = "CAPABILITY" *(SP capability) SP "IMAP4rev1" *(SP capability)
+	// capability = ("AUTH=" auth-type) / atom
+	//
+	
+	// "CAPABILITY" has beem found, so we're just looking for basic space-separated atoms.
+	
+	// First, reset iCapabilityInfo as it's going to be given some new information.
+	iCapabilityInfo.Reset();
+		
+	RDesParts capabilityItems;
+	CleanupClosePushL(capabilityItems);
+		
+	GetDelimitedPartsL(' ', aCapabilityData, capabilityItems);
+	TInt countItems = capabilityItems.Count();
+	for (TInt i=0; i<countItems; ++i)
+		{
+		TPtrC8 capability = capabilityItems[i];
+		
+		if (capability.CompareF(KImapTxtImapVersion) == 0)
+			{
+			iCapabilityInfo.SetFlag(CImapCapabilityInfo::EVersion4Rev1, ETrue);
+			}
+		else if (capability.CompareF(KImapTxtIdle) == 0)
+			{			
+			iCapabilityInfo.SetFlag(CImapCapabilityInfo::EIdle, ETrue);
+			}
+		else if (capability.CompareF(KImapTxtStartTls) == 0)
+			{
+			iCapabilityInfo.SetFlag(CImapCapabilityInfo::EStartTls, ETrue);
+			}
+		else if (capability.CompareF(KImapTxtLoginDisabled) == 0)
+			{
+			iCapabilityInfo.SetFlag(CImapCapabilityInfo::ELoginDisabled, ETrue);
+			}
+		else if (capability.CompareF(KImapTxtAuthPlain) == 0)
+			{
+			iCapabilityInfo.SetFlag(CImapCapabilityInfo::EAuthPlain, ETrue);
+			}
+#if (defined SYMBIAN_EMAIL_CAPABILITY_SUPPORT)
+		else if (capability.CompareF(KImapTxtBinaryCap) == 0)
+			{
+			iCapabilityInfo.SetFlag(CImapCapabilityInfo::EBinaryCap, ETrue);
+			}
+		else if (capability.CompareF(KImapTxtAuthCRamMd5) == 0)
+			{
+			iCapabilityInfo.SetFlag(CImapCapabilityInfo::EAuthCramMd5, ETrue);
+			}
+		else if (capability.CompareF(KImapTxtAuthLogin) == 0)
+			{
+			iCapabilityInfo.SetFlag(CImapCapabilityInfo::EAuthLogin, ETrue);
+			}
+#endif
+		}
+	
+	CleanupStack::PopAndDestroy(&capabilityItems);
+	}