tvout/src/glxtv.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 19 Mar 2010 09:28:59 +0200
changeset 23 74c9f037fd5d
child 24 99ad1390cd33
permissions -rw-r--r--
Revision: 201007 Kit: 201011

/*
* 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 analog TV Connected
//-----------------------------------------------------------------------------
//
EXPORT_C TBool CGlxTv::IsConnected() const
    {
    TRACER("CGlxTv::IsConnected()");
    return iTvConnectionMonitor->IsConnected();
    }
    
    
//-----------------------------------------------------------------------------
// Is the HDMI TV Connected
//-----------------------------------------------------------------------------
//
EXPORT_C TBool CGlxTv::IsHDMIConnected() const
    {
    TRACER("CGlxTv::IsHDMIConnected()");
    return iTvConnectionMonitor->IsHDMIConnected();
    }
    
//-----------------------------------------------------------------------------
// 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