meetingui/meetingrequestviewers/src/CMRHandler.cpp
changeset 0 f979ecb2b13e
equal deleted inserted replaced
-1:000000000000 0:f979ecb2b13e
       
     1 /*
       
     2 * Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: Implementation for meeting request handler   
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 
       
    21 // INCLUDE FILES
       
    22 #include "CMRHandler.h"
       
    23 #include "MMRModelInterface.h"		
       
    24 #include "MREntryConsultant.h"	
       
    25 #include "CMRObjectFactory.h"			
       
    26 #include "CMRCmdHandler.h"
       
    27 #include "mrdatalog.h"
       
    28 #include "ICalUILog.h"
       
    29 #include "meetingrequestviewers.hrh" 	//constants for meeting request viewers
       
    30 #include <CAttendeeView.h>				//attendees view
       
    31 #include <MAgnEntryUi.h>				//TAgnEntryUiInParams & entry ui callback
       
    32 #include "CMRUtilsInternal.h"			//Meeting request utilities library
       
    33 #include <MRCommands.hrh> 				//common commands for attendee, editor and meeting request views
       
    34 #include <AknGlobalNote.h>
       
    35 #include <CalenEditorsPlugin.h> 		//calendar editors ecom plugin
       
    36 #include <stringloader.h>				//resource string loading
       
    37 #include <cmrmailboxutils.h>
       
    38 #include <AknQueryDialog.h>
       
    39 #include "ICalUILog.h"
       
    40 #include "MRViewersPanic.h"
       
    41 
       
    42 // CONSTANTS
       
    43 /// Unnamed namespace for local definitions
       
    44 namespace {
       
    45 
       
    46 _LIT( KPanicMsg, "CMRHandler" );
       
    47 
       
    48 void Panic( TPanicCode aReason )
       
    49     {
       
    50     User::Panic( KPanicMsg, aReason );
       
    51     }
       
    52 
       
    53 }  // namespace
       
    54 
       
    55 // ============================ MEMBER FUNCTIONS ===============================
       
    56 
       
    57 // -----------------------------------------------------------------------------
       
    58 // CMRHandler::CMRHandler
       
    59 // C++ default constructor can NOT contain any code, that
       
    60 // might leave.
       
    61 // -----------------------------------------------------------------------------
       
    62 //
       
    63 CMRHandler::CMRHandler(
       
    64     RPointerArray<CCalEntry>& aEntries,
       
    65     const MAgnEntryUi::TAgnEntryUiInParams& aParams,
       
    66 	MAgnEntryUi::TAgnEntryUiOutParams& aOutParams,
       
    67     MAgnEntryUiCallback& aCallback )
       
    68     : iEntries( aEntries ),
       
    69       iInParams( aParams ),
       
    70       iOutParams( aOutParams ),
       
    71       iCallback( aCallback )
       
    72     {
       
    73     LOG("CMRHandler::CMRHandler()");
       
    74     iStatus = EInitialView;
       
    75     }
       
    76 
       
    77 // -----------------------------------------------------------------------------
       
    78 // CMRHandler::ConstructL
       
    79 // Symbian 2nd phase constructor can leave.
       
    80 // -----------------------------------------------------------------------------
       
    81 //
       
    82 
       
    83 void CMRHandler::ConstructL()
       
    84     {	                           
       
    85     LOG("CMRHandler::ConstructL");
       
    86     //calling app is calendar, create calendar editor ecom plugin
       
    87     if (iInParams.iCallingApp.iUid == KUidCalendarApplication )
       
    88     	{
       
    89     	iCalendarEditorsPlugin = CCalenEditorsPlugin::NewL();
       
    90     	}
       
    91     LOG("CMRHandler::ConstructL -> End");
       
    92     }
       
    93 
       
    94 // -----------------------------------------------------------------------------
       
    95 // CMRHandler::NewL
       
    96 // Two-phased constructor.
       
    97 // -----------------------------------------------------------------------------
       
    98 //
       
    99 CMRHandler* CMRHandler::NewL(
       
   100     RPointerArray<CCalEntry>& aEntries,
       
   101     const MAgnEntryUi::TAgnEntryUiInParams& aParams,
       
   102     MAgnEntryUi::TAgnEntryUiOutParams& aOutParams,
       
   103     MAgnEntryUiCallback& aCallback )
       
   104     {
       
   105     CMRHandler* self = new( ELeave ) CMRHandler( aEntries,
       
   106                                                  aParams,
       
   107                                                  aOutParams,
       
   108                                                  aCallback );
       
   109 
       
   110     CleanupStack::PushL( self );
       
   111     self->ConstructL();
       
   112     CleanupStack::Pop();
       
   113 
       
   114     return self;
       
   115     }
       
   116 
       
   117 
       
   118 // Destructor
       
   119 CMRHandler::~CMRHandler()
       
   120     {
       
   121     LOG("CMRHandler::~CMRHandler");
       
   122 	delete iModel;
       
   123 	delete iCalendarEditorsPlugin;
       
   124 	delete iCmdHandler;
       
   125     // entry arrray only referenced so iEntries mustn't be closed
       
   126     LOG("CMRHandler::~CMRHandler -> End");
       
   127     }
       
   128 
       
   129 // -----------------------------------------------------------------------------
       
   130 // CMRHandler::IsCommandAvailable
       
   131 // -----------------------------------------------------------------------------
       
   132 //
       
   133 TBool CMRHandler::IsCommandAvailable( TInt aCommandId )
       
   134     {
       
   135     if ( aCommandId == EMRCommandRetrieve ||
       
   136          aCommandId == EMRCommandAttachments ||
       
   137          aCommandId == EMRCommandUnreadOpeningNote )
       
   138         {
       
   139         return iCallback.IsCommandAvailable( aCommandId );
       
   140         }
       
   141     else
       
   142         {        
       
   143         // otherwise caller knows the availability
       
   144         return ETrue;
       
   145         }
       
   146     }
       
   147 
       
   148 // -----------------------------------------------------------------------------
       
   149 // CMRHandler::ProcessCommandWithResultL
       
   150 // -----------------------------------------------------------------------------
       
   151 //
       
   152 TInt CMRHandler::ProcessCommandWithResultL( TInt aCommandId )
       
   153 	{
       
   154 	TInt retVal( KErrNone );
       
   155 	
       
   156 	switch( aCommandId )
       
   157 		{				
       
   158 		case EMRCommandExitDialogs:
       
   159 	    case EAknCmdExit:
       
   160 	    case EEikCmdExit:		
       
   161 			{
       
   162 			iStatus = ECloseMeetingRequestViews;
       
   163 			break;
       
   164 			}
       
   165 		case EMRCommandReplyToSender:   // fall through
       
   166 		case EMRCommandReplyToOrganiser:// fall through
       
   167 		case EMRCommandReplyToAll:      
       
   168 			{
       
   169 			//do reply
       
   170 			iCmdHandler->CreateReplyL( aCommandId );
       
   171 			iStatus = ECloseMeetingRequestViews;
       
   172 			break;
       
   173 			}			
       
   174 		case EMRCommandShowDescriptionView:
       
   175 			{
       
   176 			if ( iInParams.iCallingApp.iUid == KUidCalendarApplication &&
       
   177 			     iInParams.iEditorMode != MAgnEntryUi::EViewEntry )
       
   178 				{ // ECreateNewEntry, EEditExistingEntry
       
   179 				iStatus = ELaunchMeetingEditorView;
       
   180                 }
       
   181             else
       
   182 				{
       
   183 				iStatus = ELaunchMeetingDescriptionView;
       
   184 				}
       
   185             break;
       
   186 			}
       
   187 		case EMRCommandShowAttendeesView:
       
   188 			{
       
   189 			//set status to launch attendee view
       
   190 			iStatus = ELaunchAttendeeView;
       
   191 			break;
       
   192 			}
       
   193 		case EMRCommandShowSummaryView:
       
   194 			{
       
   195 			//set status to launch summary view;
       
   196 			iStatus = ELaunchMeetingRequestView;
       
   197 			break;
       
   198 			}			
       
   199         // forward actually closes MR Viewer (mail framework does that)			
       
   200 		case EMRCommandForward:
       
   201 		case EMRCommandAttachments:
       
   202 		case EMRCommandMessageDetails:
       
   203         case EMRCommandRetrieve:
       
   204 			{
       
   205 			retVal = iCallback.ProcessCommandWithResultL( aCommandId );
       
   206 			break;
       
   207 			}
       
   208 		case EMRCommandNavigateBackward:
       
   209 		case EMRCommandNavigateForward:
       
   210 			{
       
   211 			// check if mailbox has other entries so that navigation is possible
       
   212 			if ( iCallback.IsCommandAvailable( aCommandId ) )
       
   213 				{
       
   214 				TBool allowExit( ETrue );
       
   215 				
       
   216 				// TODO: check exit condition for MR, present user a dialog with
       
   217 				//  saving & sending options... same as when closing the view
       
   218 
       
   219 				
       
   220 				// pass command to callback, framework takes care of the rest
       
   221 				if ( allowExit )
       
   222 					{
       
   223 					iStatus = ECloseMeetingRequestViews;
       
   224 					retVal = iCallback.ProcessCommandWithResultL( aCommandId );
       
   225 					}
       
   226 				else
       
   227 					{
       
   228 					// user cancelled navigation
       
   229 					retVal = KErrCancel;
       
   230 					}
       
   231 				}
       
   232 			else
       
   233 				{
       
   234 				retVal = KErrNotSupported;
       
   235 				}
       
   236             break;
       
   237 			}	
       
   238 			
       
   239 		// commands which modify or might possibly modify entry(s), and which
       
   240 		// cause exit mr viewer if completed succesfully:
       
   241 		case EMRCommandSend:            // fall through
       
   242 		case EMRCommandSendUpdate:      // fall through
       
   243 		case EMRCommandCancelMR:        // fall through
       
   244 		case EMRCommandDeleteMR:        // fall through
       
   245 		case EMRCommandRespondAccept:   // fall through
       
   246 		case EMRCommandRespondTentative:// fall through
       
   247 		case EMRCommandRespondDecline:  // fall through		
       
   248 		case EMRCommandSaveAndExit:	
       
   249             {
       
   250             TRAPD( err, retVal = ProcessTrappedModifCmdL( aCommandId ) );
       
   251             if ( err != KErrNone || retVal != KErrNone )
       
   252                 { // error result or leave occurred, don't exit viewer but 
       
   253                   // ensure data integrity
       
   254                 // TODO: show error note possibly?
       
   255                 RefreshViewL();
       
   256                 User::LeaveIfError( err );
       
   257                 }
       
   258             else
       
   259                 {
       
   260                 iStatus = ECloseMeetingRequestViews;
       
   261                 }
       
   262             break;
       
   263             }
       
   264 				
       
   265         // commands which modify or might possibly modify entry(s), and which
       
   266         // do not exit mr viewer:
       
   267 		case EMRCommandSave:               // fall through
       
   268 		case EMRCommandDisableAlarm:       // fall through
       
   269 		case EMRCommandRemoveFromCalendar: // fall through
       
   270 		case EMRCommandSaveFromFile:
       
   271 		    {
       
   272 		    // trap leaves to ensure data integrity
       
   273             TRAPD( err, retVal = ProcessTrappedModifCmdL( aCommandId ) );
       
   274             RefreshViewL();
       
   275             User::LeaveIfError( err );
       
   276             break;
       
   277 		    }
       
   278 		    			
       
   279 			/*
       
   280 		case EMRCommandHelpMeetingDescriptionView:
       
   281 			{
       
   282 			//do help showing of currently displayed view
       
   283 			break;
       
   284 			}
       
   285 		case EMRCommandHelpMeetingRequestView:
       
   286 			{
       
   287 			//do showing of help for meeting request view
       
   288 			break;
       
   289 			}*/
       
   290 		}
       
   291         
       
   292 	return retVal;
       
   293 	}
       
   294 
       
   295 // -----------------------------------------------------------------------------
       
   296 // CMRHandler::ProcessCommandL
       
   297 // -----------------------------------------------------------------------------
       
   298 //
       
   299 void CMRHandler::ProcessCommandL( TInt aCommandId )
       
   300 	{
       
   301 	ProcessCommandWithResultL( aCommandId );
       
   302 	}
       
   303 
       
   304 // -----------------------------------------------------------------------------
       
   305 // CMRHandler::ProcessTrappedModifCmdL
       
   306 // Commands which may modify entry(s) and should be placed inside a TRAP to
       
   307 // ensure that data gets refreshed also in case a leave occurs when processing
       
   308 // command.
       
   309 // -----------------------------------------------------------------------------
       
   310 //
       
   311 TInt CMRHandler::ProcessTrappedModifCmdL( TInt aCommandId )
       
   312     {
       
   313     LOG("CMRHandler::ProcessTrappedModifCmdL");
       
   314     TInt retVal( KErrNone );
       
   315     
       
   316 	switch( aCommandId )
       
   317 		{    
       
   318 		case EMRCommandSend:
       
   319 		case EMRCommandSendUpdate:
       
   320 		    { // do send request or update
       
   321 		    retVal = iCmdHandler->SendL( aCommandId );
       
   322 			break;
       
   323 		    }
       
   324 		case EMRCommandCancelMR:
       
   325 		    { // do cancel request
       
   326 		    retVal = iCmdHandler->CancelMRL();
       
   327 			break;
       
   328 		    }
       
   329 		case EMRCommandDeleteMR:
       
   330 		    { // do delete request
       
   331             retVal = iCmdHandler->DeleteMRL();
       
   332 			break;
       
   333 		    }		    
       
   334 		case EMRCommandRespondAccept:
       
   335 		case EMRCommandRespondTentative: // fall through
       
   336 		case EMRCommandRespondDecline:   // fall through
       
   337 			{
       
   338 			//do respond to organiser
       
   339 			iCmdHandler->CreateResponseL( iEntries, aCommandId );
       
   340 			break;
       
   341 			}
       
   342 		case EMRCommandSaveAndExit:
       
   343 		    {
       
   344 		    iCmdHandler->SaveL();
       
   345 		    break;
       
   346 		    }		    
       
   347 		case EMRCommandSave:
       
   348 		    {
       
   349 		    iCmdHandler->SaveL();
       
   350 		    break;
       
   351 		    }		    				    
       
   352 		case EMRCommandDisableAlarm:
       
   353 			{
       
   354 			iCmdHandler->DisableAlarmL( iEntries );
       
   355 			break;
       
   356 			}
       
   357 		case EMRCommandRemoveFromCalendar:
       
   358 			{
       
   359 			iCmdHandler->RemoveFromCalendarL( iEntries );
       
   360 			break;
       
   361 			}
       
   362 		case EMRCommandSaveFromFile:
       
   363 		    {
       
   364 		    iCmdHandler->SaveFromFileL( iEntries );
       
   365 		    break;
       
   366 		    }
       
   367         default:
       
   368             {
       
   369             User::Leave( KErrNotSupported );
       
   370             }
       
   371 		}
       
   372     LOG("CMRHandler::ProcessTrappedModifCmdL -> End");		
       
   373     return retVal;
       
   374     }
       
   375 
       
   376 // -----------------------------------------------------------------------------
       
   377 // CMRHandler::SetHelpContext
       
   378 // -----------------------------------------------------------------------------
       
   379 //
       
   380 void CMRHandler::SetHelpContext( const TCoeHelpContext& /*aContext*/ )
       
   381 	{
       
   382 	}
       
   383 
       
   384 // -----------------------------------------------------------------------------
       
   385 // CMRHandler::ShowOpeningNoteL
       
   386 // -----------------------------------------------------------------------------
       
   387 //
       
   388 void CMRHandler::ShowOpeningNoteL()
       
   389 	{
       
   390 	HBufC* openingNote = NULL;
       
   391 
       
   392 	if ( !iModel )
       
   393 	    { // error has occurred since model hasn't been created
       
   394 	    // TODO: implement error note or other way of handling the error
       
   395 	    }
       
   396     else
       
   397         {
       
   398     	openingNote = iModel->MailboxOpeningNoteL();
       
   399         }
       
   400 
       
   401 	if ( openingNote )
       
   402 		{
       
   403 		CleanupStack::PushL( openingNote );
       
   404 		CAknGlobalNote* globalNote = CAknGlobalNote::NewLC();
       
   405 		globalNote->ShowNoteL( EAknGlobalInformationNote, *openingNote );
       
   406 		CleanupStack::PopAndDestroy( globalNote );
       
   407 		CleanupStack::PopAndDestroy( openingNote );
       
   408 		}
       
   409 	}
       
   410 
       
   411 // -----------------------------------------------------------------------------
       
   412 // CMRHandler::HandleEngReadyL
       
   413 // -----------------------------------------------------------------------------
       
   414 //
       
   415 void CMRHandler::HandleEngReadyL(
       
   416     const TDesC8& /*aMtmUid*/,
       
   417     CMRUtilsInternal& aMRUtils,
       
   418     CMRMailboxUtils& aMRMailboxUtils )
       
   419     {
       
   420     // this method should only get called once
       
   421     __ASSERT_DEBUG( !iCmdHandler && !iModel, Panic( EUnexpectedNonNull ) );
       
   422                     
       
   423     LOG("CMRHandler::HandleEngReadyL, creating iModel");
       
   424     iModel = CMRObjectFactory::CreateMRModelL( iEntries, 
       
   425                                                iInParams, 
       
   426                                                aMRMailboxUtils,
       
   427                                                aMRUtils );
       
   428 
       
   429     #ifdef ICALUI_ENABLE_MRDATA_LOGGING
       
   430         LogAvailableFunctionsL();
       
   431     #endif
       
   432 
       
   433     LOG("CMRHandler::HandleEngReadyL, creating iCmdHandler");
       
   434     iCmdHandler = CMRCmdHandler::NewL( *iModel,
       
   435                                        iInParams,
       
   436                                        aMRMailboxUtils,
       
   437                                        aMRUtils );
       
   438 
       
   439     iCurrentDialog->SetModel( *iModel );
       
   440 
       
   441     if ( IsCommandAvailable( EMRCommandUnreadOpeningNote ) )
       
   442         {            
       
   443     	// TODO: if combinedEntry is NULL, then there was some error.
       
   444     	// ShowOpeningNoteL() should take care of notifying user in this case.
       
   445     	ShowOpeningNoteL();
       
   446         }
       
   447 	}
       
   448 
       
   449 // -----------------------------------------------------------------------------
       
   450 // CMRHandler::ExecuteViewL
       
   451 // -----------------------------------------------------------------------------
       
   452 //
       
   453 TInt CMRHandler::ExecuteViewL()
       
   454 	{
       
   455     LOG("CMRHandler::ExecuteViewL");
       
   456 	// Even if there are multiple entries, method is the same for all:
       
   457 	CCalEntry::TMethod method = iEntries[0]->MethodL();
       
   458 
       
   459     // for returning from attendee view or calendar editor
       
   460     TMRViewStatus previousView( EInitialView ); 
       
   461 
       
   462 	TInt returnCode( KErrNone );
       
   463 	while ( iStatus != ECloseMeetingRequestViews )
       
   464 		{
       
   465 		if ( iStatus == EInitialView ||
       
   466 		     iStatus == ELaunchMeetingRequestView ||
       
   467 		     iStatus == ELaunchMeetingDescriptionView )
       
   468 		    {
       
   469 		    previousView = iStatus;
       
   470 		    
       
   471             LOG("CMRHandler::ExecuteViewL, creating dialog");
       
   472 			iCurrentDialog = CMRObjectFactory::CreateMRDialogL( method,
       
   473 			                                                    iInParams,
       
   474 			                                                    *this,
       
   475 			                                                    iStatus );
       
   476 		    if ( iModel )
       
   477 		        { // Set model if it is already available
       
   478 		            LOG("CMRHandler::ExecuteViewL, setting model");
       
   479 		        iCurrentDialog->SetModel( *iModel );
       
   480 		        }
       
   481 		    LOG("CMRHandler::ExecuteViewL, executing dialog");
       
   482 			returnCode = iCurrentDialog->ExecuteLD();
       
   483 			iCurrentDialog = NULL;
       
   484 		    }		
       
   485 		else if ( iStatus == ELaunchAttendeeView )
       
   486 		    {
       
   487 			returnCode = ExecuteAttendeeViewL();
       
   488 			//return to the view the attendee view was launched from
       
   489 			iStatus = previousView;		    
       
   490 		    }
       
   491         else if ( iStatus == ELaunchMeetingEditorView )
       
   492             {
       
   493 			returnCode = ExecuteEditorViewL();
       
   494 			//return to the view the editor was launched from
       
   495 			iStatus = previousView;            
       
   496             }
       
   497 		}
       
   498     LOG("CMRHandler::ExecuteViewL -> End");
       
   499 	return returnCode;
       
   500 	}
       
   501 
       
   502 // -----------------------------------------------------------------------------
       
   503 // CMRHandler::ExecuteEditorViewL
       
   504 // -----------------------------------------------------------------------------
       
   505 //
       
   506 TInt CMRHandler::ExecuteEditorViewL()
       
   507     {
       
   508     QueryAndSetEditingModeL();    
       
   509     
       
   510     RPointerArray<CCalEntry> tmpArray( 1 );
       
   511     CleanupClosePushL( tmpArray ); // only close, doesn't own it's entry
       
   512     tmpArray.AppendL( iModel->CombinedEntry() );
       
   513     TInt retVal = iCalendarEditorsPlugin->ExecuteViewL( tmpArray,
       
   514                                                         iInParams, 
       
   515                                                         iOutParams, 
       
   516                                                         *this );
       
   517     if ( retVal == KErrNone &&
       
   518          iOutParams.iAction == MAgnEntryUi::EMeetingSaved )
       
   519         {
       
   520         iModel->SetEntryEdited();
       
   521         }
       
   522     CleanupStack::PopAndDestroy(); // tmpArray
       
   523     return retVal;
       
   524     }
       
   525 
       
   526 // -----------------------------------------------------------------------------
       
   527 // CMRHandler::ExecuteAttendeeViewL
       
   528 // -----------------------------------------------------------------------------
       
   529 //
       
   530 TInt CMRHandler::ExecuteAttendeeViewL()
       
   531 	{
       
   532 	User::Leave( KErrNotSupported );
       
   533 	return KErrNotSupported;
       
   534 	
       
   535 	/*
       
   536 	QueryAndSetEditingModeL();	
       
   537 	CAttendeeView::TAttendeeViewMode mode( CAttendeeView::EViewer );
       
   538 	if ( iModel->EditingMode() != MMRModelInterface::EViewOnly )
       
   539 		{
       
   540         mode = CAttendeeView::EEditor;
       
   541 		}
       
   542 	
       
   543 	// TODO: we may get into trouble if combined entry changes while
       
   544 	// attendee view is still running -> we might need to use another
       
   545 	// copy with attendee view
       
   546 	
       
   547     CCalEntry* entry = iModel->CombinedEntry();
       
   548     
       
   549     // TODO: currently we don't resolve phone owner addr, when
       
   550 	// attendee view API has been changed we might instantiate attendee
       
   551 	// view already e.g. in HandleEngReadyL(). Fix this then...
       
   552 	const TDesC& address = KNullDesC;
       
   553 	    //MREntryConsultant::PhoneOwnerAddrL( *entry, *iMRMailboxUtils );
       
   554 
       
   555 	TInt filters( 0 );
       
   556 	// TODO: Attendee view should support individual Accept/Tentative/Decline cmds
       
   557 	if ( iModel->IsCmdAvailable( EMRCommandRespondAccept ) )
       
   558 		{
       
   559 		filters =+ CAttendeeView::ERespond;
       
   560 		}
       
   561 	if ( iInParams.iCallingApp.iUid == KUidCalendarApplication )
       
   562 		{
       
   563 		if ( iModel->IsCmdAvailable( EMRCommandSend ) )
       
   564 		    {
       
   565 		    filters =+ CAttendeeView::ESend;
       
   566 		    }
       
   567 		if ( iModel->IsCmdAvailable( EMRCommandSendUpdate ) )
       
   568 		    {
       
   569 		    filters =+ CAttendeeView::ESendUpdate;
       
   570 		    }
       
   571 		if ( iModel->IsCmdAvailable( EMRCommandCancelMR ) )
       
   572 		    {
       
   573 		    filters =+ CAttendeeView::ECancelation;
       
   574 		    }
       
   575 		}
       
   576 	CAttendeeView::TMenuFilterFlags menuFilter(
       
   577 	    static_cast<CAttendeeView::TMenuFilterFlags>( filters ) );
       
   578 	    
       
   579     // Unfortunately we need to create initParams in heap since
       
   580     // attendee view wants to take it's ownership
       
   581 	CAttendeeView::TAttendeeViewInit* initParams =
       
   582 	    new( ELeave ) CAttendeeView::TAttendeeViewInit(
       
   583 	        *entry, mode, CONST_CAST( TDesC&, address ), *this );
       
   584     CleanupStack::PushL( initParams );
       
   585 	initParams->SetMenuFilter( menuFilter );
       
   586 	
       
   587 	CAttendeeView* attendeeView = CAttendeeView::NewL( initParams );
       
   588 	CleanupStack::Pop(); // initParams, ownership transferred
       
   589     CleanupStack::PushL( attendeeView );
       
   590 	
       
   591 	TInt retVal = attendeeView->ExecuteL();
       
   592 	
       
   593 	// Note: without calling IsEntryEditedL() attendee view
       
   594 	// wouldn't update the input entry!
       
   595     if ( attendeeView->IsEntryEditedL() )
       
   596         {
       
   597         iModel->SetEntryEdited();
       
   598         }
       
   599     CleanupStack::PopAndDestroy( attendeeView );
       
   600     
       
   601     return retVal;
       
   602     */
       
   603 	}
       
   604 
       
   605 // -----------------------------------------------------------------------------
       
   606 // CMRHandler::RefreshViewL
       
   607 // -----------------------------------------------------------------------------
       
   608 //
       
   609 void CMRHandler::RefreshViewL()
       
   610     {
       
   611     if ( iCurrentDialog )
       
   612         {
       
   613         iModel->RefreshViewableEntryL();
       
   614         iCurrentDialog->RefreshData();
       
   615         }
       
   616     }
       
   617 
       
   618 // -----------------------------------------------------------------------------
       
   619 // CMRHandler::QueryAndSetEditingModeL
       
   620 // -----------------------------------------------------------------------------
       
   621 //
       
   622 void CMRHandler::QueryAndSetEditingModeL()
       
   623     {
       
   624     if ( iModel->EditingMode() == MMRModelInterface::EModeNotSet )
       
   625         {
       
   626         CAknQueryDialog* dlg = CAknQueryDialog::NewL();
       
   627         // TODO: replace this with Calendar Utils query when available
       
   628         _LIT(KQueryText,"Edit series instead of instance?");
       
   629         CleanupStack::PushL( dlg );
       
   630         dlg->SetPromptL( KQueryText );
       
   631         CleanupStack::Pop( dlg );
       
   632         if ( dlg->ExecuteLD( R_GENERAL_CONFIRMATION_QUERY ) )
       
   633             {
       
   634             iModel->SetEditingModeL( MMRModelInterface::EEditMeeting );
       
   635             }
       
   636         else
       
   637             {
       
   638             iModel->SetEditingModeL( MMRModelInterface::EEditInstance );
       
   639             }
       
   640         }
       
   641     }
       
   642     
       
   643 // -----------------------------------------------------------------------------
       
   644 // CMRHandler::LogAvailableFunctionsL
       
   645 // This method is for testing purposes only, and should not be called in real
       
   646 // builds to avoid caused overhead.
       
   647 // Not all commands listed in MRCommands.hrh are checked here, only the ones
       
   648 // that are feasible. Furthermore, this may not correspond 100% to the items
       
   649 // visible in the options menu, these results reflect only model's opinion.
       
   650 // -----------------------------------------------------------------------------
       
   651 //
       
   652 void CMRHandler::LogAvailableFunctionsL() const
       
   653     {
       
   654     TBool res( EFalse );    
       
   655     MRDATA_LOG("# start function availability check #");    
       
   656     res = iModel->IsCmdAvailable( EMRCommandRespondAccept );
       
   657     MRDATA_LOG1("can EMRCommandRespondAccept: %d", res );
       
   658     res = iModel->IsCmdAvailable( EMRCommandRespondTentative );
       
   659     MRDATA_LOG1("can EMRCommandRespondTentative: %d", res );
       
   660     res = iModel->IsCmdAvailable( EMRCommandRespondDecline );
       
   661     MRDATA_LOG1("can EMRCommandRespondDecline: %d", res );
       
   662     res = iModel->IsCmdAvailable( EMRCommandReplyToSender );
       
   663     MRDATA_LOG1("can EMRCommandReplyToSender: %d", res );
       
   664     res = iModel->IsCmdAvailable( EMRCommandReplyToOrganiser );
       
   665     MRDATA_LOG1("can EMRCommandReplyToOrganiser: %d", res );
       
   666     res = iModel->IsCmdAvailable( EMRCommandReplyToAll );
       
   667     MRDATA_LOG1("can EMRCommandReplyToAll: %d", res );
       
   668     res = iModel->IsCmdAvailable( EMRCommandForward );
       
   669     MRDATA_LOG1("can EMRCommandForward: %d", res );
       
   670     res = iModel->IsCmdAvailable( EMRCommandRetrieve );
       
   671     MRDATA_LOG1("can EMRCommandRetrieve: %d", res );
       
   672     res = iModel->IsCmdAvailable( EMRCommandRemoveFromCalendar );
       
   673     MRDATA_LOG1("can EMRCommandRemoveFromCalendar: %d", res );
       
   674     res = iModel->IsCmdAvailable( EMRCommandShowCalendar );
       
   675     MRDATA_LOG1("can EMRCommandShowCalendar: %d", res );
       
   676     res = iModel->IsCmdAvailable( EMRCommandAttachments );
       
   677     MRDATA_LOG1("can EMRCommandAttachments: %d", res );
       
   678     res = iModel->IsCmdAvailable( EMRCommandMessageDetails );
       
   679     MRDATA_LOG1("can EMRCommandMessageDetails: %d", res );
       
   680     res = iModel->IsCmdAvailable( EMRCommandDisableAlarm );
       
   681     MRDATA_LOG1("can EMRCommandDisableAlarm: %d", res );    
       
   682     res = iModel->IsCmdAvailable( EMRCommandSaveFromFile );
       
   683     MRDATA_LOG1("can EMRCommandSaveFromFile: %d", res );    
       
   684     res = iModel->IsCmdAvailable( EMRCommandSend );
       
   685     MRDATA_LOG1("can EMRCommandSend: %d", res );    
       
   686     res = iModel->IsCmdAvailable( EMRCommandSendUpdate );
       
   687     MRDATA_LOG1("can EMRCommandSendUpdate: %d", res );
       
   688     res = iModel->IsCmdAvailable( EMRCommandDeleteMR );
       
   689     MRDATA_LOG1("can EMRCommandDeleteMR: %d", res );       
       
   690     MRDATA_LOG("# end function availability check #");        
       
   691     }
       
   692     
       
   693 //  End of File