locationcentre/lcservice/src/lcclientsession.cpp
changeset 0 522cd55cc3d7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/locationcentre/lcservice/src/lcclientsession.cpp	Tue Feb 02 00:16:03 2010 +0200
@@ -0,0 +1,177 @@
+/*
+* Copyright (c) 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:  Client side session to the Location Centre server.
+*
+*/
+
+
+// SYSTEM INCLUDES
+
+// USER INCLUDES
+#include "lcclientsession.h"
+
+// CONSTANT DEFINTIONS
+const TInt KNumofConnectAttempts = 200;
+
+// ----- Member funtions for RLcClientSession ---------------------------------
+
+// ---------------------------------------------------------------------------
+// RLcClientSession::RLcClientSession
+// ---------------------------------------------------------------------------
+//
+RLcClientSession::RLcClientSession()
+    {
+    // C++ Default constructor. No allocations or functions which can Leave
+    // should be called from here.
+    }
+         
+// ---------------------------------------------------------------------------
+// RLcClientSession::~RLcClientSession
+// ---------------------------------------------------------------------------
+//
+RLcClientSession::~RLcClientSession()
+    {
+    // C++ Destructor. Free all resources associated with this class.
+    }
+
+// ---------------------------------------------------------------------------
+// RLcClientSession::~RLcClientSession
+// ---------------------------------------------------------------------------
+//
+TInt RLcClientSession::CreateSession()
+    {
+    TInt error = KErrNone;
+    
+    // Attempt KNumofConnectAttempts to make a connection to the server
+    for ( TInt i = 0; i <= KNumofConnectAttempts; i++ )
+    	{
+    	error = RSessionBase::CreateSession( 
+    	                            KLocationCentreServerName, 
+    	                            TVersion( KLcServerMajorVersionNumber,
+                                              KLcServerMinorVersionNumber,
+                                              KLcServerBuildVersionNumber ),
+                                    8);
+    	if ( error != KErrNotFound && error != KErrServerTerminated )
+    		{
+    		// If the Create session returns an error code other than
+    		// KErrNotFound or KErrServerTerminated, then the request
+    		// is terminated immediately with the error code.
+    		// If it is any of these error codes then the server is
+    		// not running. In this case, try to start the server
+    		return error;
+    		}
+
+    	error = StartServer();
+    	if ( error != KErrAlreadyExists && error != KErrNone)
+    		{
+            // Server returned error code other than KErrAlreadyExists
+            // or KErrNone. The request is terminated with this
+            // error code.
+            // If the error code is one of these then the server is
+            // up and running. Now try to establish the connection.
+    		return error;
+    		}
+    	}
+    return error; 
+    }
+
+// ---------------------------------------------------------------------------
+// RLcClientSession::~RLcClientSession
+// ---------------------------------------------------------------------------
+//    
+void RLcClientSession::Close()
+    {
+    RHandleBase::Close();
+    }
+
+// ---------------------------------------------------------------------------
+// RLcClientSession::SendReceive
+// ---------------------------------------------------------------------------
+//    
+void RLcClientSession::SendReceive(       TLcServerMsgType    aMsgType, 
+                                    const TIpcArgs&           aArgs,
+                                          TRequestStatus&     aStatus ) const
+    {
+    return RSessionBase::SendReceive( aMsgType,
+                                      aArgs,
+                                      aStatus );    
+    }
+    
+// ---------------------------------------------------------------------------
+// RLcClientSession::SendReceive
+// ---------------------------------------------------------------------------
+//    
+TInt RLcClientSession::SendReceive(       TLcServerMsgType    aMsgType, 
+                                    const TIpcArgs&           aArgs ) const
+    {
+    return RSessionBase::SendReceive( aMsgType,
+                                      aArgs );
+    }
+
+// ---------------------------------------------------------------------------
+// RLcClientSession::SendReceive
+// ---------------------------------------------------------------------------
+//    
+void RLcClientSession::SendReceive( TLcServerMsgType    aMsgType,
+                                    TRequestStatus&     aStatus ) const
+    {
+    return RSessionBase::SendReceive( aMsgType, aStatus );    
+    }
+    
+// ---------------------------------------------------------------------------
+// RLcClientSession::SendReceive
+// ---------------------------------------------------------------------------
+//    
+TInt RLcClientSession::SendReceive( TLcServerMsgType    aMsgType ) const
+    {
+    return RSessionBase::SendReceive( aMsgType );
+    }
+    
+// ---------------------------------------------------------------------------
+// RLcClientSession::StartServer
+// ---------------------------------------------------------------------------
+//    
+TInt RLcClientSession::StartServer()
+    {
+    // Create a new server process.
+    // If the server is already running then the function fails with
+    // KErrAlreadyExists
+    RProcess server;
+    TInt error = server.Create( KLocationCentreServerExe,
+                                KNullDesC );
+    if ( !error )
+        {
+        TRequestStatus died;
+        server.Rendezvous( died );
+        if ( died != KRequestPending )
+            {
+            // Logon failed - Server is not yet running, so cannot have terminated
+            User::WaitForRequest( died );           // Eat signal
+            server.Kill( 0 );                       // Abort startup
+            }
+        else
+            {
+            server.Resume();
+            User::WaitForRequest( died );           // 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
+        error = ( server.ExitType() == EExitPanic ) ? KErrGeneral : died.Int();
+        server.Close();
+        }
+    return error;      
+    }                                                                                                              
+// End of File