datacommsserver/esockserver/ssock/ss_subconnstates.cpp
changeset 0 dfb7c4ff071f
equal deleted inserted replaced
-1:000000000000 0:dfb7c4ff071f
       
     1 // Copyright (c) 2005-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 // ss_connstates.cpp
       
    15 // 
       
    16 //
       
    17 
       
    18 #include "ss_subconn.h"
       
    19 #include "ss_subconnstates.h"
       
    20 #include <comms-infras/ss_log.h>
       
    21 #include <comms-infras/ss_coreprstates.h>
       
    22 #include <comms-infras/ss_corepractivities.h>
       
    23 #include <comms-infras/ss_esockactivities.h>
       
    24 #include "ss_subconn.h"
       
    25 #include "SS_conn.H"
       
    26 #include <ss_glob.h>
       
    27 
       
    28 #include <comms-infras/ss_nodemessages_subconn.h>
       
    29 #include <comms-infras/ss_nodemessages_rejoiningprovider.h>
       
    30 #include <comms-infras/ss_nodemessages_dataclient.h>
       
    31 
       
    32 #include <elements/nm_messages_peer.h>
       
    33 
       
    34 
       
    35 #ifdef _DEBUG
       
    36 // Panic category for "absolutely impossible!" vanilla ASSERT()-type panics from this module
       
    37 // (if it could happen through user error then you should give it an explicit, documented, category + code)
       
    38 _LIT(KSpecAssert_ESockSSocksbcnst, "ESockSSocksbcnst");
       
    39 #endif
       
    40 
       
    41 using namespace ESock;
       
    42 using namespace SubSessActivities;
       
    43 using namespace Messages;
       
    44 using namespace MeshMachine;
       
    45 
       
    46 #ifdef _DEBUG
       
    47 _LIT (KCSubConnectionPanic,"CSubConnectionPanic");
       
    48 #endif
       
    49 
       
    50 //-=========================================================
       
    51 //
       
    52 //
       
    53 //States
       
    54 //
       
    55 //
       
    56 //-=========================================================
       
    57 
       
    58 //-=========================================================
       
    59 // Build stack
       
    60 //-=========================================================
       
    61 DEFINE_SMELEMENT(SubConnStates::TAwaitingBuildStackResponse, NetStateMachine::MState, SubConnStates::TContext)
       
    62 TBool SubConnStates::TAwaitingBuildStackResponse::Accept()
       
    63 	{
       
    64 	return iContext.iMessage.IsMessage<TCFInternalEsock::TBuildStackResponse>();
       
    65 	}
       
    66 
       
    67 DEFINE_SMELEMENT(SubConnStates::TSendBuildStack, NetStateMachine::MStateTransition, SubConnStates::TContext)
       
    68 void SubConnStates::TSendBuildStack::DoL()
       
    69 	{
       
    70     // The flow request parameters are stored within the subconnection node
       
    71     RCFParameterFamilyBundleC subConnectionParameters = iContext.Node().iParameterBundle;
       
    72 
       
    73 	// Send build stack to ourself to kick off a stack building activity
       
    74 	iContext.iNodeActivity->PostRequestTo( iContext.Node().Id(),
       
    75 	    TCFInternalEsock::TBuildStackRequest(subConnectionParameters).CRef());
       
    76 	}
       
    77 
       
    78 DEFINE_SMELEMENT(SubConnActivities::CBuildStack::TAwaitingBuildStack, NetStateMachine::MState, SubConnActivities::CBuildStack::TContext)
       
    79 TBool SubConnActivities::CBuildStack::TAwaitingBuildStack::Accept()
       
    80 	{
       
    81 	return iContext.iMessage.IsMessage<TCFInternalEsock::TBuildStackRequest>();
       
    82 	}
       
    83 
       
    84 DEFINE_SMELEMENT(SubConnActivities::CNoBearer::TStoreFlowParams, NetStateMachine::MStateTransition, SubConnActivities::CNoBearer::TContext)
       
    85 void SubConnActivities::CNoBearer::TStoreFlowParams::DoL()
       
    86 	{
       
    87 	// Store the received flow params in the activity
       
    88 	TCFControlProvider::TNoBearer& noBearerMessage = message_cast<TCFControlProvider::TNoBearer>(iContext.iMessage);
       
    89     SubConnActivities::CNoBearer* noBearerActivity = static_cast<SubConnActivities::CNoBearer*>(iContext.iNodeActivity);
       
    90 	noBearerActivity->SetFlowRequestParameters(noBearerMessage.iFamilyBundle);
       
    91 	}
       
    92 
       
    93 //-=========================================================
       
    94 //Create
       
    95 //-=========================================================
       
    96 
       
    97 DEFINE_SMELEMENT(SubConnStates::TJoinCPR, NetStateMachine::MStateTransition, SubConnStates::TContext)
       
    98 void SubConnStates::TJoinCPR::DoL()
       
    99 	{
       
   100 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCSubConnectionPanic,KPanicNoActivity));
       
   101     if (iContext.Node().ControlProvider().ServiceProvider() == NULL)
       
   102         {
       
   103         User::Leave(KErrNotReady);
       
   104         }
       
   105 
       
   106     iContext.Node().AddClientL(iContext.Node().ControlProvider().ServiceProvider()->RecipientId(), TClientType(TCFClientType::EServProvider));
       
   107     iContext.iNodeActivity->PostRequestTo(*iContext.Node().ControlProvider().ServiceProvider(),
       
   108         TCFServiceProvider::TJoinRequest(iContext.NodeId(), TCFClientType::ECtrl).CRef());
       
   109 	}
       
   110 
       
   111 DEFINE_SMELEMENT(SubConnStates::TRequestServiceProvider, NetStateMachine::MStateTransition, SubConnStates::TContext)
       
   112 void SubConnStates::TRequestServiceProvider::DoL()
       
   113 	{
       
   114 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCSubConnectionPanic,KPanicNoActivity));
       
   115 
       
   116     // The flow request parameters are stored within the activity itself
       
   117     SubConnActivities::CNoBearer* noBearerActivity = static_cast<SubConnActivities::CNoBearer*>(iContext.iNodeActivity);
       
   118     RCFParameterFamilyBundleC flowParams = noBearerActivity->GetFlowRequestParameters();
       
   119 
       
   120 	// Send our service provider a comms binder carrying the necessary flow request parameters
       
   121     iContext.iNodeActivity->PostRequestTo(
       
   122 		*iContext.Node().ServiceProvider(),
       
   123         TCFServiceProvider::TCommsBinderRequest(
       
   124 			TSubConnOpen::ECreateNew,
       
   125 			flowParams
       
   126 			).CRef()
       
   127 		);
       
   128 	}
       
   129 
       
   130 DEFINE_SMELEMENT(SubConnStates::TLeaveCPR, NetStateMachine::MStateTransition, SubConnStates::TContext)
       
   131 void SubConnStates::TLeaveCPR::DoL()
       
   132 	{
       
   133 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCSubConnectionPanic,KPanicNoActivity));
       
   134     __ASSERT_DEBUG(iContext.Node().ControlProvider().ServiceProvider() != NULL, User::Panic(KSpecAssert_ESockSSocksbcnst, 1));
       
   135 
       
   136 #ifdef _DEBUG
       
   137     TInt count = iContext.Node().CountClients<TDefaultClientMatchPolicy>(TClientType(TCFClientType::EServProvider), TClientType(0, TCFClientType::EActive));
       
   138 	// Now the subconn had joined SCPR, and CPR. The relationship between subconn and CPR is temporary and 
       
   139 	// should be terminate here in this transition. So in here make sure there's ONLY 1 SP inactive and 
       
   140 	// that's supposed to be the CPR, any other cases are wrong
       
   141     __ASSERT_DEBUG(count == 1, User::Panic(KCSubConnectionPanic, KPanicNoServiceProvider));
       
   142 #endif
       
   143 
       
   144 	// Find the SP which is not EActive because EActive is not set on the CPR's flag in the first place
       
   145     RNodeInterface * cpr = iContext.Node().GetFirstClient<TDefaultClientMatchPolicy>(TClientType(TCFClientType::EServProvider), TClientType(0, TCFClientType::EActive));
       
   146     iContext.iNodeActivity->PostRequestTo(*cpr, TEPeer::TLeaveRequest().CRef());
       
   147     cpr->SetFlags(TCFClientType::ELeaving);
       
   148 	}
       
   149 
       
   150 //-=========================================================
       
   151 //Rejoin
       
   152 //-=========================================================
       
   153 
       
   154 DEFINE_SMELEMENT(SubConnStates::TJoinTheOtherOwner, NetStateMachine::MStateTransition, SubConnStates::TContext)
       
   155 void SubConnStates::TJoinTheOtherOwner::DoL()
       
   156 	{
       
   157 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCSubConnectionPanic,KPanicNoActivity));
       
   158     SubConnActivities::CRejoin* rejoinActivity = static_cast<SubConnActivities::CRejoin*>(iContext.iNodeActivity);
       
   159     rejoinActivity->InitialiseL(iContext.Node());
       
   160 
       
   161 	//MZTODO: activity using this transition - and possibly the whole approach - must be redesigned
       
   162 	//so that all destinations are safe! (used to be: TCtrlClientJoinRequestUnsafeDst).
       
   163     rejoinActivity->SetOldOwnerIntf(iContext.Node().AddClientL(rejoinActivity->TheOtherOwner(), TClientType(TCFClientType::EServProvider)));
       
   164 	iContext.iNodeActivity->ClearPostedTo();
       
   165 
       
   166     RClientInterface::OpenPostMessageClose(iContext.NodeId(), rejoinActivity->TheOtherOwner(),
       
   167     	TCFServiceProvider::TJoinRequest(iContext.NodeId(), TClientType(TCFClientType::ECtrl)).CRef());
       
   168 	}
       
   169 
       
   170 DEFINE_SMELEMENT(SubConnStates::TLeaveTheOtherOwner, NetStateMachine::MStateTransition, SubConnStates::TContext)
       
   171 void SubConnStates::TLeaveTheOtherOwner::DoL()
       
   172 	{
       
   173 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCSubConnectionPanic,KPanicNoActivity));
       
   174     SubConnActivities::CRejoin* rejoinActivity = static_cast<SubConnActivities::CRejoin*>(iContext.iNodeActivity);
       
   175 
       
   176     RClientInterface::OpenPostMessageClose(iContext.NodeId(), rejoinActivity->TheOtherOwner(),
       
   177     	TEPeer::TLeaveRequest().CRef());
       
   178 		
       
   179 	rejoinActivity->OldOwnerIntf()->SetFlags(ESock::TCFClientType::ELeaving);
       
   180 	}
       
   181 
       
   182 DEFINE_SMELEMENT(SubConnStates::TSendRejoinDataClientRequestToOldOwner, NetStateMachine::MStateTransition, SubConnStates::TContext)
       
   183 void SubConnStates::TSendRejoinDataClientRequestToOldOwner::DoL()
       
   184 	{
       
   185 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCSubConnectionPanic,KPanicNoActivity));
       
   186     SubConnActivities::CRejoin* rejoinActivity = static_cast<SubConnActivities::CRejoin*>(iContext.iNodeActivity);
       
   187 
       
   188     RClientInterface::OpenPostMessageClose(iContext.NodeId(), rejoinActivity->OldOwner(),
       
   189     	TCFRejoiningProvider::TRejoinDataClientRequest(rejoinActivity->Flow(), rejoinActivity->NewOwner()).CRef());
       
   190 	}
       
   191 
       
   192 DEFINE_SMELEMENT(SubConnStates::TSendApplyToOldOwner, NetStateMachine::MStateTransition, SubConnStates::TContext)
       
   193 void SubConnStates::TSendApplyToOldOwner::DoL()
       
   194 	{
       
   195 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCSubConnectionPanic,KPanicNoActivity));
       
   196     SubConnActivities::CRejoin* rejoinActivity = static_cast<SubConnActivities::CRejoin*>(iContext.iNodeActivity);
       
   197     RClientInterface::OpenPostMessageClose(iContext.NodeId(), rejoinActivity->OldOwner(),
       
   198     	TCFScpr::TApplyRequest().CRef());
       
   199 	}
       
   200 
       
   201 DEFINE_SMELEMENT(SubConnStates::TSendApplyToNewOwner, NetStateMachine::MStateTransition, SubConnStates::TContext)
       
   202 void SubConnStates::TSendApplyToNewOwner::DoL()
       
   203 	{
       
   204 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCSubConnectionPanic,KPanicNoActivity));
       
   205     SubConnActivities::CRejoin* rejoinActivity = static_cast<SubConnActivities::CRejoin*>(iContext.iNodeActivity);
       
   206     RClientInterface::OpenPostMessageClose(iContext.NodeId(), rejoinActivity->NewOwner(),
       
   207     	TCFScpr::TApplyRequest().CRef());
       
   208 	}
       
   209 
       
   210 DEFINE_SMELEMENT(SubConnStates::TSendCancelToOldOwner, NetStateMachine::MStateTransition, SubConnStates::TContext)
       
   211 void SubConnStates::TSendCancelToOldOwner::DoL()
       
   212 	{
       
   213 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCSubConnectionPanic,KPanicNoActivity));
       
   214     SubConnActivities::CRejoin* rejoinActivity = static_cast<SubConnActivities::CRejoin*>(iContext.iNodeActivity);
       
   215 
       
   216     RClientInterface::OpenPostMessageClose(iContext.NodeId(), rejoinActivity->OldOwner(),
       
   217     	TEBase::TCancel().CRef());
       
   218 	}
       
   219 
       
   220 
       
   221 //-=========================================================
       
   222 //SetParameters
       
   223 //-=========================================================
       
   224 DEFINE_SMELEMENT(SubConnStates::TSendParamsToServiceProvider, NetStateMachine::MStateTransition, SubConnStates::TContext)
       
   225 void SubConnStates::TSendParamsToServiceProvider::DoL()
       
   226 	{
       
   227 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCSubConnectionPanic,KPanicNoActivity));
       
   228 	SubConnActivities::CSetParameters& setParamsActivity =
       
   229 	    static_cast<SubConnActivities::CSetParameters&>(*iContext.iNodeActivity);
       
   230 
       
   231     if (iContext.Node().SubConnType() == RSubConnection::EAttachToDefault)
       
   232       {
       
   233       // SubConnections opened with EAttachToDefault require the NetworkControl capability for changing QoS
       
   234       setParamsActivity.HasCapabilityL (ECapabilityNetworkControl, "CSubConnection::SetParametersL(): EAttachToDefault requires NetworkControl");
       
   235       }
       
   236 #ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
       
   237 	iContext.iNodeActivity->PostRequestTo(*iContext.Node().ServiceProvider(),
       
   238 	    TCFScpr::TSetParamsRequest(setParamsActivity.GetParameterBundleL()).CRef());
       
   239 #else
       
   240 	iContext.iNodeActivity->PostRequestTo(*iContext.Node().ServiceProvider(),
       
   241 	    TCFScpr::TParamsRequest(setParamsActivity.GetParameterBundleL()).CRef());
       
   242 #endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
       
   243 	}
       
   244 
       
   245 DEFINE_SMELEMENT(SubConnStates::TStoreParams, NetStateMachine::MStateTransition, SubConnStates::TContext)
       
   246 void SubConnStates::TStoreParams::DoL()
       
   247 	{
       
   248 #ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
       
   249 	TCFScpr::TSetParamsResponse& paramResponse = message_cast<TCFScpr::TSetParamsResponse>(iContext.iMessage);
       
   250 #else
       
   251 	TCFScpr::TParamsResponse& paramResponse = message_cast<TCFScpr::TParamsResponse>(iContext.iMessage);
       
   252 #endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
       
   253 	if(! iContext.Node().iParameterBundle.IsNull())
       
   254     	{
       
   255 		iContext.Node().iParameterBundle.Close();
       
   256     	}
       
   257     iContext.Node().iParameterBundle.Open(paramResponse.iFamilyBundle);
       
   258 	}
       
   259 
       
   260 DEFINE_SMELEMENT(SubConnStates::TSendParamRequest, NetStateMachine::MStateTransition, SubConnStates::TContext)
       
   261 void SubConnStates::TSendParamRequest::DoL()
       
   262     {
       
   263     __ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KSpecAssert_ESockSSocksbcnst, 2));
       
   264     __ASSERT_DEBUG(iContext.Node().ServiceProvider(), User::Panic(KSpecAssert_ESockSSocksbcnst, 3));
       
   265 #ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
       
   266 	iContext.iNodeActivity->PostRequestTo(*iContext.Node().ServiceProvider(),
       
   267   	    TCFScpr::TSetParamsRequest(iContext.Node().iParameterBundle).CRef());
       
   268 #else
       
   269 	iContext.iNodeActivity->PostRequestTo(*iContext.Node().ServiceProvider(),
       
   270   	    TCFScpr::TParamsRequest(iContext.Node().iParameterBundle).CRef());
       
   271 #endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
       
   272     }
       
   273 
       
   274 DEFINE_SMELEMENT(SubConnStates::TNoTagOrParamsPresent, NetStateMachine::MStateFork, SubConnStates::TContext)
       
   275 TInt SubConnStates::TNoTagOrParamsPresent::TransitionTag()
       
   276     {
       
   277     return iContext.Node().iParameterBundle.IsNull() ? MeshMachine::KNoTag : PRStates::KParamsPresent;
       
   278     }
       
   279 
       
   280 DEFINE_SMELEMENT(SubConnStates::TWriteSubConnParamsLength, NetStateMachine::MStateTransition, SubConnStates::TContext)
       
   281 void SubConnStates::TWriteSubConnParamsLength::DoL()
       
   282 	{
       
   283 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCSubConnectionPanic,KPanicNoActivity));
       
   284 	__ASSERT_DEBUG( ! iContext.Node().iParameterBundle.IsNull() , User::Panic(KSpecAssert_ESockSSocksbcnst, 4));
       
   285 	CESockClientActivityBase& esockActivity =
       
   286 	    static_cast<CESockClientActivityBase&>(*iContext.iNodeActivity);
       
   287 
       
   288 	//I know!!
       
   289 	esockActivity.SetError(iContext.Node().iParameterBundle.IsNull() ? KErrNotReady : (TInt) iContext.Node().iParameterBundle.Length() );
       
   290 	}
       
   291 
       
   292 DEFINE_SMELEMENT(SubConnStates::TWriteSubConnParams, NetStateMachine::MStateTransition, SubConnStates::TContext)
       
   293 void SubConnStates::TWriteSubConnParams::DoL()
       
   294 	{
       
   295 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCSubConnectionPanic,KPanicNoActivity));
       
   296 	__ASSERT_DEBUG(! iContext.Node().iParameterBundle.IsNull() , User::Panic(KSpecAssert_ESockSSocksbcnst, 5));	
       
   297 	CESockClientActivityBase& esockActivity =
       
   298 	    static_cast<CESockClientActivityBase&>(*iContext.iNodeActivity);
       
   299 	RCFParameterFamilyBundleC& pfb = iContext.Node().iParameterBundle;
       
   300 	pfb.CheckOpenL();
       
   301 
       
   302 	RBuf8 buffer;
       
   303 	buffer.CreateL(pfb.Length());
       
   304 	CleanupClosePushL(buffer);
       
   305 	User::LeaveIfError(pfb.Store(buffer));
       
   306 	#ifdef ESOCK_LOGGING_ACTIVE
       
   307 		if(esockActivity.GetDesMaxLengthL(0) < buffer.Length())
       
   308 			{
       
   309 			LOG(ESockLog::Printf(_L("ESock: SubConnStates[%x]\tTWriteSubConnParams: client supplied buffer of size %d is too small to store parameter bundle of size %d"), this, esockActivity.GetDesMaxLengthL(0), buffer.Length()));
       
   310 			}
       
   311 	#endif
       
   312 	esockActivity.WriteL(0, buffer);
       
   313 	CleanupStack::PopAndDestroy();	// buffer
       
   314 	}
       
   315 
       
   316 //-=========================================================
       
   317 //Events
       
   318 //-=========================================================
       
   319 
       
   320 DEFINE_SMELEMENT(SubConnStates::TAwaitingEventNotificationSubscription, NetStateMachine::MState, SubConnStates::TContext)
       
   321 TBool SubConnStates::TAwaitingEventNotificationSubscription::Accept()
       
   322 	{
       
   323     if (subsessmessage_cast<ESCEventNotificationSetup>(&iContext.iMessage) ||
       
   324         subsessmessage_cast<ESCEventAllNotifications>(&iContext.iMessage))
       
   325         {
       
   326         return ETrue;
       
   327         }
       
   328     return EFalse;
       
   329 	}
       
   330 
       
   331 DEFINE_SMELEMENT(SubConnStates::TNoTagOrAllNotifications, NetStateMachine::MStateFork, SubConnStates::TContext)
       
   332 TInt SubConnStates::TNoTagOrAllNotifications::TransitionTag()
       
   333 	{
       
   334     if (subsessmessage_cast<ESCEventAllNotifications>(&iContext.iMessage))
       
   335         {
       
   336         return ESCEventAllNotifications;
       
   337         }
       
   338     return MeshMachine::KNoTag;
       
   339 	}
       
   340 
       
   341 DEFINE_SMELEMENT(SubConnStates::TSetupFilteredEventNotification, NetStateMachine::MStateTransition, SubConnStates::TContext)
       
   342 void SubConnStates::TSetupFilteredEventNotification::DoL()
       
   343 	{
       
   344 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCSubConnectionPanic,KPanicNoActivity));
       
   345 	SubConnActivities::CEventNotification& eventNotificationActivity =
       
   346 	    static_cast<SubConnActivities::CEventNotification&>(*iContext.iNodeActivity);
       
   347 
       
   348     eventNotificationActivity.RequestEventNotificationSetupL();
       
   349 	}
       
   350 
       
   351 DEFINE_SMELEMENT(SubConnStates::TSetupAllEventNotification, NetStateMachine::MStateTransition, SubConnStates::TContext)
       
   352 void SubConnStates::TSetupAllEventNotification::DoL()
       
   353 	{
       
   354 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCSubConnectionPanic,KPanicNoActivity));
       
   355 	SubConnActivities::CEventNotification& eventNotificationActivity =
       
   356 	    static_cast<SubConnActivities::CEventNotification&>(*iContext.iNodeActivity);
       
   357 
       
   358     eventNotificationActivity.RequestAllEventNotificationsL();
       
   359 	}
       
   360 
       
   361 DEFINE_SMELEMENT(SubConnStates::TFillInEvent, NetStateMachine::MStateTransition, SubConnStates::TContext)
       
   362 void SubConnStates::TFillInEvent::DoL()
       
   363 	{
       
   364 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCSubConnectionPanic,KPanicNoActivity));
       
   365 	SubConnActivities::CEventNotification& eventNotificationActivity =
       
   366 	    static_cast<SubConnActivities::CEventNotification&>(*iContext.iNodeActivity);
       
   367 
       
   368 	if (iContext.iMessage.IsMessage<TCFSubConnControlClient::TSubConnNotification>())
       
   369     	{
       
   370         TEnqueueEvent enqueueEvent(iContext);
       
   371         enqueueEvent.DoL();
       
   372     	}
       
   373 
       
   374     CRefCountOwnedSubConNotification* eventRefCountOwner = NULL;
       
   375     TBool eventConsumed = EFalse;
       
   376     while (iContext.Node().iEventQueue.Deque(eventRefCountOwner))
       
   377         {
       
   378         __ASSERT_DEBUG(eventRefCountOwner && eventRefCountOwner->Ptr(), User::Panic(KSpecAssert_ESockSSocksbcnst, 6));
       
   379         eventConsumed = eventNotificationActivity.FillInEvent(*eventRefCountOwner->Ptr());
       
   380         eventRefCountOwner->Close();
       
   381         if (eventConsumed)
       
   382             {
       
   383             break;
       
   384             }
       
   385         }
       
   386 	}
       
   387 
       
   388 DEFINE_SMELEMENT(SubConnStates::TEnqueueEvent, NetStateMachine::MStateTransition, SubConnStates::TContext)
       
   389 void SubConnStates::TEnqueueEvent::CreateOrUpdateBundleL(CSubConGenEventParamsGranted* aEvent)
       
   390     {
       
   391 	RCFParameterFamilyBundleC& myBundle = iContext.Node().GetOrCreateParameterBundleL();
       
   392 
       
   393      RParameterFamily family=myBundle.FindFamily(KSubConQoSFamily);
       
   394 	 if ( family.IsNull() )
       
   395         {
       
   396        	RCFParameterFamilyBundle newBundle;
       
   397 		newBundle.CreateL();
       
   398 		newBundle.Open(myBundle);
       
   399 		family = newBundle.CreateFamilyL(KSubConQoSFamily);
       
   400         //family = myBundle.CreateFamilyL(KSubConQoSFamily); //PJLEFT
       
   401         newBundle.Close();
       
   402         }
       
   403 
       
   404 	 family.ClearAllParameters (RParameterFamily::EGranted);
       
   405 
       
   406      CSubConGenericParameterSet* origGeneric = const_cast<CSubConGenericParameterSet*>(aEvent->GetGenericSet());
       
   407      if (origGeneric)
       
   408         {
       
   409         // A copy must be used because parameters owned by the event will be destructed
       
   410         // along with it.
       
   411         CSubConGenericParameterSet* copyGeneric = static_cast<CSubConGenericParameterSet*>(CSubConGenericParameterSet::NewL (origGeneric->GetTypeId()));
       
   412         CleanupStack::PushL (copyGeneric);
       
   413         copyGeneric->Copy (*origGeneric);
       
   414         family.AddParameterSetL (copyGeneric, RParameterFamily::EGranted);
       
   415         CleanupStack::Pop (copyGeneric);
       
   416         }
       
   417 
       
   418      TInt max = aEvent->GetNumExtensionSets();
       
   419      for (TInt i=0; i<max; i++)
       
   420         {
       
   421         CSubConExtensionParameterSet* origExtension = const_cast<CSubConExtensionParameterSet*>(aEvent->GetExtensionSet (i));
       
   422         CSubConExtensionParameterSet* copyExtension = static_cast<CSubConExtensionParameterSet*>(CSubConExtensionParameterSet::NewL(origExtension->GetTypeId()));
       
   423         CleanupStack::PushL (copyExtension);
       
   424         copyExtension->Copy (*origExtension);
       
   425         family.AddParameterSetL(copyExtension, RParameterFamily::EGranted);
       
   426         CleanupStack::Pop (copyExtension);
       
   427         }
       
   428     }
       
   429 
       
   430 
       
   431 void SubConnStates::TEnqueueEvent::DoL()
       
   432 	{
       
   433 	TCFSubConnControlClient::TSubConnNotification& eventMsg = message_cast<TCFSubConnControlClient::TSubConnNotification>(iContext.iMessage);
       
   434 	__ASSERT_DEBUG(eventMsg.iRefCountOwnedSubConNotification, User::Panic(KSpecAssert_ESockSSocksbcnst, 7));
       
   435 	__ASSERT_DEBUG(eventMsg.iRefCountOwnedSubConNotification->Ptr(), User::Panic(KSpecAssert_ESockSSocksbcnst, 8));
       
   436 	iContext.Node().iEventQueue.Enque(eventMsg.iRefCountOwnedSubConNotification);
       
   437     const CSubConNotificationEvent* event = eventMsg.iRefCountOwnedSubConNotification->Ptr();
       
   438 	//If param related event - update the params.
       
   439     if (event->GroupId() == KSubConnGenericEventsImplUid
       
   440       && (event->Id() == KSubConGenericEventParamsGranted
       
   441          || event->Id() == KSubConGenericEventParamsChanged))
       
   442         {
       
   443         CreateOrUpdateBundleL(const_cast<CSubConGenEventParamsGranted*>(static_cast<const CSubConGenEventParamsGranted*>(event)));
       
   444         }
       
   445 	}
       
   446 
       
   447 DEFINE_SMELEMENT(SubConnStates::TNoTagOrActiveWhenEventEnqued, NetStateMachine::MStateFork, SubConnStates::TContext)
       
   448 TInt SubConnStates::TNoTagOrActiveWhenEventEnqued::TransitionTag()
       
   449 	{
       
   450 	if (!iContext.Node().iEventQueue.IsEmpty())
       
   451     	{
       
   452     	return KActiveTag;
       
   453     	}
       
   454     return MeshMachine::KNoTag;
       
   455 	}
       
   456 
       
   457 
       
   458 //-=========================================================
       
   459 //Start/Stop Connection
       
   460 //-=========================================================
       
   461 DEFINE_SMELEMENT(SubConnStates::TStartSubConnection, NetStateMachine::MStateTransition, SubConnStates::TContext)
       
   462 void SubConnStates::TStartSubConnection::DoL()
       
   463 	{
       
   464 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCSubConnectionPanic,KPanicNoActivity));
       
   465     if (iContext.Node().ServiceProvider() == NULL)
       
   466         {
       
   467         User::Leave(KErrNotReady);
       
   468         }
       
   469     iContext.iNodeActivity->PostRequestTo(*iContext.Node().ServiceProvider(),
       
   470         TCFServiceProvider::TStart().CRef());
       
   471 	}
       
   472 
       
   473 DEFINE_SMELEMENT(SubConnStates::TStopSubConnection, NetStateMachine::MStateTransition, SubConnStates::TContext)
       
   474 void SubConnStates::TStopSubConnection::DoL()
       
   475 	{
       
   476 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCSubConnectionPanic,KPanicNoActivity));
       
   477     if (iContext.Node().ServiceProvider() == NULL)
       
   478         {
       
   479         iContext.iNodeActivity->SetIdle();
       
   480         }
       
   481     else
       
   482         {
       
   483         iContext.iNodeActivity->PostRequestTo(*iContext.Node().ServiceProvider(),
       
   484             TCFServiceProvider::TStop(KErrCancel).CRef());
       
   485         }
       
   486 	}
       
   487 
       
   488 //-=========================================================
       
   489 //Close
       
   490 //-=========================================================
       
   491 DEFINE_SMELEMENT(SubConnStates::TDetachControlProvider, NetStateMachine::MStateTransition, SubConnStates::TContext)
       
   492 void SubConnStates::TDetachControlProvider::DoL()
       
   493 	{
       
   494    	TClientIter<TDefaultClientMatchPolicy> iter = iContext.Node().GetClientIter<TDefaultClientMatchPolicy>(TClientType(TCFClientType::ECtrlProvider));
       
   495 	if (iter[0])
       
   496     	{
       
   497 #if defined(__GCCXML__)
       
   498     	CConnection& conn = *reinterpret_cast<CConnection*>(&(iter[0]->RecipientId().Node()));
       
   499 #else
       
   500     	CConnection& conn = mcfnode_cast<CConnection>(iter[0]->RecipientId().Node());
       
   501 #endif
       
   502     	iContext.Node().RemoveClient(conn.Id());
       
   503     	conn.RemoveClient(iContext.NodeId());
       
   504     	}
       
   505 	}
       
   506 //-=========================================================
       
   507 //
       
   508 //
       
   509 //Activities
       
   510 //
       
   511 //
       
   512 //-=========================================================
       
   513 //-=========================================================
       
   514 //CNoBearer
       
   515 //-=========================================================
       
   516 MeshMachine::CNodeActivityBase* SubConnActivities::CNoBearer::NewL(const MeshMachine::TNodeActivity& aActivitySig, MeshMachine::AMMNodeBase& aNode)
       
   517     {
       
   518     SubConnActivities::CNoBearer* noBearerActivity = new SubConnActivities::CNoBearer(aActivitySig, aNode);
       
   519     if (noBearerActivity == NULL)
       
   520         {
       
   521     	User::Leave(KErrNoMemory);
       
   522         }
       
   523     return noBearerActivity;
       
   524     }
       
   525 
       
   526 SubConnActivities::CNoBearer::~CNoBearer()
       
   527     {
       
   528     //Destroy the subconnection if the ownership hasn't been released!
       
   529     iFlowRequestBundle.Close();
       
   530 	if(Error() != KErrNone)
       
   531 		{
       
   532 		PostToOriginators(TEBase::TError(KickOffMessageId(), Error()).CRef());
       
   533 		}
       
   534     }
       
   535 
       
   536 void SubConnActivities::CNoBearer::SetFlowRequestParameters(const ESock::RCFParameterFamilyBundleC& aParams)
       
   537     {
       
   538     if(!iFlowRequestBundle.IsNull())
       
   539     	{
       
   540     	iFlowRequestBundle.Close();
       
   541     	}
       
   542     iFlowRequestBundle.Open(aParams);
       
   543     }
       
   544 
       
   545 //-=========================================================
       
   546 //CBuildStack
       
   547 //-=========================================================
       
   548 MeshMachine::CNodeActivityBase* SubConnActivities::CBuildStack::NewL(const MeshMachine::TNodeActivity& aActivitySig, MeshMachine::AMMNodeBase& aNode)
       
   549     {
       
   550     SubConnActivities::CBuildStack* createActivity = new SubConnActivities::CBuildStack(aActivitySig, aNode);
       
   551     if (createActivity == NULL)
       
   552         {
       
   553     	User::Leave(KErrNoMemory);
       
   554         }
       
   555     return createActivity;
       
   556     }
       
   557 
       
   558 SubConnActivities::CBuildStack::CBuildStack(const MeshMachine::TNodeActivity& aActivitySig, MeshMachine::AMMNodeBase& aNode)
       
   559 	:	MeshMachine::CNodeActivityBase(aActivitySig, aNode),
       
   560 		CoreActivities::ABindingActivity(aNode.Id()),
       
   561 		TIfStaticFetcherNearestInHierarchy(this)
       
   562 		{
       
   563 		}
       
   564 
       
   565 SubConnActivities::CBuildStack::~CBuildStack()
       
   566     {
       
   567     }
       
   568 
       
   569 DEFINE_SMELEMENT(SubConnActivities::CBuildStack::TSendBuildStackResponse, NetStateMachine::MStateTransition, CBuildStack::TContext)
       
   570 void SubConnActivities::CBuildStack::TSendBuildStackResponse::DoL()
       
   571 	{
       
   572 	iContext.iNodeActivity->PostToOriginators(
       
   573 	    TCFInternalEsock::TBuildStackResponse().CRef());
       
   574 	}
       
   575 
       
   576 DEFINE_SMELEMENT(SubConnActivities::CBuildStack::TRequestServiceProviderFromCPR, NetStateMachine::MStateTransition, SubConnStates::TContext)
       
   577 void SubConnActivities::CBuildStack::TRequestServiceProviderFromCPR::DoL()
       
   578 	{
       
   579 	// This transition sends a request for a comms binder to the CPR
       
   580 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCSubConnectionPanic,KPanicNoActivity));
       
   581 	SubConnActivities::CBuildStack& buildStackActivity =
       
   582 		static_cast<SubConnActivities::CBuildStack&>(*iContext.iNodeActivity);
       
   583 
       
   584 	// The activity is a friend of the subconn so lets call on it to do the job
       
   585 	buildStackActivity.RequestServiceProviderFromCPRL(iContext);
       
   586 	}
       
   587 
       
   588 void SubConnActivities::CBuildStack::RequestServiceProviderFromCPRL(TContext& aContext)
       
   589 	{
       
   590     if (aContext.Node().ControlProvider().ServiceProvider() == NULL)
       
   591         {
       
   592         User::Leave(KErrNotReady);
       
   593         }
       
   594 
       
   595 	// Post the request to our controls provider's service provider (that the top level CPR that manages our connection)
       
   596 	aContext.iNodeActivity->PostRequestTo(
       
   597 		*aContext.Node().ControlProvider().ServiceProvider(),
       
   598 		TCFServiceProvider::TCommsBinderRequest(aContext.Node().iSubConnType,
       
   599 			aContext.Node().iParameterBundle
       
   600 			).CRef()
       
   601 		);
       
   602 	}
       
   603 
       
   604 
       
   605 //-=========================================================
       
   606 //CCreate
       
   607 //-=========================================================
       
   608 MeshMachine::CNodeActivityBase* SubConnActivities::CCreate::NewL(const MeshMachine::TNodeActivity& aActivitySig, MeshMachine::AMMNodeBase& aNode)
       
   609     {
       
   610     SubConnActivities::CCreate* createActivity = new SubConnActivities::CCreate(aActivitySig, aNode);
       
   611     if (createActivity == NULL)
       
   612         {
       
   613 #ifndef __GCCXML__
       
   614 		RClientInterface::OpenPostMessageClose(aNode.Id(), aNode.Id(), TCFInternalEsock::TSubSess(ESCClose,RMessage2()).CRef());
       
   615 #endif
       
   616     	User::Leave(KErrNoMemory);
       
   617         }
       
   618     return createActivity;
       
   619     }
       
   620 
       
   621 SubConnActivities::CCreate::~CCreate()
       
   622     {
       
   623     //Destroy the subconnection if the ownership hasn't been released!
       
   624     if (Error() != KErrNone)
       
   625     	{
       
   626     	RClientInterface::OpenPostMessageClose(iSubConnectionNode, iSubConnectionNode,
       
   627     		TCFInternalEsock::TSubSess(ESCClose,RMessage2()).CRef());
       
   628     	}
       
   629     }
       
   630 
       
   631 DEFINE_SMELEMENT(SubConnStates::TNoTagOrWaitForIncoming, NetStateMachine::MStateFork, SubConnStates::TContext)
       
   632 TInt SubConnStates::TNoTagOrWaitForIncoming::TransitionTag()
       
   633 	{
       
   634 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCSubConnectionPanic,KPanicNoActivity));
       
   635 	CESockClientActivityBase& ac = static_cast<CESockClientActivityBase&>(*iContext.iNodeActivity);
       
   636 
       
   637 	TPckgBuf<TSubConnOpen> argPkg;
       
   638 	ac.ReadL(0,argPkg);
       
   639 	iContext.Node().iSubConnType = static_cast<RSubConnection::TSubConnType>(argPkg().iType);
       
   640 	if (iContext.Node().iSubConnType == RSubConnection::EWaitIncoming)
       
   641     	{
       
   642     	return CoreNetStates::KWaitForIncoming;
       
   643     	}
       
   644 	return MeshMachine::KNoTag;
       
   645  	}
       
   646 
       
   647 DEFINE_SMELEMENT(SubConnStates::TNoTagOrAttachToDefaultOrWaitForIncoming, NetStateMachine::MStateFork, SubConnStates::TContext)
       
   648 TInt SubConnStates::TNoTagOrAttachToDefaultOrWaitForIncoming::TransitionTag()
       
   649 	{
       
   650 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCSubConnectionPanic,KPanicNoActivity));
       
   651 	CESockClientActivityBase& ac = static_cast<CESockClientActivityBase&>(*iContext.iNodeActivity);
       
   652 
       
   653 	TPckgBuf<TSubConnOpen> argPkg;
       
   654 	ac.ReadL(0,argPkg);
       
   655 	iContext.Node().iSubConnType = static_cast<RSubConnection::TSubConnType>(argPkg().iType);
       
   656 	if (iContext.Node().iSubConnType == RSubConnection::EWaitIncoming)
       
   657     	{
       
   658     	return CoreNetStates::KWaitForIncoming;
       
   659     	}
       
   660     else if (iContext.Node().iSubConnType == RSubConnection::EAttachToDefault)
       
   661     	{
       
   662     	return CoreNetStates::KAttachToDefault;
       
   663 		}
       
   664 	return MeshMachine::KNoTag;
       
   665  	}
       
   666 
       
   667 //-=========================================================
       
   668 //CRejoin
       
   669 //-=========================================================
       
   670 MeshMachine::CNodeActivityBase* SubConnActivities::CRejoin::NewL(const MeshMachine::TNodeActivity& aActivitySig, MeshMachine::AMMNodeBase& aNode)
       
   671     {
       
   672     return new (ELeave) SubConnActivities::CRejoin(aActivitySig, aNode);
       
   673     }
       
   674 
       
   675 SubConnActivities::CRejoin::~CRejoin()
       
   676     {
       
   677     }
       
   678 
       
   679 void SubConnActivities::CRejoin::InitialiseL(CSubConnection& aSC)
       
   680     {
       
   681     if (!iNewOwner.IsNull())
       
   682         {
       
   683         __ASSERT_DEBUG(!iOldOwner.IsNull() && !iFlow.IsNull(), User::Panic(KSpecAssert_ESockSSocksbcnst, 9));
       
   684         return;
       
   685         }
       
   686 
       
   687     if (aSC.ServiceProvider() == NULL)
       
   688         {
       
   689         User::Leave(KErrNotReady);
       
   690         }
       
   691 
       
   692     __ASSERT_DEBUG(aSC.Session(), User::Panic(KSpecAssert_ESockSSocksbcnst, 10));
       
   693     if (!aSC.Session()->FlowAndSCPRFromSocketHandle(iMessage.Int0(), iFlow, iOldOwner))
       
   694     	{
       
   695     	User::Leave(KErrNotFound);
       
   696     	}
       
   697 
       
   698     if (iMessage.Function() == ESCRemoveSocket)
       
   699         {
       
   700     	RNodeInterface* conn = aSC.ControlProvider().ServiceProvider();
       
   701     	__ASSERT_DEBUG(conn, User::Panic(KSpecAssert_ESockSSocksbcnst, 11));
       
   702     	User::LeaveIfError(conn? KErrNone : KErrArgument);
       
   703 
       
   704 #if defined(__GCCXML__)
       
   705     	CConnectionProviderBase& p = *reinterpret_cast<CConnectionProviderBase*>(&(conn->RecipientId().Node()));
       
   706 #else
       
   707     	CConnectionProviderBase& p = mcfnode_cast<CConnectionProviderBase>(conn->RecipientId().Node());
       
   708 #endif
       
   709     	RNodeInterface* primarySc = p.DefaultSubConnectionProvider();
       
   710     	__ASSERT_DEBUG( primarySc , User::Panic(KSpecAssert_ESockSSocksbcnst, 12));
       
   711 
       
   712         iNewOwner = primarySc->RecipientId();
       
   713         }
       
   714     else if (iMessage.Function() == ESCAddSocket)
       
   715         {
       
   716         iNewOwner = aSC.ServiceProvider()->RecipientId();
       
   717         }
       
   718     else
       
   719         {
       
   720         __ASSERT_DEBUG(EFalse, User::Panic(KSpecAssert_ESockSSocksbcnst, 13));
       
   721         }
       
   722     if (iNewOwner == iOldOwner)
       
   723         {
       
   724         User::Leave(KErrAlreadyExists);
       
   725         }
       
   726     }
       
   727 
       
   728 //-=========================================================
       
   729 //CSetParameters
       
   730 //-=========================================================
       
   731 MeshMachine::CNodeActivityBase* SubConnActivities::CSetParameters::NewL(const MeshMachine::TNodeActivity& aActivitySig, MeshMachine::AMMNodeBase& aNode)
       
   732     {
       
   733     return new (ELeave) SubConnActivities::CSetParameters(aActivitySig, aNode);
       
   734     }
       
   735 
       
   736 SubConnActivities::CSetParameters::~CSetParameters()
       
   737     {
       
   738     if (! iParameterBundle.IsNull())
       
   739         {
       
   740 	    iParameterBundle.Close();
       
   741         }
       
   742     }
       
   743 
       
   744 RCFParameterFamilyBundleC& SubConnActivities::CSetParameters::GetParameterBundleL()
       
   745     {
       
   746     if ( ! iParameterBundle.IsNull() )
       
   747         {
       
   748         return iParameterBundle;
       
   749         }
       
   750     //Extract the parameter bundle.
       
   751 	TInt length = iMessage.GetDesLengthL(0);
       
   752 	RBuf8 buffer;
       
   753 	buffer.CreateL(length);
       
   754 	CleanupClosePushL(buffer);
       
   755 	iMessage.ReadL(0, buffer);
       
   756 
       
   757 	iParameterBundle.LoadL(buffer);
       
   758 	CleanupStack::PopAndDestroy(&buffer);
       
   759 	return iParameterBundle;
       
   760     }
       
   761 
       
   762 void SubConnActivities::CSetParameters::CompleteMessage()
       
   763     {
       
   764 	LOG(ESockLog::Printf(_L("SubConnActivities::CSetParameters::CompleteMessage - (%08X) with %d"), iMessage.Handle(), Error()));
       
   765 	
       
   766 	__ASSERT_DEBUG(!iMessage.IsNull(), User::Panic(KSpecAssert_ESockSSocksbcnst, 14));
       
   767 	iMessage.Complete(Error());
       
   768     }
       
   769 
       
   770 DEFINE_SMELEMENT(SubConnActivities::CSetParameters::TCompleteClient, NetStateMachine::MStateTransition, TContext)
       
   771 void SubConnActivities::CSetParameters::TCompleteClient::DoL()
       
   772 	{
       
   773 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCSubConnectionPanic,KPanicNoActivity));
       
   774 	SubConnActivities::CSetParameters& setparamActivity = static_cast<SubConnActivities::CSetParameters&>(*iContext.Activity());
       
   775     setparamActivity.CompleteMessage();
       
   776 	}
       
   777 DEFINE_SMELEMENT(SubConnActivities::CSetParameters::TStoreNewParams, NetStateMachine::MStateTransition, SubConnStates::TContext)
       
   778 void SubConnActivities::CSetParameters::TStoreNewParams::DoL()
       
   779 	{
       
   780 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCSubConnectionPanic,KPanicNoActivity));
       
   781 	SubConnActivities::CSetParameters& setParamsActivity =
       
   782 		static_cast<SubConnActivities::CSetParameters&>(*iContext.iNodeActivity);
       
   783 
       
   784 	// Store the parameters in the subconnection node
       
   785 	setParamsActivity.StoreParametersInSubConn(iContext);
       
   786 	}
       
   787 
       
   788 void SubConnActivities::CSetParameters::StoreParametersInSubConn(TContext& aContext)
       
   789 	{
       
   790 	// Store the parameters in the CSubConnection node
       
   791 	if (!aContext.Node().iParameterBundle.IsNull())
       
   792     	{
       
   793 		aContext.Node().iParameterBundle.Close();
       
   794     	}
       
   795     aContext.Node().iParameterBundle.Open(GetParameterBundleL());
       
   796     aContext.Node().iParameterBundle.Open();
       
   797 	}
       
   798 
       
   799 //-=========================================================
       
   800 //CEventNotification
       
   801 //-=========================================================
       
   802 MeshMachine::CNodeActivityBase* SubConnActivities::CEventNotification::NewL(const MeshMachine::TNodeActivity& aActivitySig, MeshMachine::AMMNodeBase& aNode)
       
   803     {
       
   804     return new (ELeave) SubConnActivities::CEventNotification(aActivitySig, aNode);
       
   805     }
       
   806 
       
   807 SubConnActivities::CEventNotification::~CEventNotification()
       
   808     {
       
   809     }
       
   810 
       
   811 void SubConnActivities::CEventNotification::RequestEventNotificationSetupL()
       
   812     {
       
   813 	if (iMessage.Ptr0())
       
   814 		{
       
   815 		TPtr8 ptr((TUint8*)iEventUidFilterList, KMaxUidFilterListLen*sizeof(RSubConnection::TEventFilter));
       
   816 		TInt ret = iMessage.Read(0, ptr, 0);
       
   817 		iEventUidFilterListLength = ptr.Length() / sizeof(RSubConnection::TEventFilter);
       
   818 
       
   819 		if (ret != KErrNone)
       
   820 			{
       
   821 			// Null filter list
       
   822 			Mem::FillZ ((void*)iEventUidFilterList, KMaxUidFilterListLen*sizeof(RSubConnection::TEventFilter));
       
   823 			iEventUidFilterListLength = 0;
       
   824 			}
       
   825 		}
       
   826 	else
       
   827 		{
       
   828 		// Null filter list
       
   829 		Mem::FillZ ((void*)iEventUidFilterList, KMaxUidFilterListLen*sizeof(RSubConnection::TEventFilter));
       
   830 		iEventUidFilterListLength = 0;
       
   831 		}
       
   832     }
       
   833 
       
   834 void SubConnActivities::CEventNotification::RequestAllEventNotificationsL()
       
   835     {
       
   836     RSubConnection::TEventFilter & filter = iEventUidFilterList[0];
       
   837     if ( iMessage.Int1() ) //ie request only generic events
       
   838         {
       
   839         filter.iEventGroupUid = KSubConnGenericEventsImplUid;
       
   840         filter.iEventMask = 0xffffffff;
       
   841         iEventUidFilterListLength = 1;
       
   842         }
       
   843     else
       
   844         {
       
   845         iEventUidFilterListLength = 0;
       
   846         }
       
   847     }
       
   848 
       
   849 
       
   850 TBool SubConnActivities::CEventNotification::FillInEvent(const CSubConNotificationEvent& aEvent)
       
   851     {
       
   852 	TBool sendEvent(iEventUidFilterListLength == 0);
       
   853 	for (TUint i = 0; i < iEventUidFilterListLength; ++i)
       
   854 		{
       
   855 		if (iEventUidFilterList[i].iEventGroupUid == aEvent.GroupId() &&
       
   856 			iEventUidFilterList[i].iEventMask & aEvent.Id())
       
   857 			{
       
   858 			sendEvent = ETrue;
       
   859 			break;
       
   860 			}
       
   861 		}
       
   862 	if (sendEvent)
       
   863 		{
       
   864 		TBuf8<KMaxSubConnectionEventSize> eventBuffer;
       
   865 		TPtr8 ptr((TUint8*)eventBuffer.Ptr(),eventBuffer.MaxLength());
       
   866 		if (aEvent.Store(ptr) == KErrNone)
       
   867 			{
       
   868 			LOG(ESockLog::Printf(_L("ESock: CSubConnection[%x]: Notification Sent.  Event Type %d"), this, aEvent.Id()));
       
   869 			eventBuffer.SetLength(ptr.Length());
       
   870 			TInt err = iMessage.Write(0, eventBuffer);
       
   871 			}
       
   872 		}
       
   873 	return sendEvent;
       
   874     }
       
   875 
       
   876 
       
   877