diff -r 000000000000 -r d54f32e146dd tactilefeedback/tactilefeedbackclient/src/touchfeedbackregistry.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tactilefeedback/tactilefeedbackclient/src/touchfeedbackregistry.cpp Thu Dec 17 08:53:38 2009 +0200 @@ -0,0 +1,294 @@ +/* +* Copyright (c) 2007-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: Local area registry management in client's process. +* Part of: Tactile Feedback. +* +*/ + +#include + +#include "touchfeedbackregistry.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Constructor. +// --------------------------------------------------------------------------- +// +CTouchFeedbackRegistry::CTouchFeedbackRegistry( TUint aWindowHandle ): + iWindowHandle( aWindowHandle ) + { + } + +// --------------------------------------------------------------------------- +// 2-phased constructor. +// --------------------------------------------------------------------------- +// +CTouchFeedbackRegistry* CTouchFeedbackRegistry::NewL( + TUint aWindowHandle ) + { + CTouchFeedbackRegistry* self = + new( ELeave ) CTouchFeedbackRegistry ( aWindowHandle ); + + // ConstructL not needed on the moment + // --> Just return created instance right away + return self; + } + +// --------------------------------------------------------------------------- +// Destructor. +// --------------------------------------------------------------------------- +// +CTouchFeedbackRegistry::~CTouchFeedbackRegistry() + { + iAreaArray.Close(); + } + +// --------------------------------------------------------------------------- +// +// #1 If area exists already, then update it +// #2 Otherwise add it to the beginning of registry +// +// --------------------------------------------------------------------------- +// +void CTouchFeedbackRegistry::AddFeedbackAreaL( + TRect aRect, + TTouchLogicalFeedback aFeedbackTypeDown, + TTouchFeedbackType aFeedbackDown, + TTouchLogicalFeedback aFeedbackTypeUp, + TTouchFeedbackType aFeedbackUp, + TTouchEventType aEventType, + TUint aId, + TBool aVibraEnabled, + TBool aAudioEnabled, + TBool aVisible ) + { + TBool update = EFalse; + + // #1 + for ( TInt i = 0; i < iAreaArray.Count() && !update; i++ ) + { + if ( iAreaArray[i].iId == aId ) + { + iAreaArray[i].iRect = aRect; + iAreaArray[i].iFeedbackTypeDown = aFeedbackTypeDown; + iAreaArray[i].iFeedbackDown = aFeedbackDown; + iAreaArray[i].iFeedbackTypeUp = aFeedbackTypeUp; + iAreaArray[i].iFeedbackUp = aFeedbackUp; + iAreaArray[i].iEventType = aEventType; + iAreaArray[i].iVibraEnabled = aVibraEnabled; + iAreaArray[i].iAudioEnabled = aAudioEnabled; + iAreaArray[i].iVisible = aVisible; + + update = ETrue; + } + } + + // #2 + if ( !update ) + { + TFeedbackEntry newEntry; + + newEntry.iRect = aRect; + newEntry.iFeedbackTypeDown = aFeedbackTypeDown; + newEntry.iFeedbackDown = aFeedbackDown; + newEntry.iFeedbackTypeUp = aFeedbackTypeUp; + newEntry.iFeedbackUp = aFeedbackUp; + newEntry.iEventType = aEventType; + newEntry.iId = aId; + newEntry.iVibraEnabled = aVibraEnabled; + newEntry.iAudioEnabled = aAudioEnabled; + newEntry.iVisible = aVisible; + + iAreaArray.AppendL( newEntry ); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CTouchFeedbackRegistry::RemoveFeedbackArea( TUint aId ) + { + for ( TInt i = 0; i < iAreaArray.Count(); i++ ) + { + if ( iAreaArray[i].iId == aId ) + { + iAreaArray.Remove( i ); + break; + } + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool CTouchFeedbackRegistry::ChangeFeedbackArea( + TUint aId, + TRect aNewRect ) + { + TBool changed = EFalse; + + for ( TInt i = 0; i < iAreaArray.Count(); i++ ) + { + if ( iAreaArray[i].iId == aId ) + { + // Check if we really have to change something + if ( iAreaArray[i].iRect != aNewRect ) + { + iAreaArray[i].iRect = aNewRect; + + changed = ETrue; + } + + // Anyway break out from the loop, as we found the area + // already + break; + } + } + + return changed; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool CTouchFeedbackRegistry::ChangeFeedbackType( + TUint aId, + TTouchLogicalFeedback aNewFeedbackTypeDown, + TTouchLogicalFeedback aNewFeedbackTypeUp ) + { + TBool changed = EFalse; + + for ( TInt i = 0; i < iAreaArray.Count(); i++ ) + { + if ( iAreaArray[i].iId == aId ) + { + // Check if we really have to change something + if ( iAreaArray[i].iFeedbackTypeDown != aNewFeedbackTypeDown ) + { + iAreaArray[i].iFeedbackTypeDown = aNewFeedbackTypeDown; + changed = ETrue; + } + if ( aNewFeedbackTypeUp != 0xFFFFFFFF && + iAreaArray[i].iFeedbackTypeUp != aNewFeedbackTypeUp ) + { + iAreaArray[i].iFeedbackTypeUp = aNewFeedbackTypeUp; + changed = ETrue; + } + + // Anyway break out from the loop, as we found the area + // already + break; + } + } + + return changed; + } + +// --------------------------------------------------------------------------- +// Areas are moved to server side starting from last position +// --> We need to make the desired area the last one in the array. +// --------------------------------------------------------------------------- +// +TInt CTouchFeedbackRegistry::MoveFeedbackAreaToFirstPriority( TUint aId ) + { + TInt ret = KErrNotFound; + + for ( TInt i = 0; i < iAreaArray.Count(); i++ ) + { + if ( iAreaArray[i].iId == aId ) + { + TFeedbackEntry tmpEntry = iAreaArray[i]; + + TInt lastPosition = iAreaArray.Count()-1; + + iAreaArray[i] = iAreaArray[lastPosition]; + iAreaArray[lastPosition] = tmpEntry; + + ret = KErrNone; + + break; + } + } + + return ret; + } + +// --------------------------------------------------------------------------- +// Here we set the new enabled / disabled state for this area. +// +// We also return ETrue if the status really changed. This way caller of this +// function can know if any updates to server side have to be done or not. +// --------------------------------------------------------------------------- +// +TBool CTouchFeedbackRegistry::SetFeedbackEnabled( TUint aId, + TBool aVibraEnabled, + TBool aAudioEnabled, + TBool aVisible ) + { + TInt changed = EFalse; + + for ( TInt i = 0; i < iAreaArray.Count(); i++ ) + { + if ( iAreaArray[i].iId == aId ) + { + // Check if the status really changes + if ( ( iAreaArray[i].iVibraEnabled != aVibraEnabled ) || + (iAreaArray[i].iAudioEnabled != aAudioEnabled ) || + (iAreaArray[i].iVisible != aVisible )) + { + changed = ETrue; + + iAreaArray[i].iVibraEnabled = aVibraEnabled; + iAreaArray[i].iAudioEnabled = aAudioEnabled; + iAreaArray[i].iVisible = aVisible; + } + + break; + } + } + + return changed; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TUint CTouchFeedbackRegistry::WindowHandle() const + { + return iWindowHandle; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CTouchFeedbackRegistry::CTouchFeedbackRegistry::AreaCount() + { + return iAreaArray.Count(); + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +RArray* CTouchFeedbackRegistry::WindowRegistry() + { + return &iAreaArray; + }