photosgallery/viewframework/commandhandlers/commoncommandhandlers/src/glxcommandhandlersend.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 13 Oct 2010 14:32:09 +0300
branchRCL_3
changeset 75 01504893d9cb
parent 60 5b3385a43d68
permissions -rw-r--r--
Revision: 201039 Kit: 201041

/*
* Copyright (c) 2008-2009 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:    Send commmand handler
*
*/




//  CLASS HEADER
#include "glxcommandhandlersend.h"

//  EXTERNAL INCLUDES
#include <utf.h>							// for CnvUtfConverter
#include <sendui.h>							// for CSendui
#include <sendnorm.rsg>						// for CSendui resources
#include <SendUiConsts.h>					// for CSendui plugin type constants
#include <CMessageData.h>					// for CMessageData
#include <coemain.h>						// for CCoeEnv
#include <StringLoader.h>					// for CStringLoader
#include <bautils.h>						// for BaflUtils
#include <data_caging_path_literals.hrh> 	// for directory and file names

//  INTERNAL INCLUDES
#include <glxcommandhandlers.hrh>			// for EGlxCmdUpload
#include <mglxmedialistprovider.h>
#include <mglxmedialist.h>
#include <glxscreenfurniture.h>             // for ScreenFurniture toolbar
#include <glxuistd.h>						// for KGlxUiUtilitiesResource
#include <glxuiutility.h>					// for HuiUtility
#include <glxlog.h>							// for debug logging
#include <glxattributecontext.h>			// for CGlxDefaultAttributeContext
#include <glxattributeretriever.h>			// for GlxAttributeRetriever
#include <glxuiutilities.rsg>				// for R_GLX_TOOLTIP_SEND
#include <glxfetchcontextremover.h>         // for TGlxFetchContextRemover 
#include <glxresourceutilities.h>           // for CGlxResourceUtilities
#include <glxicons.mbg>
#include <glximageviewermanager.h>          // for CGlxImageViewerManager
#include <glxgeneraluiutilities.h>

// LOCAL FUNCTIONS AND CONSTANTS
namespace
	{
	const TInt KSendMsgBodySz = 0;
	const TInt KSendMsgOverallSz = 1024; // KMaxStringLength from SendUi.h
	// defined locally in the original code... @todo find a definition
	const TUid KSendAsPostcardUID = { 0x101FF961 };	
	}



// ----------------------------------------------------------------------------
// Two-phased constructor.
// ----------------------------------------------------------------------------
EXPORT_C CGlxCommandHandlerSend* CGlxCommandHandlerSend::NewL(
		MGlxMediaListProvider* aMediaListProvider, TBool aHasToolbarItem,
		const TDesC& aFileName)
	{
	GLX_FUNC("CGlxCommandHandlerSend::NewL");
	CGlxCommandHandlerSend* self = new (ELeave) CGlxCommandHandlerSend(
			aMediaListProvider, aHasToolbarItem);
	CleanupStack::PushL(self);
	self->ConstructL(aFileName);
	CleanupStack::Pop(self);
	return self;
	}


// ----------------------------------------------------------------------------
// C++ default constructor 
// ----------------------------------------------------------------------------
CGlxCommandHandlerSend::CGlxCommandHandlerSend(MGlxMediaListProvider* aMediaListProvider, TBool aHasToolbarItem )
					   :CGlxMediaListCommandHandler(aMediaListProvider, aHasToolbarItem)
	{
	// nothing to do
	}			



// ----------------------------------------------------------------------------
// Symbian 2nd phase constructor can leave.
// ----------------------------------------------------------------------------
void CGlxCommandHandlerSend::ConstructL(const TDesC& aFileName)
	{
	GLX_FUNC("CGlxCommandHandlerSend::ConstructL");

	iUiUtility = CGlxUiUtility::UtilityL();
	iSendUi = CSendUi::NewL();

	LoadRscFileL(aFileName);

	// add the Send command
	TCommandInfo info(EGlxCmdSend);
	info.iMinSelectionLength = 1;
	info.iMaxSelectionLength = KMaxTInt;
	AddCommandL(info);
	}	
	

