diff -r 000000000000 -r 7f85d04be362 upnpsharing/upnpdlnaprofiler/src/upnpimagesolverbase.cpp --- /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 +#include // ContentAccess +#include // 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