diff -r 505ad3f0ce5c -r cdb720e67852 Msrp/MsrpServer/inc/CMSRPServerSubSession.h --- a/Msrp/MsrpServer/inc/CMSRPServerSubSession.h Sat Jun 12 14:30:11 2010 +0530 +++ b/Msrp/MsrpServer/inc/CMSRPServerSubSession.h Thu Nov 25 13:59:42 2010 +0200 @@ -76,6 +76,8 @@ inline TBool Queue(T& element); inline T* DeQueue(); inline TBool isEmpty(); + inline T* FindElement( T* aMatch ); + inline T* FindElement( TDesC8& aMessageId ); inline T* getHead(); @@ -145,6 +147,50 @@ } template +T* CQueue::FindElement( T* aMatch ) + { + if( !iList.IsEmpty() ) + { + TSglQueIter iterator(CQueue::iList); + iterator.SetToFirst(); + T* matchingOwner; + + while( ( matchingOwner = iterator++ ) ) + { + if( matchingOwner == aMatch ) + { + return matchingOwner; + } + } + } + return NULL; + } + +template +T* CQueue::FindElement( TDesC8& aMessageId ) + { + if( !iList.IsEmpty() ) + { + TSglQueIter iterator(CQueue::iList); + iterator.SetToFirst(); + T* currentElement; + + while( ( currentElement = iterator++ ) ) + { + HBufC8* messageId = currentElement->MessageIdLC(); + if ( *messageId == aMessageId ) + { + CleanupStack::PopAndDestroy( ); // messageId + return currentElement; + } + CleanupStack::PopAndDestroy( ); // messageId + } + } + + return NULL; + } + +template T* CQueue::getMatch(T* aMatch) { aMatch; @@ -194,10 +240,13 @@ while((iMatchingOwner = iterator++)) { - if(iMatchingOwner->IsOwnerOfResponse(*aInCommingMsg)) - { - return iMatchingOwner; - } + if ( iMatchingOwner != aInCommingMsg ) + { + if(iMatchingOwner->IsOwnerOfResponse(*aInCommingMsg)) + { + return iMatchingOwner; + } + } } return NULL; @@ -219,16 +268,22 @@ enum TQueueType { TClientQueue, - TInCommingMsgQueue + TInCommingMsgQueue, + TCompletedSendQueue, + TCompletedIncQueue, + TReceiveProgressQueue, + TSendProgressQueue }; - static CMSRPServerSubSession* NewL( CMSRPServerSession& aServerSession, CStateFactory& aStateFactory ); + static CMSRPServerSubSession* NewL( + CMSRPServerSession& aServerSession, CStateFactory& aStateFactory, const TDesC8& aSessionId ); - static CMSRPServerSubSession* NewLC( CMSRPServerSession& aServerSession, CStateFactory& aStateFactory ); + static CMSRPServerSubSession* NewLC( + CMSRPServerSession& aServerSession, CStateFactory& aStateFactory, const TDesC8& aSessionId ); virtual ~CMSRPServerSubSession( ); - TBool ServiceL( const RMessage2& aMessage ); + void ServiceL( const RMessage2& aMessage ); // From MMSRPConnectionObserver void ConnectionStateL( TInt aNewState, TInt aStatus ); @@ -238,35 +293,33 @@ void UnclaimedMessageL( CMSRPMessageHandler* aMsg ); // From MMSRPMsgObserver - void MessageSendCompleteL(); + void MessageSendCompleteL( CMSRPMessageHandler* aMessageHandler ); void MessageResponseSendCompleteL(CMSRPMessageHandler& aMsg); - virtual void MessageSendProgressL(TInt aBytesSent, TInt aTotalBytes); + void MessageReportSendCompleteL( CMSRPMessageHandler& aMsg ); + + void MessageSendProgressL( CMSRPMessageHandler* aMessageHandler ); - virtual void MessageReceiveProgressL(TInt aBytesSent, TInt aTotalBytes); + void MessageReceiveProgressL( CMSRPMessageHandler* aMessageHandler ); + + void MessageCancelledL( ); void WriterError(); - - CMSRPMessageHandler* ReceiveFileMsgHandler(); - - void NotifyFileReceiveResultToClientL(CMSRPMessageHandler *msgHandler); - - void NotifyFileSendResultToClientL(CMSRPMessageHandler *msgHandler); private: CMSRPServerSession& iServerSession; CMSRPServerSubSession( CMSRPServerSession& aServerSession, CStateFactory &aStateFactory); - void ConstructL(); + void ConstructL( const TDesC8& aSessionId ); // ProcessEventL shall only take a event. The data associated with the event can be a // RMessage(Client to Server events), CSendBuffer(buffer being send out by connection manager), // CMSRPMessage(received message) or other such data. // The associated data is stored in the context and retrieved by the relevant state when needed. - TBool CMSRPServerSubSession::ProcessEventL( TMSRPFSMEvent aEvent); + void CMSRPServerSubSession::ProcessEventL( TMSRPFSMEvent aEvent); - HBufC8* CreateSubSessionIDL( ); + //HBufC8* CreateSubSessionIDL( ); void HandleLocalPathRequestL( const RMessage2& aMessage ); @@ -296,10 +349,11 @@ // Utility functions. - TBool sendResultToClientL(CMSRPMessageHandler *incommingMsgHandler); + void sendResultToClientL(CMSRPMessageHandler *incommingMsgHandler); TBool sendMsgToClientL(CMSRPMessageHandler *incommingMsgHandler); - TBool SendProgressToClientL(CMSRPMessageHandler *msgHandler); - TBool ReceiveProgressToClientL(CMSRPMessageHandler *msgHandler); + TBool sendReportToClientL( CMSRPMessageHandler *incommingMsgHandler ); + void SendProgressToClientL( CMSRPMessageHandler* aMessageHandler ); + void ReceiveProgressToClientL( CMSRPMessageHandler* aMessageHandler ); void ReadSendDataPckgL(); @@ -312,7 +366,13 @@ void QueueLog(); - TBool checkMessageForSelfL(CMSRPMessageHandler *aMsgHandler); + /** + * Checks that incoming messages session id is a correct one for + * this session + * @param aMsgHandler message handler containing the incoming message + * @return true if message belongs to this session, false if not + */ + TBool CheckMessageSessionIdL( CMSRPMessageHandler *aMsgHandler ); TBool matchSessionIDL(const CMSRPHeaderBase *aPathHeader, TBool local = TRUE); TPtrC8 extractSessionID(const TDesC8& aPathBuffer); @@ -351,12 +411,17 @@ const RMessage2* iClientMessage; CMSRPMessageHandler* iReceivedMsg; CMSRPMessageHandler* iReceivedResp; + CMSRPMessageHandler* iReceivedReport; CMSRPMessageHandler* iReceiveFileMsgHdler; - TBool iFileShare; //is previous state file share TBool iSendCompleteNotify; // TBool iReceiveCompleteNotify; - TInt iBytesTransferred; - TInt iTotalBytes; + TBool iFileShareCancelled; + + // used for progress reports, temporary, not owned + CMSRPMessageHandler* iReceiveProgressMsg; + + // used for progress reports, temporary, not owned + CMSRPMessageHandler* iSendProgressMsg; // Client Listners waiting to be completed. @@ -377,19 +442,28 @@ // OutGoingMessage queue where it waits for a response to arrive. CMSRPMessageHandler *iCurrentMsgHandler; - // Queues. + // Message queues CQueueMsgHandlers iOutMsgQ; CQueueMsgHandlers iInCommingMsgQ; CQueueMsgHandlers iPendingSendMsgQ; - CQueueMsgHandlers iPendingForDeletionQ; - + CQueueMsgHandlers iPendingForDeletionQ; + CQueueMsgHandlers< CMSRPMessageHandler > iPendingDataSendCompleteQ; + CQueueMsgHandlers< CMSRPMessageHandler > iPendingDataIncCompleteQ; + + // progress report queues + CQueueMsgHandlers< CMSRPMessageHandler > iPendingSendProgressQ; + CQueueMsgHandlers< CMSRPMessageHandler > iPendingReceiveProgressQ; + + // This queue holds the instance of messages currently being received + CQueueMsgHandlers< CMSRPMessageHandler > iCurrentlyReceivingMsgQ; + + TBool iSendProgressReports; + friend class TStateBase; friend class TStateIdle; friend class TStateConnecting; friend class TStateActive; - friend class TStateActiveSend; friend class TStateWaitForClient; - friend class TStateFileShare; friend class TStateError; // Not a very good thing !! Need change. #ifdef __UT_TSTATEFACTORY_H__