photosgallery/controllers/imageviewer/src/glximageviewermanager.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 19 Aug 2010 09:55:03 +0300
branchRCL_3
changeset 24 ea65f74e6de4
parent 19 420f6808bf21
permissions -rw-r--r--
Revision: 201031 Kit: 201033

/*
 * Copyright (c) 2008-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:    CGlxImageViewerManager implementation
 *
 */


#include "glximageviewermanager.h"
#include <glxsingletonstore.h>
#include <glxtracer.h>
#include <glxlog.h>

#include <f32file.h>
#include <caf/manager.h>
#include <caf/content.h>
#include <driveinfo.h>
#include <coeutils.h>
#include <coemain.h>

_LIT( KPrivateFolder, "\\Private\\" );
_LIT( KGifFileMime, "image/gif" );
_LIT( KMbmFileExt, "image/x-epoc-mbm");
_LIT( KTempFilePath, "?:\\data\\images\\" );
    
EXPORT_C CGlxImageViewerManager* CGlxImageViewerManager::InstanceL()
    {
    TRACER("CGlxImageViewerManager::InstanceL()");
    return CGlxSingletonStore::InstanceL(&NewL);
    }

EXPORT_C void CGlxImageViewerManager::DeleteInstance()
    {
    TRACER("CGlxImageViewerManager::DeleteInstance()");
    CGlxSingletonStore::Close(this);
    }

EXPORT_C HBufC* CGlxImageViewerManager::ImageUri()
    {
    TRACER("CGlxImageViewerManager::ImageUri()");    
    return iImageUri;
    }

EXPORT_C RFile64& CGlxImageViewerManager::ImageFileHandle()
    {
    TRACER("CGlxImageViewerManager::ImageFileHandle()");    
    return *iFile;
    }

EXPORT_C TBool CGlxImageViewerManager::IsPrivate()
    {
    TRACER("CGlxImageViewerManager::IsPrivate()");    
    return iIsPrivate;
    }

EXPORT_C TBool CGlxImageViewerManager::IsPrivateGif()
    {
    TRACER("CGlxImageViewerManager::IsPrivateGif()");    
    return iIsPrivateGif;
    }

CGlxImageViewerManager::CGlxImageViewerManager()
    : iImageUri(NULL), iFile(NULL), iIsPrivate(EFalse)
    {
    TRACER("CGlxImageViewerManager::CGlxImageViewerManager()");
    // No implementation required
    }

CGlxImageViewerManager::~CGlxImageViewerManager()
    {
    TRACER("CGlxImageViewerManager::~CGlxImageViewerManager()");
    Reset();
    }

CGlxImageViewerManager* CGlxImageViewerManager::NewLC()
    {
    TRACER("CGlxImageViewerManager::NewLC()");
    CGlxImageViewerManager* self = new (ELeave) CGlxImageViewerManager();
    CleanupStack::PushL(self);
    self->ConstructL();
    return self;
    }

CGlxImageViewerManager* CGlxImageViewerManager::NewL()
    {
    TRACER("CGlxImageViewerManager::NewL()");
    CGlxImageViewerManager* self = CGlxImageViewerManager::NewLC();
    CleanupStack::Pop(self);
    return self;
    }

void CGlxImageViewerManager::ConstructL()
    {
    TRACER("CGlxImageViewerManager::ConstructL()");
    }

// ---------------------------------------------------------------------------
// SetImageUri
// ---------------------------------------------------------------------------
//
EXPORT_C void CGlxImageViewerManager::SetImageUriL(const TDesC& aFileName)
    {
    TRACER("void CGlxImageViewerManager::SetImageUriL()");    
    GLX_LOG_URI("CGlxImageViewerManager::SetImageUriL(%S)", &aFileName);
    if ( iImageUri )
        {
        delete iImageUri;
        iImageUri = NULL;
        }
    if (aFileName.Length() == 0)
        {
        User::Leave(KErrNotSupported);    
        }
    iImageUri = aFileName.AllocL();  
    CreateImageDecoderL();
    }

