diff -r 000000000000 -r dfb7c4ff071f datacommsserver/esockserver/test/protocols/ipc/IPC_PROT.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/datacommsserver/esockserver/test/protocols/ipc/IPC_PROT.CPP Thu Dec 17 09:22:25 2009 +0200 @@ -0,0 +1,310 @@ +// 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" + +CIpcProtocolHolder::CIpcProtocolHolder() + :iSAPs(_FOFF(CIpcProvdBase,iLink)) + { + } + +void CIpcProtocolHolder::SocketRemoved(TInt aPort) +// +// Called from a Service providers destructor so we can keep a count of the sockets. +// + { + iNumSockets--; + if (aPort) + iPortNumbers->Free(aPort); + } + +TInt CIpcProtocolHolder::GetNextFreePort() +// +// The guts of AutoBind +// + { + return iPortNumbers->Alloc(); + } + +CIpcProtocolHolder* CIpcProtocolHolder::NewL() + { + CIpcProtocolHolder* p=new(ELeave)CIpcProtocolHolder; + CleanupStack::PushL(p); + p->iPortNumbers=CBitMapAllocator::NewL(KIPSNumberSockets+1); + p->iPortNumbers->Alloc(); // we reserve port 0 to indicate unset. + CleanupStack::Pop(); + return p; + } + +CIpcProtocolHolder::~CIpcProtocolHolder() + { + if (iPortNumbers) + { + // Check that there is only one socket allocated (we always allocate 0 in CIpcProtocolHolder::NewL above) + __ASSERT_DEBUG(iPortNumbers->Avail()==iPortNumbers->Size()-1,Panic(ECloseWithoutDeleteingAllSockets)); + delete iPortNumbers; + } + } + +TInt CIpcProtocolHolder::CheckAndAllocatePortNumber(TInt aPort) + { + + if(aPort<1 || aPort>KIPSNumberSockets) + return KErrTooBig; + + if (iPortNumbers->IsFree(aPort)) + { + iPortNumbers->AllocAt(aPort); + return KErrNone; + } + else + return KErrInUse; + } + +void CIpcProtocolHolder::Add(CIpcProvdBase* aSAP) + { + iNumSockets++; + iSAPs.AddFirst(*aSAP); + } + +CIpcProvdBase* CIpcProtocolHolder::FindPeerForConnection(TInt aPort) + { + TDblQueIter i(iSAPs); + CIpcProvdBase* p; + while (p=i++,p!=NULL) + { + if (p->iLocalAddr==aPort) + return p; + } + return NULL; + } + + +CIpcProtocol::~CIpcProtocol() + { + delete iStreamProtocolSAPs; + } + +CIpcProtocol::CIpcProtocol(TInt aProtocol) + { + __DECLARE_NAME(_S("CIpcProtocol")); + + iProtocol=aProtocol; + } + +CIpcProtocol* CIpcProtocol::NewL(TInt aProtocol) + { + CIpcProtocol* p=new(ELeave)CIpcProtocol(aProtocol); + CleanupStack::PushL(p); + p->iStreamProtocolSAPs=CIpcProtocolHolder::NewL(); + CleanupStack::Pop(p); + return p; + } + +CServProviderBase *CIpcProtocol::NewSAPL(TUint /*aProtocol*/) +// +// Socket server asking for a host resolver +// + { + + CIpcProvdBase* s=NULL; + switch(iProtocol) + { + case KSockStream: + if (iStreamProtocolSAPs->iNumSockets==KIPSNumberSockets) + User::Leave(KErrTooBig); + s=CIpcStreamProvd::NewL(iStreamProtocolSAPs); + iStreamProtocolSAPs->Add(s); + break; + case KSockDatagram: + User::Leave(KErrNotSupported); + break; + } + + return s; + } + +TBool CIpcProtocol::CanCreateSockets() +// +// Very rude question from the socket server. Doesn't even say Excuse me or please. +// + { + return ETrue; + } + +void CIpcProtocol::InitL(TDesC& /*aTag*/) +// +// InitL call from socket server. Do nothing +// + { + } + +void CIpcProtocol::BindL(CProtocolBase* /*aProtocol*/, TUint /*anId*/) +// +// BindL call from peer protocol +// + { + Panic(ECantBind); + } + +void CIpcProtocol::StartL(void) +// +// StartL call from socket server. Do nothing +// + { + + } + +void CIpcProtocol::Identify(TServerProtocolDesc *aDesc)const +// +// Identify request from SOCKET server +// + { + _LIT(ipcStream,"IPC Stream"); + _LIT(ipcDatagramm,"IPC Datagramm"); + switch(iProtocol) + { + case KSockStream: + + aDesc->iName=ipcStream; + aDesc->iAddrFamily=KIPCAddrFamily; + aDesc->iSockType=KSockStream; + aDesc->iProtocol=KIPCStreamProtocol; + + aDesc->iVersion=TVersion(KES32MajorVersionNumber,KES32MinorVersionNumber,KES32BuildVersionNumber); + aDesc->iByteOrder=ELittleEndian; + aDesc->iServiceInfo=0; + aDesc->iNamingServices=0; + aDesc->iSecurity=KSocketNoSecurity; + aDesc->iMessageSize=KSocketMessageSizeIsStream; + aDesc->iServiceTypeInfo=0; + aDesc->iNumSockets=KIPSNumberSockets; + return; + case KSockDatagram: + aDesc->iName=ipcDatagramm; + aDesc->iAddrFamily=KIPCAddrFamily; + aDesc->iSockType=KSockDatagram; + aDesc->iProtocol=KIPCDatagramProtocol; + + aDesc->iVersion=TVersion(KES32MajorVersionNumber,KES32MinorVersionNumber,KES32BuildVersionNumber); + aDesc->iByteOrder=ELittleEndian; + aDesc->iServiceInfo=KIPCDatagramServiceInfo; + aDesc->iNamingServices=0; + aDesc->iSecurity=KSocketNoSecurity; + aDesc->iMessageSize=KSocketMessageSizeNoLimit; + aDesc->iServiceTypeInfo=0; + aDesc->iNumSockets=KIPSNumberSockets; + return; + } + + } + +void CIpcProtocol::BindToL(CProtocolBase* /*protocol*/) +// +// BindL call from socket server +// + { + Panic(ECantBindTo); + } + +TInt CIpcProtocol::Send(RMBufChain &,CProtocolBase* /*aSourceProtocol*/) +// +// Send Down call from bindee +// + { + Panic(ESendCallCantBind); + return 0; + } + +void CIpcProtocol::Process(RMBufChain &,CProtocolBase* /*aSourceProtocol*/) +// +// Process up call from bindee +// + { + Panic(EProcessCallCantBind); + } + +TInt CIpcProtocol::Send(TDes8 &, TSockAddr* /*to*/,TSockAddr* /*from*/,CProtocolBase* /*aSourceProtocol*/) +// +// Send down call from bindee +// + { + Panic(ESendCallCantBind); + return KErrNone; + } + +void CIpcProtocol::Process(TDes8 & ,TSockAddr* /*from*/,TSockAddr* /*to*/,CProtocolBase* /*aSourceProtocol*/) +// +// Process up call from bindee +// + { + Panic(EProcessCallCantBind); + } + + +TInt CIpcProtocol::GetOption(TUint /*level*/,TUint /*name*/,TDes8 & /*anOption*/,CProtocolBase* /*aSourceProtocol*/) +// +// GetOption Down call from bindee +// + { + Panic(EGetOptionCallCantBind); + return KErrNone; + } + +TInt CIpcProtocol::SetOption(TUint /*level*/,TUint /*name*/,const TDesC8& /*option*/,CProtocolBase* /*aSourceProtocol*/) +// +// SetOption Down call from bindee +// + { + Panic(ESetOptionCallCantBind); + return KErrNone; + } + +void CIpcProtocol::Error(TInt /*anError*/,CProtocolBase* /*aSourceProtocol*/) +// +// Error up call from bindee +// + { + Panic(EErrorUpCallCantBind); + } + +CHostResolvProvdBase *CIpcProtocol::NewHostResolverL() +// +// Socket server asking for a host resolver +// + { + Panic(ECantCreateHostResolver); + return NULL; + } + +CServiceResolvProvdBase *CIpcProtocol::NewServiceResolverL() +// +// Socket server asking for a service resolver +// + { + Panic(ECantCreateServiceResolver); + return NULL; + } + +CNetDBProvdBase* CIpcProtocol::NewNetDatabaseL() +// +// Socket server asking for a net data base +// + { + Panic(ECantCreateNetDatabase); + return NULL; + }