--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/htiui/HtiServicePlugins/HtiKeyEventServicePlugin/src/MultiTouchPointerEventHandler.cpp Wed Aug 25 15:45:01 2010 +0300
@@ -0,0 +1,286 @@
+/*
+* Copyright (c) 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: Functional implementation of advanced pointer multitouch service
+*
+*/
+
+// INCLUDE FILES
+#include "HtiKeyEventServicePlugin.h"
+#include "MultiTouchPointerEventHandler.h"
+#include "MultiTouchPointerEvent.h"
+
+#include <HtiDispatcherInterface.h>
+#include <HtiLogging.h>
+
+// CONSTANTS
+
+
+// ----------------------------------------------------------------------------
+// CMultiTouchPointerEventHandler::NewL()
+// ----------------------------------------------------------------------------
+CMultiTouchPointerEventHandler* CMultiTouchPointerEventHandler::NewL(MHtiMultiTouchObserver& aObserver)
+ {
+ HTI_LOG_FUNC_IN( "CMultiTouchPointerEventHandler::NewL" );
+ CMultiTouchPointerEventHandler* self = new (ELeave) CMultiTouchPointerEventHandler(aObserver);
+ CleanupStack::PushL ( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+ HTI_LOG_FUNC_OUT( "CMultiTouchPointerEventHandler::NewL" );
+ return self;
+ }
+
+// ----------------------------------------------------------------------------
+// CMultiTouchPointerEventHandler::CMultiTouchPointerEventHandler()
+// ----------------------------------------------------------------------------
+CMultiTouchPointerEventHandler::CMultiTouchPointerEventHandler(MHtiMultiTouchObserver& aObserver)
+ :iFinishedCount(0), iObserver(aObserver)
+ {
+ HTI_LOG_TEXT( "CMultiTouchPointerEventHandler constructor" );
+ }
+
+// ----------------------------------------------------------------------------
+// CMultiTouchPointerEventHandler::~CMultiTouchPointerEventHandler()
+// ----------------------------------------------------------------------------
+CMultiTouchPointerEventHandler::~CMultiTouchPointerEventHandler()
+ {
+ HTI_LOG_TEXT( "CMultiTouchPointerEventHandler destructor" );
+ Clear();
+ iWsSession.Close();
+ }
+
+// ----------------------------------------------------------------------------
+// CMultiTouchPointerEventHandler::ConstructL()
+// ----------------------------------------------------------------------------
+void CMultiTouchPointerEventHandler::ConstructL()
+ {
+ HTI_LOG_TEXT( "CMultiTouchPointerEventHandler::ConstructL" );
+ User::LeaveIfError( iWsSession.Connect() );
+ }
+// ----------------------------------------------------------------------------
+// CMultiTouchPointerEventHandler::Clear()
+// ----------------------------------------------------------------------------
+void CMultiTouchPointerEventHandler::Clear()
+ {
+ HTI_LOG_TEXT( "CMultiTouchPointerEventHandler::Clear" );
+ iTouchPointerArray.ResetAndDestroy();
+ iFinishedCount=0;
+ }
+// ----------------------------------------------------------------------------
+// CMultiTouchPointerEventHandler::NotifyTouchComplete()
+// ----------------------------------------------------------------------------
+void CMultiTouchPointerEventHandler::NotifyTouchComplete(TUint8 aTouchNumber)
+ {
+ HTI_LOG_FUNC_IN("CMultiTouchPointerEventHandler::NotifyTouchComplete");
+
+ iFinishedCount++;
+ HTI_LOG_FORMAT( "touch number %d finished", aTouchNumber);
+ HTI_LOG_FORMAT( "%d touch finished", iFinishedCount);
+
+ if(iTouchPointerArray.Count() == iFinishedCount)
+ {
+ // notify observer
+ iObserver.NotifyMultiTouchComplete();
+ }
+
+ HTI_LOG_FUNC_OUT("CMultiTouchPointerEventHandler::NotifyTouchComplete");
+ }
+// ----------------------------------------------------------------------------
+// CMultiTouchPointerEventHandler::ParsePoint()
+// ----------------------------------------------------------------------------
+TBool CMultiTouchPointerEventHandler::ParsePoint( const TDesC8& aData, TInt& aoffset,
+ TInt& aX, TInt& aY, TInt& aZ,
+ TTimeIntervalMicroSeconds32& aWait, TTimeIntervalMicroSeconds32& aHold )
+ {
+ HTI_LOG_FUNC_IN( "CMultiTouchPointerEventHandler::ParsePoint" );
+
+ TInt dataLength = aData.Length();
+ if ( dataLength-aoffset < 14 )
+ return EFalse ;
+
+ aX = aData[aoffset] + ( aData[aoffset+1] << 8 );
+ aoffset += 2;
+
+ aY = aData[aoffset] + ( aData[aoffset+1] << 8 );
+ aoffset += 2;
+
+ aZ = aData[aoffset] + ( aData[aoffset+1] << 8 );
+ aoffset += 2;
+
+ aWait = (aData[aoffset] + ( aData[aoffset+1] << 8 )
+ + ( aData[aoffset+2] << 16 ) + (aData[aoffset+3] << 24) ) * 1000;
+ aoffset += 4;
+
+ aHold = ( aData[aoffset] + ( aData[aoffset+1] << 8 )
+ + ( aData[aoffset+2] << 16 ) + (aData[aoffset+3] << 24) ) * 1000;
+ aoffset += 4;
+
+ HTI_LOG_FUNC_OUT( "CMultiTouchPointerEventHandler::ParsePoint" );
+ return ETrue;
+ }
+// ----------------------------------------------------------------------------
+// CMultiTouchPointerEventHandler::ParseMove()
+// ----------------------------------------------------------------------------
+TBool CMultiTouchPointerEventHandler::ParseMove( const TDesC8& aData, TInt& aoffset,
+ TTimeIntervalMicroSeconds32& aDragTime, TInt& aStepCount )
+ {
+ HTI_LOG_FUNC_IN( "CMultiTouchPointerEventHandler::ParseMove" );
+
+ TInt dataLength = aData.Length();
+ if ( dataLength-aoffset < 6 )
+ return EFalse ;
+
+ aDragTime = ( aData[aoffset] + ( aData[aoffset+1] << 8 )
+ + ( aData[aoffset+2] << 16 ) + (aData[aoffset+3] << 24) ) * 1000;
+ aoffset += 4;
+
+ aStepCount = aData[aoffset] + ( aData[aoffset+1] << 8 );
+ aoffset += 2;
+
+ HTI_LOG_FUNC_OUT( "CMultiTouchPointerEventHandler::ParseMove" );
+ return ETrue;
+ }
+// ----------------------------------------------------------------------------
+// CMultiTouchPointerEventHandler::HandleMultiTouchL()
+// ----------------------------------------------------------------------------
+TBool CMultiTouchPointerEventHandler::HandleMultiTouchL( const TDesC8& aData )
+ {
+ HTI_LOG_FUNC_IN( "CMultiTouchPointerEventHandler::HandleMultiTouchL" );
+ TBool validparameter=EFalse;
+
+ TInt dataLength = aData.Length();
+ if ( dataLength < 1 )
+ return validparameter;
+
+ // Parse the parameters - correct length is already verified
+ TInt offset = 0;
+
+ TInt touchCount = aData[offset];
+ offset += 1;
+ HTI_LOG_FORMAT( "Number of touches: %d", touchCount );
+ if (touchCount<=0)
+ return validparameter;
+
+ for(TInt i=0; i<touchCount; i++)
+ {
+ //check valid data length
+ if(dataLength-offset < 3)
+ return validparameter;
+
+ TInt pointerNumber = aData[offset];
+ offset += 1;
+ HTI_LOG_FORMAT( "Pointer Number %d", pointerNumber );
+
+ TInt pointerCount = aData[offset] + ( aData[offset+1] << 8 );
+ offset += 2;
+ HTI_LOG_FORMAT( "Number of points: %d", pointerCount );
+
+ if (pointerCount == 0 )
+ return validparameter;
+
+ CMultiTouchPointerEvent* touch = CMultiTouchPointerEvent::NewL(pointerNumber,this);
+ CleanupStack::PushL(touch);
+ iTouchPointerArray.AppendL(touch);
+ CleanupStack::Pop();
+
+ TInt lastX, lastY, lastZ, stepCount;
+ TTimeIntervalMicroSeconds32 dragTime;
+
+ for (TInt j=0;j<pointerCount;j++)
+ {
+ // read point
+ TInt X1, Y1, Z1;
+ TTimeIntervalMicroSeconds32 waitTime, holdTime;
+ if (!ParsePoint( aData, offset,X1, Y1, Z1, waitTime, holdTime))
+ return validparameter;
+
+ HTI_LOG_FORMAT( "X coord down = %d", X1 );
+ HTI_LOG_FORMAT( "Y coord down = %d", Y1 );
+ HTI_LOG_FORMAT( "Z coord down = %d", Z1 );
+ HTI_LOG_FORMAT( "Event wait time = %d", waitTime.Int() );
+ HTI_LOG_FORMAT( "Point holding time = %d", holdTime.Int() );
+
+ if ( waitTime.Int() < 0 || holdTime.Int() < 0 )
+ return validparameter;
+
+ // add move event from last point to this point
+ if (j!=0)
+ {
+ HTI_LOG_FORMAT( "Point dragging time = %d", dragTime.Int() );
+ HTI_LOG_FORMAT( "Step count between two points = %d", stepCount );
+ touch->InterpolatePointL(lastX, lastY, lastZ,X1,Y1,Z1,dragTime,stepCount);
+ }
+
+ // set last point
+ lastX=X1;
+ lastY=Y1;
+ lastZ=Z1;
+
+ // wait event
+ touch->AddPointL(waitTime,X1,Y1,Z1,TRawEvent::EButton1Down);
+
+ // hold event
+ touch->AddPointL(holdTime, X1,Y1,Z1,TRawEvent::EPointerMove);
+
+ if (j!=pointerCount-1)
+ {
+ // not last point
+ if (!ParseMove(aData, offset, dragTime, stepCount))
+ return validparameter;
+ if (dragTime.Int() < 0 || stepCount <= 0)
+ return validparameter;
+ }
+ else
+ {
+ // last point
+ touch->AddPointL(0,X1,Y1,Z1,TRawEvent::EButton1Up);
+ }
+ }
+
+ touch->PrintInfo();
+
+ }
+
+
+ for (TInt i=0;i<touchCount;i++)
+ iTouchPointerArray[i]->StartTouch();
+
+ validparameter=ETrue;
+
+ HTI_LOG_FUNC_OUT( "CMultiTouchPointerEventHandler::HandleMultiTouchL" );
+ return validparameter;
+ }
+
+void CMultiTouchPointerEventHandler::SimulateEvent(TUint8 aTouchNumber,
+ TInt aX, TInt aY, TInt aZ, TRawEvent::TType aEventType)
+ {
+ HTI_LOG_FUNC_IN( "CMultiTouchPointerEventHandler::SimulateEvent" );
+
+ TRawEvent rawEvent;
+ rawEvent.SetPointerNumber( aTouchNumber );
+ rawEvent.Set( aEventType, aX, aY, aZ);
+
+ HTI_LOG_FORMAT( "SimulatePointer touch number=%d ", aTouchNumber );
+ HTI_LOG_FORMAT( "SimulatePointer event=%d ", aEventType );
+ HTI_LOG_FORMAT( "SimulatePointer X=%d ", aX );
+ HTI_LOG_FORMAT( "SimulatePointer Y=%d ", aY );
+ HTI_LOG_FORMAT( "SimulatePointer Z=%d", aZ );
+
+ iWsSession.SimulateRawEvent( rawEvent );
+ iWsSession.Flush();
+
+ HTI_LOG_FUNC_OUT( "CMultiTouchPointerEventHandler::SimulateEvent" );
+
+ }
+
+// End of file