email/pop3andsmtpmtm/smtpservermtm/src/IMSM.CPP
author hgs
Wed, 03 Nov 2010 22:55:44 +0530
changeset 80 8b14b30db193
permissions -rw-r--r--
201044_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
80
8b14b30db193 201044_02
hgs
parents:
diff changeset
     1
// Copyright (c) 1998-2010 Nokia Corporation and/or its subsidiary(-ies).
8b14b30db193 201044_02
hgs
parents:
diff changeset
     2
// All rights reserved.
8b14b30db193 201044_02
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
8b14b30db193 201044_02
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
8b14b30db193 201044_02
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
8b14b30db193 201044_02
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
8b14b30db193 201044_02
hgs
parents:
diff changeset
     7
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
     8
// Initial Contributors:
8b14b30db193 201044_02
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
8b14b30db193 201044_02
hgs
parents:
diff changeset
    10
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
    11
// Contributors:
8b14b30db193 201044_02
hgs
parents:
diff changeset
    12
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
    13
// Description:
8b14b30db193 201044_02
hgs
parents:
diff changeset
    14
// Internet SMTP Transport Driver
8b14b30db193 201044_02
hgs
parents:
diff changeset
    15
// 
8b14b30db193 201044_02
hgs
parents:
diff changeset
    16
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
    17
8b14b30db193 201044_02
hgs
parents:
diff changeset
    18
#include <msvstd.h>		// TMsvEntry, CMsvEntrySelection
8b14b30db193 201044_02
hgs
parents:
diff changeset
    19
#include <msventry.h>	// CMsvServerEntry
8b14b30db193 201044_02
hgs
parents:
diff changeset
    20
#include <msvstore.h>	// needed for CMsvStore::~CMsvStore
8b14b30db193 201044_02
hgs
parents:
diff changeset
    21
#include <imcvsend.h>	// CImSendConvert
8b14b30db193 201044_02
hgs
parents:
diff changeset
    22
8b14b30db193 201044_02
hgs
parents:
diff changeset
    23
#include "IMSM.H"		
8b14b30db193 201044_02
hgs
parents:
diff changeset
    24
#include "IMSMSEND.H"	
8b14b30db193 201044_02
hgs
parents:
diff changeset
    25
#include "SMTSUTIL.H"	// forward declarations for utility fns
8b14b30db193 201044_02
hgs
parents:
diff changeset
    26
#include "csmtpsessionmanager.h"
8b14b30db193 201044_02
hgs
parents:
diff changeset
    27
#include "csmtpsettings.h"
8b14b30db193 201044_02
hgs
parents:
diff changeset
    28
#include "cimmobilitymanager.h"
8b14b30db193 201044_02
hgs
parents:
diff changeset
    29
8b14b30db193 201044_02
hgs
parents:
diff changeset
    30
#if (defined SYMBIAN_USER_PROMPT_SERVICE)
8b14b30db193 201044_02
hgs
parents:
diff changeset
    31
#include "csmtpupsresponsewaiter.h"
8b14b30db193 201044_02
hgs
parents:
diff changeset
    32
#endif
8b14b30db193 201044_02
hgs
parents:
diff changeset
    33
8b14b30db193 201044_02
hgs
parents:
diff changeset
    34
8b14b30db193 201044_02
hgs
parents:
diff changeset
    35
const TInt KBccArraySegment  = 100; 
8b14b30db193 201044_02
hgs
parents:
diff changeset
    36
const TUid KUidSmtpServerMtm = {0x10003C79};
8b14b30db193 201044_02
hgs
parents:
diff changeset
    37
8b14b30db193 201044_02
hgs
parents:
diff changeset
    38
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
    39
Constructor
8b14b30db193 201044_02
hgs
parents:
diff changeset
    40
8b14b30db193 201044_02
hgs
parents:
diff changeset
    41
@param aEntrySelection Selection of messages to send
8b14b30db193 201044_02
hgs
parents:
diff changeset
    42
@param aServerEntry SMTP server entry
8b14b30db193 201044_02
hgs
parents:
diff changeset
    43
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
    44
