photosgallery/controllers/imageviewer/src/glximageviewermanager.cpp
branchRCL_3
changeset 60 5b3385a43d68
child 75 01504893d9cb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/photosgallery/controllers/imageviewer/src/glximageviewermanager.cpp	Wed Sep 01 12:33:26 2010 +0100
@@ -0,0 +1,262 @@
+/*
+ * 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);
+    }