diff -r 238255e8b033 -r 84d9eb65b26f email/pop3andsmtpmtm/imapservermtm/test/src/ImapSpoofServer.cpp --- /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()); + } + + } +