telephonyserverplugins/multimodetsy/hayes/SCOMM.CPP
changeset 0 3553901f7fa8
child 24 6638e7f4bd8f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/multimodetsy/hayes/SCOMM.CPP	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,212 @@
+// Copyright (c) 1997-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:
+// Comms reader and writer mixin
+// 
+//
+
+#include "ATSTD.H"
+#include "SCOMM.H"
+
+MComm::MComm()
+	{
+	iCommReader = NULL;
+	iCommWriter = NULL;
+	}
+
+MComm::~MComm()
+	{
+    delete iCommReader;
+	delete iCommWriter;
+	iCommPort.Close();
+	iCommServer.Close();
+	}
+
+TInt MComm::CommOpen(const TDesC& aDll, const TDesC& aName, TCommAccess aMode)
+	{
+	TInt err;
+	if (err = iCommServer.Connect(), err!=KErrNone)
+		return err;
+	if (aDll.Length()>0)
+		{
+		if (err = iCommServer.LoadCommModule(aDll), err!=KErrNone)
+			{
+			iCommServer.Close();
+			return err;
+			}
+		}
+	if (err = iCommPort.Open(iCommServer, aName, ECommExclusive), err!=KErrNone)
+		// if any other TSY (or other app) is using comm port, we want to return gracefully
+		// with error
+		{
+		iCommServer.Close();
+		return err;
+		}
+	if (aMode==ECommShared)
+		{
+		iCommPort.Close();
+		if (err = iCommPort.Open(iCommServer, aName, aMode), err!=KErrNone)
+			{
+			iCommServer.Close();
+			return err;
+			}
+		}
+	return KErrNone;
+	}
+
+TInt MComm::CommOpen(const TDesC& aName, TCommAccess aMode)
+	{
+	TInt err;
+	if (err = iCommServer.Connect(), err!=KErrNone)
+		return err;
+	if (err = iCommPort.Open(iCommServer, aName, ECommExclusive), err!=KErrNone)
+		// if any other TSY (or other app) is using comm port, we want to return gracefully
+		// with error
+		{
+		iCommServer.Close();
+		return err;
+		}
+	if (aMode==ECommShared)
+		{
+		iCommPort.Close();
+		if (err = iCommPort.Open(iCommServer, aName, aMode), err!=KErrNone)
+			{
+			iCommServer.Close();
+			return err;
+			}
+		}
+	return KErrNone;
+	}
+
+void MComm::CommClose()
+	{
+	iCommReader->Cancel();
+	iCommWriter->Cancel();
+	iCommPort.Close();
+	iCommServer.Close();
+	}
+
+void MComm::CommConstructL(TInt aReadPriority, TInt aWritePriority)
+	{
+	iCommReader = new (ELeave) CCommReader(this, aReadPriority);
+	iCommWriter = new (ELeave) CCommWriter(this, aWritePriority);
+	};
+
+void MComm::CommWrite(const TDesC8& aDes)
+	{
+	__ASSERT_ALWAYS(iCommWriter!=NULL, Panic(EATCommand_NotConstructed));
+	iCommPort.Write(iCommWriter->StatusRef(), aDes);
+	iCommWriter->Activate();
+	}
+
+void MComm::CommWriteReady()
+	{
+	__ASSERT_ALWAYS(iCommWriter!=NULL, Panic(EATCommand_NotConstructed));
+	iCommPort.Write(iCommWriter->StatusRef(), TPtrC8(NULL, 0));
+	iCommWriter->Activate();
+	}
+
+void MComm::CommRead(TDes8& aDes)
+	{
+	__ASSERT_ALWAYS(iCommReader!=NULL, Panic(EATCommand_NotConstructed));
+	iCommPort.Read(iCommReader->StatusRef(), aDes, aDes.Length());
+	iCommReader->Activate();
+	}
+
+void MComm::CommReadOneOrMore(TDes8& aDes)
+	{
+	__ASSERT_ALWAYS(iCommReader!=NULL, Panic(EATCommand_NotConstructed));
+	iCommPort.ReadOneOrMore(iCommReader->StatusRef(), aDes);
+	iCommReader->Activate();
+	}
+
+void MComm::CommReadReady()
+	{
+	__ASSERT_ALWAYS(iCommReader!=NULL, Panic(EATCommand_NotConstructed));
+//	TRequestStatus aStatus;
+//	iCommPort.Read(aStatus,iBuf,0);
+//	User::WaitForRequest(aStatus);
+// JoeF 26.11.99. IrComm.Csy can't handle a read into a zero-length buffer and needs fixing. The
+// above lines have been removed from the TSY as a temporary workaround only, until a proper fix
+// can be implemented in IrComm.Csy
+	}
+
+void MComm::CommCancel()
+	{
+	if (iCommWriter)
+		iCommWriter->Cancel();
+	if (iCommReader)
+		iCommReader->Cancel();
+	}
+
+void MComm::CommWriteCancel()
+	{
+	if (iCommWriter)
+		iCommWriter->Cancel();
+	}
+
+void MComm::CommReadCancel()
+	{
+	if (iCommReader)
+		iCommReader->Cancel();
+	}
+
+//
+// CCommWriter
+//
+CCommWriter::CCommWriter(MComm* aComm, TInt aPriority)
+	: CActive(aPriority), iComm(aComm)
+	{
+	__DECLARE_NAME(_S("CCommWriter"));
+	CActiveScheduler::Add(this);
+	}
+
+CCommWriter::~CCommWriter()
+	{
+	Cancel();
+	}
+
+void CCommWriter::RunL()
+	{
+	iComm->CommWriteComplete(iStatus.Int());
+	}
+
+void CCommWriter::DoCancel()
+	{
+	iComm->iCommPort.WriteCancel();
+	}
+
+//
+// CCommReader
+//
+CCommReader::CCommReader(MComm* aComm, TInt aPriority)
+	: CActive(aPriority), iComm(aComm)
+	{
+	__DECLARE_NAME(_S("CCommReader"));
+	CActiveScheduler::Add(this);
+	}
+
+CCommReader::~CCommReader()
+	{
+	Cancel();
+	}
+
+void CCommReader::RunL()
+	{
+	iComm->CommReadComplete(iStatus.Int());
+	}
+
+void CCommReader::DoCancel()
+	{
+	iComm->iCommPort.ReadCancel();
+	}