email/pop3andsmtpmtm/servermtmutils/src/IMCVUTIL.CPP
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/pop3andsmtpmtm/servermtmutils/src/IMCVUTIL.CPP	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,256 @@
+// IMCVUTIL.CPP
+
+// Copyright (c) 1998-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 <badesca.h>
+#include "IMCVUTIL.H"
+#include <miuthdr.h>
+#include "IMCVTEXT.H"
+#include <logwrap.h>
+#include <logwraplimits.h>
+#include <msvapi.h>
+
+#define __IMUT_NO_IM_EMAIL_EVENT_LOGGING //Remove this line to enable e-mail logging 
+
+EXPORT_C CImcvUtils* CImcvUtils::NewL()
+	{
+	CImcvUtils* self = NewLC();
+	CleanupStack::Pop();
+	return self;
+	}
+
+EXPORT_C CImcvUtils* CImcvUtils::NewLC()
+	{
+	CImcvUtils* self=new (ELeave) CImcvUtils();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+CImcvUtils::~CImcvUtils()
+	{
+	}
+
+CImcvUtils::CImcvUtils()
+	{
+	}
+
+void CImcvUtils::ConstructL()
+	{
+	iPriority=EMsvMediumPriority;
+	}
+
+EXPORT_C void CImcvUtils::ReceiptFieldsL(CDesC8Array& aReceiptFields)
+	{
+	aReceiptFields.Reset();
+	aReceiptFields.AppendL(KImcvReturnReceiptToPrompt);
+	aReceiptFields.AppendL(KImcvReturnXReceiptToPrompt);
+	aReceiptFields.AppendL(KImcvMsgDispositionTo);
+	aReceiptFields.AppendL(KImcvMsgDispositionOptions);
+	}
+
+EXPORT_C void CImcvUtils::PriorityFieldsL(CDesC8Array& aPriorityFields)
+	{
+	aPriorityFields.Reset();
+	aPriorityFields.AppendL(KImcvPriorityPrompt);
+	aPriorityFields.AppendL(KImcvXPriorityPrompt);
+	aPriorityFields.AppendL(KImcvXMSMailPriorityPrompt);
+	aPriorityFields.AppendL(KImcvImportancePrompt);
+	}
+
+EXPORT_C void CImcvUtils::SendReturnReceiptFieldsL(CDesC8Array& aReturnReceiptFields)
+	{ // appends field to the array
+	//At the moment it returns KImcvMsgDispositionTo only.  In future it could change!
+	aReturnReceiptFields.Reset();
+	aReturnReceiptFields.AppendL(KImcvMsgDispositionTo);
+	}
+
+EXPORT_C void CImcvUtils::SendPriorityFieldsL(CDesC8Array& aSendPriorityFields)
+	{
+	aSendPriorityFields.Reset();
+	aSendPriorityFields.AppendL(KImcvXPriorityPrompt);
+	}
+
+
+void CImcvUtils::SendImportanceFieldsL(CDesC8Array& aSendImportanceFields)
+	{
+	aSendImportanceFields.Reset();
+	aSendImportanceFields.AppendL(KImcvImportancePrompt);
+	}
+
+EXPORT_C TBool CImcvUtils::EvaluateReturnReceiptFields(const TDesC8& aFieldName)
+	{
+	if (aFieldName.MatchF(KImcvReturnReceiptToPrompt)>=0 || 
+		aFieldName.MatchF(KImcvReturnXReceiptToPrompt)>=0 ||
+		aFieldName.MatchF(KImcvMsgDispositionTo)>=0)
+		return ETrue;
+	return EFalse;		
+	}
+
+
+EXPORT_C TMsvPriority CImcvUtils::EvaluatePriorityText(const TDesC8& aPriority)
+	{//  	check for high, low and then medium.
+	//Precedence: bulk, special-delivery, first-class, list and junk, should not be used to set any Priority as RFC2076 defines
+	//them as Non-standard controversial and discouraged
+	TInt number=ConvertPriorityIntoNumber(aPriority);	
+	if (aPriority.MatchF(KImportanceHighest)>=0 ||
+		aPriority.MatchF(KImportanceHigh)>=0 ||
+		number<KPriorityNormal ||
+	//because match returns found if we search for urgent in a non-urgent string, it should be double checked.
+		(aPriority.MatchF(KImPriorityUrgent)>=0 && aPriority.MatchF(KImPriorityNonUrgent)<0))
+		{
+		iPriority=EMsvHighPriority;  
+		return iPriority;
+		}
+	if (aPriority.MatchF(KImportanceLowest)>=0 ||
+		aPriority.MatchF(KImportanceLow)>=0 ||
+		aPriority.MatchF(KImPriorityNonUrgent)>=0 ||
+		number>KPriorityNormal)
+		{//set to low only if it is medium.  
+		if (iPriority==EMsvMediumPriority)
+			iPriority=EMsvLowPriority;
+		}
+	return iPriority;
+	}
+
+TInt CImcvUtils::ConvertPriorityIntoNumber(const TDesC8& aPriority)
+	{
+	// if aPriority is null string, set priority to normal
+	if (!aPriority.Length())
+		return KPriorityNormal;
+	// aPriority can be a digit (1..5) or a string or both.  In most cases it is digit.  
+	//Hence search for digit in the string first and if it is not found, then search for the strings
+	//search for digits
+	TInt p=KPriorityHigh; //1
+	while(p<6)
+		{
+		TBuf8<4> buf(KWildChars);  //set the wild chars when matching
+		TBuf8<1> num;
+		num.Num(p);
+		buf.Insert(1,num);
+		if (aPriority.Match(buf)>=0) //means found
+			return p;
+		p++;					  
+		}
+	return KPriorityNormal;
+	}
+
+
+
+//
+//CImLogMessage
+//
+
+
+EXPORT_C CImLogMessage* CImLogMessage::NewL(RFs& aFs, TInt aPriority)
+	{
+	CImLogMessage* self = new (ELeave) CImLogMessage(aPriority);
+	CleanupStack::PushL(self);
+	self->ConstructL(aFs,aPriority);
+	CleanupStack::Pop();
+	return self;
+	}
+
+CImLogMessage::CImLogMessage(TInt aPriority) 
+			  :	CMsgActive(aPriority)
+	{
+	}
+
+void CImLogMessage::ConstructL(RFs& aFs,TInt aPriority)
+	{
+	iLogWrapper=CLogWrapper::NewL(aFs,aPriority);
+	CActiveScheduler::Add(this);
+	}
+
+CImLogMessage::~CImLogMessage()
+	{
+	Cancel();
+	Reset();
+	delete iLogWrapper;
+	}
+
+EXPORT_C CLogEvent& CImLogMessage::LogEvent()
+	{
+	if (!iLogEvent)
+		{
+		TRAP_IGNORE(iLogEvent=CLogEvent::NewL());
+		}
+	return *iLogEvent;
+	}
+
+EXPORT_C CLogBase& CImLogMessage::LogBase()
+	{
+	return iLogWrapper->Log();
+	}
+
+
+EXPORT_C void CImLogMessage::Start(TInt aError,TRequestStatus& aStatus)
+	{
+	if (aError != KErrNone)
+		{
+		TBuf<KLogMaxStatusLength> status;
+		if (GetString(status, R_LOG_DEL_FAILED) == KErrNone)
+			iLogEvent->SetStatus(status);	
+		}
+
+	Queue(aStatus);
+
+#ifndef __IMUT_NO_IM_EMAIL_EVENT_LOGGING
+	iLogWrapper->Log().AddEvent(*iLogEvent,iStatus);
+	SetActive();
+#else
+	Complete(KErrNone);
+#endif
+
+	}
+
+EXPORT_C TInt CImLogMessage::GetString(TDes& aString, TInt aId) const
+	{
+	return iLogWrapper->Log().GetString(aString, aId);
+	}
+
+void CImLogMessage::DoRunL()
+	{
+	}
+
+void CImLogMessage::DoCancel()
+	{
+	iLogWrapper->Log().Cancel();
+	CMsgActive::DoCancel();
+	}
+
+EXPORT_C void CImLogMessage::Reset()
+	{
+	delete iLogEvent;
+	iLogEvent=NULL;
+	}
+
+void CImLogMessage::DoComplete(TInt& aStatus)
+	{//always complete with KErrnone.  We don't care if logging fails.
+	aStatus=KErrNone;
+	}
+
+//
+// Check the available disk space and leave if it is insufficient
+//
+EXPORT_C void ImCheckDiskSpace::LeaveIfLowDiskL(RFs& aFs, TInt aCurrentDrive)
+	{
+	TVolumeInfo volumeInfo;
+	User::LeaveIfError(aFs.Volume(volumeInfo, aCurrentDrive));
+
+	if (volumeInfo.iFree < KMinimumDiskSpaceForSync)
+		User::Leave(KErrDiskFull);
+	}