connectivitylayer/usbphonetlink/usbpnclient_dll/src/rusbpnclient.cpp
changeset 0 63b37f68c1ce
child 5 8ccc39f9d787
--- /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