email/pop3andsmtpmtm/imapservermtm/test/src/ImapSpoofServer.cpp
changeset 25 84d9eb65b26f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/pop3andsmtpmtm/imapservermtm/test/src/ImapSpoofServer.cpp	Mon May 03 12:29:07 2010 +0300
@@ -0,0 +1,160 @@
+// Copyright (c) 2005-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:
+// imapserver.cpp
+// 
+//
+ 
+#include "imapspoofserver.h"
+
+//
+// CImapSpoofServer
+//
+
+const TInt KImapPortNumber = 143;
+
+CImapSpoofServer::CImapSpoofServer() : CActive(EPriorityStandard)
+	{
+	iServerStatus=EIdle;
+	}
+
+EXPORT_C CImapSpoofServer* CImapSpoofServer::NewL(MImapTestEventHandler* aOwner,const TDesC& aScriptFile)
+	{
+	CImapSpoofServer* self = NewLC(aOwner,aScriptFile);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+EXPORT_C CImapSpoofServer* CImapSpoofServer::NewLC(MImapTestEventHandler* aOwner,const TDesC& aScriptFile)
+	{
+	CImapSpoofServer* self = new(ELeave) CImapSpoofServer;
+	CleanupStack::PushL(self);
+	self->ConstructL(aOwner,aScriptFile);
+	return self;
+	}
+	
+CImapSpoofServer::~CImapSpoofServer()
+	{
+	Cancel();	
+	iListeningSocket.Close();
+	iServiceSocket.Close();
+	iSocketServer.Close();
+	delete iScriptFileProcessor;
+	}
+
+EXPORT_C TInt CImapSpoofServer::RunError(TInt aError)
+	{
+	iOwner->HandleEvent(aError);
+	return KErrNone;
+	}
+
+void CImapSpoofServer::ConstructL(MImapTestEventHandler* aOwner,const TDesC& aScriptFile)
+	{
+	CActiveScheduler::Add(this); 
+	iOwner=aOwner;
+	//connect to the socket server
+	User::LeaveIfError(iSocketServer.Connect());
+	//create the script file processor
+	iScriptFileProcessor = CScriptFileProcessor::NewL(aScriptFile);	
+	}
+
+void CImapSpoofServer::DoCancel()
+	{
+	iListeningSocket.CancelAccept();
+	}
+	
+void CImapSpoofServer::StartL()
+	{
+	iServerStatus = EWriting;
+	//set up the listening socket
+	User::LeaveIfError(iListeningSocket.Open(iSocketServer, KAfInet, KSockStream, KProtocolInetTcp));
+	//bind the listener to any address from port 143
+	TSockAddr address;
+	address.SetPort(KImapPortNumber);
+	iListeningSocket.Bind(address);
+	//listen for incomming connections
+	iListeningSocket.Listen(KListeningSocketQueueSize);
+	//accept incomming connections and use iServiceSocket to communicate with it.
+	User::LeaveIfError(iServiceSocket.Open(iSocketServer));
+	iListeningSocket.Accept(iServiceSocket,iStatus);
+	SetActive();	
+	}
+
+	
+void CImapSpoofServer::IssueWrite()
+	{			
+    iBuffer.Zero();
+  	iBuffer.Append(iNextLine);
+	iBuffer.Append(_L("\r\n"));
+	iServiceSocket.Write(iBuffer, iStatus);
+	SetActive();
+	}
+
+void CImapSpoofServer::IssueRead()
+	{
+    iBuffer.Zero();
+  	iServiceSocket.RecvOneOrMore(iBuffer, 0, iStatus,iReadLength);
+  	SetActive();
+	}
+ 
+void CImapSpoofServer::RunL()
+	{	
+	
+	CScriptFileProcessor::TDataDirection direction;
+
+	if (iStatus == KErrNone)
+		{		
+		iBuffer.TrimAll();
+		if(iServerStatus==EReading)
+			{
+			if(iNextLine!=iBuffer)
+				{
+				iOwner->HandleEvent(KErrCorrupt);		
+				}		
+			}
+		//read next line of script file
+		//if weve reached the end of the file then inform the owning object
+		TInt err = iScriptFileProcessor->ReadLine(iNextLine);
+		
+		if(err==KErrEof)
+			{
+			iOwner->HandleEvent(KErrEof);	
+			}
+		else if(err==KErrNone)
+			{
+			direction=iScriptFileProcessor->DataDirection();
+		
+    		//if we are sending then write the line, else read 
+    		if(direction==CScriptFileProcessor::EFromServer)
+    			{
+    			iServerStatus=EWriting;	
+    			IssueWrite();
+    			}
+    		else if(direction==CScriptFileProcessor::EFromClient)
+    			{
+    			iServerStatus=EReading;
+    			IssueRead();
+    			}    	
+			}
+		else
+			{
+			iOwner->HandleEvent(err);	
+			}
+		}	
+	else
+		{
+		iOwner->HandleEvent(iStatus.Int());		
+		}
+		
+	}
+