diff -r 7fdc9a71d314 -r 8ad140f3dd41 hti/HtiCommPlugins/HtiIPCommPlugin/src/HtiIPCommServerClient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hti/HtiCommPlugins/HtiIPCommPlugin/src/HtiIPCommServerClient.cpp Wed Oct 13 16:17:58 2010 +0300 @@ -0,0 +1,181 @@ +/* +* Copyright (c) 2009 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: Implementation of the client side interface to HtiIPCommServer +* +*/ + + +// INCLUDE FILES +#include +#include + +#include "HtiIPCommServerCommon.h" +#include "HtiIPCommServerClient.h" + +// CONSTANTS +const TUint KIPCommServerDefaultMessageSlots = 4; // Read, write, readCancel, writeCancel + +//--------------------------------------------------------------------------- +static TInt StartServer() + { + const TUidType serverUid( KNullUid, KNullUid, KIPCommServerUid3 ); + + RProcess server; + TInt r = server.Create( KIPCommServerName, KNullDesC, serverUid); + if ( r != KErrNone ) + return r; + + TRequestStatus stat; + server.Rendezvous( stat ); + if ( stat != KRequestPending ) + server.Kill(0); // abort startup + else + server.Resume(); // logon OK - start the server + + User::WaitForRequest( stat ); //wait for start or death + + // we can't use the 'exit reason' if the server panicked as this + // is the panic 'reason' and may be '0' which cannot be distinguished + // from KErrNone + r = ( server.ExitType() == EExitPanic ) ? KErrGeneral : stat.Int(); + server.Close(); + return r; + } + +//--------------------------------------------------------------------------- +EXPORT_C RHtiIPCommServer::RHtiIPCommServer() + { + } + +//--------------------------------------------------------------------------- +EXPORT_C TInt RHtiIPCommServer::Connect() + { + HTI_LOG_TEXT( "RHtiIPCommServer::Connect" ); + + // Connect to the server, attempting to start it if necessary + TInt retry=2; + for (;;) + { + TInt r = CreateSession( KIPCommServerName, + Version(), + KIPCommServerDefaultMessageSlots ); + HTI_LOG_FORMAT( "CreateSession %d", r ); + if ( r != KErrNotFound && r != KErrServerTerminated ) + return r; + + if (--retry==0) + return r; + + r = StartServer(); + HTI_LOG_FORMAT( "StartServer %d", r ); + if ( r != KErrNone && r != KErrAlreadyExists ) + return r; + } + } + +//--------------------------------------------------------------------------- +EXPORT_C void RHtiIPCommServer::Close() + { + HTI_LOG_FUNC_IN( "RHtiIPCommServer::Close" ); + + // Use thread finder to find the server thread + TFullName threadName; + TFullName matchPattern; + matchPattern.Append( _L( "*" ) ); + matchPattern.Append( KIPCommServerName ); + matchPattern.Append( _L( "*" ) ); + + TFindThread threadFinder; + threadFinder.Find( matchPattern ); + TInt err = threadFinder.Next( threadName ); + if ( err ) + { + HTI_LOG_FORMAT( "RHtiIPCommServer::Close: Failed to find server thread: %d", err ); + return; + } + + HTI_LOG_TEXT( "RHtiIPCommServer::Close: Found server thread:" ); + HTI_LOG_DES( threadName ); + + RThread thread; + err = thread.Open( threadName ); + if ( err ) + { + HTI_LOG_FORMAT( "RHtiIPCommServer::Close: Failed to open server thread: %d", err ); + } + else + { + // Close this session. Causes a call to ~CHtiIPCommServerSession which should + // stop the active scheduler in IPCommServer + RSessionBase::Close(); + + // For clean server stop, wait for its death + HTI_LOG_TEXT( "RHtiIPCommServer::Close: Waiting for server thread to die..." ); + TRequestStatus status; + thread.Logon( status ); + User::WaitForRequest( status ); + HTI_LOG_TEXT( "RHtiIPCommServer::Close: Server thread dead." ); + } + + thread.Close(); + HTI_LOG_FUNC_OUT( "RHtiIPCommServer::Close" ); + } + +//--------------------------------------------------------------------------- +EXPORT_C TVersion RHtiIPCommServer::Version(void) const + { + return ( TVersion( KIPCommServerMajorVersionNumber, + KIPCommServerMinorVersionNumber, + KIPCommServerBuildVersionNumber ) ); + + } + +//--------------------------------------------------------------------------- +EXPORT_C TInt RHtiIPCommServer::GetSendBufferSize() const + { + return KIPCommServerSendBufferMaxSize; + } + +//--------------------------------------------------------------------------- +EXPORT_C TInt RHtiIPCommServer::GetReceiveBufferSize() const + { + return KIPCommServerReceiveBufferMaxSize; + } + +//--------------------------------------------------------------------------- +EXPORT_C void RHtiIPCommServer::Receive(TDes8& aData, + TRequestStatus& aStatus) + { + SendReceive( EIPCommServerRecv, TIpcArgs( &aData ), aStatus ); + } + +//--------------------------------------------------------------------------- +EXPORT_C void RHtiIPCommServer::Send(const TDesC8& aData, + TRequestStatus& aStatus) + { + SendReceive( EIPCommServerSend, TIpcArgs( &aData ), aStatus ); + } + +//--------------------------------------------------------------------------- +EXPORT_C void RHtiIPCommServer::CancelReceive() + { + SendReceive( EIPCommServerCancelRecv, TIpcArgs( NULL ) ); + } + +//--------------------------------------------------------------------------- +EXPORT_C void RHtiIPCommServer::CancelSend() + { + SendReceive( EIPCommServerCancelSend, TIpcArgs( NULL ) ); + } +// End of the file