--- /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 <StringLoader.h>
+#include <vimpstuires.rsg>
+#include <NewFileServiceClient.h>
+#include <AiwGenericParam.h>
+#include <MGFetch.h>
+#include <DocumentHandler.h>
+#include <eikenv.h>
+#include <imageconversion.h>
+#include <aknnavi.h>
+#include <aknappui.h>
+#include <avkon.rsg>
+#include <caf/content.h>
+#include <caf/manager.h> // 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<CImageDecoder::TOptions>(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<CAknNavigationControlContainer*>(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