hti/HtiCommPlugins/HtiBtCommPlugin/HtiBtCommServer/src/HtiBtCommServer.cpp
branchRCL_3
changeset 59 8ad140f3dd41
parent 0 a03f92240627
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hti/HtiCommPlugins/HtiBtCommPlugin/HtiBtCommServer/src/HtiBtCommServer.cpp	Wed Oct 13 16:17:58 2010 +0300
@@ -0,0 +1,244 @@
+/*
+* 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: This file contains the implementation of the
+*              CHtiBtCommServer class.
+*              CHtiBtCommServer handles Symbian server side operations
+*              such as server starting and client session creation.
+*
+*/
+
+
+// INCLUDE FILES
+#include "HtiBtClientServerCommon.h"
+#include "HtiBtCommServer.h"
+#include "HtiBtCommServerSession.h"
+#include "Logger.h"
+
+#include <e32base.h>
+#include <e32std.h>
+#include <e32svr.h>
+#include <e32uid.h>
+
+// CONSTANTS
+// For memory allocations
+const TUint KBtCommServerHeapSizeMin       = 0x6000;
+const TUint KBtCommServerHeapSizeMax       = 0x20000;
+const TUint KBtCommServerStackSize         = 0x8000;
+
+
+//*****************************************************************************
+//
+// Class CHtiBtCommServer
+//
+//*****************************************************************************
+
+/*---------------------------------------------------------------------------*/
+CHtiBtCommServer::CHtiBtCommServer( TInt aPriority )
+    : CServer2( aPriority, ESharableSessions )
+    {
+    LOGFW(DebugLog(_L("CHtiBtCommServer: CHtiBtCommServer()")))
+    __DECLARE_NAME(_S( "CHtiBtCommServer" ));
+    }
+
+/*---------------------------------------------------------------------------*/
+void CHtiBtCommServer::ConstructL()
+    {
+    LOGFW(DebugLog(_L("CHtiBtCommServer: ConstructL()")))
+    }
+
+/*---------------------------------------------------------------------------*/
+CHtiBtCommServer* CHtiBtCommServer::NewL()
+    {
+    LOGFW(DebugLog(_L("CHtiBtCommServer: NewL()"));)
+
+    CHtiBtCommServer *pS =
+        new (ELeave) CHtiBtCommServer( EBtCommServerPriority );
+    CleanupStack::PushL( pS );
+    __ASSERT_ALWAYS( pS != NULL, PanicServer( ESvrCreateServer ) );
+
+    pS->ConstructL();
+    CleanupStack::Pop( pS );
+    User::SetProcessCritical( User::ENotCritical );
+    User::SetCritical( User::ENotCritical );
+    LOGFW(InfoLog(_L("Server was started")))
+    return pS;
+    }
+
+/*---------------------------------------------------------------------------*/
+CHtiBtCommServer::~CHtiBtCommServer()
+    {
+    LOGFW(DebugLog(_L("CHtiBtCommServer: ~CHtiBtCommServer()")))
+    }
+
+/*---------------------------------------------------------------------------*/
+void CHtiBtCommServer::SessionFreed()
+    {
+    LOGFW(DebugLog(_L("CHtiBtCommServer: SessionFreed(): Stopping active scheduler"));)
+    iSession = NULL; // iSession is owned by server framework, not deleted here
+    CActiveScheduler::Stop();
+    LOGFW(DebugLog(_L("CHtiBtCommServer: SessionFreed(): Done"));)
+    }
+
+/*---------------------------------------------------------------------------*/
+void CHtiBtCommServer::SessionCreated( CHtiBtCommServerSession* aSession )
+    {
+    LOGFW(DebugLog(_L("CHtiBtCommServer: SessionCreated()"));)
+    iSession = aSession;
+    }
+
+/*---------------------------------------------------------------------------*/
+CSession2* CHtiBtCommServer::NewSessionL( const TVersion &aVersion,
+    const RMessage2& aMessage ) const
+    {
+    LOGFW(DebugLog(_L("CHtiBtCommServer: NewSessionL() - IPC V2"));)
+    aMessage.IsNull();
+    if ( iSession )
+        User::Leave( KErrAlreadyExists ); // Allow only one session
+
+    // Check that server is the right version
+    TVersion ver( KBtCommServerMajorVersionNumber,
+                  KBtCommServerMinorVersionNumber,
+                  KBtCommServerBuildVersionNumber );
+    if ( !User::QueryVersionSupported( ver, aVersion ) )
+        {
+        User::Leave( KErrNotSupported );
+        }
+    return CHtiBtCommServerSession::NewL( (CHtiBtCommServer*)this );
+    }
+
+/*---------------------------------------------------------------------------*/
+GLDEF_C TInt CHtiBtCommServer::ThreadFunction( TAny* anArg )
+    {
+    LOGFW(_L("CHtiBtCommServer: ThreadFunction(): Starting"));
+
+    __UHEAP_MARK;
+
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+
+    // Convert argument into semaphore reference
+    RSemaphore& semaphore = *(RSemaphore*)anArg;
+
+    // Start scheduler...
+    LOGFW(DebugLog(_L("CHtiBtCommServer: ThreadFunction(): Installing active scheduler"));)
+    CActiveScheduler *pA = new CActiveScheduler;
+    __ASSERT_ALWAYS( pA != NULL, PanicServer( EMainSchedulerError ) );
+    CActiveScheduler::Install( pA );
+
+    CHtiBtCommServer* pS = NULL;
+    TRAPD(err,
+        // ...and server
+        LOGFW(DebugLog(_L("CHtiBtCommServer: ThreadFunction(): Creating server instance"));)
+        pS = CHtiBtCommServer::NewL();
+        )
+
+    if ( err != KErrNone )
+        {
+        LOGFW(DebugLog(_L("CHtiBtCommServer: ThreadFunction(): Failed creating server instance"));)
+        }
+
+    LOGFW(DebugLog(_L("CHtiBtCommServer: ThreadFunction(): Starting server"));)
+    __ASSERT_ALWAYS( pS->Start(KBtCommServerName) == KErrNone,
+        PanicServer( ESvrStartServer ) ); // Make first request pending,
+
+    // Signal that server has started
+    LOGFW(DebugLog(_L("CHtiBtCommServer: ThreadFunction(): Signalling client: server is up and running"));)
+    semaphore.Signal();
+
+    LOGFW(DebugLog(_L("CHtiBtCommServer: ThreadFunction(): Waiting for server's death"));)
+    // Start receiving requests from clients
+    CActiveScheduler::Start();
+    LOGFW(DebugLog(_L("CHtiBtCommServer: ThreadFunction(): Server was stopped"));)
+    LOGFW(InfoLog(_L("Server was stopped")))
+    delete pS;
+    LOGFW(DebugLog(_L("CHtiBtCommServer: ThreadFunction(): Server was deleted"));)
+
+    // Finished
+    delete pA;
+    pA = NULL;
+
+     // Destroy clean-up stack
+    delete cleanup;
+    cleanup = NULL;
+
+    __UHEAP_MARKEND;
+    return KErrNone;
+    }
+
+/*---------------------------------------------------------------------------*/
+GLDEF_C void PanicServer( TBtCommServerPanic aPanic )
+    {
+    LOGFW(DebugLog(_L("CHtiBtCommServer: PanicServer()"));)
+    _LIT( KTxtServerPanic, "BtCommServer panic" );
+    User::Panic( KTxtServerPanic, aPanic );
+    }
+
+/*---------------------------------------------------------------------------*/
+EXPORT_C TInt StartThread()
+    {
+//    LOGFW(_L("CHtiBtCommServer: StartThread()"));
+    TInt res = KErrNone;
+
+    // Create server - if one of this name does not already exist
+    TFindServer findBtCommServer( KBtCommServerName );
+    TFullName name;
+    if ( findBtCommServer.Next( name ) != KErrNone ) // Server doesn't exist
+        {
+         // Create a semaphore to know when thread initialization has finished
+        RSemaphore semaphore;
+        semaphore.CreateLocal(0);
+
+//        LOGFW(_L("CHtiBtCommServer: Created Semaphore...\n"));
+
+        // Create new server thread and thread's main function
+        RThread thread;
+        res = thread.Create( KBtCommServerName,
+                             CHtiBtCommServer::ThreadFunction,
+                             KBtCommServerStackSize,
+                             KBtCommServerHeapSizeMin,
+                             KBtCommServerHeapSizeMax,
+                             &semaphore );
+
+
+        if ( res == KErrNone ) // Thread created ok - now start it going
+            {
+//            LOGFW(_L("CHtiBtCommServer: StartThread() - Create OK"));
+
+            thread.SetPriority( EPriorityNormal );
+//            TRequestStatus stat1;
+//            thread.Logon(stat1);
+
+            thread.Resume();  // Start it going
+
+            semaphore.Wait(); // Wait until it's initialized
+
+            thread.Close();   // No longer interest in the other thread
+            }
+        else // Thread not created ok
+            {
+            // No further interest in it
+//            LOGFW(_L("CHtiBtCommServer: StartThread() - Create FAIL"));
+            thread.Close();
+            }
+        semaphore.Close();
+        }
+    return res;
+    }
+
+/*---------------------------------------------------------------------------*/
+GLDEF_C TInt E32Main()
+    {
+    return KErrNone;
+    }
+
+// End of the file