tactilefeedback/tactilefeedbackclient/src/touchfeedbackadaptation.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 09 Jun 2010 10:00:50 +0300
branchRCL_3
changeset 21 f35d4b6d212e
parent 0 d54f32e146dd
permissions -rw-r--r--
Revision: 201021 Kit: 2010123

/*
* Copyright (c) 2007 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:  This class is an adaptation class that is instantiated
*                by the application framework, and that instantiates the
*                actual Tactile Feedback Client implementation.
* Part of:      Tactile Feedback.
*
*/

#include <e32std.h>
#include <eikenv.h>
#include <coecntrl.h>

#include <tactilefeedbacktrace.h>
#include <touchfeedbackadaptation.h>

#include "touchfeedbackclient.h"
#include "touchfeedbackimpl.h"

// ======== MEMBER FUNCTIONS ========

// ---------------------------------------------------------------------------
// Constructor.
// ---------------------------------------------------------------------------
//
CTouchFeedbackAdaptation::CTouchFeedbackAdaptation()
    {
    }

// ---------------------------------------------------------------------------
// 2nd phase constructor.
// ---------------------------------------------------------------------------
//
void CTouchFeedbackAdaptation::ConstructL()
    {
    TRACE("CTouchFeedbackAdaptation::ConstructL - Begin");

    iTouchFeedback = CTouchFeedbackImpl::New();    

    TRACE("CTouchFeedbackAdaptation::ConstructL - End");
    }


// ---------------------------------------------------------------------------
// We store ourselves to the thread local storage here. The instance is 
// accessible to clients via Instance -function.
// ---------------------------------------------------------------------------
//
EXPORT_C CTouchFeedbackAdaptation* CTouchFeedbackAdaptation::NewL()
    {
    CTouchFeedbackAdaptation* self = new( ELeave ) CTouchFeedbackAdaptation;
    CleanupStack::PushL( self );
    self->ConstructL();

    // Store ourselves to thread local storage
    User::LeaveIfError( Dll::SetTls( self ) );        

    CleanupStack::Pop( self );    
    return self;
    }

// ---------------------------------------------------------------------------
// Destructor.
// ---------------------------------------------------------------------------
//
CTouchFeedbackAdaptation::~CTouchFeedbackAdaptation()
    {
    delete iTouchFeedback;
    Dll::SetTls( NULL );
    }

// ---------------------------------------------------------------------------
// Retrieve instance from thread local storage
// ---------------------------------------------------------------------------
//
MTouchFeedback* CTouchFeedbackAdaptation::GetInstance()
    {
    TAny* selfPtr = Dll::Tls();

    CTouchFeedbackAdaptation* self = 
        static_cast<CTouchFeedbackAdaptation*>( selfPtr );
    
    if ( self )
        {
        return self->iTouchFeedback;
        }
    else
        {
        return NULL;
        }
    }

// ---------------------------------------------------------------------------
// Create new instance and return it to caller
//
// We must have check for the case where client calls this even though
// instance exists already (in this case we only return the existing 
// instance).
// ---------------------------------------------------------------------------
//
MTouchFeedback* CTouchFeedbackAdaptation::CreateInstanceL()
    {   
    // Use current instance if it exists
    MTouchFeedback* feedback = GetInstance();

    // If current instance does not exist, then create a new one
    if ( !feedback )
        {
        CTouchFeedbackAdaptation* tmp = NewL();
        
        feedback = tmp->GetInstance();
        }
        
    return feedback;
    }

// ---------------------------------------------------------------------------
// Destroy ourselves if we are found at thread local storage (tls)
//
// Notice that tls content does not need to be zeroed because that is already
// done in the destructor.
// ---------------------------------------------------------------------------
//
void CTouchFeedbackAdaptation::DestroyInstance()
    {
    TAny* selfPtr = Dll::Tls();

    CTouchFeedbackAdaptation* self = 
        static_cast<CTouchFeedbackAdaptation*>( selfPtr );
    
    if ( self )
        {
        delete self;
        }        
    }    
    
// ---------------------------------------------------------------------------
// Empty implementation, as this function is no longer in use.
// (Control visibility changes now handled in HandleControlStateChange)
// ---------------------------------------------------------------------------
//
EXPORT_C void CTouchFeedbackAdaptation::ControlVisibilityChanged( 
    const CCoeControl* /*aControl*/ )
    {
    }

// ---------------------------------------------------------------------------
// Nothing to do here, just pass the information to implementation.
// ---------------------------------------------------------------------------
//
EXPORT_C void CTouchFeedbackAdaptation::LayoutChanged( )
    {
    if ( iTouchFeedback )
        {
        iTouchFeedback->LayoutChanged();
        }
    }
    
// ---------------------------------------------------------------------------
// From class MObjectProvider.
// We have to implement this because it is pure virtual in base class.
// Return Null as we are not actually part of object provider hierarchy.
// ---------------------------------------------------------------------------
TTypeUid::Ptr CTouchFeedbackAdaptation::MopSupplyObject( TTypeUid /*aId*/ )
    {
    return TTypeUid::Null();
    }
        
// ---------------------------------------------------------------------------
// From class MCoeControlStateObserver.
// Here we just pass the information about control state change ahead to
// actual feedback implementation.
// ---------------------------------------------------------------------------
TInt CTouchFeedbackAdaptation::HandleControlStateChange( 
    CCoeControl* aControl,
    TCoeState /*aState*/ )
    {
    if ( iTouchFeedback )
        {
        iTouchFeedback->ControlVisibilityChanged( aControl );
        }
        
    return KErrNone;
    }