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 |