--- /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