CMsgImOutboxSend::CMsgImOutboxSend(const CMsvEntrySelection& aEntrySelection,CMsvServerEntry& aServerEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
    45
        : CActive(KMsgImOutboxSendPriority), iEntrySelection(aEntrySelection),iServerEntry(aServerEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
    46
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
    47
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
    48
8b14b30db193 201044_02
hgs
parents:
diff changeset
    49
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
    50
Factory constructor
8b14b30db193 201044_02
hgs
parents:
diff changeset
    51
8b14b30db193 201044_02
hgs
parents:
diff changeset
    52
@param aEntrySelection Selection of messages to send
8b14b30db193 201044_02
hgs
parents:
diff changeset
    53
@param aServerEntry SMTP server entry
8b14b30db193 201044_02
hgs
parents:
diff changeset
    54
@param aService SMTP service ID
8b14b30db193 201044_02
hgs
parents:
diff changeset
    55
8b14b30db193 201044_02
hgs
parents:
diff changeset
    56
@return Constructed class
8b14b30db193 201044_02
hgs
parents:
diff changeset
    57
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
    58
CMsgImOutboxSend* CMsgImOutboxSend::NewLC(const CMsvEntrySelection& aEntrySelection,CMsvServerEntry& aServerEntry, TMsvId aService)
8b14b30db193 201044_02
hgs
parents:
diff changeset
    59
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
    60
	CMsgImOutboxSend* self = new (ELeave) CMsgImOutboxSend(aEntrySelection,aServerEntry);
8b14b30db193 201044_02
hgs
parents:
diff changeset
    61
	CleanupStack::PushL(self);
8b14b30db193 201044_02
hgs
parents:
diff changeset
    62
	self->ConstructL(aService);
8b14b30db193 201044_02
hgs
parents:
diff changeset
    63
	return self;
8b14b30db193 201044_02
hgs
parents:
diff changeset
    64
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
    65
8b14b30db193 201044_02
hgs
parents:
diff changeset
    66
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
    67
Factory constructor
8b14b30db193 201044_02
hgs
parents:
diff changeset
    68
8b14b30db193 201044_02
hgs
parents:
diff changeset
    69
@param aEntrySelection Selection of messages to send
8b14b30db193 201044_02
hgs
parents:
diff changeset
    70
@param aServerEntry SMTP server entry
8b14b30db193 201044_02
hgs
parents:
diff changeset
    71
@param aService SMTP service ID
8b14b30db193 201044_02
hgs
parents:
diff changeset
    72
8b14b30db193 201044_02
hgs
parents:
diff changeset
    73
@return Constructed class
8b14b30db193 201044_02
hgs
parents:
diff changeset
    74
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
    75
CMsgImOutboxSend* CMsgImOutboxSend::NewL(const CMsvEntrySelection& aEntrySelection,CMsvServerEntry& aServerEntry, TMsvId aService)
8b14b30db193 201044_02
hgs
parents:
diff changeset
    76
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
    77
	CMsgImOutboxSend* self=CMsgImOutboxSend::NewLC(aEntrySelection,aServerEntry,aService);
8b14b30db193 201044_02
hgs
parents:
diff changeset
    78
	CleanupStack::Pop();
8b14b30db193 201044_02
hgs
parents:
diff changeset
    79
	return self;
8b14b30db193 201044_02
hgs
parents:
diff changeset
    80
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
    81
8b14b30db193 201044_02
hgs
parents:
diff changeset
    82
void CMsgImOutboxSend::ConstructL(TMsvId aService)
8b14b30db193 201044_02
hgs
parents:
diff changeset
    83
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
    84
	iTotalMessages = iEntrySelection.Count();
8b14b30db193 201044_02
hgs
parents:
diff changeset
    85
    iCurrentMessageNo = -1;
8b14b30db193 201044_02
hgs
parents:
diff changeset
    86
	iProgress.SetServiceId(aService);
8b14b30db193 201044_02
hgs
parents:
diff changeset
    87
8b14b30db193 201044_02
hgs
parents:
diff changeset
    88
	//Load service info iServerEntry context..
8b14b30db193 201044_02
hgs
parents:
diff changeset
    89
	User::LeaveIfError(iServerEntry.SetEntry(aService));	
8b14b30db193 201044_02
hgs
parents:
diff changeset
    90
	__ASSERT_DEBUG(iServerEntry.Entry().iType==KUidMsvServiceEntry,gPanic(EImsmNoServiceInfo));	//	Assert is ServiceEntry..	
8b14b30db193 201044_02
hgs
parents:
diff changeset
    91
8b14b30db193 201044_02
hgs
parents:
diff changeset
    92
	iSettings = CSmtpSettings::NewL(iServerEntry);
8b14b30db193 201044_02
hgs
parents:
diff changeset
    93
8b14b30db193 201044_02
hgs
parents:
diff changeset
    94
	iBccRcptArray = new (ELeave) CDesCArrayFlat(KBccArraySegment);
8b14b30db193 201044_02
hgs
parents:
diff changeset
    95
8b14b30db193 201044_02
hgs
parents:
diff changeset
    96
	//	Assert descriptors != empty
8b14b30db193 201044_02
hgs
parents:
diff changeset
    97
	__ASSERT_DEBUG (iSettings->ServerAddress().Length() >0 , gPanic(EImsmEmptyPostOffice));
8b14b30db193 201044_02
hgs
parents:
diff changeset
    98
	__ASSERT_DEBUG (iSettings->EmailAddress().Length()   >0 , gPanic(EImsmEmptyEmailAddress));
8b14b30db193 201044_02
hgs
parents:
diff changeset
    99
8b14b30db193 201044_02
hgs
parents:
diff changeset
   100
#if (defined SYMBIAN_USER_PROMPT_SERVICE)	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   101
	iWaiter = CSmtpUpsResponseWaiter::NewL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   102
#endif
8b14b30db193 201044_02
hgs
parents:
diff changeset
   103
8b14b30db193 201044_02
hgs
parents:
diff changeset
   104
	if (iSettings->BearerMobility())
8b14b30db193 201044_02
hgs
parents:
diff changeset
   105
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   106
		iMobilityManager = CImMobilityManager::NewL(KUidSmtpServerMtm, aService, *this);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   107
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   108
8b14b30db193 201044_02
hgs
parents:
diff changeset
   109
	CActiveScheduler::Add(this);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   110
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   111
8b14b30db193 201044_02
hgs
parents:
diff changeset
   112
#if (defined SYMBIAN_USER_PROMPT_SERVICE)	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   113
void CMsgImOutboxSend::StartL(TRequestStatus& aStatus, TThreadId aClientThreadId, TBool aHasCapability) 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   114
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   115
	SetupStartL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   116
8b14b30db193 201044_02
hgs
parents:
diff changeset
   117
	iState = EStateUserPrompting;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   118
	iWaiter->AuthoriseAndConnectL(iSettings->SmtpSettings(), aHasCapability, aClientThreadId, iStatus);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   119
	SetActive();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   120
8b14b30db193 201044_02
hgs
parents:
diff changeset
   121
	aStatus = KRequestPending;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   122
	iReport = &aStatus;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   123
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   124
#endif
8b14b30db193 201044_02
hgs
parents:
diff changeset
   125
8b14b30db193 201044_02
hgs
parents:
diff changeset
   126
void CMsgImOutboxSend::StartL(TRequestStatus& aStatus) 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   127
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   128
	SetupStartL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   129
	StartConnectingL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   130
8b14b30db193 201044_02
hgs
parents:
diff changeset
   131
	aStatus = KRequestPending;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   132
	iReport = &aStatus;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   133
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   134
8b14b30db193 201044_02
hgs
parents:
diff changeset
   135
void CMsgImOutboxSend::SetupStartL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   136
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   137
	iSetDisconnected=EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   138
8b14b30db193 201044_02
hgs
parents:
diff changeset
   139
	//	Get count messages.. leave if none.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   140
	if (iTotalMessages == 0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   141
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   142
		//	No messages leave..
8b14b30db193 201044_02
hgs
parents:
diff changeset
   143
		User::Leave(KErrEof);			
8b14b30db193 201044_02
hgs
parents:
diff changeset
   144
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   145
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   146
	//  Set the connected flag messages..
8b14b30db193 201044_02
hgs
parents:
diff changeset
   147
	User::LeaveIfError(iServerEntry.SetEntry(KMsvGlobalOutBoxIndexEntryIdValue));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   148
	User::LeaveIfError(iServerEntry.ChangeAttributes( iEntrySelection, KMsvConnectedAttribute, 0));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   149
	iServerEntry.SetEntry(KMsvNullIndexEntryId);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   150
8b14b30db193 201044_02
hgs
parents:
diff changeset
   151
	//	Initialise the progress object..Create and start a new sesion..
8b14b30db193 201044_02
hgs
parents:
diff changeset
   152
	iProgress.InitialiseTotal(iTotalMessages);	//	Sets status=EMsgOutboxProgressWaiting etc.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   153
	iProgress.SetStatus(EMsgOutboxProgressConnecting);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   154
	iProgress.SetMsgNo(-1);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   155
	iCurrentMessageNo = -1;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   156
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   157
8b14b30db193 201044_02
hgs
parents:
diff changeset
   158
void CMsgImOutboxSend::StartConnectingL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   159
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   160
	iState = EStateConnectingSession;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   161
	iMobilityOperation = EMobilityOperationIdle;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   162
	iSession = NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   163
	if (!iSessionManager)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   164
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   165
		iSessionManager = CSmtpSessionManager::NewL(iMobilityManager, iProgress.ServiceId());
8b14b30db193 201044_02
hgs
parents:
diff changeset
   166
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   167
	iSessionManager->GetSessionL(iServerEntry, *iSettings, iSession, iStatus);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   168
	SetActive();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   169
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   170
8b14b30db193 201044_02
hgs
parents:
diff changeset
   171
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   172
A bearer switch has been requested and we should try to switch over to it.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   173
The action parameter indicates what should happen to the current operation.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   174
8b14b30db193 201044_02
hgs
parents:
diff changeset
   175
@param aAction What should happen to the current operation.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   176
@param aIsSeamless Is this a seamless switchover.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   177
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   178
void CMsgImOutboxSend::PrepareForNewCarrier(TImMobilityAction aAction, TBool /*aIsSeamless*/)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   179
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   180
	switch (aAction)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   181
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   182
		case KAcceptImmediately:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   183
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   184
			// Just kill the current operation, and then signal that we are
8b14b30db193 201044_02
hgs
parents:
diff changeset
   185
			// ready to migrate
8b14b30db193 201044_02
hgs
parents:
diff changeset
   186
			CarrierLost();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   187
			SignalMigrate();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   188
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   189
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   190
8b14b30db193 201044_02
hgs
parents:
diff changeset
   191
		case KAcceptStopCurrent:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   192
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   193
			PrepareForNewCarrierAfterOperation(EMobilityOperationStoppingCurrent);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   194
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   195
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   196
8b14b30db193 201044_02
hgs
parents:
diff changeset
   197
		case KAcceptCompleteCurrent:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   198
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   199
			PrepareForNewCarrierAfterOperation(EMobilityOperationCompletingCurrent);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   200
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   201
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   202
8b14b30db193 201044_02
hgs
parents:
diff changeset
   203
		default:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   204
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   205
			__ASSERT_DEBUG(EFalse, gPanic(EImsmUnexpectedMobilityAction));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   206
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   207
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   208
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   209
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   210
8b14b30db193 201044_02
hgs
parents:
diff changeset
   211
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   212
A bearer switch has been requested and the current bearer should be dropped
8b14b30db193 201044_02
hgs
parents:
diff changeset
   213
immediately.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   214
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   215
void CMsgImOutboxSend::CarrierLost()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   216
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   217
	switch (iState)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   218
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   219
		case EStateIdle:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   220
		case EStateWaitingNewCarrier:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   221
		case EStateMobilityError:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   222
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   223
			// do nothing
8b14b30db193 201044_02
hgs
parents:
diff changeset
   224
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   225
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   226
8b14b30db193 201044_02
hgs
parents:
diff changeset
   227
		case EStateConnectingSession:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   228
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   229
			CancelForMigrate();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   230
			StartWaitingNewCarrier();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   231
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   232
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   233
8b14b30db193 201044_02
hgs
parents:
diff changeset
   234
		case EStateSendingFiles:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   235
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   236
			CancelForMigrate();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   237
			delete iSession;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   238
			iSession = NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   239
			StartWaitingNewCarrier();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   240
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   241
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   242
8b14b30db193 201044_02
hgs
parents:
diff changeset
   243
		case EStateClosingSession:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   244
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   245
			CancelForMigrate();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   246
8b14b30db193 201044_02
hgs
parents:
diff changeset
   247
			// If we have stopped the current operation and there are still some
8b14b30db193 201044_02
hgs
parents:
diff changeset
   248
			// messages left to send then we need to wait for the migration to
8b14b30db193 201044_02
hgs
parents:
diff changeset
   249
			// occur.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   250
			// If we have completed the operation, or we have sent all the messages
8b14b30db193 201044_02
hgs
parents:
diff changeset
   251
			// then we need to exit now. We do this by pretending that no bearer
8b14b30db193 201044_02
hgs
parents:
diff changeset
   252
			// migration is currently taking place, and self completing. Execution
8b14b30db193 201044_02
hgs
parents:
diff changeset
   253
			// will then pass to the RunL which will just assume that the session
8b14b30db193 201044_02
hgs
parents:
diff changeset
   254
			// has closed at the end of the operation and we will then exit.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   255
			if (PreparingForMigration() && iCurrentMessageNo < iTotalMessages)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   256
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   257
				StartWaitingNewCarrier();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   258
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   259
			else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   260
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   261
				iMobilityOperation = EMobilityOperationIdle;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   262
				TRequestStatus* status = &iStatus;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   263
				User::RequestComplete(status, KErrNone);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   264
				SetActive();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   265
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   266
8b14b30db193 201044_02
hgs
parents:
diff changeset
   267
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   268
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   269
8b14b30db193 201044_02
hgs
parents:
diff changeset
   270
		case EStateUserPrompting:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   271
		default:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   272
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   273
			__ASSERT_DEBUG(EFalse, gPanic(EImsmUnexpectedState2));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   274
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   275
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   276
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   277
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   278
8b14b30db193 201044_02
hgs
parents:
diff changeset
   279
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   280
The new bearer is now active. Try to start using it.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   281
8b14b30db193 201044_02
hgs
parents:
diff changeset
   282
@param aNewAp New access point
8b14b30db193 201044_02
hgs
parents:
diff changeset
   283
@param aIsSeamless Is this a seamless switchover
8b14b30db193 201044_02
hgs
parents:
diff changeset
   284
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   285
void CMsgImOutboxSend::NewCarrierActive(TAccessPointInfo /*aNewAp*/, TBool /*aIsSeamless*/)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   286
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   287
	if (iState == EStateWaitingNewCarrier)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   288
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   289
		// Self complete to get the active object running again
8b14b30db193 201044_02
hgs
parents:
diff changeset
   290
		TRequestStatus* status = &iStatus;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   291
		User::RequestComplete(status, KErrNone);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   292
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   293
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   294
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   295
		if (iMobilityManager)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   296
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   297
			iMobilityManager->NewCarrierAccepted();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   298
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   299
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   300
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   301
8b14b30db193 201044_02
hgs
parents:
diff changeset
   302
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   303
An error has occured during a bearer mobility switch
8b14b30db193 201044_02
hgs
parents:
diff changeset
   304
8b14b30db193 201044_02
hgs
parents:
diff changeset
   305
@param aError Error code
8b14b30db193 201044_02
hgs
parents:
diff changeset
   306
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   307
void CMsgImOutboxSend::MobilityError(TUint /*aError*/)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   308
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   309
	CancelForMigrate();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   310
8b14b30db193 201044_02
hgs
parents:
diff changeset
   311
	TInt err = KErrNone;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   312
8b14b30db193 201044_02
hgs
parents:
diff changeset
   313
	// If the mobility error has occurred when we are closing the connection
8b14b30db193 201044_02
hgs
parents:
diff changeset
   314
	// after sending all the messages then we can just self complete to make
8b14b30db193 201044_02
hgs
parents:
diff changeset
   315
	// it look like the session close completed successfully.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   316
	// If the mobility error occurs in other states, or while closing the
8b14b30db193 201044_02
hgs
parents:
diff changeset
   317
	// session for a migration, then we should self complete with an error
8b14b30db193 201044_02
hgs
parents:
diff changeset
   318
	// so that the RunL routine cleans up and exits.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   319
	if ((iState != EStateClosingSession) ||
8b14b30db193 201044_02
hgs
parents:
diff changeset
   320
	    (PreparingForMigration() && iCurrentMessageNo < iTotalMessages))
8b14b30db193 201044_02
hgs
parents:
diff changeset
   321
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   322
		err = KErrDisconnected;	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   323
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   324
8b14b30db193 201044_02
hgs
parents:
diff changeset
   325
	iMobilityOperation = EMobilityOperationIdle;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   326
	iState = EStateMobilityError;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   327
8b14b30db193 201044_02
hgs
parents:
diff changeset
   328
	// Self complete with error code
8b14b30db193 201044_02
hgs
parents:
diff changeset
   329
	TRequestStatus* status = &iStatus;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   330
	User::RequestComplete(status, err);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   331
	SetActive();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   332
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   333
8b14b30db193 201044_02
hgs
parents:
diff changeset
   334
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   335
Get progress information for mobility plugin
8b14b30db193 201044_02
hgs
parents:
diff changeset
   336
8b14b30db193 201044_02
hgs
parents:
diff changeset
   337
@return Packaged progress information
8b14b30db193 201044_02
hgs
parents:
diff changeset
   338
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   339
const TDesC8& CMsgImOutboxSend::MobilityProgress()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   340
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   341
	iMobilityProgressBuffer = Progress();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   342
	return iMobilityProgressBuffer;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   343
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   344
8b14b30db193 201044_02
hgs
parents:
diff changeset
   345
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   346
A bearer switch has been requested and we should either stop the current
8b14b30db193 201044_02
hgs
parents:
diff changeset
   347
operation or complete it before indicating that the migration can proceed.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   348
8b14b30db193 201044_02
hgs
parents:
diff changeset
   349
@param aMobilityOperation Type of mobility operation that has been requested
8b14b30db193 201044_02
hgs
parents:
diff changeset
   350
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   351
void CMsgImOutboxSend::PrepareForNewCarrierAfterOperation(TMobilityOperation aMobilityOperation)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   352
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   353
	switch (iState)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   354
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   355
		case EStateIdle:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   356
		case EStateWaitingNewCarrier:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   357
		case EStateMobilityError:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   358
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   359
			SignalMigrate();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   360
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   361
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   362
8b14b30db193 201044_02
hgs
parents:
diff changeset
   363
		case EStateConnectingSession:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   364
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   365
			CancelForMigrate();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   366
			SignalMigrate();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   367
			StartWaitingNewCarrier();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   368
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   369
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   370
8b14b30db193 201044_02
hgs
parents:
diff changeset
   371
		case EStateSendingFiles:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   372
		case EStateClosingSession:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   373
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   374
			// Just need to store what mobility operation has been requested.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   375
			// Note that if we are sending files, the file sending operation will
8b14b30db193 201044_02
hgs
parents:
diff changeset
   376
			// see this and halt at the requested time.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   377
			iMobilityOperation = aMobilityOperation;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   378
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   379
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   380
8b14b30db193 201044_02
hgs
parents:
diff changeset
   381
		case EStateUserPrompting:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   382
		default:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   383
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   384
			__ASSERT_DEBUG(EFalse, gPanic(EImsmUnexpectedState1));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   385
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   386
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   387
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   388
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   389
8b14b30db193 201044_02
hgs
parents:
diff changeset
   390
void CMsgImOutboxSend::RunL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   391
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   392
	TInt status = iStatus.Int();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   393
8b14b30db193 201044_02
hgs
parents:
diff changeset
   394
	if (status == KErrNone)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   395
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   396
		switch (iState)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   397
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   398
			case EStateUserPrompting:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   399
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   400
				StartConnectingL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   401
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   402
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   403
8b14b30db193 201044_02
hgs
parents:
diff changeset
   404
			case EStateConnectingSession:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   405
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   406
				SessionConnectedL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   407
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   408
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   409
8b14b30db193 201044_02
hgs
parents:
diff changeset
   410
			case EStateSendingFiles:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   411
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   412
				SentFiles();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   413
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   414
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   415
8b14b30db193 201044_02
hgs
parents:
diff changeset
   416
			case EStateClosingSession:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   417
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   418
				SessionClosed();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   419
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   420
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   421
8b14b30db193 201044_02
hgs
parents:
diff changeset
   422
			case EStateWaitingNewCarrier:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   423
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   424
				MigratedL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   425
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   426
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   427
8b14b30db193 201044_02
hgs
parents:
diff changeset
   428
			case EStateMobilityError:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   429
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   430
				// A mobility error occurred while we were closing the session after
8b14b30db193 201044_02
hgs
parents:
diff changeset
   431
				// sending all the messages.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   432
				// do nothing
8b14b30db193 201044_02
hgs
parents:
diff changeset
   433
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   434
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   435
8b14b30db193 201044_02
hgs
parents:
diff changeset
   436
			default:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   437
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   438
				__ASSERT_DEBUG(EFalse, gPanic(EImsmUnexpectedState3));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   439
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   440
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   441
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   442
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   443
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   444
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   445
		switch (iState)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   446
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   447
			case EStateUserPrompting:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   448
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   449
				// do nothing
8b14b30db193 201044_02
hgs
parents:
diff changeset
   450
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   451
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   452
8b14b30db193 201044_02
hgs
parents:
diff changeset
   453
			case EStateConnectingSession:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   454
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   455
				SessionConnectionFailed();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   456
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   457
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   458
8b14b30db193 201044_02
hgs
parents:
diff changeset
   459
			case EStateSendingFiles:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   460
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   461
				// closing Session with server 	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   462
				SentFiles();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   463
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   464
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   465
8b14b30db193 201044_02
hgs
parents:
diff changeset
   466
			case EStateClosingSession:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   467
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   468
				// Failure to close a session can be ignored as it will have been
8b14b30db193 201044_02
hgs
parents:
diff changeset
   469
				// tidied up.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   470
				// Continue by assuming the close was successful.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   471
				SessionClosed();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   472
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   473
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   474
8b14b30db193 201044_02
hgs
parents:
diff changeset
   475
			case EStateMobilityError:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   476
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   477
				// do nothing
8b14b30db193 201044_02
hgs
parents:
diff changeset
   478
				break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   479
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   480
8b14b30db193 201044_02
hgs
parents:
diff changeset
   481
			case EStateWaitingNewCarrier:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   482
			default:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   483
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   484
				__ASSERT_DEBUG(EFalse, gPanic(EImsmUnexpectedState4));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   485
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   486
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   487
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   488
8b14b30db193 201044_02
hgs
parents:
diff changeset
   489
	// If we are not active then this means we should complete
8b14b30db193 201044_02
hgs
parents:
diff changeset
   490
	if (!IsActive())
8b14b30db193 201044_02
hgs
parents:
diff changeset
   491
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   492
		if (iSession)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   493
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   494
			iProgress.iSendFileProgress = iSession->FileProgress();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   495
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   496
		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   497
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   498
			iProgress.iSendFileProgress.iSessionState = EClosingSmtp;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   499
			iProgress.iSendFileProgress.iBytesSent = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   500
			iProgress.iSendFileProgress.iBytesToSend = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   501
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   502
8b14b30db193 201044_02
hgs
parents:
diff changeset
   503
		Complete(status);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   504
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   505
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   506
8b14b30db193 201044_02
hgs
parents:
diff changeset
   507
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   508
Handles leaves during RunL
8b14b30db193 201044_02
hgs
parents:
diff changeset
   509
8b14b30db193 201044_02
hgs
parents:
diff changeset
   510
@param aError Error code
8b14b30db193 201044_02
hgs
parents:
diff changeset
   511
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   512
TInt CMsgImOutboxSend::RunError(TInt aError)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   513
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   514
	switch (iState)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   515
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   516
		case EStateConnectingSession:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   517
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   518
			if (iMobilityOperation != EMobilityOperationMigrating)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   519
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   520
				iProgress.iSendFileProgress.iSessionState = EConnectingToSmtp;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   521
				iProgress.iSendFileProgress.iBytesSent = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   522
				iProgress.iSendFileProgress.iBytesToSend = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   523
				iProgress.SetMsgNo(KErrNotFound);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   524
				iProgress.SetConnectionIAP(KErrNotFound);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   525
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   526
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   527
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   528
8b14b30db193 201044_02
hgs
parents:
diff changeset
   529
		case EStateSendingFiles:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   530
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   531
			if (iSession)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   532
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   533
				iProgress.iSendFileProgress = iSession->FileProgress();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   534
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   535
			iProgress.iSendFileProgress.iSessionState = ESendingImail;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   536
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   537
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   538
8b14b30db193 201044_02
hgs
parents:
diff changeset
   539
		case EStateUserPrompting:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   540
		case EStateClosingSession:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   541
		case EStateWaitingNewCarrier:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   542
		case EStateMobilityError:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   543
		default:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   544
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   545
			__ASSERT_DEBUG(EFalse, gPanic(EImsmUnexpectedState6));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   546
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   547
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   548
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   549
8b14b30db193 201044_02
hgs
parents:
diff changeset
   550
	Complete(aError);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   551
8b14b30db193 201044_02
hgs
parents:
diff changeset
   552
	return KErrNone;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   553
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   554
8b14b30db193 201044_02
hgs
parents:
diff changeset
   555
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   556
A new session has been connected
8b14b30db193 201044_02
hgs
parents:
diff changeset
   557
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   558
void CMsgImOutboxSend::SessionConnectedL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   559
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   560
	if (iMobilityOperation == EMobilityOperationMigrating)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   561
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   562
		if (iMobilityManager)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   563
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   564
			iMobilityManager->NewCarrierAccepted();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   565
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   566
8b14b30db193 201044_02
hgs
parents:
diff changeset
   567
		if (iDecrementMessageCountAfterMigration)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   568
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   569
			--iCurrentMessageNo;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   570
			iDecrementMessageCountAfterMigration = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   571
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   572
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   573
8b14b30db193 201044_02
hgs
parents:
diff changeset
   574
	iMobilityOperation = EMobilityOperationIdle;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   575
8b14b30db193 201044_02
hgs
parents:
diff changeset
   576
	iState = EStateSendingFiles;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   577
	iSession->SendFilesL(*this, iStatus);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   578
	SetActive();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   579
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   580
8b14b30db193 201044_02
hgs
parents:
diff changeset
   581
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   582
We have completed sending the files
8b14b30db193 201044_02
hgs
parents:
diff changeset
   583
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   584
void CMsgImOutboxSend::SentFiles()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   585
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   586
	iProgress.iSendFileProgress = iSession->FileProgress();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   587
8b14b30db193 201044_02
hgs
parents:
diff changeset
   588
	iState = EStateClosingSession;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   589
	iSessionManager->DeleteSession(*iSession, iStatus);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   590
	iSession = NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   591
	SetActive();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   592
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   593
8b14b30db193 201044_02
hgs
parents:
diff changeset
   594
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   595
The session has been closed
8b14b30db193 201044_02
hgs
parents:
diff changeset
   596
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   597
void CMsgImOutboxSend::SessionClosed()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   598
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   599
	// If the session has been closed for a bearer migration, and there are still more
8b14b30db193 201044_02
hgs
parents:
diff changeset
   600
	// messages to send, then start waiting for the migration.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   601
	if (iMobilityManager)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   602
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   603
		if (PreparingForMigration() && iCurrentMessageNo < iTotalMessages)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   604
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   605
			SignalMigrate();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   606
			StartWaitingNewCarrier();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   607
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   608
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   609
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   610
8b14b30db193 201044_02
hgs
parents:
diff changeset
   611
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   612
The mobility framework has told us that the new bearer is now active. We need
8b14b30db193 201044_02
hgs
parents:
diff changeset
   613
to conect to it.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   614
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   615
void CMsgImOutboxSend::MigratedL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   616
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   617
	iState = EStateConnectingSession;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   618
	iSession = NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   619
	iSessionManager->GetSessionL(iServerEntry, *iSettings, iSession, iStatus);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   620
	SetActive();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   621
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   622
8b14b30db193 201044_02
hgs
parents:
diff changeset
   623
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   624
Failed to connect a new session
8b14b30db193 201044_02
hgs
parents:
diff changeset
   625
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   626
void CMsgImOutboxSend::SessionConnectionFailed()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   627
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   628
	if (iMobilityOperation != EMobilityOperationMigrating)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   629
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   630
		iSessionManager->ConnectionProgress(iProgress);				
8b14b30db193 201044_02
hgs
parents:
diff changeset
   631
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   632
8b14b30db193 201044_02
hgs
parents:
diff changeset
   633
	// If we support bearer mobility, then we should tell the mobility manager
8b14b30db193 201044_02
hgs
parents:
diff changeset
   634
	// to reject the carrier and then wait for a new one.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   635
	// If however we are doing the initial (non migration) session connection,
8b14b30db193 201044_02
hgs
parents:
diff changeset
   636
	// and the failure is because the network connection did not start then we
8b14b30db193 201044_02
hgs
parents:
diff changeset
   637
	// won't have registed with the mobility manager so we should just exit.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   638
	if (iMobilityManager &&
8b14b30db193 201044_02
hgs
parents:
diff changeset
   639
	   (iMobilityOperation == EMobilityOperationMigrating ||
8b14b30db193 201044_02
hgs
parents:
diff changeset
   640
	    iSessionManager->IsConnectionStarted()))
8b14b30db193 201044_02
hgs
parents:
diff changeset
   641
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   642
		iMobilityManager->NewCarrierRejected();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   643
		StartWaitingNewCarrier();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   644
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   645
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   646
8b14b30db193 201044_02
hgs
parents:
diff changeset
   647
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   648
Tell the mobility manager that we are ready for the migration to proceed
8b14b30db193 201044_02
hgs
parents:
diff changeset
   649
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   650
void CMsgImOutboxSend::SignalMigrate()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   651
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   652
	if (iMobilityManager)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   653
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   654
		iMobilityManager->MigrateToNewCarrier();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   655
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   656
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   657
8b14b30db193 201044_02
hgs
parents:
diff changeset
   658
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   659
Start waiting for the bearer migration to complete
8b14b30db193 201044_02
hgs
parents:
diff changeset
   660
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   661
void CMsgImOutboxSend::StartWaitingNewCarrier()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   662
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   663
	iState = EStateWaitingNewCarrier;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   664
	iMobilityOperation = EMobilityOperationMigrating;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   665
	iStatus = KRequestPending;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   666
	SetActive();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   667
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   668
8b14b30db193 201044_02
hgs
parents:
diff changeset
   669
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   670
Cancel the current operations prior to a migration taking place. This
8b14b30db193 201044_02
hgs
parents:
diff changeset
   671
performs the same as a normal cancel, except that it does not complete
8b14b30db193 201044_02
hgs
parents:
diff changeset
   672
the caller.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   673
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   674
void CMsgImOutboxSend::CancelForMigrate()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   675
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   676
	iCancellingForMigrate = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   677
	Cancel();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   678
	iCancellingForMigrate = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   679
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   680
8b14b30db193 201044_02
hgs
parents:
diff changeset
   681
void CMsgImOutboxSend::DoCancel()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   682
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   683
	switch (iState)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   684
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   685
		case EStateUserPrompting:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   686
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   687
#if (defined SYMBIAN_USER_PROMPT_SERVICE)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   688
			iWaiter->Cancel();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   689
#endif
8b14b30db193 201044_02
hgs
parents:
diff changeset
   690
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   691
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   692
8b14b30db193 201044_02
hgs
parents:
diff changeset
   693
		case EStateConnectingSession:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   694
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   695
			if (iMobilityOperation != EMobilityOperationMigrating)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   696
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   697
				iSessionManager->ConnectionProgress(iProgress);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   698
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   699
			iSessionManager->Cancel();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   700
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   701
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   702
8b14b30db193 201044_02
hgs
parents:
diff changeset
   703
		case EStateSendingFiles:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   704
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   705
			__ASSERT_DEBUG(iSession, gPanic(EImsmSessionNotDefined));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   706
			if (iSession)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   707
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   708
				// We should not update the file progress information if we are
8b14b30db193 201044_02
hgs
parents:
diff changeset
   709
				// cancelling for a bearer migration. For a bearer migration we
8b14b30db193 201044_02
hgs
parents:
diff changeset
   710
				// collected the progress information at the end of the last
8b14b30db193 201044_02
hgs
parents:
diff changeset
   711
				// successfully completed file and we don't want to overwrite it
8b14b30db193 201044_02
hgs
parents:
diff changeset
   712
				// with the information about the file whose send we have cancelled.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   713
				if (!iCancellingForMigrate)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   714
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   715
					iProgress.iSendFileProgress = iSession->FileProgress();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   716
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   717
8b14b30db193 201044_02
hgs
parents:
diff changeset
   718
				iSession->Cancel();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   719
				delete iSession;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   720
				iSession = NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   721
8b14b30db193 201044_02
hgs
parents:
diff changeset
   722
				// If we are cancelling for bearer migration, make sure that the
8b14b30db193 201044_02
hgs
parents:
diff changeset
   723
				// message being cancelled is restored to its original state.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   724
				// We should also decrease our message count so that it indicates
8b14b30db193 201044_02
hgs
parents:
diff changeset
   725
				// the last sent message so that we restart from the correct place
8b14b30db193 201044_02
hgs
parents:
diff changeset
   726
				// after the migration.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   727
				if (iCancellingForMigrate)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   728
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   729
					TRAP_IGNORE(RestoreBccRecipientsToHeaderL());
8b14b30db193 201044_02
hgs
parents:
diff changeset
   730
					--iCurrentMessageNo;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   731
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   732
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   733
			else
8b14b30db193 201044_02
hgs
parents:
diff changeset
   734
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   735
				TRequestStatus* status = &iStatus;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   736
				User::RequestComplete(status, KErrCancel);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   737
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   738
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   739
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   740
8b14b30db193 201044_02
hgs
parents:
diff changeset
   741
		case EStateClosingSession:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   742
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   743
			// If the session is being closed because all the emails have been sent, set
8b14b30db193 201044_02
hgs
parents:
diff changeset
   744
			// the final progress information. If the session is closing for a bearer
8b14b30db193 201044_02
hgs
parents:
diff changeset
   745
			// migration we don't want to overwrite the existing progress values.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   746
			if (!PreparingForMigration())
8b14b30db193 201044_02
hgs
parents:
diff changeset
   747
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   748
				iProgress.iSendFileProgress.iSessionState = EClosingSmtp;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   749
				iProgress.iSendFileProgress.iBytesSent = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   750
				iProgress.iSendFileProgress.iBytesToSend = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   751
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   752
8b14b30db193 201044_02
hgs
parents:
diff changeset
   753
			iSessionManager->Cancel();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   754
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   755
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   756
8b14b30db193 201044_02
hgs
parents:
diff changeset
   757
		case EStateWaitingNewCarrier:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   758
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   759
			// There is no outstanding async request so we need to self complete
8b14b30db193 201044_02
hgs
parents:
diff changeset
   760
			// to keep the active object going.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   761
			TRequestStatus* status = &iStatus;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   762
			User::RequestComplete(status, KErrCancel);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   763
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   764
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   765
8b14b30db193 201044_02
hgs
parents:
diff changeset
   766
		case EStateMobilityError:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   767
		case EStateIdle:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   768
		default:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   769
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   770
			__ASSERT_DEBUG(EFalse, gPanic(EImsmUnexpectedState5));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   771
			TRequestStatus* status = &iStatus;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   772
			User::RequestComplete(status, KErrCancel);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   773
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   774
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   775
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   776
8b14b30db193 201044_02
hgs
parents:
diff changeset
   777
	if (!iCancellingForMigrate)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   778
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   779
		//  Make sure that all message not dealt with
8b14b30db193 201044_02
hgs
parents:
diff changeset
   780
		//  already are set connected EFalse...
8b14b30db193 201044_02
hgs
parents:
diff changeset
   781
		TRAP_IGNORE(DisconnectUnsentMessagesL());
8b14b30db193 201044_02
hgs
parents:
diff changeset
   782
		iSetDisconnected=ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   783
8b14b30db193 201044_02
hgs
parents:
diff changeset
   784
		Complete(KErrCancel);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   785
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   786
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   787
8b14b30db193 201044_02
hgs
parents:
diff changeset
   788
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   789
The sending of all the emails has completed.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   790
Tidy up and complete the caller.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   791
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   792
void CMsgImOutboxSend::Complete(TInt status)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   793
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   794
    // sending of all the emails has completed, no need listen for Mobility Manager
8b14b30db193 201044_02
hgs
parents:
diff changeset
   795
	delete iMobilityManager;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   796
	iMobilityManager=NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   797
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   798
	delete iSession;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   799
	iSession = NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   800
	delete iSessionManager;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   801
	iSessionManager = NULL;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   802
8b14b30db193 201044_02
hgs
parents:
diff changeset
   803
	iState = EStateIdle;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   804
	iMobilityOperation = EMobilityOperationIdle;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   805
	iDecrementMessageCountAfterMigration = EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   806
8b14b30db193 201044_02
hgs
parents:
diff changeset
   807
	iProgress.SetStatus(EMsgOutboxProgressDone);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   808
	iProgress.SetError(status);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   809
8b14b30db193 201044_02
hgs
parents:
diff changeset
   810
	User::RequestComplete(iReport, status);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   811
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   812
8b14b30db193 201044_02
hgs
parents:
diff changeset
   813
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
   814
//	Progress()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   815
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
   816
//	Args: None
8b14b30db193 201044_02
hgs
parents:
diff changeset
   817
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
   818
//	Return Value:	Reference to a TImSmtpProgress object maintained
8b14b30db193 201044_02
hgs
parents:
diff changeset
   819
//					in CImOutboxSend...
8b14b30db193 201044_02
hgs
parents:
diff changeset
   820
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
   821
//	Remarks:		Returns the current iProgress object...
8b14b30db193 201044_02
hgs
parents:
diff changeset
   822
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
   823
const TImSmtpProgress& CMsgImOutboxSend::Progress()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   824
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   825
	switch (iState)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   826
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   827
		case EStateUserPrompting:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   828
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   829
			iProgress.iSendFileProgress.iSessionState = EConnectingToSmtp;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   830
			iProgress.iSendFileProgress.iBytesSent = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   831
			iProgress.iSendFileProgress.iBytesToSend = 0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   832
			iProgress.SetMsgNo(KErrNotFound);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   833
			iProgress.SetConnectionIAP(KErrNotFound);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   834
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   835
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   836
8b14b30db193 201044_02
hgs
parents:
diff changeset
   837
		case EStateConnectingSession:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   838
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   839
			if (iMobilityOperation != EMobilityOperationMigrating)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   840
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   841
				if (iSessionManager)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   842
					{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   843
					iSessionManager->ConnectionProgress(iProgress);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   844
					}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   845
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   846
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   847
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   848
8b14b30db193 201044_02
hgs
parents:
diff changeset
   849
		case EStateSendingFiles:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   850
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   851
			if (iSession)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   852
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   853
				iProgress.iSendFileProgress = iSession->FileProgress();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   854
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   855
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   856
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   857
8b14b30db193 201044_02
hgs
parents:
diff changeset
   858
		case EStateClosingSession:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   859
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   860
			if (iMobilityOperation != EMobilityOperationMigrating)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   861
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   862
				iProgress.SetStatus(EMsgOutboxProgressDone);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   863
				iProgress.iSendFileProgress.iSessionState = EClosingSmtp;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   864
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   865
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   866
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   867
8b14b30db193 201044_02
hgs
parents:
diff changeset
   868
		case EStateWaitingNewCarrier:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   869
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   870
			// do nothing
8b14b30db193 201044_02
hgs
parents:
diff changeset
   871
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   872
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   873
8b14b30db193 201044_02
hgs
parents:
diff changeset
   874
		case EStateIdle:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   875
		case EStateMobilityError:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   876
		default:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   877
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   878
			iProgress.SetStatus(EMsgOutboxProgressDone);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   879
			iProgress.iSendFileProgress.iSessionState = EClosingSmtp;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   880
			break;	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   881
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   882
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   883
8b14b30db193 201044_02
hgs
parents:
diff changeset
   884
	if (iProgress.MsgNo() > iProgress.SendTotal())
8b14b30db193 201044_02
hgs
parents:
diff changeset
   885
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   886
		iProgress.SetMsgNo(iProgress.SendTotal());
8b14b30db193 201044_02
hgs
parents:
diff changeset
   887
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   888
8b14b30db193 201044_02
hgs
parents:
diff changeset
   889
	if (iProgress.MsgNo() < 0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   890
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   891
		iProgress.SetMsgNo(0);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   892
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   893
8b14b30db193 201044_02
hgs
parents:
diff changeset
   894
	return iProgress;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   895
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   896
8b14b30db193 201044_02
hgs
parents:
diff changeset
   897
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
   898
//	NextFile()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   899
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
   900
//	Args:None.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   901
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
   902
//	Return Value TInt kErrXXX
8b14b30db193 201044_02
hgs
parents:
diff changeset
   903
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
   904
//	Remarks:	Called from CImStmpSession::SelectNextState() 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   905
//				Moves iServerEntry and iProgress::MsgNo() to point
8b14b30db193 201044_02
hgs
parents:
diff changeset
   906
//				to the next (or first entry to send)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   907
//				Locking done implicitly in SetEntry() call.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   908
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
   909
TInt CMsgImOutboxSend::NextFile()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   910
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   911
	if(++iCurrentMessageNo >= iTotalMessages) 	//	Stepped past the messages..return
8b14b30db193 201044_02
hgs
parents:
diff changeset
   912
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   913
		return KErrNotFound;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   914
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   915
8b14b30db193 201044_02
hgs
parents:
diff changeset
   916
	// If we are stopping for migration, exit now
8b14b30db193 201044_02
hgs
parents:
diff changeset
   917
	if (iMobilityOperation == EMobilityOperationStoppingCurrent)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   918
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   919
		iDecrementMessageCountAfterMigration = ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   920
		return KErrNotFound;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   921
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   922
8b14b30db193 201044_02
hgs
parents:
diff changeset
   923
	//	Set the ServerEntry context to the next message.. and check if the message is suspended.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   924
	//if suspended, don't send and try to send the next message
8b14b30db193 201044_02
hgs
parents:
diff changeset
   925
	TInt err = iServerEntry.SetEntry(iEntrySelection.At(iCurrentMessageNo));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   926
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   927
	if(err == KErrNotFound)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   928
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   929
		return KErrNotFound;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   930
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   931
8b14b30db193 201044_02
hgs
parents:
diff changeset
   932
	TMsvEntry entry=iServerEntry.Entry();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   933
	while(entry.SendingState()==KMsvSendStateSuspended && iServerEntry.Entry().iType==KUidMsvMessageEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   934
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   935
		if (++iCurrentMessageNo >= iTotalMessages)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   936
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   937
			err=KErrNotFound;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   938
			iProgress.UpdateFailedToSend(); //this is not the correct update.  There should be UpdateNotSent() method.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   939
			break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   940
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   941
		iProgress.UpdateFailedToSend();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   942
		err = iServerEntry.SetEntry(iEntrySelection.At(iCurrentMessageNo));
8b14b30db193 201044_02
hgs
parents:
diff changeset
   943
		entry=iServerEntry.Entry();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   944
		}			
8b14b30db193 201044_02
hgs
parents:
diff changeset
   945
8b14b30db193 201044_02
hgs
parents:
diff changeset
   946
	if(err == KErrNone && iServerEntry.Entry().iType != KUidMsvMessageEntry)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   947
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   948
		//	Next context is not a SMTP message type..
8b14b30db193 201044_02
hgs
parents:
diff changeset
   949
		err = KErrBadHandle;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   950
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   951
	if(err == KErrNone)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   952
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   953
		iProgress.SetMsgNo(iCurrentMessageNo);	//	Update iProgress.. 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   954
		
8b14b30db193 201044_02
hgs
parents:
diff changeset
   955
		//if this is the first message we are sending then reset the iProgress.iSent member.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   956
		if (iCurrentMessageNo==0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   957
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   958
			iProgress.SetConnectionIAP(0);	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   959
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   960
8b14b30db193 201044_02
hgs
parents:
diff changeset
   961
		iProgress.SetStatus(EMsgOutboxProgressSending);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   962
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   963
	return(err);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   964
	} 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   965
8b14b30db193 201044_02
hgs
parents:
diff changeset
   966
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
   967
//	SetLastMessageStatusL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
   968
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
   969
//	Args:				TTime -- time stamp..	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   970
//						TInt  -- completion reason from the last send..
8b14b30db193 201044_02
hgs
parents:
diff changeset
   971
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
   972
//	Return Value:		void.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   973
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
   974
//	Remarks:			Called by CImSmtpSession::SelectNextState() to set CMsvServeEntry
8b14b30db193 201044_02
hgs
parents:
diff changeset
   975
//						data for last file sent.. Either updates iDate etc.. or if 1st call
8b14b30db193 201044_02
hgs
parents:
diff changeset
   976
//						with messages to be sent resets iProgress.SetStatus().
8b14b30db193 201044_02
hgs
parents:
diff changeset
   977
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
   978
8b14b30db193 201044_02
hgs
parents:
diff changeset
   979
void CMsgImOutboxSend::SetLastMessageStatusL(const TTime& aTimeNow, TInt aCompletionReason)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   980
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   981
	//	If its the first message && there are messages to be sent change status..
8b14b30db193 201044_02
hgs
parents:
diff changeset
   982
	if (iTotalMessages>0) 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   983
		{ 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   984
		iProgress.SetStatus(EMsgOutboxProgressSending); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   985
		} 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   986
8b14b30db193 201044_02
hgs
parents:
diff changeset
   987
	// Store the file progress for the last file sent. This will be used in
8b14b30db193 201044_02
hgs
parents:
diff changeset
   988
	// the situation where we cancel the operation to do a bearer migration
8b14b30db193 201044_02
hgs
parents:
diff changeset
   989
	// so that the progress information is for the last file completed as
8b14b30db193 201044_02
hgs
parents:
diff changeset
   990
	// opposed to the one we have just cancelled.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   991
	if (iSession)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   992
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
   993
		iProgress.iSendFileProgress = iSession->FileProgress();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   994
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
   995
8b14b30db193 201044_02
hgs
parents:
diff changeset
   996
	//	Fill in the iServerEntry details with data from the last message
8b14b30db193 201044_02
hgs
parents:
diff changeset
   997
    //  IMCV may had left this inconsistent... so reset the iServerEntry
8b14b30db193 201044_02
hgs
parents:
diff changeset
   998
    //  explicitly....
8b14b30db193 201044_02
hgs
parents:
diff changeset
   999
	if (iCurrentMessageNo != -1)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1000
		{     
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1001
		TInt err;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1002
        err = iServerEntry.SetEntry(iEntrySelection.At(iCurrentMessageNo));
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1003
		__ASSERT_DEBUG( err == KErrNone, gPanic(EImsmServerError));
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1004
		TMsvEntry entry = iServerEntry.Entry();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1005
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1006
		//	Set date info and completion data..update the iServerEntry with this data..
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1007
		entry.iDate=aTimeNow;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1008
		if(aCompletionReason!=KErrCancel)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1009
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1010
			entry.SetFailed(aCompletionReason != KErrNone);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1011
			entry.SetSendingState(aCompletionReason==KErrNone? KMsvSendStateSent: KMsvSendStateWaiting);  //set it to send agian.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1012
			if (aCompletionReason)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1013
				entry.iError=CalculateError(aCompletionReason);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1014
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1015
		else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1016
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1017
			entry.SetFailed(EFalse);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1018
			entry.SetSendingState(KMsvSendStateSuspended);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1019
			entry.iError=KErrNone;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1020
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1021
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1022
//		if (aCompletionReason<=KErrNone)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1023
	//		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1024
			// ignore any +ve errors which may leak from the SMTP code
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1025
//			entry.iError=aCompletionReason;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1026
//			entry.SetSendingState(aCompletionReason==KErrNone? KMsvSendStateSent: KMsvSendStateWaiting);  //set it to send agian.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1027
//			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1028
		RestoreBccRecipientsToHeaderL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1029
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1030
        entry.SetConnected(EFalse);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1031
		err = iServerEntry.ChangeEntry(entry);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1032
		__ASSERT_DEBUG( err == KErrNone, gPanic(EImsmServerError));
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1033
		UpdateSummaryInfo(aCompletionReason);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1034
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1035
        //  If it went move to the "Sent" folder..
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1036
        if(!entry.Failed() && aCompletionReason!=KErrCancel)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1037
            {
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1038
            TMsvId id = entry.Id();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1039
            err = iServerEntry.SetEntry(KMsvSentEntryIdValue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1040
            if(err == KErrNone)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1041
                {
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1042
                err = iServerEntry.SetEntry(KMsvGlobalOutBoxIndexEntryId);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1043
                if(err == KErrNone)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1044
                    {
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1045
                    // Move it....
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1046
                    err = iServerEntry.MoveEntryWithinService(id, KMsvSentEntryIdValue);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1047
                    }
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1048
                }
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1049
            }
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1050
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1051
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1052
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1053
TInt CMsgImOutboxSend::CalculateError(TInt aCompletionReason)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1054
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1055
	switch (aCompletionReason)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1056
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1057
	case ESmtpMailboxNoAccess:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1058
	case ESmtpMailboxName:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1059
	case ESmtpTransactionFailed:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1060
		return KErrAccessDenied; //KSmtpLoginRefused;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1061
	default:
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1062
		break;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1063
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1064
	return KErrUnknown;		   
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1065
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1066
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1067
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1068
//	UpdateSummaryInfo()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1069
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1070
//	Args:				TInt -- KErrXXX from calling function
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1071
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1072
//	Return value:		None
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1073
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1074
//	Remarks:			Called from SetLastMessage Status just increments
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1075
//						iProgress count for sent or not sent messages...
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1076
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1077
void CMsgImOutboxSend::UpdateSummaryInfo(TInt& aReason)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1078
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1079
	if (aReason==KErrNone)	// sent message successfully
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1080
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1081
		iProgress.UpdateSent();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1082
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1083
	//	MRG 26/08/98 -- Switch statement in IdentifySmtpError() returns no
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1084
	//					error information at the moment.. 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1085
	//					else if edited accordingly..
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1086
	else /*if (IdentifySmtpError(aReason))*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1087
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1088
		iProgress.UpdateFailedToSend();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1089
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1090
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1091
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1092
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1093
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1094
//  SessionIsConnected()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1095
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1096
//  Ask for state of iSessions iSocket...
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1097
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1098
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1099
TBool CMsgImOutboxSend::SessionIsConnected()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1100
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1101
	if (iState == EStateConnectingSession)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1102
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1103
		return iSessionManager->IsSessionConnected();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1104
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1105
	else if(iSession)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1106
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1107
		return iSession->IsConnected();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1108
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1109
	else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1110
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1111
		return EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1112
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1113
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1114
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1115
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1116
void CMsgImOutboxSend::DisconnectUnsentMessagesL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1117
    {
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1118
    //  Pos errors
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1119
    TInt err = KErrNone;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1120
    //  Temp entry selection...
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1121
    CMsvEntrySelection* unsentSelection = new (ELeave) CMsvEntrySelection();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1122
    CleanupStack::PushL(unsentSelection);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1123
    //  Append unsent messages into the temp array..
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1124
    for(TInt i=0; i<iEntrySelection.Count(); i++)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1125
        {
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1126
        err = iServerEntry.SetEntry((iEntrySelection)[i]);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1127
        //  If not found carry on along the array...
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1128
        if(err != KErrNone)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1129
            continue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1130
        if(iServerEntry.Entry().Parent() == KMsvGlobalOutBoxIndexEntryIdValue)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1131
            {
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1132
            unsentSelection->AppendL((iEntrySelection)[i]);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1133
            }
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1134
        }
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1135
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1136
    //  Reset the iConnected flag on the lot.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1137
	 User::LeaveIfError(iServerEntry.SetEntry(KMsvGlobalOutBoxIndexEntryIdValue));
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1138
    if(unsentSelection->Count() > 0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1139
        {
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1140
		  User::LeaveIfError(iServerEntry.ChangeAttributes(*unsentSelection, 0, KMsvConnectedAttribute));
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1141
        }
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1142
	iServerEntry.SetEntry(KMsvNullIndexEntryId);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1143
    CleanupStack::PopAndDestroy();  //  unsentSelection..
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1144
    }
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1145
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1146
void CMsgImOutboxSend::CleanUpOnDestructL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1147
    {
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1148
	if(!iSetDisconnected)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1149
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1150
		DisconnectUnsentMessagesL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1151
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1152
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1153
	if (iStatus.Int() != KErrNone)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1154
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1155
		if ((iCurrentMessageNo != -1) && (iCurrentMessageNo<iTotalMessages))
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1156
			{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1157
			TInt err=iServerEntry.SetEntry(iEntrySelection.At(iCurrentMessageNo));
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1158
			if(err == KErrNotFound)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1159
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1160
				User::Leave(KErrNotFound);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1161
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1162
			__ASSERT_DEBUG(err == KErrNone, gPanic(EImsmServerError));
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1163
			TMsvEntry entry = iServerEntry.Entry();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1164
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1165
			RestoreBccRecipientsToHeaderL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1166
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1167
			//	Set date info and completion data..update the iServerEntry with this data..
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1168
			TInt errorCode = (TSmtpSessionError)iStatus.Int();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1169
			entry.iDate.UniversalTime();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1170
			if(errorCode!=KErrCancel)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1171
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1172
				entry.SetFailed(errorCode != KErrNone);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1173
				entry.SetSendingState(errorCode==KErrNone? KMsvSendStateSent: KMsvSendStateWaiting);  //set it to send agian.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1174
				if (errorCode)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1175
					entry.iError=CalculateError(errorCode);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1176
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1177
			else
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1178
				{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1179
				entry.SetFailed(EFalse);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1180
				entry.SetSendingState(KMsvSendStateSuspended);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1181
				entry.iError=KErrNone;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1182
				}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1183
			entry.SetConnected(EFalse);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1184
		#ifdef _DEBUG
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1185
			err = 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1186
		#endif
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1187
			iServerEntry.ChangeEntry(entry);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1188
			__ASSERT_DEBUG(err == KErrNone, gPanic(EImsmServerError));
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1189
			}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1190
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1191
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1192
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1193
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1194
//	~CMsgImOutboxSend -- destructor.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1195
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1196
CMsgImOutboxSend::~CMsgImOutboxSend( )
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1197
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1198
	Cancel();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1199
	TRAP_IGNORE(CleanUpOnDestructL());
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1200
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1201
	delete iSession;				//should be dead
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1202
	delete iSettings;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1203
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1204
	if (iBccRcptArray)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1205
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1206
		iBccRcptArray->Reset();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1207
		delete iBccRcptArray;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1208
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1209
#if (defined SYMBIAN_USER_PROMPT_SERVICE)		
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1210
	delete iWaiter;	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1211
#endif
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1212
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1213
	delete iMobilityManager;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1214
	delete iSessionManager;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1215
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1216
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1217
CDesCArray& CMsgImOutboxSend::BccRcptArray()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1218
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1219
	return *iBccRcptArray;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1220
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1221
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1222
void CMsgImOutboxSend::ResetBccRcptArrayL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1223
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1224
	if(iBccRcptArray)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1225
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1226
		iBccRcptArray->Reset();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1227
		delete iBccRcptArray;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1228
		iBccRcptArray=0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1229
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1230
	iBccRcptArray = new (ELeave) CDesCArrayFlat(KBccArraySegment);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1231
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1232
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1233
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1234
void CMsgImOutboxSend::RestoreBccRecipientsToHeaderL()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1235
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1236
	if (!iServerEntry.HasStoreL() || !iBccRcptArray || iBccRcptArray->Count()==0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1237
		return; // no recipients to restore.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1238
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1239
	CMsvStore* store = iServerEntry.EditStoreL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1240
	CleanupStack::PushL(store);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1241
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1242
	// Must have an rfc822 header.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1243
	CImHeader* header = CImHeader::NewLC();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1244
	if (store->IsPresentL( KUidMsgFileIMailHeader) )
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1245
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1246
		header->RestoreL(*store);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1247
		header->BccRecipients().Reset();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1248
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1249
		TInt ii = iBccRcptArray->Count(); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1250
		while (ii-- > 0)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1251
			header->BccRecipients().InsertL(0, (*iBccRcptArray)[ii]);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1252
		header->StoreL(*store);	
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1253
		store->CommitL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1254
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1255
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1256
	// To stop the array growing, delete and recreate.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1257
	iBccRcptArray->Reset();
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1258
	delete iBccRcptArray;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1259
	iBccRcptArray=0;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1260
	iBccRcptArray = new (ELeave) CDesCArrayFlat(KBccArraySegment);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1261
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1262
	CleanupStack::PopAndDestroy(header);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1263
	CleanupStack::PopAndDestroy(store); 
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1264
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1265
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1266
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1267
Indicates if we are preparing to do a migration based on the mobility
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1268
operation value.
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1269
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1270
@return ETrue if preparing to do a migration, EFalse otherwise
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1271
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1272
TBool CMsgImOutboxSend::PreparingForMigration()
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1273
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1274
	if (iMobilityOperation == EMobilityOperationStoppingCurrent ||
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1275
	    iMobilityOperation == EMobilityOperationCompletingCurrent)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1276
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1277
		return ETrue;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1278
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1279
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1280
	return EFalse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1281
	}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1282
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1283
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1284
Gets the access point ID in use for the connection to the server
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1285
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1286
@param aAccessPointId On return stores the access point ID value
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1287
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1288
@return KErrNone if successful, or a system wide error code
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1289
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1290
TInt CMsgImOutboxSend::GetAccessPointIdForConnection(TUint32& aAccessPointId) const
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1291
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1292
	if (iSessionManager)
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1293
		{
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1294
		return iSessionManager->GetAccessPointIdForConnection(aAccessPointId);
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1295
		}
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1296
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1297
	return KErrNotFound;
8b14b30db193 201044_02
hgs
parents:
diff changeset
  1298
	}