diff -r 000000000000 -r dfb7c4ff071f datacommsserver/esockserver/test/protocols/ipc/IPC_PRVD.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/datacommsserver/esockserver/test/protocols/ipc/IPC_PRVD.CPP Thu Dec 17 09:22:25 2009 +0200 @@ -0,0 +1,288 @@ +// 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: +// + +#include +#include "IPC_MAIN.H" +#include "ES_IPC.H" + +CIpcProvdBase::CIpcProvdBase(CIpcProtocolHolder* aProtocol) + { + __DECLARE_NAME(_S("CIpcProvdBase")); + iProtocol=aProtocol; + } + +CIpcProvdBase::~CIpcProvdBase() + { + // ensure that another CIpcProvdBase doesn't end up with a dangling pointer to this CIpcProvdBase + if (iConnection && iConnection->iConnection == this) + { + iConnection->iConnection = NULL; + } + + iProtocol->SocketRemoved(iLocalAddr); + } + +void CIpcProvdBase::RemName(TSockAddr &anAddr)const +// +// Get the remote name we would connect to +// + { + anAddr.SetPort(iRemoteAddr); + } + +TInt CIpcProvdBase::SetRemName(TSockAddr& anAddr) +// +// Set the remote name prior to connecting (or as part of a send to) +// + { + iRemoteAddr=anAddr.Port(); + return KErrNone; + } + +void CIpcProvdBase::LocalName(TSockAddr &anAddr)const +// +// Get hte local name +// + { + anAddr.SetPort(iLocalAddr); + } + +TInt CIpcProvdBase::SetLocalName(TSockAddr &anAddr) +// +// Set the local name prior to accepting +// + { + TInt ret=iProtocol->CheckAndAllocatePortNumber(anAddr.Port()); + if (ret==KErrNone) + iLocalAddr=anAddr.Port(); + return ret; + } + +void CIpcProvdBase::AutoBind( void ) +// +// Automatically set the local name +// + { + iLocalAddr=iProtocol->GetNextFreePort(); + } + +TInt CIpcProvdBase::GetOption(TUint /*level*/,TUint /*name*/,TDes8& /*anOption*/)const +// +// +// + { + return KErrNotSupported; + } + +TInt CIpcProvdBase::SetOption(TUint /*level*/,TUint /*name*/,const TDesC8& /*anOption*/) +// +// +// + { + return KErrNotSupported; + } + + + +void CIpcProvdBase::Ioctl(TUint /*level*/,TUint /*name*/,TDes8 * /*anOption*/) +// +// +// + { + iSocket->Error(KErrNotSupported,MSocketNotify::EErrorIoctl); + } + +void CIpcProvdBase::CancelIoctl(TUint /*aLevel*/,TUint /*aName*/) + { + } + +TInt CIpcProvdBase::PassiveOpen(TUint aQue,const TDesC8 &/*aConnectionData*/) +// +// +// + { + return PassiveOpen(aQue); + } + +void CIpcProvdBase::Shutdown(TCloseType option,const TDesC8 &/*aDisconnectData*/) +// +// Shutdown with disconnect data +// + { + Shutdown(option); + } + +void CIpcProvdBase::ActiveOpen(const TDesC8 &/*aConnectionData*/) +// +// Active open with connection data - pass it on +// + { + ActiveOpen(); + } + +void CIpcProvdBase::Start() +// +// Start the provider - do nothing +// + { + } + + +void CIpcProvdBase::ActiveOpen(void) +// +// Actively connect to a peer socket +// + { + + CIpcProvdBase* peer=iProtocol->FindPeerForConnection(iRemoteAddr); + CIpcProvdBase* newSocket=NULL; + if (peer) + newSocket=peer->GetCloneSocket(); + if (newSocket) + { + iConnection=newSocket; + newSocket->iConnection=this; + newSocket->iRemoteAddr=iLocalAddr; + iSocket->ConnectComplete(); + peer->Connected(*newSocket); + } + else + iSocket->Error(KErrCouldNotConnect); + } + +void CIpcProvdBase::Shutdown(TCloseType aType) + { + if (iConnection) + iConnection->Disconnect(); + iConnection=NULL; + if (aType!=EImmediate) + iSocket->CanClose(); + } + +void CIpcProvdBase::Disconnect() + { + + if (iConnection) + { + if (iSocket) + { + iSocket->Disconnect(); + } + iConnection=NULL; + } + + iState=EDisconnected; + } + +TInt CIpcProvdBase::PassiveOpen(TUint /*aQue*/) + { + iState=EWaitingConnect; + return KErrNone; + } + +void CIpcProvdBase::Connected(CIpcProvdBase& aSocket) + { + iSocket->ConnectComplete(aSocket); + } + +// + +CIpcStreamProvd* CIpcStreamProvd::NewL(CIpcProtocolHolder* aProtocol) + { + CIpcStreamProvd* p=new(ELeave)CIpcStreamProvd(aProtocol); + CleanupStack::PushL(p); + p->iBuffer.SetLengthL(KIPCStreamDefaultBufferSize); + CleanupStack::Pop(); + return p; + } + +CIpcStreamProvd::CIpcStreamProvd(CIpcProtocolHolder* aProtocol) + :CIpcProvdBase(aProtocol) + { + __DECLARE_NAME(_S("CIpcStreamProvd")); + } + +CIpcProvdBase* CIpcStreamProvd::GetCloneSocket() + { + CIpcStreamProvd* newSock=NULL; + if (iState!=EWaitingConnect) + return newSock; + + TRAPD(ret,newSock=CIpcStreamProvd::NewL(iProtocol)); + if (ret!=KErrNone) + { + iSocket->Error(ret,MSocketNotify::EErrorConnect); + return NULL; + } + + newSock->AutoBind(); + iProtocol->Add(newSock); + return newSock; + } + + +TUint CIpcStreamProvd::Write(const TDesC8& aDesc,TUint /*options*/, TSockAddr* /*anAddr*/) + { + __ASSERT_DEBUG(iSocket,Panic(EBadWriteCall)); + if (!iConnection) + { + iSocket->Error(KErrDisconnected); + // error occured, the only possible error for this protocol is KErrNoMemory + return 0; + } + TInt len=Min(aDesc.Size(),iBuffer.Length()-iBuffer.Count()); + if (len) + { + iBuffer.Add(aDesc.Ptr(),len); + iConnection->NewData(len); + } + else + { + // error occured on attempt to send data, the only possible error for + // this protocol is KErrNoMemory + return 0; + } + + return len; + } + +void CIpcStreamProvd::GetData(TDes8 &aDesc,TUint /*options*/,TSockAddr* /*anAddr*/) + { + __ASSERT_DEBUG(iConnection,Panic(EBadWriteCall)); + __ASSERT_DEBUG(iSocket,Panic(EBadWriteCall)); + + CCirBuffer& buf=((CIpcStreamProvd *)iConnection)->iBuffer; + + __ASSERT_DEBUG(aDesc.Length()<=buf.Count(),Panic(EReadGetTooMuch)); + + buf.Remove((TUint8 *)aDesc.Ptr(),aDesc.Length()); + iConnection->CanSend(); + } + +void CIpcStreamProvd::NewData(TInt aLen) +// +// New data has arrived at our oppo. +// + { + iSocket->NewData(aLen); + } + +void CIpcStreamProvd::CanSend() +// +// New space has been made (in our buffer) by at our oppo. +// + { + iSocket->CanSend(); + }