--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/cntsortplugin/src/ccntsortplugin.cpp Wed Jul 21 11:09:07 2010 +0300
@@ -0,0 +1,200 @@
+/*
+* Copyright (c) 2002 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:
+* Contact model ECOM sort plugin.
+*
+*/
+
+
+// INCLUDE FILES
+#include "ccntsortplugin.h"
+
+#include <SortUtil.h>
+#include <cntdef.h>
+
+#include "csortkeyarray.h"
+
+namespace {
+
+#ifdef _DEBUG
+enum TPanicType
+ {
+ EPanicPreCond_CompareViewContactsL = 1,
+ EPanicSortUtilFactoryReturnedNULL,
+ EPanicInvalidViewParameters,
+ EPanicDefaultCompareFunctionNULL,
+ EPanicDefaultIsSortableFunctionNULL
+ };
+
+void Panic(TPanicType aPanicType)
+ {
+ _LIT(KPanicTxt, "CCntSortPlugin");
+ User::Panic(KPanicTxt, aPanicType);
+ }
+#endif
+} // namespace
+
+// ========================== MEMBER FUNCTIONS ===============================
+
+// ---------------------------------------------------------------------------
+// CCntSortPlugin::NewL
+// ---------------------------------------------------------------------------
+//
+CCntSortPlugin* CCntSortPlugin::NewL(TAny* aParams)
+ {
+ CCntSortPlugin* self = new(ELeave) CCntSortPlugin;
+ CleanupStack::PushL( self );
+ self->ConstructL(static_cast<TSortPluginParams*>(aParams));
+ CleanupStack::Pop();
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CCntSortPlugin::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CCntSortPlugin::ConstructL(TSortPluginParams* aParams)
+ {
+ // Validate parameters
+ if (!aParams ||
+ (aParams->iParametersRevision != KCntSortPluginViewParamsRev1Uid))
+ User::Leave(KErrArgument);
+
+ TSortPluginViewParamsRev1* viewParams =
+ static_cast<TSortPluginViewParamsRev1*>(aParams->iViewSortParams);
+
+ __ASSERT_DEBUG(viewParams,
+ Panic(EPanicInvalidViewParameters));
+ __ASSERT_DEBUG(viewParams->iCompareViewContactsL,
+ Panic(EPanicDefaultCompareFunctionNULL));
+ __ASSERT_DEBUG(viewParams->iIsSortable,
+ Panic(EPanicDefaultIsSortableFunctionNULL));
+
+ iIsSortable = viewParams->iIsSortable;
+
+ iSortUtil = CSortUtil::NewL();
+ // Sort Util factory has to return valid pointer
+ // Factory should default to european sorting if nothing else is
+ // applicable
+ __ASSERT_DEBUG(iSortUtil, Panic(EPanicSortUtilFactoryReturnedNULL));
+
+ iLeftSortKeyArray = CSortKeyArray::NewL();
+ iRightSortKeyArray = CSortKeyArray::NewL();
+ }
+
+// ---------------------------------------------------------------------------
+// CCntSortPlugin::CCntSortPlugin
+// ---------------------------------------------------------------------------
+//
+CCntSortPlugin::CCntSortPlugin()
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CCntSortPlugin::~CCntSortPlugin
+// ---------------------------------------------------------------------------
+//
+CCntSortPlugin::~CCntSortPlugin()
+ {
+ delete iSortUtil;
+ iSortOrder.Close();
+ delete iLeftSortKeyArray;
+ delete iRightSortKeyArray;
+ }
+
+void CCntSortPlugin::SetSortOrderL
+ (const RContactViewSortOrder& aViewSortOrder)
+ {
+ iSortOrder.Close();
+ iSortOrder.CopyL(aViewSortOrder);
+ }
+
+TInt CCntSortPlugin::SortStart(TSortStartTypes aSortStartType, TInt aCount)
+ {
+ TRAPD(ret, DoSortStartL(aSortStartType, aCount));
+ return ret;
+ }
+
+void CCntSortPlugin::DoSortStartL
+ (TSortStartTypes /* aSortStartType */, TInt /* aCount */)
+ {
+ iLeftSortKeyArray->Reset();
+ iRightSortKeyArray->Reset();
+
+ const TInt count = iSortOrder.Count();
+ for (TInt i = 0; i < count; ++i)
+ {
+ TFieldType fieldType = iSortOrder[i];
+ if (fieldType == KUidContactFieldGivenNamePronunciation ||
+ fieldType == KUidContactFieldFamilyNamePronunciation ||
+ fieldType == KUidContactFieldCompanyNamePronunciation)
+ {
+ iLeftSortKeyArray->AppendL
+ (TSortKey(KNullDesC, ESortKeyPronounciation));
+ iRightSortKeyArray->AppendL
+ (TSortKey(KNullDesC, ESortKeyPronounciation));
+ }
+ else
+ {
+ iLeftSortKeyArray->AppendL(TSortKey(KNullDesC, ESortKeyBasic));
+ iRightSortKeyArray->AppendL(TSortKey(KNullDesC, ESortKeyBasic));
+ }
+ }
+ }
+
+void CCntSortPlugin::SortCompleted()
+ {
+ iLeftSortKeyArray->Reset();
+ iRightSortKeyArray->Reset();
+ }
+
+TInt CCntSortPlugin::SortCompareViewContactsL
+ (const CViewContact& aLhs, const CViewContact& aRhs)
+ {
+ __ASSERT_DEBUG(aLhs.FieldCount() == iSortOrder.Count(),
+ Panic(EPanicPreCond_CompareViewContactsL));
+ __ASSERT_DEBUG(aRhs.FieldCount() == iSortOrder.Count(),
+ Panic(EPanicPreCond_CompareViewContactsL));
+ __ASSERT_DEBUG(iLeftSortKeyArray &&
+ iLeftSortKeyArray->SortKeyCount() == iSortOrder.Count(),
+ Panic(EPanicPreCond_CompareViewContactsL));
+ __ASSERT_DEBUG(iRightSortKeyArray &&
+ iRightSortKeyArray->SortKeyCount() == iSortOrder.Count(),
+ Panic(EPanicPreCond_CompareViewContactsL));
+
+ // Change the text in the sortkeys to correspond fields in the contacts
+ const TInt count = iSortOrder.Count();
+ for (TInt i = 0; i < count; ++i)
+ {
+ iLeftSortKeyArray->SetText(aLhs.Field(i), i);
+ iRightSortKeyArray->SetText(aRhs.Field(i), i);
+ }
+
+ return iSortUtil->Interface()->CompareItems
+ (*iLeftSortKeyArray, *iRightSortKeyArray);
+ }
+
+TInt CCntSortPlugin::ApiCompareViewContactsL
+ (const CViewContact& aLhs, const CViewContact& aRhs)
+ {
+ return SortCompareViewContactsL(aLhs, aRhs);
+ }
+
+TBool CCntSortPlugin::ViewContactIsSortable
+ (const CViewContact& aViewContact)
+ {
+ return iIsSortable(aViewContact);
+ }
+
+// End of File