diff -r 000000000000 -r bde4ae8d615e os/mm/mmlibs/mmfw/src/Client/Video/mediaclientwseventobserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/mm/mmlibs/mmfw/src/Client/Video/mediaclientwseventobserver.cpp Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,177 @@ +// Copyright (c) 2010 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: +// + +#include "mediaclientwseventobserver.h" +#include "mediaclientvideotrace.h" + +CMediaClientWsEventObserver* CMediaClientWsEventObserver::NewL(MMediaClientWsEventObserverCallback& aCallback) + { + DEBUG_PRINTF("CMediaClientWsEventObserver::NewL +++"); + CMediaClientWsEventObserver* self = new (ELeave) CMediaClientWsEventObserver(aCallback); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + DEBUG_PRINTF("CMediaClientWsEventObserver::NewL ---"); + return self; + } + +CMediaClientWsEventObserver::CMediaClientWsEventObserver(MMediaClientWsEventObserverCallback& aCallback) : +CActive(EPriorityStandard), +iCallback(aCallback) + { + DEBUG_PRINTF("CMediaClientWsEventObserver::CMediaClientWsEventObserver +++"); + DEBUG_PRINTF("CMediaClientWsEventObserver::CMediaClientWsEventObserver ---"); + } + +void CMediaClientWsEventObserver::ConstructL() + { + DEBUG_PRINTF("CMediaClientWsEventObserver::ConstructL +++"); + + DEBUG_PRINTF("CMediaClientWsEventObserver::ConstructL RWsSession Connect"); + TInt err = iWs.Connect(); + if (err != KErrNone) + { + DEBUG_PRINTF2("CMediaClientWsEventObserver::ConstructL Windows Server unavailable, err %d", err); + User::Leave(err); + } + + DEBUG_PRINTF("CMediaClientWsEventObserver::ConstructL RWindowGroup Create"); + iWindowGroup = RWindowGroup(iWs); + User::LeaveIfError(iWindowGroup.Construct((TUint32)this, EFalse)); + + // Send created window to the background and hide it from the + // application switcher + iWindowGroup.SetOrdinalPosition( -1, -1000 ); // -1000 = ECoeWinPriorityNeverAtFront + + DEBUG_PRINTF("CMediaClientWsEventObserver::ConstructL RWindowGroup EnableFocusChangeEvents"); + User::LeaveIfError(iWindowGroup.EnableFocusChangeEvents()); + + UpdateFocusWindowGroupId(ETrue); + DEBUG_PRINTF3("CMediaClientWsEventObserver::ConstructL Initial WgId %d Error %d", iWgId, iWgIdError); + + CActiveScheduler::Add(this); + + // register with window server to receive focus change notifications + DEBUG_PRINTF("CMediaClientWsEventObserver::ConstructL iWs.EventReady()"); + iWs.EventReady(&iStatus); + + DEBUG_PRINTF("CMediaClientWsEventObserver::ConstructL SetActive()"); + SetActive(); + + DEBUG_PRINTF("CMediaClientWsEventObserver::ConstructL ---"); + } + +CMediaClientWsEventObserver::~CMediaClientWsEventObserver() + { + DEBUG_PRINTF("CMediaClientWsEventObserver::~CMediaClientWsEventObserver +++"); + + Cancel(); + + iWindowGroup.Close(); + + iWs.Close(); + + DEBUG_PRINTF("CMediaClientWsEventObserver::~CMediaClientWsEventObserver ---"); + } + +TInt CMediaClientWsEventObserver::FocusWindowGroupId(TInt& aFocusGroupId) + { + DEBUG_PRINTF("CMediaClientWsEventObserver::FocusWindowGroupId +++"); + aFocusGroupId = iWgId; + DEBUG_PRINTF3("CMediaClientWsEventObserver::FocusWindowGroupId --- WgId %d, Error %d", iWgId, iWgIdError); + return iWgIdError; + } + +void CMediaClientWsEventObserver::UpdateFocusWindowGroupId(TBool aConstruction) + { + DEBUG_PRINTF2("CMediaClientWsEventObserver::UpdateFocusWindowGroupId +++, construction %d", aConstruction); + + TInt wgId = iWs.GetFocusWindowGroup(); + DEBUG_PRINTF2("CMediaClientWsEventObserver::UpdateFocusWindowGroupId id %d ", wgId); + + // get the thread that owns windowgroup id + TThreadId threadId; + iWgIdError = iWs.GetWindowGroupClientThreadId(wgId, threadId); + if(iWgIdError != KErrNone) + { + DEBUG_PRINTF2("CMediaClientWsEventObserver::UpdateFocusWindowGroupId --- Get Thread Id error %d", iWgIdError); + return; + } + + RThread thread; + iWgIdError = thread.Open(threadId); + if(iWgIdError != KErrNone) + { + DEBUG_PRINTF2("CMediaClientWsEventObserver::UpdateFocusWindowGroupId --- Open thread error %d", iWgIdError); + return; + } + + TSecureId fgThreadId = thread.SecureId(); + thread.Close(); + + if(iCallback.MmcweoIgnoreProcess(fgThreadId)) + { + // If ignore returns ETrue during construction the previous value of iWgId does not contain a valid id. It is 0. + // This is an error case so set error flag accordingly. + if(aConstruction) + { + iWgIdError = KErrNotSupported; + } + } + else + { + iWgId = wgId; + } + + DEBUG_PRINTF("CMediaClientWsEventObserver::UpdateFocusWindowGroupId --- "); + } + +void CMediaClientWsEventObserver::RunL() + { + DEBUG_PRINTF("CMediaClientWsEventObserver::RunL +++"); + + iWs.GetEvent(iEvent); + + DEBUG_PRINTF("CMediaClientWsEventObserver::RunL EventReady()"); + iWs.EventReady(&iStatus); + DEBUG_PRINTF("CMediaClientWsEventObserver::RunL SetActive()"); + SetActive(); + + DEBUG_PRINTF2("CMediaClientWsEventObserver::RunL() Ws event.Type %d", iEvent.Type()); + if(iEvent.Type() == EEventFocusGroupChanged) + { + DEBUG_PRINTF("CMediaClientWsEventObserver::RunL Received EEventFocusGroupChanged"); + + TInt prevWgId = iWgId; + UpdateFocusWindowGroupId(EFalse); + if((iWgIdError != KErrNone) || (iWgId != prevWgId)) + { + iCallback.MmcweoFocusWindowGroupChanged(); + } + } + else + { + DEBUG_PRINTF("CMediaClientWsEventObserver::RunL Event Ignored"); + } + + DEBUG_PRINTF("CMediaClientWsEventObserver::RunL ---"); + } + +void CMediaClientWsEventObserver::DoCancel() + { + DEBUG_PRINTF("CMediaClientWsEventObserver::DoCancel +++"); + iWs.EventReadyCancel(); + DEBUG_PRINTF("CMediaClientWsEventObserver::DoCancel ---"); + }