sl@0: // Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
sl@0: // All rights reserved.
sl@0: // This component and the accompanying materials are made available
sl@0: // under the terms of "Eclipse Public License v1.0"
sl@0: // which accompanies this distribution, and is available
sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0: //
sl@0: // Initial Contributors:
sl@0: // Nokia Corporation - initial contribution.
sl@0: //
sl@0: // Contributors:
sl@0: //
sl@0: // Description:
sl@0: //
sl@0: 
sl@0: #include "mediaclientwseventobserver.h"
sl@0: #include "mediaclientvideotrace.h"
sl@0: 
sl@0: CMediaClientWsEventObserver* CMediaClientWsEventObserver::NewL(MMediaClientWsEventObserverCallback& aCallback)
sl@0:     {
sl@0:     DEBUG_PRINTF("CMediaClientWsEventObserver::NewL +++");
sl@0:     CMediaClientWsEventObserver* self = new (ELeave) CMediaClientWsEventObserver(aCallback);
sl@0:     CleanupStack::PushL(self);
sl@0:     self->ConstructL();
sl@0:     CleanupStack::Pop(self);
sl@0:     DEBUG_PRINTF("CMediaClientWsEventObserver::NewL ---");
sl@0:     return self;
sl@0:     }
sl@0: 
sl@0: CMediaClientWsEventObserver::CMediaClientWsEventObserver(MMediaClientWsEventObserverCallback& aCallback) :
sl@0: CActive(EPriorityStandard),
sl@0: iCallback(aCallback)
sl@0:     {   
sl@0:     DEBUG_PRINTF("CMediaClientWsEventObserver::CMediaClientWsEventObserver +++"); 
sl@0:     DEBUG_PRINTF("CMediaClientWsEventObserver::CMediaClientWsEventObserver ---");
sl@0:     }
sl@0: 
sl@0: void CMediaClientWsEventObserver::ConstructL()
sl@0:     {
sl@0:     DEBUG_PRINTF("CMediaClientWsEventObserver::ConstructL +++");
sl@0:     
sl@0:     DEBUG_PRINTF("CMediaClientWsEventObserver::ConstructL RWsSession Connect");
sl@0:     TInt err = iWs.Connect();
sl@0:     if (err != KErrNone)
sl@0:         {
sl@0:         DEBUG_PRINTF2("CMediaClientWsEventObserver::ConstructL Windows Server unavailable, err %d", err);
sl@0:         User::Leave(err);
sl@0:         }
sl@0:     
sl@0:     DEBUG_PRINTF("CMediaClientWsEventObserver::ConstructL RWindowGroup Create");
sl@0:     iWindowGroup = RWindowGroup(iWs);
sl@0:     User::LeaveIfError(iWindowGroup.Construct((TUint32)this, EFalse));
sl@0: 
sl@0:     // Send created window to the background and hide it from the
sl@0:     // application switcher    
sl@0:     iWindowGroup.SetOrdinalPosition( -1, -1000 ); // -1000 = ECoeWinPriorityNeverAtFront
sl@0: 
sl@0:     DEBUG_PRINTF("CMediaClientWsEventObserver::ConstructL RWindowGroup EnableFocusChangeEvents");
sl@0:     User::LeaveIfError(iWindowGroup.EnableFocusChangeEvents());
sl@0:     
sl@0:     UpdateFocusWindowGroupId(ETrue);
sl@0:     DEBUG_PRINTF3("CMediaClientWsEventObserver::ConstructL Initial WgId %d Error %d", iWgId, iWgIdError);
sl@0: 
sl@0:     CActiveScheduler::Add(this);
sl@0: 
sl@0:     // register with window server to receive focus change notifications
sl@0:     DEBUG_PRINTF("CMediaClientWsEventObserver::ConstructL iWs.EventReady()");
sl@0:     iWs.EventReady(&iStatus);
sl@0: 
sl@0:     DEBUG_PRINTF("CMediaClientWsEventObserver::ConstructL SetActive()");
sl@0:     SetActive();
sl@0:     
sl@0:     DEBUG_PRINTF("CMediaClientWsEventObserver::ConstructL ---");
sl@0:     }
sl@0: 
sl@0: CMediaClientWsEventObserver::~CMediaClientWsEventObserver()
sl@0:     {
sl@0:     DEBUG_PRINTF("CMediaClientWsEventObserver::~CMediaClientWsEventObserver +++");
sl@0: 
sl@0:     Cancel();
sl@0: 
sl@0:     iWindowGroup.Close();
sl@0:     
sl@0:     iWs.Close();
sl@0:     
sl@0:     DEBUG_PRINTF("CMediaClientWsEventObserver::~CMediaClientWsEventObserver ---");
sl@0:     }
sl@0: 
sl@0: TInt CMediaClientWsEventObserver::FocusWindowGroupId(TInt& aFocusGroupId)
sl@0:     {
sl@0:     DEBUG_PRINTF("CMediaClientWsEventObserver::FocusWindowGroupId +++");
sl@0:     aFocusGroupId = iWgId;
sl@0:     DEBUG_PRINTF3("CMediaClientWsEventObserver::FocusWindowGroupId --- WgId %d, Error %d", iWgId, iWgIdError);
sl@0:     return iWgIdError;
sl@0:     }
sl@0: 
sl@0: void CMediaClientWsEventObserver::UpdateFocusWindowGroupId(TBool aConstruction)
sl@0:     {
sl@0:     DEBUG_PRINTF2("CMediaClientWsEventObserver::UpdateFocusWindowGroupId +++, construction %d", aConstruction);
sl@0:     
sl@0:     TInt wgId = iWs.GetFocusWindowGroup();
sl@0:     DEBUG_PRINTF2("CMediaClientWsEventObserver::UpdateFocusWindowGroupId id %d ", wgId);
sl@0: 
sl@0:     // get the thread that owns windowgroup id
sl@0:     TThreadId threadId;
sl@0:     iWgIdError = iWs.GetWindowGroupClientThreadId(wgId, threadId);
sl@0:     if(iWgIdError != KErrNone)
sl@0:         {
sl@0:         DEBUG_PRINTF2("CMediaClientWsEventObserver::UpdateFocusWindowGroupId --- Get Thread Id error %d", iWgIdError);
sl@0:         return;
sl@0:         }
sl@0:     
sl@0:     RThread thread;    
sl@0:     iWgIdError = thread.Open(threadId);
sl@0:     if(iWgIdError != KErrNone)
sl@0:         {
sl@0:         DEBUG_PRINTF2("CMediaClientWsEventObserver::UpdateFocusWindowGroupId --- Open thread error %d", iWgIdError);
sl@0:         return;
sl@0:         }
sl@0:     
sl@0:     TSecureId fgThreadId = thread.SecureId();
sl@0:     thread.Close();
sl@0:     
sl@0:     if(iCallback.MmcweoIgnoreProcess(fgThreadId))
sl@0:         {
sl@0:         // If ignore returns ETrue during construction the previous value of iWgId does not contain a valid id. It is 0.
sl@0:         // This is an error case so set error flag accordingly.
sl@0:         if(aConstruction)
sl@0:             {
sl@0:             iWgIdError = KErrNotSupported;    
sl@0:             }
sl@0:         }
sl@0:     else
sl@0:         {
sl@0:         iWgId = wgId;
sl@0:         }
sl@0: 
sl@0:     DEBUG_PRINTF("CMediaClientWsEventObserver::UpdateFocusWindowGroupId --- ");
sl@0:     }
sl@0: 
sl@0: void CMediaClientWsEventObserver::RunL()
sl@0:     {
sl@0:     DEBUG_PRINTF("CMediaClientWsEventObserver::RunL +++");
sl@0: 
sl@0:     iWs.GetEvent(iEvent);    
sl@0: 
sl@0:     DEBUG_PRINTF("CMediaClientWsEventObserver::RunL EventReady()");
sl@0:     iWs.EventReady(&iStatus);
sl@0:     DEBUG_PRINTF("CMediaClientWsEventObserver::RunL SetActive()");
sl@0:     SetActive();
sl@0: 
sl@0:     DEBUG_PRINTF2("CMediaClientWsEventObserver::RunL() Ws event.Type %d", iEvent.Type());
sl@0:     if(iEvent.Type() == EEventFocusGroupChanged)
sl@0:         {
sl@0:         DEBUG_PRINTF("CMediaClientWsEventObserver::RunL Received EEventFocusGroupChanged");
sl@0:         
sl@0:         TInt prevWgId = iWgId;
sl@0:         UpdateFocusWindowGroupId(EFalse);
sl@0:         if((iWgIdError != KErrNone) || (iWgId != prevWgId))
sl@0:             {
sl@0:             iCallback.MmcweoFocusWindowGroupChanged();
sl@0:             }
sl@0:         }
sl@0:     else
sl@0:         {
sl@0:         DEBUG_PRINTF("CMediaClientWsEventObserver::RunL Event Ignored");
sl@0:         }
sl@0: 
sl@0:     DEBUG_PRINTF("CMediaClientWsEventObserver::RunL ---");
sl@0:     }
sl@0: 
sl@0: void CMediaClientWsEventObserver::DoCancel()
sl@0:     {
sl@0:     DEBUG_PRINTF("CMediaClientWsEventObserver::DoCancel +++");
sl@0:     iWs.EventReadyCancel();
sl@0:     DEBUG_PRINTF("CMediaClientWsEventObserver::DoCancel ---");
sl@0:     }