diff -r 000000000000 -r d6fe6244b863 htiui/HtiCommPlugins/HtiBtCommPlugin/HtiBtCommServer/src/HtiBtCommServer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/htiui/HtiCommPlugins/HtiBtCommPlugin/HtiBtCommServer/src/HtiBtCommServer.cpp Tue Feb 02 00:17:27 2010 +0200 @@ -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 +#include +#include +#include + +// 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