photosgallery/viewframework/commandhandlers/commoncommandhandlers/src/glxcommandhandlersend.cpp
branchRCL_3
changeset 60 5b3385a43d68
child 75 01504893d9cb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/photosgallery/viewframework/commandhandlers/commoncommandhandlers/src/glxcommandhandlersend.cpp	Wed Sep 01 12:33:26 2010 +0100
@@ -0,0 +1,443 @@
+/*
+* 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)
+        {
+        iAvkonAppUi->ProcessCommandL(EGlxCmdDialogLaunched);
+        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);
+	iAvkonAppUi->ProcessCommandL(EGlxCmdDialogDismissed);
+	}
+	
+
+
+
+// ----------------------------------------------------------------------------
+// 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