--- /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