phonebookengines/VirtualPhonebook/VPbkCntModel/src/CFindInTextDefOperation.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/VirtualPhonebook/VPbkCntModel/src/CFindInTextDefOperation.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,252 @@
+/*
+* Copyright (c) 2006-2007 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:  A find operation that uses
+*                CContactDataBase::FindInTextDefAsyncL
+*
+*/
+
+
+#include "CFindInTextDefOperation.h"
+
+// VPbkCntModel internal
+#include "CContactStore.h"
+#include "CFieldFactory.h"
+#include "CContactLink.h"
+
+// Virtual Phonebook
+#include <MVPbkFieldType.h>
+#include <MVPbkContactFindFromStoresObserver.h>
+#include <CVPbkContactLinkArray.h>
+
+// Other system includes
+#include <cntfield.h>
+
+namespace VPbkCntModel {
+
+// Set a limit to the contact id conversion. If for some reason
+// the result is huge.
+const TInt KMaxConversionInOneStep = 100;
+const TInt KContinueIdle = 1;
+const TInt KDontContinueIdle = 0;
+const TInt KGranularity( 2 );
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CFindInTextDefOperation::CFindInTextDefOperation
+// ---------------------------------------------------------------------------
+//
+CFindInTextDefOperation::CFindInTextDefOperation( CContactStore& aContactStore,
+        MVPbkContactFindFromStoresObserver& aObserver,
+        const TCallBack& aWordParserCallBack )
+        :   iStore( aContactStore ),
+            iObserver( aObserver ),
+            iWordParserCallBack( aWordParserCallBack )
+    {
+
+    }
+
+// ---------------------------------------------------------------------------
+// CFindInTextDefOperation::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CFindInTextDefOperation::ConstructL( const MDesC16Array& aSearchStrings,
+        const MVPbkFieldTypeList& aFieldTypes )
+    {
+    // Copy search strings
+    const TInt stringCount = aSearchStrings.MdcaCount();
+    TInt granularity = stringCount;
+    if ( stringCount == 0 )
+        {
+        // default granularity
+        granularity = KGranularity;
+        }
+
+    iSearchStrings = new( ELeave ) CDesCArrayFlat( granularity );
+    for ( TInt i = 0; i < stringCount; ++i )
+        {
+        iSearchStrings->AppendL( aSearchStrings.MdcaPoint( i ) );
+        }
+
+    // Convert fieldtypes to contact model text definitions
+    iTextDefs = CContactTextDef::NewL();
+    const TInt typeCount = aFieldTypes.FieldTypeCount();
+    for ( TInt j = 0; j < typeCount; ++j )
+        {
+        const MVPbkFieldType& fieldType = aFieldTypes.FieldTypeAt( j );
+        const CContactItemField* field =
+            iStore.FieldFactory().FindField( fieldType );
+        if ( field )
+            {
+            iTextDefs->AppendL(
+                TContactTextDefItem( field->ContentType().FieldType(0) ) );
+            }
+        }
+
+    iIdle = CIdle::NewL( CActive::EPriorityStandard );
+    iResults = CVPbkContactLinkArray::NewL();
+    }
+
+// ---------------------------------------------------------------------------
+// CFindInTextDefOperation::NewL
+// ---------------------------------------------------------------------------
+//
+CFindInTextDefOperation* CFindInTextDefOperation::NewL(
+        CContactStore& aContactStore,
+        const MDesC16Array& aSearchStrings,
+        const MVPbkFieldTypeList& aFieldTypes,
+        MVPbkContactFindFromStoresObserver& aObserver,
+        const TCallBack& aWordParserCallBack )
+    {
+    CFindInTextDefOperation* self = new( ELeave ) CFindInTextDefOperation(
+        aContactStore, aObserver, aWordParserCallBack );
+    CleanupStack::PushL( self );
+    self->ConstructL( aSearchStrings, aFieldTypes );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CFindInTextDefOperation::~CFindInTextDefOperation
+// ---------------------------------------------------------------------------
+//
+CFindInTextDefOperation::~CFindInTextDefOperation()
+    {
+    Cancel();
+    delete iAsyncFinder;
+    delete iIdle;
+    delete iResults;
+    delete iContactIds;
+    delete iSearchStrings;
+    delete iTextDefs;
+    }
+
+// ---------------------------------------------------------------------------
+// From class MVPbkContactOperation.
+// CFindInTextDefOperation::StartL
+// ---------------------------------------------------------------------------
+//
+void CFindInTextDefOperation::StartL()
+    {
+    if ( iTextDefs->Count() == 0 || iSearchStrings->Count() == 0 )
+        {
+        iIdle->Start( TCallBack( ConvertResults, this ) );
+        }
+    else
+        {
+        iAsyncFinder = iStore.NativeDatabase().FindInTextDefAsyncL(
+            *iSearchStrings, iTextDefs, this, iWordParserCallBack );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From class MVPbkContactOperation.
+// CFindInTextDefOperation::Cancel
+// ---------------------------------------------------------------------------
+//
+void CFindInTextDefOperation::Cancel()
+    {
+    if ( iAsyncFinder )
+        {
+        iAsyncFinder->Cancel();
+        delete iAsyncFinder;
+        iAsyncFinder = NULL;
+        }
+
+    if ( iIdle )
+        {
+        iIdle->Cancel();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From class MIdleFindObserver.
+// CFindInTextDefOperation::IdleFindCallback
+// ---------------------------------------------------------------------------
+//
+void CFindInTextDefOperation::IdleFindCallback()
+    {
+    if ( iAsyncFinder->IsComplete() )
+        {
+        iContactIds = iAsyncFinder->TakeContactIds();
+        iIdle->Start( TCallBack( ConvertResults, this ) );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CFindInTextDefOperation::ConvertResults
+// ---------------------------------------------------------------------------
+//
+TInt CFindInTextDefOperation::ConvertResults( TAny* aThis )
+    {
+    CFindInTextDefOperation* self =
+        static_cast<CFindInTextDefOperation*>( aThis );
+    TInt continueIdle = KDontContinueIdle;
+    TRAPD( res, continueIdle = self->ConvertResultsL() );
+    if ( res != KErrNone )
+        {
+        self->HandleError( res );
+        }
+    return continueIdle;
+    }
+
+// ---------------------------------------------------------------------------
+// CFindInTextDefOperation::ConvertResultsL
+// ---------------------------------------------------------------------------
+//
+TInt CFindInTextDefOperation::ConvertResultsL()
+    {
+    TInt convertedIds = 0;
+    const TInt firstContact = 0;
+    // Convert only reasonable amount of ids in one cycle
+    if ( iContactIds )
+        {
+        while ( iContactIds->Count() > 0 &&
+            convertedIds < KMaxConversionInOneStep )
+            {
+            CContactLink* link = CContactLink::NewLC( iStore,
+                (*iContactIds)[firstContact] );
+            iContactIds->Remove( firstContact );
+            iResults->AppendL( link );
+            CleanupStack::Pop(); // link
+            ++convertedIds;
+            }
+        }
+
+    // iContactIds not necessary exists if find wasn't done in StartL
+    if ( !iContactIds || iContactIds->Count() == 0 )
+        {
+        // Results are ready.
+        MVPbkContactLinkArray* results = iResults;
+        iResults = NULL;
+        iObserver.FindFromStoreSucceededL( iStore, results );
+        iObserver.FindFromStoresOperationComplete();
+        return KDontContinueIdle;
+        }
+    return KContinueIdle;
+    }
+
+// ---------------------------------------------------------------------------
+// CFindInTextDefOperation::HandleError
+// ---------------------------------------------------------------------------
+//
+void CFindInTextDefOperation::HandleError( TInt aError )
+    {
+    if ( aError != KErrNone )
+        {
+        iObserver.FindFromStoreFailed( iStore, aError );
+        iObserver.FindFromStoresOperationComplete();
+        }
+    }
+} // namespace VPbkCntModel