--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/satengine/SatServer/EventMonitors/src/csatbrowserwsmonitor.cpp Tue Feb 02 01:11:09 2010 +0200
@@ -0,0 +1,324 @@
+/*
+* Copyright (c) 2002-2008 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: Monitor for browser termination
+*
+*/
+
+
+// INCLUDE FILES
+#include <etelsat.h>
+#include <apgtask.h>
+#include <DocumentHandler.h> //KWmlcHandler
+#include "CSatBrowserThreadMonitor.h"
+#include "csatbrowserwsmonitor.h"
+#include "SatLog.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+// -----------------------------------------------------------------------------
+// CSatBrowserWSMonitor::CSatBrowserWSMonitor
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CSatBrowserWSMonitor::CSatBrowserWSMonitor() :
+ CActive( CActive::EPriorityStandard )
+ {
+ LOG( SIMPLE,
+ "SATEVENTMONITORS: CSatBrowserWSMonitor::CSatBrowserWSMonitor calling" )
+
+ CActiveScheduler::Add( this );
+
+ LOG( SIMPLE,
+ "SATEVENTMONITORS: CSatBrowserWSMonitor::CSatBrowserWSMonitor exiting" )
+ }
+
+// Destructor
+CSatBrowserWSMonitor::~CSatBrowserWSMonitor()
+ {
+ LOG( SIMPLE,
+ "SATEVENTMONITORS: CSatBrowserWSMonitor::~CSatBrowserWSMonitor calling" )
+
+ // Cancel any outstanding requests.
+ Cancel();
+
+ if ( iThreadMonitor )
+ {
+ iThreadMonitor->DoCancelMonitor();
+ delete iThreadMonitor;
+ iThreadMonitor = NULL;
+ }
+
+ iObserver = NULL;
+
+ iWg.Close();
+ iWsSession.Close();
+
+ LOG( SIMPLE,
+ "SATEVENTMONITORS: CSatBrowserWSMonitor::~CSatBrowserWSMonitor exiting" )
+ }
+
+// -----------------------------------------------------------------------------
+// CSatBrowserWSMonitor::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CSatBrowserWSMonitor* CSatBrowserWSMonitor::NewL()
+ {
+ LOG( SIMPLE,
+ "SATEVENTMONITORS: CSatBrowserWSMonitor::NewL calling" )
+
+ CSatBrowserWSMonitor* self =
+ new ( ELeave ) CSatBrowserWSMonitor();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( /*self*/ );
+
+ LOG( SIMPLE,
+ "SATEVENTMONITORS: CSatBrowserWSMonitor::NewL exiting" )
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CSatBrowserWSMonitor::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CSatBrowserWSMonitor::ConstructL()
+ {
+ LOG( SIMPLE,
+ "SATEVENTMONITORS: CSatBrowserWSMonitor::ConstructL calling" )
+ // Window session is created when event is requested
+ LOG( SIMPLE,
+ "SATEVENTMONITORS: CSatBrowserWSMonitor::ConstructL exiting" )
+ }
+
+// -----------------------------------------------------------------------------
+// CSatBrowserWSMonitor::DoCancelMonitor
+// -----------------------------------------------------------------------------
+//
+void CSatBrowserWSMonitor::DoCancelMonitor()
+ {
+ LOG( SIMPLE, "SATEVENTMONITORS: CSatBrowserWSMonitor::\
+ DoCancelMonitor calling" )
+
+ Cancel();
+
+ LOG( SIMPLE, "SATEVENTMONITORS: CSatBrowserWSMonitor::\
+ DoCancelMonitor exiting" )
+ }
+
+// -----------------------------------------------------------------------------
+// CSatBrowserWSMonitor::StartMonitor
+// -----------------------------------------------------------------------------
+//
+TInt CSatBrowserWSMonitor::StartMonitor(
+ MSatBrowserWSObserver* aObserver )
+ {
+ LOG( SIMPLE,
+ "SATEVENTMONITORS: CSatBrowserWSMonitor::StartMonitor calling" )
+ TInt err( KErrNone );
+
+ if ( !iWGCreated )
+ {
+ // First time called, create needed services
+ LOG( SIMPLE,"SATEVENTMONITORS: CSatBrowserWSMonitor::StartMonitor \
+ connect to WsSession " )
+ err = iWsSession.Connect();
+ if ( KErrNone == err )
+ {
+ // Creates a window group
+ TRAP( err, CreateWGL() );
+ }
+ }
+
+ iObserver = aObserver;
+
+ if ( !err )
+ {
+ // All fine, start monitoring
+ Start();
+ }
+
+ LOG2( SIMPLE,
+ "SATEVENTMONITORS: CSatBrowserWSMonitor::StartMonitor exiting err=%d",\
+ err )
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CSatBrowserWSMonitor::Start
+// -----------------------------------------------------------------------------
+//
+void CSatBrowserWSMonitor::Start()
+ {
+ LOG( SIMPLE, "SATEVENTMONITORS: CSatBrowserWSMonitor::Start calling" )
+
+ Cancel();
+
+ // It migth be null already
+ if ( iThreadMonitor )
+ {
+ LOG( SIMPLE,
+ "SATEVENTMONITORS: CSatBrowserWSMonitor::Start iThreadMonitor true" )
+ delete iThreadMonitor;
+ iThreadMonitor = NULL;
+ }
+
+ iWsSession.EventReady( &iStatus );
+ SetActive();
+
+ LOG( SIMPLE, "SATEVENTMONITORS: CSatBrowserWSMonitor::Start exiting" )
+ }
+
+// -----------------------------------------------------------------------------
+// CSatBrowserWSMonitor::RunL
+// Checks is the WML Browser launched and creates browser thread monitor to
+// monitor browsers thread death.
+// -----------------------------------------------------------------------------
+//
+void CSatBrowserWSMonitor::RunL()
+ {
+ LOG( SIMPLE,
+ "SATEVENTMONITORS: CSatBrowserWSMonitor::RunL calling" )
+
+ // Get the status of this object.
+ const TInt errCode( iStatus.Int() );
+ LOG2( SIMPLE,
+ "SATEVENTMONITORS: CSatBrowserWSMonitor::RunL errCode: %d",
+ errCode )
+ if ( KErrNone == errCode )
+ {
+ // UID Code for WML Browser in S60.
+ const TUid uidWmlBrowser( TUid::Uid( KWmlcHandler ) );
+ TWsEvent event;
+ iWsSession.GetEvent( event );
+ TApaTaskList taskList( iWsSession );
+
+ if ( taskList.FindApp( uidWmlBrowser ).Exists() )
+ {
+ LOG( SIMPLE,
+ "SATEVENTMONITORS: CSatBrowserWSMonitor::RunL task exists" )
+ const TApaTask task = taskList.FindApp( uidWmlBrowser );
+ const TThreadId threadID = task.ThreadId();
+ RThread thread;
+ User::LeaveIfError ( thread.Open( threadID, EOwnerProcess ) );
+
+ // Create Browser thread monitor.
+ iThreadMonitor = CSatBrowserThreadMonitor::NewL( thread );
+
+ // Call the active object to monitor for this threads death.
+ iThreadMonitor->StartMonitor( this );
+ }
+ else
+ {
+ LOG( SIMPLE,
+ "SATEVENTMONITORS: CSatBrowserWSMonitor::RunL start" )
+ // Renew the request.
+ Start();
+ }
+ }
+ else if ( KErrCancel != errCode )
+ {
+ // Renew the request.
+ Start();
+ }
+ else
+ {
+ LOG( SIMPLE,
+ "SATEVENTMONITORS: CSatBrowserWSMonitor::RunL cancelled" )
+ }
+
+ LOG( SIMPLE,
+ "SATEVENTMONITORS: CSatBrowserWSMonitor::RunL exiting" )
+ }
+
+// -----------------------------------------------------------------------------
+// CSatBrowserWSMonitor::DoCancel
+// -----------------------------------------------------------------------------
+//
+void CSatBrowserWSMonitor::DoCancel()
+ {
+ LOG( SIMPLE,
+ "SATEVENTMONITORS: CSatBrowserWSMonitor::DoCancel calling" )
+
+ if ( iThreadMonitor )
+ {
+ LOG( SIMPLE,
+ "SATEVENTMONITORS: CSatBrowserWSMonitor::DoCancel iThreadMonitor true" )
+ iThreadMonitor->DoCancelMonitor();
+ }
+
+ // Cancel the outstanding request.
+ iWsSession.EventReadyCancel();
+
+ LOG( SIMPLE,
+ "SATEVENTMONITORS: CSatBrowserWSMonitor::DoCancel exiting" )
+ }
+
+// -----------------------------------------------------------------------------
+// CSatBrowserWSMonitor::NotifyBrowserTerminated
+// Sends event download notification to SAT Engine.
+// -----------------------------------------------------------------------------
+//
+void CSatBrowserWSMonitor::NotifyBrowserTerminated(
+ const RSat::TBrowserTerminationCause aCause )
+ {
+ LOG( SIMPLE, "SATEVENTMONITORS: CSatBrowserWSMonitor::\
+ NotifyBrowserTerminated calling" )
+
+ // Notify termination to observer.
+ iObserver->NotifyBrowserTerminated( aCause );
+
+ LOG( SIMPLE, "SATEVENTMONITORS: CSatBrowserWSMonitor::\
+ NotifyBrowserTerminated exiting" )
+ }
+
+// -----------------------------------------------------------------------------
+// CSatBrowserWSMonitor::CreateWGL
+// Creates a window group and hides it form the UI.
+// -----------------------------------------------------------------------------
+//
+void CSatBrowserWSMonitor::CreateWGL()
+ {
+ LOG( SIMPLE,
+ "SATEVENTMONITORS: CSatBrowserWSMonitor::CreateWGL calling" )
+
+ // -1 means the window will never be visible.
+ const TInt KWindowGroupPriority( -1 );
+
+ RWindowGroup wg( iWsSession );
+ // Make a handle from the address of window group obj.
+ User::LeaveIfError( wg.Construct( reinterpret_cast<TUint32>( &wg ) ) );
+ // Enable group changed events.
+ User::LeaveIfError( wg.EnableGroupChangeEvents() );
+
+ // Get the ordinal pos of this window group.
+ const TInt ordPos( wg.OrdinalPosition() );
+ // Set SAT so its never shown in the UI.
+ wg.SetOrdinalPosition( ordPos , KWindowGroupPriority );
+
+ // Needs to be a member variable. Must be closed in destructor.
+ // Otherwise can't monitor what has been opened.
+ iWg = wg;
+
+ // Set SAT Server hidden now.
+ iWsSession.Flush();
+ iWGCreated = ETrue;
+ LOG( SIMPLE,
+ "SATEVENTMONITORS: CSatBrowserWSMonitor::CreateWGL exiting" )
+ }
+
+// End of file