# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1271254445 -10800 # Node ID 4ccf8e3947263bd7ae4b1836ee32eccf3979f581 # Parent 0b0e9fce0b58a49d4bcd36eec4f4191f37a50e47 Revision: 201015 Kit: 201015 diff -r 0b0e9fce0b58 -r 4ccf8e394726 commsfwsupport/commselements/ResponseMsg/src/ResponseMsg.cpp --- a/commsfwsupport/commselements/ResponseMsg/src/ResponseMsg.cpp Wed Mar 31 23:27:09 2010 +0300 +++ b/commsfwsupport/commselements/ResponseMsg/src/ResponseMsg.cpp Wed Apr 14 17:14:05 2010 +0300 @@ -170,6 +170,10 @@ //That would usually be the fault of the client's CExtItfMsgPluginInfo. //Depending on the state the client will be errored or panicked. __DEBUGGER(); //diagnostic + + // Mark the client buffer as read so that client can clean up gracefully + RMessage2::Write(iRequestMsgParam, KNullDesC8); + return NULL; } } diff -r 0b0e9fce0b58 -r 4ccf8e394726 commsfwsupport/commselements/factories/bwins/factoriesu.def --- a/commsfwsupport/commselements/factories/bwins/factoriesu.def Wed Mar 31 23:27:09 2010 +0300 +++ b/commsfwsupport/commselements/factories/bwins/factoriesu.def Wed Apr 14 17:14:05 2010 +0300 @@ -29,4 +29,3 @@ ?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 - diff -r 0b0e9fce0b58 -r 4ccf8e394726 commsfwsupport/commselements/factories/eabi/factoriesu.def --- a/commsfwsupport/commselements/factories/eabi/factoriesu.def Wed Mar 31 23:27:09 2010 +0300 +++ b/commsfwsupport/commselements/factories/eabi/factoriesu.def Wed Apr 14 17:14:05 2010 +0300 @@ -48,4 +48,3 @@ _ZTVN9Factories17CFactoryContainerE @ 47 NONAME _ZTVN9Factories21CFactoryContainerNodeE @ 48 NONAME - diff -r 0b0e9fce0b58 -r 4ccf8e394726 commsfwutils/commsbufs/group/testmbuf.iby --- a/commsfwutils/commsbufs/group/testmbuf.iby Wed Mar 31 23:27:09 2010 +0300 +++ b/commsfwutils/commsbufs/group/testmbuf.iby Wed Apr 14 17:14:05 2010 +0300 @@ -23,6 +23,7 @@ file=ABI_DIR\DEBUG_DIR\TS_CTMBUFMGR.DLL \System\libs\TS_CTMBUFMGR.DLL data=EPOCROOT##EPOC32\release\wins\udeb\z\TestData\scripts\mbuftest.script \testdata\scripts\mbuftest.script +data=EPOCROOT##EPOC32\release\wins\udeb\z\TestData\scripts\mbuftest.script \testdata\scripts\mbuftest_zc.script data=EPOCROOT##EPOC32\release\wins\udeb\z\TestData\configs\MBufTest05-CopyIn.ini \testdata\configs\MBufTest05-CopyIn.ini data=EPOCROOT##EPOC32\release\wins\udeb\z\TestData\configs\MBufTest05-CopyOut.ini \testdata\configs\MBufTest05-CopyOut.ini data=EPOCROOT##EPOC32\release\wins\udeb\z\TestData\configs\MBufTest06-1st.ini \testdata\configs\MBufTest06-1st.ini diff -r 0b0e9fce0b58 -r 4ccf8e394726 datacommsserver/esockserver/bwins/esocksvrU.DEF --- a/datacommsserver/esockserver/bwins/esocksvrU.DEF Wed Mar 31 23:27:09 2010 +0300 +++ b/datacommsserver/esockserver/bwins/esocksvrU.DEF Wed Apr 14 17:14:05 2010 +0300 @@ -1047,4 +1047,10 @@ ?Self@PRClientLeft@PRClientLeftActivity@@SAABUTNodeActivity@MeshMachine@@XZ @ 1046 NONAME ; struct MeshMachine::TNodeActivity const & PRClientLeftActivity::PRClientLeft::Self(void) ?FirstTriple@PRClientLeft@PRClientLeftActivity@@SAABUTStateTriple@NetStateMachine@@XZ @ 1047 NONAME ; struct NetStateMachine::TStateTriple const & PRClientLeftActivity::PRClientLeft::FirstTriple(void) ?Accept@TAwaitingStop@CoreNetStates@@UAEHXZ @ 1048 NONAME ; int CoreNetStates::TAwaitingStop::Accept(void) + ?GetVDataTable@TTierTypeIdFactoryQuery@ESock@@UBEPBUSVDataTableEntry@Meta@@XZ @ 1049 NONAME ; struct Meta::SVDataTableEntry const * ESock::TTierTypeIdFactoryQuery::GetVDataTable(void) const + ?GetAttribPtr@TTierTypeIdFactoryQuery@ESock@@UBEPAEH@Z @ 1050 NONAME ; unsigned char * ESock::TTierTypeIdFactoryQuery::GetAttribPtr(int) const + ??0TTierTypeIdFactoryQuery@ESock@@QAE@VTUid@@@Z @ 1051 NONAME ; ESock::TTierTypeIdFactoryQuery::TTierTypeIdFactoryQuery(class TUid) + ??0TTierTypeIdFactoryQuery@ESock@@QAE@XZ @ 1052 NONAME ; ESock::TTierTypeIdFactoryQuery::TTierTypeIdFactoryQuery(void) + ?Match@TTierTypeIdFactoryQuery@ESock@@MAE?AW4TMatchResult@MFactoryQuery@Factories@@AAUTFactoryObjectInfo@5@@Z @ 1053 NONAME ; enum Factories::MFactoryQuery::TMatchResult ESock::TTierTypeIdFactoryQuery::Match(struct Factories::TFactoryObjectInfo &) + ?GetVDataTableStatic@TTierTypeIdFactoryQuery@ESock@@SAPBUSVDataTableEntry@Meta@@XZ @ 1054 NONAME ; struct Meta::SVDataTableEntry const * ESock::TTierTypeIdFactoryQuery::GetVDataTableStatic(void) diff -r 0b0e9fce0b58 -r 4ccf8e394726 datacommsserver/esockserver/eabi/esocksvrU.DEF --- a/datacommsserver/esockserver/eabi/esocksvrU.DEF Wed Mar 31 23:27:09 2010 +0300 +++ b/datacommsserver/esockserver/eabi/esocksvrU.DEF Wed Apr 14 17:14:05 2010 +0300 @@ -1948,4 +1948,15 @@ _ZN20PRClientLeftActivity12PRClientLeft11FirstTripleEv @ 1947 NONAME _ZN20PRClientLeftActivity12PRClientLeft4SelfEv @ 1948 NONAME _ZN13CoreNetStates13TAwaitingStop6AcceptEv @ 1949 NONAME + _ZN5ESock23TTierTypeIdFactoryQuery19GetVDataTableStaticEv @ 1950 NONAME + _ZN5ESock23TTierTypeIdFactoryQuery5MatchERN9Factories18TFactoryObjectInfoE @ 1951 NONAME + _ZN5ESock23TTierTypeIdFactoryQueryC1E4TUid @ 1952 NONAME + _ZN5ESock23TTierTypeIdFactoryQueryC1Ev @ 1953 NONAME + _ZN5ESock23TTierTypeIdFactoryQueryC2E4TUid @ 1954 NONAME + _ZN5ESock23TTierTypeIdFactoryQueryC2Ev @ 1955 NONAME + _ZNK5ESock23TTierTypeIdFactoryQuery12GetAttribPtrEi @ 1956 NONAME + _ZNK5ESock23TTierTypeIdFactoryQuery13GetVDataTableEv @ 1957 NONAME + _ZTIN5ESock23TTierTypeIdFactoryQueryE @ 1958 NONAME + _ZTVN5ESock23TTierTypeIdFactoryQueryE @ 1959 NONAME + _ZThn4_N5ESock23TTierTypeIdFactoryQuery5MatchERN9Factories18TFactoryObjectInfoE @ 1960 NONAME diff -r 0b0e9fce0b58 -r 4ccf8e394726 datacommsserver/esockserver/inc/SS_conn.H --- a/datacommsserver/esockserver/inc/SS_conn.H Wed Mar 31 23:27:09 2010 +0300 +++ b/datacommsserver/esockserver/inc/SS_conn.H Wed Apr 14 17:14:05 2010 +0300 @@ -35,6 +35,8 @@ class TClearProgressQueue; class TRequestCSRCreation; class TProcessStateChange; + class TEnqueueStateChange; + class TAwaitingStateChange; class TProcessIncomingConnection; class TProcessProgressRequest; class TParseECNAttach; @@ -42,10 +44,8 @@ class TProcessBinderResponseForCpr; class TCompleteLegacyAttach; class TProcessEnumResponse; - class TGenerateConnectionUpProgress; class TGenerateConnectionDownProgress; - class TNoTagOrCancelAllInterfaceWorker; class TCancelAllInterfaceNotificationWorker; } @@ -139,6 +139,8 @@ friend class ConnStates::TClearProgressQueue; friend class ConnStates::TRequestCSRCreation; friend class ConnStates::TProcessStateChange; + friend class ConnStates::TAwaitingStateChange; + friend class ConnStates::TEnqueueStateChange; friend class ConnStates::TProcessIncomingConnection; friend class ConnStates::TProcessProgressRequest; friend class ConnStates::TParseECNAttach; diff -r 0b0e9fce0b58 -r 4ccf8e394726 datacommsserver/esockserver/inc/ss_DataMonitoringProvider.h --- a/datacommsserver/esockserver/inc/ss_DataMonitoringProvider.h Wed Mar 31 23:27:09 2010 +0300 +++ b/datacommsserver/esockserver/inc/ss_DataMonitoringProvider.h Wed Apr 14 17:14:05 2010 +0300 @@ -172,7 +172,7 @@ public: TNotificationRequest(CDataMonitoringResponder* aResponder, TSubSessionUniqueId aClientId) : iThreshold(0), iResponder(aResponder), iClientId(aClientId), iCancelled(EFalse), iWrapped(EFalse) - { + { } TUint32 Threshold() const @@ -205,7 +205,7 @@ void SetCancelled() { - iCancelled = ETrue; + iCancelled = ETrue; } TBool Wrapped() const @@ -220,6 +220,7 @@ static TInt CompareThresholds(const TNotificationRequest& aFirst, const TNotificationRequest& aSecond); static TBool CompareClientIds(const TNotificationRequest& aFirst, const TNotificationRequest& aSecond); + static TBool CompareClientIdsAndCancelledFlag(const TNotificationRequest& aFirst, const TNotificationRequest& aSecond); private: TUint32 iThreshold; diff -r 0b0e9fce0b58 -r 4ccf8e394726 datacommsserver/esockserver/inc/ss_connstates.h --- a/datacommsserver/esockserver/inc/ss_connstates.h Wed Mar 31 23:27:09 2010 +0300 +++ b/datacommsserver/esockserver/inc/ss_connstates.h Wed Apr 14 17:14:05 2010 +0300 @@ -235,10 +235,18 @@ // //Progress & Progress Request +DECLARE_SMELEMENT_HEADER( TAwaitingStateChange, MeshMachine::TState, NetStateMachine::MState, TContext ) + virtual TBool Accept(); +DECLARE_SMELEMENT_FOOTER( TAwaitingStateChange ) + DECLARE_SMELEMENT_HEADER( TProcessStateChange, MeshMachine::TStateTransition, NetStateMachine::MStateTransition, TContext ) //From the framework virtual void DoL(); DECLARE_SMELEMENT_FOOTER( TProcessStateChange ) +DECLARE_SMELEMENT_HEADER( TEnqueueStateChange, MeshMachine::TStateTransition, NetStateMachine::MStateTransition, TContext ) //From the framework + virtual void DoL(); +DECLARE_SMELEMENT_FOOTER( TEnqueueStateChange ) + DECLARE_SMELEMENT_HEADER( TProcessProgressRequest, SubSessStates::TECABStateTransitionBase, NetStateMachine::MStateTransition, TContext ) //From the client virtual void DoL(); DECLARE_SMELEMENT_FOOTER( TProcessProgressRequest ) @@ -258,7 +266,9 @@ virtual void DoL(); DECLARE_SMELEMENT_FOOTER( TGenerateConnectionDownProgress ) - +DECLARE_SMELEMENT_HEADER( TGenerateConnectionUninitialisedProgress, MeshMachine::TStateTransition, NetStateMachine::MStateTransition, TContext ) //From the framework + virtual void DoL(); +DECLARE_SMELEMENT_FOOTER( TGenerateConnectionUninitialisedProgress ) diff -r 0b0e9fce0b58 -r 4ccf8e394726 datacommsserver/esockserver/inc/ss_nodemessages.h --- a/datacommsserver/esockserver/inc/ss_nodemessages.h Wed Mar 31 23:27:09 2010 +0300 +++ b/datacommsserver/esockserver/inc/ss_nodemessages.h Wed Apr 14 17:14:05 2010 +0300 @@ -115,6 +115,23 @@ EXPORT_DATA_VTABLE_AND_FN }; +class TTierTypeIdFactoryQuery : public TFactoryQueryBase + { +public: + IMPORT_C TTierTypeIdFactoryQuery(); + + IMPORT_C explicit TTierTypeIdFactoryQuery(const TUid aTierTypeId); + +protected: + IMPORT_C virtual Factories::MFactoryQuery::TMatchResult Match(Factories::TFactoryObjectInfo& aFactoryObjectInfo); + +public: + TUid iTierTypeId; + + DECLARE_MVIP_CTR(TTierTypeIdFactoryQuery) + EXPORT_DATA_VTABLE_AND_FN + }; + class TDefaultConnectionFactoryQuery : public TFactoryQueryBase /** Class implementing MFactoryQuery to find a connection provider. diff -r 0b0e9fce0b58 -r 4ccf8e394726 datacommsserver/esockserver/inc/ss_nodemessages_legacy_internal.h --- a/datacommsserver/esockserver/inc/ss_nodemessages_legacy_internal.h Wed Mar 31 23:27:09 2010 +0300 +++ b/datacommsserver/esockserver/inc/ss_nodemessages_legacy_internal.h Wed Apr 14 17:14:05 2010 +0300 @@ -319,6 +319,10 @@ virtual void DoDataSentNotification(TUint32 aSentBytes); virtual void DoDataReceivedNotification(TUint32 aReceivedBytes); +protected: + virtual void DoComplete(TInt aError); + + private: IMPORT_C static CLegacyDataMonitoringResponder* NewL(ESock::RLegacyResponseMsg& aResponseMsg); CLegacyDataMonitoringResponder(ESock::RLegacyResponseMsg& aResponseMsg); diff -r 0b0e9fce0b58 -r 4ccf8e394726 datacommsserver/esockserver/ssock/ss_DataMonitoringProvider.cpp --- a/datacommsserver/esockserver/ssock/ss_DataMonitoringProvider.cpp Wed Mar 31 23:27:09 2010 +0300 +++ b/datacommsserver/esockserver/ssock/ss_DataMonitoringProvider.cpp Wed Apr 14 17:14:05 2010 +0300 @@ -114,8 +114,8 @@ // Ensure this client has not registered before or if it has, any outstanding requests are // marked as cancelled. - TInt requestIdx = iReceivedNotificationRequests.Find(notificationRequest, TIdentityRelation(TNotificationRequest::CompareClientIds)); - if(requestIdx != KErrNotFound && !iReceivedNotificationRequests[requestIdx]->Cancelled()) + TInt requestIdx = iReceivedNotificationRequests.Find(notificationRequest, TIdentityRelation(TNotificationRequest::CompareClientIdsAndCancelledFlag)); + if(requestIdx != KErrNotFound) { delete notificationRequest; CDataMonitoringResponder::Error(aResponder, KErrInUse); @@ -162,14 +162,17 @@ TNotificationRequest exemplarRequest(NULL, aClientId); // Locate the request matching the specified client ID - TInt requestIdx = iReceivedNotificationRequests.Find(&exemplarRequest, TIdentityRelation(TNotificationRequest::CompareClientIds)); - if(requestIdx != KErrNotFound && !iReceivedNotificationRequests[requestIdx]->Cancelled()) + TInt requestIdx = iReceivedNotificationRequests.Find(&exemplarRequest, TIdentityRelation(TNotificationRequest::CompareClientIdsAndCancelledFlag)); + if(requestIdx != KErrNotFound) { TNotificationRequest* notificationRequest = iReceivedNotificationRequests[requestIdx]; // Cancel it and complete the client notificationRequest->SetCancelled(); CDataMonitoringResponder::CancelRequest(notificationRequest->Responder()); + + iReceivedNotificationRequests.Remove(requestIdx); + delete notificationRequest; } } @@ -187,8 +190,8 @@ // Ensure this client has not registered before or if it has, any outstanding requests are // marked as cancelled. - TInt requestIdx = iSentNotificationRequests.Find(notificationRequest, TIdentityRelation(TNotificationRequest::CompareClientIds)); - if(requestIdx != KErrNotFound && !iSentNotificationRequests[requestIdx]->Cancelled()) + TInt requestIdx = iSentNotificationRequests.Find(notificationRequest, TIdentityRelation(TNotificationRequest::CompareClientIdsAndCancelledFlag)); + if(requestIdx != KErrNotFound) { delete notificationRequest; CDataMonitoringResponder::Error(aResponder, KErrInUse); @@ -235,14 +238,17 @@ TNotificationRequest exemplarRequest(NULL, aClientId); // Locate the request matching the specified client id - TInt requestIdx = iSentNotificationRequests.Find(&exemplarRequest, TIdentityRelation(TNotificationRequest::CompareClientIds)); - if(requestIdx != KErrNotFound && !iSentNotificationRequests[requestIdx]->Cancelled()) + TInt requestIdx = iSentNotificationRequests.Find(&exemplarRequest, TIdentityRelation(TNotificationRequest::CompareClientIdsAndCancelledFlag)); + if(requestIdx != KErrNotFound) { TNotificationRequest* notificationRequest = iSentNotificationRequests[requestIdx]; // Cancel it and complete the client notificationRequest->SetCancelled(); CDataMonitoringResponder::CancelRequest(notificationRequest->Responder()); + + iSentNotificationRequests.Remove(requestIdx); + delete notificationRequest; } } @@ -527,6 +533,21 @@ } } +/** + Compares two TNotificationRequest objects using their client ids and the cancelled flag as the criteria. +*/ +TBool TNotificationRequest::CompareClientIdsAndCancelledFlag(const TNotificationRequest& aFirst, const TNotificationRequest& aSecond) + { + if(aFirst.ClientId() == aSecond.ClientId()) + { + return aFirst.Cancelled() == aSecond.Cancelled(); + } + else + { + return EFalse; + } + } + EXPORT_START_ATTRIBUTE_TABLE_AND_FN(TDataMonitoringProvisioningInfoBase, TDataMonitoringProvisioningInfoBase::iUid, TDataMonitoringProvisioningInfoBase::iId) REGISTER_ATTRIBUTE(TDataMonitoringProvisioningInfoBase, iDataVolumesPtr, TMeta) REGISTER_ATTRIBUTE(TDataMonitoringProvisioningInfoBase, iThresholdsPtr, TMeta) diff -r 0b0e9fce0b58 -r 4ccf8e394726 datacommsserver/esockserver/ssock/ss_conn.cpp --- a/datacommsserver/esockserver/ssock/ss_conn.cpp Wed Mar 31 23:27:09 2010 +0300 +++ b/datacommsserver/esockserver/ssock/ss_conn.cpp Wed Apr 14 17:14:05 2010 +0300 @@ -151,8 +151,8 @@ THROUGH_NODEACTIVITY_ENTRY(KErrorTag, ConnActivities::CStartAttachActivity::TSetIdleIfStopOutstanding, MeshMachine::TErrorTag) NODEACTIVITY_ENTRY(KErrorTag, CoreNetStates::TSendClientLeavingRequestToServiceProviders, MeshMachine::TAwaitingLeaveComplete, MeshMachine::TNoTag) - NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TSetIdleIfNoServiceProviders, MeshMachine::TAwaitingLeaveComplete, ConnectionCleanupActivities::TNoTagOrNoTagBackwards) - LAST_NODEACTIVITY_ENTRY(KNoTag, MeshMachine::TDoNothing) + NODEACTIVITY_ENTRY(KNoTag, MeshMachine::TDoNothing, MeshMachine::TAwaitingLeaveComplete, ConnectionCleanupActivities::TNoTagOrNoTagBackwards) + LAST_NODEACTIVITY_ENTRY(KNoTag, ConnStates::TGenerateConnectionUninitialisedProgress) NODEACTIVITY_END() } @@ -204,10 +204,10 @@ THROUGH_NODEACTIVITY_ENTRY(KNoTag, ConnStates::TGenerateConnectionDownProgress, MeshMachine::TNoTag) NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TSendClientLeavingRequestToServiceProviders, MeshMachine::TAwaitingLeaveComplete, MeshMachine::TNoTag) - NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TSetIdleIfNoServiceProviders, MeshMachine::TAwaitingLeaveComplete, ConnectionCleanupActivities::TNoTagOrNoTagBackwards) + NODEACTIVITY_ENTRY(KNoTag, MeshMachine::TDoNothing, MeshMachine::TAwaitingLeaveComplete, ConnectionCleanupActivities::TNoTagOrNoTagBackwards) LAST_NODEACTIVITY_ENTRY(CoreNetStates::KNoBearer, MeshMachine::TDoNothing) - LAST_NODEACTIVITY_ENTRY(KNoTag, MeshMachine::TDoNothing) + LAST_NODEACTIVITY_ENTRY(KNoTag, ConnStates::TGenerateConnectionUninitialisedProgress) NODEACTIVITY_END() } @@ -269,22 +269,35 @@ THROUGH_NODEACTIVITY_ENTRY(KNoTag, ConnStates::TCancelAllLegacyRMessage2Activities, ConnStates::TNoTagBlockedByLegacyRMessage2Activities) NODEACTIVITY_ENTRY(KNoTag, ConnStates::TProcessClose, TECABState, MeshMachine::TNoTag) //TDestroyAwaitingLeaveCompleteLoop loops back to its own triple if more SPs - NODEACTIVITY_ENTRY(KNoTag, TECABTransition, TECABState, CoreActivities::CDestroyActivity::TNoTagOrNoTagBackwards) - LAST_NODEACTIVITY_ENTRY(KNoTag, MeshMachine::TDoNothing) //Never gets here + NODEACTIVITY_ENTRY(KNoTag, MeshMachine::TDoNothing, TECABState, CoreActivities::CDestroyActivity::TNoTagOrNoTagBackwards) + LAST_NODEACTIVITY_ENTRY(KNoTag, MeshMachine::TDoNothing) NODEACTIVITY_END() } +//-------------------------------------------------- +//Progress/TStateChange activities. +//ConnectionStateChangeNotificationActivity acts on the subscription and completes the client with progresses +//ConnectionStateChangeActivity acts on TStateChange coming from the stack. namespace ConnectionStateChangeNotificationActivity { DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFActivityConnectionStateChangeRequest, ConnectionStateChangeNotification, TCFInternalEsock::TSubSess, CESockClientActivityBase::NewL) FIRST_NODEACTIVITY_ENTRY(SubSessStates::TAwaitingIPC, MeshMachine::TNoTag) THROUGH_NODEACTIVITY_ENTRY(KNoTag, SubSessStates::TAcquireMessageOwnership, MeshMachine::TNoTag) - //TAwaitingStateChangeLoop also cancels the activity when requested - NODEACTIVITY_ENTRY(KNoTag, ConnStates::TProcessProgressRequest, TECABState >, MeshMachine::TNoTagBackward) + NODEACTIVITY_ENTRY(KNoTag, ConnStates::TProcessProgressRequest, TECABState, MeshMachine::TNoTag) + + NODEACTIVITY_ENTRY(KNoTag, ConnStates::TProcessStateChange, TECABState, MeshMachine::TNoTagBackward) LAST_NODEACTIVITY_ENTRY(KNoTag, MeshMachine::TDoNothing) //Never gets here NODEACTIVITY_END() } +namespace ConnectionStateChangeActivity +{ +DECLARE_DEFINE_NODEACTIVITY(ECFActivityStateChange, ConnectionStateChange, TCFMessage::TStateChange) + NODEACTIVITY_ENTRY(KNoTag, ConnStates::TEnqueueStateChange, ConnStates::TAwaitingStateChange, MeshMachine::TNoTag) +NODEACTIVITY_END() +} + + namespace ConnectionWaitForIncomingActivity { //Synchronised, waits for Start to complete DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFActivityConnectionWaitForIncoming, ConnectionWaitForIncoming, TCFInternalEsock::TSubSess, CStartAttachActivity::NewWaitForIncomingConnectionActivityL) @@ -297,27 +310,18 @@ NODEACTIVITY_END() } -// -//Activities serving framework requests -namespace ConnectionStateChangeActivity -{ -DECLARE_DEFINE_NODEACTIVITY(ECFActivityStateChange, ConnectionStateChange, TCFMessage::TStateChange) - NODEACTIVITY_ENTRY(KNoTag, ConnStates::TProcessStateChange, MeshMachine::TAwaitingMessageState, MeshMachine::TNoTag) -NODEACTIVITY_END() -} - namespace ConnectionGoingDownActivity { DECLARE_DEFINE_CUSTOM_NODEACTIVITY(ECFActivityGoneDown, ConnectionGoingDown, TCFControlClient::TGoneDown, PRActivities::CGoneDownActivity::NewL) FIRST_NODEACTIVITY_ENTRY(ConnStates::TAwaitingGoneDown, MeshMachine::TNoTag) THROUGH_NODEACTIVITY_ENTRY(KNoTag, ConnectionGoingDownActivity::TStoreGoneDownError, MeshMachine::TNoTag) - THROUGH_NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TCancelAndCloseZone0ClientExtIfaces, MeshMachine::TNoTag) + THROUGH_NODEACTIVITY_ENTRY(KNoTag, SubSessStates::TCancelAndCloseClientExtIfaces, MeshMachine::TNoTag) THROUGH_NODEACTIVITY_ENTRY(KNoTag, ConnStates::TCancelAllLegacyRMessage2Activities, ConnStates::TNoTagBlockedByLegacyRMessage2Activities) THROUGH_NODEACTIVITY_ENTRY(KNoTag, ConnStates::TGenerateConnectionDownProgress, MeshMachine::TNoTag) NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TSendClientLeavingRequestToServiceProviders, MeshMachine::TAwaitingLeaveComplete, MeshMachine::TNoTag) - NODEACTIVITY_ENTRY(KNoTag, CoreNetStates::TSetIdleIfNoServiceProviders, MeshMachine::TAwaitingLeaveComplete, ConnectionCleanupActivities::TNoTagOrNoTagBackwards) - LAST_NODEACTIVITY_ENTRY(KNoTag, MeshMachine::TDoNothing) + NODEACTIVITY_ENTRY(KNoTag, MeshMachine::TDoNothing, MeshMachine::TAwaitingLeaveComplete, ConnectionCleanupActivities::TNoTagOrNoTagBackwards) + LAST_NODEACTIVITY_ENTRY(KNoTag, ConnStates::TGenerateConnectionUninitialisedProgress) NODEACTIVITY_END() } diff -r 0b0e9fce0b58 -r 4ccf8e394726 datacommsserver/esockserver/ssock/ss_connstates.cpp --- a/datacommsserver/esockserver/ssock/ss_connstates.cpp Wed Mar 31 23:27:09 2010 +0300 +++ b/datacommsserver/esockserver/ssock/ss_connstates.cpp Wed Apr 14 17:14:05 2010 +0300 @@ -625,6 +625,160 @@ return EFalse; } + + +//---------------------------------------------------- +//Handling Progress/TStateChange +DEFINE_SMELEMENT(ConnStates::TAwaitingStateChange, NetStateMachine::MState, ConnStates::TContext) +TBool ConnStates::TAwaitingStateChange::Accept() + { + TCFMessage::TStateChange* progressMsg = message_cast(&iContext.iMessage); + if (progressMsg) + { + TStateChange& progress = progressMsg->iStateChange; + + if (iContext.iSender != iContext.Node().Id()) + { + //CConnection trusts that locally generated progresses are to be trusted, + //but some of the legacy progresses coming from the stack need some filtering. + //Here's the filtering. + + // Check whether KDataTransferUnblocked is received and if yes, then traslate it to KConnectionUp (== KLinkLayerOpen) + // the log only sees the translated version, this goes into the queue, so it alright I suppose. + if (progress.iStage == KDataTransferUnblocked ) + { + progress.iStage = KConnectionUp; // KLinkLayerOpen + } + if (progress.iError == KErrForceDisconnected) + { + progress.iError = KErrDisconnected; + } + + if (progress.iStage == KConnectionUninitialised) + { + //KConnectionUninitialised has been deprecated in the stack and it will be ignored + //when reported by it. It is still valid towards the application. Here it is being reported by the stack. + //The original KConnectionUninitialised denoted CAgentReference destruction and as such speculated too + //much about the sturcture of the stack (notably: there isn't necesserily an agent anymore. + //As defined KConnectionUninitialised would need to be reported after TCFControlClient::TGoneDown or TCFServiceProvider::TStopped, + //except the stack decomposes after TCFControlClient::TGoneDown or TCFServiceProvider::TStopped and the progress path along with + //it. It is therefore impossible for the stack to generate KConnectionUninitialised after + //TCFControlClient::TGoneDown or TCFServiceProvider::TStopped. CConnection takes over and will generate KConnectionUninitialised + //when detatching from the service providers (see ConnStates::TGenerateConnectionUninitialisedProgress) + LOG( ESockLog::Printf(KESockConnectionTag, _L("CConnection %08x:\tProgressNotification(TInt aStage %d, TInt aError %d) - deprecated progress, ignoring"), + &(iContext.Node()), progress.iStage, progress.iError) ); + progressMsg->ClearMessageId(); + return EFalse; + } + } + LOG( ESockLog::Printf(KESockConnectionTag, _L("CConnection %08x:\tProgressNotification(TInt aStage %d, TInt aError %d)"), + &(iContext.Node()), progress.iStage, progress.iError) ); + + CConnection& cc = iContext.Node(); + if (cc.iLastProgress == progress) + { + progressMsg->ClearMessageId(); + return EFalse; //ignore this duplicate + } + cc.iLastProgress = progress; + + if (progress.iError != KErrNone) + { + cc.iLastProgressError = progress; //Save last progress in error for use by LastProgressErrorL() + } + return ETrue; + } + return EFalse; + } + +//Progress & Progress Request +DEFINE_SMELEMENT(ConnStates::TEnqueueStateChange, NetStateMachine::MStateTransition, ConnStates::TContext) +void ConnStates::TEnqueueStateChange::DoL() + { + TStateChange& progress = message_cast(iContext.iMessage).iStateChange; + //Diagnostic assertion. + + //If ECFActivityConnectionStateChangeRequest is running, it has not been + //presented with the TStateChange message (channel activity id != 0?) which is a serious mistake. + __ASSERT_DEBUG(iContext.Node().CountActivities(ECFActivityConnectionStateChangeRequest)==0, User::Panic(KSpecAssert_ESockSSockscnsts, 9)); + + CConnection& cc = iContext.Node(); +#ifdef ESOCK_LOGGING_ACTIVE + // Check to see if the progress queue is full causing older progress to be discarded. + // This has the potential to cause problems if a critical progress item is lost. + // Normally the queue is large enough such that this doesn't happen but this log entry + // serves as a warning if it ever does. + if( cc.iProgressQueue.IsFull() ) + { + LOG( ESockLog::Printf(KESockConnectionTag, _L("CConnection %08x:\tThe maximum progress queue size of %d has been exceeded - discarding old progress to make space for new item"), this, KMaxProgressQueueLength); ) + } +#endif + + //Add the progress to queue + cc.iProgressQueue.Enque(progress); + } + + +DEFINE_SMELEMENT(ConnStates::TProcessProgressRequest, NetStateMachine::MStateTransition, ConnStates::TContext) +void ConnStates::TProcessProgressRequest::DoL() + { + __ASSERT_DEBUG(iContext.iNodeActivity, ConnPanic(KPanicNoActivity)); + CESockClientActivityBase& ac = static_cast(*iContext.iNodeActivity); + TUint selectedProgressStage = ac.Int1(); + TStateChange progress; + TBool found = EFalse; + + __ASSERT_DEBUG((subsessmessage_cast(&iContext.iMessage)), ConnPanic(KPanicIncorrectMessage)); + + //Process the queue looking for the progress of interest + found = iContext.Node().iProgressQueue.Deque(progress); + if (found && selectedProgressStage != KConnProgressDefault) + { + // For a selected progress request, dequeue entries until we find one which + // matches the criteria. If we dequeue all entries, fall through without + // completing the message. It it not considered useful to retain un-matching + // entries on the queue if a selected progress request is pending. + while (found) + { + if (progress.iStage == selectedProgressStage || progress.iError != KErrNone) + { + break; + } + found = iContext.Node().iProgressQueue.Deque(progress); + } + } + + if (found) + { + //We have found a progress of interest, finish + TPckg progressPkg(progress); + ac.WriteL(0,progressPkg); + ac.SetIdle(); //We are done + } + } + +DEFINE_SMELEMENT(ConnStates::TProcessStateChange, NetStateMachine::MStateTransition, ConnStates::TContext) +void ConnStates::TProcessStateChange::DoL() + { + __ASSERT_DEBUG(iContext.iNodeActivity, ConnPanic(KPanicNoActivity)); + CESockClientActivityBase& ac = static_cast(*iContext.iNodeActivity); + TUint selectedProgressStage = ac.Int1(); + + //Are we here as a result of receiving TStateChange (rather than ECNProgressNotification)? + TCFMessage::TStateChange& progress = message_cast(iContext.iMessage); + + if (selectedProgressStage == KConnProgressDefault || + selectedProgressStage == progress.iStateChange.iStage || + KErrNone != progress.iStateChange.iError) + { + //We have found a progress of interest, finish + TPckg progressPkg(progress.iStateChange); + ac.WriteL(0,progressPkg); + ac.SetIdle(); //We are done + } + } + + DEFINE_SMELEMENT(ConnStates::TGenerateConnectionUpProgress, NetStateMachine::MStateTransition, ConnStates::TContext) void ConnStates::TGenerateConnectionUpProgress::DoL() { @@ -657,124 +811,19 @@ } } -// -//Progress & Progress Request -DEFINE_SMELEMENT(ConnStates::TProcessStateChange, NetStateMachine::MStateTransition, ConnStates::TContext) -void ConnStates::TProcessStateChange::DoL() - { - TStateChange& progress = message_cast(iContext.iMessage).iStateChange; - - //Check whether KDataTransferUnblocked is received and if yes, then traslate it to KConnectionUp (== KLinkLayerOpen) - // the log only sees the translated version, this goes into the queue, so it alright I suppose. - if (progress.iStage == KDataTransferUnblocked ) - { - progress.iStage = KConnectionUp; // KLinkLayerOpen - } - if (progress.iError == KErrForceDisconnected) - { - progress.iError = KErrDisconnected; - } - - LOG( ESockLog::Printf(KESockConnectionTag, _L("CConnection %08x:\tProgressNotification(TInt aStage %d, TInt aError %d)"), - &(iContext.Node()), progress.iStage, progress.iError) ); - - //Diagnostic assertion. - //If ECFActivityConnectionStateChangeRequest is running, it has not been - //presented with the TStateChange message (channel activity id != 0?) which is a serious mistake. - __ASSERT_DEBUG(iContext.Node().CountActivities(ECFActivityConnectionStateChangeRequest)==0, User::Panic(KSpecAssert_ESockSSockscnsts, 9)); - - CConnection& cc = iContext.Node(); - if (cc.iLastProgress == progress) - { - return; //ignore this duplicate - } - cc.iLastProgress = progress; - - if (progress.iError != KErrNone) - { - cc.iLastProgressError = progress; //Save last progress in error for use by LastProgressErrorL() - } - - #ifdef ESOCK_LOGGING_ACTIVE - // Check to see if the progress queue is full causing older progress to be discarded. - // This has the potential to cause problems if a critical progress item is lost. - // Normally the queue is large enough such that this doesn't happen but this log entry - // serves as a warning if it ever does. - if( cc.iProgressQueue.IsFull() ) - { - LOG( ESockLog::Printf(KESockConnectionTag, _L("CConnection %08x:\tThe maximum progress queue size of %d has been exceeded - discarding old progress to make space for new item"), this, KMaxProgressQueueLength); ) - } - #endif - - //Add the progress to queue - cc.iProgressQueue.Enque(progress); - } - -DEFINE_SMELEMENT(ConnStates::TProcessProgressRequest, NetStateMachine::MStateTransition, ConnStates::TContext) -void ConnStates::TProcessProgressRequest::DoL() - { - __ASSERT_DEBUG(iContext.iNodeActivity, ConnPanic(KPanicNoActivity)); - CESockClientActivityBase& ac = static_cast(*iContext.iNodeActivity); - TUint selectedProgressStage = ac.Int1(); - - TStateChange progress; - TBool found = EFalse; - - //Are we here as a result of receiving TStateChange (rather than ECNProgressNotification)? - TCFMessage::TStateChange* msg = message_cast(&iContext.iMessage); - if (msg) - { //Yes, we have been triggered by a TStateChange message - //Check if this is the progress we are waiting for, otherwise dump the progress - //Check whether KDataTransferUnblocked is received and if yes, then traslate it to KConnectionUp (== KLinkLayerOpen) - if (msg->iStateChange.iStage == KDataTransferUnblocked ) - { - msg->iStateChange.iStage = KConnectionUp; // KLinkLayerOpen - } - //TODO: Verify if this (connection) is the right place to translate the error - if (msg->iStateChange.iError == KErrForceDisconnected) - { - msg->iStateChange.iError = KErrDisconnected; - } - if (selectedProgressStage == KConnProgressDefault - || selectedProgressStage == msg->iStateChange.iStage - || KErrNone != msg->iStateChange.iError) - { - progress = msg->iStateChange; - found = ETrue; - } - } - else - { //No, we must have been triggered by a ECNProgressNotification message - __ASSERT_DEBUG((subsessmessage_cast(&iContext.iMessage)), ConnPanic(KPanicIncorrectMessage)); - - //Process the queue looking for the progress of interest - found = iContext.Node().iProgressQueue.Deque(progress); - if (found && selectedProgressStage != KConnProgressDefault) - { - // For a selected progress request, dequeue entries until we find one which - // matches the criteria. If we dequeue all entries, fall through without - // completing the message. It it not considered useful to retain un-matching - // entries on the queue if a selected progress request is pending. - while (found) - { - if (progress.iStage == selectedProgressStage || progress.iError != KErrNone) - { - break; - } - found = iContext.Node().iProgressQueue.Deque(progress); - } - } - } - - if (found) - { - //We have found a progress of interest, finish - TPckg progressPkg(progress); - ac.WriteL(0,progressPkg); - ac.SetIdle(); //We are done - } - } - +DEFINE_SMELEMENT(ConnStates::TGenerateConnectionUninitialisedProgress, NetStateMachine::MStateTransition, ConnStates::TContext) +void ConnStates::TGenerateConnectionUninitialisedProgress::DoL() + { + if (iContext.Node().CountActivities(ECFActivityDestroy) == 0) + {//TGenerateConnectionUninitialisedProgress is called when the stack goes away + //below the CConnection's feet and it sometimes goes away because CConnection is + //being ECNClosed and therefore sitting on an electric chair. It is risky, but + //above all uselsess to send the progress when when app clearly doesn't want + //to see it. + TCFMessage::TStateChange msg(TStateChange(KConnectionUninitialised, KErrNone)); + RNodeInterface::OpenPostMessageClose(iContext.Node().Id(), iContext.Node().Id(), msg); + } + } // //Legacy enumeration @@ -1602,8 +1651,6 @@ { if ( iContext.iMessage.IsMessage() ) { -// __ASSERT_DEBUG(iContext.Node().GetClientIter(RNodeInterface::ECtrl|RNodeInterface::EData)[0] == NULL, -// User::Panic(KCorePRPanic, KPanicClientsStillPresent)); if (iContext.Node().GetFirstClient(TCFClientType(TCFClientType::EServProvider)) == NULL) { // This was the last service provider return NetStateMachine::EForward | MeshMachine::KNoTag; diff -r 0b0e9fce0b58 -r 4ccf8e394726 datacommsserver/esockserver/ssock/ss_nodemessages.cpp --- a/datacommsserver/esockserver/ssock/ss_nodemessages.cpp Wed Mar 31 23:27:09 2010 +0300 +++ b/datacommsserver/esockserver/ssock/ss_nodemessages.cpp Wed Apr 14 17:14:05 2010 +0300 @@ -134,6 +134,7 @@ EDefaultSCPRFactoryQuery =1010, EDefaultFlowFactoryQuery =1011, EDefaultProtocolIntfFactoryQuery =1012, + ETierTypeIdFactoryQuery =1013, }; //no need to serialise return value @@ -263,6 +264,10 @@ REGISTER_ATTRIBUTE(TMetaConnectionFactoryQuery, iTierImplUid, TMeta) END_ATTRIBUTE_TABLE() +EXPORT_START_ATTRIBUTE_TABLE_AND_FN(TTierTypeIdFactoryQuery, KESockInternalMessagesImplementationUid, ETierTypeIdFactoryQuery) + REGISTER_ATTRIBUTE(TTierTypeIdFactoryQuery, iTierTypeId, TMeta) +END_ATTRIBUTE_TABLE() + EXPORT_START_ATTRIBUTE_TABLE_AND_FN(TDefaultConnectionFactoryQuery, KESockInternalMessagesImplementationUid, EDefaultConnectionFactoryQuery) REGISTER_ATTRIBUTE(TDefaultConnectionFactoryQuery, iMCprId, TMeta) END_ATTRIBUTE_TABLE() @@ -330,6 +335,7 @@ DEFINE_MVIP_CTR(TDefaultSCPRFactoryQuery) DEFINE_MVIP_CTR(TDefaultFlowFactoryQuery) DEFINE_MVIP_CTR(TDefaultProtocolIntfFactoryQuery) +DEFINE_MVIP_CTR(TTierTypeIdFactoryQuery) const TImplementationProxy SignatureImplementationTable[] = @@ -373,6 +379,7 @@ MVIP_CTR_ENTRY(EDefaultSCPRFactoryQuery, TDefaultSCPRFactoryQuery), //1008 MVIP_CTR_ENTRY(EDefaultFlowFactoryQuery, TDefaultFlowFactoryQuery), MVIP_CTR_ENTRY(EDefaultProtocolIntfFactoryQuery, TDefaultProtocolIntfFactoryQuery), + MVIP_CTR_ENTRY(ETierTypeIdFactoryQuery, TTierTypeIdFactoryQuery), //1013 }; @@ -641,6 +648,23 @@ return prov->ProviderInfo() == iProviderInfo? MFactoryQuery::EMatch : MFactoryQuery::EContinue; } +EXPORT_C TTierTypeIdFactoryQuery::TTierTypeIdFactoryQuery() + { + + } + +EXPORT_C TTierTypeIdFactoryQuery::TTierTypeIdFactoryQuery(const TUid aTierTypeId) +: iTierTypeId(aTierTypeId) + { + + } + +EXPORT_C MFactoryQuery::TMatchResult TTierTypeIdFactoryQuery::Match(Factories::TFactoryObjectInfo& aFactoryObjectInfo) + { + CTierManagerBase* prov = static_cast(aFactoryObjectInfo.iInfo.iFactoryObject); + return prov->TierId() == iTierTypeId ? MFactoryQuery::EMatch : MFactoryQuery::EContinue; + } + EXPORT_C TDefaultConnectionFactoryQuery::TDefaultConnectionFactoryQuery(const Messages::TNodeId& aMCprId) : iMCprId(aMCprId) { diff -r 0b0e9fce0b58 -r 4ccf8e394726 datacommsserver/esockserver/ssock/ss_nodemessages_legacy.cpp --- a/datacommsserver/esockserver/ssock/ss_nodemessages_legacy.cpp Wed Mar 31 23:27:09 2010 +0300 +++ b/datacommsserver/esockserver/ssock/ss_nodemessages_legacy.cpp Wed Apr 14 17:14:05 2010 +0300 @@ -508,6 +508,11 @@ } +void CLegacyDataMonitoringResponder::DoComplete(TInt aError) + { + iLegacyResponseMsg.Complete(aError); + } + void CLegacyDataMonitoringResponder::DoCancelRequest() { iLegacyResponseMsg.Complete(KErrCancel); @@ -731,9 +736,9 @@ RLegacyResponseMsg responseMsg(aContext, iMessage, iMessage.Int0()); CDataMonitoringResponder* responder = CLegacyDataMonitoringResponder::NewL(responseMsg); - ADataMonitoringProtocolReq& dataMonItf = *static_cast(interface); - switch(iDirection) - { + ADataMonitoringProtocolReq& dataMonItf = *static_cast(interface); + switch(iDirection) + { case ESent: dataMonItf.RequestDataSentNotification(responder, delta, volume, iClientId); break; @@ -741,19 +746,20 @@ case EReceived: dataMonItf.RequestDataReceivedNotification(responder, delta, volume, iClientId); break; + default: delete responder; - } + } // coverity [leaked_storage] - responder is owned by dataMonItf.RequestDataSentNotification, dataMonItf.RequestDataReceivedNotification // therefore we don't need to push them onto the cleanup stack. - } + } void TLegacyDataMonitoringNotificationRequest::Cancel(MeshMachine::TNodeContextBase& aContext) { TAny* interface = FetchInterfaceL(aContext.Node(), EDataMonitoringApiExt); ASSERT(interface); - if (interface) + if (interface) { ADataMonitoringProtocolReq& dataMonItf = *static_cast(interface); diff -r 0b0e9fce0b58 -r 4ccf8e394726 datacommsserver/esockserver/ssock/ss_tiermanager.cpp --- a/datacommsserver/esockserver/ssock/ss_tiermanager.cpp Wed Mar 31 23:27:09 2010 +0300 +++ b/datacommsserver/esockserver/ssock/ss_tiermanager.cpp Wed Apr 14 17:14:05 2010 +0300 @@ -113,13 +113,21 @@ if (aMessage.IsMessage()) { TCFInternalEsock::TCreateCSR& msg = message_cast(aMessage); - // Maps Tier to ImplId For ECOM since ImplId is used in Factory - CommsDat::CMDBSession* dbs = CommsDat::CMDBSession::NewLC(KCDVersion1_2); - msg.iUid= TierManagerUtils::MapTierIdtoTierImplIdL(msg.iUid, *dbs); - CleanupStack::PopAndDestroy(dbs); - CCommsFactoryBase* factory = static_cast(FindOrCreateFactoryL(msg.iUid)); - TAlwaysFindFactoryQuery query; - CSelectionRequest* sr = CSelectionRequest::NewL(address_cast(aSender), factory->FindOrCreateObjectL(query)->Id()); + TTierTypeIdFactoryQuery tierTypeQuery(msg.iUid); + ACommsFactoryNodeId* obj = Find(tierTypeQuery); // match the address family to tierTypeId in factory container + if (!obj) + { + // object not found, use the commsdat to find the Tier Manager + CommsDat::CMDBSession* dbs = CommsDat::CMDBSession::NewLC(KCDVersion1_2); + // Maps Tier to ImplId For ECOM since ImplId is used in Factory + msg.iUid= TierManagerUtils::MapTierIdtoTierImplIdL(msg.iUid, *dbs); + CleanupStack::PopAndDestroy(dbs); + CCommsFactoryBase* factory = static_cast(FindOrCreateFactoryL(msg.iUid)); + TAlwaysFindFactoryQuery query; // since there is only one Tier Manager per Tier Manager factory, return the first one + obj = factory->FindOrCreateObjectL(query); + } + + CSelectionRequest* sr = CSelectionRequest::NewL(address_cast(aSender), obj->Id()); RClientInterface::OpenPostMessageClose(Id(), aSender, TCFInternalEsock::TCSRCreated(sr->Id()).CRef()); aMessage.ClearMessageId(); } diff -r 0b0e9fce0b58 -r 4ccf8e394726 datacommsserver/esockserver/ssock/ss_tiermanagerutils.cpp --- a/datacommsserver/esockserver/ssock/ss_tiermanagerutils.cpp Wed Mar 31 23:27:09 2010 +0300 +++ b/datacommsserver/esockserver/ssock/ss_tiermanagerutils.cpp Wed Apr 14 17:14:05 2010 +0300 @@ -738,27 +738,25 @@ EXPORT_C TUid TierManagerUtils::MapTierIdtoTierImplIdL(TUid aTierUid,CommsDat::CMDBSession& aDbs ) /** mapping TM Id to TM ImplId in Commsdat */ { - TUid ImplUid; - // if it does not exist, it returns tier id - ImplUid = aTierUid; + TUid ImplUid; + // if it does not exist, it returns tier id + ImplUid = aTierUid; + + CCDTierRecord* tierRec = static_cast(CCDRecordBase::RecordFactoryL(KCDTIdTierRecord)); + CleanupStack::PushL(tierRec); + tierRec->iRecordTag = aTierUid.iUid; + + TBool found = tierRec->FindL(aDbs); - CMDBRecordSet* recSet = new (ELeave) CMDBRecordSet(KCDTIdTierRecord); - CleanupStack::PushL(recSet); - recSet->LoadL(aDbs); - const TInt recCnt = recSet->iRecords.Count(); - - for(TInt i = 0; i < recCnt; i++) - { - CCDTierRecord* rec = static_cast(recSet->iRecords[i]); - if(rec->iRecordTag == aTierUid.iUid) - { - ImplUid.iUid = rec->iTierImplUid; - } - } - - CleanupStack::PopAndDestroy(recSet); - return ImplUid; - } + if (found) + { + ImplUid.iUid = tierRec->iTierImplUid; + } + + CleanupStack::PopAndDestroy(tierRec); + return ImplUid; + + } // // CCommsDatIapView // diff -r 0b0e9fce0b58 -r 4ccf8e394726 datacommsserver/esockserver/test/TE_DummyProvider/scripts/te_dummyprovider_004.script --- a/datacommsserver/esockserver/test/TE_DummyProvider/scripts/te_dummyprovider_004.script Wed Mar 31 23:27:09 2010 +0300 +++ b/datacommsserver/esockserver/test/TE_DummyProvider/scripts/te_dummyprovider_004.script Wed Apr 14 17:14:05 2010 +0300 @@ -2,7 +2,7 @@ // Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" +// under the terms of "Eclipse Public License v1.0" // which accompanies this distribution, and is available // at the URL "http://www.eclipse.org/legal/epl-v10.html". // diff -r 0b0e9fce0b58 -r 4ccf8e394726 datacommsserver/esockserver/test/TE_DummyProvider/scripts/te_dummyprovider_005.script --- a/datacommsserver/esockserver/test/TE_DummyProvider/scripts/te_dummyprovider_005.script Wed Mar 31 23:27:09 2010 +0300 +++ b/datacommsserver/esockserver/test/TE_DummyProvider/scripts/te_dummyprovider_005.script Wed Apr 14 17:14:05 2010 +0300 @@ -2,7 +2,7 @@ // Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" +// under the terms of "Eclipse Public License v1.0" // which accompanies this distribution, and is available // at the URL "http://www.eclipse.org/legal/epl-v10.html". // diff -r 0b0e9fce0b58 -r 4ccf8e394726 datacommsserver/esockserver/test/TE_RConnectionSuite/config/te_rconnectioncmmtests_NonConnection.script --- a/datacommsserver/esockserver/test/TE_RConnectionSuite/config/te_rconnectioncmmtests_NonConnection.script Wed Mar 31 23:27:09 2010 +0300 +++ b/datacommsserver/esockserver/test/TE_RConnectionSuite/config/te_rconnectioncmmtests_NonConnection.script Wed Apr 14 17:14:05 2010 +0300 @@ -274,6 +274,64 @@ test_complete END_TESTCASE COMINF-ESOCK-RConnectionSuite-CMM-0622 + + +START_TESTCASE COMINF-ESOCK-RConnectionSuite-CMM-0481 +//! @SYMTestCaseID COMINF-ESOCK-RConnectionSuite-CMM-0481 +//!@SYMTestCaseDesc Data Monitoring cancellation test - sent data notification +// NOTE: If this test fails it can bring down esock when the connection stops (because of the original defect in esock) +run_script z:\TestData\scripts\te_esock_test_unloadesockForced.script +run_script z:\TestData\scripts\te_esock_test_loadesock.script +heap_mark +run_test_step 100, TE_RConnectionSuite Test481 c:\rconnectiontest.ini +heap_markend +test_complete +END_TESTCASE COMINF-ESOCK-RConnectionSuite-CMM-0481 + + + +START_TESTCASE COMINF-ESOCK-RConnectionSuite-CMM-0482 +//! @SYMTestCaseID COMINF-ESOCK-RConnectionSuite-CMM-0482 +//!@SYMTestCaseDesc Data Monitoring cancellation test - received data notification +// NOTE: If this test fails it can bring down esock when the connection stops (because of the original defect in esock) +run_script z:\TestData\scripts\te_esock_test_unloadesockForced.script +run_script z:\TestData\scripts\te_esock_test_loadesock.script +heap_mark +run_test_step 100, TE_RConnectionSuite Test482 c:\rconnectiontest.ini +heap_markend +test_complete +END_TESTCASE COMINF-ESOCK-RConnectionSuite-CMM-0482 + + + +START_TESTCASE COMINF-ESOCK-RConnectionSuite-CMM-0483 +//! @SYMTestCaseID COMINF-ESOCK-RConnectionSuite-CMM-0483 +//!@SYMTestCaseDesc Data Monitoring cancellation test - sent data notification +// NOTE: If this test fails it can bring down esock when the connection stops (because of the original defect in esock) +run_script z:\TestData\scripts\te_esock_test_unloadesockForced.script +run_script z:\TestData\scripts\te_esock_test_loadesock.script +heap_mark +run_test_step 100, TE_RConnectionSuite Test483 c:\rconnectiontest.ini +heap_markend +test_complete +END_TESTCASE COMINF-ESOCK-RConnectionSuite-CMM-0483 + + + +START_TESTCASE COMINF-ESOCK-RConnectionSuite-CMM-0484 +//! @SYMTestCaseID COMINF-ESOCK-RConnectionSuite-CMM-0484 +//!@SYMTestCaseDesc Data Monitoring cancellation test - received data notification +// NOTE: If this test fails it can bring down esock when the connection stops (because of the original defect in esock) +run_script z:\TestData\scripts\te_esock_test_unloadesockForced.script +run_script z:\TestData\scripts\te_esock_test_loadesock.script +heap_mark +run_test_step 100, TE_RConnectionSuite Test484 c:\rconnectiontest.ini +heap_markend +test_complete +END_TESTCASE COMINF-ESOCK-RConnectionSuite-CMM-0484 + + + run_script z:\TestData\scripts\te_esock_test_unloadesockForced.script run_utils MakeReadWrite c:\rconnectiontest.ini diff -r 0b0e9fce0b58 -r 4ccf8e394726 datacommsserver/esockserver/test/TE_RConnectionSuite/inc/TE_RConnectionCMM.h --- a/datacommsserver/esockserver/test/TE_RConnectionSuite/inc/TE_RConnectionCMM.h Wed Mar 31 23:27:09 2010 +0300 +++ b/datacommsserver/esockserver/test/TE_RConnectionSuite/inc/TE_RConnectionCMM.h Wed Apr 14 17:14:05 2010 +0300 @@ -861,6 +861,31 @@ virtual enum TVerdict doTestStepL (); }; +class TE_RConnectionTest481 : public TE_RConnectionStep +{ +public: + virtual enum TVerdict doTestStepL(); +}; + +class TE_RConnectionTest482 : public TE_RConnectionStep +{ +public: + virtual enum TVerdict doTestStepL(); +}; + +class TE_RConnectionTest483 : public TE_RConnectionStep +{ +public: + virtual enum TVerdict doTestStepL(); +}; + +class TE_RConnectionTest484 : public TE_RConnectionStep +{ +public: + virtual enum TVerdict doTestStepL(); +}; + + class TE_RConnectionTest319 : public TE_RConnectionStep { public: diff -r 0b0e9fce0b58 -r 4ccf8e394726 datacommsserver/esockserver/test/TE_RConnectionSuite/inc/TE_RConnectionStep.h --- a/datacommsserver/esockserver/test/TE_RConnectionSuite/inc/TE_RConnectionStep.h Wed Mar 31 23:27:09 2010 +0300 +++ b/datacommsserver/esockserver/test/TE_RConnectionSuite/inc/TE_RConnectionStep.h Wed Apr 14 17:14:05 2010 +0300 @@ -238,6 +238,13 @@ void WaitForRelevantProgress(RConnection& aConn, TNifProgressBuf& aProgress, TInt aRelevantProgress); + + /** + @param aStatus The TRequestStatus you want to wait on + @param aTimeOut The time in microseconds to wait for the request to complete before returning + @return ETrue if the request completed, EFalse if the timeout happened first + */ + TBool WaitForRequestOrTimeOutL(TRequestStatus& aStatus, TInt aTimeOut); protected: // this is the config data read from the .ini file in ReadIniFile(). diff -r 0b0e9fce0b58 -r 4ccf8e394726 datacommsserver/esockserver/test/TE_RConnectionSuite/src/TE_RConnectionCMM.cpp --- a/datacommsserver/esockserver/test/TE_RConnectionSuite/src/TE_RConnectionCMM.cpp Wed Mar 31 23:27:09 2010 +0300 +++ b/datacommsserver/esockserver/test/TE_RConnectionSuite/src/TE_RConnectionCMM.cpp Wed Apr 14 17:14:05 2010 +0300 @@ -26,6 +26,7 @@ #include #include + /** * Subconnection Management API extensions * @@ -7269,5 +7270,445 @@ } // TE_RConnectionTest319 + +enum TVerdict TE_RConnectionTest481::doTestStepL(void) +/** + * Test 481 + * Test DataSentNotificationRequest() cancellation + * Added for defect ou1cimx1#305124. + * Tests that cancellation of the request does indeed cancel the request + * Defect summary: was the case that the first cancel cancelled the request but left + * a notification structure in existence. The second cancel would see the structure + * and think that the cancellation had already been done leaving the request outstanding. + * @return enum TVerdict Indicates status of test run. See INFO_PRINTF1.h for possible values + */ +{ + TInt err; + TRequestStatus status1; + + RSocketServ ss; + err = OpenSocketServer(ss); + TESTEL(KErrNone == err, err); + CleanupClosePushL(ss); + + //********** connection creation *********** + RConnection conn1; + err = OpenConnection(conn1, ss); + TESTEL(KErrNone == err, err); + CleanupClosePushL(conn1); + + // start the dummynif + err = StartConnectionWithOverrides(conn1, iDummyNifLongTimeoutIap); + TESTEL(KErrNone == err, err); + err = conn1.SetOpt(KCOLProvider, KConnDisableTimers, ETrue); + TESTEL(KErrNone == err, err); + + RSocket sock1; + err = OpenUdpSocketExplicitL(sock1, ss, conn1); + TESTEL(KErrNone == err, err); + CleanupClosePushL(sock1); + + INFO_PRINTF1(_L("First DataSentNotificationRequest")); + // Request DataSentNotificationRequest + TUint volume1(0); + TPckg volume1Des(volume1); + TUint threshold1(KLowThresholdSize); + conn1.DataSentNotificationRequest(threshold1, volume1Des, status1); + + // Send some data but not enough to trigger the notification + TUint currentVol(0); + while (currentVol < threshold1 / 2) + { + err = TestUdpDataPathL(sock1, iDummyNifSendAddr, KSmallBufferLength); + TESTEL(KErrNone == err, err); + TESTEL(KRequestPending == status1.Int(), status1.Int()); + currentVol += KSmallBufferUdpTestPacketSize; + } + + INFO_PRINTF1(_L("First DataSentNotificationRequest still outstanding (as expected) - now cancelling")); + + // Cancel the request and expect the completion + conn1.DataSentNotificationCancel(); + User::WaitForRequest(status1); + TESTEL(status1.Int() == KErrCancel, status1.Int()); + + INFO_PRINTF1(_L("First DataSentNotificationRequest completed with KErrCancel")); + + // The first cancellation has worked, repeat the above steps for the second cancellation + INFO_PRINTF1(_L("Second DataSentNotificationRequest")); + conn1.DataSentNotificationRequest(threshold1, volume1Des, status1); + + // NOTE: It is a deliberate that no data is transfered this time. + // Transmitting data and crossing the threshold for the first (cancelled) notification + // would cause the object to be cleaned up and therefore mask this issue + + // Cancel the request and expect the completion + conn1.DataSentNotificationCancel(); + User::WaitForRequest(status1); + TESTEL(status1.Int() == KErrCancel, status1.Int()); + INFO_PRINTF1(_L("Second DataSentNotificationRequest completed with KErrCancel")); + + // NOTE: Reaching here successfully does NOT mean the test has passed. If the data monitoring structures + // have been left behind esock will panic when the connection is stopped + + + //********** turn the idle timers back on now we are finished *********** + err = conn1.SetOpt(KCOLProvider, KConnDisableTimers, EFalse); + TESTEL(KErrNone == err, err); + + //********** clean up *********** + DestroyUdpSocket(sock1); + CleanupStack::Pop(&sock1); + + err = conn1.Stop(); + TESTEL(KErrNone == err, err); + + CloseConnection(conn1); + CleanupStack::Pop(&conn1); + + CloseSocketServer(ss); + CleanupStack::Pop(&ss); + + return TestStepResult(); + +} // TE_RConnectionTest481 + + + +enum TVerdict TE_RConnectionTest482::doTestStepL(void) +/** + * Test 482 + * Test DataReceivedNotificationRequest() cancellation + * Added for defect ou1cimx1#305124. + * Tests that cancellation of the request does indeed cancel the request + * Defect summary: was the case that the first cancel cancelled the request but left + * a notification structure in existence. The second cancel would see the structure + * and think that the cancellation had already been done leaving the request outstanding. + * @return enum TVerdict Indicates status of test run. See INFO_PRINTF1.h for possible values + */ +{ + TInt err; + TRequestStatus status1; + + RSocketServ ss; + err = OpenSocketServer(ss); + TESTEL(KErrNone == err, err); + CleanupClosePushL(ss); + + //********** connection creation *********** + RConnection conn1; + err = OpenConnection(conn1, ss); + TESTEL(KErrNone == err, err); + CleanupClosePushL(conn1); + + // start the dummynif + err = StartConnectionWithOverrides(conn1, iDummyNifLongTimeoutIap); + TESTEL(KErrNone == err, err); + err = conn1.SetOpt(KCOLProvider, KConnDisableTimers, ETrue); + TESTEL(KErrNone == err, err); + + RSocket sock1; + err = OpenUdpSocketExplicitL(sock1, ss, conn1); + TESTEL(KErrNone == err, err); + CleanupClosePushL(sock1); + + INFO_PRINTF1(_L("First DataReceivedNotificationRequest")); + // Request DataSentNotificationRequest + TUint volume1(0); + TPckg volume1Des(volume1); + TUint threshold1(KLowThresholdSize); + conn1.DataReceivedNotificationRequest(threshold1, volume1Des, status1); + + // Send some data but not enough to trigger the notification + TUint currentVol(0); + while (currentVol < threshold1 / 2) + { + err = TestUdpDataPathL(sock1, iDummyNifSendAddr, KSmallBufferLength); + TESTEL(KErrNone == err, err); + TESTEL(KRequestPending == status1.Int(), status1.Int()); + currentVol += KSmallBufferUdpTestPacketSize; + } + + INFO_PRINTF1(_L("First DataReceivedNotificationRequest still outstanding (as expected) - now cancelling")); + + // Cancel the request and expect the completion + conn1.DataReceivedNotificationCancel(); + User::WaitForRequest(status1); + TESTEL(status1.Int() == KErrCancel, status1.Int()); + + INFO_PRINTF1(_L("First DataReceivedNotificationRequest completed with KErrCancel")); + + // The first cancellation has worked, repeat the above steps for the second cancellation + INFO_PRINTF1(_L("Second DataReceivedNotificationRequest")); + conn1.DataReceivedNotificationRequest(threshold1, volume1Des, status1); + + // NOTE: It is a deliberate that no data is transfered this time. + // Transmitting data and crossing the threshold for the first (cancelled) notification + // would cause the object to be cleaned up and therefore mask this issue + + // Cancel the request and expect the completion + conn1.DataReceivedNotificationCancel(); + User::WaitForRequest(status1); + TESTEL(status1.Int() == KErrCancel, status1.Int()); + INFO_PRINTF1(_L("Second DataReceivedNotificationRequest completed with KErrCancel")); + + // NOTE: Reaching here successfully does NOT mean the test has passed. If the data monitoring structures + // have been left behind esock will panic when the connection is stopped + + + //********** turn the idle timers back on now we are finished *********** + err = conn1.SetOpt(KCOLProvider, KConnDisableTimers, EFalse); + TESTEL(KErrNone == err, err); + + //********** clean up *********** + DestroyUdpSocket(sock1); + CleanupStack::Pop(&sock1); + + err = conn1.Stop(); + TESTEL(KErrNone == err, err); + + CloseConnection(conn1); + CleanupStack::Pop(&conn1); + + CloseSocketServer(ss); + CleanupStack::Pop(&ss); + + return TestStepResult(); + +} // TE_RConnectionTest482 + + + +enum TVerdict TE_RConnectionTest483::doTestStepL(void) +/** + * Test 483 + * Test DataSentNotificationRequest() cancellation + * Added for defect ou1cimx1#305124. + * Tests that cancellation of the request does indeed cancel the request + * Defect summary: If the state described in Test481 occurs, it would have been possible to + * request more than one DataSentNotificationRequest per RConnection. This should not be possible. + * @return enum TVerdict Indicates status of test run. See INFO_PRINTF1.h for possible values + */ +{ + TInt err; + TRequestStatus status1; + + RSocketServ ss; + err = OpenSocketServer(ss); + TESTEL(KErrNone == err, err); + CleanupClosePushL(ss); + + //********** connection creation *********** + RConnection conn1; + err = OpenConnection(conn1, ss); + TESTEL(KErrNone == err, err); + CleanupClosePushL(conn1); + + // start the dummynif + err = StartConnectionWithOverrides(conn1, iDummyNifLongTimeoutIap); + TESTEL(KErrNone == err, err); + err = conn1.SetOpt(KCOLProvider, KConnDisableTimers, ETrue); + TESTEL(KErrNone == err, err); + + RSocket sock1; + err = OpenUdpSocketExplicitL(sock1, ss, conn1); + TESTEL(KErrNone == err, err); + CleanupClosePushL(sock1); + + INFO_PRINTF1(_L("First DataSentNotificationRequest")); + // Request DataSentNotificationRequest + TUint volume1(0); + TPckg volume1Des(volume1); + TUint threshold1(KLowThresholdSize); + conn1.DataSentNotificationRequest(threshold1, volume1Des, status1); + + // Send some data but not enough to trigger the notification + TUint currentVol(0); + while (currentVol < threshold1 / 2) + { + err = TestUdpDataPathL(sock1, iDummyNifSendAddr, KSmallBufferLength); + TESTEL(KErrNone == err, err); + TESTEL(KRequestPending == status1.Int(), status1.Int()); + currentVol += KSmallBufferUdpTestPacketSize; + } + + INFO_PRINTF1(_L("First DataSentNotificationRequest still outstanding (as expected) - now cancelling")); + + // Cancel the request and expect the completion + conn1.DataSentNotificationCancel(); + User::WaitForRequest(status1); + TESTEL(status1.Int() == KErrCancel, status1.Int()); + + INFO_PRINTF1(_L("First DataSentNotificationRequest completed with KErrCancel")); + + // The first cancellation has worked, repeat the above steps for the second cancellation + INFO_PRINTF1(_L("Second DataSentNotificationRequest")); + conn1.DataSentNotificationRequest(threshold1, volume1Des, status1); + + // NOTE: It is a deliberate that no data is transfered this time. + // Transmitting data and crossing the threshold for the first (cancelled) notification + // would cause the object to be cleaned up and therefore mask this issue + + // Cancel the request and expect the completion + conn1.DataSentNotificationCancel(); + User::WaitForRequest(status1); + TESTEL(status1.Int() == KErrCancel, status1.Int()); + INFO_PRINTF1(_L("Second DataSentNotificationRequest completed with KErrCancel")); + + + INFO_PRINTF1(_L("Third DataSentNotificationRequest")); + conn1.DataSentNotificationRequest(threshold1, volume1Des, status1); + + + INFO_PRINTF1(_L("Fourth DataSentNotificationRequest")); + TRequestStatus status2; + conn1.DataSentNotificationRequest(threshold1, volume1Des, status2); + TBool requestCompleted = WaitForRequestOrTimeOutL(status2, KOneSecondDelay); + TESTL(requestCompleted); + TESTEL(status2.Int() == KErrInUse, status2.Int()); + INFO_PRINTF1(_L("Fourth DataSentNotificationRequest failed with KErrInUse as expected")); + + conn1.DataSentNotificationCancel(); + User::WaitForRequest(status1); + TESTEL(status1.Int() == KErrCancel, status1.Int()); + INFO_PRINTF1(_L("Third DataSentNotificationRequest completed with KErrCancel")); + + //********** turn the idle timers back on now we are finished *********** + err = conn1.SetOpt(KCOLProvider, KConnDisableTimers, EFalse); + TESTEL(KErrNone == err, err); + + //********** clean up *********** + DestroyUdpSocket(sock1); + CleanupStack::Pop(&sock1); + + err = conn1.Stop(); + TESTEL(KErrNone == err, err); + + CloseConnection(conn1); + CleanupStack::Pop(&conn1); + + CloseSocketServer(ss); + CleanupStack::Pop(&ss); + + return TestStepResult(); + +} // TE_RConnectionTest483 + + +enum TVerdict TE_RConnectionTest484::doTestStepL(void) +/** + * Test 484 + * Test DataReceivedNotificationRequest() cancellation + * Added for defect ou1cimx1#305124. + * Tests that cancellation of the request does indeed cancel the request + * Defect summary: If the state described in Test482 occurs, it would have been possible to + * request more than one DataReceivedNotificationRequest per RConnection. This should not be possible. + * @return enum TVerdict Indicates status of test run. See INFO_PRINTF1.h for possible values + */ +{ + TInt err; + TRequestStatus status1; + + RSocketServ ss; + err = OpenSocketServer(ss); + TESTEL(KErrNone == err, err); + CleanupClosePushL(ss); + + //********** connection creation *********** + RConnection conn1; + err = OpenConnection(conn1, ss); + TESTEL(KErrNone == err, err); + CleanupClosePushL(conn1); + + // start the dummynif + err = StartConnectionWithOverrides(conn1, iDummyNifLongTimeoutIap); + TESTEL(KErrNone == err, err); + err = conn1.SetOpt(KCOLProvider, KConnDisableTimers, ETrue); + TESTEL(KErrNone == err, err); + + RSocket sock1; + err = OpenUdpSocketExplicitL(sock1, ss, conn1); + TESTEL(KErrNone == err, err); + CleanupClosePushL(sock1); + + INFO_PRINTF1(_L("First DataReceivedNotificationRequest")); + // Request DataReceivedNotificationRequest + TUint volume1(0); + TPckg volume1Des(volume1); + TUint threshold1(KLowThresholdSize); + conn1.DataReceivedNotificationRequest(threshold1, volume1Des, status1); + + // Send some data but not enough to trigger the notification + TUint currentVol(0); + while (currentVol < threshold1 / 2) + { + err = TestUdpDataPathL(sock1, iDummyNifSendAddr, KSmallBufferLength); + TESTEL(KErrNone == err, err); + TESTEL(KRequestPending == status1.Int(), status1.Int()); + currentVol += KSmallBufferUdpTestPacketSize; + } + + INFO_PRINTF1(_L("First DataReceivedNotificationRequest still outstanding (as expected) - now cancelling")); + + // Cancel the request and expect the completion + conn1.DataReceivedNotificationCancel(); + User::WaitForRequest(status1); + TESTEL(status1.Int() == KErrCancel, status1.Int()); + + INFO_PRINTF1(_L("First DataReceivedNotificationRequest completed with KErrCancel")); + + // The first cancellation has worked, repeat the above steps for the second cancellation + INFO_PRINTF1(_L("Second DataReceivedNotificationRequest")); + conn1.DataReceivedNotificationRequest(threshold1, volume1Des, status1); + + // NOTE: It is a deliberate that no data is transfered this time. + // Transmitting data and crossing the threshold for the first (cancelled) notification + // would cause the object to be cleaned up and therefore mask this issue + + // Cancel the request and expect the completion + conn1.DataReceivedNotificationCancel(); + User::WaitForRequest(status1); + TESTEL(status1.Int() == KErrCancel, status1.Int()); + INFO_PRINTF1(_L("Second DataReceivedNotificationRequest completed with KErrCancel")); + + + INFO_PRINTF1(_L("Third DataReceivedNotificationRequest")); + conn1.DataReceivedNotificationRequest(threshold1, volume1Des, status1); + + INFO_PRINTF1(_L("Fourth DataReceivedNotificationRequest")); + TRequestStatus status2; + conn1.DataReceivedNotificationRequest(threshold1, volume1Des, status2); + TBool requestCompleted = WaitForRequestOrTimeOutL(status2, KOneSecondDelay); + TESTL(requestCompleted); + TESTEL(status2.Int() == KErrInUse, status2.Int()); + INFO_PRINTF1(_L("Fourth DataReceivedNotificationRequest failed with KErrInUse as expected")); + + conn1.DataReceivedNotificationCancel(); + User::WaitForRequest(status1); + TESTEL(status1.Int() == KErrCancel, status1.Int()); + INFO_PRINTF1(_L("Third DataReceivedNotificationRequest completed with KErrCancel")); + + //********** turn the idle timers back on now we are finished *********** + err = conn1.SetOpt(KCOLProvider, KConnDisableTimers, EFalse); + TESTEL(KErrNone == err, err); + + //********** clean up *********** + DestroyUdpSocket(sock1); + CleanupStack::Pop(&sock1); + + err = conn1.Stop(); + TESTEL(KErrNone == err, err); + + CloseConnection(conn1); + CleanupStack::Pop(&conn1); + + CloseSocketServer(ss); + CleanupStack::Pop(&ss); + + return TestStepResult(); + +} // TE_RConnectionTest484 + + // EOF TE_RConnectionCMM.cpp diff -r 0b0e9fce0b58 -r 4ccf8e394726 datacommsserver/esockserver/test/TE_RConnectionSuite/src/TE_RConnectionDummyNifTestSteps.cpp --- a/datacommsserver/esockserver/test/TE_RConnectionSuite/src/TE_RConnectionDummyNifTestSteps.cpp Wed Mar 31 23:27:09 2010 +0300 +++ b/datacommsserver/esockserver/test/TE_RConnectionSuite/src/TE_RConnectionDummyNifTestSteps.cpp Wed Apr 14 17:14:05 2010 +0300 @@ -232,7 +232,6 @@ void CConnectionTest1b::Start() { INFO_PRINTF1(_L("Starting Connection")); - iConnection.Start(iStatus); SetActive(); } @@ -1948,6 +1947,10 @@ TESTEL(KErrNone == progress().iError, progress().iError); TESTEL(ECsdStartingHangUp == progress().iStage, progress().iStage); + + INFO_PRINTF1(_L("Waiting for KConnectionDown and KConnectionUninitialised. If the test times-out they didn't come (in the right seq).")); + WaitForRelevantProgress(conn1, progress, KConnectionDown); + WaitForRelevantProgress(conn1, progress, KConnectionUninitialised); CloseConnection(conn1); CleanupStack::Pop(); @@ -5088,6 +5091,10 @@ TESTEL(KErrNone == progress().iError, progress().iError); TESTEL(ECsdStartingHangUp == progress().iStage, progress().iStage); + + INFO_PRINTF1(_L("Waiting for KConnectionDown and KConnectionUninitialised. If the test times-out they didn't come (in the right seq).")); + WaitForRelevantProgress(conn1, progress, KConnectionDown); + WaitForRelevantProgress(conn1, progress, KConnectionUninitialised); CloseConnection(conn1); CleanupStack::Pop(); diff -r 0b0e9fce0b58 -r 4ccf8e394726 datacommsserver/esockserver/test/TE_RConnectionSuite/src/TE_RConnectionStep.cpp --- a/datacommsserver/esockserver/test/TE_RConnectionSuite/src/TE_RConnectionStep.cpp Wed Mar 31 23:27:09 2010 +0300 +++ b/datacommsserver/esockserver/test/TE_RConnectionSuite/src/TE_RConnectionStep.cpp Wed Apr 14 17:14:05 2010 +0300 @@ -1732,6 +1732,27 @@ } +TBool TE_RConnectionStep::WaitForRequestOrTimeOutL(TRequestStatus& aStatus, TInt aTimeOut) + { + RTimer timer; + User::LeaveIfError(timer.CreateLocal()); + + TRequestStatus timerStatus; + timer.After(timerStatus, aTimeOut); + User::WaitForRequest(aStatus, timerStatus); + TBool requestCompleted = EFalse; + + if (timerStatus == KRequestPending) + { + timer.Cancel(); + User::WaitForRequest(timerStatus); + requestCompleted = ETrue; + } + + timer.Close(); + return requestCompleted; + } + /* * Now the stuff for the peculiar tests that need to use QoS diff -r 0b0e9fce0b58 -r 4ccf8e394726 datacommsserver/esockserver/test/TE_RConnectionSuite/src/TE_RConnectionSuite.cpp --- a/datacommsserver/esockserver/test/TE_RConnectionSuite/src/TE_RConnectionSuite.cpp Wed Mar 31 23:27:09 2010 +0300 +++ b/datacommsserver/esockserver/test/TE_RConnectionSuite/src/TE_RConnectionSuite.cpp Wed Apr 14 17:14:05 2010 +0300 @@ -655,6 +655,14 @@ testStep=new TE_RConnectionTest479(); else if(aStepName.Compare(_L("Test480")) == 0) testStep=new TE_RConnectionTest480(); + else if(aStepName.Compare(_L("Test481")) == 0) + testStep=new TE_RConnectionTest481(); + else if(aStepName.Compare(_L("Test482")) == 0) + testStep=new TE_RConnectionTest482(); + else if(aStepName.Compare(_L("Test483")) == 0) + testStep=new TE_RConnectionTest483(); + else if(aStepName.Compare(_L("Test484")) == 0) + testStep=new TE_RConnectionTest484(); return testStep; }