diff -r 08008ce8a6df -r bde600d88860 messagingfw/msgtest/tools/spoofserver/src/CSpoofServer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingfw/msgtest/tools/spoofserver/src/CSpoofServer.cpp Fri Jun 04 10:32:16 2010 +0100 @@ -0,0 +1,137 @@ +// 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: +// + +#include "cspoofserver.h" + +const TInt KListeningSocketQueueSize = 1; + +CSpoofServer::CSpoofServer(MImapTestEventHandler& aObserver) +: CActive(EPriorityStandard), iObserver(aObserver) + { + iServerStatus=EIdle; + CActiveScheduler::Add(this); + } + +EXPORT_C CSpoofServer* CSpoofServer::NewL(MImapTestEventHandler& aObserver,const TDesC& aScriptFile) + { + CSpoofServer* self = NewLC(aObserver,aScriptFile); + CleanupStack::Pop(self); + return self; + } + +EXPORT_C CSpoofServer* CSpoofServer::NewLC(MImapTestEventHandler& aObserver,const TDesC& aScriptFile) + { + CSpoofServer* self = new(ELeave) CSpoofServer(aObserver); + CleanupStack::PushL(self); + self->ConstructL(aScriptFile); + return self; + } + +CSpoofServer::~CSpoofServer() + { + Cancel(); + iListeningSocket.Close(); + iServiceSocket.Close(); + iSocketServer.Close(); + delete iScriptFileProcessor; + } + +EXPORT_C TInt CSpoofServer::RunError(TInt aError) + { + iObserver.TestComplete(aError); + return KErrNone; + } + +void CSpoofServer::ConstructL(const TDesC& aScriptFile) + { + //connect to the socket server + User::LeaveIfError(iSocketServer.Connect()); + //create the script file processor + iScriptFileProcessor = CScriptFileProcessor::NewL(aScriptFile); + } + +void CSpoofServer::DoCancel() + { + iListeningSocket.CancelAll(); + } + +EXPORT_C void CSpoofServer::StartL(const TInt aPortNumber) + { + iServerStatus = EWriting; + //set up the listening socket + User::LeaveIfError(iListeningSocket.Open(iSocketServer, KAfInet, KSockStream, KProtocolInetTcp)); + //bind the listener + TSockAddr address; + address.SetPort(aPortNumber); + 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 CSpoofServer::IssueWrite() + { + iBuffer.Zero(); + iBuffer.Append(iNextLine); + _LIT(KEndOfLine,"\r\n"); + iBuffer.Append(KEndOfLine); + iServiceSocket.Write(iBuffer, iStatus); + SetActive(); + } + +void CSpoofServer::IssueRead() + { + iBuffer.Zero(); + iServiceSocket.RecvOneOrMore(iBuffer, 0, iStatus,iReadLength); + SetActive(); + } + +void CSpoofServer::RunL() + { + User::LeaveIfError(iStatus.Int()); + + CScriptFileProcessor::TDataDirection direction; + + iBuffer.TrimAll(); + if(iServerStatus==EReading) + { + if(iNextLine!=iBuffer) + { + User::Leave(KErrCorrupt); + } + } + //read next line of script file and get its direction + User::LeaveIfError(iScriptFileProcessor->ReadLine(iNextLine)); + 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(); + } + } + + + +