diff -r 000000000000 -r 63b37f68c1ce connectivitylayer/usbphonetlink/usbpnclient_dll/src/rusbpnclient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitylayer/usbphonetlink/usbpnclient_dll/src/rusbpnclient.cpp Fri Nov 06 17:28:23 2009 +0000 @@ -0,0 +1,205 @@ +/* +* 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 the License "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: +* +*/ + +// INCLUDE FILES +#include "rusbpnclient.h" +#include "cusbpnserver.h" +#include "usbpndefinitions.h" +#include "usbpntrace.h" + +#include "osttracedefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "rusbpnclientTraces.h" +#endif + + +// EXTERNAL DATA STRUCTURES +// EXTERNAL FUNCTION PROTOTYPES +// CONSTANTS +// MACROS +// LOCAL CONSTANTS AND MACROS +// MODULE DATA STRUCTURES +// LOCAL FUNCTION PROTOTYPES +// FORWARD DECLARATIONS + +// ============================= LOCAL FUNCTIONS =============================== +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// RUsbPnClient::RUsbPnClient +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +EXPORT_C RUsbPnClient::RUsbPnClient() + :RSessionBase() + { + } + +// ----------------------------------------------------------------------------- +// RUsbPnClient::ConnectL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void RUsbPnClient::ConnectL() + { + OstTrace0( TRACE_API, RUSBPNCLIENT_CONNECTL_ENTRY, "RUsbPnClient::ConnectL" ); + A_TRACE( ( _T( "RUsbPnClient::ConnectL()" ) ) ); + + TInt err( KErrNone ); + + // Create USB Phonet Link Server session + err = CreateSession( KUsbPnServerName, TVersion(1,0,0)); + + if ( err == KErrNotFound ) + { + // Session not created + + // Find lock semaphore for server process creation + TFindSemaphore lock( KUsbPnServerName ); + TFullName semaphoreName; + err = lock.Next( semaphoreName ); + + if ( err == KErrNotFound ) + { + // Lock is not enabled + OstTrace0( TRACE_DETAILED, RUSBPNCLIENT_CONNECTL, "RUsbPnClient::ConnectL() - semaphore not found, start server" ); + E_TRACE( ( _L( "RUsbPnClient::ConnectL() - semaphore not found, start server" ) ) ); + + RSemaphore startLock; + + // Create lock + User::LeaveIfError( startLock.CreateGlobal( KUsbPnServerName, 0, EOwnerProcess ) ); + + + /********************************************/ + /* Start the USB Phonet Link process process */ + TRequestStatus status; + RProcess server; + + User::LeaveIfError( server.Create( KUsbPnServerName, TPtrC( NULL, 0), + EOwnerThread ) ); + + server.Rendezvous( status ); + + if( status != KRequestPending ) + { + server.Kill(0); // Abort startup + } + else + { + server.Resume(); // Logon OK -> start the server + } + + OstTrace0( TRACE_DETAILED, RUSBPNCLIENT_CONNECTL_DUP1, "RUsbPnClient::ConnectL() - waiting server response" ); + E_TRACE( ( _T( "RUsbPnClient::ConnectL() - waiting server response" ) ) ); + User::WaitForRequest( status ); // 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 + TInt err = status.Int(); + if (err == KErrNone && (server.ExitType() == EExitPanic || server.ExitType() == EExitKill)) + { + err = KErrServerTerminated; + } + + server.Close(); + + if( err ) + { + OstTrace1( TRACE_DETAILED, RUSBPNCLIENT_CONNECTL_DUP2, "RUsbPnClient::ConnectL() - waiting server response status; err=%d", err ); + E_TRACE( ( _T( "RUsbPnClient::ConnectL() - waiting server response status: %d" ), err ) ); + TRACE_ASSERT_ALWAYS; + User::LeaveIfError( err ); + } + /* End of starting process */ + /********************************************/ + + OstTrace0( TRACE_DETAILED, RUSBPNCLIENT_CONNECTL_DUP3, "RUsbPnClient::ConnectL() - server is started, signal other clients" ); + E_TRACE( ( _L( "RUsbPnClient::ConnectL() - server is started, signal other clients" ) ) ); + // Signal other clients + startLock.Signal( KMaxTInt ); + + // Close semaphore + startLock.Close(); + } + else + { + // Lock is enabled + + RSemaphore startLock; + + // Open lock semaphore + User::LeaveIfError( startLock.Open( lock ) ); + + OstTrace0( TRACE_DETAILED, RUSBPNCLIENT_CONNECTL_DUP4, "RUsbPnClient::ConnectL() - server is starting, wait for signal" ); + E_TRACE( ( _L( "RUsbPnClient::ConnectL() - server is starting, wait for signal" ) ) ); + // Wait for signal + startLock.Wait(); + OstTrace0( TRACE_DETAILED, RUSBPNCLIENT_CONNECTL_DUP5, "RUsbPnClient::ConnectL() - signal received" ); + E_TRACE( ( _L( "RUsbPnClient::ConnectL() - signal received" ) ) ); + + // Close semaphore + startLock.Close(); + + } + + // Create USB Phonet Link server session + OstTrace0( TRACE_DETAILED, RUSBPNCLIENT_CONNECTL_DUP6, "RUsbPnClient::ConnectL() - Create session" ); + E_TRACE( ( _L( "RUsbPnClient::ConnectL() - Create session" ) ) ); + + User::LeaveIfError( CreateSession( KUsbPnServerName, TVersion(1,0,0) ) ); + + OstTrace0( TRACE_DETAILED, RUSBPNCLIENT_CONNECTL_DUP7, "RUsbPnClient::ConnectL() - session created" ); + E_TRACE( ( _L( "RUsbPnClient::ConnectL() - session created" ) ) ); + } + else if ( err ) + { + // Session not created, reason unknown + TRACE_ASSERT_ALWAYS; + User::Leave( err ); + } + else + { + OstTrace0( TRACE_DETAILED, RUSBPNCLIENT_CONNECTL_DUP8, "RUsbPnClient::ConnectL() - session created" ); + E_TRACE( ( _T( "RUsbPnClient::ConnectL() - session created" ) ) ); + } + OstTrace0( TRACE_API, RUSBPNCLIENT_CONNECTL_EXIT, "RUsbPnClient::ConnectL() - return void" ); + A_TRACE( ( _T( "RUsbPnClient::ConnectL() - return void" ) ) ); + } + +//----------------------------------------------------------------------------- +// RPtp::DestroyPtpStatck() +// Destroy PTP stack +//----------------------------------------------------------------------------- +// +EXPORT_C void RUsbPnClient::Detach() + { + OstTrace0( TRACE_API, RUSBPNCLIENT_DETACH_ENTRY, "RUsbPnClient::Detach" ); + A_TRACE( ( _T( "RUsbPnClient::Disconnect()" ) ) ); + SendReceive( EPnDetach ); + // close the session + RSessionBase::Close(); + OstTrace0( TRACE_API, RUSBPNCLIENT_DETACH_EXIT, "RUsbPnClient::Detach - return void" ); + A_TRACE( ( _T( "RUsbPnClient::Disconnect() - return void" ) ) ); + } + + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// End of File