searcher/searchserver/src/csearchserversubsession.cpp
changeset 0 671dee74050a
child 1 6f2c1c46032b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/searcher/searchserver/src/csearchserversubsession.cpp	Mon Apr 19 14:40:16 2010 +0300
@@ -0,0 +1,464 @@
+/*
+* 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 <S32MEM.H>
+#include <e32svr.h>
+#include <e32uid.h>
+#include <common.h>
+
+#include "CSearchServerSession.h"
+#include "CSearchServerSubSession.h"
+#include "CCPixAsyncronizer.h"
+#include "CCPixIdxDb.h"
+#include "CCPixSearch.h"
+#include "CSearchDocument.h"
+#include "SearchServerLogger.h"
+#include "SearchServer.pan"
+#include "CLogPlayerRecorder.h"
+
+// Contants
+//_LIT8( KFileBaseAppClass, "root file" );
+
+CSearchServerSubSession* CSearchServerSubSession::NewLC(CSearchServerSession* aSession)
+{
+	CSearchServerSubSession* self = new (ELeave)CSearchServerSubSession(aSession);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+}
+
+CSearchServerSubSession* CSearchServerSubSession::NewL(CSearchServerSession* aSession)
+{
+	CSearchServerSubSession* self = CSearchServerSubSession::NewLC(aSession);
+	CleanupStack::Pop();
+	return self;
+}
+
+CSearchServerSubSession::CSearchServerSubSession(CSearchServerSession* aSession) : iSession(aSession)
+{
+    CPIXLOGSTRING("Creating search server subsession");
+	
+    // Dont ask why but I seem to have a compulsion to set everything NULL in constructor - AL
+	iIndexDb = NULL;
+	iSearchDb = NULL;
+	iNextDocument = NULL;
+}
+
+CSearchServerSubSession::~CSearchServerSubSession()
+{
+    CPIXLOGSTRING("Deleting search server subsession");
+
+	delete iIndexDb;
+	delete iSearchDb;	
+	delete iNextDocument;
+}
+
+void CSearchServerSubSession::ConstructL()
+{
+	iIndexDb = CCPixIdxDb::NewL();
+	iSearchDb = CCPixSearch::NewL();
+}
+
+// CSearchServerSession::CancelAll()
+void CSearchServerSubSession::CancelAll(const RMessage2& aMessage)
+	{
+	if (iSearchDb->IsOpen())
+	    {
+	    // Cancel searching 
+	    iSearchDb->CancelAll(aMessage);
+	    }
+	else if (iIndexDb->IsOpen())
+	    {
+	    // Cancel indexing
+	    iIndexDb->CancelAll(aMessage);
+	    }
+	else
+	    {
+	    // Nothing to cancel. Just complete request
+	    aMessage.Complete(KErrNone);
+	    }
+	
+	TRAP_IGNORE( LOG_PLAYER_RECORD( CLogPlayerRecorder::LogCancelL( reinterpret_cast<TUint>( this ) ) ) );
+	}
+
+void CSearchServerSubSession::OpenDatabaseL(const RMessage2& aMessage)
+	{
+	HBufC* baseAppClass = HBufC::NewLC(aMessage.GetDesLength(0));
+	TPtr baseAppClassPtr = baseAppClass->Des();
+	aMessage.ReadL(0, baseAppClassPtr);
+	
+	HBufC* defaultSearchField = HBufC::NewLC(aMessage.GetDesLength(1));
+	TPtr defaultSearchFieldPtr = defaultSearchField->Des();
+	aMessage.ReadL(1, defaultSearchFieldPtr);
+	
+	const TBool search = aMessage.Int2();
+    
+	LOG_PLAYER_RECORD( CLogPlayerRecorder::LogDatabaseOpenL(reinterpret_cast<TUint>(this), search, *baseAppClass) );
+
+	if (!search)
+	{
+    	iIndexDb->OpenDatabaseL(*baseAppClass);
+	}
+	else
+	{
+		iSearchDb->OpenDatabaseL(*baseAppClass, *defaultSearchField);
+	}
+	
+	CleanupStack::PopAndDestroy(defaultSearchField);
+	CleanupStack::PopAndDestroy(baseAppClass);
+
+	// Complete the request
+	aMessage.Complete(KErrNone);	
+	}
+
+void CSearchServerSubSession::SetAnalyzerL(const RMessage2& aMessage)
+	{
+	if (!iSearchDb->IsOpen() && !iIndexDb->IsOpen())
+		{
+		iSession->PanicClient(aMessage, EDatabaseNotOpen);
+		return;
+		}
+	
+	HBufC* analyzer = HBufC::NewLC(aMessage.GetDesLength(0));
+	TPtr analyzerPtr = analyzer->Des();
+	aMessage.ReadL(0, analyzerPtr);
+
+	if (iSearchDb->IsOpen()) {
+		iSearchDb->SetAnalyzerL( *analyzer ); 
+	}
+	if (iIndexDb->IsOpen()) {
+		iIndexDb->SetAnalyzerL( *analyzer ); 
+	}
+	CleanupStack::PopAndDestroy( analyzer );
+	
+	// Complete the request
+	aMessage.Complete(KErrNone);	
+	}
+
+void CSearchServerSubSession::SearchL(const RMessage2& aMessage)
+	{
+	PERFORMANCE_LOG_START("CSearchServerSubSession::SearchL");
+	
+	// Sanity check
+	if (!iSearchDb->IsOpen())
+		{
+		iSession->PanicClient(aMessage, EDatabaseNotOpen);
+		return;
+		}
+	
+	// buf for the search terms
+	HBufC* searchTerms = HBufC::NewLC(aMessage.GetDesLength(0));
+	
+	// read the search terms
+	TPtr ptr = searchTerms->Des();
+	aMessage.ReadL(0, ptr);
+
+	// Commit search
+	LOG_PLAYER_RECORD( CLogPlayerRecorder::LogSearchL( reinterpret_cast<TUint>(this), *searchTerms ) );
+	if (!iSearchDb->SearchL(*searchTerms, this, aMessage))
+		{
+		// Not commited, complete with zero count
+		TPckgBuf<TInt> resultCountPackage(0);
+		aMessage.WriteL(1, resultCountPackage);
+
+		// Complete the request
+		aMessage.Complete(KErrNone);	
+		}
+	
+	// Cleanup search terms
+	CleanupStack::PopAndDestroy(searchTerms);
+	}
+	
+void CSearchServerSubSession::SearchCompleteL(const RMessage2& aMessage)
+	{
+	PERFORMANCE_LOG_START("CSearchServerSubSession::SearchCompleteL");
+	
+	// Complete search
+	const TInt resultCount = iSearchDb->SearchCompleteL();
+		
+	// Return the size of the search results in first parameter
+	TPckgBuf<TInt> resultCountPackage(resultCount);
+	aMessage.WriteL(1, resultCountPackage);
+	
+	}
+
+// CSearchServerSession::GetDocumentL().
+// Client gets the next documents (result) when SearchL has completed
+void CSearchServerSubSession::GetDocumentL(const RMessage2& aMessage)
+	{
+	PERFORMANCE_LOG_START("CSearchServerSubSession::GetDocumentL");
+	
+	// Sanity check
+	if (!iSearchDb->IsOpen())
+		{
+		iSession->PanicClient(aMessage, EDatabaseNotOpen);
+		return;
+		}
+	
+	// buf for the search terms
+	TInt index = aMessage.Int0();
+	
+	delete iNextDocument; 
+	iNextDocument = NULL;
+	LOG_PLAYER_RECORD( CLogPlayerRecorder::LogGetDocumentL( reinterpret_cast<TUint>( this ), index ) );
+	iSearchDb->GetDocumentL(index, this, aMessage);
+	}
+	
+void CSearchServerSubSession::GetDocumentCompleteL(const RMessage2& aMessage)
+	{
+	PERFORMANCE_LOG_START("CSearchServerSubSession::GetDocumentCompleteL");
+	
+	iNextDocument = iSearchDb->GetDocumentCompleteL();	
+	TPckgBuf<TInt> documentSizePackage(iNextDocument ? iNextDocument->Size() : 0);
+	aMessage.WriteL(1, documentSizePackage);
+	}
+
+// CSearchServerSession::GetDocumentObjectL()
+// Client gets the object after GetDocumentL() has completed 
+void CSearchServerSubSession::GetDocumentObjectL(const RMessage2& aMessage)
+	{
+	PERFORMANCE_LOG_START("CSearchServerSubSession::GetDocumentObjectL");
+	
+	// Sanity check
+	if (!iSearchDb->IsOpen())
+		{
+		iSession->PanicClient(aMessage, EDatabaseNotOpen);
+		return;
+		}
+	
+	if (iNextDocument)
+		{
+		// Create long enough descriptor for serialized hits
+		HBufC8* buf = HBufC8::NewLC(iNextDocument->Size());
+		TPtr8 ptr = buf->Des();
+	
+		// Initialize a new stream
+		RDesWriteStream stream;
+		stream.Open(ptr);
+		stream.PushL();
+	
+		// Externalize hits to the stream
+		iNextDocument->ExternalizeL(stream);
+	
+		// Commit and destroy the stream
+		stream.CommitL();
+		CleanupStack::PopAndDestroy(&stream);
+	
+		// write the serialized hits in to the message
+		aMessage.WriteL(0, ptr);
+	
+		// Delete descriptor
+		CleanupStack::PopAndDestroy(buf);
+		}
+	else
+		{
+		// Empty
+		aMessage.WriteL(0, KNullDesC8);
+		}
+	
+	// Complete the request
+	aMessage.Complete(KErrNone);		
+	}
+
+void CSearchServerSubSession::AddL(const RMessage2& aMessage)
+	{
+	// Sanity check
+	if (!iIndexDb->IsOpen())
+		{
+		iSession->PanicClient(aMessage, EDatabaseNotOpen);
+		return;
+		}
+	
+	// buf for the search terms
+	HBufC8* serializedDocument = HBufC8::NewLC(aMessage.GetDesLength(0));
+	
+	// read the search terms
+	TPtr8 ptr = serializedDocument->Des();
+	aMessage.ReadL(0, ptr);
+
+	RDesReadStream stream;
+	stream.Open(ptr);
+	stream.PushL();
+	CSearchDocument* document = CSearchDocument::NewL(stream);
+	CleanupStack::PopAndDestroy(&stream);
+	CleanupStack::PushL(document);
+	
+	// Index the thing
+	LOG_PLAYER_RECORD(
+	if ( iIndexDb->BaseAppClass().Find( KFileBaseAppClass ) == KErrNotFound )
+	    {
+		CLogPlayerRecorder::LogAddL( reinterpret_cast<TUint>(this), *document );
+	    }
+	);
+	iIndexDb->AddL(*document, this, aMessage);
+	
+	CleanupStack::PopAndDestroy(document);
+	CleanupStack::PopAndDestroy(serializedDocument);
+	}
+
+void CSearchServerSubSession::AddCompleteL(const RMessage2& /*aMessage*/)
+	{
+	iIndexDb->AddCompleteL();	
+	}
+
+
+void CSearchServerSubSession::UpdateL(const RMessage2& aMessage)
+	{
+	// Sanity check
+	if (!iIndexDb->IsOpen())
+		{
+		iSession->PanicClient(aMessage, EDatabaseNotOpen);
+		return;
+		}
+
+	// buf for the search terms
+	HBufC8* serializedDocument = HBufC8::NewLC(aMessage.GetDesLength(0));
+	
+	// read the search terms
+	TPtr8 ptr = serializedDocument->Des();
+	aMessage.ReadL(0, ptr);
+
+	RDesReadStream stream;
+	stream.Open(ptr);
+	stream.PushL();
+	CSearchDocument* document = CSearchDocument::NewL(stream);
+	CleanupStack::PopAndDestroy(&stream);
+	CleanupStack::PushL(document);
+	
+	// Index the thing
+	LOG_PLAYER_RECORD( CLogPlayerRecorder::LogUpdateL( reinterpret_cast<TUint>(this), *document ) );
+	iIndexDb->UpdateL(*document, this, aMessage);
+	
+	CleanupStack::PopAndDestroy(document);
+	CleanupStack::PopAndDestroy(serializedDocument);
+	}
+
+void CSearchServerSubSession::UpdateCompleteL(const RMessage2& /*aMessage*/)
+	{
+	iIndexDb->UpdateCompleteL();	
+	}
+
+
+void CSearchServerSubSession::DeleteL(const RMessage2& aMessage)
+	{
+	// Sanity check
+	if (!iIndexDb->IsOpen())
+		{
+		iSession->PanicClient(aMessage, EDatabaseNotOpen);
+		return;
+		}
+
+	HBufC* docUid = HBufC::NewLC(aMessage.GetDesLength(0));
+
+	TPtr ptr = docUid->Des();
+	aMessage.ReadL(0, ptr);
+
+	LOG_PLAYER_RECORD( CLogPlayerRecorder::LogDeleteL( reinterpret_cast<TUint>(this), *docUid ) );
+	iIndexDb->DeleteDocumentsL(*docUid, this, aMessage);
+
+	CleanupStack::PopAndDestroy(docUid);
+	}
+
+void CSearchServerSubSession::DeleteCompleteL(const RMessage2& /*aMessage*/)
+	{
+	iIndexDb->DeleteDocumentsCompleteL();	
+	}
+
+void CSearchServerSubSession::FlushCompleteL(const RMessage2& /*aMessage*/)
+	{
+	iIndexDb->FlushCompleteL();	
+	}
+
+void CSearchServerSubSession::ResetL(const RMessage2& aMessage)
+	{
+	// Sanity check
+	if (!iIndexDb->IsOpen())
+		{
+		iSession->PanicClient(aMessage, EDatabaseNotOpen);
+		return;
+		}
+
+	// Reset database
+	LOG_PLAYER_RECORD( CLogPlayerRecorder::LogResetL( reinterpret_cast<TUint>(this) ) );
+	iIndexDb->ResetL();
+	
+	// Complete the request
+	aMessage.Complete(KErrNone);		
+	}
+
+void CSearchServerSubSession::FlushL(const RMessage2& aMessage)
+    {
+    // Sanity check
+    if (!iIndexDb->IsOpen())
+        {
+        iSession->PanicClient(aMessage, EDatabaseNotOpen);
+        return;
+        }
+    
+    LOG_PLAYER_RECORD( CLogPlayerRecorder::LogFlushL( reinterpret_cast<TUint>(this) ) );
+    iIndexDb->FlushL(this, aMessage);
+    }
+
+
+void CSearchServerSubSession::HandleAsyncronizerComplete(TCPixTaskType aType, TInt aError, const RMessage2& aMessage)
+	{
+	if (aError == KErrNone)
+		{
+		switch (aType)
+			{
+			case ECPixTaskTypeSearch:
+				{
+				TRAP(aError, SearchCompleteL(aMessage));
+				break;
+				}
+			case ECPixTaskTypeGetDocument:
+				{
+				TRAP(aError, GetDocumentCompleteL(aMessage));
+				break;
+				}
+			case ECPixTaskTypeAdd:
+				{
+				TRAP(aError, AddCompleteL(aMessage));
+				break;
+				}
+			case ECPixTaskTypeUpdate:
+				{
+				TRAP(aError, UpdateCompleteL(aMessage));
+				break;
+				}
+			case ECPixTaskTypeDelete:
+				{
+				TRAP(aError, DeleteCompleteL(aMessage));
+				break;
+				}
+			case ECPixTaskTypeFlush:
+				{
+				TRAP(aError, FlushCompleteL(aMessage));
+				break;
+				}
+			default:
+				{
+				// No need for completion code for the rest
+				break;
+				}
+			}
+		}
+	
+	// Complete the request
+	aMessage.Complete(aError);		
+	}
+