--- /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 <e32uid.h>
+#include <HtiLogging.h>
+
+#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