taskswitcher/contextengine/hgfswserver/server/src/hgfswserver.cpp
changeset 2 08c6ee43b396
--- /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 <s32mem.h>
+#include <eikenv.h>
+#include <apgwgnam.h>
+
+// --------------------------------------------------------------------------
+// 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<TInt> 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<TInt> 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<CHgFswSession*>( iSessionIter++ ) )
+        {
+        if ( session->IsListening() )
+            {
+            session->FswDataChanged();
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CHgFswServer::FswDataListenersCount
+// callback from engine
+// --------------------------------------------------------------------------
+//
+TInt CHgFswServer::FswDataListenerCount()
+    {
+    TInt n = 0;
+    iSessionIter.SetToFirst();
+    while ( CHgFswSession* session = static_cast<CHgFswSession*>( 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