blob: 3e527fd0646b646a60ba8fc6f2756472df81c236 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#include "precompiled_sd.hxx"
#include "SlsQueueProcessor.hxx"
#include "SlsCacheConfiguration.hxx"
#include "SlsRequestQueue.hxx"
namespace sd { namespace slidesorter { namespace cache {
//===== QueueProcessor ======================================================
QueueProcessor::QueueProcessor (
RequestQueue& rQueue,
const ::boost::shared_ptr<BitmapCache>& rpCache,
const Size& rPreviewSize,
const bool bDoSuperSampling,
const SharedCacheContext& rpCacheContext)
: maMutex(),
maTimer(),
mnTimeBetweenHighPriorityRequests (10/*ms*/),
mnTimeBetweenLowPriorityRequests (100/*ms*/),
mnTimeBetweenRequestsWhenNotIdle (1000/*ms*/),
maPreviewSize(rPreviewSize),
mbDoSuperSampling(bDoSuperSampling),
mpCacheContext(rpCacheContext),
mrQueue(rQueue),
mpCache(rpCache),
maBitmapFactory(),
mbIsPaused(false)
{
// Look into the configuration if there for overriding values.
::com::sun::star::uno::Any aTimeBetweenReqeusts;
aTimeBetweenReqeusts = CacheConfiguration::Instance()->GetValue(
::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TimeBetweenHighPriorityRequests")));
if (aTimeBetweenReqeusts.has<sal_Int32>())
aTimeBetweenReqeusts >>= mnTimeBetweenHighPriorityRequests;
aTimeBetweenReqeusts = CacheConfiguration::Instance()->GetValue(
::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TimeBetweenLowPriorityRequests")));
if (aTimeBetweenReqeusts.has<sal_Int32>())
aTimeBetweenReqeusts >>= mnTimeBetweenLowPriorityRequests;
aTimeBetweenReqeusts = CacheConfiguration::Instance()->GetValue(
::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TimeBetweenRequestsDuringShow")));
if (aTimeBetweenReqeusts.has<sal_Int32>())
aTimeBetweenReqeusts >>= mnTimeBetweenRequestsWhenNotIdle;
maTimer.SetTimeoutHdl (LINK(this,QueueProcessor,ProcessRequestHdl));
maTimer.SetTimeout (mnTimeBetweenHighPriorityRequests);
}
QueueProcessor::~QueueProcessor (void)
{
}
void QueueProcessor::Start (int nPriorityClass)
{
if (mbIsPaused)
return;
if ( ! maTimer.IsActive())
{
if (nPriorityClass == 0)
maTimer.SetTimeout (mnTimeBetweenHighPriorityRequests);
else
maTimer.SetTimeout (mnTimeBetweenLowPriorityRequests);
maTimer.Start();
}
}
void QueueProcessor::Stop (void)
{
if (maTimer.IsActive())
maTimer.Stop();
}
void QueueProcessor::Pause (void)
{
mbIsPaused = true;
}
void QueueProcessor::Resume (void)
{
mbIsPaused = false;
if ( ! mrQueue.IsEmpty())
Start(mrQueue.GetFrontPriorityClass());
}
void QueueProcessor::Terminate (void)
{
}
void QueueProcessor::SetPreviewSize (
const Size& rPreviewSize,
const bool bDoSuperSampling)
{
maPreviewSize = rPreviewSize;
mbDoSuperSampling = bDoSuperSampling;
}
IMPL_LINK(QueueProcessor, ProcessRequestHdl, Timer*, EMPTYARG)
{
ProcessRequests();
return 1;
}
void QueueProcessor::ProcessRequests (void)
{
OSL_ASSERT(mpCacheContext.get()!=NULL);
// Never process more than one request at a time in order to prevent the
// lock up of the edit view.
if ( ! mrQueue.IsEmpty()
&& ! mbIsPaused
&& mpCacheContext->IsIdle())
{
CacheKey aKey = NULL;
RequestPriorityClass ePriorityClass (NOT_VISIBLE);
{
::osl::MutexGuard aGuard (mrQueue.GetMutex());
if ( ! mrQueue.IsEmpty())
{
// Get the request with the highest priority from the queue.
ePriorityClass = mrQueue.GetFrontPriorityClass();
aKey = mrQueue.GetFront();
mrQueue.PopFront();
}
}
if (aKey != NULL)
ProcessOneRequest(aKey, ePriorityClass);
}
// Schedule the processing of the next element(s).
{
::osl::MutexGuard aGuard (mrQueue.GetMutex());
if ( ! mrQueue.IsEmpty())
Start(mrQueue.GetFrontPriorityClass());
}
}
void QueueProcessor::ProcessOneRequest (
CacheKey aKey,
const RequestPriorityClass ePriorityClass)
{
try
{
::osl::MutexGuard aGuard (maMutex);
// Create a new preview bitmap and store it in the cache.
if (mpCache.get() != NULL
&& mpCacheContext.get() != NULL)
{
const SdPage* pSdPage = dynamic_cast<const SdPage*>(mpCacheContext->GetPage(aKey));
if (pSdPage != NULL)
{
const Bitmap aPreview (
maBitmapFactory.CreateBitmap(*pSdPage, maPreviewSize, mbDoSuperSampling));
mpCache->SetBitmap (pSdPage, aPreview, ePriorityClass!=NOT_VISIBLE);
// Initiate a repaint of the new preview.
mpCacheContext->NotifyPreviewCreation(aKey, aPreview);
}
}
}
catch (::com::sun::star::uno::RuntimeException aException)
{
(void) aException;
OSL_ASSERT("RuntimeException caught in QueueProcessor");
}
catch (::com::sun::star::uno::Exception aException)
{
(void) aException;
OSL_ASSERT("Exception caught in QueueProcessor");
}
}
void QueueProcessor::RemoveRequest (CacheKey aKey)
{
(void)aKey;
// See the method declaration above for an explanation why this makes sense.
::osl::MutexGuard aGuard (maMutex);
}
void QueueProcessor::SetBitmapCache (
const ::boost::shared_ptr<BitmapCache>& rpCache)
{
mpCache = rpCache;
}
} } } // end of namespace ::sd::slidesorter::cache