Msrp/MsrpServer/src/CMSRPMsgParser.cpp
branchMSRP_FrameWork
changeset 58 cdb720e67852
parent 25 505ad3f0ce5c
child 60 7634585a4347
equal deleted inserted replaced
25:505ad3f0ce5c 58:cdb720e67852
    18 
    18 
    19 // CLASS HEADER
    19 // CLASS HEADER
    20 #include "CMSRPMsgParser.h"
    20 #include "CMSRPMsgParser.h"
    21 #include "MSRPCommon.h"
    21 #include "MSRPCommon.h"
    22 
    22 
       
    23 #include "CMSRPMessage.h"
       
    24 #include "CMSRPToPathHeader.h"
       
    25 
    23 // -----------------------------------------------------------------------------
    26 // -----------------------------------------------------------------------------
    24 // CMSRPMsgParser::NewL
    27 // CMSRPMsgParser::NewL
    25 // Static constructor
    28 // Static constructor
    26 // -----------------------------------------------------------------------------
    29 // -----------------------------------------------------------------------------
    27 //
    30 //
    58     delete iLocalBuf;
    61     delete iLocalBuf;
    59     delete iEndToken;
    62     delete iEndToken;
    60     delete iMessage;
    63     delete iMessage;
    61     iParseBuffers.ResetAndDestroy();
    64     iParseBuffers.ResetAndDestroy();
    62     iParseBuffers.Close();    
    65     iParseBuffers.Close();    
       
    66     iIncomingMessageChunks.ResetAndDestroy();
       
    67     iIncomingMessageChunks.Close();
    63     MSRPLOG( "CMSRPMsgParser::~CMSRPMsgParser exit" )
    68     MSRPLOG( "CMSRPMsgParser::~CMSRPMsgParser exit" )
    64     }
    69     }
    65 
    70 
    66 // -----------------------------------------------------------------------------
    71 // -----------------------------------------------------------------------------
    67 // CMSRPMsgParser::ConstructL
    72 // CMSRPMsgParser::ConstructL
    84 //
    89 //
    85 TBool CMSRPMsgParser::ParseL()
    90 TBool CMSRPMsgParser::ParseL()
    86     {
    91     {
    87     TMatchType match = EFullMatch;
    92     TMatchType match = EFullMatch;
    88     TBool ret = TRUE;
    93     TBool ret = TRUE;
       
    94     iByteRangeHeaderFound = EFalse;
    89 
    95 
    90     /*parse until a parse element spans buffers. 
    96     /*parse until a parse element spans buffers. 
    91       if parse element completes exactly at buffer boundaries,
    97       if parse element completes exactly at buffer boundaries,
    92       might end up parsing greater than bufsize+1_element in one runl. 
    98       might end up parsing greater than bufsize+1_element in one runl. 
    93       to avoid, use transitioned flag (set in handle full match)*/
    99       to avoid, use transitioned flag (set in handle full match)*/
   105         if (iState == EBody)
   111         if (iState == EBody)
   106             {
   112             {
   107             token.Set(iEndToken->Des());                
   113             token.Set(iEndToken->Des());                
   108             }   
   114             }   
   109         
   115         
   110         TInt matchPos;
   116         TInt matchPos( 0 );
   111         match = FindToken(iParseBuffers[0]->Ptr(),token,matchPos);    
   117         match = FindToken(iParseBuffers[0]->Ptr(),token,matchPos);    
   112         if(match == EFullMatch)
   118         if(match == EFullMatch)
   113             {
   119             {
   114             ret = HandleFullMatchL(token, matchPos);
   120             ret = HandleFullMatchL(token, matchPos);
   115             }
   121             }
   328 // -----------------------------------------------------------------------------
   334 // -----------------------------------------------------------------------------
   329 //
   335 //
   330 void CMSRPMsgParser::HandleTitleLineL(const TDesC8& aString, TInt /*aMatchPos*/)
   336 void CMSRPMsgParser::HandleTitleLineL(const TDesC8& aString, TInt /*aMatchPos*/)
   331     {
   337     {
   332     MSRPLOG( "CMSRPMsgParser::HandleTitleLineL enter" )
   338     MSRPLOG( "CMSRPMsgParser::HandleTitleLineL enter" )
       
   339     
   333     TPtrC8 msrp(aString.Left(KMSRP().Length()));
   340     TPtrC8 msrp(aString.Left(KMSRP().Length()));
   334     if(msrp.Compare(KMSRP()))
   341     if(msrp.Compare(KMSRP()))
   335         User::LeaveIfError(KErrCorrupt);
   342         User::LeaveIfError(KErrCorrupt);
   336     if(aString[KMSRP().Length()] != ' ')
   343     if(aString[KMSRP().Length()] != ' ')
   337         User::LeaveIfError(KErrCorrupt);
   344         User::LeaveIfError(KErrCorrupt);
   360         if(pos == KErrNotFound)
   367         if(pos == KErrNotFound)
   361             User::LeaveIfError(KErrCorrupt);
   368             User::LeaveIfError(KErrCorrupt);
   362         
   369         
   363         method.Set(method.Left(pos));
   370         method.Set(method.Left(pos));
   364                 
   371                 
       
   372         delete iMessage;
       
   373         iMessage = NULL;
   365          if (!method.Compare(KMSRPSend()))
   374          if (!method.Compare(KMSRPSend()))
   366              {
   375              {
   367              iMessage = CMSRPMessageHandler::NewL(MMSRPIncomingMessage::EMSRPMessage);
   376              iMessage = CMSRPMessageHandler::NewL(MMSRPIncomingMessage::EMSRPMessage);
       
   377              MSRPLOG2( "CMSRPMsgParser::HandleTitleLineL new message = %d", iMessage )
   368              }
   378              }
   369          else if (!method.Compare(KMSRPReport()))
   379          else if ( !method.Compare( KMSRPReport() ) )
   370              {
   380              {
   371              iMessage = CMSRPMessageHandler::NewL(MMSRPIncomingMessage::EMSRPReport);
   381              iMessage = CMSRPMessageHandler::NewL( MMSRPIncomingMessage::EMSRPReport );
       
   382              MSRPLOG2( "CMSRPMsgParser::HandleTitleLineL new report = %d", iMessage )
   372              }
   383              }
   373          else //extn
   384          else //extn
   374              {
   385              {
   375              iMessage = CMSRPMessageHandler::NewL(MMSRPIncomingMessage::EMSRPNotDefined);
   386              iMessage = CMSRPMessageHandler::NewL(MMSRPIncomingMessage::EMSRPNotDefined);
       
   387              MSRPLOG2( "CMSRPMsgParser::HandleTitleLineL new not defined = %d", iMessage )
   376              }        
   388              }        
   377         }
   389         }
   378     else //response
   390     else //response
   379         {
   391         {
   380         TPtrC8 null;
   392         TPtrC8 null;
   381         method.Set(method.Left(pos));
   393         method.Set(method.Left(pos));
       
   394         delete iMessage;
       
   395         iMessage = NULL;
   382         iMessage = CMSRPMessageHandler::NewL(MMSRPIncomingMessage::EMSRPResponse);
   396         iMessage = CMSRPMessageHandler::NewL(MMSRPIncomingMessage::EMSRPResponse);
       
   397         MSRPLOG2( "CMSRPMsgParser::HandleTitleLineL new response = %d", iMessage )
   383         iMessage->SetStatusOfResponseL(method, null);
   398         iMessage->SetStatusOfResponseL(method, null);
   384         }    
   399         }    
   385     iMessage->SetTransactionId(trans_id);
   400     iMessage->SetTransactionId(trans_id);
   386     iState = EToPath;    
   401     iState = EToPath;    
   387     MSRPLOG( "CMSRPMsgParser::HandleTitleLineL exit" )
   402     MSRPLOG( "CMSRPMsgParser::HandleTitleLineL exit" )
   524             {            
   539             {            
   525             headerType = MMSRPMessageHandler::EMessageId;
   540             headerType = MMSRPMessageHandler::EMessageId;
   526             }
   541             }
   527         else if(!header_name.Compare(KMSRPByteRange()))
   542         else if(!header_name.Compare(KMSRPByteRange()))
   528             {
   543             {
       
   544             iByteRangeHeaderFound = ETrue;
   529             headerType = MMSRPMessageHandler::EByteRange;
   545             headerType = MMSRPMessageHandler::EByteRange;
   530             }
   546             }
   531         else if(!header_name.Compare(KMSRPSuccessReport()))
   547         else if(!header_name.Compare(KMSRPSuccessReport()))
   532             {
   548             {
   533             headerType = MMSRPMessageHandler::ESuccessReport;
   549             headerType = MMSRPMessageHandler::ESuccessReport;
   548         }      
   564         }      
   549     
   565     
   550     //message->add_header
   566     //message->add_header
   551     TPtrC8 fullHeader(aString);
   567     TPtrC8 fullHeader(aString);
   552     iMessage->AddHeaderL(headerType, header_val, fullHeader);
   568     iMessage->AddHeaderL(headerType, header_val, fullHeader);
       
   569     if ( headerType == MMSRPMessageHandler::EMessageId )
       
   570         {
       
   571         // let's check if this message chunk belong to one
       
   572         // of the chunks already received. If so, combine
       
   573         // the messages
       
   574         CheckMessageChunkL( );
       
   575         }
   553     //TODO: //only for to-path from-path add_header error
   576     //TODO: //only for to-path from-path add_header error
   554     //switch iState = EBody, mode = EError //essentially start looking for end token
   577     //switch iState = EBody, mode = EError //essentially start looking for end token
   555     //if mode is error don't issue callbacks, on transition from EndofEndLine,
   578     //if mode is error don't issue callbacks, on transition from EndofEndLine,
   556     //delete message and switch to normal mode
   579     //delete message and switch to normal mode
   557     
   580     
   558     MSRPLOG( "CMSRPMsgParser::HandleHeaderL exit" )
   581     MSRPLOG( "CMSRPMsgParser::HandleHeaderL exit" )
   559         
   582         
   560     }
   583     }
       
   584     
       
   585 // -----------------------------------------------------------------------------
       
   586 // CMSRPMsgParser::HandleOptionalHeaderL
       
   587 // -----------------------------------------------------------------------------
       
   588 //
       
   589 void CMSRPMsgParser::CheckMessageChunkL( )
       
   590     {
       
   591     MSRPLOG( "-> CMSRPMsgParser::HandleHeaderL" )
       
   592     for ( TInt i = 0; i < iIncomingMessageChunks.Count(); i++ )
       
   593         {
       
   594         if ( iMessage->CheckMessageChunkL( *iIncomingMessageChunks[ i ] ) )
       
   595             {
       
   596             delete iMessage;
       
   597             iMessage = iIncomingMessageChunks[ i ];
       
   598             iIncomingMessageChunks.Remove( i );
       
   599             break;
       
   600             }
       
   601         }
       
   602     MSRPLOG( "<- CMSRPMsgParser::HandleHeaderL" )
       
   603     }
   561 
   604 
   562 // -----------------------------------------------------------------------------
   605 // -----------------------------------------------------------------------------
   563 // CMSRPMsgParser::HandleOptionalHeaderL
   606 // CMSRPMsgParser::HandleOptionalHeaderL
   564 // -----------------------------------------------------------------------------
   607 // -----------------------------------------------------------------------------
   565 //
   608 //
   605      //   return;
   648      //   return;
   606     
   649     
   607     if(aMatchPos!=0)
   650     if(aMatchPos!=0)
   608         {
   651         {
   609         TPtrC8 content(aString.Left(aMatchPos));
   652         TPtrC8 content(aString.Left(aMatchPos));
   610         iMessage->AddContentL(content);       
   653         if ( !iMessage->IsTransmissionTerminated() )
       
   654             {
       
   655             MSRPLOG2( "CMSRPMsgParser::HandleBodyL instance = %d", iMessage )
       
   656             iMessage->AddContentL( content, iByteRangeHeaderFound ); 
       
   657             iConnection.ReportReceiveprogressL( iMessage );
       
   658             }
   611         }
   659         }
   612 
   660 
   613     //partial or full match
   661     //partial or full match
   614     if(token.Length())
   662     if(token.Length())
   615         {   
   663         {   
       
   664         MSRPLOG( "CMSRPMsgParser::HandleBodyL enter partial/token" )
   616          
   665          
   617         //if(aMatchPos == 0)
   666         //if(aMatchPos == 0)
   618             {
   667             {
   619             //TPtrC8 firstPart = (*iEndToken).Left(token.Length());
   668             //TPtrC8 firstPart = (*iEndToken).Left(token.Length());
   620             TPtrC8 lastPart = (*iEndToken).Right(token.Length());
   669             TPtrC8 lastPart = (*iEndToken).Right(token.Length());
   644 // CMSRPMsgParser::HandleEndofEndLineL
   693 // CMSRPMsgParser::HandleEndofEndLineL
   645 // -----------------------------------------------------------------------------
   694 // -----------------------------------------------------------------------------
   646 //
   695 //
   647 void CMSRPMsgParser::HandleEndofEndLineL(const TDesC8& aString, TInt aMatchPos)
   696 void CMSRPMsgParser::HandleEndofEndLineL(const TDesC8& aString, TInt aMatchPos)
   648     {
   697     {
   649     MSRPLOG( "CMSRPMsgParser::HandleEndofEndLineL enter" )
   698     MSRPLOG2( "CMSRPMsgParser::HandleEndofEndLineL enter, char = %d", aString[0] )
   650     if(aMatchPos != 1)
   699     if(aMatchPos != 1)
   651         User::LeaveIfError(KErrCorrupt);
   700         User::LeaveIfError(KErrCorrupt);
   652     
   701     
   653     MMSRPMessageHandler::TMsrpMsgEndStatus endType = MMSRPMessageHandler::EMessageEnd;  
   702     MMSRPMessageHandler::TMsrpMsgEndStatus endType = MMSRPMessageHandler::EMessageEnd;  
   654     if(aString[0] == MSRP_END)
   703     if(aString[0] == MSRP_END)
   658     else if (aString[0] == MSRP_TERMINATE)
   707     else if (aString[0] == MSRP_TERMINATE)
   659         endType = MMSRPMessageHandler::EMessageTerminated;
   708         endType = MMSRPMessageHandler::EMessageTerminated;
   660     else
   709     else
   661         User::LeaveIfError(KErrCorrupt);
   710         User::LeaveIfError(KErrCorrupt);
   662     
   711     
   663     iMessage->EndOfMessageL(endType);
   712     if ( !iMessage->IsTransmissionTerminated() )
   664     iConnection.ParseStatusL( iMessage, KErrNone);
   713         {
   665     iMessage = NULL;
   714         MSRPLOG2( "CMSRPMsgParser::HandleEndofEndLineL instance = %d", iMessage )
       
   715         iMessage->EndOfMessageL( endType );
       
   716         TInt status = iConnection.ParseStatusL( iMessage, KErrNone );
       
   717         if ( endType == MMSRPMessageHandler::EMessageContinues &&
       
   718             status == MMSRPParserObserver::EParseStatusMessageHandled ) 
       
   719             {
       
   720             iIncomingMessageChunks.AppendL( iMessage );
       
   721             }
       
   722         else if ( status == MMSRPParserObserver::EParseStatusError )
       
   723             {
       
   724             delete iMessage;
       
   725             iMessage = NULL;
       
   726             }
       
   727         iMessage = NULL;
       
   728         }
   666         
   729         
   667     iState = ETitleLine;
   730     iState = ETitleLine;
   668     MSRPLOG( "CMSRPMsgParser::HandleEndofEndLineL exit" )    
   731     MSRPLOG( "CMSRPMsgParser::HandleEndofEndLineL exit" )    
   669     }
   732     }
   670 
   733 
   706         return ret;
   769         return ret;
   707         }    
   770         }    
   708     MSRPLOG( "CMSRPMsgParser::FindToken exit" )
   771     MSRPLOG( "CMSRPMsgParser::FindToken exit" )
   709     return EFullMatch;    
   772     return EFullMatch;    
   710     }
   773     }
   711 
       
   712 
   774 
   713 //test cases
   775 //test cases
   714 //shyamprasad, prasad, xyz, add, dan, shyamprasad
   776 //shyamprasad, prasad, xyz, add, dan, shyamprasad
   715 //pr, prasad
   777 //pr, prasad
   716 
   778