email/pop3andsmtpmtm/popservermtm/src/cpopsessionmanager.cpp
changeset 0 72b543305e3a
child 76 60a8a215b0ec
--- /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 <pop3set.h>
+#include <iapprefs.h>
+#include "imutcon.h"
+#include <pops.h>
+#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;
+	}