// ----------------------------------------------------------------------------
// Destructor
// ----------------------------------------------------------------------------
EXPORT_C CGlxCommandHandlerSend::~CGlxCommandHandlerSend()
	{
	GLX_FUNC("CGlxCommandHandlerSend::~CGlxCommandHandlerSend");
	if (iResourceOffset)
        {
        CCoeEnv::Static()->DeleteResourceFile(iResourceOffset);
        }
	
	if (iUiUtility)
        {
        iUiUtility->Close();
        }
    delete iSendUi;    
	}
	
	

// ----------------------------------------------------------------------------
// ExecuteL
// ----------------------------------------------------------------------------
TBool CGlxCommandHandlerSend::DoExecuteL(TInt aCommandId, 
													MGlxMediaList& /*aList*/)
	{
    GLX_FUNC("CGlxCommandHandlerSend::DoExecuteL");
	
    if (aCommandId == EGlxCmdSend)
        {
        SendSelectedItemsL();
        return ETrue;
        }
    return EFalse;
	}



// ----------------------------------------------------------------------------
// DoActivateL
// ----------------------------------------------------------------------------
void CGlxCommandHandlerSend::DoActivateL(TInt aViewId)
	{
    GLX_FUNC("CGlxCommandHandlerSend::DoActivateL");

    iViewId = aViewId;
	MGlxMediaList& mediaList = MediaList();

	// need to check the category attribute for image or video
    iAttributeContext = CGlxDefaultAttributeContext::NewL();
    iAttributeContext->AddAttributeL(TMPXAttribute(KMPXMediaGeneralCategory));
    iAttributeContext->AddAttributeL(TMPXAttribute(KMPXMediaGeneralUri));
    mediaList.AddContextL( iAttributeContext, KGlxFetchContextPriorityLow );
    
    mediaList.AddMediaListObserverL(this);
	}




// ----------------------------------------------------------------------------
// Deactivate
// ----------------------------------------------------------------------------
void CGlxCommandHandlerSend::Deactivate()
    {
    GLX_FUNC("CGlxCommandHandlerSend::Deactivate");
    if (iAttributeContext)
        {
        MediaList().RemoveContext(iAttributeContext);
        delete iAttributeContext;
        iAttributeContext = NULL;
        }
        
    MediaList().RemoveMediaListObserver(this);    
    }	
	


// ----------------------------------------------------------------------------
// OfferKeyEventL
// ----------------------------------------------------------------------------
TKeyResponse CGlxCommandHandlerSend::OfferKeyEventL(const TKeyEvent& aKeyEvent, 
															TEventCode aType)
	{
    // Handle the send key
	if (aKeyEvent.iCode == EKeyYes && aType == EEventKey)
		{
		SendSelectedItemsL();
		return EKeyWasConsumed;
		}
	return EKeyWasNotConsumed;		
	}


// ----------------------------------------------------------------------------
// HandleFocusChangedL
// ----------------------------------------------------------------------------
void CGlxCommandHandlerSend::HandleFocusChangedL(
                    NGlxListDefs::TFocusChangeType /*aType*/, 
					TInt aNewIndex, TInt /*aOldIndex*/, MGlxMediaList* aList)
	{
	GLX_FUNC("CGlxCommandHandlerSend::HandleFocusChangedL");
	if ( aList && aNewIndex >= 0 )
		{
		const CGlxMedia* media = aList->Item(aNewIndex).Properties();  
		}	
	}

            


