hti/HtiCommPlugins/HtiIPCommPlugin/src/HtiIPCommServerClient.cpp
branchRCL_3
changeset 59 8ad140f3dd41
--- /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