// ---------------------------------------------------------------------------
// Reset
// ---------------------------------------------------------------------------
//
EXPORT_C void CGlxImageViewerManager::Reset()
    {
    TRACER("void CGlxImageViewerManager::Reset()");
    if( iFile )
        {
        iFile->Close();
        }
    delete iFile;
    iFile = NULL;

	CloseImageDecoder();

    if (iIsPrivateGif)
        {
        iManager->DeleteFile(iImageUri->Des());
        iIsPrivateGif = EFalse;
        }

    if ( iManager )
        {
        delete iManager;
        iManager = NULL;
        }
    
    if ( iImageUri )
        {
        delete iImageUri;
        iImageUri = NULL;
        }
    iIsPrivate = EFalse;
    }

// ---------------------------------------------------------------------------
// SetImageFileHandleL
// ---------------------------------------------------------------------------
//
EXPORT_C void CGlxImageViewerManager::SetImageFileHandleL(const RFile& aFileHandle)
    {
    TRACER("void CGlxImageViewerManager::SetImageFileHandleL()");
    TFileName filePath;
    User::LeaveIfError(aFileHandle.FullName(filePath));
    TParsePtrC parse(filePath);
    if (parse.PathPresent() && parse.Path().Length()
            > KPrivateFolder().Length() && parse.Path().Left(
            KPrivateFolder().Length()).CompareF(KPrivateFolder) == 0)
        {
        // File is in private folder; duplicate file handle
        iFile = new (ELeave) RFile64;
        User::LeaveIfError(iFile->Duplicate(aFileHandle));
        iIsPrivate = ETrue;

        // Better to use contentaccess as we need to deal with DRM files
        TBuf<KMaxName> mimeBuf;
        ContentAccess::CContent* content = ContentAccess::CContent::NewLC(
                *iFile);
        TInt err(content->GetStringAttribute(ContentAccess::EMimeType,
                mimeBuf));
        CleanupStack::PopAndDestroy(content);

        // Gif / MBM file from private path, hence make a local copy.
        if (mimeBuf.Compare(KGifFileMime) == 0
                || mimeBuf.Compare(KMbmFileExt) == 0)
            {
            TFileName ramFilePath;
            ramFilePath.Copy(KTempFilePath);
            ramFilePath.Append(parse.NameAndExt());

            TChar drive;
            User::LeaveIfError(DriveInfo::GetDefaultDrive(
                    DriveInfo::EDefaultRam, drive));
            ramFilePath[0] = drive;
            ConeUtils::EnsurePathExistsL(ramFilePath);
            if (!iManager)
                {
                iManager = ContentAccess::CManager::NewL();
                }
            iManager->CopyFile(*iFile, ramFilePath);
            filePath.Copy(ramFilePath);
            iIsPrivateGif = ETrue;
            }
        }
    SetImageUriL( filePath );
    }

// ---------------------------------------------------------------------------
// CloseImageDecoder
// ---------------------------------------------------------------------------
//
EXPORT_C void CGlxImageViewerManager::CloseImageDecoder()
    {
    TRACER("void CGlxImageViewerManager::CloseImageDecoder()");
    if (iImageDecoder)
        {
        delete iImageDecoder;
        iImageDecoder = NULL;
        }
    }

// ---------------------------------------------------------------------------
// CreateImageDecoderL
// ---------------------------------------------------------------------------
//
EXPORT_C void CGlxImageViewerManager::CreateImageDecoderL()
    {
    TRACER("void CGlxImageViewerManager::CreateImageDecoderL()");

    CloseImageDecoder();

    TInt err = KErrNone;
    if (IsPrivate())
        {
        if (&ImageFileHandle())
            {
            GLX_DEBUG1("CGlxImageViewerManager::CreateImageDecoderL() FH");
            TRAP(err, iImageDecoder = CImageDecoder::FileNewL(
                    ImageFileHandle(), ContentAccess::EPeek));
            }
        }
    else
        {
        if (ImageUri())
            {
            GLX_DEBUG1("CGlxImageViewerManager::CreateImageDecoderL() FN");
            TRAP(err, iImageDecoder = CImageDecoder::FileNewL(
                    CCoeEnv::Static()->FsSession(), ImageUri()->Des()));
            }
        }

    GLX_DEBUG2("CGlxImageViewerManager::CreateImageDecoderL() err(%d)", err);
    User::LeaveIfError(err);
    }