phoneclientserver/phoneserver/Src/ImageHandler/cphsrvimagesaver.cpp
changeset 0 ff3b6d0fd310
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneclientserver/phoneserver/Src/ImageHandler/cphsrvimagesaver.cpp	Tue Feb 02 01:11:09 2010 +0200
@@ -0,0 +1,210 @@
+/*
+* Copyright (c) 2008 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:  Image saver implementation
+*
+*/
+
+
+#include "cphsrvimagesaver.h"
+#include "mphsrvimagesaverobserver.h"
+#include <imageconversion.h>
+#include <f32file.h>
+#include <bitmaptransforms.h>
+
+// primary file name for VT image
+_LIT( KPhSrvPrimaryVtImageFileName, "vtstillimage1" );
+
+// file name used if primary file is in use while save occurs
+_LIT( KPhSrvAlternateVtImageFileName, "vtstillimage2" );
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// 1st constructor
+// ---------------------------------------------------------------------------
+//
+CPhSrvImageSaver* CPhSrvImageSaver::NewL( 
+        RFs& aFs,
+        const TFileName& aPrivatePath, 
+        MPhSrvImageSaverObserver& aObserver )
+    {
+    CPhSrvImageSaver* saver = new ( ELeave ) CPhSrvImageSaver( 
+        aFs, aPrivatePath, aObserver );
+    CleanupStack::PushL( saver );
+    saver->ConstructL();
+    CleanupStack::Pop();
+    return saver;
+    }
+
+// ---------------------------------------------------------------------------
+// destructor
+// ---------------------------------------------------------------------------
+//
+CPhSrvImageSaver::~CPhSrvImageSaver()
+    {
+    delete iImageDecoder;
+    delete iFileManager;
+    delete iScaler;
+    }
+
+// ---------------------------------------------------------------------------
+// Saves image
+// 1) decode from file
+// 2a) scale (for single frame images) and save to phone server private dir, or
+// 2b) multiframe image - copy file as is to phone server private directory
+// ---------------------------------------------------------------------------
+//
+void CPhSrvImageSaver::SaveImageL( const TDesC& aFileName )
+    {
+    if ( IsActive() )
+        {
+        User::Leave( KErrInUse );
+        }
+    iImageDecoder = CImageDecoder::FileNewL( iFs, aFileName );
+    const TInt frameCount = iImageDecoder->FrameCount();
+    if ( frameCount > 1 )
+        {
+        // decoder not needed because image is copied as is
+        delete iImageDecoder;
+        iImageDecoder = NULL;
+        CopyImageL( aFileName );
+        }
+    else if ( frameCount == 1 )
+        {
+        ScaleImageL();
+        }
+    else
+        {
+        // invalid image?
+        User::Leave( KErrCorrupt );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Copies the file
+// ---------------------------------------------------------------------------
+//
+void CPhSrvImageSaver::CopyImageL( const TDesC& aFileName )
+    {
+    TName targetFileName;
+    ConstructVtFileSaveName( aFileName, targetFileName );
+    iFileManager = CFileMan::NewL( iFs );
+    iFileManager->Copy( aFileName, targetFileName, 
+        CFileMan::EOverWrite, iStatus );    
+    }
+
+// ---------------------------------------------------------------------------
+// ScaleImageL
+// ---------------------------------------------------------------------------
+//
+void CPhSrvImageSaver::ScaleImageL()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// Checks if primary file is in use.
+// ---------------------------------------------------------------------------
+//
+TInt CPhSrvImageSaver::IsPrimaryFileInUse( TBool& aIsInUse )
+    {
+    CDir* entries = NULL;
+    TInt res = iFs.GetDir( iPath, KEntryAttNormal, EDirsLast, entries );
+    if ( res == KErrNone && entries )
+        {
+        const TInt entryCount( entries->Count() );
+        for ( TInt index = 0; index < entryCount; index++ )
+            {
+            const TEntry& entry = ( *entries )[index];            
+            if ( entry.iName.Compare( KPhSrvPrimaryVtImageFileName() ) >= 0 )
+                {
+                // primary file name matches with directory entry (extension
+                // depends on file format)
+                res = iFs.IsFileOpen( entry.iName, aIsInUse );
+                index = entryCount; // break loop
+                }
+            }
+        }
+    delete entries;
+    return res;
+    }
+    
+// ---------------------------------------------------------------------------
+// Constructs target file name for VT still image. Alternate name is used if
+// file with primary name is open.
+// ---------------------------------------------------------------------------
+//
+TInt CPhSrvImageSaver::ConstructVtFileSaveName(
+    const TDesC& aSourceFileName, 
+    TName& aTargetFileName )
+    {
+    TBool inUse( EFalse );
+    TInt res( IsPrimaryFileInUse( inUse ) );
+    if ( res == KErrNone )
+        {
+        TParse sourceName;
+        sourceName.Set( aSourceFileName, NULL, NULL );
+        aTargetFileName = iPath;        
+        if ( inUse )
+            {
+            // primary file in use (open), use alternalte name
+            aTargetFileName.Append( KPhSrvAlternateVtImageFileName() );
+            }
+        else
+            {
+            aTargetFileName.Append( KPhSrvPrimaryVtImageFileName() );
+            }
+        aTargetFileName.Append( sourceName.Ext() );
+        }
+    return res;
+    }
+    
+// ---------------------------------------------------------------------------
+// CPhSrvImageSaver::RunL
+// ---------------------------------------------------------------------------
+//
+void CPhSrvImageSaver::RunL()
+    {
+    iObserver.ImageSaved( iStatus.Int() );
+    }
+    
+// ---------------------------------------------------------------------------
+// CPhSrvImageSaver::DoCancel
+// ---------------------------------------------------------------------------
+//
+void CPhSrvImageSaver::DoCancel()
+    {
+    iObserver.ImageSaved( KErrCancel );
+    }
+    
+// ---------------------------------------------------------------------------
+// CPhSrvImageSaver::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CPhSrvImageSaver::ConstructL()
+    {
+    User::Leave( KErrNotSupported );
+    }
+    
+// ---------------------------------------------------------------------------
+// c++ constructor
+// ---------------------------------------------------------------------------
+//
+CPhSrvImageSaver::CPhSrvImageSaver( RFs& aFs, const TFileName& aPrivatePath,
+    MPhSrvImageSaverObserver& aObserver) 
+    : CActive( CActive::EPriorityStandard ), 
+    iFs( aFs ), 
+    iPath( aPrivatePath ),
+    iObserver( aObserver )
+    {
+    }