diff -r 000000000000 -r 671dee74050a searcher/searchserver/src/csearchserversession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/searcher/searchserver/src/csearchserversession.cpp Mon Apr 19 14:40:16 2010 +0300 @@ -0,0 +1,488 @@ +/* +* 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 +#include + +#include "CSearchServerSession.h" +#include "CSearchServerSubSession.h" +#include "SearchServerCommon.h" +#include "CSearchServer.h" +#include "SearchServerHelper.h" +#include "Common.h" +#include "SearchServerTesting.h" +#include "SearchServerLogger.h" +#include "cpixidxdb.h" // cpix_IdxDb_undefineVolume +#include "CLogPlayerRecorder.h" + +#include "indevicecfg.h" + +// ========================= MEMBER FUNCTIONS ================================== + +// ----------------------------------------------------------------------------- +// CSearchServerSession::NewL() +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CSearchServerSession* CSearchServerSession::NewL() + { + CSearchServerSession* self = CSearchServerSession::NewLC(); + CleanupStack::Pop(self); + return self; + } + +// ----------------------------------------------------------------------------- +// CSearchServerSession::NewLC() +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CSearchServerSession* CSearchServerSession::NewLC() + { + CSearchServerSession* self = new (ELeave) CSearchServerSession(); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +// ----------------------------------------------------------------------------- +// CSearchServerSession::ConstructL() +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CSearchServerSession::ConstructL() + { + } + +// ----------------------------------------------------------------------------- +// CSearchServerSession::CSearchServerSession() +// C++ default constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +// +CSearchServerSession::CSearchServerSession() + { + CPIXLOGSTRING("Creating search server session"); + } + +// ----------------------------------------------------------------------------- +// CSearchServerSession::~CSearchServerSession() +// Destructor. +// ----------------------------------------------------------------------------- +// +CSearchServerSession::~CSearchServerSession() + { + CPIXLOGSTRING("Deleting search server session"); + } + +// ----------------------------------------------------------------------------- +// CSearchServerSession::CreateL() +// Called by client/server framework after session has been successfully created +// ----------------------------------------------------------------------------- +// +void CSearchServerSession::CreateL() + { + // Create new object index + iCountersObjectIndex = CObjectIx::NewL(); + + // Initialize the object container + // using the object container index in the server. + iContainer = ((CSearchServer*) Server())->NewContainerL(); + + ((CSearchServer*) Server())->AddSession(); + } + +// ----------------------------------------------------------------------------- +// CSearchServerSession::SubSessionFromHandle() +// Utility to return the CSearchServerSubSession (subsession) object +// ----------------------------------------------------------------------------- +// +CSearchServerSubSession* CSearchServerSession::SubSessionFromHandle( + const RMessage2& aMessage, TInt aHandle) + { + CSearchServerSubSession* subsession = + (CSearchServerSubSession*) iCountersObjectIndex->At(aHandle); + if (subsession == NULL) + { + PanicClient(aMessage, EBadSubsessionHandle); + } + return subsession; + } + +// ----------------------------------------------------------------------------- +// CSearchServerSession::ServiceL() +// Service request from client. +// ----------------------------------------------------------------------------- +// +void CSearchServerSession::ServiceL(const RMessage2& aMessage) + { + // First check for session-relative requests + switch (aMessage.Function()) + { + case ESearchServerCreateSubSession: + { + NewSubSessionL(aMessage); + return; + } + case ESearchServerCloseSession: + { + CloseSession(aMessage); + return; + } + case ESearchServerDatabaseDefine: + { + DefineVolumeL(aMessage); + return; + } + case ESearchServerDatabaseUnDefine: + { + UnDefineVolumeL(aMessage); + return; + } + case ESearchServerStopHouseKeeping: + { + StopHouseKeeping(aMessage); + return; + } + case ESearchServerContinueHouseKeeping: + { + ContinueHouseKeeping(aMessage); + return; + } + case ESearchServerForceHouseKeeping: + { + ForceHouseKeeping(aMessage); + return; + } + // Don't panic in default case! + } + + // All other function codes must be subsession relative. + // We need to find the appropriate server side subsession + // i.e. the CCountSubSession object. + // The handle value is passed as the 4th aregument. + CSearchServerSubSession* subsession = SubSessionFromHandle(aMessage, + aMessage.Int3()); + switch (aMessage.Function()) + { + case ESearchServerInitSubSession: + aMessage.Complete(KErrNone); + break; + + case ESearchServerCloseSubSession: + DeleteCounter(aMessage.Int3()); + aMessage.Complete(KErrNone); + break; + + case ESearchServerOpenDatabase: + RECORDED_EXECUTION_BEGIN + subsession->OpenDatabaseL(aMessage); + RECORDED_EXECUTION_END("openDatabase") + break; + + case ESearchServerSetAnalyzer: + RECORDED_EXECUTION_BEGIN + subsession->SetAnalyzerL(aMessage); + RECORDED_EXECUTION_END("setAnalyzer") + break; + + case ESearchServerSearch: + RECORDED_EXECUTION_BEGIN + subsession->SearchL(aMessage); + RECORDED_EXECUTION_END("search"); + break; + + case ESearchServerGetDocument: + RECORDED_EXECUTION_BEGIN + subsession->GetDocumentL(aMessage); + RECORDED_EXECUTION_END("getDocument") + break; + + case ESearchServerGetDocumentObject: + RECORDED_EXECUTION_BEGIN + subsession->GetDocumentObjectL(aMessage); + RECORDED_EXECUTION_END("getDocumentObject") + break; + + case ESearchServerCancelAll: + RECORDED_EXECUTION_BEGIN + subsession->CancelAll(aMessage); + RECORDED_EXECUTION_END("cancelAll") + break; + + case ESearchServerAdd: + RECORDED_EXECUTION_BEGIN + subsession->AddL(aMessage); + RECORDED_EXECUTION_END("add") + break; + + case ESearchServerUpdate: + RECORDED_EXECUTION_BEGIN + subsession->UpdateL(aMessage); + RECORDED_EXECUTION_END("update") + break; + + case ESearchServerDelete: + RECORDED_EXECUTION_BEGIN + subsession->DeleteL(aMessage); + RECORDED_EXECUTION_END("delete") + break; + + case ESearchServerReset: + RECORDED_EXECUTION_BEGIN + subsession->ResetL(aMessage); + RECORDED_EXECUTION_END("reset") + break; + + case ESearchServerFlush: + RECORDED_EXECUTION_BEGIN + subsession->FlushL(aMessage); + RECORDED_EXECUTION_END("flush") + break; + + default: + { + PanicClient(aMessage, EBadRequest); + aMessage.Complete(KErrNone); + } + } + + } + +// ----------------------------------------------------------------------------- +// CSearchServerSession::NewSubSessionL() +// Creates new subsession +// ----------------------------------------------------------------------------- +// +void CSearchServerSession::NewSubSessionL(const RMessage2& aMessage) + { + // make a new counter object + CSearchServerSubSession* subsession = CSearchServerSubSession::NewL(this); + + // add the CCountSubSession object to + // this subsession's object container + // to gererate a unique id + iContainer->AddL(subsession); + + // Add the object to object index; this returns + // a unique handle so that we can find the object + // again laterit later. + TInt handle = iCountersObjectIndex->AddL(subsession); + + // Write the handle value back to the client. + // NB It's not obvious but the handle value must be passed + // back as the 4th parameter (i.e. parameter number 3 on + // a scale of 0 to 3). + // The arguments that are passed across are actually + // set up by RSubSessionBase::DoCreateSubSession(). + // If you pass your own arguments into a call + // to RSubSessionBase::CreateSubSession(), which calls DoCreateSubSession, + // then only the first three are picked up - the 4th is reserved for the + // the subsession handle. + TPckgBuf handlePckg(handle); + TRAPD(res,aMessage.WriteL(3,handlePckg)); + if (res != KErrNone) + { + iCountersObjectIndex->Remove(handle); + PanicClient(aMessage, EBadDescriptor); + return; + } + + // We now have another "resource" + iResourceCount++; + + // Complete the request + aMessage.Complete(KErrNone); + } + +// ----------------------------------------------------------------------------- +// CSearchServerSession::CloseSession() +// Called by client/server framework to close a session +// ----------------------------------------------------------------------------- +// +void CSearchServerSession::CloseSession(const RMessage2& aMessage) + { + ((CSearchServer*) Server())->RemoveSession(); + + // Deletes the object index. + if (iCountersObjectIndex) + { + delete iCountersObjectIndex; + iCountersObjectIndex = NULL; + } + + ((CSearchServer*) Server())->RemoveContainer(iContainer); + + // Complete the request + aMessage.Complete(KErrNone); + } + +// ----------------------------------------------------------------------------- +// CSearchServerSession::DefineVolumeL() +// Defines a specific volume, with an optional path +// ----------------------------------------------------------------------------- +// +void CSearchServerSession::DefineVolumeL(const RMessage2& aMessage) + { + HBufC* qBaseAppClass = HBufC::NewLC(aMessage.GetDesLength(0)); + TPtr qBaseAppClassPtr = qBaseAppClass->Des(); + aMessage.ReadL(0, qBaseAppClassPtr); + + HBufC* path = HBufC::NewLC(aMessage.GetDesLength(1)); + TPtr pathPtr = path->Des(); + aMessage.ReadL(1, pathPtr); + + DefineVolumeL(*qBaseAppClass, *path); + + CleanupStack::PopAndDestroy(path); + CleanupStack::PopAndDestroy(qBaseAppClass); + + // Complete the request + aMessage.Complete(KErrNone); + } + +// ----------------------------------------------------------------------------- +// CSearchServerSession::DefineVolumeL() +// Defines a specific volume, with an optional path +// ----------------------------------------------------------------------------- +// +void CSearchServerSession::DefineVolumeL(const TDesC& aQualifiedBaseAppClass, + const TDesC& aIndexDbPath) + { + LOG_PLAYER_RECORD( CLogPlayerRecorder::LogDefineVolumeL(aQualifiedBaseAppClass, aIndexDbPath) ); + + HBufC8* qualBaseAppClass = HBufC8::NewLC(aQualifiedBaseAppClass.Size() + + 1); + TPtr8 qualBaseAppClassPtr = qualBaseAppClass->Des(); + qualBaseAppClassPtr.Copy(aQualifiedBaseAppClass); + + HBufC8* path = HBufC8::NewLC(aIndexDbPath.Size() + 1); + TPtr8 pathPtr = path->Des(); + pathPtr.Copy(aIndexDbPath); + + cpix_Result result; + cpix_IdxDb_defineVolume(&result, + reinterpret_cast (qualBaseAppClassPtr.PtrZ()), + reinterpret_cast (pathPtr.PtrZ())); + + SearchServerHelper::CheckCpixErrorL(&result, KErrCannotDefineVolume); + + CleanupStack::PopAndDestroy(path); + CleanupStack::PopAndDestroy(qualBaseAppClass); + } + +// ----------------------------------------------------------------------------- +// CSearchServerSession::UnDefineVolumeL() +// Undefines a specific volume. +// ----------------------------------------------------------------------------- +// +void CSearchServerSession::UnDefineVolumeL(const RMessage2& aMessage) + { + HBufC* qBaseAppClass = HBufC::NewLC(aMessage.GetDesLength(0)); + TPtr qBaseAppClassPtr = qBaseAppClass->Des(); + aMessage.ReadL(0, qBaseAppClassPtr); + + UnDefineVolumeL(*qBaseAppClass); + + CleanupStack::PopAndDestroy(qBaseAppClass); + + // Complete the request + aMessage.Complete(KErrNone); + } + +// ----------------------------------------------------------------------------- +// CSearchServerSession::StopHouseKeeping() +// Stop housekeeping +// ----------------------------------------------------------------------------- +// +void CSearchServerSession::StopHouseKeeping(const RMessage2& aMessage) + { + CServer2* server = const_cast( Server() ); + static_cast( server )->StopHouseKeeping(); + + // Complete the request + aMessage.Complete(KErrNone); + } + +// ----------------------------------------------------------------------------- +// CSearchServerSession::ContinueHouseKeeping() +// Continue housekeeping +// ----------------------------------------------------------------------------- +// +void CSearchServerSession::ContinueHouseKeeping(const RMessage2& aMessage) + { + CServer2* server = const_cast( Server() ); + static_cast( server )->ContinueHouseKeeping(); + + // Complete the request + aMessage.Complete(KErrNone); + } + +// ----------------------------------------------------------------------------- +// CSearchServerSession::ForceHouseKeeping() +// Force housekeeping +// ----------------------------------------------------------------------------- +// +void CSearchServerSession::ForceHouseKeeping(const RMessage2& aMessage) + { + CServer2* server = const_cast( Server() ); + static_cast( server )->ForceHouseKeeping(); + + // Complete the request + aMessage.Complete(KErrNone); + } + +// ----------------------------------------------------------------------------- +// CSearchServerSession::UnDefineVolumeL() +// Undefines a specific volume. +// ----------------------------------------------------------------------------- +// +void CSearchServerSession::UnDefineVolumeL(const TDesC& aBaseAppClass) + { + HBufC8* baseAppClass = HBufC8::NewLC(aBaseAppClass.Size() + 1); + TPtr8 baseAppClassPtr = baseAppClass->Des(); + baseAppClassPtr.Copy(aBaseAppClass); + + cpix_IdxDb_undefineVolume( + reinterpret_cast (baseAppClassPtr.PtrZ())); + + CleanupStack::PopAndDestroy(baseAppClass); + } + +// ----------------------------------------------------------------------------- +// CSearchServerSession::NewSubSessionL() +// Delete the subsession object through its handle +// ----------------------------------------------------------------------------- +// +void CSearchServerSession::DeleteCounter(TInt aHandle) + { + // This will delete the CCountSubSession object; the object is + // reference counted, and removing the handle causes the object to be closed + // [closing reduces the access count - the object is deleted if the access + // count reaches zero etc]. + iCountersObjectIndex->Remove(aHandle); + // decrement resource count + iResourceCount--; + } + +// Utility function to panic client +void CSearchServerSession::PanicClient(const RMessage2& aMessage, TInt aPanic) const + { + aMessage.Panic(KSearchServer, aPanic); // Note: this panics the client thread, not server + } + +// End of File +