datacommsserver/esockserver/ssock/ss_subconn.cpp
changeset 0 dfb7c4ff071f
child 12 8b5d60ce1e94
equal deleted inserted replaced
-1:000000000000 0:dfb7c4ff071f
       
     1 // Copyright (c) 2004-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 "ss_subconn.h"
       
    17 #include "ss_subconnstates.h"
       
    18 #include "ss_connstates.h"
       
    19 #include <comms-infras/ss_subconnprov.h>
       
    20 #include <comms-infras/ss_log.h>
       
    21 #include <comms-infras/ss_roles.h>
       
    22 #include <ss_glob.h>
       
    23 #include <comms-infras/ss_sapshim.h>
       
    24 #include "SS_conn.H"
       
    25 #include <comms-infras/ss_nodemessages_subconn.h>
       
    26 #include <cs_subconevents.h>
       
    27 
       
    28 #include <comms-infras/ss_msgintercept.h>
       
    29 #include "ss_internal_activities.h"
       
    30 
       
    31 
       
    32 #ifdef _DEBUG
       
    33 // Panic category for "absolutely impossible!" vanilla ASSERT()-type panics from this module
       
    34 // (if it could happen through user error then you should give it an explicit, documented, category + code)
       
    35 _LIT(KSpecAssert_ESockSSocks_sbcn, "ESockSSocks_sbcn");
       
    36 #endif
       
    37 
       
    38 using namespace ESock;
       
    39 using namespace SubSessActivities;
       
    40 using namespace NetStateMachine;
       
    41 using namespace SubConnActivities;
       
    42 using namespace SubSessStates;
       
    43 using namespace CoreStates;
       
    44 using namespace Messages;
       
    45 using namespace MeshMachine;
       
    46 
       
    47 #ifdef _DEBUG
       
    48 _LIT (KCSubConnectionPanic,"CSubConnectionPanic");
       
    49 #endif
       
    50 
       
    51 //-=========================================================
       
    52 //
       
    53 //Actvities serving client (RSubConnection) requests
       
    54 //
       
    55 //-=========================================================
       
    56 // Creates a subconnection subsession object. No longer triggers the building of the stack beneath it.
       
    57 // This now occurs only when required
       
    58 namespace SubConnectionCreate
       
    59 {
       
    60 DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFActivitySubConnectionCreate, SubConCreate, TCFInternalEsock::TSubSess, SubConnActivities::CCreate::NewL)
       
    61 	FIRST_NODEACTIVITY_ENTRY(SubSessStates::TAwaitingIPC<ESCCreate>, MeshMachine::TNoTag)
       
    62 	THROUGH_NODEACTIVITY_ENTRY(KNoTag, SubSessStates::TAcquireMessageOwnership, SubConnStates::TNoTagOrAttachToDefaultOrWaitForIncoming)
       
    63 
       
    64 	// We are attaching to the default subconnection and can therefore build the subconnection stack immediately
       
    65 	NODEACTIVITY_ENTRY(CoreNetStates::KAttachToDefault, SubConnStates::TSendBuildStack, SubConnStates::TAwaitingBuildStackResponse, MeshMachine::TNoTag)
       
    66 
       
    67 	// Must be `ECreateNew` in which case we defer the building of the stack. We are done
       
    68 	LAST_NODEACTIVITY_ENTRY(KNoTag, MeshMachine::TDoNothing)
       
    69 
       
    70 	// Wait for incoming
       
    71 	LAST_NODEACTIVITY_ENTRY(CoreNetStates::KWaitForIncoming, MeshMachine::TDoNothing)
       
    72 NODEACTIVITY_END()
       
    73 }
       
    74 
       
    75 namespace SubConnectionNoBearer
       
    76 {
       
    77 DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFActivityNoBearer, SubConnNoBearer, TCFControlProvider::TNoBearer, SubConnActivities::CNoBearer::NewL)
       
    78 	FIRST_NODEACTIVITY_ENTRY(CoreNetStates::TAwaitingNoBearer, MeshMachine::TNoTag)
       
    79 
       
    80 	// We don't have a bearer so get the stack built so that we do. Then we can proceed
       
    81 	THROUGH_NODEACTIVITY_ENTRY(KNoTag, SubConnActivities::CNoBearer::TStoreFlowParams, CoreNetStates::TNoTagOrNoBearer)
       
    82 	NODEACTIVITY_ENTRY(CoreNetStates::KNoBearer, SubConnStates::TSendBuildStack, SubConnStates::TAwaitingBuildStackResponse, MeshMachine::TNoTag)
       
    83 
       
    84 	// We now/already have a bearer so go ahead with fetching a bearer for the data client that kicked us off
       
    85 	NODEACTIVITY_ENTRY(KNoTag, SubConnStates::TRequestServiceProvider, TAcceptErrorState<CoreNetStates::TAwaitingBinderResponse>, MeshMachine::TNoTagOrErrorTag)
       
    86 	LAST_NODEACTIVITY_ENTRY(KErrorTag, MeshMachine::TDoNothing)
       
    87 
       
    88 	NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TSendBindTo, CoreNetStates::TAwaitingBindToComplete, MeshMachine::TNoTag)
       
    89 	THROUGH_NODEACTIVITY_ENTRY(KNoTag, SubConnActivities::CNoBearer::TSendBindToComplete, MeshMachine::TNoTag)
       
    90 	LAST_NODEACTIVITY_ENTRY(KNoTag, MeshMachine::TDoNothing)
       
    91 NODEACTIVITY_END()
       
    92 }
       
    93 
       
    94 namespace SubConnectionBuildStack
       
    95 {
       
    96 DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFActivityBuildStack, SubConnBuildStack, TCFInternalEsock::TBuildStackRequest, SubConnActivities::CBuildStack::NewL)
       
    97 	FIRST_NODEACTIVITY_ENTRY(SubConnActivities::CBuildStack::TAwaitingBuildStack, MeshMachine::TNoTag)
       
    98 
       
    99 	NODEACTIVITY_ENTRY(KNoTag, SubConnStates::TJoinCPR, CoreStates::TAwaitingJoinComplete, MeshMachine::TNoTag)
       
   100 
       
   101 	NODEACTIVITY_ENTRY(KNoTag, SubConnActivities::CBuildStack::TRequestServiceProviderFromCPR, TAcceptErrorState<CoreNetStates::TAwaitingBinderResponse>, MeshMachine::TNoTagOrErrorTag)
       
   102 
       
   103 	NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TSendControlClientJoinRequest, CoreStates::TAwaitingJoinComplete, MeshMachine::TNoTag)
       
   104 	THROUGH_NODEACTIVITY_ENTRY(KNoTag, SubConnActivities::CBuildStack::TSendBindToComplete, MeshMachine::TNoTag)
       
   105 	NODEACTIVITY_ENTRY(KNoTag, SubConnStates::TLeaveCPR, MeshMachine::TAwaitingLeaveComplete, MeshMachine::TNoTag)
       
   106 	LAST_NODEACTIVITY_ENTRY(KNoTag, CBuildStack::TSendBuildStackResponse)
       
   107 
       
   108 	NODEACTIVITY_ENTRY(KErrorTag, SubConnStates::TLeaveCPR, MeshMachine::TAwaitingLeaveComplete, MeshMachine::TTag<KErrorTag>)
       
   109 	LAST_NODEACTIVITY_ENTRY(KErrorTag, MeshMachine::TDoNothing)
       
   110 NODEACTIVITY_END()
       
   111 }
       
   112 
       
   113 namespace SubConnectionStart
       
   114 {
       
   115 DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFActivityStart, SubConStart, TCFInternalEsock::TSubSess, SubSessActivities::CESockClientActivityBase::NewL)
       
   116 	FIRST_NODEACTIVITY_ENTRY(SubSessStates::TAwaitingIPC<ESCStart>, MeshMachine::TNoTag)
       
   117 	THROUGH_NODEACTIVITY_ENTRY(KNoTag, SubSessStates::TAcquireMessageOwnership, MeshMachine::TNoTag)
       
   118 	NODEACTIVITY_ENTRY(KNoTag, SubConnStates::TStartSubConnection, TECABState<CoreNetStates::TAwaitingStarted>, MeshMachine::TNoTag)
       
   119 	LAST_NODEACTIVITY_ENTRY(KNoTag, MeshMachine::TDoNothing)
       
   120 NODEACTIVITY_END()
       
   121 }
       
   122 
       
   123 namespace SubConnectionStop
       
   124 {
       
   125 DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFActivityStop, SubConStop, TCFInternalEsock::TSubSess, SubSessActivities::CESockClientActivityBase::NewL)
       
   126 	FIRST_NODEACTIVITY_ENTRY(SubSessStates::TAwaitingIPC<ESCStop>, MeshMachine::TNoTag)
       
   127 	THROUGH_NODEACTIVITY_ENTRY(KNoTag, SubSessStates::TAcquireMessageOwnership, MeshMachine::TNoTag)
       
   128 	NODEACTIVITY_ENTRY(KNoTag, SubConnStates::TStopSubConnection, TECABState<CoreNetStates::TAwaitingStopped>, MeshMachine::TNoTag)
       
   129 	LAST_NODEACTIVITY_ENTRY(KNoTag, MeshMachine::TDoNothing)
       
   130 NODEACTIVITY_END()
       
   131 }
       
   132 
       
   133 namespace SubConnectionClose
       
   134 {
       
   135 DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFActivityDestroy, SubConClose, TCFInternalEsock::TSubSess, SubSessActivities::CCloseActivity::New)
       
   136 	FIRST_NODEACTIVITY_ENTRY(SubSessStates::TAwaitingIPC<ESCClose>, MeshMachine::TNoTag)
       
   137 	THROUGH_NODEACTIVITY_ENTRY(KNoTag, SubSessStates::TAcquireMessageOwnership, MeshMachine::TNoTag)
       
   138 	THROUGH_NODEACTIVITY_ENTRY(KNoTag, SubSessStates::TCancelAndCloseClientExtIfaces, MeshMachine::TNoTag)
       
   139     THROUGH_NODEACTIVITY_ENTRY(KNoTag, ConnStates::TCancelAllLegacyRMessage2Activities, ConnStates::TNoTagBlockedByLegacyRMessage2Activities)
       
   140 	NODEACTIVITY_ENTRY(KNoTag, SubConnStates::TProcessClose, MeshMachine::TAwaitingLeaveComplete, MeshMachine::TNoTag)
       
   141 	NODEACTIVITY_ENTRY(KNoTag, TECABTransition<CoreNetStates::TSetIdleIfNoServiceProviders>, MeshMachine::TAwaitingLeaveComplete, CoreActivities::CDestroyActivity::TNoTagOrNoTagBackwards)
       
   142 	LAST_NODEACTIVITY_ENTRY(KNoTag, MeshMachine::TDoNothing)
       
   143 NODEACTIVITY_END()
       
   144 }
       
   145 
       
   146 namespace SubConnectionAddSocket
       
   147 {
       
   148 typedef TECABState<SubConnStates::TAwaitingBuildStackResponse> TAwaitingBuildStackResponse;
       
   149 typedef MeshMachine::TAcceptErrorState<CoreNetStates::TAwaitingApplyResponse> TAwaitingApplyResponseOrError;
       
   150 
       
   151 DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFActivityDataClientJoin, SubConAddSocket, TCFInternalEsock::TSubSess, SubConnActivities::CRejoin::NewL)
       
   152 	FIRST_NODEACTIVITY_ENTRY(SubSessStates::TAwaitingIPC<ESCAddSocket>, MeshMachine::TNoTag)
       
   153 	THROUGH_NODEACTIVITY_ENTRY(KNoTag, SubSessStates::TAcquireMessageOwnership, CoreNetStates::TNoTagOrNoBearer)
       
   154 
       
   155 	// We have no bearer yet so must have the stack built beneath us before continuing
       
   156 	NODEACTIVITY_ENTRY(CoreNetStates::KNoBearer, SubConnStates::TSendBuildStack, TECABState<SubConnStates::TAwaitingBuildStackResponse>, MeshMachine::TNoTag)
       
   157 
       
   158 	// We have a bearer and can now go ahead adding a socket from the default sub connection
       
   159 	NODEACTIVITY_ENTRY(KNoTag, SubConnStates::TJoinTheOtherOwner, TECABState<CoreStates::TAwaitingJoinComplete>, MeshMachine::TNoTag)
       
   160 	NODEACTIVITY_ENTRY(KNoTag, SubConnStates::TSendRejoinDataClientRequestToOldOwner, TAcceptErrorState<CoreNetStates::TAwaitingRejoinDataClientComplete>, MeshMachine::TNoTagOrErrorTag)
       
   161 	NODEACTIVITY_ENTRY(KErrorTag, SubConnStates::TLeaveTheOtherOwner, MeshMachine::TAwaitingLeaveComplete, MeshMachine::TTag<KErrorTag>)
       
   162 	LAST_NODEACTIVITY_ENTRY(KErrorTag, MeshMachine::TDoNothing)
       
   163 
       
   164 	//When adding socket, add first, remove later.
       
   165 	NODEACTIVITY_ENTRY(KNoTag, SubConnStates::TSendApplyToNewOwner, TAwaitingApplyResponseOrError, MeshMachine::TNoTagOrErrorTag)
       
   166 	NODEACTIVITY_ENTRY(KNoTag, SubConnStates::TSendApplyToOldOwner, TAwaitingApplyResponseOrError, MeshMachine::TNoTagOrErrorTag)
       
   167 
       
   168 	NODEACTIVITY_ENTRY(KErrorTag, SubConnStates::TSendCancelToOldOwner, TAcceptErrorState<CoreStates::TNeverAccept>, MeshMachine::TNoTag)
       
   169 	NODEACTIVITY_ENTRY(KNoTag,    SubConnStates::TLeaveTheOtherOwner, MeshMachine::TAwaitingLeaveComplete, MeshMachine::TNoTag)
       
   170 	LAST_NODEACTIVITY_ENTRY(KNoTag, MeshMachine::TDoNothing)
       
   171 NODEACTIVITY_END()
       
   172 }
       
   173 
       
   174 namespace SubConnectionRemoveSocket
       
   175 {
       
   176 DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFActivityClientLeave, SubConRemoveSocket, TCFInternalEsock::TSubSess, SubConnActivities::CRejoin::NewL)
       
   177 	FIRST_NODEACTIVITY_ENTRY(SubSessStates::TAwaitingIPC<ESCRemoveSocket>, MeshMachine::TNoTag)
       
   178 	THROUGH_NODEACTIVITY_ENTRY(KNoTag, SubSessStates::TAcquireMessageOwnership, MeshMachine::TNoTag)
       
   179 	NODEACTIVITY_ENTRY(KNoTag, SubConnStates::TJoinTheOtherOwner, TECABState<CoreStates::TAwaitingJoinComplete>, MeshMachine::TNoTag)
       
   180 	NODEACTIVITY_ENTRY(KNoTag, SubConnStates::TSendRejoinDataClientRequestToOldOwner, TAcceptErrorState<CoreNetStates::TAwaitingRejoinDataClientComplete>, MeshMachine::TNoTagOrErrorTag)
       
   181 	//When removing socket, remove first, add later.
       
   182 	NODEACTIVITY_ENTRY(KNoTag, SubConnStates::TSendApplyToOldOwner, MeshMachine::TAcceptErrorState<CoreNetStates::TAwaitingApplyResponse>, MeshMachine::TNoTagOrErrorTag)
       
   183 	NODEACTIVITY_ENTRY(KNoTag, SubConnStates::TSendApplyToNewOwner, MeshMachine::TAcceptErrorState<CoreNetStates::TAwaitingApplyResponse>, MeshMachine::TNoTagOrErrorTag)
       
   184 
       
   185 	NODEACTIVITY_ENTRY(KNoTag,    SubConnStates::TLeaveTheOtherOwner, MeshMachine::TAwaitingLeaveComplete, MeshMachine::TNoTag)
       
   186 	NODEACTIVITY_ENTRY(KErrorTag, SubConnStates::TLeaveTheOtherOwner, MeshMachine::TAwaitingLeaveComplete, MeshMachine::TNoTag)
       
   187 	LAST_NODEACTIVITY_ENTRY(KNoTag, MeshMachine::TDoNothing)
       
   188 NODEACTIVITY_END()
       
   189 }
       
   190 
       
   191 namespace SubConnectionSetParams
       
   192 {
       
   193 DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFActivityParamRequest, SubConSetParams, TCFInternalEsock::TSubSess, SubConnActivities::CSetParameters::NewL)
       
   194 	FIRST_NODEACTIVITY_ENTRY(SubSessStates::TAwaitingIPC<ESCSetParameters>, MeshMachine::TNoTag)
       
   195 	THROUGH_NODEACTIVITY_ENTRY(KNoTag, SubSessStates::TAcquireMessageOwnership, MeshMachine::TNoTag)
       
   196 	THROUGH_NODEACTIVITY_ENTRY(KNoTag, SubConnActivities::CSetParameters::TStoreNewParams, CoreNetStates::TNoTagOrNoBearer)
       
   197 
       
   198 	// We have no bearer so are going to have to tell ourself to build the stack beneath us
       
   199 	NODEACTIVITY_ENTRY(CoreNetStates::KNoBearer, SubConnStates::TSendBuildStack, SubConnStates::TAwaitingBuildStackResponse, MeshMachine::TNoTag)
       
   200 
       
   201 	// Proceed with sending the parameters to our service provider
       
   202 	NODEACTIVITY_ENTRY(KNoTag, SubConnStates::TSendParamsToServiceProvider, TECABState<CoreNetStates::TAwaitingParamResponse>, MeshMachine::TNoTag)
       
   203 
       
   204 	//it's the legacy behaviour to complete setparams once they have been verified (TParamsResponse received)
       
   205 	//but not yet processed.
       
   206 	THROUGH_NODEACTIVITY_ENTRY(KNoTag, SubConnActivities::CSetParameters::TCompleteClient, MeshMachine::TNoTag)
       
   207 
       
   208 	// the params received in response should be stored before send apply
       
   209 	NODEACTIVITY_ENTRY(KNoTag, SubConnStates::TStoreParamsAndSendApply, TECABState<MeshMachine::TAcceptErrorState<CoreNetStates::TAwaitingApplyResponse> >, MeshMachine::TNoTag)
       
   210 	LAST_NODEACTIVITY_ENTRY(KNoTag, MeshMachine::TDoNothing)
       
   211 NODEACTIVITY_END()
       
   212 }
       
   213 
       
   214 namespace SubConnectionEventNotificationSubscription
       
   215 {
       
   216 DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFActivityNotification, SubConEventSubscr, TCFInternalEsock::TSubSess, SubConnActivities::CEventNotification::NewL)
       
   217 	FIRST_NODEACTIVITY_ENTRY(SubConnStates::TAwaitingEventNotificationSubscription, SubConnStates::TNoTagOrAllNotifications)
       
   218 	NODEACTIVITY_ENTRY        (KNoTag,                   SubConnStates::TSetupFilteredEventNotification, SubSessStates::TAwaitingIPC<ESCEventNotification>, MeshMachine::TNoTag)
       
   219     THROUGH_NODEACTIVITY_ENTRY(ESCEventAllNotifications, SubConnStates::TSetupAllEventNotification, MeshMachine::TNoTag )
       
   220 	THROUGH_NODEACTIVITY_ENTRY(KNoTag, SubSessStates::TAcquireMessageOwnership, SubConnStates::TNoTagOrActiveWhenEventEnqued)
       
   221 
       
   222 	NODEACTIVITY_ENTRY(KNoTag, MeshMachine::TDoNothing, CoreNetStates::TAwaitingSubConEvent, TTag<KActiveTag>)
       
   223 	LAST_NODEACTIVITY_ENTRY(KActiveTag, SubConnStates::TFillInEvent)
       
   224 NODEACTIVITY_END()
       
   225 }
       
   226 
       
   227 namespace SubConnectionEventNotification
       
   228 {
       
   229 DECLARE_DEFINE_NODEACTIVITY(ECFActivityConnectionWaitForIncoming, SubConEvent, TCFSubConnControlClient::TSubConnNotification)
       
   230 	NODEACTIVITY_ENTRY(KNoTag, SubConnStates::TEnqueueEvent, CoreNetStates::TAwaitingSubConEvent, MeshMachine::TNoTag)
       
   231 NODEACTIVITY_END()
       
   232 }
       
   233 
       
   234 namespace SubConnectionGetParamLength
       
   235 {
       
   236 DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFActivityGetParamLength, SubConGetParamLength, TCFInternalEsock::TSubSess, CESockClientActivityBase::NewL)
       
   237 	FIRST_NODEACTIVITY_ENTRY(SubSessStates::TAwaitingIPC<ESCGetParametersLength>, MeshMachine::TNoTag)
       
   238 	// We must block if SubConnectionSetParams activity is currently running (the activity continues to run after it has completed its client)
       
   239 	// as otherwise the stored parameters can be changed underneath us.  In particular, this can occur in-between
       
   240 	// SubConnectionGetParamLength and SubConnectionGetParam, with the resulting length mismatch causing a KERN-EXEC-3 in the original
       
   241 	// client RSubConnection::GetParameters() call.
       
   242 	THROUGH_NODEACTIVITY_ENTRY(KNoTag, SubSessStates::TAcquireMessageOwnership, SubConnStates::TNoTagOrParamsPresentBlockedBySetParams )
       
   243 	NODEACTIVITY_ENTRY(KNoTag, SubConnStates::TSendParamRequest, CoreNetStates::TAwaitingParamResponse, MeshMachine::TNoTag)
       
   244 	THROUGH_NODEACTIVITY_ENTRY(KNoTag, SubConnStates::TStoreParams, MeshMachine::TNoTag)
       
   245 	LAST_NODEACTIVITY_ENTRY(KNoTag, SubConnStates::TWriteSubConnParamsLength)
       
   246 	LAST_NODEACTIVITY_ENTRY(PRStates::KParamsPresent, SubConnStates::TWriteSubConnParamsLength)
       
   247 NODEACTIVITY_END()
       
   248 }
       
   249 
       
   250 namespace SubConnectionGetParam
       
   251 {
       
   252 DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFActivityGetParam, SubConGetParams, TCFInternalEsock::TSubSess, CESockClientActivityBase::NewL)
       
   253 	FIRST_NODEACTIVITY_ENTRY(SubSessStates::TAwaitingIPC<ESCGetParameters>, MeshMachine::TNoTag)
       
   254 	THROUGH_NODEACTIVITY_ENTRY(KNoTag, SubSessStates::TAcquireMessageOwnership, SubConnStates::TNoTagOrParamsPresent )
       
   255 	NODEACTIVITY_ENTRY(KNoTag, SubConnStates::TSendParamRequest, CoreNetStates::TAwaitingParamResponse, MeshMachine::TNoTag)
       
   256 	THROUGH_NODEACTIVITY_ENTRY(KNoTag, SubConnStates::TStoreParams, MeshMachine::TNoTag)
       
   257 	LAST_NODEACTIVITY_ENTRY(KNoTag, SubConnStates::TWriteSubConnParams)
       
   258 	LAST_NODEACTIVITY_ENTRY(PRStates::KParamsPresent, SubConnStates::TWriteSubConnParams)
       
   259 NODEACTIVITY_END()
       
   260 }
       
   261 
       
   262 //
       
   263 //Activities serving framework requests
       
   264 namespace SubConnectionWaitForIncomming
       
   265 {
       
   266 DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFActivityBindTo, SubConnBindToRequest, TCFDataClient::TBindTo, PRActivities::CBindToActivity::NewL)
       
   267 	FIRST_NODEACTIVITY_ENTRY(CoreNetStates::TAwaitingBindTo, MeshMachine::TNoTag)
       
   268 	NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TSendControlClientJoinRequest, CoreStates::TAwaitingJoinComplete, MeshMachine::TNoTagOrErrorTag)
       
   269 	LAST_NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TSendBindToComplete)
       
   270 NODEACTIVITY_END()
       
   271 }
       
   272 
       
   273 namespace SubConnectionLegacyRMessage2Activity
       
   274 {
       
   275 DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFActivitySubConnectionLegacyRMessage2Handler, SubConnectionLegacyRMessage2, TNodeSignal::TNullMessageId, ConnActivities::CConnLegacyRMessage2Activity::NewL)
       
   276     FIRST_NODEACTIVITY_ENTRY(CoreNetStates::TAwaitingLegacyRMessage2Ext, MeshMachine::TNoTag)
       
   277     NODEACTIVITY_ENTRY(KNoTag, ConnStates::TProcessLegacyRMessage2, TAcceptErrorState<CoreNetStates::TAwaitingRMessage2Processed>, MeshMachine::TNoTagOrErrorTag)
       
   278     LAST_NODEACTIVITY_ENTRY(KNoTag, ConnStates::TCompleteRMessage2)
       
   279     LAST_NODEACTIVITY_ENTRY(KErrorTag, MeshMachine::TDoNothing)
       
   280 NODEACTIVITY_END()
       
   281 }
       
   282 
       
   283 
       
   284 namespace SubConnectionActivities
       
   285 {
       
   286 DECLARE_DEFINE_ACTIVITY_MAP(subconnectionActivities)
       
   287 	ACTIVITY_MAP_ENTRY(CoreErrorActivity, CoreError) //Must be first in the table
       
   288 	ACTIVITY_MAP_ENTRY(SubConnectionStart, SubConStart)
       
   289 	ACTIVITY_MAP_ENTRY(SubConnectionStop, SubConStop)
       
   290 	ACTIVITY_MAP_ENTRY(SubConnectionCreate, SubConCreate)
       
   291 	ACTIVITY_MAP_ENTRY(SubConnectionClose, SubConClose)
       
   292 	ACTIVITY_MAP_ENTRY(SubConnectionAddSocket, SubConAddSocket)
       
   293 	ACTIVITY_MAP_ENTRY(SubConnectionRemoveSocket, SubConRemoveSocket)
       
   294 	ACTIVITY_MAP_ENTRY(SubConnectionSetParams, SubConSetParams)
       
   295 	ACTIVITY_MAP_ENTRY(SubConnectionEventNotificationSubscription, SubConEventSubscr)
       
   296 	ACTIVITY_MAP_ENTRY(SubConnectionEventNotification, SubConEvent)
       
   297 	ACTIVITY_MAP_ENTRY(SubConnectionGetParamLength, SubConGetParamLength)
       
   298 	ACTIVITY_MAP_ENTRY(SubConnectionGetParam, SubConGetParams)
       
   299 	ACTIVITY_MAP_ENTRY(SubConnectionWaitForIncomming, SubConnBindToRequest)
       
   300 	ACTIVITY_MAP_ENTRY(SubConnectionBuildStack, SubConnBuildStack)
       
   301 	ACTIVITY_MAP_ENTRY(SubConnectionNoBearer, SubConnNoBearer)
       
   302     ACTIVITY_MAP_ENTRY(SubConnectionLegacyRMessage2Activity, SubConnectionLegacyRMessage2)
       
   303 	ACTIVITY_MAP_ENTRY(PRDataClientJoinActivity, PRDataClientJoin)
       
   304 	ACTIVITY_MAP_ENTRY(PRClientLeaveActivity, PRClientLeave)
       
   305 ACTIVITY_MAP_END()
       
   306 }
       
   307 
       
   308 
       
   309 
       
   310 
       
   311 
       
   312 
       
   313 
       
   314 //-=========================================================
       
   315 //
       
   316 //
       
   317 //CSubConnection implementation
       
   318 //
       
   319 //
       
   320 //-=========================================================
       
   321 CSubConnection* CSubConnection::NewL(CConnection& aConnection, CPlayer* aPlayer, const TSubSessionUniqueId aSubSessionUniqueId)
       
   322 /** Create a new CSubConnection instance
       
   323 
       
   324 @param aConnProvider Connection Provider that this subconnection is a member of
       
   325 @param aType Default or new subconnection
       
   326 @param aSession Socket Session this subsession is to be a member of
       
   327 @return pointer to new CSubConnection instance on success
       
   328 @exception leaves if could not allocate memory
       
   329 */
       
   330 	{
       
   331 	RNodeInterface* conn = aConnection.ServiceProvider();
       
   332 	__ASSERT_DEBUG(conn, User::Panic(KSpecAssert_ESockSSocks_sbcn, 1));
       
   333 	User::LeaveIfError(conn? KErrNone : KErrNotReady);
       
   334 
       
   335 	CSubConnection* sc = new (ELeave) CSubConnection(aPlayer, aSubSessionUniqueId);
       
   336     CleanupStack::PushL(sc);
       
   337 	sc->ConstructL(aConnection);
       
   338 	CleanupStack::Pop(sc);
       
   339 
       
   340 	ESOCK_DEBUG_REGISTER_GENERAL_NODE(ESockDebug::KSubConnectionNodeUid, sc);
       
   341 
       
   342 	return sc;
       
   343 	}
       
   344 
       
   345 
       
   346 void CSubConnection::ProcessMessageL()
       
   347 	{
       
   348 	LOG_DETAILED(ESockLog::Printf(_L("CSubConnection(%08x)::ProcessMessageL:\tCommand %d"), this, Message().Function()));
       
   349 
       
   350 	switch (Message().Function())
       
   351      {
       
   352 		case ESCAddSocket:
       
   353 			LOG( ESockLog::Printf(KESockSubConnectionTag, _L8("CSubConnection %08x\tESCAddSocket aMessage %08x"), this, &Message()) );
       
   354 			//If successful, the ownership of the RMessage2 is taken by the activity, otherwise completed on leave
       
   355 			CMMSockSubSession::ReceivedL(ESCAddSocket, TCFInternalEsock::TSubSess(ESCAddSocket,Message()).CRef());
       
   356 			break;
       
   357 
       
   358 		case ESCRemoveSocket:
       
   359 			LOG( ESockLog::Printf(KESockSubConnectionTag, _L8("CSubConnection %08x\tESCRemoveSocket aMessage %08x"), this, &Message()) );
       
   360 			//If successful, the ownership of the RMessage2 is taken by the activity, otherwise completed on leave
       
   361 			CMMSockSubSession::ReceivedL(ESCRemoveSocket, TCFInternalEsock::TSubSess(ESCRemoveSocket,Message()).CRef());
       
   362 			break;
       
   363 
       
   364 		case ESCSetParameters:
       
   365 			LOG( ESockLog::Printf(KESockSubConnectionTag, _L8("CSubConnection %08x\tESCSetParameters aMessage %08x"), this, &Message()) );
       
   366 			//If successful, the ownership of the RMessage2 is taken by the activity, otherwise completed on leave
       
   367 			CMMSockSubSession::ReceivedL(ESCSetParameters, TCFInternalEsock::TSubSess(ESCSetParameters,Message()).CRef());
       
   368 			break;
       
   369 
       
   370 		case ESCGetParameters:
       
   371 			LOG( ESockLog::Printf(KESockSubConnectionTag, _L8("CSubConnection %08x\tESCGetParameters aMessage %08x"), this, &Message()) );
       
   372 			//If successful, the ownership of the RMessage2 is taken by the activity, otherwise completed on leave
       
   373 			CMMSockSubSession::ReceivedL(ESCGetParameters, TCFInternalEsock::TSubSess(ESCGetParameters,Message()).CRef());
       
   374 			break;
       
   375 
       
   376 		case ESCGetParametersLength:
       
   377 			LOG( ESockLog::Printf(KESockSubConnectionTag, _L8("CSubConnection %08x\tESCGetParametersLength aMessage %08x"), this, &Message()) );
       
   378 			//If successful, the ownership of the RMessage2 is taken by the activity, otherwise completed on leave
       
   379 			CMMSockSubSession::ReceivedL(ESCGetParametersLength, TCFInternalEsock::TSubSess(ESCGetParametersLength,Message()).CRef());
       
   380 			break;
       
   381 
       
   382         case ESCEventNotificationSetup:
       
   383 			LOG( ESockLog::Printf(KESockSubConnectionTag, _L8("CSubConnection %08x\tESCEventNotificationSetup aMessage %08x"), this, &Message()) );
       
   384 			CMMSockSubSession::ReceivedL(ESCEventNotification, TCFInternalEsock::TSubSess(ESCEventNotificationSetup,Message()).CRef());
       
   385 			break;
       
   386 
       
   387         case ESCEventNotification:
       
   388 			LOG( ESockLog::Printf(KESockSubConnectionTag, _L8("CSubConnection %08x\tESCEventNotification aMessage %08x"), this, &Message()) );
       
   389 			CMMSockSubSession::ReceivedL(ECFActivityNotification, TCFInternalEsock::TSubSess(ESCEventNotification,Message()).CRef());
       
   390 			break;
       
   391 
       
   392         case ESCEventAllNotifications:
       
   393 			LOG( ESockLog::Printf(KESockSubConnectionTag, _L8("CSubConnection %08x\tESCEventAllNotifications aMessage %08x"), this, &Message()) );
       
   394 			CMMSockSubSession::ReceivedL(ESCEventNotification, TCFInternalEsock::TSubSess(ESCEventAllNotifications,Message()).CRef());
       
   395 			break;
       
   396 
       
   397         case ESCEventNotificationCancel:
       
   398 			LOG( ESockLog::Printf(KESockSubConnectionTag, _L8("CSubConnection %08x\tESCEventNotificationCancel aMessage %08x"), this, &Message()) );
       
   399 			//CANCELATION - Do not call DontCompleteCurrentRequest() for ECFActivityNotification to be completed!
       
   400 			CMMSockSubSession::ReceivedL(ESCEventNotification, TEBase::TCancel().CRef());
       
   401 			break;
       
   402 
       
   403 		case ESCControl:
       
   404 			{
       
   405 			LOG( ESockLog::Printf(KESockSubConnectionTag, _L8("CSubConnection %08x\tESCControl aMessage %08x"), this, &Message()) );
       
   406 			if (ServiceProvider() == NULL)
       
   407     			{
       
   408     			User::Leave(KErrNotReady);
       
   409     			}
       
   410 			TLegacyControlMessage msg(SafeMessage());
       
   411 			CMMSockSubSession::ReceivedL(SafeMessage().Function(), msg);
       
   412 			DontCompleteCurrentRequest(); //TLegacyControlMessage will complete the message
       
   413 			}
       
   414 			break;
       
   415 
       
   416 		case ESCStart:
       
   417 			LOG( ESockLog::Printf(KESockSubConnectionTag, _L8("CSubConnection %08x\tESCStart aMessage %08x"), this, &Message()) );
       
   418 			//If successful, the ownership of the RMessage2 is taken by the activity, otherwise completed on leave
       
   419 			CMMSockSubSession::ReceivedL(ESCStart, TCFInternalEsock::TSubSess(ESCStart,Message()).CRef());
       
   420 			break;
       
   421 
       
   422 		case ESCStop:
       
   423 			LOG( ESockLog::Printf(KESockSubConnectionTag, _L8("CSubConnection %08x\tESCStop aMessage %08x"), this, &Message()) );
       
   424 			//If successful, the ownership of the RMessage2 is taken by the activity, otherwise completed on leave
       
   425 			CMMSockSubSession::ReceivedL(ESCStop, TCFInternalEsock::TSubSess(ESCStop,Message()).CRef());
       
   426 			break;
       
   427 
       
   428 		case ESCClose:
       
   429 			LOG( ESockLog::Printf(KESockSubConnectionTag, _L8("CSubConnection %08x\tESCClose aMessage %08x"), this, &Message()) );
       
   430 			SetClosing();
       
   431 			//If successful, the ownership of the RMessage2 is taken by the activity, otherwise completed on leave
       
   432 			CMMSockSubSession::ReceivedL(ESCClose, TCFInternalEsock::TSubSess(ESCClose,Message()).CRef());
       
   433 			break;
       
   434 
       
   435 		default:
       
   436 			SetReturn(KErrNotSupported);
       
   437 		}
       
   438 	}
       
   439 
       
   440 /**
       
   441 Constructor - set up name
       
   442 */
       
   443 CSubConnection::CSubConnection(CPlayer* aPlayer, const TSubSessionUniqueId aSubSessionUniqueId)
       
   444 	: CMMSockSubSession(SubConnectionActivities::subconnectionActivities::Self(), aPlayer->CurrentSession(), aPlayer, aSubSessionUniqueId),
       
   445 	ASubSessionPlatsecApiExt(UniqueId()),
       
   446 	TIfStaticFetcherNearestInHierarchy(this)
       
   447 	{
       
   448 	LOG_NODE_CREATE(KESockComponentTag, CSubConnection);
       
   449 	}
       
   450 
       
   451 class TRevertAddClient
       
   452     {
       
   453     public:
       
   454     TRevertAddClient(MeshMachine::AMMNodeBase& aOwner, const TNodeId& aClient)
       
   455     :iOwner(aOwner),
       
   456      iClient(aClient)
       
   457      {}
       
   458 
       
   459     static void Do(TAny* aRevertAddClient)
       
   460         {
       
   461         TRevertAddClient& This = *reinterpret_cast<TRevertAddClient*>(aRevertAddClient);
       
   462         This.Do();
       
   463         }
       
   464 
       
   465     void Do()
       
   466         {
       
   467         iOwner.RemoveClient(iClient);
       
   468         }
       
   469 
       
   470     private:
       
   471     MeshMachine::AMMNodeBase&       iOwner;
       
   472     const TNodeId&    iClient;
       
   473     };
       
   474 
       
   475 void CSubConnection::ConstructL(CConnection& aConnection)
       
   476 	{
       
   477 	CMMSockSubSession::ConstructL();
       
   478 	AddClientL(aConnection.Id(), TClientType(TCFClientType::ECtrlProvider));
       
   479 	TRevertAddClient cleanupRevert(*this, aConnection.Id());
       
   480 	CleanupStack::PushL(TCleanupItem(TRevertAddClient::Do, &cleanupRevert));
       
   481 	aConnection.AddClientL(Id(), TClientType(TCFClientType::EData));
       
   482 	CleanupStack::Pop();
       
   483 	}
       
   484 
       
   485 /**
       
   486 Destructor, clean up connection preferences and the subconnection provider
       
   487 */
       
   488 CSubConnection::~CSubConnection()
       
   489 	{
       
   490 	if (!iParameterBundle.IsNull())
       
   491 		{
       
   492 		iParameterBundle.Close();
       
   493 		}
       
   494 
       
   495 	if (CMMSockSubSession::ControlProvider())
       
   496     	{
       
   497         ControlProvider().RemoveClient(Id());
       
   498     	RemoveClient(ControlProvider().Id());
       
   499     	}
       
   500 
       
   501     CRefCountOwnedSubConNotification* event = NULL;
       
   502     while (iEventQueue.Deque(event))
       
   503         {
       
   504         __ASSERT_DEBUG(event, User::Panic(KSpecAssert_ESockSSocks_sbcn, 2));
       
   505         event->Close();
       
   506         event = NULL;
       
   507         }
       
   508 
       
   509     LOG_NODE_DESTROY(KESockComponentTag, CSubConnection);
       
   510 	}
       
   511 
       
   512 void CSubConnection::Received(TNodeContextBase& aContext)
       
   513     {
       
   514     TNodeSignal::TMessageId noPeerIds[] = {
       
   515     	TCFInternalEsock::TSubSess::Id(),
       
   516     	TCFPeer::TJoinRequest::Id(),
       
   517     	TEPeer::TLeaveRequest::Id(),
       
   518     	TNodeSignal::TMessageId()
       
   519     	};
       
   520     MeshMachine::AMMNodeBase::Received(noPeerIds, aContext);
       
   521 	MeshMachine::AMMNodeBase::PostReceived(aContext);
       
   522 	}
       
   523 
       
   524 void CSubConnection::ReceivedL(const TRuntimeCtxId& aSender, const TNodeId& aRecipient, TSignatureBase& aMessage)
       
   525     {
       
   526 	ESOCK_DEBUG_MESSAGE_INTERCEPT(aSender, aMessage, aRecipient);
       
   527 
       
   528 	//First check if this is not our own error
       
   529 	if (aMessage.IsMessage<TEBase::TError>()
       
   530 		&& aSender == Id())
       
   531 		{
       
   532 		//This is our own error, generated from the client (IPC) activity
       
   533 		//It is safe to just ignore it here, as the activity is
       
   534 		//completed (and so is the client RMessage2). If the activity didn't have
       
   535 		//the chance to acquire ownership of the message it is still safe to ignore it
       
   536 		//because there was no call to DoNotCompleteCurrentMessage().
       
   537 		//return KErrNone;
       
   538 		}
       
   539 
       
   540 	TNodeContext<CSubConnection> ctx(*this, aMessage, aSender, aRecipient);
       
   541     CSubConnection::Received(ctx);
       
   542     User::LeaveIfError(ctx.iReturn);
       
   543 	}
       
   544 
       
   545 void CSubConnection::FinalCompleteAllBlockedMessages(TInt /*aResult*/)
       
   546 	{
       
   547 	TNodeNullContext ctx(*this);
       
   548 	AbortActivitiesOriginatedBy(ctx); //Abort all activities
       
   549 	}
       
   550 
       
   551 CConnection& CSubConnection::ControlProvider()
       
   552     {
       
   553     RNodeInterface* controlProv = CMMSockSubSession::ControlProvider();
       
   554 	__ASSERT_DEBUG(controlProv, User::Panic(KCSubConnectionPanic,KPanicNoConnection));
       
   555 #if defined(__GCCXML__)
       
   556     return *reinterpret_cast<CConnection*>(&(controlProv->RecipientId().Node()));
       
   557 #else
       
   558     return mcfnode_cast<CConnection>(controlProv->RecipientId().Node());
       
   559 #endif
       
   560     }
       
   561 
       
   562 EXPORT_C RCFParameterFamilyBundleC& CSubConnection::GetOrCreateParameterBundleL()
       
   563 	{
       
   564 	if( ! iParameterBundle.IsNull())
       
   565 		{
       
   566 		return iParameterBundle;
       
   567 		}
       
   568 	return CreateParameterBundleL();
       
   569 	}
       
   570 
       
   571 EXPORT_C RCFParameterFamilyBundleC& CSubConnection::CreateParameterBundleL()
       
   572 	{
       
   573 	__ASSERT_DEBUG(iParameterBundle.IsNull(), User::Panic(KSpecAssert_ESockSSocks_sbcn, 3));
       
   574 
       
   575 	RCFParameterFamilyBundle newBundle;
       
   576 	newBundle.CreateL();
       
   577 	iParameterBundle.Open(newBundle);
       
   578 
       
   579 	return iParameterBundle;
       
   580 	}
       
   581 
       
   582