/*
* ==============================================================================
* Copyright (c) 2006, Nokia Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name of the Nokia Corporation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
* ==============================================================================
*/
/*
* This class is a proxy for CAnimationDecoderWrapped
*
* We needed to wrap animation decoding in a proxy because sometimes the cache gets cleared when decoding
* is in progress; when that happens the animation gets deleted while it's in the middle (which causes all sorts
* of crashes and memory stomping). Now, the cache can delete the proxy while the animation is decoding; the proxy
* will pass on the delete request to the decoder which will cleanup (delete itself) when it's safe to do so.
*
*/
// INCLUDE FILES
#include "config.h"
#include "AnimationDecoder.h"
using namespace WebCore;
// ============================ MEMBER FUNCTIONS ===============================
// -----------------------------------------------------------------------------
//
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
CAnimationDecoder::CAnimationDecoder( CAnimationDecoderWrapped* aDecoder )
: iWrapped(aDecoder)
{
}
// -----------------------------------------------------------------------------
//
// Two-phased constructor.
// -----------------------------------------------------------------------------
CAnimationDecoder* CAnimationDecoder::NewL( ImageObserver* aObs )
{
CAnimationDecoderWrapped* aDecoder = CAnimationDecoderWrapped::NewL( aObs );
CAnimationDecoder* self = new (ELeave) CAnimationDecoder( aDecoder );
return self;
}
// -----------------------------------------------------------------------------
//
// Symbian constructor can leave.
// -----------------------------------------------------------------------------
void CAnimationDecoder::ConstructL( )
{
}
// -----------------------------------------------------------------------------
// Destructor
// -----------------------------------------------------------------------------
CAnimationDecoder::~CAnimationDecoder()
{
if (iWrapped) {
iWrapped->Invalidate();
iWrapped = NULL;
}
}
CMaskedBitmap* CAnimationDecoder::Destination()
{
if (iWrapped)
return(iWrapped->Destination());
return(NULL);
}
// -----------------------------------------------------------------------------
// OpenL
// -----------------------------------------------------------------------------
void CAnimationDecoder::OpenL( WebCore::SharedBuffer* aData, TDesC* aMIMEType, TBool aIsComplete )
{
if (!iWrapped) {
return;
}
TRAPD(err, iWrapped->OpenL(aData, aMIMEType, aIsComplete));
if (err != KErrNone) {
delete iWrapped;
iWrapped = NULL;
}
User::LeaveIfError(err);
}
TSize CAnimationDecoder::Size() const
{
if (iWrapped)
return(iWrapped->Size());
TSize t;
return(t);
}
TInt CAnimationDecoder::AnimationFrameCount() const
{
if (iWrapped)
return(iWrapped->AnimationFrameCount());
return(-1);
}
TInt16 CAnimationDecoder::getLoopCount()
{
if (iWrapped)
return(iWrapped->getLoopCount());
return(-1);
}
TBool CAnimationDecoder::isSizeAvailable() const
{
if (iWrapped)
return(iWrapped->isSizeAvailable());
return(EFalse);
}
TInt CAnimationDecoder::LoadFrame(TInt aFrameIndex)
{
if (iWrapped)
return(iWrapped->LoadFrame(aFrameIndex));
return(-1);
}
TBool CAnimationDecoder::decodeInProgress() const
{
if (iWrapped)
return(iWrapped->decodeInProgress());
return(EFalse);
}
// End of File