// ----------------------------------------------------------------------------
// SelectedFilesLC
// ----------------------------------------------------------------------------
CMessageData* CGlxCommandHandlerSend::SelectedFilesLC()
	{
	GLX_FUNC("CGlxCommandHandlerSend::SelectedFilesLC");

	// get the focused item from the media list
	MGlxMediaList& mediaList = MediaList();
	
	CMessageData* messageData = CMessageData::NewLC();    
	
	// retrieve the file name and path
	CGlxDefaultAttributeContext* attributeContext = 
										CGlxDefaultAttributeContext::NewL();
    CleanupStack::PushL( attributeContext );
    attributeContext->AddAttributeL( TMPXAttribute( KMPXMediaGeneralUri ) );
    mediaList.AddContextL( attributeContext, KGlxFetchContextPriorityBlocking );
    
    // TGlxContextRemover will remove the context when it goes out of scope
    // Used here to avoid a trap and still have safe cleanup   
    TGlxFetchContextRemover contextRemover( attributeContext, mediaList );
    CleanupClosePushL( contextRemover );
    
	User::LeaveIfError(GlxAttributeRetriever::RetrieveL(*attributeContext,
            mediaList, ETrue));
	// context off the list
    CleanupStack::PopAndDestroy( &contextRemover );														

	// if there are multiple media items, filter the postcard plugin
	iFilterOutPlugin = (mediaList.SelectionCount() > 1);
	
	// extract the filename from selected items in the media list and add it 
	// to the messageData to be returned
    TGlxSelectionIterator iterator;
    iterator.SetToFirst( &mediaList );
	TInt index = KErrNotFound;

	while ( (index = iterator++) != KErrNotFound )
		{
        // does not return ownership.
        const CGlxMedia* media = mediaList.Item( index ).Properties();
        if (media)
            {
            if ( media->IsSupported( KMPXMediaGeneralUri ) && 
                    IsValidTypeL( *media ) )
                {
                CGlxImageViewerManager* viewerInst =
                        CGlxImageViewerManager::InstanceL();
                if ( viewerInst && viewerInst->IsPrivate() )
                    {
                    messageData->AppendAttachmentHandleL( 
                            viewerInst->ImageFileHandle() );
                    }
                else
                    {
                    messageData->AppendAttachmentL( 
                            media->ValueText( KMPXMediaGeneralUri ) );
                    }
                viewerInst->DeleteInstance();
                }
            }
        else
            {
            User::Leave( KErrNotReady );
            }
        }

	CleanupStack::PopAndDestroy( attributeContext );
	return messageData;
	}

// ----------------------------------------------------------------------------
// IsValidTypeL
// ----------------------------------------------------------------------------
TBool CGlxCommandHandlerSend::IsValidTypeL(const CGlxMedia& aMedia) 
	{
	GLX_FUNC("CGlxCommandHandlerSend::IsValidTypeL");
	// ensure the category attribute is supported by the current media item
    if (aMedia.IsSupported(KMPXMediaGeneralCategory))
        {
        switch(aMedia.ValueTObject<TInt>(KMPXMediaGeneralCategory))
        	{
    		case EMPXVideo:
    			{
    			// don't use the postcard plugin to send video
    			iFilterOutPlugin = ETrue;
    			return ETrue;
    			}
    		case EMPXImage:
    			{
	            return ETrue;
    	        }
    	    default:    
    	    	{
            	return EFalse;
            	}
        	}
        }
	return EFalse;
	}
	

