libraries/iosrv/server/endpoint.cpp
changeset 0 7f656887cf89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libraries/iosrv/server/endpoint.cpp	Wed Jun 23 15:52:26 2010 +0100
@@ -0,0 +1,210 @@
+// endpoint.cpp
+// 
+// Copyright (c) 2006 - 2010 Accenture. All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the "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:
+// Accenture - Initial contribution
+//
+
+#include "server.h"
+#include "endpoint.h"
+#include "log.h"
+
+#ifdef IOSRV_LOGGING
+#define ENDPOINT_NAME TName endPointName(Name())
+#define READER_NAME(x) TName readerName((x).IorName())
+#define WRITER_NAME(x) TName writerName((x).IowName())
+#else
+#define ENDPOINT_NAME
+#define READER_NAME(x)
+#define WRITER_NAME(x)
+#endif
+
+CIoEndPoint::~CIoEndPoint()
+	{
+	ENDPOINT_NAME;
+	LOG(CIoLog::Printf(_L("End point \"%S\" (0x%08x) destroying"), &endPointName, this));
+	iAttachedReaders.Close();
+	}
+	
+TName CIoEndPoint::IoepName() const
+	{
+	return Name();
+	}
+	
+TBool CIoEndPoint::IoepIsType(RIoHandle::TType aType) const
+	{
+	return IsType(aType);
+	}
+
+void CIoEndPoint::IorepAttachL(MIoReader& aReader, RIoEndPoint::TReadMode aMode)
+	{
+	ENDPOINT_NAME;
+	READER_NAME(aReader);
+	LOG(CIoLog::Printf(_L("Attaching reader \"%S\" (0x%08x) to end point \"%S\" (0x%08x)"), &readerName, &aReader, &endPointName, this));
+	User::LeaveIfError(Open());
+	CleanupClosePushL(*this);
+	if (aMode == RIoEndPoint::EForeground)
+		{
+		User::LeaveIfError(iAttachedReaders.Insert(&aReader, 0));
+		}
+	else
+		{
+		User::LeaveIfError(iAttachedReaders.Append(&aReader));
+		}
+	TInt err = HandleReaderAttached(aReader);
+	if (err!=KErrNone)
+		{
+		TInt index = FindReader(aReader);
+		iAttachedReaders.Remove(index);
+		User::Leave(err);
+		}
+	if (aMode == RIoEndPoint::EForeground)
+		{
+		HandleForegroundReaderChanged();
+		}
+	CleanupStack::Pop(this);
+	}
+
+void CIoEndPoint::IorepDetach(MIoReader& aReader)
+	{
+	ENDPOINT_NAME;
+	READER_NAME(aReader);
+	TInt index = FindReader(aReader);
+	if (index >= 0)
+		{
+		LOG(CIoLog::Printf(_L("Detaching reader \"%S\" (0x%08x) from end point \"%S\" (0x%08x)"), &readerName, &aReader, &endPointName, this));
+		iAttachedReaders.Remove(index);
+		HandleReaderDetached(aReader);
+		if ((index == 0) && (iAttachedReaders.Count() > 0))
+			{
+			HandleForegroundReaderChanged();
+			}
+		Close();
+		}
+	else
+		{
+		LOG(CIoLog::Printf(_L("Reader \"%S\" (0x%08x) not attached to end point \"%S\" (0x%08x) - detach request ignored"), &readerName, &aReader, &endPointName, this));
+		}
+	}
+
+void CIoEndPoint::IorepSetForegroundReaderL(MIoReader& aReader)
+	{
+	TInt index = FindReader(aReader);
+	User::LeaveIfError(index);
+	if (index > 0)
+		{
+		iAttachedReaders.Remove(index);
+		iAttachedReaders.Insert(&aReader, 0); // Shouldn't fail due to the above removal.
+		HandleForegroundReaderChanged();
+		}
+	}
+
+TBool CIoEndPoint::IorepIsForegroundL(const MIoReader& aReader) const
+	{
+	TInt index = FindReader(aReader);
+	User::LeaveIfError(index);
+	return (index == 0);
+	}
+	
+void CIoEndPoint::IowepAttachL(MIoWriter& aWriter)
+	{
+	User::LeaveIfError(Open());
+	++iAttachedWriterCount;
+	ENDPOINT_NAME;
+	WRITER_NAME(aWriter);
+	LOG(CIoLog::Printf(_L("Attached writer \"%S\" (0x%08x) to end point \"%S\" (0x%08x) (%d writers now attached)"), &writerName, &aWriter, &endPointName, this, iAttachedWriterCount));
+	TInt err = HandleWriterAttached(aWriter);
+	if (err!=KErrNone)
+		{
+		--iAttachedWriterCount;
+		User::Leave(err);
+		}
+	}
+
+void CIoEndPoint::IowepDetach(MIoWriter& aWriter)
+	{
+	--iAttachedWriterCount;
+	ENDPOINT_NAME;
+	WRITER_NAME(aWriter);
+	LOG(CIoLog::Printf(_L("Detached writer \"%S\" (0x%08x) from end point \"%S\" (0x%08x) (%d writers now attached)"), &writerName, &aWriter, &endPointName, this, iAttachedWriterCount));
+	HandleWriterDetached(aWriter);
+	Close();
+	}
+
+TInt CIoEndPoint::HandleReaderAttached(MIoReader&)
+	{
+	return KErrNone;
+	}
+
+void CIoEndPoint::HandleReaderDetached(MIoReader&)
+	{
+	}
+	
+void CIoEndPoint::ForegroundReaderChanged()
+	{
+	}
+
+TInt CIoEndPoint::HandleWriterAttached(MIoWriter&)
+	{
+	return KErrNone;
+	}
+
+void CIoEndPoint::HandleWriterDetached(MIoWriter&)
+	{
+	}
+
+void CIoEndPoint::HandleForegroundReaderChanged()
+	{
+	MIoReader* fg = AttachedReader();
+	if (fg)
+		{
+		fg->IorReaderChange(RIoReadHandle::EGainedForeground);
+		}
+	ForegroundReaderChanged();
+	}
+
+CIoEndPoint::CIoEndPoint()
+	{
+	}
+
+TInt CIoEndPoint::NumAttachedReaders() const
+	{
+	return iAttachedReaders.Count();
+	}
+
+MIoReader* CIoEndPoint::AttachedReader(TInt aIndex)
+	{
+	if ((aIndex >= 0) && (aIndex < iAttachedReaders.Count()))
+		{
+		return iAttachedReaders[aIndex];
+		}
+	return NULL;
+	}
+
+TInt CIoEndPoint::NumAttachedWriters() const
+	{
+	return iAttachedWriterCount;
+	}
+
+TInt CIoEndPoint::FindReader(MIoReader& aReader) const
+	{
+	const TInt numReaders = iAttachedReaders.Count();
+	for (TInt i = 0; i < numReaders; ++i)
+		{
+		if (iAttachedReaders[i] == &aReader)
+			{
+			return i;
+			}
+		}
+	return KErrNotFound;
+	}
+
+TInt CIoEndPoint::FindReader(const MIoReader& aReader) const
+	{
+	return FindReader(const_cast<MIoReader&>(aReader));
+	}