email/pop3andsmtpmtm/servermtmutils/src/IMSKSCR.CPP
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/pop3andsmtpmtm/servermtmutils/src/IMSKSCR.CPP	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,181 @@
+// Copyright (c) 1998-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 "IMSKSCR.H"
+#include "IMSK.H"
+#include "IMCVTEXT.H"
+
+
+_LIT8(K_IM_SCRIPT_WAIT_STRING, "** Read cancelled");
+
+CImTextServerScript::CImTextServerScript() : CActive(EPriorityStandard)
+	{
+	}
+
+CImTextServerScript *CImTextServerScript::NewL(TInt aPortNum)
+	{
+	CImTextServerScript* self =new(ELeave)CImTextServerScript();
+	CleanupStack::PushL(self);
+	self->ConstructL(aPortNum);
+	CleanupStack::Pop();
+	return self;
+	}
+//
+// 2nd phase of construction
+//
+void CImTextServerScript::ConstructL(TInt aPortNum)
+	{
+	CActiveScheduler::Add(this);
+	User::LeaveIfError(iFs.Connect());
+
+	TBuf<35> scriptFile; 
+	scriptFile.Format(TRefByValue<const TDesC>_L("c:\\Logs\\email\\imsk%d.scr"),aPortNum);
+	User::LeaveIfError(iFile.Open(iFs,scriptFile,EFileShareAny));
+
+#ifndef _UNICODE
+	iScriptFileText.Set(iFile);
+#endif
+
+	}
+
+CImTextServerScript::~CImTextServerScript()
+	{
+	iFile.Close();
+	iFs.Close();
+	}
+
+void CImTextServerScript::RetrieveResponse(TDes8& theBuffer, TRequestStatus& aStatus)
+	{
+	iReportStatus = &aStatus;
+    TInt fileReadErr = KErrNone;
+
+#ifndef _UNICODE
+	fileReadErr = iScriptFileText.Read(iData);
+#else
+    //  _UNICODE read one line ASCII data
+    fileReadErr = ReadLine();
+#endif
+
+	iNextFileSeg.Copy(iData);
+
+	if( fileReadErr == KErrNone)
+		{
+		theBuffer.Append(iNextFileSeg);
+		}
+	else if(fileReadErr == KErrTooBig)
+		{
+		for(;;)
+			{
+			// read response from file
+#ifndef _UNICODE
+			fileReadErr = iScriptFileText.Read(iData);
+#else
+            //  _UNICODE read one line ASCII data
+            fileReadErr = ReadLine();
+#endif
+			iNextFileSeg.Copy(iData);
+			TInt crLfPos = iNextFileSeg.Find(KImcvCRLF);
+			if(crLfPos == KErrNotFound)
+				{
+				theBuffer.Append(iNextFileSeg);
+				break;
+				}
+			else
+				{
+				theBuffer.Append(iNextFileSeg.Left(crLfPos));
+				}
+			}
+		}
+
+	iStatus = KRequestPending;
+	aStatus = KRequestPending;
+	SetActive();
+
+	if ((theBuffer.CompareF(K_IM_SCRIPT_WAIT_STRING) != 0)
+		&& (fileReadErr != KErrEof))
+		{
+		theBuffer.Append(KImcvCRLF);
+		TRequestStatus* status = &iStatus;
+		User::RequestComplete(status, KErrNone);
+		}
+	}
+
+//
+//  ReadLine() read ASCII into TBuf8 thingy if unicode build.
+//
+#ifdef _UNICODE
+TInt CImTextServerScript::ReadLine()
+    {
+    TInt err = KErrNone;
+
+    //  Read into the buffer
+    TBuf8<256> buffer;              // Max read of the Read() function..    
+    iData.Zero();
+
+    //  Get the current file position
+    TInt filePos = 0;
+    iFile.Seek(ESeekCurrent, filePos);
+
+    //  Read the buffer
+    err = iFile.Read(buffer);
+    
+    //end of file?
+    TInt s = buffer.Length();
+    if( s == 0)
+        {
+        err = KErrEof;
+        }
+
+    if(err == KErrNone)
+        {
+        //  Copy to the lfcr and then set the file pointer
+        //  to the point after that...
+        TInt pos = buffer.Find(KImcvCRLF);
+        if( pos != -1)
+            {
+            iData.Justify(buffer, pos, ELeft, ' ');
+            filePos += (pos+2);
+
+            //  Set the file pointer back to after the lfcr..
+            iFile.Seek(ESeekStart, filePos);                
+            }
+        //  Else fill the whole buffer 256 chars..
+        else
+            {
+            iData.Copy(buffer);
+            }
+        }
+    return err;
+    }
+#endif
+
+void CImTextServerScript::RunL()
+	{
+	User::RequestComplete(iReportStatus, KErrNone);
+	}
+
+void CImTextServerScript::DoCancel()
+	{
+	if (IsActive())
+		{
+		if (iStatus == KRequestPending)
+			{
+			TRequestStatus* status = &iStatus;
+			User::RequestComplete(status, KErrNone);
+			}
+		User::RequestComplete(iReportStatus, KErrNone);
+		}
+	}
+