diff -r 5b6f26637ad3 -r f4a778e096c2 phonebookui/Phonebook2/xSPExtensionManager/src/CxSPViewActivator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/xSPExtensionManager/src/CxSPViewActivator.cpp Wed Sep 01 12:29:52 2010 +0100 @@ -0,0 +1,393 @@ +/* +* 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: +* View activator - activates a tab view upon client request +* +*/ + + +// INCLUDE FILES +#include "CxSPViewActivator.h" +#include +#include "CxSPViewInfo.h" +#include + + +// System includes +#include + +// Unnamed namespace for local definitions +namespace + { + const TInt KDesAddressParam = 2; // Des address is in param ix 2 + _LIT( KPanicText, "xSPViewActivator" ); + + enum TPanicCode + { + EBadDescriptorLength, + EBadDescriptor + }; + } // namespace + +// ================= MEMBER FUNCTIONS ======================= + +CxSPViewActivator* CxSPViewActivator::NewL(CxSPViewIdChanger* aViewIdChanger) + { + CxSPViewActivator* self = new(ELeave) CxSPViewActivator(aViewIdChanger); + + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); // self + + return self; + } + +CxSPViewActivator::CxSPViewActivator(CxSPViewIdChanger* aViewIdChanger) : + CServer2(EPriorityStandard) + { + iViewIdChanger = aViewIdChanger; + } + +void CxSPViewActivator::ConstructL() + { + StartL(KxSPServer); + } + +CxSPViewActivator::~CxSPViewActivator() + { + } + +CSession2* CxSPViewActivator::NewSessionL(const TVersion& aVersion, const RMessage2&) const + { + TBool supported = User::QueryVersionSupported(TVersion(KxSPViewServerMajor, + KxSPViewServerMinor, + KxSPViewServerBuild), + aVersion); + if(!supported) + { + User::Leave(KErrNotSupported); + } + + return new (ELeave) CxSPViewActivatorSession(); + } + +void CxSPViewActivator::ActivateView1L(const RMessage2 &aMessage) + { + TUint32 ecomID = aMessage.Int0(); + TUint32 viewID = aMessage.Int1(); + + TInt err = KErrNone; + TInt newViewId; + if(ecomID) + { + err = iViewIdChanger->GetNewView(ecomID, viewID, newViewId); + } + else + { + newViewId = viewID; + } + + aMessage.Complete(err); + + if(err == KErrNone) + { + // Activate the view + static_cast(CCoeEnv::Static()->AppUi())->ActivateLocalViewL( + TUid::Uid((TInt)newViewId)); + } + + return; + } + +void CxSPViewActivator::ActivateView2L(const RMessage2 &aMessage) + { + TInt err = KErrNone; + + TUint32 ecomID = aMessage.Int0(); + TUint32 viewID = aMessage.Int1(); + TInt desLen = aMessage.GetDesLength(KDesAddressParam); + if( desLen <= 0 ) + { + aMessage.Panic( KPanicText, EBadDescriptorLength ); + } + else + { + HBufC8* paramBuf = HBufC8::NewL(desLen); + CleanupStack::PushL(paramBuf); + TPtr8 ptr = paramBuf->Des(); + aMessage.ReadL(KDesAddressParam, ptr); + + TInt newViewId; + if(ecomID) + { + err = iViewIdChanger->GetNewView(ecomID, viewID, newViewId); + } + else + { + newViewId = viewID; + } + + // If err is KErrNone or KErrNotFound, complete client's request with KErrNone. + // The reason is even if client passed an invalid view id to xsp server, + // the server will launch phonebook namelist view instead. + if ( KErrNone == err || KErrNotFound == err ) + { + aMessage.Complete( KErrNone ); + } + else + { + aMessage.Complete( err ); + } + + if( err == KErrNone ) + { + // Make view id + const TVwsViewId viewId( TUid::Uid( KUid ), TUid::Uid( newViewId ) ); + // Activate the view + static_cast(CCoeEnv::Static()->AppUi())->ActivateViewL( + viewId, CPbk2ViewState::Uid(), *paramBuf); + } + else if ( err == KErrNotFound ) + { + // Activate phonebook namelist view if valid view id can't be found + const TVwsViewId viewId( TUid::Uid( KUid ), TUid::Uid( EPbk2NamesListViewId ) ); + static_cast( CCoeEnv::Static()->AppUi() )->ActivateViewL( + viewId, CPbk2ViewState::Uid(), *paramBuf ); + } + + CleanupStack::PopAndDestroy(); // paramBuf; + } + } + +void CxSPViewActivator::ActivateView2AsyncL(const RMessage2 &aMessage) + { + TInt err = KErrNone; + + TUint32 ecomID = aMessage.Int0(); + TUint32 viewID = aMessage.Int1(); + TInt desLen = aMessage.GetDesLength(KDesAddressParam); + if( desLen <= 0 ) + { + aMessage.Panic( KPanicText, EBadDescriptorLength ); + } + else + { + HBufC8* paramBuf = HBufC8::NewL(desLen); + CleanupStack::PushL(paramBuf); + TPtr8 ptr = paramBuf->Des(); + aMessage.ReadL(KDesAddressParam, ptr); + + TInt newViewId; + if(ecomID) + { + err = iViewIdChanger->GetNewView(ecomID, viewID, newViewId); + } + else + { + newViewId = viewID; + } + + aMessage.Complete(err); + + if(err == KErrNone) + { + // Make view id + const TVwsViewId viewId(TUid::Uid(KUid), TUid::Uid(newViewId)); + // Activate the view + static_cast(CCoeEnv::Static()->AppUi())->ActivateViewL( + viewId, CPbk2ViewState::Uid(), *paramBuf); + } + + CleanupStack::PopAndDestroy(); // paramBuf; + } + + } + +void CxSPViewActivator::GetViewCountL(const RMessage2 &aMessage) + { + TInt tabsCount; + TInt dummy; + iViewIdChanger->GetViewCount( tabsCount, dummy ); + TPckgC tabsCountDes( tabsCount ); + TRAPD( err, aMessage.WriteL( 0, tabsCountDes ) ); + if( err != KErrNone ) + { + aMessage.Panic( KPanicText, EBadDescriptor ); + User::Leave( err ); + } + else + { + aMessage.Complete( KErrNone ); + } + } + +void CxSPViewActivator::GetViewDataPackLengthL(const RMessage2 &aMessage) + { + TInt index = aMessage.Int0(); + TInt tabsCount; + TInt dummy; + iViewIdChanger->GetViewCount( tabsCount, dummy ); + if( index < 0 ) + { + aMessage.Complete( KErrUnderflow ); + } + else if( index >= tabsCount ) + { + aMessage.Complete( KErrOverflow ); + } + else + { + RPointerArray infoArray; + CleanupClosePushL( infoArray ); + iViewIdChanger->GetTabViewInfoL( infoArray ); + const CxSPViewInfo& info = *infoArray[index]; + CxSPViewData* viewData = CxSPViewData::NewL(); + CleanupStack::PushL( viewData ); + viewData->SetEComId( info.Id() ); + viewData->SetOriginalViewId( info.OldViewId() ); + viewData->SetIconId( info.SortIconId() ); + viewData->SetMaskId( info.SortMaskId() ); + viewData->SetIconFileL( info.SortIconFile() ); + viewData->SetViewNameL( info.Name() ); + HBufC8* packed = viewData->PackL(); + TInt length = packed->Length(); + delete packed; + CleanupStack::PopAndDestroy(); // viewData + CleanupStack::PopAndDestroy(); // infoArray + TPckgC lengthDes( length ); + TRAPD( err, aMessage.WriteL( 1, lengthDes ) ); + if( err != KErrNone ) + { + aMessage.Panic( KPanicText, EBadDescriptor ); + User::Leave( err ); + } + else + { + aMessage.Complete( KErrNone ); + } + } + } + +void CxSPViewActivator::GetViewDataL(const RMessage2 &aMessage) + { + TInt index = aMessage.Int0(); + TInt tabsCount; + TInt dummy; + iViewIdChanger->GetViewCount( tabsCount, dummy ); + if( index < 0 ) + { + aMessage.Complete( KErrUnderflow ); + } + else if( index >= tabsCount ) + { + aMessage.Complete( KErrOverflow ); + } + else + { + RPointerArray infoArray; + CleanupClosePushL( infoArray ); + iViewIdChanger->GetTabViewInfoL( infoArray ); + const CxSPViewInfo& info = *infoArray[index]; + CxSPViewData* viewData = CxSPViewData::NewL(); + CleanupStack::PushL( viewData ); + viewData->SetEComId( info.Id() ); + viewData->SetOriginalViewId( info.OldViewId() ); + viewData->SetIconId( info.SortIconId() ); + viewData->SetMaskId( info.SortMaskId() ); + viewData->SetIconFileL( info.SortIconFile() ); + viewData->SetViewNameL( info.Name() ); + HBufC8* packed = viewData->PackL(); + CleanupStack::PushL( packed ); + TRAPD( err, aMessage.WriteL( 1, *packed ) ); + if( err != KErrNone ) + { + aMessage.Panic( KPanicText, EBadDescriptor ); + User::Leave( err ); + } + else + { + aMessage.Complete( KErrNone ); + } + CleanupStack::PopAndDestroy(); // packed + CleanupStack::PopAndDestroy(); // viewData + CleanupStack::PopAndDestroy(); // infoArray + } + } + +void CxSPViewActivator::StartL(const TDesC &aName) + { + CServer2::StartL(aName); + + RSemaphore semaphore; + if(semaphore.OpenGlobal(KxSPServer) == KErrNone) + { + semaphore.Signal(); + semaphore.Close(); + } + } + +void CxSPViewActivatorSession::ServiceL(const RMessage2 &aMessage) + { + // There are currently separate synchronous and asynchronous op codes for + // some of the services. The server side implementation is however + // synchronous and the opcodes are handled similarily whenever possible. + // For example EGetViewCount and EGetViewCountAsync are treated identically + // and the corresponding async cancel operation (ECancelGetViewCountAsync) + // does nothing and completes immediately. + + switch(aMessage.Function()) + { + case EActivateView1: + ((CxSPViewActivator*)Server())->ActivateView1L(aMessage); + break; + case EActivateView2: + ((CxSPViewActivator*)Server())->ActivateView2L(aMessage); + break; + case EActivateView2Async: + ((CxSPViewActivator*)Server())->ActivateView2AsyncL( aMessage ); + break; + case EGetViewCount: // FALLTHROUGH + case EGetViewCountAsync: + ((CxSPViewActivator*)Server())->GetViewCountL(aMessage); + break; + case ECancelGetViewCountAsync: + aMessage.Complete( KErrNone ); + break; + case EGetViewDataPackLength: + ((CxSPViewActivator*)Server())->GetViewDataPackLengthL(aMessage); + break; + case EGetViewDataPackLengthAsync: + ((CxSPViewActivator*)Server())->GetViewDataPackLengthL( aMessage ); + break; + case ECancelGetViewDataPackLengthAsync: + aMessage.Complete( KErrNone ); + break; + case EGetViewData: + ((CxSPViewActivator*)Server())->GetViewDataL(aMessage); + break; + case EGetViewDataAsync: + ((CxSPViewActivator*)Server())->GetViewDataL( aMessage ); + break; + case ECancelActivateView2Async: + aMessage.Complete( KErrNone ); + break; + case ECancelGetViewDataAsync: + aMessage.Complete( KErrNone ); + break; + default: + aMessage.Complete(KErrNotSupported); + } + } + +// End of file.