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: }