--- /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);
+ }