--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mmlibs/mmfw/src/Client/Video/mediaclientwseventobserver.cpp Thu Oct 07 22:34:12 2010 +0100
@@ -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 ---");
+ }