diff -r 000000000000 -r 2e3d3ce01487 contextframework/cfw/src/cfclient/CFClientSession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contextframework/cfw/src/cfclient/CFClientSession.cpp Tue Feb 02 10:12:00 2010 +0200 @@ -0,0 +1,192 @@ +/* +* Copyright (c) 2002-2007 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: RCFClientSession class implementation. +* +*/ + + +#include "CFClientSession.h" + +#include +#include +#include +#include +#include +#include + +#include "cfcontextsubscriptionlistener.h" +#include "CFContextSubscriptionImpl.h" +#include "CFActionSubscriptionImpl.h" +#include "CFContextQueryImpl.h" +#include "cfcommon.h" +#include "CFContextObjectImpl.h" +#include "cftrace.h" +#include "ContextFrameworkPrivateCRKeys.h" + +// CONSTANTS + +//Fix for BHLS-7UPEA8 +static const TUint KDefaultMessageSlots = 5; +static const TInt KCreateSessionRetryCount = 10; +static const TInt KCreateSessionDelay = 100000; // 0.1 seconds + +RCFClientSession::RCFClientSession() + { + FUNC_LOG; + } + +// METHODS + +//---------------------------------------------------------------------------- +// RCFClientSession::ConnectL +//---------------------------------------------------------------------------- +// +void RCFClientSession::ConnectL() + { + FUNC_LOG; + + TInt err = KErrNone; + +#ifdef CFW_SERVER_START_THROUGH_CLIENT + err = StartServer(); + ERROR_1( err, "CF server start failed with code: %d", err ); + User::LeaveIfError( err ); +#endif + + RThread client; + CleanupClosePushL( client ); + INFO_1( "Client [%x] session connecting to Context FW...", + client.SecureId().iId ); + TInt retry = 0; + do + { + err = CreateSession( KContextServerName, + Version(), + KDefaultMessageSlots ); + retry++; + + ERROR_2( err, "CF server session creation failed with code: %d. Retry count: %d", err, retry ); + if( err != KErrNone && retry < KCreateSessionRetryCount ) + { + // Wait for a while so that CFW server is started + User::After( KCreateSessionDelay ); + } + } + while( err != KErrNone && retry < KCreateSessionRetryCount ); + + ERROR_1( err, "CF server session creation failed with code: %d", err ); + User::LeaveIfError( err ); + + INFO_1( "Client [%x] session connecting to Context FW... OK", + client.SecureId().iId ); + CleanupStack::PopAndDestroy( &client ); + } + +//---------------------------------------------------------------------------- +// RCFClientSession::Version +//---------------------------------------------------------------------------- +// +TVersion RCFClientSession::Version() const + { + FUNC_LOG; + + return( TVersion( KContextServMajorVersionNumber, + KContextServMinorVersionNumber, + KContextServBuildVersionNumber ) ); + } + +//---------------------------------------------------------------------------- +// RCFClientSession::SendSync +//---------------------------------------------------------------------------- +// +TInt RCFClientSession::SendSync( TInt aFunction ) const + { + FUNC_LOG; + + INFO_1( "SendSync: OpCode [%d]", aFunction ); + + return SendReceive( aFunction ); + } + +//---------------------------------------------------------------------------- +// RCFClientSession::SendSync +//---------------------------------------------------------------------------- +// +TInt RCFClientSession::SendSync( TInt aFunction, const TIpcArgs& aArgs ) const + { + FUNC_LOG; + + INFO_1( "SendSync: OpCode [%d]", aFunction ); + + return SendReceive( aFunction, aArgs ); + } + +//---------------------------------------------------------------------------- +// RCFClientSession::SendAsync +//---------------------------------------------------------------------------- +// +void RCFClientSession::SendAsync( TInt aFunction, + const TIpcArgs& aArgs, + TRequestStatus& aStatus ) const + { + FUNC_LOG; + + INFO_1( "SendAsync: OpCode [%d]", aFunction ); + + SendReceive( aFunction, aArgs, aStatus ); + } + +//---------------------------------------------------------------------------- +// RCFClientSession::StartServer +//---------------------------------------------------------------------------- +// +TInt RCFClientSession::StartServer() + { + FUNC_LOG; + + TInt result; + TFindServer findContextServer( KContextServerName ); + TFullName name; + result = findContextServer.Next( name ); + if( result == KErrNone ) + { + // Server already running + INFO( "CF server already running" ); + return KErrNone; + } + + // Create process for server and start the process + RProcess server; + result = server.Create( KContextServerName, KNullDesC ); + if( result != KErrNone ) + { + return result; + } + INFO_1( "CF server process created with code: %d", result ); + + TRequestStatus status; + server.Rendezvous( status ); + server.Resume(); + + // Wait for rendesvouz + User::WaitForRequest( status ); + INFO_1( "CF server rendezvous: %d", status.Int() ); + + // Close process handle since it is not needed anymore + server.Close(); + + return status.Int(); + } + +// End of file