diff -r 8ee96d21d9bf -r 7e0eff37aedb gssettingsuis/Gs/GSBackgroundImage/Src/BackgroundImage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gssettingsuis/Gs/GSBackgroundImage/Src/BackgroundImage.cpp Wed Sep 01 12:20:44 2010 +0100 @@ -0,0 +1,542 @@ +/* +* Copyright (c) 2005 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: +* +*/ + + + +// INCLUDE FILES +#include "backgroundimage.h" +#include "GsLogger.h" +#include "settingsinternalcrkeys.h" +#include "SettingsPrivateCRKeys.h" + +#include +#include +#include +#include +#include +#include +#include //DRM v2 migration +#include +#include +#include +#include + + + +// CONSTANTS +// Setting values for Background and Welcome note image +const TInt KGSBackgroundModeImage = 1; +// estimated image max size in bytes +const TInt KGSMaxBackgroundImgSize = 520000; +// estimated image max size in bytes +const TInt KGSMaxWelcomeNoteImgSize = 100000; +const TInt KGSVTStillImageWidth = 176; +const TInt KGSVTStillImageHeight = 144; + +//Personalisation application is availble on ROM (1) or not (0) +const TInt KGSPlsnOnRom = 1; +const TInt KGSPlsnNotOnRom = 0; + +// other constants +_LIT( KGSBackgroundImgPath, "c:\\resource\\apps\\backgroundimage.mbm"); +_LIT( KGSVTStillImgPath, "c:\\resource\\apps\\vtstillimage.mbm"); + + + + +// FORWARD DECLARATIONS + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CGSBackgroundImage::CGSBackgroundImage +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CGSBackgroundImage::CGSBackgroundImage() + { + } + +// ----------------------------------------------------------------------------- +// CGSBackgroundImage::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CGSBackgroundImage::ConstructL() + { + iPersonalizationRepository = + CRepository::NewL( KCRUidPersonalizationSettings ); + iStartupConfRepository = CRepository::NewL( KCRUidStartupConf ); + iTelephonyRepository = CRepository::NewL( KCRUidTelephonySettings ); + + iDisplayMode = CEikonEnv::Static()->ScreenDevice()->DisplayMode(); + } + + +// ----------------------------------------------------------------------------- +// CGSBackgroundImage::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CGSBackgroundImage* CGSBackgroundImage::NewL() + { + CGSBackgroundImage* self = new( ELeave ) CGSBackgroundImage; + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + } + + +// ---------------------------------------------------------------------------- +// Destructor +// +//----------------------------------------------------------------------------- +// +CGSBackgroundImage::~CGSBackgroundImage() + { + delete iPersonalizationRepository; + delete iStartupConfRepository; + delete iTelephonyRepository; + } + +// ---------------------------------------------------------------------------- +// CGSBackgroundImage::BackgroundImageL +// +// Returns background image mode. +// DEPRECATED +// ---------------------------------------------------------------------------- +// +EXPORT_C TInt CGSBackgroundImage::BackgroundImageL() + { + TInt image; + User::LeaveIfError( iPersonalizationRepository-> + Get( KSettingsBackgroundImage, image ) ); + return image; + } + +// ---------------------------------------------------------------------------- +// CGSBackgroundImage::SetBackgroundImageL +// +// Sets background image mode. +// DEPRECATED +// ---------------------------------------------------------------------------- +// +EXPORT_C void CGSBackgroundImage::SetBackgroundImageL(const TInt aImage) + { + User::LeaveIfError( iPersonalizationRepository-> + Set( KSettingsBackgroundImage, aImage ) ); + if (aImage != KGSBackgroundModeImage) + { + // It doesn't matter much if the image deletion fails, + // so no need to handle the error. + TRAP_IGNORE( DeleteImageL( KGSBackgroundImgPath ) ); + } + + } + +// ---------------------------------------------------------------------------- +// CGSBackgroundImage::SetBackgroundImagePathL +// +// Sets background image. +// DEPRECATED +// ---------------------------------------------------------------------------- +// +EXPORT_C void CGSBackgroundImage::SetBackgroundImagePathL( + const TDesC& aImagePath ) + { + // Check if there is enough space in disk to store background image + if (SysUtil::FFSSpaceBelowCriticalLevelL(NULL, KGSMaxBackgroundImgSize)) + { + // don't show any own notes here + User::Leave(KErrDiskFull); + } + + // make sure there is no memory leaks because of iBitmap and iDimmedBmp + if (iBitmap) + { + delete iBitmap; + iBitmap = NULL; + } + + iBitmap = new(ELeave) CFbsBitmap; + + TRect appRect = iAvkonAppUi->ApplicationRect(); + TAknLayoutRect layout; + + layout.LayoutRect(appRect, AknLayout::wallpaper_pane()); + LoadImageL(aImagePath, layout.Rect().Width(), layout.Rect().Height(), + ETrue, EGSWallpaperIdle); + TBuf<1> KGSNullParam; + SaveBitmapsL( KGSNullParam, KGSNullParam ); + + delete iBitmap; + iBitmap = NULL; + User::LeaveIfError( iPersonalizationRepository-> + Set( KSettingsBackgroundImagePath, KGSBackgroundImgPath ) ); + } + +// ---------------------------------------------------------------------------- +// CGSBackgroundImage::SetBackgroundImagePathL +// Sets background image. Does not store image to SD +// Overloaded function, takes 2 parameters +// DEPRECATED +// ---------------------------------------------------------------------------- +// +EXPORT_C void CGSBackgroundImage::SetBackgroundImagePathL( + const TDesC& aImagePath, + TDes& aBmpFileName ) + { + SetBackgroundImagePathL( aImagePath, aBmpFileName, EGSWallpaperIdle ); + } + +// ---------------------------------------------------------------------------- +// CGSBackgroundImage::SetBackgroundImagePathL +// Sets background image. Does not store image to SD +// Overloaded function, takes 3 parameters +// DEPRECATED +// ---------------------------------------------------------------------------- +// +EXPORT_C void CGSBackgroundImage::SetBackgroundImagePathL( + const TDesC& aImagePath, + TDes& aBmpFileName, + TGSWallpaperType aWallpaperType ) + { + // Check if there is enough space in disk to store background image + if (SysUtil::FFSSpaceBelowCriticalLevelL(NULL, KGSMaxBackgroundImgSize)) + { + // don't show any own notes here + User::Leave(KErrDiskFull); + } + + // Make sure there is no memory leaks because of iBitmap and iDimmedBmp + if (iBitmap) + { + delete iBitmap; + iBitmap = NULL; + } + + iBitmap = new(ELeave) CFbsBitmap; + + if( aWallpaperType == EGSWallpaperIdle ) + { + //Reading wallpaper size + __GSLOGSTRING( + "[CGSBackgroundImage] SetBackgroundImagePathL |->"); + TRect screenRect( CEikonEnv::Static()->ScreenDevice()->SizeInPixels() ); + TAknLayoutRect appRect; + appRect.LayoutRect( + screenRect, + AknLayout::application_window( screenRect ) ); + TAknLayoutRect mainRectSmall; + mainRectSmall.LayoutRect( + appRect.Rect(), + AknLayout::main_pane( appRect.Rect(), 0, 1, 1 ) ); + TAknLayoutRect layout; + layout.LayoutRect( mainRectSmall.Rect(), AknLayout::wallpaper_pane() ); + + __GSLOGSTRING("[CGSBackgroundImage] SetBackgroundImagePathL"); + LoadImageL(aImagePath, layout.Rect().Width(), layout.Rect().Height(), + ETrue, EGSWallpaperIdle); + } + else if( aWallpaperType == EGSWallpaperPinboard ) + { + //Reading wallpaper size + __GSLOGSTRING("[CGSBackgroundImage] SetBackgroundImagePathL 1"); + + TRect screenRect( CEikonEnv::Static()->ScreenDevice()->SizeInPixels() ); + TAknLayoutRect appRect; + appRect.LayoutRect( + screenRect, + AknLayout::application_window( screenRect ) ); + TAknLayoutRect mainRectSmall; + mainRectSmall.LayoutRect( + appRect.Rect(), + AknLayout::main_pane( appRect.Rect(), 0, 0, 1 ) ); + TAknLayoutRect layout; + + layout.LayoutRect( + mainRectSmall.Rect(), AknLayoutScalable_Apps::bg_pinb_pane(0) ); + + __GSLOGSTRING("[CGSBackgroundImage] SetBackgroundImagePathL 2"); + LoadImageL(aImagePath, layout.Rect().Width(), layout.Rect().Height(), + ETrue, EGSWallpaperPinboard); + __GSLOGSTRING("[CGSBackgroundImage] SetBackgroundImagePathL -|"); + } + + SaveBitmapsL( aBmpFileName, aImagePath ); + + delete iBitmap; + iBitmap = NULL; + } + +// ---------------------------------------------------------------------------- +// CGSBackgroundImage::SetWelcomeNoteImageL +// +// Sets welcome note image's path +// ---------------------------------------------------------------------------- +// +EXPORT_C void CGSBackgroundImage::SetWelcomeNoteImageL(const TDesC& aImagePath, + CGSAsyncImageHandling& aImgHandler ) + { + // Check if there is enough space in disk to store welcome note image + if ( SysUtil::FFSSpaceBelowCriticalLevelL( NULL, KGSMaxWelcomeNoteImgSize ) ) + { + // don't show any own notes here + User::Leave( KErrDiskFull ); + } + + + + TRect screen = iAvkonAppUi->ApplicationRect(); + TInt screenWidth = screen.Width() - 2; + TInt screenHeight = screen.Height() - 2; + + //rescale + aImgHandler.ProcessImageL( aImagePath, screenWidth, screenHeight, + EGSWelcomeNoteImage ); + } + +// ---------------------------------------------------------------------------- +// CGSBackgroundImage::LoadImageL +// Loads an image to bitmap and scales it if it's too large. +// Deprecated +// ---------------------------------------------------------------------------- +// +void CGSBackgroundImage::LoadImageL(const TDesC& /*aImagePath*/, + TInt /*aWidth*/, TInt /*aHeight*/, + TBool /*aBgImage*/, TGSWallpaperType /*aWallpaperType*/) + { + } + + +// ---------------------------------------------------------------------------- +// CGSBackgroundImage::SaveBitmapsL +// Stores background image and dimmed image to the same mbm file. +// ---------------------------------------------------------------------------- +// +void CGSBackgroundImage::SaveBitmapsL( TDes& aBmpFileName, + const TDesC& aOriginalFullname ) + { + RFs fs; + User::LeaveIfError( fs.Connect() ); + CleanupClosePushL( fs ); + + CDirectFileStore* fileStore; + if( aBmpFileName != KNullDesC ) + { + fileStore = CDirectFileStore::ReplaceLC( + fs, aBmpFileName, EFileWrite ); + } + else + { + fileStore = CDirectFileStore::ReplaceLC( + fs, KGSBackgroundImgPath, EFileWrite ); + } + + TUidType uidType( KDirectFileStoreLayoutUid, KMultiBitmapFileImageUid ); + fileStore->SetTypeL( uidType ); + + RStoreWriteStream bmpStream; + TStreamId imgId = bmpStream.CreateLC( *fileStore ); + iBitmap->ExternalizeL( bmpStream ); + + CleanupStack::PopAndDestroy(); //bmpStream + + RStoreWriteStream rootStream; + // create root stream + TStreamId rootStreamId = rootStream.CreateLC( *fileStore ); + rootStream.WriteInt32L( 1 ); // number of bitmaps + + rootStream << imgId; // stream id of bitmap + + CleanupStack::PopAndDestroy(); //rootStream + + fileStore->SetRootL( rootStreamId ); + CleanupStack::PopAndDestroy(); // filestore; + + TBool isprotected( EFalse ); + + DRMCommon* drmclient = DRMCommon::NewL(); + + CleanupStack::PushL( drmclient ); + TInt error = drmclient->Connect(); + if ( error != DRMCommon::EOk ) + { + User::Leave( KErrCorrupt ); + } + + if ( aOriginalFullname != KNullDesC ) + { + error = drmclient->IsProtectedFile( aOriginalFullname, isprotected ); + if ( error != DRMCommon::EOk ) + { + User::Leave( KErrCorrupt ); + } + } + + + if ( isprotected ) + { + HBufC8* contenturi = NULL; + HBufC8* mimetype = NULL; + DRMCommon::TContentProtection contentProtection; + TUint datalen( 0 ); + CDRMRights* rights = NULL; + + + error = drmclient->GetFileInfo( + aOriginalFullname, contentProtection, + mimetype, contenturi, datalen ); + CleanupStack::PushL( mimetype ); + CleanupStack::PushL( contenturi ); + if ( error != DRMCommon::EOk ) + { + User::Leave( KErrCorrupt ); + } + + drmclient->GetActiveRights( + *contenturi, DRMCommon::EDisplay, rights ); + CleanupStack::PushL( rights ); + + RFile file; + User::LeaveIfError( file.Open( fs, aBmpFileName, + EFileWrite|EFileShareAny ) ); + CleanupClosePushL( file ); + + TInt filesize( 0 ); + User::LeaveIfError( file.Size( filesize ) ); + HBufC8* content = HBufC8::NewL( filesize ); // use actual filesize + + CleanupStack::PushL( content ); + + TPtr8 readPtr( content->Des() ); + User::LeaveIfError( file.Read( readPtr ) ); + + CleanupStack::Pop(); // content + COma1DcfCreator* dcfCreator = COma1DcfCreator::NewL(); + dcfCreator->EncryptContentL( content, *mimetype, rights ); + CleanupStack::PushL( content ); + + TInt offset = 0; + User::LeaveIfError( file.Seek( ESeekStart,offset ) ); + TPtr8 writePtr( content->Des() ); + User::LeaveIfError( file.Write( writePtr ) ); + User::LeaveIfError( file.Flush() ); + // mimetype, contenturi, rights, file, content + CleanupStack::PopAndDestroy(5); + delete dcfCreator; + } + + drmclient->Disconnect(); + CleanupStack::PopAndDestroy(2); // fs & drmclient + } + + +// ---------------------------------------------------------------------------- +// CGSBackgroundImage::DeleteImageL +// Deletes file specified in the parameter. +// ---------------------------------------------------------------------------- +// +EXPORT_C void CGSBackgroundImage::DeleteImageL(const TDesC& aImagePath) + { + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + + User::LeaveIfError(fs.Delete(aImagePath)); + + CleanupStack::PopAndDestroy(); // fs + } + +// ---------------------------------------------------------------------------- +// CGSBackgroundImage::SetVTStillImagePathL +// +// Sets VT still image. +// ---------------------------------------------------------------------------- +// +EXPORT_C void CGSBackgroundImage::SetVTStillImagePathL( + const TDesC& aImagePath, + CGSAsyncImageHandling& aImgHandler ) + { + // Check if there is enough space in disk to store still image + if (SysUtil::FFSSpaceBelowCriticalLevelL(NULL, KGSMaxBackgroundImgSize)) + { + // don't show any own notes here + User::Leave(KErrDiskFull); + } + aImgHandler.ProcessImageL( aImagePath, KGSVTStillImageWidth, + KGSVTStillImageHeight, EGSVtStillImage ); + User::LeaveIfError( iTelephonyRepository-> + Set( KSettingsVTStillImagePath, KGSVTStillImgPath ) ); + } + +// ---------------------------------------------------------------------------- +// CGSBackgroundImage::GetPlnsStatus +// +// Check if Personalisation application is on the device +// ---------------------------------------------------------------------------- +// +EXPORT_C TInt CGSBackgroundImage::GetPlnsStatus() + { + TRAP_IGNORE( IsPersonalisationApplicationL() ); + return iPlnsInDevice; + } + +// ---------------------------------------------------------------------------- +// CGSBackgroundImage::IsPersonalisationApplication +// +// +// ---------------------------------------------------------------------------- +// +EXPORT_C void CGSBackgroundImage::IsPersonalisationApplicationL() + { + RApaLsSession session; + User::LeaveIfError( session.Connect() ); + + const TUid KUidPsln = { 0x10005A32 }; + TApaAppInfo appInfo; + TInt search = session.GetAppInfo( appInfo, KUidPsln ); + session.Close(); + + if ( search == KErrNone ) + { + TParse fileInfo; + fileInfo.Set( appInfo.iFullName, NULL, NULL ); + TPtrC drive = fileInfo.Drive(); + _LIT( KZDrive, "Z:" ); + if ( drive == KZDrive ) + { + iPlnsInDevice = KGSPlsnOnRom; + } + else + { + iPlnsInDevice = KGSPlsnNotOnRom; + } + } + else + { + iPlnsInDevice = KErrNotFound; + } + } + + +// End of File