taskswitcher/contextengine/hgfswserver/server/src/hgfswserver.cpp
changeset 4 4d54b72983ae
parent 3 fb3763350a08
child 5 c743ef5928ba
equal deleted inserted replaced
3:fb3763350a08 4:4d54b72983ae
     1 /*
       
     2  * ===========================================================================
       
     3  *  Name        : hgfswserver.cpp
       
     4  *  Part of     : Huriganes / Fast Swap Server
       
     5  *  Description : server implementation
       
     6  *  Version     : %version: sa1spcx1#14 %
       
     7  *
       
     8  *  Copyright © 2008 Nokia Corporation.
       
     9  *  This material, including documentation and any related 
       
    10  *  computer programs, is protected by copyright controlled by 
       
    11  *  Nokia Corporation. All rights are reserved. Copying, 
       
    12  *  including reproducing, storing, adapting or translating, any 
       
    13  *  or all of this material requires the prior written consent of 
       
    14  *  Nokia Corporation. This material also contains confidential 
       
    15  *  information which may not be disclosed to others without the 
       
    16  *  prior written consent of Nokia Corporation.
       
    17  * ===========================================================================
       
    18  */
       
    19 
       
    20 #include "hgfswserver.h"
       
    21 #include "hgfswsession.h"
       
    22 #include "hgfswappui.h"
       
    23 #include "hgfswengine.h"
       
    24 
       
    25 #include <s32mem.h>
       
    26 #include <eikenv.h>
       
    27 #include <apgwgnam.h>
       
    28 
       
    29 // --------------------------------------------------------------------------
       
    30 // CHgFswServer::CHgFswServer
       
    31 // --------------------------------------------------------------------------
       
    32 //
       
    33 CHgFswServer::CHgFswServer( TInt aPriority, CHgFswAppUi& aAppUi )
       
    34         : CServer2( aPriority ), iAppUi( aAppUi )
       
    35     {
       
    36     }
       
    37 
       
    38 // --------------------------------------------------------------------------
       
    39 // CHgFswServer::NewLC
       
    40 // --------------------------------------------------------------------------
       
    41 //
       
    42 CHgFswServer* CHgFswServer::NewLC( CHgFswAppUi& aAppUi )
       
    43     {
       
    44     CHgFswServer* self = new ( ELeave ) CHgFswServer(
       
    45         EPriorityNormal, aAppUi );
       
    46     CleanupStack::PushL( self );
       
    47     self->ConstructL();
       
    48     return self;
       
    49     }
       
    50 
       
    51 // --------------------------------------------------------------------------
       
    52 // CHgFswServer::ConstructL
       
    53 // --------------------------------------------------------------------------
       
    54 //
       
    55 void CHgFswServer::ConstructL()
       
    56     {
       
    57     StartL( KHgFswServerName );
       
    58     iEngine = CHgFswEngine::NewL( *this );
       
    59     iAppUi.SetTaskListObserver( *iEngine );
       
    60     iAppUi.SetResourceObserver( *iEngine );
       
    61     }
       
    62 
       
    63 // --------------------------------------------------------------------------
       
    64 // CHgFswServer::~CHgFswServer
       
    65 // --------------------------------------------------------------------------
       
    66 //
       
    67 CHgFswServer::~CHgFswServer()
       
    68     {
       
    69     delete iBuffer;
       
    70     delete iEngine;
       
    71     }
       
    72 
       
    73 // --------------------------------------------------------------------------
       
    74 // CHgFswServer::NewSessionL
       
    75 // --------------------------------------------------------------------------
       
    76 //
       
    77 CSession2* CHgFswServer::NewSessionL( const TVersion&,
       
    78         const RMessage2& ) const
       
    79     {
       
    80     return new ( ELeave ) CHgFswSession;
       
    81     }
       
    82 
       
    83 // --------------------------------------------------------------------------
       
    84 // CHgFswServer::AddSession
       
    85 // --------------------------------------------------------------------------
       
    86 //
       
    87 void CHgFswServer::AddSession()
       
    88     {
       
    89     ++iSessionCount;
       
    90     }
       
    91 
       
    92 // --------------------------------------------------------------------------
       
    93 // CHgFswServer::DropSession
       
    94 // --------------------------------------------------------------------------
       
    95 //
       
    96 void CHgFswServer::DropSession()
       
    97     {
       
    98     --iSessionCount;
       
    99     }
       
   100 
       
   101 // --------------------------------------------------------------------------
       
   102 // CHgFswServer::SerializeAndGetBufferSizeL
       
   103 // --------------------------------------------------------------------------
       
   104 //
       
   105 void CHgFswServer::SerializeAndGetBufferSizeL( const RMessage2& aMessage )
       
   106     {
       
   107     const TInt KBufferExpandSize = 128;
       
   108     const RHgFswArray& array( iEngine->FswDataL() );
       
   109     delete iBuffer; iBuffer = NULL;
       
   110     iBuffer = CBufFlat::NewL( KBufferExpandSize );
       
   111     RBufWriteStream ws;
       
   112     CleanupClosePushL( ws );
       
   113     ws.Open( *iBuffer );
       
   114     CHgFswEntry::ExternalizeArrayL( ws, array );
       
   115     CleanupStack::PopAndDestroy( &ws );
       
   116     TPtr8 p( iBuffer->Ptr( 0 ) );
       
   117     TPckg<TInt> size( p.Length() );
       
   118     aMessage.WriteL( 0, size );
       
   119     aMessage.Complete( KErrNone );
       
   120     }
       
   121 
       
   122 // --------------------------------------------------------------------------
       
   123 // CHgFswServer::GetBufferL
       
   124 // --------------------------------------------------------------------------
       
   125 //
       
   126 void CHgFswServer::GetBufferL( const RMessage2& aMessage )
       
   127     {
       
   128     if ( !iBuffer )
       
   129         {
       
   130         User::Leave( KErrGeneral );
       
   131         }
       
   132     TPtr8 p( iBuffer->Ptr( 0 ) );
       
   133     // If the size expected by the client does not match indicate it with a leave
       
   134     // so the client can recognize it by checking the return value of SendReceive
       
   135     // and can request the buffer size again.
       
   136     if ( p.Length() != aMessage.Int1() )
       
   137         {
       
   138         User::Leave( KErrArgument );
       
   139         }
       
   140     aMessage.WriteL( 0, p );
       
   141     aMessage.Complete( KErrNone );
       
   142     }
       
   143 
       
   144 // --------------------------------------------------------------------------
       
   145 // CHgFswServer::CloseAppL
       
   146 // --------------------------------------------------------------------------
       
   147 //
       
   148 void CHgFswServer::CloseAppL( TInt aWgId )
       
   149     {
       
   150     iEngine->CloseAppL( aWgId );
       
   151     }
       
   152 
       
   153 // --------------------------------------------------------------------------
       
   154 // CHgFswServer::SwitchToAppL
       
   155 // --------------------------------------------------------------------------
       
   156 //
       
   157 void CHgFswServer::SwitchToAppL( TInt aWgId )
       
   158     {
       
   159     iEngine->SwitchToAppL( aWgId );
       
   160     }
       
   161 
       
   162 // --------------------------------------------------------------------------
       
   163 // CHgFswServer::ForegroundAppUidL
       
   164 // --------------------------------------------------------------------------
       
   165 //
       
   166 void CHgFswServer::ForegroundAppUidL( const RMessage2& aMessage )
       
   167     {
       
   168     TUid uid = iEngine->ForegroundAppUidL( aMessage.Int1() );
       
   169     TPckg<TInt> uidPckg( uid.iUid );
       
   170     aMessage.WriteL( 0, uidPckg );
       
   171     }
       
   172 
       
   173 // --------------------------------------------------------------------------
       
   174 // CHgFswServer::FswDataChanged
       
   175 // callback from engine
       
   176 // --------------------------------------------------------------------------
       
   177 //
       
   178 void CHgFswServer::FswDataChanged()
       
   179     {
       
   180     // notify all sessions about the change
       
   181     iSessionIter.SetToFirst();
       
   182     while ( CHgFswSession* session = static_cast<CHgFswSession*>( iSessionIter++ ) )
       
   183         {
       
   184         if ( session->IsListening() )
       
   185             {
       
   186             session->FswDataChanged();
       
   187             }
       
   188         }
       
   189     }
       
   190 
       
   191 // --------------------------------------------------------------------------
       
   192 // CHgFswServer::FswDataListenersCount
       
   193 // callback from engine
       
   194 // --------------------------------------------------------------------------
       
   195 //
       
   196 TInt CHgFswServer::FswDataListenerCount()
       
   197     {
       
   198     TInt n = 0;
       
   199     iSessionIter.SetToFirst();
       
   200     while ( CHgFswSession* session = static_cast<CHgFswSession*>( iSessionIter++ ) )
       
   201         {
       
   202         if ( session->IsListening() )
       
   203             {
       
   204             ++n;
       
   205             }
       
   206         }
       
   207     return n;
       
   208     }
       
   209 
       
   210 // --------------------------------------------------------------------------
       
   211 // RunServerL
       
   212 // --------------------------------------------------------------------------
       
   213 //
       
   214 static void RunServerL( CHgFswAppUi& aAppUi, CEikonEnv& aEnv )
       
   215     {
       
   216     // change thread name
       
   217     User::LeaveIfError( RThread::RenameMe( KHgFswServerName ) );
       
   218 
       
   219     // set app as hidden
       
   220     CApaWindowGroupName* wgName =
       
   221         CApaWindowGroupName::NewL( aEnv.WsSession(),
       
   222             aEnv.RootWin().Identifier() );
       
   223     wgName->SetHidden( ETrue );
       
   224     wgName->SetWindowGroupName( aEnv.RootWin() );
       
   225     delete wgName;
       
   226 
       
   227     // start server
       
   228     CHgFswServer* server = CHgFswServer::NewLC( aAppUi );
       
   229     RProcess::Rendezvous( KErrNone );
       
   230     CActiveScheduler::Start();
       
   231     CleanupStack::PopAndDestroy( server );
       
   232     }
       
   233 
       
   234 // --------------------------------------------------------------------------
       
   235 // E32Main
       
   236 // --------------------------------------------------------------------------
       
   237 //
       
   238 TInt E32Main()
       
   239     {
       
   240     __UHEAP_MARK;
       
   241     CTrapCleanup* cleanup = CTrapCleanup::New();
       
   242     TInt err = KErrNoMemory;
       
   243     if ( cleanup )
       
   244         {
       
   245         CEikonEnv* env = new CEikonEnv;
       
   246         if ( env )
       
   247             {
       
   248             TRAP( err, env->ConstructL() );
       
   249             if ( err == KErrNone )
       
   250                 {
       
   251                 env->DisableExitChecks( ETrue );
       
   252                 CHgFswAppUi* ui = new CHgFswAppUi;
       
   253                 if ( ui )
       
   254                     {
       
   255                     TRAP( err, ui->ConstructL() );
       
   256                     if ( err == KErrNone )
       
   257                         {
       
   258                         // hide from tasklist and prevent from coming foreground
       
   259                         env->RootWin().SetOrdinalPosition( 0,
       
   260                             ECoeWinPriorityNeverAtFront );
       
   261                         // set as system app so will not be closed when memory is low
       
   262                         env->SetSystem( ETrue );
       
   263                         
       
   264                         RFbsSession::Connect();
       
   265                         
       
   266                         TRAP( err, RunServerL( *ui, *env ) );
       
   267                         
       
   268                         RFbsSession::Disconnect();
       
   269                         
       
   270                         ui->PrepareToExit();
       
   271                         }
       
   272                     }
       
   273                 }
       
   274             env->DestroyEnvironment();
       
   275             }
       
   276         delete cleanup;
       
   277         }
       
   278     __UHEAP_MARKEND;
       
   279     return err;
       
   280     }
       
   281 
       
   282 
       
   283 // end of file