datacommsserver/esockserver/test/providers/dummy/src/dummypr_connprov.cpp
changeset 0 dfb7c4ff071f
child 17 9ddb1d67ebaf
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/esockserver/test/providers/dummy/src/dummypr_connprov.cpp	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,191 @@
+// Copyright (c) 2005-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:
+// TestDummy implementation file for a Connection Provider
+// 
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#include <comms-infras/mobilitycpractivities.h>
+#include <comms-infras/ss_nodemessages_factory.h>
+#include <es_sock.h>
+
+#include "dummypr_metaconnprov.h"
+#include "dummypr_connprov.h"
+#include "dummypr_subconnprov.h"
+
+#include <elements/sd_mintercept.h>
+
+
+#ifdef _DEBUG
+// Panic category for "absolutely impossible!" vanilla ASSERT()-type panics from this module
+// (if it could happen through user error then you should give it an explicit, documented, category + code)
+_LIT(KSpecAssert_ESockTestdmyprcn, "ESockTestdmyprcn");
+#endif
+
+#ifdef _DEBUG
+	#define KDummyCprTag KESockConnectionTag
+#endif
+
+using namespace Messages;
+using namespace ESock;
+using namespace MeshMachine;
+using namespace PRActivities;
+
+//We reserve space for two preallocated activities that may start concurrently on the CPR
+//node: destroy and data client stop.
+static const TUint KDefaultMaxPreallocatedActivityCount = 2;
+static const TUint KMaxPreallocatedActivitySize = sizeof(MeshMachine::CNodeRetryParallelActivity) + sizeof(MeshMachine::APreallocatedOriginators<4>);
+static const TUint KDummyCPRPreallocatedActivityBufferSize = KDefaultMaxPreallocatedActivityCount * KMaxPreallocatedActivitySize;
+
+//-================================================
+//
+// States and Transitions
+//
+//-================================================
+namespace DummyCPRStates
+{
+DEFINE_SMELEMENT(TSetClientAsIncoming, NetStateMachine::MStateTransition, DummyCPRStates::TContext)
+void TSetClientAsIncoming::DoL()
+	{
+    if (iContext.Node().iConnStatus == CDummyConnectionProvider::EConnIncoming)
+        {
+		TCFFactory::TPeerFoundOrCreated& dcJoined = message_cast<TCFFactory::TPeerFoundOrCreated>(iContext.iMessage);
+        Messages::ANode& incomingDCMCFNode = dcJoined.iNodeId.Node();
+        CDummySubConnectionProvider& incomingDC = mcfnode_cast<CDummySubConnectionProvider>(incomingDCMCFNode);
+        incomingDC.SetToIncomingL();
+        }
+	}
+
+DEFINE_SMELEMENT(TCreateIncomingSCPR, NetStateMachine::MStateTransition, DummyCPRStates::TContext)
+void TCreateIncomingSCPR::DoL()
+	{
+    if (iContext.Node().iConnStatus != CDummyConnectionProvider::EConnIncoming)
+        {
+        //wait forever.
+        return;
+        }
+	TCFServiceProvider::TCommsBinderRequest& commsBinderReq = message_cast<TCFServiceProvider::TCommsBinderRequest>(iContext.iMessage);
+	__ASSERT_DEBUG(commsBinderReq.iValue == TSubConnOpen::EWaitForIncoming, User::Panic(KSpecAssert_ESockTestdmyprcn, 1));
+	commsBinderReq.iValue = TSubConnOpen::ECreateNew;
+	PRStates::TCreateDataClient createSCPR(iContext);
+	createSCPR.DoL();
+	}
+
+DEFINE_SMELEMENT(TAwaitingStart, NetStateMachine::MState, DummyCPRStates::TContext)
+TBool TAwaitingStart::Accept()
+	{
+	const TLayerSelectionInfo* selectionInfo = static_cast<const TLayerSelectionInfo*>(
+		iContext.Node().AccessPointConfig().FindExtension(TLayerSelectionInfo::TypeId()));
+	ASSERT(selectionInfo); // should always be there
+
+    if (iContext.iMessage.IsMessage<TCFServiceProvider::TStart>() && 
+    	TCprConfigModifier::Is(selectionInfo->CprConfig(), TCprConfigModifier::EDontStart))
+    	{
+    	return ETrue;
+    	}
+    return EFalse;
+	}
+}
+
+//-================================================
+//
+// Activities
+//
+//-================================================
+namespace DummyCprBinderRequestActivity
+{
+DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFActivityBinderRequest, DummyCprBinderRequest, TCFServiceProvider::TCommsBinderRequest, CCommsBinderActivity::NewL)
+	FIRST_NODEACTIVITY_ENTRY(CoreNetStates::TAwaitingBinderRequest, CCommsBinderActivity::TNoTagOrWaitForIncomingOrUseExistingDefaultBlockedByBinderRequest)
+	NODEACTIVITY_ENTRY(KNoTag, PRStates::TCreateDataClient, CoreNetStates::TAwaitingDataClientJoin, MeshMachine::TNoTag)
+    NODEACTIVITY_ENTRY(CoreNetStates::KWaitForIncoming, DummyCPRStates::TCreateIncomingSCPR, MeshMachine::TAwaitingMessageState<TCFFactory::TPeerFoundOrCreated>, MeshMachine::TNoTag)
+
+	// Below this point we need to modify the error handling approach. If we're getting a TError on TBinderResponse,
+	// this means the client requesting the binder couldn't bind to it. As far as the client is concerned, this
+	// activity is finished (it has flagged an error). The standard error handling will result in erroring
+	// the originator. In this case we shouoldn't error the originator, instead, wrap up quietly.
+	THROUGH_NODEACTIVITY_ENTRY(KNoTag, CCommsBinderActivity::TProcessDataClientCreation, MeshMachine::TNoTag)
+    THROUGH_NODEACTIVITY_ENTRY(KNoTag, DummyCPRStates::TSetClientAsIncoming, MeshMachine::TTag<CoreStates::KUseExisting>)
+
+	NODEACTIVITY_ENTRY(CoreStates::KUseExisting, CCommsBinderActivity::TSendBinderResponse, CCommsBinderActivity::TAwaitingBindToComplete, MeshMachine::TNoTagOrErrorTag)
+	LAST_NODEACTIVITY_ENTRY(KNoTag, MeshMachine::TDoNothing)
+	LAST_NODEACTIVITY_ENTRY(KErrorTag, MeshMachine::TClearError)
+	LAST_NODEACTIVITY_ENTRY(CoreNetStates::KWaitForIncoming, MeshMachine::TRaiseError<KErrNotSupported>)
+NODEACTIVITY_END()
+}
+
+namespace DummyCprStartActivity
+{
+DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFActivityStart, DummyCPrStart, TCFServiceProvider::TStart, PRActivities::CStartActivity::NewL)
+    FIRST_NODEACTIVITY_ENTRY(DummyCPRStates::TAwaitingStart, MeshMachine::TNoTag)
+	LAST_NODEACTIVITY_ENTRY(KNoTag, MeshMachine::TRaiseError<KErrAbort>)
+NODEACTIVITY_END()
+}
+
+// Activity Map
+namespace DummyCPRStates
+{
+DECLARE_DEFINE_ACTIVITY_MAP(stateMap)
+   ACTIVITY_MAP_ENTRY(DummyCprBinderRequestActivity, DummyCprBinderRequest)
+   ACTIVITY_MAP_ENTRY(DummyCprStartActivity, DummyCPrStart)
+ACTIVITY_MAP_END_BASE(MobilityCprActivities, mobilityCprActivities)
+}
+
+CDummyConnectionProvider* CDummyConnectionProvider::NewL(ESock::CConnectionProviderFactoryBase& aFactory, TConnType aConnStatus)
+    {
+    CDummyConnectionProvider* self = new (ELeave) CDummyConnectionProvider(aFactory, aConnStatus);
+    CleanupStack::PushL(self);
+    self->ConstructL(KDummyCPRPreallocatedActivityBufferSize);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+
+CDummyConnectionProvider::CDummyConnectionProvider(CConnectionProviderFactoryBase& aFactory, TConnType aConnStatus)
+:	CMobilityConnectionProvider(aFactory, DummyCPRStates::stateMap::Self()),
+	TIfStaticFetcherNearestInHierarchy(this),
+    iConnStatus(aConnStatus)
+	{
+	LOG_NODE_CREATE(KDummyCprTag, CDummyConnectionProvider);
+	}
+
+CDummyConnectionProvider::~CDummyConnectionProvider()
+	{
+    LOG_NODE_DESTROY(KDummyCprTag, CDummyConnectionProvider);
+	}
+
+
+TInt CDummyConnectionProvider::ControlL(TUint aOptionLevel, TUint /*aOptionName*/, TDes8& /*aOption*/, ESock::MPlatsecApiExt* /*aPlatsecIfc*/)
+    {
+    if (aOptionLevel == EConnIncoming)
+        {
+        iConnStatus = EConnIncoming;
+        }
+    else if (aOptionLevel == EConnNoIncoming)
+        {
+        iConnStatus = EConnNoIncoming;
+        }
+    return KErrNone;
+    }
+
+void CDummyConnectionProvider::ReturnInterfacePtrL(ESock::MLegacyControlApiExt*& aInterface)
+    {
+    aInterface = this;
+    }
+
+
+