photosgallery/viewframework/tvout/src/glxtv.cpp
changeset 0 4e91876724a2
child 4 57d388cc48c1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/photosgallery/viewframework/tvout/src/glxtv.cpp	Thu Dec 17 08:45:44 2009 +0200
@@ -0,0 +1,476 @@
+/*
+* Copyright (c) 2008-2009 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:    Handles & propogates UI state change notifications.
+*
+*/
+
+
+
+/**
+ * @internal reviewed 24/08/2007 by D Holland
+ */
+
+// Class header
+#include "glxtv.h"
+
+// External includes
+#include <w32std.h>                     // for TWsVisibilityChangedEvent
+
+//  INTERNAL INCLUDES
+#include <glxlog.h>                     // for debug logging 
+#include <glxtracer.h>                  // for debug logging
+#include <glxpanic.h>                   // for Gallery panic codes
+#include <glxtvconstants.h>             // for ETvConnectionChanged, TV heights
+#include <centralrepository.h>          // for CRepository
+#ifdef __MARM
+#include <GSServerEngine.h>
+#endif
+
+// GLXTVOUT INCLUDES
+#include "mglxtvobserver.h"             // for MGlxTvObserver
+#include "glxwindowvisibilitymonitor.h" // for CGlxWindowVisibilityMonitor
+#include "glxtvconnectionmonitor.h"     // for CGlxTvConnectionMonitor
+
+const TUid KCRUidTvoutSettings = {0x1020730B};
+
+using namespace glxTvOut;
+
+/**
+*  CGlxTvOutCenRepMonitor
+*  CGlxTv conainted class for observing changes in central 
+*					 repository TV aspect Ratio value
+* @author Loughlin Spollen
+*/
+NONSHARABLE_CLASS( CGlxTv::CGlxTvOutCenRepMonitor )
+	                      : public CActive
+	{
+	public:  // Constructors and destructor
+	    /**
+	    * Symbian Constructor.
+	    * @param The TV Observer
+	    * @param The central repository
+	    * @return constructed object
+	    */
+	    static CGlxTvOutCenRepMonitor* NewL(MGlxTvObserver& aTvObserver,
+	                                    CRepository& aRepository);
+
+	    /**
+	    * Destructor.
+	    */
+	    ~CGlxTvOutCenRepMonitor();
+	    
+	private: 
+	    /**
+	    * C++ constructor.
+	    * @param The TV Observer
+	    * @param The central repository
+	    * @return constructed object
+	    */
+	    CGlxTvOutCenRepMonitor(MGlxTvObserver& aTvObserver,
+	                            CRepository& aRepository);
+	    /**
+	    * 2nd phase constructor
+	    */
+	    void ConstructL();
+	    
+	protected: // from CActive
+	    /**
+	    * @ref CActive::RunL
+	    */
+	    void RunL();
+
+	    /**
+	    * @ref CActive::DoCancel
+	    */
+	    void DoCancel();
+	    
+	    /**
+	    * @ref CActive::RunError
+	    */
+	    TInt RunError(TInt aError);
+
+	private:
+	    
+	    // Not Owned: the Glx TV observer
+	    MGlxTvObserver& iTvObserver;
+	     
+		// Not Owned: the central repository API
+	    CRepository& iRepository;       
+	    
+	    TUint iSettingsTVAspectRatio;
+	    // the central repository identifier
+	    TUid iRepositoryUid;
+	}; 
+
+
+
+
+// -----------------------------------------------------------------------------
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+CGlxTv::CGlxTvOutCenRepMonitor* CGlxTv::CGlxTvOutCenRepMonitor::NewL
+										        ( MGlxTvObserver& aTvObserver,
+	                                                CRepository& aRepository )
+    {
+    TRACER("CGlxTv::CGlxTvOutCenRepMonitor::NewL()");
+			    
+    CGlxTvOutCenRepMonitor* self 
+                = new(ELeave) CGlxTvOutCenRepMonitor( aTvObserver, aRepository );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+
+
+// -----------------------------------------------------------------------------
+// C++ constructor.
+// -----------------------------------------------------------------------------
+inline CGlxTv::CGlxTvOutCenRepMonitor::CGlxTvOutCenRepMonitor
+                                                ( MGlxTvObserver& aTvObserver,
+	                                              CRepository& aRepository )
+                    				 : CActive( EPriorityStandard ),
+                    				   iTvObserver ( aTvObserver ),
+                 				       iRepository( aRepository )
+    {
+    TRACER("CGlxTv::CGlxTvOutCenRepMonitor::CGlxTvOutCenRepMonitor()");
+    }
+
+
+
+// ----------------------------------------------------------------------------
+// Symbian 2nd phase constructor 
+// ----------------------------------------------------------------------------
+void CGlxTv::CGlxTvOutCenRepMonitor::ConstructL()
+    {
+	TRACER("CGlxTv::CGlxTvOutCenRepMonitor::ConstructL");
+    CActiveScheduler::Add( this );
+#ifdef __MARM
+    CGSServerEngine* aGSServerEngine= CGSServerEngine::NewLC();
+    iSettingsTVAspectRatio = aGSServerEngine->AspectRatioL();
+    CleanupStack::Pop(aGSServerEngine);
+#else
+    iSettingsTVAspectRatio = 0;
+#endif
+	// Commenting out code for request notification as these doesnt work fine,
+	// would be soon updated with latest api's to support aspectration chnages.
+    // Request notification when the user changes cenrep values
+//    TInt err = iRepository.NotifyRequest( iSettingsTVAspectRatio, iStatus );
+//    if (!(KErrNone ==err ||KErrAlreadyExists  ==err))
+//        {
+//        RDebug::Printf("## Error code in CGlxTv::CGlxTvOutCenRepMonitor::ConstructL() is %d",err);
+//        User::Leave(err);
+//        }
+    
+//    SetActive();
+    }
+
+    
+
+// ----------------------------------------------------------------------------
+// Destructor
+// ----------------------------------------------------------------------------
+CGlxTv::CGlxTvOutCenRepMonitor::~CGlxTvOutCenRepMonitor()
+    {
+    TRACER("CGlxTv::~CGlxTvOutCenRepMonitor()");
+    Cancel();
+    }
+
+
+
+// ----------------------------------------------------------------------------
+// CGlxTvOutCenRepMonitor::RunL
+// From class CActive.
+// ----------------------------------------------------------------------------
+void CGlxTv::CGlxTvOutCenRepMonitor::RunL()
+    {
+    TRACER("CGlxTv::CGlxTvOutCenRepMonitor::RunL");
+    // Check for errors
+    User::LeaveIfError( iStatus.Int() );
+    GLX_LOG_INFO("CGlxTvOutCenRepMonitor - RunL completed with Err Code"); 
+    User::LeaveIfError( iRepository.NotifyRequest( iSettingsTVAspectRatio, iStatus ) );
+    if (!IsActive())
+        {
+        SetActive();
+        iTvObserver.HandleTvStatusChangedL( ETvConnectionChanged );
+        }
+    }
+
+
+
+// ----------------------------------------------------------------------------
+// CGlxTvOutCenRepMonitor::DoCancel
+// From class CActive.
+// ----------------------------------------------------------------------------
+void CGlxTv::CGlxTvOutCenRepMonitor::DoCancel()
+    {
+    TRACER("CGlxTv::CGlxTvOutCenRepMonitor::DoCancel()");
+    iRepository.NotifyCancel( iSettingsTVAspectRatio );  
+    }
+
+
+
+//-----------------------------------------------------------------------------
+// CGlxTvOutCenRepMonitor::RunError
+// From class CActive.
+//-----------------------------------------------------------------------------
+//
+TInt CGlxTv::CGlxTvOutCenRepMonitor::RunError( TInt /*aError*/ )
+    {
+    TRACER("CGlxTv::CGlxTvOutCenRepMonitor::RunError()");
+    return KErrNone;
+    }
+    
+
+//-----------------------------------------------------------------------------
+// Return new object
+//-----------------------------------------------------------------------------
+//
+EXPORT_C CGlxTv* CGlxTv::NewL( MGlxTvObserver& aTvObserver ) 
+    {
+    TRACER("CGlxTv::NewL()");
+    CGlxTv* self = new (ELeave) CGlxTv( aTvObserver );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+    
+    
+    
+
+//-----------------------------------------------------------------------------
+// Destructor
+//-----------------------------------------------------------------------------
+//
+EXPORT_C CGlxTv::~CGlxTv()
+    {
+    TRACER("CGlxTv::~CGlxTv()");
+    StopMonitoringEnvironment();
+    delete iTvConnectionMonitor;
+    }
+
+
+
+
+//-----------------------------------------------------------------------------
+// Default C++ constructor
+//-----------------------------------------------------------------------------
+//
+CGlxTv::CGlxTv( MGlxTvObserver& aTvObserver ) : iTvObserver( aTvObserver ),
+                                                iAspectRatio( KErrUnknown )
+    {
+    TRACER("CGlxTv::CGlxTv()");
+    }
+
+
+
+
+//-----------------------------------------------------------------------------
+// Symbian second phase constructor
+//-----------------------------------------------------------------------------
+//
+void CGlxTv::ConstructL()
+    {
+    TRACER("CGlxTv::ConstructL()");
+    // Don't create the visibility monitor until the TV Out cable is connected
+
+    // Owned: The TV connection monitor
+    iTvConnectionMonitor = CGlxTvConnectionMonitor::NewL( *this );
+
+    if ( iTvConnectionMonitor->IsConnected() )
+        {
+        // Start monitoring the environment for changes
+        MonitorEnvironmentL();
+
+        // Calculate the TV Out screen buffer size
+        CalcTvScreenSzL();
+        }
+    }
+
+
+
+
+//-----------------------------------------------------------------------------
+// returns the TV screen size 
+//-----------------------------------------------------------------------------
+//
+EXPORT_C TSize CGlxTv::ScreenSizeL() const
+    {
+    TRACER("CGlxTv::ScreenSizeL()");
+    return iSzInPixels;
+    }
+
+
+
+
+//-----------------------------------------------------------------------------
+// Is the TV Connected
+//-----------------------------------------------------------------------------
+//
+EXPORT_C TBool CGlxTv::IsConnected() const
+    {
+    TRACER("CGlxTv::IsConnected()");
+    return iTvConnectionMonitor->IsConnected();
+    }
+    
+    
+    
+//-----------------------------------------------------------------------------
+// Is the TV widescreen
+//-----------------------------------------------------------------------------
+//
+EXPORT_C TBool CGlxTv::IsWidescreen() const
+    {
+    TRACER("CGlxTv::IsWidescreen()");
+    return iAspectRatio == KGlxTvAspectWide;
+    }
+    
+    
+//-----------------------------------------------------------------------------
+// From class MGlxWindowVisibilityObserver.
+// Called when window becomes fully visible or not visible.
+//-----------------------------------------------------------------------------
+//
+void CGlxTv::HandleWindowVisibilityChangedL( TTvChangeType aChangeType )
+    {
+    TRACER("CGlxTv::HandleWindowVisibilityChangedL()");
+    iTvObserver.HandleTvStatusChangedL( aChangeType );
+    }
+    
+    
+    
+//-----------------------------------------------------------------------------
+// From class MGlxTvConnectionObserver.
+// Called when TV connection state changes
+//-----------------------------------------------------------------------------
+//
+void CGlxTv::HandleTvConnectionStatusChangedL( )
+    {
+    TRACER("CGlxTv::HandleTvConnectionStatusChangedL()");
+
+    if ( iTvConnectionMonitor->IsConnected() )
+        {
+        // Start monitoring the environment for changes
+        MonitorEnvironmentL();
+        // Calculate the TV Out screen buffer
+        CalcTvScreenSzL();
+        }
+    else
+        {
+        StopMonitoringEnvironment();
+        }
+    iTvObserver.HandleTvStatusChangedL( ETvConnectionChanged );
+    }
+    
+        
+   
+//-----------------------------------------------------------------------------
+// Retrieve the TV display aspect ratio
+//-----------------------------------------------------------------------------
+//
+void CGlxTv::CalcTvScreenSzL()
+    {
+    TRACER("CGlxTv::CalcTvScreenSzL()");
+
+    // Retrieve the aspect ratio and the settings info from CenRep        
+    iAspectRatio  = KErrNotFound;
+   
+#ifdef __MARM
+    CGSServerEngine* aGSServerEngine = CGSServerEngine::NewLC();
+    iAspectRatio = aGSServerEngine->AspectRatioL();
+    CleanupStack::Pop(aGSServerEngine);
+	User::LeaveIfError( iAspectRatio );
+#else
+	iAspectRatio = 0;
+#endif
+    // note: Constants are defined in the GSServerEngine.cpp and not exported
+    // they are defined locally in glxtvconstants.h
+    switch( iAspectRatio )
+        {
+        case KGlxTvAspectWide:
+            {
+            iSzInPixels = TSize ( KGlxTvOutWidthWide, KGlxTvOutHeightWide) ;
+            break;
+            }
+        case KGlxTvAspectNormal:
+            {
+            iSzInPixels = TSize ( KGlxTvOutWidth, KGlxTvOutHeight );
+            break;
+            }
+        default:
+            {
+            User::Leave(KErrUnknown);
+            }
+        }
+	}
+    
+
+//-----------------------------------------------------------------------------
+// From class MonitorEnvironmentL.
+// Called when TV connection state changes to connected
+//-----------------------------------------------------------------------------
+//
+void CGlxTv::MonitorEnvironmentL()
+    {
+    TRACER("CGlxTv::MonitorEnvironmentL()");
+  
+    // Instantiate the central repository
+    if (!iCenRep)
+        {
+        // The Uid is hardcoded here as the hrh file giving us the Uid has been depricated and 
+        // moved to a private folder
+        iCenRep = CRepository::NewL( KCRUidTvoutSettings );
+        }
+    
+    // Monitor changes to the aspect ratio in the central repository
+    if (!iTvDisplayAspectRatioMonitor)    
+        {
+        iTvDisplayAspectRatioMonitor 
+                    = CGlxTvOutCenRepMonitor::NewL( iTvObserver, *iCenRep );
+        }
+    
+    // create window visibility monitoring object
+    if ( !iWindowVisibilityMonitor )
+        {
+        iWindowVisibilityMonitor = 
+                                CGlxWindowVisibilityMonitor::NewL( *this );
+        }
+    }
+
+    
+//-----------------------------------------------------------------------------
+// StopMonitoringEnvironment().
+// Called when TV connection state changes to disconnected
+//-----------------------------------------------------------------------------
+//
+void CGlxTv::StopMonitoringEnvironment()
+    {
+    TRACER("CGlxTv::StopMonitoringEnvironment()");
+    delete iTvDisplayAspectRatioMonitor; // destroy before iCenRep - must cancel 
+    iTvDisplayAspectRatioMonitor = NULL; // outstanding requests
+    if (iWindowVisibilityMonitor)
+        {
+        iWindowVisibilityMonitor->Close();
+        }
+    delete iWindowVisibilityMonitor;
+    iWindowVisibilityMonitor = NULL;
+    delete iCenRep;
+    iCenRep = NULL;
+    }
+
+    
+// End of file