// ----------------------------------------------------------------------------
// SendSelectedItemsL
// ----------------------------------------------------------------------------
void CGlxCommandHandlerSend::SendSelectedItemsL()
	{
	GLX_FUNC("CGlxCommandHandlerSend::SendSelectedItemsL");
    // retrieve the current files name and location
    CMessageData* msgData = SelectedFilesLC();
    HBufC* title = StringLoader::LoadLC(R_QTN_LGAL_POPUP_SEND);
	
	// filterOutPlugins is a list of component uids that should NOT be used to 
	// send the media file. if a video file was selected or multiple files 
	// were selected, filter out the option to send as a postcard
    CArrayFix<TUid>* filterOutPlugins =new (ELeave) CArrayFixFlat<TUid>(1);
    CleanupStack::PushL(filterOutPlugins);

	if(iFilterOutPlugin)
		{
		filterOutPlugins->AppendL(KSendAsPostcardUID);
		}
		
	// If Device supports text-entry mode only in portrait,
	// then the orientation has to be forced to EGlxOrientationTextEntry 
	// before launching the Send pop-up.   
	
 	if(iUiUtility->IsPenSupported())
		{
		iUiUtility->SetAppOrientationL( EGlxOrientationDefault );
		}
	// Trap the send call to ensure the orientation is reverted
	TRAPD(error, iSendUi->ShowQueryAndSendL( msgData, Capabilities(),
					filterOutPlugins, KNullUid, ETrue, *title ));
	if (error == KErrNoMemory || error == KErrNotSupported || error
			== KErrInUse || error == KErrDiskFull || error == KErrTimedOut
			|| error == KErrPermissionDenied)
		{
		GlxGeneralUiUtilities::ShowErrorNoteL(error);
		GLX_LOG_INFO1("error sending the image %d",error);
		}
	CleanupStack::PopAndDestroy(filterOutPlugins);
	CleanupStack::PopAndDestroy(title);
	CleanupStack::PopAndDestroy(msgData);
	}
	



// ----------------------------------------------------------------------------
// LoadRscFileL
// ----------------------------------------------------------------------------
void CGlxCommandHandlerSend::LoadRscFileL(const TDesC& aFileName)
	{
	GLX_FUNC("CGlxCommandHandlerSend::LoadRscFileL");
	CCoeEnv* env = CCoeEnv::Static();
	iResourceOffset = env->AddResourceFileL(aFileName);
	}


// ----------------------------------------------------------------------------
// Capabilities
// ----------------------------------------------------------------------------
TSendingCapabilities CGlxCommandHandlerSend::Capabilities()
	{
	GLX_FUNC("CGlxCommandHandlerSend::Capabilities");
	return TSendingCapabilities (KSendMsgBodySz, KSendMsgOverallSz,
        						TSendingCapabilities::ESupportsAttachments);
	}

	
// ----------------------------------------------------------------------------
// PopulateToolbar
// ----------------------------------------------------------------------------
//
void CGlxCommandHandlerSend::PopulateToolbarL()
	{
	GLX_FUNC("CGlxCommandHandlerSend::PopulateToolbar");
	
	iUiUtility->ScreenFurniture()->SetTooltipL( EGlxCmdSend, CAknButton::EPositionLeft );
	}

// ----------------------------------------------------------------------------
// DoIsDisabled
// ----------------------------------------------------------------------------
//	
TBool CGlxCommandHandlerSend::DoIsDisabled(TInt aCommandId, 
                                           MGlxMediaList& aList) const
    {
    GLX_FUNC("CGlxCommandHandlerSend::DoIsDisabled");
    if (EGlxCmdSend == aCommandId && aList.Count())
        {
        return EFalse;
        } 
    return ETrue;
    }

// ----------------------------------------------------------------------------
// HandleItemSelectedL
// ----------------------------------------------------------------------------
//
void CGlxCommandHandlerSend::HandleItemSelectedL(TInt /*aIndex*/,
        TBool /*aSelected*/, MGlxMediaList* aList)
    {
    GLX_FUNC("CGlxCommandHandlerSend::HandleItemSelectedL");
    // Check if toolbar is available.
    CAknToolbar* toolbar = iUiUtility->GetGridToolBar();
    if (toolbar)
        {
        TBool dimmed = ETrue;
        if (aList->SelectionCount() > 0)
            {
            dimmed = EFalse;
            }
        toolbar->SetItemDimmed(EGlxCmdSend, dimmed, ETrue);
        }
    }

// End of file