networkcontrol/ipnetworklayer/src/IPProtoSCPR.cpp
changeset 0 af10295192d8
child 52 3652a10b304a
equal deleted inserted replaced
-1:000000000000 0:af10295192d8
       
     1 // Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // IPProto SubConnection Provider implementation
       
    15 // 
       
    16 //
       
    17 
       
    18 /**
       
    19  @file
       
    20  @internalComponent
       
    21 */
       
    22 
       
    23 #include <comms-infras/corescprstates.h>
       
    24 #include <comms-infras/corescpractivities.h>
       
    25 #include "IPProtoSCPR.h"
       
    26 #include "IPProtoSCPRStates.h"
       
    27 #include <comms-infras/linkmessages.h>		// for TLinkMessage
       
    28 #include <comms-infras/ss_msgintercept.h>
       
    29 
       
    30 
       
    31 using namespace Messages;
       
    32 using namespace ESock;
       
    33 using namespace IPProtoSCpr;
       
    34 using namespace MeshMachine;
       
    35 
       
    36 //We reserve space for two preallocated activities that may start concurrently on the SCPR
       
    37 //node: destroy and data client stop.
       
    38 static const TUint KDefaultMaxPreallocatedActivityCount = 2;
       
    39 static const TUint KMaxPreallocatedActivitySize = sizeof(MeshMachine::CNodeRetryParallelActivity) + sizeof(MeshMachine::APreallocatedOriginators<4>);
       
    40 static const TUint KIPProtoSCPRPreallocatedActivityBufferSize = KDefaultMaxPreallocatedActivityCount * KMaxPreallocatedActivitySize;
       
    41 
       
    42 //-=========================================================
       
    43 //
       
    44 // Activities
       
    45 //
       
    46 //-=========================================================
       
    47 
       
    48 
       
    49 namespace IPProtoSCprProvisionActivity
       
    50 {
       
    51 DECLARE_DEFINE_NODEACTIVITY(ECFActivityStoreProvision, IPProtoSCprProvision, TCFDataClient::TProvisionConfig)
       
    52 	FIRST_NODEACTIVITY_ENTRY(CoreNetStates::TAwaitingProvision, MeshMachine::TNoTag)
       
    53 	LAST_NODEACTIVITY_ENTRY(KNoTag, IPProtoSCpr::TStoreProvision)
       
    54 NODEACTIVITY_END()
       
    55 }
       
    56 
       
    57 
       
    58 namespace IPProtoSCprStartActivity
       
    59 {
       
    60 DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFActivityStart, IPProtoSCprStart, TCFServiceProvider::TStart, PRActivities::CStartActivity::NewL)
       
    61     FIRST_NODEACTIVITY_ENTRY(CoreNetStates::TAwaitingStart, CoreNetStates::TNoTagOrBearerPresentBlockedByStop)
       
    62 	NODEACTIVITY_ENTRY(CoreNetStates::KBearerPresent, CoreNetStates::TBindSelfToPresentBearer, CoreNetStates::TAwaitingBindToComplete, MeshMachine::TTag<CoreNetStates::KBearerPresent>)
       
    63 
       
    64 	NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TSendNoBearer, MeshMachine::TAwaitingMessageState<TCFControlProvider::TBearer>, MeshMachine::TNoTagOrErrorTag)	
       
    65 
       
    66 #ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
       
    67 	NODEACTIVITY_ENTRY(KNoTag, PRStates::TSendParamsToServiceProvider, CoreNetStates::TAwaitingParamResponse, CoreNetStates::TNoTagOrBearerPresent)
       
    68 #else
       
    69 	NODEACTIVITY_ENTRY(KNoTag, IPProtoSCpr::TSendParamsToServiceProvider, CoreNetStates::TAwaitingParamResponse, CoreNetStates::TNoTagOrBearerPresent)
       
    70 #endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
       
    71 	NODEACTIVITY_ENTRY(CoreNetStates::KBearerPresent, CoreNetStates::TStartServiceProviderRetry, CoreNetStates::TAwaitingStarted, MeshMachine::TNoTag)
       
    72 	NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TStartSelf, CoreNetStates::TAwaitingDataClientStarted, MeshMachine::TNoTag)
       
    73 	THROUGH_NODEACTIVITY_ENTRY(KNoTag, IPProtoSCpr::TSendDataClientRoutedToFlow, MeshMachine::TNoTag)
       
    74 	LAST_NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TSendStarted)
       
    75 	LAST_NODEACTIVITY_ENTRY(KErrorTag, MeshMachine::TDoNothing)
       
    76 NODEACTIVITY_END()
       
    77 }
       
    78 
       
    79 #ifndef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
       
    80 namespace IPProtoSCprParamsRequest
       
    81 {
       
    82 DECLARE_DEFINE_NODEACTIVITY(ECFActivityParamRequest, IPProtoSCprSetParams, TCFScpr::TParamsRequest)
       
    83 	FIRST_NODEACTIVITY_ENTRY(SCprStates::TAwaitingParamRequest, CoreNetStates::TNoTagOrBearerPresent)
       
    84 	NODEACTIVITY_ENTRY(CoreNetStates::KBearerPresent, SCprStates::TPassToServiceProvider, CoreNetStates::TAwaitingParamResponse, CoreNetStates::TBearerPresent)
       
    85 	LAST_NODEACTIVITY_ENTRY(CoreNetStates::KBearerPresent, SCprStates::TStoreParamsAndPostToOriginators)
       
    86 	LAST_NODEACTIVITY_ENTRY(KNoTag, SCprStates::TStoreAndRespondWithCurrentParams)
       
    87 NODEACTIVITY_END()
       
    88 }
       
    89 #endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
       
    90 
       
    91 namespace IPProtoSCprAgentEventActivity
       
    92 {
       
    93 DECLARE_DEFINE_NODEACTIVITY(IPProtoSCpr::EActivityAgentEvent, AgentEvent, TLinkMessage::TAgentEventNotification)
       
    94 	NODEACTIVITY_ENTRY(KNoTag, IPProtoSCpr::TProcessAgentEvent, IPProtoSCpr::TAwaitingAgentEventNotification, MeshMachine::TNoTag)
       
    95 NODEACTIVITY_END()
       
    96 }
       
    97 
       
    98 //-=========================================================
       
    99 // Data Monitoring Activities
       
   100 //-=========================================================
       
   101 namespace IPProtoSCprDataMonitoringActivity
       
   102 {
       
   103 DECLARE_DEFINE_NODEACTIVITY(IPProtoSCpr::EActivityDataMonitoring, IPProtoSCprDataMonitoring, TCFDataMonitoringNotification::TDataMonitoringNotification)
       
   104 	FIRST_NODEACTIVITY_ENTRY(IPProtoSCpr::TAwaitingDataMonitoringNotification, MeshMachine::TNoTag)
       
   105 	LAST_NODEACTIVITY_ENTRY(KNoTag, IPProtoSCpr::TProcessDataMonitoringNotification)
       
   106 NODEACTIVITY_END()
       
   107 }
       
   108 
       
   109 namespace IPProtoSCprForwardStateChangeActivity
       
   110 {
       
   111 DECLARE_DEFINE_NODEACTIVITY(ECFActivityForwardStateChange, IPProtoSCprForwardStateChange, TCFMessage::TStateChange)
       
   112     FIRST_NODEACTIVITY_ENTRY(MeshMachine::TAwaitingMessageState<TCFMessage::TStateChange>, MeshMachine::TNoTag)
       
   113     LAST_NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TForwardToControlProvider)
       
   114 NODEACTIVITY_END()
       
   115 }
       
   116 
       
   117 namespace IPProtoSCpr
       
   118 {
       
   119 DECLARE_DEFINE_ACTIVITY_MAP(stateMap)
       
   120 	ACTIVITY_MAP_ENTRY(IPProtoSCprProvisionActivity, IPProtoSCprProvision)
       
   121 	ACTIVITY_MAP_ENTRY(IPProtoSCprStartActivity, IPProtoSCprStart)
       
   122     ACTIVITY_MAP_ENTRY(IPProtoSCprDataMonitoringActivity, IPProtoSCprDataMonitoring)
       
   123 	ACTIVITY_MAP_ENTRY(IPProtoSCprForwardStateChangeActivity, IPProtoSCprForwardStateChange) //Forward progress horizontally
       
   124 	ACTIVITY_MAP_ENTRY(IPProtoSCprAgentEventActivity, AgentEvent)
       
   125 #ifndef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
       
   126 	ACTIVITY_MAP_ENTRY(IPProtoSCprParamsRequest, IPProtoSCprSetParams)
       
   127 #endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
       
   128 ACTIVITY_MAP_END_BASE(SCprActivities, coreSCprActivities)
       
   129 }
       
   130 
       
   131 
       
   132 CIPProtoSubConnectionProvider::CIPProtoSubConnectionProvider(ESock::CSubConnectionProviderFactoryBase& aFactory)
       
   133 	:CCoreSubConnectionProvider(aFactory, IPProtoSCpr::stateMap::Self()),
       
   134 	 ALegacySubConnectionActiveApiExt(this),
       
   135 	 TIfStaticFetcherNearestInHierarchy(this),
       
   136 	 iNotify(NULL),
       
   137 	 iControl(NULL)
       
   138     {
       
   139     LOG_NODE_CREATE(KIPProtoSCPRTag, CIPProtoSubConnectionProvider);
       
   140     }
       
   141 
       
   142 void CIPProtoSubConnectionProvider::ConstructL()
       
   143     {
       
   144     ADataMonitoringProvider::ConstructL();
       
   145     CCoreSubConnectionProvider::ConstructL(KIPProtoSCPRPreallocatedActivityBufferSize);
       
   146     }
       
   147 
       
   148 
       
   149 void CIPProtoSubConnectionProvider::ReceivedL(const TRuntimeCtxId& aSender, const TNodeId& aRecipient, TSignatureBase& aMessage)
       
   150 	{
       
   151 	TNodeContext<CIPProtoSubConnectionProvider> ctx(*this, aMessage, aSender, aRecipient);
       
   152 	ESOCK_DEBUG_MESSAGE_INTERCEPT(aSender, aMessage, aRecipient);
       
   153 	CCoreSubConnectionProvider::ReceivedL(aSender, aRecipient, aMessage);
       
   154 	User::LeaveIfError(ctx.iReturn);
       
   155 	}
       
   156 
       
   157 CIPProtoSubConnectionProvider* CIPProtoSubConnectionProvider::NewL(ESock::CSubConnectionProviderFactoryBase& aFactory)
       
   158     {
       
   159     CIPProtoSubConnectionProvider* prov = new (ELeave) CIPProtoSubConnectionProvider(aFactory);
       
   160     CleanupStack::PushL(prov);
       
   161     prov->ConstructL();
       
   162     CleanupStack::Pop(prov);
       
   163     return prov;
       
   164     }
       
   165 
       
   166 CIPProtoSubConnectionProvider::~CIPProtoSubConnectionProvider()
       
   167     {
       
   168 	if (iControl)
       
   169 		delete iControl;
       
   170 	if (iNotify)
       
   171 		delete iNotify;
       
   172 
       
   173     LOG_NODE_DESTROY(KIPProtoSCPRTag, CIPProtoSubConnectionProvider);
       
   174     }
       
   175 
       
   176 void CIPProtoSubConnectionProvider::ReturnInterfacePtrL(ADataMonitoringProtocolReq*& aInterface)
       
   177 	{
       
   178 	aInterface = this;
       
   179 	}
       
   180 
       
   181 void CIPProtoSubConnectionProvider::ReturnInterfacePtrL(ESock::ALegacySubConnectionActiveApiExt*& aInterface)
       
   182 	{
       
   183 	aInterface = this;
       
   184 	}
       
   185