upnpsharing/upnpdlnaprofiler/src/upnpimagesolverbase.cpp
changeset 0 7f85d04be362
child 38 5360b7ddc251
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/upnpsharing/upnpdlnaprofiler/src/upnpimagesolverbase.cpp	Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,262 @@
+/*
+* Copyright (c) 2006-2007 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:      Implementation of base DLNA profile resolver class for image 
+*                files.
+*
+*/
+
+
+
+
+
+
+// system includes
+#include <imageconversion.h>
+#include <caf/caftypes.h> // ContentAccess
+#include <badesca.h> // CDesC16ArrayFlat
+
+// user includes
+#include "upnpimagesolverbase.h"
+
+_LIT( KComponentLogfile, "dlnaprofiler.txt");
+#include "upnplog.h"
+
+// constants
+_LIT8( KImageJpeg, "image/jpeg" );
+_LIT( KJpeg_sm, "JPEG_SM" );
+_LIT( KJpeg_med, "JPEG_MED" );
+_LIT( KJpeg_lrg, "JPEG_LRG" );
+
+_LIT( KJpeg_tn, "JPEG_TN" );
+_LIT( KJpeg_lrg_ico, "JPEG_LRG_ICO" );
+_LIT( KJpeg_sm_ico, "JPEG_SM_ICO" );
+
+_LIT8( KImagePng, "image/png" );
+_LIT( KPngLrg, "PNG_LRG" );
+
+
+const TInt KJpeg_smico_max_width = 48;
+const TInt KJpeg_smico_max_height = 48;
+const TInt KJpeg_lrgico_max_width = 120;
+const TInt KJpeg_lrgico_max_height = 120;
+const TInt KJpeg_sm_max_width = 640;
+const TInt KJpeg_sm_max_height = 480;
+const TInt KJpeg_med_max_width = 1024;
+const TInt KJpeg_med_max_height = 768;
+const TInt KJpeg_lrg_max_width = 4096;
+const TInt KJpeg_lrg_max_height = 4096;
+const TInt KPng_lrg_max_width = 4096;
+const TInt KPng_lrg_max_height = 4096;
+
+// ======== LOCAL FUNCTIONS ========
+// NONE
+
+// ======== MEMBER FUNCTIONS ========
+
+// --------------------------------------------------------------------------
+// CUpnpImageSolverBase C++ constructor
+// --------------------------------------------------------------------------
+//
+CUpnpImageSolverBase::CUpnpImageSolverBase()
+    {
+    __LOG( "[UPnPDlnaProfiler] CUpnpImageSolverBase constructor" );
+    }
+    
+// --------------------------------------------------------------------------
+// CUpnpImageSolverBase::ConstructL
+// --------------------------------------------------------------------------
+//
+void CUpnpImageSolverBase::ConstructL()
+    {
+    __LOG( "[UPnPDlnaProfiler] CUpnpImageSolverBase::ConstructL" );
+    }
+
+
+// --------------------------------------------------------------------------
+// CUpnpImageSolverBase::NewL
+// --------------------------------------------------------------------------
+//
+CUpnpImageSolverBase* CUpnpImageSolverBase::NewL()
+    {
+    __LOG( "[UPnPDlnaProfiler] CUpnpImageSolverBase::NewL" );
+    CUpnpImageSolverBase* self = CUpnpImageSolverBase::NewLC();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// --------------------------------------------------------------------------
+// CUpnpImageSolverBase::NewLC
+// --------------------------------------------------------------------------
+//
+CUpnpImageSolverBase* CUpnpImageSolverBase::NewLC()
+    {
+    __LOG( "[UPnPDlnaProfiler] CUpnpImageSolverBase::NewLC" );
+    CUpnpImageSolverBase* self = new( ELeave ) CUpnpImageSolverBase;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+
+// --------------------------------------------------------------------------
+// CUpnpImageSolverBase destructor
+// --------------------------------------------------------------------------
+//
+CUpnpImageSolverBase::~CUpnpImageSolverBase()
+    {
+    __LOG( "[UPnPDlnaProfiler] CUpnpImageSolverBase destructor" );
+    }
+
+// --------------------------------------------------------------------------
+// From class MUpnpProfiler.
+// SupportedProfilesL returns DLNA profiles that are currently supported.
+// --------------------------------------------------------------------------
+//
+TInt CUpnpImageSolverBase::SupportedProfilesL( 
+                                        CDesC16ArrayFlat* aProfiles ) const
+    {
+    __LOG( "[UPnPDlnaProfiler] CUpnpImageSolverBase::\
+SupportedProfilesL" );
+    TInt retval = KErrNone;
+    
+    if ( !aProfiles ) 
+        {
+        // Invalid parameter
+        retval = KErrArgument;
+        }
+    else 
+        {
+        // append all new profiles recognized by this solver
+        // do not allow duplicates
+        TInt tempPos = KErrNotFound;
+        
+        if ( aProfiles->Find( KJpeg_sm(), tempPos, ECmpFolded ) ) 
+            {
+            aProfiles->AppendL( KJpeg_sm() );
+            }
+        if ( aProfiles->Find( KJpeg_med(), tempPos, ECmpFolded ) ) 
+            {
+            aProfiles->AppendL( KJpeg_med() );
+            }
+        if ( aProfiles->Find( KJpeg_lrg(), tempPos, ECmpFolded ) ) 
+            {
+            aProfiles->AppendL( KJpeg_lrg() );
+            }
+        if ( aProfiles->Find( KPngLrg(), tempPos, ECmpFolded ) ) 
+            {
+            aProfiles->AppendL( KPngLrg() );
+            }
+        if ( aProfiles->Find( KJpeg_tn(), tempPos, ECmpFolded ) ) 
+            {
+            aProfiles->AppendL( KJpeg_tn() );
+            }            
+        if ( aProfiles->Find( KJpeg_lrg_ico(), tempPos, ECmpFolded ) ) 
+            {
+            aProfiles->AppendL( KJpeg_lrg_ico() );
+            }            
+        if ( aProfiles->Find( KJpeg_sm_ico(), tempPos, ECmpFolded ) ) 
+            {
+            aProfiles->AppendL( KJpeg_sm_ico() );
+            }            
+
+
+        }    
+
+    return retval;
+    }
+    
+// --------------------------------------------------------------------------
+// From class MUpnpProfiler.
+// ProfileForFileL is for resolving a DLNA profile of a given file. Besides 
+// of file name, also mime type of the file is passed as a parameter in order 
+// to avoid re-opening the file.
+// --------------------------------------------------------------------------
+//
+HBufC* CUpnpImageSolverBase::ProfileForFileL( const TDesC& /*aFilename*/, 
+                                              const TDesC8& aMimetype, 
+                                              RFile& aFile )
+    {
+    __LOG( "[UPnPDlnaProfiler] CUpnpImageSolverBase::ProfileForFileL" );
+    HBufC* retval = NULL;
+       
+
+    CImageDecoder* imageDecoder = CImageDecoder::FileNewL(
+                                                    aFile,
+                                                    aMimetype,
+                                                    ContentAccess::EPeek );
+    
+    CleanupStack::PushL( imageDecoder );
+
+    TSize imageResolution = imageDecoder->FrameInfo().iOverallSizeInPixels;
+
+    if ( aMimetype.Compare( KImageJpeg() ) == 0 ) 
+        {        
+        // assuming here that thumbnails are not supported and that we do 
+        // not use device icons or at least we do not resolve DLNA profile 
+        // of device icons with this component.
+
+        if ( imageResolution.iWidth <= KJpeg_smico_max_width && 
+             imageResolution.iHeight <= KJpeg_smico_max_height ) 
+            {
+            retval = HBufC::NewL( KJpeg_sm_ico().Length() );
+            retval->Des().Append( KJpeg_sm_ico() );
+            }
+        else if ( imageResolution.iWidth <= KJpeg_lrgico_max_width && 
+             imageResolution.iHeight <= KJpeg_lrgico_max_height ) 
+            {
+            retval = HBufC::NewL( KJpeg_lrg_ico().Length() );
+            retval->Des().Append( KJpeg_lrg_ico() );
+            }
+        else if ( imageResolution.iWidth <= KJpeg_sm_max_width && 
+             imageResolution.iHeight <= KJpeg_sm_max_height ) 
+            {
+            retval = HBufC::NewL( KJpeg_sm().Length() );
+            retval->Des().Append( KJpeg_sm() );
+            }
+        else if ( imageResolution.iWidth <= KJpeg_med_max_width && 
+                  imageResolution.iHeight <= KJpeg_med_max_height )
+            {
+            retval = HBufC::NewL( KJpeg_med().Length() );
+            retval->Des().Append( KJpeg_med() );
+            }
+        else if ( imageResolution.iWidth <= KJpeg_lrg_max_width && 
+                  imageResolution.iHeight <= KJpeg_lrg_max_height )
+            {
+            retval = HBufC::NewL( KJpeg_lrg().Length() );
+            retval->Des().Append( KJpeg_lrg() );
+            }
+
+        }
+    else if ( aMimetype.Compare( KImagePng() ) == 0 ) 
+        {
+        // assuming here that thumbnails are not supported and that we do 
+        // not use device icons or at least we do not resolve DLNA profile 
+        // of device icons with this component. This leads to profiling all
+        // png-files as PNG_LRG in case their size is less than 4096x4096.
+        if ( imageResolution.iWidth <= KPng_lrg_max_width && 
+             imageResolution.iHeight <= KPng_lrg_max_height )
+            {
+            retval = HBufC::NewL( KPngLrg().Length() );
+            retval->Des().Append( KPngLrg() );
+            }
+        }
+        
+    // clean up
+    CleanupStack::PopAndDestroy( imageDecoder );
+      
+    return retval;
+    }
+
+// end of file