diff -r 000000000000 -r 72b543305e3a email/pop3andsmtpmtm/popservermtm/src/cpopsessionmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/pop3andsmtpmtm/popservermtm/src/cpopsessionmanager.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,323 @@ +// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include "cpopsessionmanager.h" +#include +#include +#include "imutcon.h" +#include +#include "POPS.PAN" + +GLREF_C void Panic(TPopsPanic aPanic); + +/** +Factory constructor + +@return Constructed session manager +*/ +CPopSessionManager* CPopSessionManager::NewL() + { + CPopSessionManager* self = new (ELeave) CPopSessionManager(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +/** +Constructor +*/ +CPopSessionManager::CPopSessionManager() : + CMsgActive(KImPopSessionPriority) + { + } + +/** +Second phase constructor +*/ +void CPopSessionManager::ConstructL() + { + User::LeaveIfError(iServ.Connect()); + CActiveScheduler::Add(this); + } + +/** +Destructor +*/ +CPopSessionManager::~CPopSessionManager() + { + Cancel(); + delete iConnect; + iServ.Close(); + } + +/** +Gets a new logged in POP session. +The caller passes a reference to a session pointer which they should initially +set to NULL. If the client status is completed with KErrNone, then their pointer +will have been updated to point to the new session. If the client status completes +with an error then their pointer will not be updated. + +@param aSettings POP settings +@param aIAPPrefs IAP preferences +@param aSession Used to store session to pass back to caller +@param aClientStatus Signals completion of the request +*/ +void CPopSessionManager::GetSessionL(CImPop3Settings& aSettings, + CImIAPPreferences& aIAPPrefs, + CImPop3Session*& aSession, + TRequestStatus& aClientStatus) + { + iSettings = &aSettings; + iIAPPrefs = &aIAPPrefs; + iStoreSession = &aSession; + + CreateConnectionL(); + + Queue(aClientStatus); + } + +/** +Deletes a session. + +@param aSession The session to delete. This routine takes immediate ownsership + of the session. +@param aClientStatus Signals completion of the request +*/ +void CPopSessionManager::DeleteSession(CImPop3Session& aSession, + TRequestStatus& aClientStatus) + { + iSession = &aSession; + QuitSession(); + Queue(aClientStatus); + } + +/** +Gets the progress of a connection + +@param aProgress Stores the progress information +*/ +void CPopSessionManager::ConnectionProgress(TPop3Progress& aProgress) + { + TUint32 iap = 0; + TInt iapErr = KErrNotFound; + + if (iSession) + { + aProgress.iTotalMsgs = iSession->TextServerSession()->GetConnectionStage(); + + iapErr = iSession->TextServerSession()->GetIAPValue(iap); + } + else if (iConnect) + { + TNifProgress progress; + TInt err = iConnect->Progress(progress); + if (err == KErrNone) + { + aProgress.iTotalMsgs = progress.iStage; + } + else + { + aProgress.iTotalMsgs = err; + } + + iapErr = iConnect->GetIAPValue(iap); + } + else + { + aProgress.iTotalMsgs = KErrNotFound; + } + + if (iapErr == KErrNone) + { + aProgress.iTotalBytes = iap; + } + else + { + aProgress.iTotalBytes = iapErr; + } + } + +/** +Called when asynchronous event completes. +*/ +void CPopSessionManager::DoRunL() + { + switch (iState) + { + case EStateCreatingConnection: + { + CreateSessionL(); + break; + } + + case EStateCreatingSession: + { + StoreSession(); + break; + } + + case EStateQuittingSession: + { + // We have quit successfully, so we can delete the session now. + delete iSession; + iSession = NULL; + break; + } + + case EStateStoringSession: + default: + { + Panic(EPopSessionManagerInvalidState); + break; + } + } + } + +/** +Cancel an outstanding asynchronous request. +*/ +void CPopSessionManager::DoCancel() + { + if (iState == EStateCreatingConnection) + { + iConnect->Cancel(); + } + else if (iSession) + { + iSession->Cancel(); + } + + // Tell base class to finish up. + CMsgActive::DoCancel(); + } + +/** +The clients outstanding asynchronous request has been completed. + +@param aStatus Status of completed operation. +*/ +void CPopSessionManager::DoComplete(TInt& aStatus) + { + if (aStatus != KErrNone) + { + // If an error occured or the client cancelled the request then + // perform all the cleanup. + delete iSession; + iSession = NULL; + + if (iState == EStateCreatingConnection) + { + delete iConnect; + iConnect = NULL; + } + } + else + { + iSession = NULL; + } + } + +/** +Creates the network connection if it has not already been created. +*/ +void CPopSessionManager::CreateConnectionL() + { + iState = EStateCreatingConnection; + + if (iConnect) + { + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrNone); + } + else + { + iConnect = CImConnect::NewL(*iIAPPrefs, iServ); + iConnect->StartL(iStatus); + } + SetActive(); + } + +/** +Returns ETrue if the session manager has access to an RConnection + +@return TBool +*/ +TBool CPopSessionManager::HasConnection() + { + if (iConnect) + { + return ETrue; + } + return EFalse; + } + +/** +Requests an already connected RConnection from the Mobility Manager +and returns the RConnection, this method is called by the POP Server MTM. +*/ +RConnection& CPopSessionManager::GetConnection() + { + // Get the Connection from CImConnect and pass on to the Server MTM + return iConnect->GetConnection(); + } + +/** +Starts the creation of a session. +*/ +void CPopSessionManager::CreateSessionL() + { + iState = EStateCreatingSession; + + iSession = CImPop3Session::NewL(iServ, *iConnect); + iSession->ConnectL(iSettings, *iIAPPrefs, iStatus); + SetActive(); + } + +/** +Stores the created session via the reference passed by the client +*/ +void CPopSessionManager::StoreSession() + { + iState = EStateStoringSession; + *iStoreSession = iSession; + } + +/** +Quit from the server +*/ +void CPopSessionManager::QuitSession() + { + iState = EStateQuittingSession; + iSession->Quit(iStatus); + SetActive(); + } + +/** +Gets the access point ID in use for the connection to the server + +@param aAccessPointId On return stores the access point ID value + +@return KErrNone if successful, or a system wide error code +*/ +TInt CPopSessionManager::GetAccessPointIdForConnection(TUint32& aAccessPointId) const + { + if (iConnect) + { + return iConnect->GetIAPValue(aAccessPointId); + } + + return KErrNotFound; + }