searcher/searchclient/src/ccpixsearcher.cpp
changeset 0 671dee74050a
child 1 6f2c1c46032b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/searcher/searchclient/src/ccpixsearcher.cpp	Mon Apr 19 14:40:16 2010 +0300
@@ -0,0 +1,334 @@
+/*
+* Copyright (c) 2010 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 FILES
+#include <e32svr.h>
+#include "common.h"
+
+#include "SearchClient.pan"
+#include "CCPixSearcher.h"
+#include "MCPixSearcherObserver.h"
+#include "SearchServerCommon.h"
+
+// CCPixSearcher::NewL()
+// Two-phased constructor.
+EXPORT_C CCPixSearcher* CCPixSearcher::NewL(RSearchServerSession& aSearchServerSession, const TDesC& aDefaultSearchField)
+	{
+	CCPixSearcher* self = NewLC(aSearchServerSession, aDefaultSearchField);
+	CleanupStack::Pop( self );
+	return self;
+	}
+
+// CCPixSearcher::NewLC()
+// Two-phased constructor.
+EXPORT_C CCPixSearcher* CCPixSearcher::NewLC(RSearchServerSession& aSearchServerSession, const TDesC& aDefaultSearchField)
+	{
+	CCPixSearcher* self = new ( ELeave ) CCPixSearcher(aSearchServerSession);
+	CleanupStack::PushL( self );
+	self->ConstructL(aDefaultSearchField);
+	return self;
+	}
+
+// CCPixSearcher::ConstructL()
+// Symbian 2nd phase constructor can leave.
+void CCPixSearcher::ConstructL(const TDesC& aDefaultSearchField)
+	{
+	User::LeaveIfError( iSubSession.Open(iSearchServerSession) );
+	iDefaultSearchField = aDefaultSearchField.AllocL(); 
+	}
+
+// CCPixSearcher::CCPixSearcher()
+// C++ default constructor can NOT contain any code, that might leave.
+CCPixSearcher::CCPixSearcher(RSearchServerSession& aSearchServerSession)
+	: CActive( EPriorityStandard ),
+	  iState( EStateNone ),
+	  iIsDatabaseOpen( EFalse ),
+	  iSearchServerSession( aSearchServerSession ),
+	  iBaseAppClass( 0 ) 
+	{
+	CActiveScheduler::Add( this );
+	}
+
+// CCPixSearcher::~CCPixSearcher()
+// Destructor.
+EXPORT_C CCPixSearcher::~CCPixSearcher()
+	{	
+	Cancel(); // Causes call to DoCancel()
+	iSubSession.Close();
+	
+	delete iDefaultSearchField;
+	delete iQueryString;
+	delete iBaseAppClass;
+	delete iAnalyzer;
+	}
+
+EXPORT_C TBool CCPixSearcher::IsDatabaseOpen() const
+	{
+	return iIsDatabaseOpen; 
+	}
+
+EXPORT_C const TDesC& CCPixSearcher::GetBaseAppClass() const
+{
+	if (iBaseAppClass)
+		return *iBaseAppClass;
+	else
+		return KNullDesC;
+}
+
+//
+//
+EXPORT_C void CCPixSearcher::OpenDatabaseL(const TDesC& aBaseAppClass)
+	{
+	if ( IsActive() )
+		{
+		User::Leave(KErrInUse);
+		}
+
+	iIsDatabaseOpen = EFalse; // If opening database fails, this is the safe assumption
+	if( iBaseAppClass )
+	    {
+	    delete iBaseAppClass;
+	    iBaseAppClass = NULL;
+	    }
+	iBaseAppClass = aBaseAppClass.AllocL();
+	iSubSession.OpenDatabaseL(ETrue, *iBaseAppClass, *iDefaultSearchField);
+	iIsDatabaseOpen = ETrue; 
+	}
+
+//
+//
+EXPORT_C void CCPixSearcher::OpenDatabaseL(MCPixOpenDatabaseRequestObserver& aObserver, const TDesC& aBaseAppClass)
+	{
+	if ( IsActive() )
+		{
+		User::Leave( KErrInUse);
+		}
+
+	iIsDatabaseOpen = EFalse; // If opening database fails, this is the safe assumption
+	iObserver.iOpenDatabase = &aObserver;
+	
+	iState = EStateOpenDatabase;
+	if(iBaseAppClass)
+	    {
+	    delete iBaseAppClass;
+	    iBaseAppClass = NULL;
+	    }
+	iBaseAppClass = aBaseAppClass.AllocL();
+	iSubSession.OpenDatabase(ETrue, *iBaseAppClass, *iDefaultSearchField, iStatus); // Create if not found
+	SetActive(); 
+	}
+
+EXPORT_C void CCPixSearcher::SetAnalyzerL( const TDesC& aAnalyzer )
+	{
+	if ( !iIsDatabaseOpen ) 	User::Leave(KErrNotReady);
+	if ( IsActive() ) 			User::Leave(KErrInUse);
+
+	iSubSession.SetAnalyzerL( aAnalyzer ); 
+	}
+
+EXPORT_C void CCPixSearcher::SetAnalyzerL( MCPixSetAnalyzerRequestObserver& aObserver, const TDesC& aAnalyzer )
+	{
+	if ( !iIsDatabaseOpen ) 	User::Leave(KErrNotReady);
+	if ( IsActive() ) 			User::Leave(KErrInUse);
+	
+	iAnalyzer = aAnalyzer.AllocL(); 
+
+	iObserver.iSetAnalyzer = &aObserver;
+	iState = EStateSetAnalyzer; 
+	iSubSession.SetAnalyzer( aAnalyzer, iStatus );
+	SetActive(); 
+	}
+
+// CCPixSearcher::FormQueryString()
+// Suport method for SearchL-methods
+HBufC* CCPixSearcher::FormQueryStringL(const TDesC& aQueryString, const TDesC& aDocumentField)
+	{
+	// Search with the specified field
+	if ( aDocumentField != KNullDesC )
+		{
+		HBufC* queryString = HBufC::NewL(aQueryString.Length() + aDocumentField.Length() + 1);
+		TPtr searchTermsPtr = queryString->Des();
+		searchTermsPtr.Append(aDocumentField);
+		searchTermsPtr.Append(':');
+		searchTermsPtr.Append(aQueryString);
+		return queryString; 
+		}
+	// Search with the default field
+	else 
+		{
+		// Allocate search terms
+		return aQueryString.AllocL();	
+		}
+	}
+
+// CCPixSearcher::Search()
+// Issues a new search
+EXPORT_C TInt CCPixSearcher::SearchL(const TDesC& aQueryString, const TDesC& aDocumentField)
+	{
+	PERFORMANCE_LOG_START("CCPixSearcher::SearchL");
+	
+	if ( !iIsDatabaseOpen ) 	
+		User::Leave( KErrNotReady );
+	if ( IsActive() )
+		{
+		User::Leave(KErrInUse);
+		}
+	
+	HBufC* query = FormQueryStringL( aQueryString, aDocumentField ); 
+	CleanupStack::PushL( query ); 
+	
+	iSubSession.SearchL( *query );
+	
+	CleanupStack::PopAndDestroy( query ); 
+	
+	return iSubSession.GetEstimatedDocumentCount();
+	}
+
+EXPORT_C void CCPixSearcher::SearchL(MCPixSearchRequestObserver& aObserver, const TDesC& aQueryString, const TDesC& aDocumentField)
+	{
+    PERFORMANCE_LOG_START("CCPixSearcher::SearchL");
+
+	if ( !iIsDatabaseOpen ) 	User::Leave( KErrNotReady );
+	if ( IsActive() )
+		{
+		User::Leave(KErrInUse);
+		}
+
+	delete iQueryString;
+	iQueryString = NULL;
+	iQueryString = FormQueryStringL( aQueryString, aDocumentField ); 
+
+	iObserver.iSearch = &aObserver;
+	iState = EStateSearch;
+	iSubSession.Search( *iQueryString, iStatus );
+	SetActive();
+
+	}
+
+EXPORT_C CSearchDocument* CCPixSearcher::GetDocumentL(TInt aIndex)
+    {
+    PERFORMANCE_LOG_START("CCPixSearcher::GetDocumentL");
+    
+	if ( !iIsDatabaseOpen ) 	User::Leave( KErrNotReady );
+	if ( IsActive() )
+		{
+		User::Leave(KErrInUse);
+		}
+
+	return iSubSession.GetDocumentL(aIndex);
+    }
+
+EXPORT_C void CCPixSearcher::GetDocumentL(TInt aIndex, MCPixNextDocumentRequestObserver& aObserver)
+    {
+    PERFORMANCE_LOG_START("CCPixSearcher::GetDocumentL");
+    
+    if ( !iIsDatabaseOpen ) 	User::Leave( KErrNotReady );
+	if ( IsActive() )
+		{
+		User::Leave(KErrInUse); // Need ::RunError to handle this
+		}
+	
+	iObserver.iNextDocument = &aObserver;
+	
+	iState = EStateGetDocument;
+	iSubSession.GetDocument(aIndex, iStatus);
+	SetActive(); 
+    }
+
+// CCPixSearcher::RunL()
+// Invoked to handle responses from the server.
+void CCPixSearcher::RunL()
+	{
+	// NOTE: Should we do cleanup here (!)
+	
+	// Observer might be replaced during observer call
+	TObserver observer = iObserver; 
+	iObserver.iAny = NULL; 
+	
+	TState oldState = iState; 
+	iState = EStateNone;
+	
+	switch ( oldState )
+		{
+		case EStateOpenDatabase:
+			iIsDatabaseOpen = (iStatus.Int() == KErrNone); // Inform the observer about the database
+			if ( observer.iOpenDatabase )
+				observer.iOpenDatabase->HandleOpenDatabaseResultL( iStatus.Int() );
+			break;
+
+		case EStateSetAnalyzer:
+			delete iAnalyzer; iAnalyzer = NULL; // cleanup
+
+			if ( observer.iSetAnalyzer ) {
+				observer.iSetAnalyzer->HandleSetAnalyzerResultL( iStatus.Int() );
+			}
+			break;
+
+		case EStateSearch:
+			delete iQueryString; iQueryString = NULL; // cleanup
+
+			// Fetch search results and call back at the observer
+			iEstimatedResultsCount = iSubSession.GetEstimatedDocumentCount();
+			if ( observer.iSearch )
+				observer.iSearch->HandleSearchResultsL(iStatus.Int(), iEstimatedResultsCount);
+			break;
+
+		case EStateGetDocument:
+		    {
+		    // Fetch search results and call back at the observer
+		    CSearchDocument* document = 0;
+		    TRAPD( err, document = iSubSession.GetDocumentObjectL() );
+		    if ( observer.iNextDocument )
+		        {
+		        if ( err == KErrNone )
+		            {
+		            observer.iNextDocument->HandleDocumentL(iStatus.Int(), document);
+		            }
+		        else
+		            {
+		            observer.iNextDocument->HandleDocumentL(err, document);
+		            }
+		        }
+		    }
+		    break;
+
+		case EStateNone:
+		    // Do nothing, dont panic.
+		    break;
+
+		default:
+		    User::Panic(KSearchClient, ESearchClientBadState);
+		    }
+	}
+
+// CCPixSearcher::DoCancel()
+// Cancels any outstanding operation.
+void CCPixSearcher::DoCancel()
+	{
+	iState = EStateNone;
+	iSubSession.CancelAll();
+	}
+
+// CCPixSearcher::RunError()
+// Don't propagate error.
+TInt CCPixSearcher::RunError(TInt /* aError */ )
+	{
+	iSubSession.CancelAll();
+	return KErrNone;
+	}
+
+// End of File