diff -r 5315654608de -r 08c6ee43b396 taskswitcher/contextengine/hgfswserver/server/src/hgfswserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/taskswitcher/contextengine/hgfswserver/server/src/hgfswserver.cpp Mon Jan 18 20:10:36 2010 +0200 @@ -0,0 +1,283 @@ +/* + * =========================================================================== + * Name : hgfswserver.cpp + * Part of : Huriganes / Fast Swap Server + * Description : server implementation + * Version : %version: sa1spcx1#14 % + * + * Copyright © 2008 Nokia Corporation. + * This material, including documentation and any related + * computer programs, is protected by copyright controlled by + * Nokia Corporation. All rights are reserved. Copying, + * including reproducing, storing, adapting or translating, any + * or all of this material requires the prior written consent of + * Nokia Corporation. This material also contains confidential + * information which may not be disclosed to others without the + * prior written consent of Nokia Corporation. + * =========================================================================== + */ + +#include "hgfswserver.h" +#include "hgfswsession.h" +#include "hgfswappui.h" +#include "hgfswengine.h" + +#include +#include +#include + +// -------------------------------------------------------------------------- +// CHgFswServer::CHgFswServer +// -------------------------------------------------------------------------- +// +CHgFswServer::CHgFswServer( TInt aPriority, CHgFswAppUi& aAppUi ) + : CServer2( aPriority ), iAppUi( aAppUi ) + { + } + +// -------------------------------------------------------------------------- +// CHgFswServer::NewLC +// -------------------------------------------------------------------------- +// +CHgFswServer* CHgFswServer::NewLC( CHgFswAppUi& aAppUi ) + { + CHgFswServer* self = new ( ELeave ) CHgFswServer( + EPriorityNormal, aAppUi ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// -------------------------------------------------------------------------- +// CHgFswServer::ConstructL +// -------------------------------------------------------------------------- +// +void CHgFswServer::ConstructL() + { + StartL( KHgFswServerName ); + iEngine = CHgFswEngine::NewL( *this ); + iAppUi.SetTaskListObserver( *iEngine ); + iAppUi.SetResourceObserver( *iEngine ); + } + +// -------------------------------------------------------------------------- +// CHgFswServer::~CHgFswServer +// -------------------------------------------------------------------------- +// +CHgFswServer::~CHgFswServer() + { + delete iBuffer; + delete iEngine; + } + +// -------------------------------------------------------------------------- +// CHgFswServer::NewSessionL +// -------------------------------------------------------------------------- +// +CSession2* CHgFswServer::NewSessionL( const TVersion&, + const RMessage2& ) const + { + return new ( ELeave ) CHgFswSession; + } + +// -------------------------------------------------------------------------- +// CHgFswServer::AddSession +// -------------------------------------------------------------------------- +// +void CHgFswServer::AddSession() + { + ++iSessionCount; + } + +// -------------------------------------------------------------------------- +// CHgFswServer::DropSession +// -------------------------------------------------------------------------- +// +void CHgFswServer::DropSession() + { + --iSessionCount; + } + +// -------------------------------------------------------------------------- +// CHgFswServer::SerializeAndGetBufferSizeL +// -------------------------------------------------------------------------- +// +void CHgFswServer::SerializeAndGetBufferSizeL( const RMessage2& aMessage ) + { + const TInt KBufferExpandSize = 128; + const RHgFswArray& array( iEngine->FswDataL() ); + delete iBuffer; iBuffer = NULL; + iBuffer = CBufFlat::NewL( KBufferExpandSize ); + RBufWriteStream ws; + CleanupClosePushL( ws ); + ws.Open( *iBuffer ); + CHgFswEntry::ExternalizeArrayL( ws, array ); + CleanupStack::PopAndDestroy( &ws ); + TPtr8 p( iBuffer->Ptr( 0 ) ); + TPckg size( p.Length() ); + aMessage.WriteL( 0, size ); + aMessage.Complete( KErrNone ); + } + +// -------------------------------------------------------------------------- +// CHgFswServer::GetBufferL +// -------------------------------------------------------------------------- +// +void CHgFswServer::GetBufferL( const RMessage2& aMessage ) + { + if ( !iBuffer ) + { + User::Leave( KErrGeneral ); + } + TPtr8 p( iBuffer->Ptr( 0 ) ); + // If the size expected by the client does not match indicate it with a leave + // so the client can recognize it by checking the return value of SendReceive + // and can request the buffer size again. + if ( p.Length() != aMessage.Int1() ) + { + User::Leave( KErrArgument ); + } + aMessage.WriteL( 0, p ); + aMessage.Complete( KErrNone ); + } + +// -------------------------------------------------------------------------- +// CHgFswServer::CloseAppL +// -------------------------------------------------------------------------- +// +void CHgFswServer::CloseAppL( TInt aWgId ) + { + iEngine->CloseAppL( aWgId ); + } + +// -------------------------------------------------------------------------- +// CHgFswServer::SwitchToAppL +// -------------------------------------------------------------------------- +// +void CHgFswServer::SwitchToAppL( TInt aWgId ) + { + iEngine->SwitchToAppL( aWgId ); + } + +// -------------------------------------------------------------------------- +// CHgFswServer::ForegroundAppUidL +// -------------------------------------------------------------------------- +// +void CHgFswServer::ForegroundAppUidL( const RMessage2& aMessage ) + { + TUid uid = iEngine->ForegroundAppUidL( aMessage.Int1() ); + TPckg uidPckg( uid.iUid ); + aMessage.WriteL( 0, uidPckg ); + } + +// -------------------------------------------------------------------------- +// CHgFswServer::FswDataChanged +// callback from engine +// -------------------------------------------------------------------------- +// +void CHgFswServer::FswDataChanged() + { + // notify all sessions about the change + iSessionIter.SetToFirst(); + while ( CHgFswSession* session = static_cast( iSessionIter++ ) ) + { + if ( session->IsListening() ) + { + session->FswDataChanged(); + } + } + } + +// -------------------------------------------------------------------------- +// CHgFswServer::FswDataListenersCount +// callback from engine +// -------------------------------------------------------------------------- +// +TInt CHgFswServer::FswDataListenerCount() + { + TInt n = 0; + iSessionIter.SetToFirst(); + while ( CHgFswSession* session = static_cast( iSessionIter++ ) ) + { + if ( session->IsListening() ) + { + ++n; + } + } + return n; + } + +// -------------------------------------------------------------------------- +// RunServerL +// -------------------------------------------------------------------------- +// +static void RunServerL( CHgFswAppUi& aAppUi, CEikonEnv& aEnv ) + { + // change thread name + User::LeaveIfError( RThread::RenameMe( KHgFswServerName ) ); + + // set app as hidden + CApaWindowGroupName* wgName = + CApaWindowGroupName::NewL( aEnv.WsSession(), + aEnv.RootWin().Identifier() ); + wgName->SetHidden( ETrue ); + wgName->SetWindowGroupName( aEnv.RootWin() ); + delete wgName; + + // start server + CHgFswServer* server = CHgFswServer::NewLC( aAppUi ); + RProcess::Rendezvous( KErrNone ); + CActiveScheduler::Start(); + CleanupStack::PopAndDestroy( server ); + } + +// -------------------------------------------------------------------------- +// E32Main +// -------------------------------------------------------------------------- +// +TInt E32Main() + { + __UHEAP_MARK; + CTrapCleanup* cleanup = CTrapCleanup::New(); + TInt err = KErrNoMemory; + if ( cleanup ) + { + CEikonEnv* env = new CEikonEnv; + if ( env ) + { + TRAP( err, env->ConstructL() ); + if ( err == KErrNone ) + { + env->DisableExitChecks( ETrue ); + CHgFswAppUi* ui = new CHgFswAppUi; + if ( ui ) + { + TRAP( err, ui->ConstructL() ); + if ( err == KErrNone ) + { + // hide from tasklist and prevent from coming foreground + env->RootWin().SetOrdinalPosition( 0, + ECoeWinPriorityNeverAtFront ); + // set as system app so will not be closed when memory is low + env->SetSystem( ETrue ); + + RFbsSession::Connect(); + + TRAP( err, RunServerL( *ui, *env ) ); + + RFbsSession::Disconnect(); + + ui->PrepareToExit(); + } + } + } + env->DestroyEnvironment(); + } + delete cleanup; + } + __UHEAP_MARKEND; + return err; + } + + +// end of file