diff -r aaeeca1f15af -r e8d784ac1a4b scrsaver/scrsaverplugins/SlideshowPlugin/src/SlideshowModel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scrsaver/scrsaverplugins/SlideshowPlugin/src/SlideshowModel.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,441 @@ +/* +* Copyright (c) 2006 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: Takes care of storing and serving the slides +* to Slideshow plugin +* +*/ + + +#include +#include +#include + +#include "SlideshowModel.h" +#include "SlideshowPluginUtils.h" + +//------------------------------------------------------------------------------ +// CSlideshowModel::NewL +//------------------------------------------------------------------------------ +// +CSlideshowModel* CSlideshowModel::NewL() + { + CSlideshowModel* self = new (ELeave) CSlideshowModel(); + + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + + return self; + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::~CSlideshowModel +//------------------------------------------------------------------------------ +// +CSlideshowModel::~CSlideshowModel() + { + // Delete slide array + if (iSlides) + { + iSlides->ResetAndDestroy(); + } + delete iSlides; + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::CSlideshowModel +//------------------------------------------------------------------------------ +// +CSlideshowModel::CSlideshowModel() + : iNextSlide(-1) + { + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::ConstructL +//------------------------------------------------------------------------------ +// +void CSlideshowModel::ConstructL() + { + // Create slide array + iSlides = new(ELeave) CArrayPtrFlat( + KSlideshowSlideArrayGranularity); + + //Get random seed + TTime time; + time.HomeTime(); + iRandSeed = time.Int64(); + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::NumberOfSlides +//------------------------------------------------------------------------------ +// +TInt CSlideshowModel::NumberOfSlides() const + { + //if the slide array is not NULL, return it's size + return iSlides ? iSlides->Count() : 0; + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::AppendSlideL +//------------------------------------------------------------------------------ +// +void CSlideshowModel::AppendSlideL(CSlideshowSlide* aSlide) + { + // Sanity check + if (!iSlides) + { + ASSERT(EFalse); + return; + } + + // Stash it in + iSlides->AppendL(aSlide); + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::InsertSlideL +//------------------------------------------------------------------------------ +// +void CSlideshowModel::InsertSlideL(TInt aIndex, CSlideshowSlide* aSlide) + { + if ((iSlides) && (aIndex >= 0) && (aIndex <= NumberOfSlides())) + { + // Squeeze it in + iSlides->InsertL(aIndex, aSlide); + } + else + { + ASSERT(EFalse); + } + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::DeleteSlide +//------------------------------------------------------------------------------ +// +void CSlideshowModel::DeleteSlide(TInt aIndex) + { + //Sanity check + if ((iSlides) && (aIndex >= 0) && (aIndex <= NumberOfSlides())) + { + // Grab hold of the slide for deletion, remove from array + // and compress the array + CSlideshowSlide* ptr = iSlides->At(aIndex); + + iSlides->Delete(aIndex); + delete ptr; + iSlides->Compress(); + + } + else + { + ASSERT(EFalse); + } + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::DeleteAll +//------------------------------------------------------------------------------ +// +void CSlideshowModel::DeleteAll() + { + //Sanity check + if (iSlides) + { + iSlides->ResetAndDestroy(); + } + + iCurrentSlide = 0; + iNextSlide = -1; + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::SlideAt +//------------------------------------------------------------------------------ +// +CSlideshowSlide* CSlideshowModel::SlideAt(TInt aIndex) const + { + if ((iSlides) && (aIndex >= 0) && (aIndex < NumberOfSlides())) + { + //return the postion object + return iSlides->At(aIndex); + } + else + { + return NULL; + } + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::NextSlide +//------------------------------------------------------------------------------ +// +CSlideshowSlide* CSlideshowModel::NextSlide(TBool /*aRandom */) + { + if (iNextSlide < 0) + { + // Next slide could not be prepared, or preparenextslide not called + return NULL; + } + + CSlideshowSlide* pSlide = SlideAt(iNextSlide); + + if (!pSlide) + { + // Apparently there are no more slides - wrap around + iCurrentSlide = -1; + iNextSlide = 0; + pSlide = SlideAt(iNextSlide); + } + + iCurrentSlide = iNextSlide; + return pSlide; + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::PrepareNextSlide +//------------------------------------------------------------------------------ +// +void CSlideshowModel::PrepareNextSlide(TBool aRandom, const TSize& aTargetSize) + { + SSPLOGGER_WRITE("Model::PrepareNextSlide(), model busy"); + + SSPLOGGER_WRITEF(_L("SPP: iCurrentSlide %d, iNextSlide %d"), + iCurrentSlide, iNextSlide); + + TBool slideOK = EFalse; + while (!slideOK) + { + TInt nSlides = NumberOfSlides(); + // Any point in continuing? + if (nSlides == 0) + { + iNextSlide = -1; + break; + } + + // Special cases, 1 or 2 slides only + if (nSlides == 1) + { + iNextSlide = 0; + SSPLOGGER_WRITEF(_L("SPP: One slide, next slide %d"), iNextSlide); + } + else if (nSlides == 2) + { + // Switch between slides even if random + iNextSlide = (iNextSlide == 0 ? 1 : 0); + SSPLOGGER_WRITEF(_L("SPP: 2 slides, next slide %d"), iNextSlide); + } + else + { + // We got at least 3 slides, and can also do random + if (aRandom) + { + // Make sure we won't pick the same slide + do + { + iNextSlide = Random(nSlides - 1); + } + while (iNextSlide == iCurrentSlide); + + SSPLOGGER_WRITEF(_L("SPP: Random, next slide %d"), iNextSlide); + } + else + { + iNextSlide++; + + // Wrap? + if (iNextSlide >= nSlides) + { + SSPLOGGER_WRITE("Wrapping..."); + iNextSlide = 0; + } + SSPLOGGER_WRITEF(_L("SPP: Continuous, next slide %d"), + iNextSlide); + } + } + + // Get the slide + CSlideshowSlide* pSlide = SlideAt(iNextSlide); + + if (!pSlide) + { + // Should not have happened - start from beginning + iNextSlide = 0; + SSPLOGGER_WRITEF(_L("SPP: Wrapping, next slide %d"), + iNextSlide); + pSlide = SlideAt(iNextSlide); + } + + if (pSlide) + { + // Try loading the image, if image does not already exist + if (!pSlide->IsSlideDecoded()) + { + SSPLOGGER_WRITE("Preparing next slide"); + if(iCurrentSlide != iNextSlide) + { + // relese currently deleted image from RAM.( We dont have caching) + ReleaseCurrentSlide(); + } + if ((TInt)ETrue == pSlide->CouldNotDecodeFile()) + { + // could not decode this file last time. so delete this slide from the + // list of slide and go to the next one. + DeleteSlide(iNextSlide); + iNextSlide--; + continue; + } + TRAPD(err, pSlide->PrepareSlideL(aTargetSize)); + if (err == KErrNone) + { + //wait for slide to load. + iCurrentSlide = iNextSlide; + SSPLOGGER_WRITE("Started Decoding Wait"); + break; + } + else + { + // Apparently the file was not a loadable image - + // remove from slideset and try again + SSPLOGGER_WRITEF(_L("SSP: Deleting slide %d"), iNextSlide); + DeleteSlide(iNextSlide); + iNextSlide--; + continue; // can not load this image, go to the next one. + } + } + else + { + // Slide is already decoded. This is cool, if the file is + // still there. Otherwise lose image and go on. + // should not come here as we dont any caching + SSPLOGGER_WRITEF(_L("Slide %d already has image"), iNextSlide); + + if (!BaflUtils::FileExists(CEikonEnv::Static()->FsSession(), + *(pSlide->FileName()))) + { + SSPLOGGER_WRITE("Slide image file gone, dropping image"); + pSlide->ReleaseImage(); + continue; // continue with next image + } + else + { + if(iCurrentSlide != iNextSlide) + { + ReleaseCurrentSlide(); + } + break; + } + } + } + } + SSPLOGGER_WRITE("Model::PrepareNextSlide() end, model no longer busy"); + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::ReleaseCurrentSlide +//------------------------------------------------------------------------------ +// +void CSlideshowModel::ReleaseCurrentSlide() + { + CSlideshowSlide* pSlide = SlideAt(iCurrentSlide); + if(pSlide) + { + pSlide->ReleaseImage(); + } + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::ReleaseNextSlide +//------------------------------------------------------------------------------ +// +void CSlideshowModel::ReleaseNextSlide() + { + CSlideshowSlide* pSlide = SlideAt(iNextSlide); + if(pSlide) + { + pSlide->ReleaseImage(); + } + iNextSlide --; + } + + +//------------------------------------------------------------------------------ +// CSlideshowModel::SetReserveL +//------------------------------------------------------------------------------ +// +void CSlideshowModel::SetReserveL(TInt aCount) + { + if ((iSlides) && (aCount >= NumberOfSlides())) + { + iSlides->SetReserveL(aCount); + } + } + +//------------------------------------------------------------------------------ +// CSlideshowModel::SlideStatus +//------------------------------------------------------------------------------ +// +TInt CSlideshowModel::SlideStatus(CSlideshowSlide* aSlide) + { + if(!aSlide) + { + return KStatusNoSlide; + } + else if(aSlide->IsSlideDecoded()) + { + return KStatusSlideDecoded; + } + else if(aSlide->IsDecodingInProgress()) + { + return KStatusDecodingInProgress; + } + else if (aSlide->CouldNotDecodeFile()) + { + return KStatusSlideDecodeingFailed; + } + + return KStatusSlideNotDecoding; + } + + + +//------------------------------------------------------------------------------ +// CSlideshowModel::Random +//------------------------------------------------------------------------------ +// +TInt CSlideshowModel::Random(TInt aMax, TInt aMin /* = 0 */) + { + TInt range = aMax - aMin; + TInt rand = Math::Rand(iRandSeed); + return (rand % range); + } + + +// End of File