diff -r 238255e8b033 -r 84d9eb65b26f email/pop3andsmtpmtm/imapservermtm/src/FLDINDEX.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/pop3andsmtpmtm/imapservermtm/src/FLDINDEX.CPP Mon May 03 12:29:07 2010 +0300 @@ -0,0 +1,163 @@ +// 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: +// IMAP Folder indexing +// +// + +#include "fldindex.h" +#include "impspan.h" + +// Illegal UID we use for marker +const TUint KIllegalUID = 0xffffffff; + +CImImap4IndexEntry::CImImap4IndexEntry() + { + // Default values + iUid=0; + iMsvId=-1; + } + +CImImap4IndexEntry::CImImap4IndexEntry(CImImap4IndexEntry& aFrom) + { + // Copy entry + iUid=aFrom.iUid; + iMsvId=aFrom.iMsvId; + } + +CImImap4IndexEntry& CImImap4IndexEntry::operator=(CImImap4IndexEntry& aFrom) + { + // Copy entry + iUid=aFrom.iUid; + iMsvId=aFrom.iMsvId; + return(*this); + } + +CImImap4FolderIndex::CImImap4FolderIndex() + { + __DECLARE_NAME(_S("CImImap4FolderIndex")); + } + +CImImap4FolderIndex::~CImImap4FolderIndex() + { + // Dispose of index + delete iIndex; + } + +void CImImap4FolderIndex::Reset() + { + // Dispose of index + delete iIndex; + iIndex=NULL; + iSize=0; + } + +void CImImap4FolderIndex::SetSizeL(const TUint aEntries) + { + // Set number of entries + if (!iIndex) + { + // Create new array (granularity 8 entries) + iIndex=new (ELeave) CArrayFixFlat(8); + } + + // Alter size, filling unused entries with 0xffffffff + CImImap4IndexEntry blank; + blank.iUid=KIllegalUID; + blank.iMsvId=0; + iIndex->ResizeL(aEntries,blank); + + // Save new size + iSize=aEntries; + } + +TInt CImImap4FolderIndex::Size() + { + // Return current size + return(iSize); + } + +void CImImap4FolderIndex::SetUid(const TUint aMsgNr, const TUint aMsgUid) + { + __ASSERT_ALWAYS(aMsgNr<=TUint(iSize),gPanic(EMsgnrOutOfRange)); + + // Is UID already set? + if ((*iIndex)[aMsgNr-1].iUid!=KIllegalUID && (*iIndex)[aMsgNr-1].iUid!=aMsgUid) + { + // CHANGING a UID? No way! + gPanic(ECantChangeUID); + } + + // Set a UID for a message number + (*iIndex)[aMsgNr-1].iUid=aMsgUid; + } + +void CImImap4FolderIndex::SetMsvId(const TUint aMsgNr, const TMsvId aMsvId) + { + __ASSERT_ALWAYS(aMsgNr<=TUint(iSize),gPanic(EMsgnrOutOfRange)); + + // Is MsvId already set? + if ((*iIndex)[aMsgNr-1].iMsvId!=0 && (*iIndex)[aMsgNr-1].iMsvId!=aMsvId) + { + // CHANGING a MsvId? No way! + gPanic(ECantChangeMsvId); + } + + // Set a MsvId for a message number + (*iIndex)[aMsgNr-1].iMsvId=aMsvId; + } + +void CImImap4FolderIndex::Expunge(const TUint aMsgNr) + { + __ASSERT_ALWAYS(aMsgNr<=TUint(iSize),gPanic(EMsgnrOutOfRange)); + + // Remove entry from index + iIndex->Delete(aMsgNr-1); + iSize--; + } + +TUint CImImap4FolderIndex::FindMsg(const TUint aMsgUid) + { + __ASSERT_ALWAYS(iSize>0,gPanic(EIndexEmpty)); + + // Replace this with a binary search... + TInt i=0; + do + { + // UID match? + if ((*iIndex)[i].iUid==aMsgUid) + return(i+1); + + i++; + } + while(iSort(uidKey); + }