# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1282205147 -10800 # Node ID 00c6709d25aafd4a43601eb542089ca08b7b2340 # Parent cbb19216b74d74812e1c793c394f39ad8d1560ec Revision: 201033 Kit: 201033 diff -r cbb19216b74d -r 00c6709d25aa commsfwsupport/commselements/commsfw/src/cflog.cpp --- a/commsfwsupport/commselements/commsfw/src/cflog.cpp Thu Jul 15 20:01:43 2010 +0300 +++ b/commsfwsupport/commselements/commsfw/src/cflog.cpp Thu Aug 19 11:05:47 2010 +0300 @@ -393,7 +393,7 @@ void CCFLog::ConstructL() { - iCsLock.CreateLocal(); + User::LeaveIfError(iCsLock.CreateLocal()); // construct initial cflogger will be first in session arrays RFileLogger* defaultflogger; diff -r cbb19216b74d -r 00c6709d25aa commsfwsupport/commselements/factories/bwins/factoriesu.def --- a/commsfwsupport/commselements/factories/bwins/factoriesu.def Thu Jul 15 20:01:43 2010 +0300 +++ b/commsfwsupport/commselements/factories/bwins/factoriesu.def Thu Aug 19 11:05:47 2010 +0300 @@ -28,4 +28,5 @@ ?SignalCreation@CFactoryBase@Factories@@AAEHAAVAFactoryObject@2@@Z @ 27 NONAME ; int Factories::CFactoryBase::SignalCreation(class Factories::AFactoryObject &) ?SignalDeletion@CFactoryBase@Factories@@AAEXAAVAFactoryObject@2@@Z @ 28 NONAME ; void Factories::CFactoryBase::SignalDeletion(class Factories::AFactoryObject &) ?Uid@CFactoryBase@Factories@@QBE?AVTUid@@XZ @ 29 NONAME ; class TUid Factories::CFactoryBase::Uid(void) const + ?InterfaceStateChange@CFactoryBase@Factories@@QAEXABVTDesC8@@@Z @ 30 NONAME ; void Factories::CFactoryBase::InterfaceStateChange(class TDesC8 const &) diff -r cbb19216b74d -r 00c6709d25aa commsfwsupport/commselements/factories/eabi/factoriesu.def --- a/commsfwsupport/commselements/factories/eabi/factoriesu.def Thu Jul 15 20:01:43 2010 +0300 +++ b/commsfwsupport/commselements/factories/eabi/factoriesu.def Thu Aug 19 11:05:47 2010 +0300 @@ -47,4 +47,5 @@ _ZTVN9Factories14AFactoryObjectE @ 46 NONAME _ZTVN9Factories17CFactoryContainerE @ 47 NONAME _ZTVN9Factories21CFactoryContainerNodeE @ 48 NONAME + _ZN9Factories12CFactoryBase20InterfaceStateChangeERK6TDesC8 @ 49 NONAME diff -r cbb19216b74d -r 00c6709d25aa commsfwsupport/commselements/factories/inc/factory.h --- a/commsfwsupport/commselements/factories/inc/factory.h Thu Jul 15 20:01:43 2010 +0300 +++ b/commsfwsupport/commselements/factories/inc/factory.h Thu Aug 19 11:05:47 2010 +0300 @@ -100,6 +100,9 @@ IMPORT_C void RegisterNotifierL(const IFactoryNotify& aFactoryNotify); IMPORT_C void DeRegisterNotifier(const IFactoryNotify& aFactoryNotify); + // Called by a node to indicate that an interface state change has taken place. The factory then propagates + // this to all observers that have registered to be notified. + IMPORT_C void InterfaceStateChange(const TDesC8& aInfo); protected: IMPORT_C explicit CFactoryBase(TUid aFactoryUid, CFactoryContainer& aParentContainer); diff -r cbb19216b74d -r 00c6709d25aa commsfwsupport/commselements/factories/inc/factorynotify.h --- a/commsfwsupport/commselements/factories/inc/factorynotify.h Thu Jul 15 20:01:43 2010 +0300 +++ b/commsfwsupport/commselements/factories/inc/factorynotify.h Thu Aug 19 11:05:47 2010 +0300 @@ -28,7 +28,7 @@ namespace Factories { -typedef void (*TInterfaceStateChangeFn)( TAny*, TDesC8& aInfo ); +typedef void (*TInterfaceStateChangeFn)( TAny*, const TDesC8& aInfo ); typedef TInt (*TFactoryNotifyFn)( TAny*, AFactoryObject& aObject, CFactoryBase& aFactory ); typedef void (*TAnyFn)(TAny*); @@ -50,7 +50,7 @@ { } - void InterfaceStateChange(TDesC8& aInfo) + void InterfaceStateChange(const TDesC8& aInfo) { if ( Check(1) ) { @@ -89,14 +89,14 @@ */ { public: - static void Notification(TAny* aThis, TDesC8& aInfo); + static void Notification(TAny* aThis, const TDesC8& aInfo); static void NotifyDeletion(TAny* aThis, AFactoryObject& aObject, CFactoryBase& aFactory); static TInt NotifyCreation(TAny* aThis, AFactoryObject& aObject, CFactoryBase& aFactory); }; template -void TFactoryNotify::Notification(TAny* aThis, TDesC8& aInfo) +void TFactoryNotify::Notification(TAny* aThis, const TDesC8& aInfo) { TCLIENT* me = (TCLIENT*)aThis; me->InterfaceStateChangeNotification(aInfo); diff -r cbb19216b74d -r 00c6709d25aa commsfwsupport/commselements/factories/src/factory.cpp --- a/commsfwsupport/commselements/factories/src/factory.cpp Thu Jul 15 20:01:43 2010 +0300 +++ b/commsfwsupport/commselements/factories/src/factory.cpp Thu Aug 19 11:05:47 2010 +0300 @@ -432,6 +432,14 @@ return obj; } +EXPORT_C void CFactoryBase::InterfaceStateChange(const TDesC8& aInfo) + { + for (TInt i = iFactoryNotify.Count() - 1; i >= 0; --i) + { + iFactoryNotify[i].InterfaceStateChange(aInfo); + } + } + EXPORT_C AFactoryObject::AFactoryObject(CFactoryBase& aFactory) : iFactory(aFactory) { diff -r cbb19216b74d -r 00c6709d25aa commsfwsupport/commselements/meshmachine/inc/mm_nodepeer.h --- a/commsfwsupport/commselements/meshmachine/inc/mm_nodepeer.h Thu Jul 15 20:01:43 2010 +0300 +++ b/commsfwsupport/commselements/meshmachine/inc/mm_nodepeer.h Thu Aug 19 11:05:47 2010 +0300 @@ -65,20 +65,35 @@ return Peer().Type(); } - TUint32 Flags() const - { - return Peer().Flags(); - } + TUint32 Flags() const + { + // Non-client peers lack flags (a state early in relationship) + if(PeerPtr()) + { + return PeerPtr()->Flags(); + } + return 0; + } - TUint32 SetFlags(TUint32 aFlags) - { - return Peer().SetFlags(aFlags); - } + TUint32 SetFlags(TUint32 aFlags) + { + // We only require peer info to be present if an actual state change is occurring (as opposed to default handling) + if(aFlags) + { + return Peer().SetFlags(aFlags); + } + return Flags(); + } - TUint32 ClearFlags(TUint32 aFlags) - { - return Peer().ClearFlags(aFlags); - } + TUint32 ClearFlags(TUint32 aFlags) + { + // We only require peer info to be present if an actual state change is occurring (as opposed to default handling) + if(aFlags) + { + return Peer().ClearFlags(aFlags); + } + return Flags(); + } const RNodeInterface& Peer() const { diff -r cbb19216b74d -r 00c6709d25aa commsfwsupport/commselements/meshmachine/src/mm_node.cpp --- a/commsfwsupport/commselements/meshmachine/src/mm_node.cpp Thu Jul 15 20:01:43 2010 +0300 +++ b/commsfwsupport/commselements/meshmachine/src/mm_node.cpp Thu Aug 19 11:05:47 2010 +0300 @@ -735,7 +735,10 @@ if(!freeCellFound) { MESH_LOG((KMeshMachineSubTag, _L8("ERROR AMMNodeBase %08x:\tBorrowPreallocatedSpace - All %d preallocation cells have been allocated!"), this, maxPreallocatedActivities)); - __ASSERT_ALWAYS(freeCellFound, User::Panic(KMMNodePanic, EPanicPreallocatedSpaceAlreadyTaken)); + __ASSERT_DEBUG(freeCellFound, User::Panic(KMMNodePanic, EPanicPreallocatedSpaceAlreadyTaken)); + // Attempt to allocate some space from the heap now in a last attempt to continue processing. + TRAPD(err,ptr = User::AllocL(aSize)); + __ASSERT_ALWAYS(err, User::Panic(KMessagesPanic, EPreAllocationFailedPanic)); } return ptr; @@ -766,6 +769,8 @@ { MESH_LOG((KMeshMachineSubTag, _L8("ERROR AMMNodeBase %08x:\tReturnPreallocatedSpace - the returned pointer 0x%08X is invalid!"), this, aSpace)); __ASSERT_DEBUG(allocatedCellFound, User::Panic(KMMNodePanic, EPanicPreallocatedSpaceReturnedOther)); + // May be returning a cell which was created in error recovery section of the Borrow in which case if must be "free"d. + User::Free(aSpace); } } diff -r cbb19216b74d -r 00c6709d25aa commsfwsupport/commselements/nodemessages/inc/nm_common.h --- a/commsfwsupport/commselements/nodemessages/inc/nm_common.h Thu Jul 15 20:01:43 2010 +0300 +++ b/commsfwsupport/commselements/nodemessages/inc/nm_common.h Thu Aug 19 11:05:47 2010 +0300 @@ -51,6 +51,7 @@ EAddressNotValidPanic, EClientNotValidPanic, EDeceasedNodePanic, + EPreAllocationFailedPanic }; diff -r cbb19216b74d -r 00c6709d25aa commsfwsupport/commselements/nodemessages/inc/nm_interfaces.h --- a/commsfwsupport/commselements/nodemessages/inc/nm_interfaces.h Thu Jul 15 20:01:43 2010 +0300 +++ b/commsfwsupport/commselements/nodemessages/inc/nm_interfaces.h Thu Aug 19 11:05:47 2010 +0300 @@ -416,6 +416,13 @@ iPreAllocSize=0; iPreAllocatedActivityChunk=NULL; } + ~TPreAllocStore() + { + if(iPreAllocatedActivityChunk != NULL) + { + User::Free(iPreAllocatedActivityChunk); + } + } TUint iPreAllocSize; TAny* iPreAllocatedActivityChunk; }; diff -r cbb19216b74d -r 00c6709d25aa commsfwsupport/commselements/nodemessages/src/nm_interfaces.cpp --- a/commsfwsupport/commselements/nodemessages/src/nm_interfaces.cpp Thu Jul 15 20:01:43 2010 +0300 +++ b/commsfwsupport/commselements/nodemessages/src/nm_interfaces.cpp Thu Aug 19 11:05:47 2010 +0300 @@ -23,7 +23,6 @@ #include #include "nm_signals.h" - #ifdef _DEBUG // Panic category for "absolutely impossible!" vanilla ASSERT()-type panics from this module // (if it could happen through user error then you should give it an explicit, documented, category + code) @@ -140,10 +139,9 @@ iClientType = TClientType::NullType(); if(iPreAlloc!=NULL) { - delete iPreAlloc->iPreAllocatedActivityChunk; + delete iPreAlloc; + iPreAlloc = NULL; } - delete iPreAlloc; - iPreAlloc = NULL; } EXPORT_C void RNodeInterface::PostMessage(const TRuntimeCtxId& aPostFrom, const TNodeId::TRemainder& aPostTo, const TSignalBase& aMessage) const @@ -171,11 +169,28 @@ if(iPreAlloc!=NULL) // Memory already allocated for this client { - __ASSERT_DEBUG(iPreAlloc->iPreAllocatedActivityChunk != NULL, User::Panic(KSpecAssert_ElemNodeMessIntC, 5)); - return; + // If iPreAlloc is not NULL then it should be usable. Ensure that the memory chunk has been suitable allocated + __ASSERT_DEBUG(iPreAlloc->iPreAllocatedActivityChunk != NULL, User::Panic(KSpecAssert_ElemNodeMessIntC, 2)); + if(iPreAlloc->iPreAllocSize >= aAllocSize) + // Memory already preallocated of a sufficient size - this could happen if clients are re-added + { + return; + } + else + // Memory preallocated is too small. Free up the space and then attempt to reallocate + { + // Code path should never enter here as PreAllocL should not be called once the iPreAlloc memory space is allocated. + // However on the chance of production device entering here attempt to clear the preallocated space and reallocate a more suitable amount. + __ASSERT_DEBUG(EFalse, User::Panic(KSpecAssert_ElemNodeMessIntC, 3)); + delete iPreAlloc; + iPreAlloc = NULL; + } } - iPreAlloc = new (ELeave) TPreAllocStore(); - iPreAlloc->iPreAllocatedActivityChunk = User::AllocL(aAllocSize); + TPreAllocStore* preAlloc = new (ELeave) TPreAllocStore(); + CleanupStack::PushL(preAlloc); + preAlloc->iPreAllocatedActivityChunk = User::AllocL(aAllocSize); + CleanupStack::Pop(preAlloc); + iPreAlloc = preAlloc; iPreAlloc->iPreAllocSize = aAllocSize; } @@ -188,12 +203,15 @@ if(!(iPreAlloc && aSize <= iPreAlloc->iPreAllocSize)) { // By this stage the PreAllocL must have been triggered and memory space must have been allocated. - __ASSERT_DEBUG(EFalse, User::Panic(KSpecAssert_ElemNodeMessIntC, 3)); - delete iPreAlloc->iPreAllocatedActivityChunk; - iPreAlloc->iPreAllocatedActivityChunk = User::AllocL(aSize); + __ASSERT_DEBUG(EFalse, User::Panic(KSpecAssert_ElemNodeMessIntC, 4)); + TRAPD(err,PreAllocL(aSize)); + __ASSERT_ALWAYS(err, User::Panic(KMessagesPanic, EPreAllocationFailedPanic)); } TAny* preallocatedSpace = (RNodeInterface*)iPreAlloc->iPreAllocatedActivityChunk; - iPreAlloc->iPreAllocatedActivityChunk=NULL; + // Release ownership of the memory area + iPreAlloc->iPreAllocatedActivityChunk = NULL; + delete iPreAlloc; + iPreAlloc = NULL; return preallocatedSpace; } @@ -252,7 +270,7 @@ EXPORT_C void RRequestOriginator::Open(RRequestOriginator& aOriginalRequest) { - __ASSERT_DEBUG(aOriginalRequest.IsOpen(), User::Panic(KSpecAssert_ElemNodeMessIntC, 4)); + __ASSERT_DEBUG(aOriginalRequest.IsOpen(), User::Panic(KSpecAssert_ElemNodeMessIntC, 1)); iNode = aOriginalRequest.iNode; iRemainder = aOriginalRequest.iRemainder; aOriginalRequest.Close(); diff -r cbb19216b74d -r 00c6709d25aa commsfwsupport/commselements/serverden/src/sd_workersession.cpp --- a/commsfwsupport/commselements/serverden/src/sd_workersession.cpp Thu Jul 15 20:01:43 2010 +0300 +++ b/commsfwsupport/commselements/serverden/src/sd_workersession.cpp Thu Aug 19 11:05:47 2010 +0300 @@ -62,6 +62,7 @@ EXPORT_C CSubSessionIx::~CSubSessionIx() { + iLock.Close(); User::Free(iIx); } diff -r cbb19216b74d -r 00c6709d25aa datacommsserver/esockserver/CoreProviders/src/coretiernotificationactivity.cpp --- a/datacommsserver/esockserver/CoreProviders/src/coretiernotificationactivity.cpp Thu Jul 15 20:01:43 2010 +0300 +++ b/datacommsserver/esockserver/CoreProviders/src/coretiernotificationactivity.cpp Thu Aug 19 11:05:47 2010 +0300 @@ -168,16 +168,16 @@ // set up a session with each collector for (TInt sessionId=0 ; sessionId, NetStateMachine::MStateTransition, TContext ) IMPORT_C virtual void DoL(); diff -r cbb19216b74d -r 00c6709d25aa datacommsserver/esockserver/UpsCoreProviders/src/upscpractivities.cpp --- a/datacommsserver/esockserver/UpsCoreProviders/src/upscpractivities.cpp Thu Jul 15 20:01:43 2010 +0300 +++ b/datacommsserver/esockserver/UpsCoreProviders/src/upscpractivities.cpp Thu Aug 19 11:05:47 2010 +0300 @@ -92,12 +92,12 @@ { iFlags = aFlags; } -/* + TInt CDeferredCtrlClientJoinActivity::Flags() { return iFlags; } -*/ + EXPORT_DEFINE_SMELEMENT(CDeferredCtrlClientJoinActivity::TStoreControlClient, NetStateMachine::MStateTransition, CDeferredCtrlClientJoinActivity::TContext) EXPORT_C void CDeferredCtrlClientJoinActivity::TStoreControlClient::DoL() @@ -109,6 +109,7 @@ __ASSERT_DEBUG(act->Client() == TNodeId::NullId(), User::Panic(KSpecAssert_ESockUpsCoreProv, 2)); const TCFControlClient::TJoinRequest& msg = message_cast(iContext.iMessage); act->SetClient(msg.iNodeId); + act->SetFlags(msg.iClientType.Flags()); } EXPORT_DEFINE_SMELEMENT(CDeferredCtrlClientJoinActivity::TAddControlClientAndSendJoinComplete, NetStateMachine::MStateTransition, CDeferredCtrlClientJoinActivity::TContext) @@ -121,7 +122,7 @@ __ASSERT_DEBUG(act->Client() != TNodeId::NullId(), User::Panic(KSpecAssert_ESockUpsCoreProv, 3)); // Add control client - iContext.Node().AddClientL(act->Client(), TCFClientType(TCFClientType::ECtrl)); + iContext.Node().AddClientL(act->Client(), TCFClientType(TCFClientType::ECtrl, act->Flags())); // Send TJoinComplete RClientInterface::OpenPostMessageClose(iContext.NodeId(), act->Client(), TCFControlClient::TJoinComplete().CRef()); diff -r cbb19216b74d -r 00c6709d25aa datacommsserver/esockserver/bwins/esocksvrU.DEF --- a/datacommsserver/esockserver/bwins/esocksvrU.DEF Thu Jul 15 20:01:43 2010 +0300 +++ b/datacommsserver/esockserver/bwins/esocksvrU.DEF Thu Aug 19 11:05:47 2010 +0300 @@ -1055,4 +1055,9 @@ ?GetVDataTableStatic@TTierTypeIdFactoryQuery@ESock@@SAPBUSVDataTableEntry@Meta@@XZ @ 1054 NONAME ; struct Meta::SVDataTableEntry const * ESock::TTierTypeIdFactoryQuery::GetVDataTableStatic(void) ?AddClientL@CMMCommsProviderBase@ESock@@UAEPAVRNodeInterface@Messages@@ABVTNodeId@4@ABVTClientType@4@PAX@Z @ 1055 NONAME ; class Messages::RNodeInterface * ESock::CMMCommsProviderBase::AddClientL(class Messages::TNodeId const &, class Messages::TClientType const &, void *) ?ConstructL@ACFMMNodeBase@ESock@@IAEXH@Z @ 1056 NONAME ; void ESock::ACFMMNodeBase::ConstructL(int) + ?GetVTablePtr@TSendErrorRecoveryReq@CGoneDownActivity@PRActivities@@SAPAVMStateTransition@NetStateMachine@@AAVTDesC8@@PAX@Z @ 1057 NONAME ; class NetStateMachine::MStateTransition * PRActivities::CGoneDownActivity::TSendErrorRecoveryReq::GetVTablePtr(class TDesC8 &, void *) + ?GetVTablePtr@TCancelAndCloseZone0ClientExtIfaces@CoreNetStates@@SAPAVMStateTransition@NetStateMachine@@AAVTDesC8@@PAX@Z @ 1058 NONAME ; class NetStateMachine::MStateTransition * CoreNetStates::TCancelAndCloseZone0ClientExtIfaces::GetVTablePtr(class TDesC8 &, void *) + ?GetVTablePtr@TIgnoreOrPropagate@CGoneDownActivity@PRActivities@@SAPAVMStateFork@NetStateMachine@@AAVTDesC8@@PAX@Z @ 1059 NONAME ; class NetStateMachine::MStateFork * PRActivities::CGoneDownActivity::TIgnoreOrPropagate::GetVTablePtr(class TDesC8 &, void *) + ?DoL@TCancelStart@CoreNetStates@@UAEXXZ @ 1060 NONAME ; void CoreNetStates::TCancelStart::DoL(void) + ?New@CGoneDownActivity@PRActivities@@SAPAVCNodeActivityBase@MeshMachine@@ABUTNodeActivity@4@AAVAMMNodeBase@4@@Z @ 1061 NONAME ; class MeshMachine::CNodeActivityBase * PRActivities::CGoneDownActivity::New(struct MeshMachine::TNodeActivity const &, class MeshMachine::AMMNodeBase &) diff -r cbb19216b74d -r 00c6709d25aa datacommsserver/esockserver/core_states/ss_corepractivities.cpp --- a/datacommsserver/esockserver/core_states/ss_corepractivities.cpp Thu Jul 15 20:01:43 2010 +0300 +++ b/datacommsserver/esockserver/core_states/ss_corepractivities.cpp Thu Aug 19 11:05:47 2010 +0300 @@ -2118,7 +2118,7 @@ // //-========================================================= -MeshMachine::CNodeActivityBase* CGoneDownActivity::New(const MeshMachine::TNodeActivity& aActivitySig, MeshMachine::AMMNodeBase& aNode) +EXPORT_C MeshMachine::CNodeActivityBase* CGoneDownActivity::New(const MeshMachine::TNodeActivity& aActivitySig, MeshMachine::AMMNodeBase& aNode) { TAny* space = BorrowPreallocatedSpace(aNode, sizeof(CGoneDownActivity)); CGoneDownActivity* self = new (space) CGoneDownActivity(aActivitySig, aNode); @@ -2180,7 +2180,7 @@ return NetStateMachine::ACore::IsIdle(); } -DEFINE_SMELEMENT(CGoneDownActivity::TSendErrorRecoveryReq, NetStateMachine::MStateTransition, CGoneDownActivity::TContext) +EXPORT_DEFINE_SMELEMENT(CGoneDownActivity::TSendErrorRecoveryReq, NetStateMachine::MStateTransition, CGoneDownActivity::TContext) void CGoneDownActivity::TSendErrorRecoveryReq::DoL() { __ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCorePrPanic, KPanicNoActivity)); @@ -2203,7 +2203,7 @@ activity.ClearPostedTo(); } -DEFINE_SMELEMENT(CGoneDownActivity::TIgnoreOrPropagate, NetStateMachine::MStateFork, CGoneDownActivity::TContext) +EXPORT_DEFINE_SMELEMENT(CGoneDownActivity::TIgnoreOrPropagate, NetStateMachine::MStateFork, CGoneDownActivity::TContext) TInt CGoneDownActivity::TIgnoreOrPropagate::TransitionTag() { __ASSERT_DEBUG(iContext.iMessage.IsMessage(), User::Panic(KSpecAssert_ESockCrStaCPRAC, 38)); diff -r cbb19216b74d -r 00c6709d25aa datacommsserver/esockserver/core_states/ss_corepractivities.h --- a/datacommsserver/esockserver/core_states/ss_corepractivities.h Thu Jul 15 20:01:43 2010 +0300 +++ b/datacommsserver/esockserver/core_states/ss_corepractivities.h Thu Aug 19 11:05:47 2010 +0300 @@ -891,7 +891,7 @@ class CGoneDownActivity : public MeshMachine::CNodeRetryActivity, protected MeshMachine::APreallocatedOriginators<2> { public: - static MeshMachine::CNodeActivityBase* New(const MeshMachine::TNodeActivity& aActivitySig, MeshMachine::AMMNodeBase& aNode); + IMPORT_C static MeshMachine::CNodeActivityBase* New(const MeshMachine::TNodeActivity& aActivitySig, MeshMachine::AMMNodeBase& aNode); protected: CGoneDownActivity(const MeshMachine::TNodeActivity& aActivitySig, MeshMachine::AMMNodeBase& aNode); @@ -913,11 +913,11 @@ typedef MeshMachine::TNodeContext TContext; public: - DECLARE_SMELEMENT_HEADER( TIgnoreOrPropagate, MeshMachine::TStateFork, NetStateMachine::MStateFork, TContext ) + EXPORT_DECLARE_SMELEMENT_HEADER( TIgnoreOrPropagate, MeshMachine::TStateFork, NetStateMachine::MStateFork, TContext ) virtual TInt TransitionTag(); DECLARE_SMELEMENT_FOOTER( TIgnoreOrPropagate ) - DECLARE_SMELEMENT_HEADER( TSendErrorRecoveryReq, MeshMachine::TStateTransition, NetStateMachine::MStateTransition, TContext ) + EXPORT_DECLARE_SMELEMENT_HEADER( TSendErrorRecoveryReq, MeshMachine::TStateTransition, NetStateMachine::MStateTransition, TContext ) virtual void DoL(); DECLARE_SMELEMENT_FOOTER( TSendErrorRecoveryReq ) }; diff -r cbb19216b74d -r 00c6709d25aa datacommsserver/esockserver/core_states/ss_coreprstates.cpp --- a/datacommsserver/esockserver/core_states/ss_coreprstates.cpp Thu Jul 15 20:01:43 2010 +0300 +++ b/datacommsserver/esockserver/core_states/ss_coreprstates.cpp Thu Aug 19 11:05:47 2010 +0300 @@ -232,8 +232,8 @@ // which is handled by another activity __ASSERT_DEBUG(msg.iClientType.Type() != (TUint32)TCFClientType::EData, User::Panic(KSpecAssert_ESockCrStaCPRSC, 3)); -// iContext.Node().AddClientL(msg.iNodeId, TClientType(TCFClientType::ECtrl,msg.iValue)); - iContext.Node().AddClientL(msg.iNodeId, TClientType(TCFClientType::ECtrl)); + iContext.Node().AddClientL(msg.iNodeId, TClientType(TCFClientType::ECtrl,msg.iClientType.Flags())); + //Send confirmation RClientInterface::OpenPostMessageClose(iContext.NodeId(), iContext.iSender, TCFPeer::TJoinComplete().CRef()); } @@ -2127,7 +2127,7 @@ iContext.iNodeActivity->SetError(static_cast(iContext.iMessage).iValue); } -DEFINE_SMELEMENT(TCancelAndCloseZone0ClientExtIfaces, NetStateMachine::MStateTransition, CoreNetStates::TContext) +EXPORT_DEFINE_SMELEMENT(TCancelAndCloseZone0ClientExtIfaces, NetStateMachine::MStateTransition, CoreNetStates::TContext) void TCancelAndCloseZone0ClientExtIfaces::DoL() { //0 means we will cancel and close all open extensions! @@ -2182,7 +2182,7 @@ } EXPORT_DEFINE_SMELEMENT(TCancelStart, NetStateMachine::MStateTransition, CoreNetStates::TContext) -void TCancelStart::DoL() +EXPORT_C void TCancelStart::DoL() { CNodeActivityBase* startActivity = iContext.Node().FindActivityById(ECFActivityStart); if (startActivity) diff -r cbb19216b74d -r 00c6709d25aa datacommsserver/esockserver/core_states/ss_coreprstates.h --- a/datacommsserver/esockserver/core_states/ss_coreprstates.h Thu Jul 15 20:01:43 2010 +0300 +++ b/datacommsserver/esockserver/core_states/ss_coreprstates.h Thu Aug 19 11:05:47 2010 +0300 @@ -11,7 +11,7 @@ // Contributors: // // Description: -// Core PR States +// Core PR State // // @@ -759,19 +759,19 @@ IMPORT_C virtual void DoL(); DECLARE_SMELEMENT_FOOTER( TCancelDataClientStart ) -DECLARE_SMELEMENT_HEADER( TCancelAndCloseZone0ClientExtIfaces, MeshMachine::TStateTransition, NetStateMachine::MStateTransition, TContext ) +EXPORT_DECLARE_SMELEMENT_HEADER( TCancelAndCloseZone0ClientExtIfaces, MeshMachine::TStateTransition, NetStateMachine::MStateTransition, TContext ) virtual void DoL(); DECLARE_SMELEMENT_FOOTER( TCancelAndCloseZone0ClientExtIfaces ) EXPORT_DECLARE_SMELEMENT_HEADER( TProcessOrForwardRMessage2Ext, MeshMachine::TStateTransition, NetStateMachine::MStateTransition, TContext ) - virtual void DoL(); + IMPORT_C virtual void DoL(); DECLARE_SMELEMENT_FOOTER( TProcessOrForwardRMessage2Ext ) /** * Check if ECFActivityStart is running, and if so cancel it */ EXPORT_DECLARE_SMELEMENT_HEADER( TCancelStart, MeshMachine::TStateTransition, NetStateMachine::MStateTransition, TContext ) - virtual void DoL(); + IMPORT_C virtual void DoL(); DECLARE_SMELEMENT_FOOTER( TCancelStart ) DECLARE_AGGREGATED_TRANSITION2( diff -r cbb19216b74d -r 00c6709d25aa datacommsserver/esockserver/eabi/esocksvrU.DEF --- a/datacommsserver/esockserver/eabi/esocksvrU.DEF Thu Jul 15 20:01:43 2010 +0300 +++ b/datacommsserver/esockserver/eabi/esocksvrU.DEF Thu Aug 19 11:05:47 2010 +0300 @@ -1962,4 +1962,15 @@ _ZN5ESock20CMMCommsProviderBase10AddClientLERKN8Messages7TNodeIdERKNS1_11TClientTypeEPv @ 1961 NONAME _ZThn36_N5ESock20CMMCommsProviderBase10AddClientLERKN8Messages7TNodeIdERKNS1_11TClientTypeEPv @ 1962 NONAME _ZN5ESock13ACFMMNodeBase10ConstructLEi @ 1963 NONAME + _ZN12PRActivities17CGoneDownActivity18TIgnoreOrPropagate12GetVTablePtrER6TDesC8Pv @ 1964 NONAME + _ZN12PRActivities17CGoneDownActivity21TSendErrorRecoveryReq12GetVTablePtrER6TDesC8Pv @ 1965 NONAME + _ZN12PRActivities17CGoneDownActivity3NewERKN11MeshMachine13TNodeActivityERNS1_11AMMNodeBaseE @ 1966 NONAME + _ZN13CoreNetStates12TCancelStart3DoLEv @ 1967 NONAME + _ZN13CoreNetStates35TCancelAndCloseZone0ClientExtIfaces12GetVTablePtrER6TDesC8Pv @ 1968 NONAME + _ZTIN12PRActivities17CGoneDownActivity18TIgnoreOrPropagateE @ 1969 NONAME + _ZTIN12PRActivities17CGoneDownActivity21TSendErrorRecoveryReqE @ 1970 NONAME + _ZTIN13CoreNetStates35TCancelAndCloseZone0ClientExtIfacesE @ 1971 NONAME + _ZTVN12PRActivities17CGoneDownActivity18TIgnoreOrPropagateE @ 1972 NONAME + _ZTVN12PRActivities17CGoneDownActivity21TSendErrorRecoveryReqE @ 1973 NONAME + _ZTVN13CoreNetStates35TCancelAndCloseZone0ClientExtIfacesE @ 1974 NONAME diff -r cbb19216b74d -r 00c6709d25aa datacommsserver/esockserver/inc/SS_conn.H --- a/datacommsserver/esockserver/inc/SS_conn.H Thu Jul 15 20:01:43 2010 +0300 +++ b/datacommsserver/esockserver/inc/SS_conn.H Thu Aug 19 11:05:47 2010 +0300 @@ -40,7 +40,6 @@ class TProcessIncomingConnection; class TProcessProgressRequest; class TParseECNAttach; - class TJoinReceivedCpr; class TProcessBinderResponseForCpr; class TCompleteLegacyAttach; class TProcessEnumResponse; @@ -144,7 +143,6 @@ friend class ConnStates::TProcessIncomingConnection; friend class ConnStates::TProcessProgressRequest; friend class ConnStates::TParseECNAttach; - friend class ConnStates::TJoinReceivedCpr; friend class ConnStates::TProcessBinderResponseForCpr; friend class ConnStates::TCompleteLegacyAttach; friend class ConnStates::TProcessEnumResponse; @@ -155,6 +153,7 @@ friend class EnumerateConnectionsActivity::TCompleteClient; friend class AllInterfaceNotificationActivity::TEnqueueNotification; friend class AllInterfaceNotificationActivity::TSendErrorToConnection; + friend class ConnActivities::CAllInterfaceNotificationActivity; friend class ConnSubConnEventsActivity::TProcessSubConnEvent; friend class ConnStates::TGenerateConnectionUpProgress; @@ -294,6 +293,7 @@ friend class AllInterfaceNotificationActivity::TStartLinkNotification; friend class AllInterfaceNotificationActivity::TEnqueueNotification; friend class AllInterfaceNotificationActivity::TSendErrorToConnection; +friend class ConnActivities::CAllInterfaceNotificationActivity; public: CAllInterfaceNotificationWorker(ESock::CConnection& aConnection); diff -r cbb19216b74d -r 00c6709d25aa datacommsserver/esockserver/inc/SS_rslv.H --- a/datacommsserver/esockserver/inc/SS_rslv.H Thu Jul 15 20:01:43 2010 +0300 +++ b/datacommsserver/esockserver/inc/SS_rslv.H Thu Aug 19 11:05:47 2010 +0300 @@ -85,10 +85,13 @@ virtual void ProcessMessageL(); void InitiateDestruction(); - + inline void SetFlowRequestType(TFlowParams::TFlowRequestType aFlowRequestType) + { iFlowRequestType = aFlowRequestType; } + protected: void LockToConnectionInfo(); void LockToConnectionInfo(const TDesC8& aConnectionInfo); + void UpdateFlowRequestType(); void SetBlockedReq(const RMessage2& aMsg) { iBlockedReq = aMsg; @@ -152,7 +155,7 @@ TPtr8 iPtrQryBuf; //< Pointer descriptor, associated with ipQryBuf TPtr8 iPtrQryResBuf; //< Pointer descriptor, associated with ipQryRespBuf - + TFlowParams::TFlowRequestType iFlowRequestType; //< Flow request type used while opening the HR }; inline void CHostResolver::SetResolver(CHostResolvProvdBase* aResolver) diff -r cbb19216b74d -r 00c6709d25aa datacommsserver/esockserver/inc/es_enum_internal.h --- a/datacommsserver/esockserver/inc/es_enum_internal.h Thu Jul 15 20:01:43 2010 +0300 +++ b/datacommsserver/esockserver/inc/es_enum_internal.h Thu Aug 19 11:05:47 2010 +0300 @@ -88,6 +88,15 @@ */ typedef TPckgBuf TConnGetSocketInfoArgBuf; +/** +This enum is used as an internal extension to TConnInterfaceState + +@internalComponent +*/ +enum TConnInterfaceStateInternal + { + EInterfaceRestarting = 0x100 + }; #include diff -r cbb19216b74d -r 00c6709d25aa datacommsserver/esockserver/inc/es_prot_internal.h --- a/datacommsserver/esockserver/inc/es_prot_internal.h Thu Jul 15 20:01:43 2010 +0300 +++ b/datacommsserver/esockserver/inc/es_prot_internal.h Thu Aug 19 11:05:47 2010 +0300 @@ -198,6 +198,9 @@ @internalTechnology */ const TUint KSoSetPlatSecApi = 4 | KSocketInternalOptionBit; + +const TUint KSoFlowRequestType = 5 | KSocketInternalOptionBit; + #endif //SYMBIAN_NETWORKING_UPS /** diff -r cbb19216b74d -r 00c6709d25aa datacommsserver/esockserver/inc/ss_connLegacy.h --- a/datacommsserver/esockserver/inc/ss_connLegacy.h Thu Jul 15 20:01:43 2010 +0300 +++ b/datacommsserver/esockserver/inc/ss_connLegacy.h Thu Aug 19 11:05:47 2010 +0300 @@ -49,6 +49,11 @@ class TSendErrorToConnection; } +namespace ConnActivities +{ +class CAllInterfaceNotificationActivity; +} + namespace EnumerateConnectionsActivity { class TQueryTierStatus; @@ -84,9 +89,12 @@ friend class EnumerateConnectionsActivity::TCompleteClient; friend class AllInterfaceNotificationActivity::TEnqueueNotification; friend class AllInterfaceNotificationActivity::TSendErrorToConnection; + friend class ConnActivities::CAllInterfaceNotificationActivity; friend class ConnStates::TNoTagOrCancelAllInterfaceWorker; friend class ConnStates::TCancelAllInterfaceNotificationWorker; +public: + enum { KIPProtoConnectionProviderFactoryUid = 0x10281DD3 }; public: //So that friends of CConnection (transitions) can access it void CompleteAttachL(TSelectionPrefs& aPrefs); void CancelServiceChangeNotification(const Den::RSafeMessage& aMessage); @@ -155,7 +163,6 @@ ADataMonitoringProvider* FetchSubConnDataMonitoringProvider() const; //global notifications - void InterfaceStateChangeNotification(TDesC8& aInfo); void RequestServiceChangeNotificationL(const Den::RSafeMessage& aMessage); void ControlL(TUint aOptionName, TUint aMessageId); @@ -212,9 +219,6 @@ RMessage2 iAllInterfaceNotificationMessage; TInterfaceChangeQueue iNotificationQueue; Messages::TNodeId iAllInterfaceNotificationWorker; - -protected: - static const TAnyFn iInterfaceVTableF[]; }; diff -r cbb19216b74d -r 00c6709d25aa datacommsserver/esockserver/inc/ss_connstates.h --- a/datacommsserver/esockserver/inc/ss_connstates.h Thu Jul 15 20:01:43 2010 +0300 +++ b/datacommsserver/esockserver/inc/ss_connstates.h Thu Aug 19 11:05:47 2010 +0300 @@ -84,10 +84,6 @@ virtual void DoL(); DECLARE_SMELEMENT_FOOTER( TSelectMetaPlane ) -DECLARE_SMELEMENT_HEADER( TJoinReceivedCpr, SubSessStates::TECABStateTransitionBase, NetStateMachine::MStateTransition, TContext ) - virtual void DoL(); -DECLARE_SMELEMENT_FOOTER( TJoinReceivedCpr ) - DECLARE_SMELEMENT_HEADER( TSendFinishedSelectionStateChange, SubSessStates::TECABStateTransitionBase, NetStateMachine::MStateTransition, TContext ) virtual void DoL(); DECLARE_SMELEMENT_FOOTER( TSendFinishedSelectionStateChange ) @@ -118,12 +114,6 @@ virtual void DoL(); DECLARE_SMELEMENT_FOOTER( TStartConnection ) -DECLARE_AGGREGATED_TRANSITION2( - TSendFinishedSelectionAndJoinReceivedCpr, - ConnStates::TSendFinishedSelectionStateChange, - ConnStates::TJoinReceivedCpr - ) - DECLARE_SMELEMENT_HEADER( TErrorOrCancel, MeshMachine::TStateFork, NetStateMachine::MStateFork, ConnStates::TContext ) virtual TInt TransitionTag(); DECLARE_SMELEMENT_FOOTER( TErrorOrCancel ) @@ -525,6 +515,8 @@ public: static MeshMachine::CNodeActivityBase* NewL(const MeshMachine::TNodeActivity& aActivitySig, MeshMachine::AMMNodeBase& aNode); + void InterfaceStateChangeNotification(const TDesC8& aInfo); + ESock::CCommsFactoryBase* IpProtoCprFactory() const; private: CAllInterfaceNotificationActivity(const MeshMachine::TNodeActivity& aActivitySig, MeshMachine::AMMNodeBase& aNode) : @@ -535,11 +527,16 @@ } virtual ~CAllInterfaceNotificationActivity(); + const Factories::TAnyFn& GetVTable() { return iInterfaceVTableF[0]; }; private: TUid iTierUid; Messages::TNodeId iTierManager; const CAllInterfaceNotificationWorker* iAllInterfaceNotificationWorker; + TBool iRegisteredForInterfaceStateChanges:1; // Registered with IpProtoCpr factory + +private: + static const ESock::TAnyFn iInterfaceVTableF[]; }; /** diff -r cbb19216b74d -r 00c6709d25aa datacommsserver/esockserver/inc/ss_sapshim.h --- a/datacommsserver/esockserver/inc/ss_sapshim.h Thu Jul 15 20:01:43 2010 +0300 +++ b/datacommsserver/esockserver/inc/ss_sapshim.h Thu Aug 19 11:05:47 2010 +0300 @@ -230,6 +230,8 @@ SAP_FLAG_FUNCTIONS(DeleteUponBearerReception, EDeleteUponBearerReception) SAP_FLAG_FUNCTIONS(UseBearerErrors, EUseBearerErrors) + void HostResolverSpecificUnbind(); + private: CServProviderBase* iProvider; //CHostResolver specific workaround for now diff -r cbb19216b74d -r 00c6709d25aa datacommsserver/esockserver/ssock/SS_RSLV.CPP --- a/datacommsserver/esockserver/ssock/SS_RSLV.CPP Thu Jul 15 20:01:43 2010 +0300 +++ b/datacommsserver/esockserver/ssock/SS_RSLV.CPP Thu Aug 19 11:05:47 2010 +0300 @@ -741,6 +741,7 @@ { LOG(ESockLog::Printf(KESockConnectionTag, _L8("CHostResolver %08x:\tStartSending() iBusy %d, iAwaitingConnection %d"), this,iBusy,iAwaitingConnection) ); LockToConnectionInfo(); + UpdateFlowRequestType(); if (iBusy && iAwaitingConnection) { switch (iCurrentOp) @@ -893,6 +894,12 @@ } } +void CHostResolver::UpdateFlowRequestType() + { + TPckgBuf flowRequestTypePckg = iFlowRequestType; + + iRSP->SetOption(KSOLProvider, KSoFlowRequestType, flowRequestTypePckg); + } void CHostResolver::ProcessMessageL() { diff -r cbb19216b74d -r 00c6709d25aa datacommsserver/esockserver/ssock/ss_connLegacy.cpp --- a/datacommsserver/esockserver/ssock/ss_connLegacy.cpp Thu Jul 15 20:01:43 2010 +0300 +++ b/datacommsserver/esockserver/ssock/ss_connLegacy.cpp Thu Aug 19 11:05:47 2010 +0300 @@ -62,12 +62,6 @@ //const TInt KNumberOfEmulatedSubConnections = 2; -const Factories::TAnyFn AConnectionLegacy::iInterfaceVTableF[] = - { - (Factories::TAnyFn)1, - (Factories::TAnyFn)(TFactoryNotify::Notification) - }; - AConnectionLegacy::~AConnectionLegacy() { TSubConnectionEvent* subConnectionEvent; @@ -130,7 +124,7 @@ } -static const TUid K_CIPProtoConnectionProviderFactory_iUid = {0x10281DD3}; +//static const TUid K_CIPProtoConnectionProviderFactory_iUid = {0x10281DD3}; void AConnectionLegacy::CompleteAttachL(ESock::TSelectionPrefs& aPrefs) { @@ -146,7 +140,7 @@ __ASSERT_DEBUG(cpr->GetFirstClient(TClientType(TCFClientType::EServProvider))==NULL, User::Panic(KSpecAssert_ESockSSockscnLgc, 3)); //This is why we are "legacy" CConnectionFactoryContainer& container = *static_cast(iConnection.Player()).SockManGlobals()->iConnectionFactories; - CCommsFactoryBase* factory = static_cast(container.FindFactory(K_CIPProtoConnectionProviderFactory_iUid)); + CCommsFactoryBase* factory = static_cast(container.FindFactory(TUid::Uid(KIPProtoConnectionProviderFactoryUid))); User::LeaveIfError(factory? KErrNone : KErrArgument); XConnectionFactoryAPQuery query(static_cast(cp).IapId()); @@ -900,40 +894,6 @@ iConnection.DontCompleteCurrentRequest(); } - - -void AConnectionLegacy::InterfaceStateChangeNotification(TDesC8& /*aInfo*/) - { - //[399TODO] implement InterfaceStateChangeNotification - LOG(ESockLog::Printf(KESockConnectionTag, _L8("TODO: implement InterfaceStateChangeNotification - KErrNotSupported"))); -#if TODO_IMPLEMENT_THIS - TInterfaceNotification& interfaceNotification = ((TInterfaceNotificationBuf&)aInfo)(); - - if(iAllInterfaceNotificationMessage.IsNull()) - { - iInterfaceChangeQueue.Enque(interfaceNotification); - return; - } - else // request is outstanding - { - if(!iInterfaceChangeQueue.IsEmpty()) - { - // can this situation ever happen? - // - new requests fullfilled from queue before becoming outstanding - // - no queued items when request outstanding - - // But in case we do... - // should we get oldest change first in case this new one overwrites it - iInterfaceChangeQueue.Enque(interfaceNotification); - iInterfaceChangeQueue.Deque(interfaceNotification); - } - - TInt ret = iAllInterfaceNotificationMessage.Write(0, aInfo); - CompleteMessage(iAllInterfaceNotificationMessage, ret); - } -#endif - } - void AConnectionLegacy::SubConnectionEvent(const TSubConnectionEvent& aSubConnectionEvent) { // Pass the message onto the client if possible, or buffer if necessary diff -r cbb19216b74d -r 00c6709d25aa datacommsserver/esockserver/ssock/ss_connstates.cpp --- a/datacommsserver/esockserver/ssock/ss_connstates.cpp Thu Jul 15 20:01:43 2010 +0300 +++ b/datacommsserver/esockserver/ssock/ss_connstates.cpp Thu Aug 19 11:05:47 2010 +0300 @@ -56,7 +56,7 @@ #include #include #endif - +#include #ifdef _DEBUG // Panic category for "absolutely impossible!" vanilla ASSERT()-type panics from this module // (if it could happen through user error then you should give it an explicit, documented, category + code) @@ -252,35 +252,6 @@ TCFMessage::TStateChange(TStateChange(KFinishedSelection,KErrNone)).CRef()); } -DEFINE_SMELEMENT(ConnStates::TJoinReceivedCpr, NetStateMachine::MStateTransition, ConnStates::TContext) -void ConnStates::TJoinReceivedCpr::DoL() - { - __ASSERT_DEBUG(iContext.iNodeActivity, ConnPanic(KPanicNoActivity)); - __ASSERT_DEBUG(iContext.Node().ServiceProvider()==NULL, ConnPanic(KPanicExpectedNoServiceProvider)); - - TCFDataClient::TBindTo& bt = message_cast(iContext.iMessage); - RNodeInterface* newSP = iContext.Node().AddClientL(bt.iNodeId, TClientType(TCFClientType::EServProvider, TCFClientType::EActive)); - __ASSERT_DEBUG(iContext.Node().ServiceProvider()==newSP, ConnPanic(KPanicNoServiceProvider)); //[RZ] revise this, possibly overdefensive - - //If this is attach, we need to see if we are a monitor or not - TClientType clientType(TCFClientType::ECtrl); - - TUint selPrefs = static_cast(*iContext.iNodeActivity).SelectionPrefs().Flags(); - if (selPrefs & TSelectionPrefs::EMonitor) - { - clientType.SetFlags(TCFClientType::EMonitor); - iContext.Node().iIsMonitor = ETrue; - } - - // If it is an attach set the flag cause it is used by NetUPS to check if a JoinRequest comes from an RConnection::Attach - if (selPrefs & TSelectionPrefs::EAttach) - { - clientType.SetFlags(TCFClientType::EAttach); - } - iContext.iNodeActivity->PostRequestTo(*newSP, - TCFServiceProvider::TJoinRequest(iContext.NodeId(), clientType).CRef()); - } - DEFINE_SMELEMENT(ConnStates::TJoinReceivedSCpr, NetStateMachine::MStateTransition, ConnStates::TContext) void ConnStates::TJoinReceivedSCpr::DoL() { @@ -1303,9 +1274,61 @@ { iNode.RemoveClient(aux->RecipientId()); } + + if (iRegisteredForInterfaceStateChanges) + { + CCommsFactoryBase* ipProtoCprFactory = IpProtoCprFactory(); + if (ipProtoCprFactory) + { + Factories::IFactoryNotify itf(this, GetVTable()); + ipProtoCprFactory->DeRegisterNotifier(itf); + } + } + delete iAllInterfaceNotificationWorker; //delete this node (why via iAllInterfaceNotificationWorker??) } +/** +Called by the IpProtoCpr factory to propagate an interface state change from IpProtoCpr to registered +observers (suc as ourself). If the interface is restarting, then we need to insert an EInterfaceDown, +EInterfaceUp "toggle" sequence into the AllInterfaceNotification queue. This is because, ordinarily, +EInterfaceUp and EInterfaceDown are generated when the IpProtoCpr itself is created and destroyed, +but not if it is restarted before being destroyed. +*/ +void CAllInterfaceNotificationActivity::InterfaceStateChangeNotification(const TDesC8& aInfo) + { + if (aInfo.Length() == sizeof(TInterfaceNotification)) + { + const TInterfaceNotification* const info = reinterpret_cast(aInfo.Ptr()); + if (info && info->iState == EInterfaceRestarting) + { + LOG( ESockLog::Printf(KESockConnectionTag, _L("CAllInterfaceNotificationActivity %08x:\tInterfaceStateChangeNotification(): CConnection %08x, IapId %d, NetId %d"), + this, &iAllInterfaceNotificationWorker->iConnection, info->iConnectionInfo.iIapId, info->iConnectionInfo.iNetId )); + + AConnectionLegacy& legacy = iAllInterfaceNotificationWorker->iConnection.iLegacyConnection; + TInterfaceNotification notification(*info); + notification.iState = EInterfaceDown; + legacy.iNotificationQueue.Enque(notification); + notification.iState = EInterfaceUp; + legacy.iNotificationQueue.Enque(notification); + legacy.CompleteAllInterfaceNotificationL(KErrNone); + } + } + } + +CCommsFactoryBase* CAllInterfaceNotificationActivity::IpProtoCprFactory() const + { + CConnectionFactoryContainer& container = *static_cast(iAllInterfaceNotificationWorker->iConnection.Player()).SockManGlobals()->iConnectionFactories; + return static_cast(container.FindFactory(TUid::Uid(AConnectionLegacy::KIPProtoConnectionProviderFactoryUid))); + } + +// Registration table for receiving InterfaceStateChangeNotification() events. +const Factories::TAnyFn CAllInterfaceNotificationActivity::iInterfaceVTableF[] = + { + (Factories::TAnyFn)1, // number of methods. the following entries must be in this order! + (Factories::TAnyFn)(Factories::TFactoryNotify::Notification) + }; + // States DEFINE_SMELEMENT(AllInterfaceNotificationActivity::TAwaitingStart, NetStateMachine::MState, TContext) @@ -1461,6 +1484,23 @@ TCFTierStatusProvider::TTierNotification& msg = message_cast(iContext.iMessage); __ASSERT_DEBUG(msg.iBundle, User::Panic(KSpecAssert_ESockSSockscnsts, 14)); + + CAllInterfaceNotificationActivity& act = *iContext.Activity(); + + // Register with the IpProtoCpr factory for interface state changes if we haven't already done so. + // We can only do this if the IpProtoCpr is active, and the assumption here is that it must be active + // if an interface event has been generated. + if (!act.iRegisteredForInterfaceStateChanges) + { + CCommsFactoryBase* ipProtoCprFactory = act.IpProtoCprFactory(); + if (ipProtoCprFactory) + { + Factories::IFactoryNotify itf(&act, act.GetVTable()); + ipProtoCprFactory->RegisterNotifierL(itf); + act.iRegisteredForInterfaceStateChanges = ETrue; + } + } + if(msg.iBundle->PtrL()->CountParamSetContainers() > 0) { TInt i = 0; diff -r cbb19216b74d -r 00c6709d25aa datacommsserver/esockserver/ssock/ss_roles.cpp --- a/datacommsserver/esockserver/ssock/ss_roles.cpp Thu Jul 15 20:01:43 2010 +0300 +++ b/datacommsserver/esockserver/ssock/ss_roles.cpp Thu Aug 19 11:05:47 2010 +0300 @@ -812,6 +812,7 @@ h->SetFlowRequestPending(ETrue); h->AdoptFlowRequestMessage(SafeMessage()); + h->SetFlowRequestType(TFlowParams::EImplicit); DontCompleteCurrentRequest(); } @@ -842,7 +843,7 @@ h->SetFlowRequestPending(ETrue); h->AdoptFlowRequestMessage(SafeMessage()); - + h->SetFlowRequestType(TFlowParams::EExplicitConnection); DontCompleteCurrentRequest(); } diff -r cbb19216b74d -r 00c6709d25aa datacommsserver/esockserver/ssock/ss_sapshim.cpp --- a/datacommsserver/esockserver/ssock/ss_sapshim.cpp Thu Jul 15 20:01:43 2010 +0300 +++ b/datacommsserver/esockserver/ssock/ss_sapshim.cpp Thu Aug 19 11:05:47 2010 +0300 @@ -268,6 +268,28 @@ return this; } +void CTransportFlowShim::HostResolverSpecificUnbind() + { + // Can't have both HR & SAP + __ASSERT_DEBUG(!iProvider, User::Panic(KSpecAssert_ESockSSocksspshm, 9)); + + if(iSubConnectionProvider.IsOpen()) + { + iSessionControlNotify = NULL; + iSessionDataNotify = NULL; + iHostResolverNotify = NULL; + if (!Idle()) + { + SetIdle(); + ProcessDCIdleState(); + } + } + else + { + DeleteThisFlow(); + } + } + void CTransportFlowShim::Unbind() { LOG( ESockLog::Printf(_L8("CTransportFlowShim %08x:\tUnbind()"), this) ); @@ -279,41 +301,30 @@ return; } - // Legacy support for host resolvers + // Legacy support for host resolvers involves a separate north bound MUpperControl interface if(iHostResolverNotify) { - __ASSERT_DEBUG(!iProvider, User::Panic(KSpecAssert_ESockSSocksspshm, 9)); // can't have both HR & SAP - - LOG( ESockLog::Printf(_L8("CTransportFlowShim %08x:\tUnbind(): iBearerExpected %d"), this, BearerExpected()) ); - if (!BearerExpected()) + HostResolverSpecificUnbind(); + } + else + { + if (iProvider) { - delete this; - } - else - { - SetDeleteUponBearerReception(); - iHostResolverNotify = NULL; + iProvider->SetNotify(NULL); + + if (!Detaching()) + { + delete iProvider; + iProvider = NULL; + } } - return; - } - - if (iProvider) - { - iProvider->SetNotify(NULL); - - if (!Detaching()) - { - delete iProvider; - iProvider = NULL; - } - } #ifdef SYMBIAN_NETWORKING_UPS - // Hook for derived classes to do cleanup before unbind occurs - PreUnbind(); + // Hook for derived classes to do cleanup before unbind occurs + PreUnbind(); #endif - - CNetworkFlow::Unbind(); + CNetworkFlow::Unbind(); + } } ESock::CSubConnectionFlowBase& CTransportFlowShim::CloneFlowL()