diff -r 4ea6f81c838a -r 0e9bb658ef58 mulwidgets/muldatamodel/src/mulasyncdataprovider.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mulwidgets/muldatamodel/src/mulasyncdataprovider.cpp Wed Sep 01 12:23:18 2010 +0100 @@ -0,0 +1,241 @@ +/* +* Copyright (c) 2007-2008 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: Active Object Implementation for providing data asynchronously +* +*/ + + +#include "mulasyncdataprovider.h" + +#include +#include //for find algorithm + +#include "mullog.h" + +namespace Alf + { + +// --------------------------------------------------------------------------- +// MulAsyncDataProvider +// --------------------------------------------------------------------------- +// +MulAsyncDataProvider::MulAsyncDataProvider( IMulModelProvider& aDataProvider, + const MulPageDataWindow& aDataWindow ) + :CActive( EPriorityNormal ), + mDataProvider(aDataProvider), + mDataWindow(aDataWindow) + { + MUL_LOG_ENTRY_EXIT("MUL::MulAsyncDataProvider::MulAsyncDataProvider"); + CActiveScheduler::Add(this); + } + +// --------------------------------------------------------------------------- +// ~MulAsyncDataProvider +// --------------------------------------------------------------------------- +// +MulAsyncDataProvider::~MulAsyncDataProvider() + { + MUL_LOG_ENTRY_EXIT("MUL::MulAsyncDataProvider::~MulAsyncDataProvider"); + Cancel(); + mDataQueue.clear(); + } + +// --------------------------------------------------------------------------- +// RunL +// --------------------------------------------------------------------------- +// +void MulAsyncDataProvider::RunL() + { + vector::iterator iter = mDataQueue.begin(); + if( iter < mDataQueue.end() ) + { + bool inDataWindow = false; + MulAsyncData asyncData = *iter; + + if(mDataWindow.IsItemInDataWindow(asyncData.mStartIndex) /*&& mDataWindow->IsItemInDataWindow(mStartIndex+ITEMS)*/) + { + if( asyncData.mRange < mDataWindow.WindowSize() ) + { + mDataProvider.ProvideData( asyncData.mStartIndex, asyncData.mRange, asyncData.mPath); + } + else + { + mDataProvider.ProvideData( asyncData.mStartIndex, mDataWindow.WindowSize() , asyncData.mPath); + } + inDataWindow = true; + } + + asyncData.mStartIndex += mDataWindow.WindowSize(); + asyncData.mRange -= mDataWindow.WindowSize(); + mDataQueue.erase(iter); + + if( asyncData.mRange > 0 && inDataWindow ) + { + mDataQueue.insert( iter, asyncData ); + if( !IsActive() ) + { + ActivateAndComplete(); + } + } + else if(mDataQueue.begin() < mDataQueue.end()) + { + if( !IsActive() ) + { + ActivateAndComplete(); + } + } + } + } + +// --------------------------------------------------------------------------- +// DoCancel +// --------------------------------------------------------------------------- +// +void MulAsyncDataProvider::DoCancel() + { + //does this function required?? + } +// +// --------------------------------------------------------------------------- +// ProvideData +// --------------------------------------------------------------------------- +// +void MulAsyncDataProvider::ProvideData( int aStartIndex, int aRange, const MulDataPath& aPath, const bool aIsSync ) + { + if( aIsSync ) + { + mDataProvider.ProvideData( aStartIndex, aRange, aPath); + return; + } + MulAsyncData asyncData; + asyncData.mStartIndex = aStartIndex; + asyncData.mRange = aRange; + asyncData.mPath = aPath; + if( std::find( mDataQueue.begin(), mDataQueue.end(), asyncData ) == mDataQueue.end()) + { + mDataQueue.push_back( asyncData ); + } + + for( int i = 0 ; i < mDataQueue.size() ; ++i ) + { + MulAsyncData data = mDataQueue[i]; + if ( (mDataWindow.IsItemInDataWindow( data.mStartIndex ) && + !mDataWindow.IsItemInDataWindow( data.mStartIndex + data.mRange - 1 ) ) ) + { + int index = GetFirstIndexForWhichDataIsPresent(data.mStartIndex , data.mStartIndex + data.mRange - 1 ); + if( index!= -1 &&( index - data.mStartIndex + 1) > 0) + { + mDataQueue.erase(mDataQueue.begin() + i); + data.mRange = index - data.mStartIndex + 1; + mDataQueue.insert(mDataQueue.begin() + i, data); + } + else + { + mDataQueue.erase(mDataQueue.begin() + i); + i--; + } + + } + else if ( (!mDataWindow.IsItemInDataWindow( data.mStartIndex ) && + mDataWindow.IsItemInDataWindow( data.mStartIndex + data.mRange - 1 ) ) ) + { + int index = GetFirstIndexForWhichDataIsPresent(data.mStartIndex , data.mStartIndex + data.mRange - 1 ); + if( index!= -1 &&( data.mStartIndex + data.mRange - index ) > 0 ) + { + mDataQueue.erase(mDataQueue.begin() + i); + int endIndex = (data.mStartIndex + data.mRange - 1); + data.mStartIndex = index; + data.mRange = (endIndex - index + 1); + mDataQueue.insert(mDataQueue.begin() + i, data); + } + else + { + mDataQueue.erase(mDataQueue.begin() + i); + i--; + } + } + else if ( (!mDataWindow.IsItemInDataWindow( data.mStartIndex ) && + !mDataWindow.IsItemInDataWindow( data.mStartIndex + data.mRange - 1 ) ) ) + { + mDataQueue.erase(mDataQueue.begin() + i); + i--; + MUL_LOG_INFO2( "MUL::MulAsyncDataProvider::ProvideData Removing From Q: startIndx=%d,range=%d", data.mStartIndex, data.mRange ); + } + } + + if( !IsActive() ) + { + ActivateAndComplete(); + } + } +// --------------------------------------------------------------------------- +// GetFirstIndexForWhichDataIsPresent +// --------------------------------------------------------------------------- +// +int MulAsyncDataProvider::GetFirstIndexForWhichDataIsPresent(int aStartIndex, int aEndIndex) + { + if ( aStartIndex > aEndIndex ) + { + return -1; + } + int mid = (aStartIndex + aEndIndex)/2; + if(mDataWindow.IsItemInDataWindow(aStartIndex)) + { + if(mid == aStartIndex) + { + return mid; + } + if(mDataWindow.IsItemInDataWindow(mid)) + { + return GetFirstIndexForWhichDataIsPresent(mid, aEndIndex); + } + else + { + return GetFirstIndexForWhichDataIsPresent(aStartIndex, mid); + } + } + else if(mDataWindow.IsItemInDataWindow(aEndIndex)) + { + if(mid == aStartIndex) + { + return (mid + 1); + } + if(mDataWindow.IsItemInDataWindow(mid)) + { + return GetFirstIndexForWhichDataIsPresent(aStartIndex, mid); + } + else + { + return GetFirstIndexForWhichDataIsPresent(mid, aEndIndex); + } + } + return -1; + } + +// --------------------------------------------------------------------------- +// ActivateAndComplete +// --------------------------------------------------------------------------- +// + void MulAsyncDataProvider::ActivateAndComplete() + { + TRequestStatus* lStatus = &iStatus; + iStatus = KRequestPending; + SetActive(); + User::RequestComplete(lStatus, KErrNone); + } + + } // End of namespace Alf . + + +// End of file