diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/ServerCore/Src/alfsrvsubsessionbase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uiacceltk/hitchcock/ServerCore/Src/alfsrvsubsessionbase.cpp Tue Feb 02 07:56:43 2010 +0200 @@ -0,0 +1,242 @@ +/* +* Copyright (c) 2006 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: Sub session base. +* +*/ + + + +#include "alf/alfappserver.h" +#include "alf/alfappsrvsessionbase.h" +#include "alfsrvsubsessionbase.h" +#include "alflogger.h" + +NONSHARABLE_CLASS(CAlfSrvSubSessionBase::TPrivateData) + { + public: + MAlfExtension* iObject; // owned, use Release() to destroy + }; + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +CAlfSrvSubSessionBase::CAlfSrvSubSessionBase( CAlfAppSrvSessionBase& aSession ) + : iSession( aSession ) + { + } + +CAlfSrvSubSessionBase* CAlfSrvSubSessionBase::NewLC( const RMessage2& aMessage, + TInt aImplementationUid, + TInt aImplementationId, + CAlfAppSrvSessionBase& aSession) + { + CAlfSrvSubSessionBase* me = new (ELeave) CAlfSrvSubSessionBase(aSession); + CleanupClosePushL(*me); + me->ConstructL(aMessage, aImplementationUid, aImplementationId); + return me; + } + +void CAlfSrvSubSessionBase::ConstructL(const RMessage2& aMessage, + TInt aImplementationUid, + TInt aImplementationId ) + { + ConstructL(); + + // leaves if no implementation found + iData->iObject = iSession.AlfServer()->CreateExtensionL( + aImplementationUid, aImplementationId,aMessage); + + iFactoryUid = aImplementationUid; + } + + +// --------------------------------------------------------------------------- +// 2nd phase constructor +// --------------------------------------------------------------------------- +// +void CAlfSrvSubSessionBase::ConstructL() + { + iData = new (ELeave) TPrivateData; + + iData->iObject = 0; + } + + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CAlfSrvSubSessionBase::~CAlfSrvSubSessionBase() + { + if (iData && iData->iObject) + { + // todo: notify server about implementation removal + iData->iObject->Release(); + } + + delete iData; + } + +// --------------------------------------------------------------------------- +// Process message +// --------------------------------------------------------------------------- +// +void CAlfSrvSubSessionBase::ProcessMessageL(const RMessage2& aMessage) + { + // Call the virtual function. + DoProcessMessageL( aMessage ); + } + +// --------------------------------------------------------------------------- +// Processes the message. +// --------------------------------------------------------------------------- +// +void CAlfSrvSubSessionBase::DoProcessMessageL(const RMessage2& aMessage) + { + if (iData && iData->iObject) + { + // session owns the buffers and everything related to msg handling + CAlfClientMessage* msg = iSession.CreateNewMessageHolderL(aMessage); + + TRAPD(err, iData->iObject->HandleCmdL(msg->iDecodedOp, + *msg->iInBuf, msg->ReplyBufAsTDes8())); + + iSession.CompleteCmd(0, err); + return; + } + + User::Leave(KErrNotSupported); + } + +// --------------------------------------------------------------------------- +// Returns the session +// --------------------------------------------------------------------------- +// +CAlfAppSrvSessionBase& CAlfSrvSubSessionBase::Session() + { + return iSession; + } + + +MHuiVisualOwner* CAlfSrvSubSessionBase::AsVisualOwner() + { + if (iData && iData->iObject) + { + return static_cast(iData->iObject->GetInterface(EHuiInterfaceVisualOwner)); + } + + return 0; + } + +CHuiControl* CAlfSrvSubSessionBase::AsHuiControl() + { + if (iData && iData->iObject) + { + return static_cast(iData->iObject->GetInterface(EHuiObjectTypeControl)); + } + + return 0; + } + +CHuiVisual* CAlfSrvSubSessionBase::AsHuiVisual() + { + if (iData && iData->iObject) + { + return static_cast(iData->iObject->GetInterface(EHuiObjectTypeVisual)); + } + + return 0; + } + +CHuiLayout* CAlfSrvSubSessionBase::AsHuiLayout() + { + if (iData && iData->iObject) + { + return static_cast(iData->iObject->GetInterface(EHuiObjectTypeLayout)); + } + + return 0; + } + +CHuiBrush* CAlfSrvSubSessionBase::AsHuiBrush() + { + if (iData && iData->iObject) + { + return static_cast(iData->iObject->GetInterface(EHuiObjectTypeBrush)); + } + + return 0; + } + +MHuiMappingFunction* CAlfSrvSubSessionBase::AsMappingFunction() + { + if (iData && iData->iObject) + { + return static_cast(iData->iObject->GetInterface(EHuiInterfaceMappingFunction)); + } + + return 0; + } + +CHuiControlGroup* CAlfSrvSubSessionBase::AsHuiControlCroup() + { + if (iData && iData->iObject) + { + return static_cast(iData->iObject->GetInterface(EHuiObjectTypeControlGroup)); + } + + return 0; + } + +CHuiDisplay* CAlfSrvSubSessionBase::AsHuiDisplay() + { + if (iData && iData->iObject) + { + return static_cast(iData->iObject->GetInterface(EHuiObjectTypeDisplay)); + } + + return 0; + } + +CAlfBrushHandler* CAlfSrvSubSessionBase::AsBrushHandler() + { + if (iData && iData->iObject) + { + return static_cast(iData->iObject->GetInterface(EAlfBrushHandler)); + } + + return 0; + } + +MAlfExtension* CAlfSrvSubSessionBase::AsCommandHandler() + { + if (iData) + { + return iData->iObject; + } + + return 0; + } + +// Todo: Currently we don't support trulu asynch operations as +// MAlfExtension does not have interfaces to utilize for this purpose +// +// It should be evaluated whether there are real use cases for asynchronous command handling +void CAlfSrvSubSessionBase::CancelAsynchRequests() + { + } +