diff -r fb3763350a08 -r 4d54b72983ae taskswitcher/contextengine/tsfswserver/client/src/tsfswclientimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/taskswitcher/contextengine/tsfswserver/client/src/tsfswclientimpl.cpp Tue Jan 26 11:48:23 2010 +0200 @@ -0,0 +1,315 @@ +/* +* Copyright (c) 2008 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: Client API, private implementation + * +*/ + + +#include "tsfswclientimpl.h" +#include "tsfswclientobserver.h" +#include "tsfswcommon.h" +#include + +#include "clientlogging.h" + +// -------------------------------------------------------------------------- +// StartServer +// -------------------------------------------------------------------------- +// +static TInt StartServer() + { + RProcess server; + const TUidType uid( KNullUid, KNullUid, KTsFswServerUid ); + TInt err = server.Create( KTsFswServerImg, KNullDesC, uid ); + if ( err != KErrNone ) + { + return err; + } + TRequestStatus stat; + server.Rendezvous( stat ); + if ( stat != KRequestPending ) + { + server.Kill( 0 ); + } + else + { + server.Resume(); + } + User::WaitForRequest( stat ); + err = server.ExitType() == EExitPanic ? KErrGeneral : stat.Int(); + server.Close(); + return err; + } + +// -------------------------------------------------------------------------- +// CTsFswClientImpl::RTsFswClient::Connect +// -------------------------------------------------------------------------- +// +TInt CTsFswClientImpl::RTsFswClient::Connect() + { + const TInt KAsyncMessageSlots = 4; + const TInt KMaxRetry = 4; + + TInt retry = KMaxRetry; + for ( ; ; ) + { + TInt err = CreateSession( KTsFswServerName, TVersion( 0, 0, 0 ), KAsyncMessageSlots ); + if ( err != KErrNotFound && err != KErrServerTerminated ) + { + return err; + } + if ( !--retry ) + { + return err; + } + err = StartServer(); + if ( err != KErrNone && err != KErrAlreadyExists ) + { + return err; + } + } + } + +// -------------------------------------------------------------------------- +// CTsFswClientImpl::RTsFswClient::Subscribe +// -------------------------------------------------------------------------- +// +void CTsFswClientImpl::RTsFswClient::Subscribe( TRequestStatus& aStatus ) + { + SendReceive( ETsFswSubscribe, aStatus ); + } + +// -------------------------------------------------------------------------- +// CTsFswClientImpl::RTsFswClient::CancelSubscribe +// -------------------------------------------------------------------------- +// +void CTsFswClientImpl::RTsFswClient::CancelSubscribe() + { + SendReceive( ETsFswCancel ); + } + +// -------------------------------------------------------------------------- +// CTsFswClientImpl::RTsFswClient::GetContentL +// -------------------------------------------------------------------------- +// +void CTsFswClientImpl::RTsFswClient::GetContentL( RTsFswArray& aDst ) + { + TSLOG_CONTEXT( GetContentL, TSLOG_LOCAL ); + TSLOG_IN(); + + for ( ; ; ) + { + TPckgBuf bufSize; + User::LeaveIfError( SendReceive( ETsFswGetBufferSize, + TIpcArgs( &bufSize ) ) ); + HBufC8* buf = HBufC8::NewLC( bufSize() ); + TPtr8 p( buf->Des() ); + TInt err = SendReceive( ETsFswGetBuffer, + TIpcArgs( &p, bufSize() ) ); + if ( err == KErrNone ) + { + RDesReadStream strm( p ); + CleanupClosePushL( strm ); + CTsFswEntry::InternalizeArrayL( strm, aDst ); + CleanupStack::PopAndDestroy( &strm ); + } + else if ( err != KErrArgument ) + { + User::Leave( err ); + } + CleanupStack::PopAndDestroy( buf ); + if ( err == KErrNone ) + { + break; + } + // If result was KErrArgument then the size received from GetBufferSize is + // not valid anymore so restart the whole procedure. + } + + TSLOG_OUT(); + } + +// -------------------------------------------------------------------------- +// CTsFswClientImpl::RTsFswClient::CloseApp +// -------------------------------------------------------------------------- +// +void CTsFswClientImpl::RTsFswClient::CloseApp( TInt aWgId ) + { + SendReceive( ETsFswCloseApp, TIpcArgs( aWgId ) ); + } + +// -------------------------------------------------------------------------- +// CTsFswClientImpl::RTsFswClient::SwitchToApp +// -------------------------------------------------------------------------- +// +void CTsFswClientImpl::RTsFswClient::SwitchToApp( TInt aWgId ) + { + SendReceive( ETsFswSwitchToApp, TIpcArgs( aWgId ) ); + } + +// -------------------------------------------------------------------------- +// CTsFswClientImpl::RTsFswClient::ForegroundAppUid +// -------------------------------------------------------------------------- +// +TUid CTsFswClientImpl::RTsFswClient::ForegroundAppUid( TInt aType ) + { + TUid result = KNullUid; + TPckgBuf uidBuf; + if ( SendReceive( ETsFswForegroundAppUid, + TIpcArgs( &uidBuf, &aType ) ) == KErrNone ) + { + result = TUid::Uid( uidBuf() ); + } + return result; + } + +// -------------------------------------------------------------------------- +// CTsFswClientImpl::NewL +// -------------------------------------------------------------------------- +// +CTsFswClientImpl* CTsFswClientImpl::NewL() + { + CTsFswClientImpl* self = NewLC(); + CleanupStack::Pop( self ); + return self; + } + +// -------------------------------------------------------------------------- +// CTsFswClientImpl::NewLC() +// -------------------------------------------------------------------------- +// +CTsFswClientImpl* CTsFswClientImpl::NewLC() + { + CTsFswClientImpl* self = new ( ELeave ) CTsFswClientImpl; + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// -------------------------------------------------------------------------- +// CTsFswClientImpl::CTsFswClientImpl() +// -------------------------------------------------------------------------- +// +CTsFswClientImpl::CTsFswClientImpl() + : CActive( CActive::EPriorityStandard ) + { + CActiveScheduler::Add( this ); + } + +// -------------------------------------------------------------------------- +// CTsFswClientImpl::~CTsFswClientImpl() +// -------------------------------------------------------------------------- +// +CTsFswClientImpl::~CTsFswClientImpl() + { + Cancel(); + iClient.Close(); + } + +// -------------------------------------------------------------------------- +// CTsFswClientImpl::ConstructL() +// -------------------------------------------------------------------------- +// +void CTsFswClientImpl::ConstructL() + { + User::LeaveIfError( iClient.Connect() ); + } + +// -------------------------------------------------------------------------- +// CTsFswClientImpl::GetContentL +// -------------------------------------------------------------------------- +// +void CTsFswClientImpl::GetContentL( RTsFswArray& aDst ) + { + iClient.GetContentL( aDst ); + } + +// -------------------------------------------------------------------------- +// CTsFswClientImpl::Subscribe +// -------------------------------------------------------------------------- +// +void CTsFswClientImpl::Subscribe( MTsFswObserver& aObserver ) + { + Cancel(); + iObserver = &aObserver; + iClient.Subscribe( iStatus ); + SetActive(); + } + +// -------------------------------------------------------------------------- +// CTsFswClientImpl::CancelSubscribe +// -------------------------------------------------------------------------- +// +void CTsFswClientImpl::CancelSubscribe() + { + Cancel(); + } + +// -------------------------------------------------------------------------- +// CTsFswClientImpl::CloseApp +// -------------------------------------------------------------------------- +// +void CTsFswClientImpl::CloseApp( TInt aWgId ) + { + iClient.CloseApp( aWgId ); + } + +// -------------------------------------------------------------------------- +// CTsFswClientImpl::SwitchToApp +// -------------------------------------------------------------------------- +// +void CTsFswClientImpl::SwitchToApp( TInt aWgId ) + { + iClient.SwitchToApp( aWgId ); + } + +// -------------------------------------------------------------------------- +// CTsFswClientImpl::ForegroundAppUid +// -------------------------------------------------------------------------- +// +TUid CTsFswClientImpl::ForegroundAppUid( TInt aType ) + { + return iClient.ForegroundAppUid( aType ); + } + +// -------------------------------------------------------------------------- +// CTsFswClientImpl::RunL +// -------------------------------------------------------------------------- +// +void CTsFswClientImpl::RunL() + { + TSLOG_CONTEXT( RunL, TSLOG_LOCAL ); + TSLOG1_IN( "%d", iStatus.Int() ); + + if ( iStatus == KErrNone && iObserver ) + { + iClient.Subscribe( iStatus ); + SetActive(); + iObserver->HandleFswContentChanged(); + } + + TSLOG_OUT(); + } + +// -------------------------------------------------------------------------- +// CTsFswClientImpl::DoCancel +// -------------------------------------------------------------------------- +// +void CTsFswClientImpl::DoCancel() + { + iClient.CancelSubscribe(); + } + + +// end of file