Msrp/MsrpServer/src/CMSRPMsgParser.cpp
branchMSRP_FrameWork
changeset 58 cdb720e67852
parent 25 505ad3f0ce5c
child 60 7634585a4347
--- a/Msrp/MsrpServer/src/CMSRPMsgParser.cpp	Sat Jun 12 14:30:11 2010 +0530
+++ b/Msrp/MsrpServer/src/CMSRPMsgParser.cpp	Thu Nov 25 13:59:42 2010 +0200
@@ -20,6 +20,9 @@
 #include "CMSRPMsgParser.h"
 #include "MSRPCommon.h"
 
+#include "CMSRPMessage.h"
+#include "CMSRPToPathHeader.h"
+
 // -----------------------------------------------------------------------------
 // CMSRPMsgParser::NewL
 // Static constructor
@@ -60,6 +63,8 @@
     delete iMessage;
     iParseBuffers.ResetAndDestroy();
     iParseBuffers.Close();    
+    iIncomingMessageChunks.ResetAndDestroy();
+    iIncomingMessageChunks.Close();
     MSRPLOG( "CMSRPMsgParser::~CMSRPMsgParser exit" )
     }
 
@@ -86,6 +91,7 @@
     {
     TMatchType match = EFullMatch;
     TBool ret = TRUE;
+    iByteRangeHeaderFound = EFalse;
 
     /*parse until a parse element spans buffers. 
       if parse element completes exactly at buffer boundaries,
@@ -107,7 +113,7 @@
             token.Set(iEndToken->Des());                
             }   
         
-        TInt matchPos;
+        TInt matchPos( 0 );
         match = FindToken(iParseBuffers[0]->Ptr(),token,matchPos);    
         if(match == EFullMatch)
             {
@@ -330,6 +336,7 @@
 void CMSRPMsgParser::HandleTitleLineL(const TDesC8& aString, TInt /*aMatchPos*/)
     {
     MSRPLOG( "CMSRPMsgParser::HandleTitleLineL enter" )
+    
     TPtrC8 msrp(aString.Left(KMSRP().Length()));
     if(msrp.Compare(KMSRP()))
         User::LeaveIfError(KErrCorrupt);
@@ -362,24 +369,32 @@
         
         method.Set(method.Left(pos));
                 
+        delete iMessage;
+        iMessage = NULL;
          if (!method.Compare(KMSRPSend()))
              {
              iMessage = CMSRPMessageHandler::NewL(MMSRPIncomingMessage::EMSRPMessage);
+             MSRPLOG2( "CMSRPMsgParser::HandleTitleLineL new message = %d", iMessage )
              }
-         else if (!method.Compare(KMSRPReport()))
+         else if ( !method.Compare( KMSRPReport() ) )
              {
-             iMessage = CMSRPMessageHandler::NewL(MMSRPIncomingMessage::EMSRPReport);
+             iMessage = CMSRPMessageHandler::NewL( MMSRPIncomingMessage::EMSRPReport );
+             MSRPLOG2( "CMSRPMsgParser::HandleTitleLineL new report = %d", iMessage )
              }
          else //extn
              {
              iMessage = CMSRPMessageHandler::NewL(MMSRPIncomingMessage::EMSRPNotDefined);
+             MSRPLOG2( "CMSRPMsgParser::HandleTitleLineL new not defined = %d", iMessage )
              }        
         }
     else //response
         {
         TPtrC8 null;
         method.Set(method.Left(pos));
+        delete iMessage;
+        iMessage = NULL;
         iMessage = CMSRPMessageHandler::NewL(MMSRPIncomingMessage::EMSRPResponse);
+        MSRPLOG2( "CMSRPMsgParser::HandleTitleLineL new response = %d", iMessage )
         iMessage->SetStatusOfResponseL(method, null);
         }    
     iMessage->SetTransactionId(trans_id);
@@ -526,6 +541,7 @@
             }
         else if(!header_name.Compare(KMSRPByteRange()))
             {
+            iByteRangeHeaderFound = ETrue;
             headerType = MMSRPMessageHandler::EByteRange;
             }
         else if(!header_name.Compare(KMSRPSuccessReport()))
