diff -r 3104fc151679 -r 9a48e301e94b uiservicetab/vimpstui/src/cvimpstuiavatarselectionhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uiservicetab/vimpstui/src/cvimpstuiavatarselectionhandler.cpp Wed Sep 01 12:33:36 2010 +0100 @@ -0,0 +1,408 @@ +/* +* 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: avatar selection handler + * +*/ + + + + +// INCLUDE FILES +#include "cvimpstuiavatarselectionhandler.h" +#include "vimpstui.hrh" +#include "vimpstutilsdialog.h" +#include "tvimpstconsts.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // content access +#include "uiservicetabtracer.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CAvatarSelectionHandler::CAvatarSelectionHandler +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CAvatarSelectionHandler::CAvatarSelectionHandler() +: CActive( CActive::EPriorityLow ) + { + CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------------- +// CAvatarSelectionHandler::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CAvatarSelectionHandler::ConstructL() + { + TRACER_AUTO; + User::LeaveIfError(iApaSession.Connect() ); + + // create dochandler + iDocHandler = CDocumentHandler::NewL(); + iDocHandler->SetExitObserver( this); + } + +// ----------------------------------------------------------------------------- +// CAvatarSelectionHandler::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CAvatarSelectionHandler* CAvatarSelectionHandler::NewLC() + + { + TRACER_AUTO; + CAvatarSelectionHandler* self = new( ELeave ) CAvatarSelectionHandler(); + + CleanupStack::PushL(self); + self->ConstructL(); + + return self; + } + +// Destructor +CAvatarSelectionHandler::~CAvatarSelectionHandler() + { + Cancel(); + + delete iDecoder; + iDecoder = NULL; + + delete iDocHandler; + iDocHandler = NULL; + + iApaSession.Close(); + if (iWait.IsStarted() ) + { + iWait.AsyncStop(); + } + delete iMimeType; + } + +//----------------------------------------------------------------------------- +// CAvatarSelectionHandler::RunL +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +void CAvatarSelectionHandler::RunL() + { + if (iWait.IsStarted() ) + { + iWait.AsyncStop(); + } + } + +//----------------------------------------------------------------------------- +// CAvatarSelectionHandler::DoCancel +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +void CAvatarSelectionHandler::DoCancel() + { + iDecoder->Cancel(); + } + +//----------------------------------------------------------------------------- +// CAvatarSelectionHandler::RunError +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +TInt CAvatarSelectionHandler::RunError(TInt aError) + { + if (IsActive() ) + { + iStatus = aError; + Cancel(); + } + + if (aError == KErrNoMemory) + { + CActiveScheduler::Current()->Error(KErrNoMemory); + } + + return KErrNone; + } + +// --------------------------------------------------------- +// CAvatarSelectionHandler::HandleServerAppExit +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CAvatarSelectionHandler::HandleServerAppExit(TInt aReason) + { + TRACER_AUTO; + iServerAppExitReason = aReason; + if (iWait.IsStarted() ) + { + iWait.AsyncStop(); + } + } + +// --------------------------------------------------------- +// CAvatarSelectionHandler::VerifySelectedFilesL +// (other items were commented in a header). +// --------------------------------------------------------- +// +TBool CAvatarSelectionHandler::VerifySelectedFilesL( const MDesCArray* aSelectedFiles ) + + { + TRACER_AUTO; + if( aSelectedFiles && aSelectedFiles->MdcaCount() ) + { + TPtrC filename( aSelectedFiles->MdcaPoint(0) ); // since muliselection is not allowed + //take the only file in the array + TInt value( KErrNone ); + ContentAccess::CContent* content = ContentAccess::CContent::NewL( filename ); + // check for protetected image + TInt err( content->GetAttribute( ContentAccess::EIsProtected, value ) ); + delete content; + + if( err == KErrNone && value ) // protected + { + // show note + ShowErrorL(EProtected); + } + else // not protected + { + delete iDecoder; // delete decoder if there is any + iDecoder = NULL; + + TInt params(CImageDecoder::EPreferFastDecode); + TRAPD( err, iDecoder = CImageDecoder::FileNewL( + CEikonEnv::Static()->FsSession(),filename, + static_cast(params) )); + if( err == KErrNone ) + { + // file seems ok, try to decode image + CFbsBitmap* bitmap = new (ELeave) CFbsBitmap(); + CleanupStack::PushL( bitmap ); + + TFrameInfo frame = iDecoder->FrameInfo(); + TSize decodeSize( 60,60 ); + + TInt bitmaperr = bitmap->Create( decodeSize, frame.iFrameDisplayMode ); + + if( bitmaperr ) + { // any bit mapp error throw error and return EFalse + CActiveScheduler::Current()->Error( bitmaperr ); + CleanupStack::PopAndDestroy( bitmap ); + return EFalse; + } + // start converting + iDecoder->Convert( &iStatus, *bitmap ); + if( !IsActive() ) + { + SetActive(); + } + + // and wait until it's finished + if( !iWait.IsStarted() ) + { + iWait.Start(); // iWait is not an active object + } + + TInt statuscode = iStatus.Int(); + CleanupStack::PopAndDestroy( bitmap ); + + if( statuscode == KErrCorrupt ) // image corrupted + { + // show note + ShowErrorL( ECorrupted ); + return EFalse; + } + + return ETrue; // selected file is ok ,return ETrue + } + else + { + ShowErrorL( ECorrupted ); + } + + } + + } + return EFalse; // no files or protected file return EFalse + } + +// --------------------------------------------------------- +// CAvatarSelectionHandler::DecodeSize +// (other items were commented in a header). +// --------------------------------------------------------- +// +TSize CAvatarSelectionHandler::DecodeSize(const TSize& aSize) + { + TRACER_AUTO; + // 1:1 is always valid ratio for decode scaling + TInt lastValidRatio( 1); + for (TInt ratio(KDecodeScaleRatioMin); ratio <= KDecodeScaleRatioMax; ratio<<= 1) + { + if (aSize.iWidth % ratio + aSize.iHeight % ratio == 0) + { + // this ratio is valid + lastValidRatio = ratio; + } + } + + // return the size scaled with correct ratio + return TSize(aSize.iWidth / lastValidRatio, aSize.iHeight + / lastValidRatio); + } + +// --------------------------------------------------------- +// CAvatarSelectionHandler::HandleAvatarSelectionL() +// (other items were commented in a header). +// --------------------------------------------------------- +// +HBufC* CAvatarSelectionHandler::HandleAvatarSelectionL(TInt aCommand ) + { + TRACER_AUTO; + HBufC* selectedFile = NULL; + switch (aCommand) + { + case ECmdAvatarGallery: + { + CDesCArray* files = new( ELeave )CDesCArrayFlat(1); + CleanupStack::PushL(files); + CDesCArray* mimeTypes = new ( ELeave ) CDesCArrayFlat(1 ); + CleanupStack::PushL( mimeTypes ); + + mimeTypes->AppendL( KJPegType ); + mimeTypes->AppendL( KGifType ); + mimeTypes->AppendL( KPngType ); + + HBufC* softkey = CCoeEnv::Static()->AllocReadResourceLC( + R_QTN_SERVTAB_GALLERY_LSK_SELECT); + + HBufC* title = CCoeEnv::Static()->AllocReadResourceLC( + R_QTN_SERVTAB_GALLERY_TITLE_AVATAR); + // This is to clear the NaviPane(Pane where Service Tabs are displayed) + // before launching the avatar selection dialogue from photos fetcher. + // since photos fetcher does't take care of clearing the Navi pane. + CEikStatusPane* statusPane = CEikonEnv::Static()->AppUiFactory()->StatusPane(); // Get the StatusPane + CAknNavigationControlContainer* naviPane = static_cast(statusPane->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) ); + CAknNavigationDecorator* naviDecoration = naviPane->Top(); // Get the current NaviPane + naviPane->PushDefaultL( EFalse ); // Clear the NaviPane + // Launching Avatar Selection + if (MGFetch::RunL( *files, EImageFile, EFalse, *softkey, + *title, mimeTypes , NULL) ) + { + if(VerifySelectedFilesL(files)) + { + selectedFile = (files->MdcaPoint(0)).AllocL(); // alloclate for first filename + StoreMimeTypeL(*selectedFile); // get the mime type and store + } + } + CleanupStack::PopAndDestroy( 4); // title, softkey ,mimeTypes ,files + naviPane->PushL(*naviDecoration); // Restoring the previous Navipane + break; + } + case ECmdAvatarNewPhoto: + { + CDesCArray* fileNames = new( ELeave )CDesCArrayFlat(1); + CleanupStack::PushL(fileNames); + CNewFileServiceClient* newFile = NewFileServiceFactory::NewClientL(); + CleanupStack::PushL(newFile); + + CAiwGenericParamList* params = CAiwGenericParamList::NewLC(); + + + TBool okToSend = EFalse; + TRAPD( err, okToSend = + newFile->NewFileL( *fileNames, params, ENewFileServiceImage, EFalse ) ); + + if (err) + { + // restore state + User::LeaveIfError(err); + } + + if (okToSend) + { + selectedFile = ( fileNames->MdcaPoint(0)).AllocL(); // alloclate for first filename + StoreMimeTypeL(*selectedFile); // get the mime type and store + } + + CleanupStack::PopAndDestroy( 3, fileNames); // params, newFile, fileNames + + break; + } + } + return selectedFile; + } +// --------------------------------------------------------- +// CAvatarSelectionHandler::ShowErrorL +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CAvatarSelectionHandler::ShowErrorL(TErrorType aErrorType) + { + TRACER_AUTO; + switch( aErrorType ) + { + case EProtected: + { + HBufC* prompt = StringLoader::LoadLC( R_QTN_SERVTAB_GALLERY_ERROR_DRMFILE ); + VIMPSTUtilsDialog::DisplayErrorNoteL( *prompt ) ; + CleanupStack::PopAndDestroy(prompt); + break; + } + case ECorrupted: + { + HBufC* prompt = StringLoader::LoadLC( R_QTN_SERVTAB_GALLERY_ERROR_BADFILE ); + VIMPSTUtilsDialog::DisplayErrorNoteL( *prompt ) ; + CleanupStack::PopAndDestroy(prompt); + break; + } + } + + } + +// --------------------------------------------------------- +// CAvatarSelectionHandler::MimeTypeL +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CAvatarSelectionHandler::StoreMimeTypeL(const TDesC& aFilename) + { + TRACER_AUTO; + TUid dummyUid( KNullUid ); + TDataType dataType; + User::LeaveIfError( iApaSession.AppForDocument( + aFilename, + dummyUid, dataType ) ); + + iMimeType = dataType.Des8().AllocL(); + } + +// --------------------------------------------------------- +// CAvatarSelectionHandler::MimeTypeL +// (other items were commented in a header). +// --------------------------------------------------------- +// +const TDesC8& CAvatarSelectionHandler::MimeTypeL() + { + return *iMimeType; + } +// End of File