diff -r dec420019252 -r cf5481c2bc0b videocollection/videocollectionwrapper/src/videodeleteworker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videocollection/videocollectionwrapper/src/videodeleteworker.cpp Fri Apr 16 14:59:52 2010 +0300 @@ -0,0 +1,240 @@ +/* +* 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: VideoDeleteWorker class implementation +* +*/ +// INCLUDE FILES + +#include +#include "videocollectioncommon.h" +#include "videocollectionclient.h" +#include "videodeleteworker.h" + + + +// ================= MEMBER FUNCTIONS ======================= +// + +/** + * private global inline hash function for TMPXItemId keys in QSet + */ +inline uint qHash(TMPXItemId key) +{ + QPair keyPair(key.iId1, key.iId2); + + return qHash(keyPair); +} + +// ----------------------------------------------------------------------------- +// VideoDeleteWorker() +// ----------------------------------------------------------------------------- +// +VideoDeleteWorker::VideoDeleteWorker(VideoCollectionClient &collection, QObject *parent) : +QObject(parent), +mCollectionClient(collection), +mRequestWaitTimer(0), +mLastStatus(0), +mLastStatusData(QVariant()) +{ + +} + +// ----------------------------------------------------------------------------- +// ~VideoDeleteWorker() +// ----------------------------------------------------------------------------- +// +VideoDeleteWorker::~VideoDeleteWorker() +{ + if(mRequestWaitTimer && mRequestWaitTimer->isActive()) + { + mRequestWaitTimer->stop(); + } + // if we're still doing some background deletion, + // dump all deletes to collection and stop timer + flushAll(); +} + +// ----------------------------------------------------------------------------- +// requestDelete() +// ----------------------------------------------------------------------------- +// +void VideoDeleteWorker::requestDelete(const QList &indexList) +{ + if(!mRequestWaitTimer) + { + mRequestWaitTimer = new QTimer(); + connect(mRequestWaitTimer, SIGNAL(timeout()), this, SLOT(execDeleteBlockSlot())); + } + + mRemoveBuffer.unite(QSet::fromList(indexList)); + + if(!mRequestWaitTimer->isActive()) + { + // first startup throught zero timer, after that + // deletion is chained. Next delete block starts from + // modelChangedSlot + mRequestWaitTimer->setSingleShot(true); + mRequestWaitTimer->start(0); + } +} + +// ----------------------------------------------------------------------------- +// removeFromRequest() +// ----------------------------------------------------------------------------- +// +int VideoDeleteWorker::removeFromRequest(TMPXItemId &itemId) +{ + mRemoveBuffer.remove(itemId); + return mRemoveBuffer.count(); +} + +// ----------------------------------------------------------------------------- +// isDeleting() +// ----------------------------------------------------------------------------- +// +bool VideoDeleteWorker::isDeleting() +{ + return mRemoveBuffer.count() ? true : false; +} + +// ----------------------------------------------------------------------------- +// updateStatus() +// ----------------------------------------------------------------------------- +// +void VideoDeleteWorker::updateStatus(int status, QVariant data) +{ + // do not update invalid status + if(status != VideoCollectionCommon::statusDeleteSucceed && + status != VideoCollectionCommon::statusSingleDeleteFail && + status != VideoCollectionCommon::statusMultipleDeleteFail) + { + return; + } + + if(!mLastStatus || mLastStatus == VideoCollectionCommon::statusDeleteSucceed) + { + mLastStatus = status; + mLastStatusData = data; + return; + } + if(status == VideoCollectionCommon::statusDeleteSucceed) + { + return; + } + int count = 0; + if(mLastStatus == VideoCollectionCommon::statusSingleDeleteFail) + { + // old status was single fail + mLastStatus = VideoCollectionCommon::statusMultipleDeleteFail; + count = 2; + if(status == VideoCollectionCommon::statusMultipleDeleteFail) + { + count = data.toInt() + 1; + } + // count of failed is now 2 + mLastStatusData = count; + return; + } + // all other cases mean multi + count = data.toInt(); + mLastStatus = VideoCollectionCommon::statusMultipleDeleteFail; + count ? mLastStatusData = mLastStatusData.toInt() + count : + mLastStatusData = mLastStatusData.toInt() + 1; +} + +// ----------------------------------------------------------------------------- +// getStatus() +// ----------------------------------------------------------------------------- +// +int VideoDeleteWorker::getLastStatus(QVariant &data) +{ + data = mLastStatusData; + return mLastStatus; +} + +// ----------------------------------------------------------------------------- +// clearStatus() +// ----------------------------------------------------------------------------- +// +void VideoDeleteWorker::clearStatus() +{ + mLastStatus = 0; + mLastStatusData = QVariant(); +} + +// ----------------------------------------------------------------------------- +// continueSlot() +// ----------------------------------------------------------------------------- +// +void VideoDeleteWorker::continueSlot() +{ + if(!mRequestWaitTimer || !mRemoveBuffer.count()) + { + return; + } + if(!mRequestWaitTimer->isActive()) + { + mRequestWaitTimer->setSingleShot(true); + mRequestWaitTimer->start(0); + } +} + +// ----------------------------------------------------------------------------- +// doBackgroundDeleteSlot() +// ----------------------------------------------------------------------------- +// +void VideoDeleteWorker::execDeleteBlockSlot() +{ + if(!mRemoveBuffer.count()) + { + return; + } + QList deleteBlock; + + // create block of max 3 items + int counter = 0; + QSet::iterator iter = mRemoveBuffer.begin(); + while(iter != mRemoveBuffer.end() && counter < 3) + { + deleteBlock.append((*iter)); + iter = mRemoveBuffer.erase(iter); + counter++; + } + + // need to handle errors somehow + if(mCollectionClient.deleteVideos(&deleteBlock) != 0) + { + // signal block delete startup failed + emit deleteStartupFailed(deleteBlock); + } +} + +// ----------------------------------------------------------------------------- +// flushAll() +// ----------------------------------------------------------------------------- +// +void VideoDeleteWorker::flushAll() +{ + if(!mRemoveBuffer.count()) + { + return; + } + QList ids = mRemoveBuffer.toList(); + mCollectionClient.deleteVideos(&ids); + mRemoveBuffer.clear(); +} + + + +// End of file