networkcontrol/iptransportlayer/src/policyrequest.cpp
changeset 0 af10295192d8
equal deleted inserted replaced
-1:000000000000 0:af10295192d8
       
     1 // Copyright (c) 1997-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 //
       
    15 
       
    16 #include <comms-infras/ss_log.h>
       
    17 #include <comms-infras/ss_nodemessages.h>
       
    18 #include "ss_std.h"
       
    19 #include "ss_glob.h"
       
    20 #include <comms-infras/ss_subconnflow.h>
       
    21 #include <comms-infras/ss_roles.h>
       
    22 #include <comms-infras/ss_tiermanagerutils.h>
       
    23 #include "policyrequest.h"
       
    24 #include <comms-infras/ss_esockstates.h>
       
    25 #include "policyrequeststates.h"
       
    26 #include <comms-infras/ss_tiermanager.h>
       
    27 #include <comms-infras/ss_corepractivities.h>
       
    28 
       
    29 #include <comms-infras/ss_nodemessages_serviceprovider.h>
       
    30 #include <comms-infras/ss_nodemessages_subconn.h>
       
    31 
       
    32 using namespace Messages;
       
    33 using namespace MeshMachine;
       
    34 using namespace ESock;
       
    35 using namespace NetStateMachine;
       
    36 using namespace PolicyRequestStates;
       
    37 
       
    38 
       
    39 namespace PolicyRequestErrorActivity
       
    40 {
       
    41 DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFActivityError, PolicyRequestError, TEBase::TError, PolicyRequestActivities::CPolicyRequestActivity::NewL)
       
    42 	FIRST_NODEACTIVITY_ENTRY(PolicyRequestStates::TAwaitingError, MeshMachine::TNoTag)
       
    43 	THROUGH_NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TLeaveServiceProvidersOrSetIdle, MeshMachine::TNoTag)
       
    44 	//TDestroyAwaitingLeaveCompleteLoop loops back to its own triple if more SPs
       
    45 	NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TSetIdleIfNoServiceProviders, MeshMachine::TAwaitingLeaveComplete, CoreActivities::CDestroyActivity::TNoTagOrNoTagBackwards)
       
    46 	LAST_NODEACTIVITY_ENTRY(KNoTag, CoreStates::TAbortAllActivities)
       
    47 NODEACTIVITY_END()
       
    48 }
       
    49 
       
    50 namespace PolicyConnectionActivity
       
    51 {
       
    52 //TODO perhaps get this from a header file since its used in a number of places - see ss_subconn.cpp
       
    53 typedef MeshMachine::TAcceptErrorState<CoreNetStates::TAwaitingApplyResponse> TAwaitingApplyResponseOrError;
       
    54 
       
    55 DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFPolicyConnectionActivity, PolicyConnection, TCFIPMessage::TPolicyRequest, PolicyRequestActivities::CPolicyRequestActivity::NewL)
       
    56 	FIRST_NODEACTIVITY_ENTRY(PolicyRequestStates::TAwaitingConnPolicyRequest, MeshMachine::TNoTag)
       
    57 	NODEACTIVITY_ENTRY(KNoTag, PolicyRequestStates::TJoinCpr, CoreStates::TAwaitingJoinComplete, MeshMachine::TNoTag)
       
    58 	NODEACTIVITY_ENTRY(KNoTag, PolicyRequestStates::TRequestCommsBinderFromSCpr, PolicyRequestStates::TAwaitingBinderResponse, MeshMachine::TNoTag)
       
    59 	NODEACTIVITY_ENTRY(KNoTag, PolicyRequestStates::TJoinReceivedSCpr, CoreStates::TAwaitingJoinComplete, MeshMachine::TNoTag)
       
    60 
       
    61 	THROUGH_NODEACTIVITY_ENTRY(KNoTag, PolicyRequestStates::TSendBindToComplete, MeshMachine::TNoTag)
       
    62     NODEACTIVITY_ENTRY(KNoTag, PolicyRequestStates::TLeaveCpr, MeshMachine::TAwaitingLeaveComplete, MeshMachine::TNoTag)
       
    63 
       
    64 	NODEACTIVITY_ENTRY(KNoTag, PolicyRequestStates::TJoinTheDeftSCPr, CoreStates::TAwaitingJoinComplete, MeshMachine::TNoTag)
       
    65 	//NODEACTIVITY_ENTRY(KNoTag, PolicyRequestStates::TSendRejoinDataClientRequestToDeftSCPr, CoreNetStates::TAwaitingRejoinDataClientComplete, MeshMachine::TNoTag)
       
    66 	NODEACTIVITY_ENTRY(KNoTag, PolicyRequestStates::TSendRejoinDataClientRequestToDeftSCPr, CoreNetStates::TAwaitingRejoinDataClientComplete, MeshMachine::TNoTagOrErrorTag)
       
    67 	NODEACTIVITY_ENTRY(KErrorTag, PolicyRequestStates::TLeaveTheDeftSCPr, MeshMachine::TAwaitingLeaveComplete, MeshMachine::TTag<KErrorTag>)
       
    68 
       
    69 	// send param bundle with qos params
       
    70 	NODEACTIVITY_ENTRY(KNoTag, PolicyRequestStates::TSendQoSParamsToNewSCpr, CoreNetStates::TAwaitingParamResponse, MeshMachine::TNoTagOrErrorTag)
       
    71 
       
    72 	//When adding socket, add first, remove later.
       
    73 	NODEACTIVITY_ENTRY(KNoTag, PolicyRequestStates::TSendApplyToNewSCPr, TAwaitingApplyResponseOrError, MeshMachine::TNoTagOrErrorTag)
       
    74 	NODEACTIVITY_ENTRY(KNoTag, PolicyRequestStates::TSendApplyToDeftSCPr, TAwaitingApplyResponseOrError, MeshMachine::TNoTagOrErrorTag)
       
    75 
       
    76     NODEACTIVITY_ENTRY(KErrorTag, PolicyRequestStates::TSendCancelToDeftSCPr, PolicyRequestStates::TAwaitingCancelError, MeshMachine::TNoTag)
       
    77 	NODEACTIVITY_ENTRY(KNoTag,    PolicyRequestStates::TLeaveTheDeftSCPr, MeshMachine::TAwaitingLeaveComplete, MeshMachine::TNoTag)
       
    78 
       
    79 	//Cleanup
       
    80 	NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TLeaveServiceProvidersOrSetIdle, MeshMachine::TAwaitingLeaveComplete, MeshMachine::TNoTag)
       
    81 	NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TSetIdleIfNoServiceProviders, MeshMachine::TAwaitingLeaveComplete, CoreActivities::CDestroyActivity::TNoTagOrNoTagBackwards)
       
    82 	LAST_NODEACTIVITY_ENTRY(KNoTag, MeshMachine::TDoNothing)
       
    83 NODEACTIVITY_END()
       
    84 }
       
    85 
       
    86 namespace PolicyRequestIgnoreSubConEvent
       
    87 {
       
    88 DECLARE_DEFINE_NODEACTIVITY(ECFActivityNotification, PolicyRequestSCprNotif, TCFSubConnControlClient::TSubConnNotification)
       
    89     NODEACTIVITY_ENTRY(KNoTag, PolicyRequestStates::TIgnoreAndCloseSubConEvent, CoreNetStates::TAwaitingSubConEvent, MeshMachine::TNoTag)
       
    90 NODEACTIVITY_END()
       
    91 }
       
    92 
       
    93 namespace PolicyRequestActivities
       
    94 {
       
    95 DECLARE_DEFINE_ACTIVITY_MAP(policyRequestActivities)
       
    96 	ACTIVITY_MAP_ENTRY(PolicyConnectionActivity, PolicyConnection)
       
    97 	ACTIVITY_MAP_ENTRY(PolicyRequestErrorActivity, PolicyRequestError)
       
    98 	ACTIVITY_MAP_ENTRY(PolicyRequestIgnoreSubConEvent, PolicyRequestSCprNotif)
       
    99 ACTIVITY_MAP_END()
       
   100 }
       
   101 
       
   102 CPolicyRequest::CPolicyRequest(const TCFConnPolicyRequest& aMsg)
       
   103 :   ACFMMNodeIdBase(PolicyRequestActivities::policyRequestActivities::Self())
       
   104 	{
       
   105 	iParamBundle.Open(aMsg.iParamBundle);
       
   106 	iFlowNodeId = aMsg.iFlowNodeId;
       
   107 	iSenderSCPrNodeId = aMsg.iSenderSCPrNodeId;
       
   108 	iIPCPrNodeId = aMsg.iIPCPrNodeId;
       
   109 	iNewSCprId.SetNull();
       
   110 
       
   111 	//iMessage.Adopt(static_cast<RSafeMessage&>(const_cast<RMessage2&>(aMessage)));
       
   112 	LOG_NODE_CREATE(KESockConnectionTag, CPolicyRequest);
       
   113 	}
       
   114 
       
   115 CPolicyRequest::~CPolicyRequest()
       
   116 	{
       
   117 	//ASSERT(!iMessage.IsNull());
       
   118 	//iMessage.Complete(iError);
       
   119 	iParamBundle.Close();
       
   120 	LOG_NODE_DESTROY(KESockConnectionTag, CPolicyRequest);
       
   121 	}
       
   122 
       
   123 void CPolicyRequest::Received(TNodeContextBase& aContext)
       
   124     {
       
   125     Messages::TNodeSignal::TMessageId noPeerIds[] = {
       
   126     	TCFIPMessage::TPolicyRequest::Id(),
       
   127     	Messages::TNodeSignal::TMessageId()
       
   128     	};
       
   129     MeshMachine::AMMNodeBase::Received(noPeerIds, aContext);
       
   130 	MeshMachine::AMMNodeBase::PostReceived(aContext);
       
   131 	}
       
   132 
       
   133 void CPolicyRequest::ReceivedL(const TRuntimeCtxId& aSender, const TNodeId& aRecipient, TSignatureBase& aMessage)
       
   134     {
       
   135     // TODO: TCFMessage::TConnectionGoingDown - If this message is received
       
   136     // a new request needs to be sent on behalf of the socket, and
       
   137     // this one needs to cleanup/destroy itself. This is for the race condition
       
   138     // where either the idle timer triggers and begin stopping the connection,
       
   139     // or the connection is lost (both resulting in TConnectionGoingDown) while
       
   140     // the request is in progress.
       
   141     if (aMessage.IsMessage<TCFMessage::TStateChange>() ||
       
   142         aMessage.IsMessage<TCFControlClient::TGoneDown>() )
       
   143         {
       
   144         // Note of caution: As a control client of providers the CPolicyRequest
       
   145         // could be bombarded with messages that we have no interest in.
       
   146         // TStateChange is one, but there could be others. Due to the nature
       
   147         // of the mesh machine if we don't handle them it will forward them
       
   148         // to the CSocket which only expects a limited set of messages from
       
   149         // the CPolicyRequest. The CSocket wont like the messages and its not
       
   150         // great for performance to forward them unnecessarily so try to kill
       
   151         // them off here.
       
   152         aMessage.ClearMessageId();
       
   153         return;
       
   154         }
       
   155 
       
   156 	TNodeContext<CPolicyRequest> ctx(*this, aMessage, aSender, aRecipient);
       
   157     CPolicyRequest::Received(ctx);
       
   158     User::LeaveIfError(ctx.iReturn);
       
   159 	}
       
   160 
       
   161 //
       
   162 //TCFConnPolicyRequest
       
   163 void TCFConnPolicyRequest::StartL(const TRuntimeCtxId& aSender)
       
   164 	{
       
   165 	CPolicyRequest* req = new (ELeave) CPolicyRequest(*this);
       
   166 	CleanupStack::PushL(req);
       
   167 
       
   168     TNodeId newServiceProvider = iIPCPrNodeId;
       
   169     // set service provider of the PolicyPequest node
       
   170 	req->AddClientL(iIPCPrNodeId, TClientType(TCFClientType::EServProvider,TCFClientType::EActive));
       
   171 
       
   172 	TCFIPMessage::TPolicyRequest msg(ESoCreateWithConnection); //Message to triger activity
       
   173 	req->ReceivedL(aSender, TNodeCtxId(0, req->Id()), msg);
       
   174 	CleanupStack::Pop(req);
       
   175 	}
       
   176 
       
   177 void TCFConnPolicyRequest::DispatchL(const TRuntimeCtxId& aSender, const TRuntimeCtxId& aRecipient)
       
   178 	{
       
   179 	const TNodeId& nodeId = address_cast<const TNodeId>(aRecipient);  //This message type operates on nodes
       
   180 	ASSERT(nodeId==SockManGlobals::Get()->GetPlaneFC(TCFPlayerRole(TCFPlayerRole::ESubConnPlane))); //Should be dispatched on the Connection Plane container!
       
   181 	
       
   182 	CleanupClosePushL(iParamBundle);
       
   183 	StartL(aSender);
       
   184 	CleanupStack::PopAndDestroy(&iParamBundle);
       
   185 	}
       
   186