--- /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 <es_ver.h>
+#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<CIpcProvdBase> 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;
+ }