@@ -550,6 +566,13 @@
     //message->add_header
     TPtrC8 fullHeader(aString);
     iMessage->AddHeaderL(headerType, header_val, fullHeader);
+    if ( headerType == MMSRPMessageHandler::EMessageId )
+        {
+        // let's check if this message chunk belong to one
+        // of the chunks already received. If so, combine
+        // the messages
+        CheckMessageChunkL( );
+        }
     //TODO: //only for to-path from-path add_header error
     //switch iState = EBody, mode = EError //essentially start looking for end token
     //if mode is error don't issue callbacks, on transition from EndofEndLine,
@@ -558,6 +581,26 @@
     MSRPLOG( "CMSRPMsgParser::HandleHeaderL exit" )
         
     }
+    
+// -----------------------------------------------------------------------------
+// CMSRPMsgParser::HandleOptionalHeaderL
+// -----------------------------------------------------------------------------
+//
+void CMSRPMsgParser::CheckMessageChunkL( )
+    {
+    MSRPLOG( "-> CMSRPMsgParser::HandleHeaderL" )
+    for ( TInt i = 0; i < iIncomingMessageChunks.Count(); i++ )
+        {
+        if ( iMessage->CheckMessageChunkL( *iIncomingMessageChunks[ i ] ) )
+            {
+            delete iMessage;
+            iMessage = iIncomingMessageChunks[ i ];
+            iIncomingMessageChunks.Remove( i );
+            break;
+            }
+        }
+    MSRPLOG( "<- CMSRPMsgParser::HandleHeaderL" )
+    }
 
 // -----------------------------------------------------------------------------
 // CMSRPMsgParser::HandleOptionalHeaderL
@@ -607,12 +650,18 @@
     if(aMatchPos!=0)
         {
         TPtrC8 content(aString.Left(aMatchPos));
-        iMessage->AddContentL(content);       
+        if ( !iMessage->IsTransmissionTerminated() )
+            {
+            MSRPLOG2( "CMSRPMsgParser::HandleBodyL instance = %d", iMessage )
+            iMessage->AddContentL( content, iByteRangeHeaderFound ); 
+            iConnection.ReportReceiveprogressL( iMessage );
+            }
         }
 
     //partial or full match
     if(token.Length())
         {   
+        MSRPLOG( "CMSRPMsgParser::HandleBodyL enter partial/token" )
          
         //if(aMatchPos == 0)
             {
@@ -646,7 +695,7 @@
 //
 void CMSRPMsgParser::HandleEndofEndLineL(const TDesC8& aString, TInt aMatchPos)
     {
-    MSRPLOG( "CMSRPMsgParser::HandleEndofEndLineL enter" )
+    MSRPLOG2( "CMSRPMsgParser::HandleEndofEndLineL enter, char = %d", aString[0] )
     if(aMatchPos != 1)
         User::LeaveIfError(KErrCorrupt);
     
@@ -660,9 +709,23 @@
     else
         User::LeaveIfError(KErrCorrupt);
     
-    iMessage->EndOfMessageL(endType);
-    iConnection.ParseStatusL( iMessage, KErrNone);
-    iMessage = NULL;
+    if ( !iMessage->IsTransmissionTerminated() )
+        {
+        MSRPLOG2( "CMSRPMsgParser::HandleEndofEndLineL instance = %d", iMessage )
+        iMessage->EndOfMessageL( endType );
+        TInt status = iConnection.ParseStatusL( iMessage, KErrNone );
+        if ( endType == MMSRPMessageHandler::EMessageContinues &&
+            status == MMSRPParserObserver::EParseStatusMessageHandled ) 
+            {
+            iIncomingMessageChunks.AppendL( iMessage );
+            }
+        else if ( status == MMSRPParserObserver::EParseStatusError )
+            {
+            delete iMessage;
+            iMessage = NULL;
+            }
+        iMessage = NULL;
+        }
         
     iState = ETitleLine;
     MSRPLOG( "CMSRPMsgParser::HandleEndofEndLineL exit" )    
@@ -709,7 +772,6 @@
     return EFullMatch;    
     }
 
-
 //test cases
 //shyamprasad, prasad, xyz, add, dan, shyamprasad
 //pr, prasad