339 MSRPLOG2("Message Type = %d", iActiveMsgType ); |
392 MSRPLOG2("Message Type = %d", iActiveMsgType ); |
340 return iActiveMsgType; |
393 return iActiveMsgType; |
341 } |
394 } |
342 |
395 |
343 |
396 |
344 CMSRPMessage* CMSRPMessageHandler::GetIncomingMessage( ) |
397 CMSRPMessage* CMSRPMessageHandler::GetIncomingMessage( ) const |
345 { |
398 { |
346 MSRPLOG( "CMSRPMessageHandler::GetIncomingMessage enter" ) |
399 MSRPLOG( "CMSRPMessageHandler::GetIncomingMessage enter" ) |
347 if( iMessage ) |
400 return iMessage; |
348 { |
401 } |
349 return iMessage; |
402 |
350 } |
403 void CMSRPMessageHandler::SendResponseL( MMSRPMessageObserver* aMessageObserver, |
351 return NULL; |
|
352 } |
|
353 |
|
354 |
|
355 void CMSRPMessageHandler::UpdateResponseStateL(CMSRPMessageHandler *incomingMsgHandler) |
|
356 { |
|
357 MSRPLOG( "CMSRPMessageHandler::UpdateResponseState enter" ) |
|
358 TBuf8<100> iTransactionId = incomingMsgHandler->TransactionId(); |
|
359 for(TInt i=0;i<iChunkList.Count();i++) |
|
360 { |
|
361 if(iTransactionId == iChunkList[i]->GetTransactionId()) |
|
362 { |
|
363 iChunkList[i]->SetResponseSent(ETrue); |
|
364 ReceiveFileStateL(iChunkList[i]->GetEndPos()- iChunkList[i]->GetStartPos() + 1); |
|
365 } |
|
366 } |
|
367 MSRPLOG( "CMSRPMessageHandler::UpdateResponseState exit" ) |
|
368 } |
|
369 |
|
370 |
|
371 void CMSRPMessageHandler::ReceiveFileStateL( TInt aBytesTransferred ) |
|
372 { |
|
373 MSRPLOG( "CMSRPMessageHandler::ReceiveFileState enter" ) |
|
374 MSRPLOG2( "CMSRPMessageHandler::ReceiveFileState Notify %d", iProgress ) |
|
375 MSRPLOG2( "CMSRPMessageHandler::ReceiveFileState iFileNotified %d", iNotifiedBytes ) |
|
376 MSRPLOG2( "CMSRPMessageHandler::ReceiveFileState iunnotified %d", iPendingBytes ) |
|
377 MSRPLOG2( "CMSRPMessageHandler::ReceiveFileState aBytesTransferred %d", aBytesTransferred ) |
|
378 MSRPLOG2( "CMSRPMessageHandler::ReceiveFileState iFileSize %d", iFileSize ) |
|
379 |
|
380 iPendingBytes += aBytesTransferred; |
|
381 |
|
382 if(iNotifiedBytes + iPendingBytes == iFileSize) |
|
383 { |
|
384 iFileTransferComplete = ETrue; |
|
385 } |
|
386 |
|
387 if(iPendingBytes >= KMaxChunkReadSize) |
|
388 { |
|
389 MSRPLOG( "CMSRPMessageHandler::ReceiveFileState unnotified exceeds threshold" ) |
|
390 MSRPLOG2( "CMSRPMessageHandler::ReceiveFileState iFileReceiveComplete: %d", iFileTransferComplete ) |
|
391 |
|
392 iNotifiedBytes += iPendingBytes; |
|
393 iPendingBytes = 0; |
|
394 //notify client of progress |
|
395 if(iProgress && !iFileTransferComplete) |
|
396 iMSRPMessageObserver->MessageReceiveProgressL(iNotifiedBytes, iFileSize); |
|
397 } |
|
398 |
|
399 MSRPLOG( "CMSRPMessageHandler::ReceiveFileState exit" ) |
|
400 } |
|
401 |
|
402 |
|
403 TBool CMSRPMessageHandler::SendResponseL( MMSRPMessageObserver* aMessageObserver, |
|
404 MMSRPConnection& aConnection, TUint aResponseCode ) |
404 MMSRPConnection& aConnection, TUint aResponseCode ) |
405 { |
405 { |
406 MSRPLOG( "CMSRPMessageHandler::SendResponseL enter" ) |
406 MSRPLOG( "CMSRPMessageHandler::SendResponseL enter" ) |
407 |
407 |
408 iMSRPMessageObserver = aMessageObserver; |
408 iMSRPMessageObserver = aMessageObserver; |
443 iResponse->SetToPathHeader( CMSRPToPathHeader::DecodeL( *fromPathValue ) ); |
443 iResponse->SetToPathHeader( CMSRPToPathHeader::DecodeL( *fromPathValue ) ); |
444 CleanupStack::PopAndDestroy(fromPathValue); |
444 CleanupStack::PopAndDestroy(fromPathValue); |
445 |
445 |
446 HBufC8* toPathValue = iMessage->ToPathHeader()->ToTextValueLC(); |
446 HBufC8* toPathValue = iMessage->ToPathHeader()->ToTextValueLC(); |
447 iResponse->SetFromPathHeader( CMSRPFromPathHeader::DecodeL( *toPathValue ) ); |
447 iResponse->SetFromPathHeader( CMSRPFromPathHeader::DecodeL( *toPathValue ) ); |
448 CleanupStack::PopAndDestroy(toPathValue); |
448 CleanupStack::PopAndDestroy(toPathValue); |
449 |
449 |
450 iActiveMsgType = EMSRPResponse; |
450 iActiveMsgType = EMSRPResponse; |
|
451 iState = EIdle; |
451 aConnection.SendL( *this ); |
452 aConnection.SendL( *this ); |
452 } |
453 } |
453 |
454 |
454 MSRPLOG( "CMSRPMessageHandler::SendResponseL exit" ) |
455 MSRPLOG( "CMSRPMessageHandler::SendResponseL exit" ) |
455 |
456 } |
456 if( aResponseCode == CMSRPResponse::EAllOk ) |
457 |
457 return ETrue; |
458 TBool CMSRPMessageHandler::SendReportL( |
458 else |
459 MMSRPMessageObserver* aMessageObserver, |
459 return EFalse; |
460 MMSRPConnection& aConnection, TUint aStatusCode ) |
460 } |
461 { |
461 |
462 MSRPLOG( "CMSRPMessageHandler::SendReportL enter" ) |
462 |
463 |
463 TBool CMSRPMessageHandler::IfResponseReqL() |
464 TBool sendReport = EFalse; |
464 { |
465 if ( iActiveMsgType == EMSRPResponse ) |
465 TBool responseReq = ETrue; |
466 { |
466 if( iMessage->FailureReportHeader() ) |
467 // currently sending a response |
467 { |
468 MSRPLOG( "CMSRPMessageHandler::SendReportL sendin a response..." ) |
468 HBufC8* frHeaderValue = iMessage->FailureReportHeader()->ToTextValueLC(); |
469 return sendReport; |
469 if( frHeaderValue->Des() == MSRPStrings::StringF( MSRPStrConsts::ENo ).DesC() ) |
470 } |
470 { |
471 iMSRPMessageObserver = aMessageObserver; |
471 responseReq = EFalse; |
472 if( iMessage->SuccessReportHeader() ) |
472 } |
473 { |
473 else if( (frHeaderValue->Des() == MSRPStrings::StringF( MSRPStrConsts::EPartial ).DesC())) |
474 HBufC8* successHeaderValue = iMessage->SuccessReportHeader()->ToTextValueLC(); |
474 { |
475 if( successHeaderValue->Des() == MSRPStrings::StringF( MSRPStrConsts::EYes ).DesC() ) |
475 responseReq = EFalse; |
476 { |
476 } |
477 MSRPLOG( "CMSRPMessageHandler::SendReportL report needed!" ) |
477 CleanupStack::PopAndDestroy(frHeaderValue); |
478 sendReport = ETrue; |
478 } |
479 } |
479 return responseReq; |
480 CleanupStack::PopAndDestroy( successHeaderValue ); |
480 } |
481 } |
481 |
482 |
|
483 if ( sendReport ) |
|
484 { |
|
485 iReport = new ( ELeave ) CMSRPReport( ) ; |
|
486 iReport->SetStatusHeader( CMSRPStatusHeader::NewL( aStatusCode ) ); |
|
487 |
|
488 HBufC8* fromPathValue = iMessage->FromPathHeader()->ToTextValueLC(); |
|
489 iReport->SetToPathHeader( CMSRPToPathHeader::DecodeL( *fromPathValue ) ); |
|
490 CleanupStack::PopAndDestroy(fromPathValue); |
|
491 |
|
492 HBufC8* toPathValue = iMessage->ToPathHeader()->ToTextValueLC(); |
|
493 iReport->SetFromPathHeader( CMSRPFromPathHeader::DecodeL( *toPathValue ) ); |
|
494 CleanupStack::PopAndDestroy(toPathValue); |
|
495 |
|
496 HBufC8* messageId = iMessage->MessageIdHeader()->ToTextValueLC(); |
|
497 iReport->SetMessageIdHeader( CMSRPMessageIdHeader::NewL( *messageId ) ); |
|
498 CleanupStack::PopAndDestroy( messageId ); |
|
499 |
|
500 TInt size( 0 ); |
|
501 if ( iTempFileName.Length() ) |
|
502 { |
|
503 OpenTemporaryFileL( iTempFileName ); |
|
504 iTempFile->Size( size ); |
|
505 } |
|
506 else |
|
507 { |
|
508 size = iBuffer.Length(); |
|
509 } |
|
510 CMSRPByteRangeHeader* byteRange = |
|
511 CMSRPByteRangeHeader::NewL( 1, size, size ); |
|
512 iReport->SetByteRangeHeader( byteRange ); |
|
513 |
|
514 iActiveMsgType = EMSRPReport; |
|
515 iState = EIdle; |
|
516 aConnection.SendL( *this ); |
|
517 } |
|
518 MSRPLOG( "CMSRPMessageHandler::SendReportL exit" ) |
|
519 return sendReport; |
|
520 } |
482 |
521 |
483 TDesC8& CMSRPMessageHandler::TransactionId( ) |
522 TDesC8& CMSRPMessageHandler::TransactionId( ) |
484 { |
523 { |
485 MSRPLOG( "CMSRPMessageHandler::TransactionId enter" ) |
524 MSRPLOG( "CMSRPMessageHandler::TransactionId enter" ) |
486 return iTransactionId; |
525 return *iSentChunks[ iSentChunks.Count() - 1 ]; |
487 } |
526 } |
488 |
527 |
489 |
528 |
490 CMSRPResponse* CMSRPMessageHandler::GetIncomingResponse( ) |
529 CMSRPResponse* CMSRPMessageHandler::GetIncomingResponse( ) const |
491 { |
530 { |
492 MSRPLOG( "CMSRPMessageHandler::GetIncomingResponse enter" ) |
531 MSRPLOG( "CMSRPMessageHandler::GetIncomingResponse enter" ) |
493 if( iResponse ) |
532 return iResponse; |
494 { |
533 } |
495 return iResponse; |
534 |
496 } |
535 CMSRPReport* CMSRPMessageHandler::GetIncomingReport( ) const |
497 return NULL; |
536 { |
498 } |
537 MSRPLOG( "-> CMSRPMessageHandler::GetIncomingReport" ) |
499 |
538 return iReport; |
|
539 } |
500 |
540 |
501 void CMSRPMessageHandler::SendMessageL( MMSRPConnection& aConnection ) |
541 void CMSRPMessageHandler::SendMessageL( MMSRPConnection& aConnection ) |
502 { |
542 { |
503 MSRPLOG( "CMSRPMessageHandler::SendMessageL enter" ) |
543 MSRPLOG( "CMSRPMessageHandler::SendMessageL enter" ) |
504 iActiveMsgType = EMSRPMessage; |
544 iActiveMsgType = EMSRPMessage; |
|
545 isSending = ETrue; |
|
546 if ( iMessage->IsFile() ) |
|
547 { |
|
548 User::LeaveIfError(iFile.Open(iFs, iMessage->GetFileName(), EFileShareReadersOrWriters)); |
|
549 iFile.Size(iFileSize); |
|
550 iFileBuffer = HBufC8::NewL(KMaxChunkReadSize); |
|
551 FillFileBufferL(); |
|
552 } |
|
553 else |
|
554 { |
|
555 iContentPtr.Set( iMessage->Content() ); |
|
556 } |
|
557 |
505 aConnection.SendL( *this ); |
558 aConnection.SendL( *this ); |
506 MSRPLOG( "CMSRPMessageHandler::SendMessageL exit" ) |
559 MSRPLOG( "CMSRPMessageHandler::SendMessageL exit" ) |
507 } |
560 } |
508 |
561 |
509 |
562 TBool CMSRPMessageHandler::IsOwnerOfResponse( MMSRPIncomingMessage& aIncomingMessage ) |
510 void CMSRPMessageHandler::SendFileL(MMSRPConnection& aConnection) |
563 { |
511 { |
564 MSRPLOG2( "CMSRPMessageHandler::IsOwnerOfResponse enter =%d", this ) |
512 MSRPLOG( "CMSRPMessageHandler::SendFileL enter" ) |
565 for ( TInt i = 0; i < iSentChunks.Count(); i++ ) |
513 /* Flags */ |
566 { |
514 isFile = ETrue; |
567 if( aIncomingMessage.TransactionId() == *iSentChunks[ i ] ) |
515 iProgress = iMessage->GetNotifyProgress(); |
568 { |
516 |
569 MSRPLOG( "CMSRPMessageHandler::IsOwnerOfResponse enter, yes" ) |
517 User::LeaveIfError(iFs.Connect()); |
570 iResponseNeeded = EFalse; |
518 User::LeaveIfError(iFile.Open(iFs, iMessage->GetFileName(), EFileShareReadersOrWriters)); |
571 return ETrue; |
519 iFile.Size(iFileSize); |
572 } |
520 iFileBuffer = HBufC8::NewL(KMaxChunkReadSize); |
573 } |
521 FillFileBufferL(); |
574 |
522 iActiveMsgType = EMSRPMessage; |
575 MSRPLOG( "CMSRPMessageHandler::IsOwnerOfResponse exit" ) |
523 aConnection.SendL( *this ); |
576 return EFalse; |
524 |
577 } |
525 MSRPLOG( "CMSRPMessageHandler::SendFileL exit" ) |
|
526 } |
|
527 |
|
528 |
578 |
529 TInt CMSRPMessageHandler::FillFileBufferL() |
579 TInt CMSRPMessageHandler::FillFileBufferL() |
530 { |
580 { |
531 MSRPLOG( "CMSRPMessageHandler::FillFileBufferL enter" ) |
581 MSRPLOG( "CMSRPMessageHandler::FillFileBufferL enter" ) |
532 iStartPosInBuffer = 0; |
582 iStartPosInBuffer = 0; |
538 MSRPLOG2( "CMSRPMessageHandler::FillFileBufferL File Buffer Length %d", iFileBuffer->Length()); |
588 MSRPLOG2( "CMSRPMessageHandler::FillFileBufferL File Buffer Length %d", iFileBuffer->Length()); |
539 MSRPLOG( "CMSRPMessageHandler::FillFileBufferL exit" ) |
589 MSRPLOG( "CMSRPMessageHandler::FillFileBufferL exit" ) |
540 return iFileBuffer->Length(); |
590 return iFileBuffer->Length(); |
541 } |
591 } |
542 |
592 |
543 |
593 void CMSRPMessageHandler::TerminateReceiving( |
544 void CMSRPMessageHandler::ReceiveFileL( ) |
594 MMSRPMessageObserver* aMessageObserver, |
545 { |
595 MMSRPConnection& aConnection ) |
546 MSRPLOG( "CMSRPMessageHandler::ReceiveFileL enter" ) |
596 { |
547 isFile = ETrue; |
597 MSRPLOG( "CMSRPMessageHandler::SetFSTerminate" ) |
548 iProgress = iMessage->GetNotifyProgress(); |
598 iTerminateReceiving = ETrue; |
549 |
599 |
550 User::LeaveIfError(iFs.Connect()); |
600 SendResponseL( aMessageObserver, aConnection, EStopSending ); |
551 User::LeaveIfError(iFile.Replace(iFs,iMessage->GetFileName(),EFileWrite)); |
601 } |
552 iFileSize = iMessage->GetFileSize(); |
602 |
553 iFileBuffer = HBufC8::NewL(KMaxChunkReadSize); |
603 void CMSRPMessageHandler::TerminateSending() |
554 |
604 { |
555 MSRPLOG( "CMSRPMessageHandler::ReceiveFileL exit" ) |
605 MSRPLOG( "CMSRPMessageHandler::SetFSTerminate" ) |
556 } |
606 iTerminateSending = ETrue; |
557 |
607 } |
558 |
608 |
559 void CMSRPMessageHandler::WritetoFileL(CMSRPMessageHandler *incomingMsgHandler ) |
609 TBool CMSRPMessageHandler::IsTransmissionTerminated( ) |
560 { |
610 { |
561 MSRPLOG( "CMSRPMessageHandler::WriteToFile enter" ) |
611 MSRPLOG3("-> CMSRPMessageHandler::IsTransmissionTerminated, %d and %d", iTerminateReceiving, iTerminateSending ) |
562 CMSRPMessage* inFileChunk = incomingMsgHandler->GetIncomingMessage(); |
612 if ( iTerminateReceiving || iTerminateSending ) |
563 HBufC8* messageContent = NULL; |
613 { |
564 if(inFileChunk->IsContent()) |
614 return ETrue; |
565 { |
615 } |
566 messageContent = HBufC8::NewL(inFileChunk->Content().Length()); |
616 |
567 *messageContent = inFileChunk->Content(); |
617 return EFalse; |
568 WriteChunkToFileL(*messageContent,incomingMsgHandler->TransactionId()); |
618 } |
569 |
619 |
570 if (!incomingMsgHandler->IfResponseReqL()) |
620 TBool CMSRPMessageHandler::IsReportNeeded( ) |
571 ReceiveFileStateL(messageContent->Length()); |
621 { |
572 } |
622 if( iMessage->SuccessReportHeader() ) |
573 delete messageContent; |
623 { |
574 MSRPLOG( "CMSRPMessageHandler::WriteToFile exit" ) |
624 HBufC8* successHeaderValue = iMessage->SuccessReportHeader()->ToTextValueLC(); |
575 } |
625 if( successHeaderValue->Des() == MSRPStrings::StringF( MSRPStrConsts::EYes ).DesC() ) |
576 |
626 { |
577 |
627 CleanupStack::PopAndDestroy( successHeaderValue ); |
578 void CMSRPMessageHandler::WriteChunkToFileL(const TDesC8& aFileChunk ,TDesC8& aTransactionId) |
|
579 { |
|
580 MSRPLOG( "CMSRPMessageHandler::WriteChunktoFile enter" ) |
|
581 if(iBufPosInFile<(iFileSize-1)) |
|
582 { |
|
583 iFile.Write(iBufPosInFile,aFileChunk); |
|
584 |
|
585 /* Create and update the structure */ |
|
586 CMSRPMessageChunkState* iChunk = CMSRPMessageChunkState::NewL( ); |
|
587 iChunk->SetStartPos(iBufPosInFile); |
|
588 iBufPosInFile += aFileChunk.Length(); |
|
589 iChunk->SetEndPos(iBufPosInFile-1); |
|
590 iChunk->SetTransactionId(aTransactionId); |
|
591 iChunkList.Append(iChunk); |
|
592 } |
|
593 else |
|
594 { |
|
595 //Receive Bytes greater than file Size |
|
596 User::Leave( KErrArgument ); |
|
597 } |
|
598 |
|
599 MSRPLOG( "CMSRPMessageHandler::WriteChunktoFile exit" ) |
|
600 |
|
601 } |
|
602 |
|
603 |
|
604 TBool CMSRPMessageHandler::IsOwnerOfResponse( MMSRPIncomingMessage& aIncomingMessage ) |
|
605 { |
|
606 MSRPLOG( "CMSRPMessageHandler::IsOwnerOfResponse enter" ) |
|
607 if(isFile) |
|
608 { |
|
609 /* compare for transaction id */ |
|
610 for(TInt i=0;i<iChunkList.Count();i++) |
|
611 { |
|
612 if(aIncomingMessage.TransactionId() == iChunkList[i]->GetTransactionId()) |
|
613 { |
|
614 if( iState == EWaitingForResponse || ( iState == EMessageSent && iResponseNeeded )) |
|
615 { |
|
616 if (i == iChunkList.Count()-1) |
|
617 { |
|
618 iResponseNeeded = EFalse; |
|
619 iState = EMessageDone; |
|
620 } |
|
621 } |
|
622 return ETrue; |
|
623 } |
|
624 } |
|
625 } |
|
626 if( aIncomingMessage.TransactionId() == iTransactionId ) |
|
627 { |
|
628 if( iState == EWaitingForResponse || ( iState == EMessageSent && iResponseNeeded )) |
|
629 { |
|
630 iResponseNeeded = EFalse; |
|
631 return ETrue; |
628 return ETrue; |
632 } |
629 } |
633 } |
630 CleanupStack::PopAndDestroy( successHeaderValue ); |
634 |
631 } |
635 MSRPLOG( "CMSRPMessageHandler::IsOwnerOfResponse exit" ) |
632 |
636 return EFalse; |
633 return EFalse; |
637 } |
634 } |
638 |
635 |
639 |
636 TUint CMSRPMessageHandler::ConsumeResponseL( MMSRPIncomingMessage& aIncomingMessage ) |
640 void CMSRPMessageHandler::ConsumeFileResponseL(MMSRPIncomingMessage& aIncomingMessage ) |
637 { |
641 { |
638 MSRPLOG2( "CMSRPMessageHandler::ConsumeResponseL enter, this = %d", this ) |
642 MSRPLOG( "CMSRPMessageHandler::ConsumeFileResponseL enter" ) |
639 |
|
640 TUint responseCode( EUnknownCode ); |
643 CMSRPResponse* response = aIncomingMessage.GetIncomingResponse(); |
641 CMSRPResponse* response = aIncomingMessage.GetIncomingResponse(); |
644 TUint statusCode = response->StatusCode(); |
642 if ( response ) |
645 |
643 { |
646 for(TInt i=0;i<iChunkList.Count();i++) |
|
647 { |
|
648 if(aIncomingMessage.TransactionId()== iChunkList[i]->GetTransactionId()) |
|
649 { |
|
650 iChunkList[i]->SetResponseReceived(ETrue); |
|
651 SendFileStateL(iChunkList[i]->GetEndPos()- iChunkList[i]->GetStartPos() + 1 ) ; |
|
652 } |
|
653 } |
|
654 |
|
655 MSRPLOG( "CMSRPMessageHandler::ConsumeFileResponseL exit" ) |
|
656 } |
|
657 |
|
658 |
|
659 void CMSRPMessageHandler::SendFileStateL(TInt aBytesTransferred ) |
|
660 { |
|
661 MSRPLOG( "CMSRPMessageHandler::SendFileStateL enter" ) |
|
662 MSRPLOG2( "CMSRPMessageHandler::SendFileStateL granularity %d", iProgress ) |
|
663 MSRPLOG2( "CMSRPMessageHandler::SendFileStateL iFileNotified %d", iNotifiedBytes ) |
|
664 MSRPLOG2( "CMSRPMessageHandler::SendFileStateL iunnotified %d", iPendingBytes ) |
|
665 MSRPLOG2( "CMSRPMessageHandler::SendFileStateL aBytesTransferred %d", aBytesTransferred ) |
|
666 MSRPLOG2( "CMSRPMessageHandler::SendFileStateL iFileSize %d", iFileSize ) |
|
667 |
|
668 iPendingBytes += aBytesTransferred; |
|
669 |
|
670 if(iNotifiedBytes + iPendingBytes == iFileSize) |
|
671 { |
|
672 iFileTransferComplete = ETrue; |
|
673 } |
|
674 |
|
675 if(iPendingBytes >= KMaxChunkReadSize) |
|
676 { |
|
677 MSRPLOG( "CMSRPMessageHandler::SendFileStateL unnotified exceeds threshold" ) |
|
678 MSRPLOG2( "CMSRPMessageHandler::SendFileStateL iFileSendComplete: %d", iFileTransferComplete ) |
|
679 iNotifiedBytes += iPendingBytes; |
|
680 iPendingBytes = 0; |
|
681 |
|
682 //notify client of progress |
|
683 if( iProgress && !iFileTransferComplete )//send progress requested and avoid double notifn. as send complete not handled in waitfor clientstate |
|
684 iMSRPMessageObserver->MessageSendProgressL(iNotifiedBytes, iFileSize);//iByteinPos |
|
685 |
|
686 } |
|
687 MSRPLOG( "CMSRPMessageHandler::SendFileStateL exit" ) |
|
688 } |
|
689 |
|
690 |
|
691 TBool CMSRPMessageHandler::FileTransferComplete( ) |
|
692 { |
|
693 if(iFileTransferComplete) |
|
694 return ETrue; |
|
695 else |
|
696 return EFalse; |
|
697 } |
|
698 |
|
699 |
|
700 TBool CMSRPMessageHandler::IsInFile() |
|
701 { |
|
702 if(isFile) |
|
703 { |
|
704 return ETrue; |
|
705 } |
|
706 return EFalse; |
|
707 } |
|
708 |
|
709 |
|
710 TBool CMSRPMessageHandler::ConsumeResponseL( MMSRPIncomingMessage& aIncomingMessage ) |
|
711 { |
|
712 MSRPLOG( "CMSRPMessageHandler::ConsumeResponseL enter" ) |
|
713 |
|
714 TBool ret; |
|
715 CMSRPResponse* response = aIncomingMessage.GetIncomingResponse(); |
|
716 TUint statusCode = response->StatusCode(); |
|
717 |
|
718 if( iMessage->FailureReportHeader() && |
|
719 (iMessage->FailureReportHeader()->ToTextValueLC()->Des() == |
|
720 MSRPStrings::StringF( MSRPStrConsts::EPartial ).DesC()) && |
|
721 statusCode == CMSRPResponse::EAllOk ) |
|
722 { |
|
723 iState = EMessageDone; |
|
724 ret = EFalse; |
|
725 } |
|
726 else |
|
727 { |
|
728 RStringF statusString = response->ReasonPhrase(); |
644 RStringF statusString = response->ReasonPhrase(); |
729 iResponse = new (ELeave) CMSRPResponse( statusCode, statusString ); |
645 responseCode = response->StatusCode(); |
|
646 delete iResponse; |
|
647 iResponse = NULL; |
|
648 iResponse = new (ELeave) CMSRPResponse( responseCode, statusString ); |
730 HBufC8* toPathValue = response->ToPathHeader()->ToTextValueLC(); |
649 HBufC8* toPathValue = response->ToPathHeader()->ToTextValueLC(); |
731 HBufC8* fromPathValue = response->FromPathHeader()->ToTextValueLC(); |
650 HBufC8* fromPathValue = response->FromPathHeader()->ToTextValueLC(); |
732 iResponse->SetToPathHeader( CMSRPToPathHeader::DecodeL( toPathValue->Des() ) ); |
651 iResponse->SetToPathHeader( CMSRPToPathHeader::DecodeL( toPathValue->Des() ) ); |
733 iResponse->SetFromPathHeader( CMSRPFromPathHeader::DecodeL( fromPathValue->Des() ) ); |
652 iResponse->SetFromPathHeader( CMSRPFromPathHeader::DecodeL( fromPathValue->Des() ) ); |
734 CleanupStack::PopAndDestroy(fromPathValue); |
653 CleanupStack::PopAndDestroy(fromPathValue); |
735 CleanupStack::PopAndDestroy(toPathValue); |
654 CleanupStack::PopAndDestroy(toPathValue); |
|
655 } |
|
656 |
|
657 // removing the transaction id |
|
658 for ( TInt i = 0; i < iSentChunks.Count(); i++ ) |
|
659 { |
|
660 if( aIncomingMessage.TransactionId() == *iSentChunks[ i ] ) |
|
661 { |
|
662 delete iSentChunks[ i ]; |
|
663 iSentChunks.Remove( i ); |
|
664 } |
|
665 } |
|
666 |
|
667 if ( iState == EWaitingForResponse ) |
|
668 { |
736 iState = EMessageDone; |
669 iState = EMessageDone; |
737 ret = ETrue; |
670 } |
738 } |
671 |
739 |
672 MSRPLOG( "CMSRPMessageHandler::ConsumeResponseL exit" ) |
|
673 return responseCode; |
|
674 } |
|
675 |
|
676 |
|
677 TBool CMSRPMessageHandler::IsMessageComplete() |
|
678 { |
|
679 MSRPLOG2( "CMSRPMessageHandler::IsMessageComplete enter= %d", this ) |
|
680 MSRPLOG2( "CMSRPMessageHandler::IsMessageComplete enter= %d", iMessageEnding ) |
|
681 MSRPLOG2( "CMSRPMessageHandler::IsMessageComplete enter= %d", iState ) |
|
682 if ( iMessageEnding != EMessageEnd && iMessageEnding != EMessageTerminated ) |
|
683 { |
|
684 return EFalse; |
|
685 } |
|
686 else if( iState == EMessageDone || iState == ETerminated ) |
|
687 { |
|
688 return ETrue; |
|
689 } |
|
690 else |
|
691 { |
|
692 return EFalse; |
|
693 } |
|
694 } |
|
695 |
|
696 |
|
697 TUint CMSRPMessageHandler::GetSendResultL( HBufC8* &aMessageId ) |
|
698 { |
|
699 MSRPLOG( "CMSRPMessageHandler::GetSendResult enter" ) |
|
700 TUint aErrorCode( EUnknownCode ); |
|
701 aMessageId = iMessage->MessageIdHeader()->ToTextValueLC(); |
|
702 CleanupStack::Pop(aMessageId); |
|
703 if(iResponse) |
|
704 { |
|
705 aErrorCode = iResponse->StatusCode(); |
|
706 } |
|
707 |
|
708 return aErrorCode; |
|
709 } |
|
710 |
|
711 // ----------------------------------------------------------------------------- |
|
712 // CMSRPMessageHandler::IsFailureHeaderPartial |
|
713 // ----------------------------------------------------------------------------- |
|
714 // |
|
715 TBool CMSRPMessageHandler::IsFailureHeaderPartial() |
|
716 { |
740 if( iMessage->FailureReportHeader() ) |
717 if( iMessage->FailureReportHeader() ) |
741 { |
718 { |
742 CleanupStack::PopAndDestroy(); // FR header value from above |
719 HBufC8* frHeaderValue = iMessage->FailureReportHeader()->ToTextValueLC(); |
743 } |
720 if( frHeaderValue->Des() == MSRPStrings::StringF( MSRPStrConsts::EPartial ).DesC() ) |
744 |
721 { |
745 MSRPLOG( "CMSRPMessageHandler::ConsumeResponseL exit" ) |
722 CleanupStack::PopAndDestroy(frHeaderValue); |
746 return ret; |
723 return ETrue; |
747 } |
724 } |
748 |
725 CleanupStack::PopAndDestroy(frHeaderValue); |
749 |
726 } |
750 TBool CMSRPMessageHandler::IsMessageComplete() |
727 |
751 { |
728 return EFalse; |
752 MSRPLOG( "CMSRPMessageHandler::IsMessageComplete enter" ) |
729 } |
753 if( iState == EMessageDone ) |
730 |
754 return ETrue; |
731 const TDesC8& CMSRPMessageHandler::GetSendBufferL( |
755 else |
732 MMSRPWriterObserver::TWriteStatus& aStatus, |
756 return EFalse; |
733 TBool aInterrupt ) |
757 } |
|
758 |
|
759 |
|
760 TBool CMSRPMessageHandler::GetSendResultL( TUint &aErrorCode, HBufC8* &aMessageId ) |
|
761 { |
|
762 MSRPLOG( "CMSRPMessageHandler::GetSendResult enter" ) |
|
763 if( iState == EMessageDone ) |
|
764 { |
|
765 aMessageId = iMessage->MessageIdHeader()->ToTextValueLC(); |
|
766 CleanupStack::Pop(aMessageId); |
|
767 if(iResponse) |
|
768 { |
|
769 TUint code = iResponse->StatusCode(); |
|
770 if( code == CMSRPResponse::EAllOk ) |
|
771 { |
|
772 aErrorCode = ENoError; |
|
773 } |
|
774 else if ( code == CMSRPResponse::ETimeout ) |
|
775 { |
|
776 aErrorCode = ENetworkTimeout; |
|
777 } |
|
778 else |
|
779 { |
|
780 aErrorCode = EUnrecoverableError; |
|
781 } |
|
782 } |
|
783 else |
|
784 { |
|
785 aErrorCode = ENoError; |
|
786 } |
|
787 } |
|
788 MSRPLOG( "CMSRPMessageHandler::GetSendResult exit" ) |
|
789 if( aErrorCode == EUnrecoverableError ) |
|
790 { |
|
791 return ETrue; |
|
792 } |
|
793 else |
|
794 { |
|
795 return EFalse; |
|
796 } |
|
797 } |
|
798 |
|
799 |
|
800 MMSRPWriterObserver::TWriteStatus CMSRPMessageHandler::GetSendBufferL( TPtrC8& aData, TBool aInterrupt ) |
|
801 { |
734 { |
802 MSRPLOG( "CMSRPMessageHandler::GetSendBufferL enter" ) |
735 MSRPLOG( "CMSRPMessageHandler::GetSendBufferL enter" ) |
803 iInterrupt = aInterrupt; |
736 iInterrupt = aInterrupt; |
804 iWriteDone = EFalse; |
737 iWriteDone = EFalse; |
805 iBuffer.Zero(); |
738 iBuffer.Zero(); |
911 CMSRPByteRangeHeader* byteRange = NULL; |
878 CMSRPByteRangeHeader* byteRange = NULL; |
912 |
879 |
913 if ( iMessage->IsFile()) |
880 if ( iMessage->IsFile()) |
914 { |
881 { |
915 byteRange = CMSRPByteRangeHeader::NewL( iBufPosInFile+iStartPosInBuffer+1,KUnknownRange,iFileSize); |
882 byteRange = CMSRPByteRangeHeader::NewL( iBufPosInFile+iStartPosInBuffer+1,KUnknownRange,iFileSize); |
916 |
|
917 CleanupStack::PushL(byteRange); |
|
918 iMessage->SetByteRangeHeader( byteRange ); |
|
919 CleanupStack::Pop(byteRange); |
|
920 } |
883 } |
921 else |
884 else |
922 { |
885 { |
923 if( !iMessage->ByteRangeHeader() ) |
886 if ( iMessage->IsContent() ) |
924 { |
887 { |
925 if ( iMessage->IsContent() ) |
888 byteRange = CMSRPByteRangeHeader::NewL( 1, |
926 { |
889 iMessage->Content().Length(), iMessage->Content().Length() ); |
927 byteRange = CMSRPByteRangeHeader::NewL( 1, |
890 } |
928 iMessage->Content().Length(), iMessage->Content().Length() ); |
891 else |
929 CleanupStack::PushL(byteRange); |
892 { |
930 } |
893 byteRange = CMSRPByteRangeHeader::NewL( 1, 0, 0 ); |
931 else |
894 } |
932 { |
895 } |
933 byteRange = CMSRPByteRangeHeader::NewL( 1, 0, 0 ); |
896 iMessage->SetByteRangeHeader( byteRange ); |
934 CleanupStack::PushL(byteRange); |
|
935 } |
|
936 iMessage->SetByteRangeHeader( byteRange ); |
|
937 CleanupStack::Pop(byteRange); |
|
938 } |
|
939 } |
|
940 MSRPLOG( "CMSRPMessageHandler::CreateByteRangeHeaderL exit" ) |
897 MSRPLOG( "CMSRPMessageHandler::CreateByteRangeHeaderL exit" ) |
941 } |
898 } |
942 |
899 |
943 |
900 |
944 void CMSRPMessageHandler::CreateTransactionId() |
901 void CMSRPMessageHandler::CreateTransactionIdL() |
945 { |
902 { |
946 MSRPLOG( "CMSRPMessageHandler::CreateTransactionId enter" ) |
903 MSRPLOG( "CMSRPMessageHandler::CreateTransactionId enter" ) |
947 |
904 |
948 TTime now; |
905 TTime now; |
949 now.HomeTime(); |
906 now.HomeTime(); |
950 TInt64 seed = now.Int64(); |
907 TInt64 seed = now.Int64(); |
951 TInt random = Math::Rand( seed ); |
908 TInt random = Math::Rand( seed ); |
952 iTransactionId.NumUC( random ); |
909 HBufC8* transactionId = HBufC8::NewL( KMaxLengthOfTransactionIdString ); |
|
910 TPtr8 temp( transactionId->Des() ); |
|
911 temp.NumUC( random ); |
|
912 |
|
913 if ( iActiveMsgType != EMSRPReport ) |
|
914 { |
|
915 // let's make sure the message content does not include the end line |
|
916 // otherwise we need to regenerate the random number |
|
917 TBuf8< KMaxLengthOfMessageEndString > endLine; |
|
918 endLine.Append( KAsterisk ); |
|
919 endLine.Append( KDashLine ); |
|
920 endLine.Append( temp ); |
|
921 endLine.Append( KAsterisk ); |
|
922 |
|
923 if ( iMessage->IsFile() ) |
|
924 { |
|
925 // must first load the right chunk to memory temporarily |
|
926 RFile file; |
|
927 CleanupClosePushL( file ); |
|
928 User::LeaveIfError( |
|
929 file.Open( iFs, iMessage->GetFileName(), EFileShareReadersOrWriters ) ); |
|
930 |
|
931 // Check that the file does not contain the generated ID |
|
932 TInt readPosition( 0 ); |
|
933 HBufC8* tempFileBuffer = HBufC8::NewLC( KMaxChunkReadSize ); |
|
934 TPtr8 fileBuffer( tempFileBuffer->Des() ); |
|
935 User::LeaveIfError( |
|
936 file.Read( readPosition, fileBuffer, KMaxChunkReadSize ) ); |
|
937 while ( fileBuffer.Length() ) |
|
938 { |
|
939 if ( fileBuffer.Match( endLine ) != KErrNotFound ) |
|
940 { |
|
941 // found |
|
942 random = Math::Rand( seed ); |
|
943 temp.NumUC( random ); |
|
944 endLine.Zero(); |
|
945 endLine.Append( KAsterisk ); |
|
946 endLine.Append( KDashLine ); |
|
947 endLine.Append( temp ); |
|
948 endLine.Append( KAsterisk ); |
|
949 readPosition = 0; |
|
950 } |
|
951 else |
|
952 { |
|
953 readPosition += ( KMaxChunkReadSize - KMaxLengthOfMessageEndString ); |
|
954 } |
|
955 User::LeaveIfError( |
|
956 file.Read( readPosition, fileBuffer, KMaxChunkReadSize ) ); |
|
957 } |
|
958 CleanupStack::PopAndDestroy( tempFileBuffer ); |
|
959 CleanupStack::PopAndDestroy( ); // file |
|
960 } |
|
961 else |
|
962 { |
|
963 // content |
|
964 while ( iMessage->Content().Match( temp ) != KErrNotFound ) |
|
965 { |
|
966 // found |
|
967 random = Math::Rand( seed ); |
|
968 temp.NumUC( random ); |
|
969 endLine.Zero(); |
|
970 endLine.Append( KAsterisk ); |
|
971 endLine.Append( KDashLine ); |
|
972 endLine.Append( temp ); |
|
973 endLine.Append( KAsterisk ); |
|
974 } |
|
975 } |
|
976 } |
|
977 iSentChunks.Append( transactionId ); |
953 |
978 |
954 MSRPLOG( "CMSRPMessageHandler::CreateTransactionId exit" ) |
979 MSRPLOG( "CMSRPMessageHandler::CreateTransactionId exit" ) |
955 } |
980 } |
956 |
981 |
957 |
982 |
958 void CMSRPMessageHandler::WriteInitialLineToBufferL() |
983 void CMSRPMessageHandler::WriteInitialLineToBufferL() |
959 { |
984 { |
960 MSRPLOG( "CMSRPMessageHandler::WriteInitialLineToBufferL enter" ) |
985 MSRPLOG( "CMSRPMessageHandler::WriteInitialLineToBufferL enter" ) |
961 |
986 |
|
987 if( iActiveMsgType == EMSRPMessage ) |
|
988 { |
|
989 iMessageEnding = EMessageNotDefined; |
|
990 } |
962 iBuffer.Append( MSRPStrings::StringF( MSRPStrConsts::EMSRP ).DesC() ); |
991 iBuffer.Append( MSRPStrings::StringF( MSRPStrConsts::EMSRP ).DesC() ); |
963 |
992 |
964 iBuffer.Append( KSpaceChar ); |
993 iBuffer.Append( KSpaceChar ); |
965 |
994 |
966 if (! (iActiveMsgType == EMSRPResponse) ) |
995 if (! (iActiveMsgType == EMSRPResponse) ) |
967 { |
996 { |
968 CreateTransactionId(); |
997 CreateTransactionIdL(); |
969 } |
998 } |
970 |
999 |
971 iBuffer.Append( iTransactionId ); |
1000 iBuffer.Append( *iSentChunks[ iSentChunks.Count() -1 ] ); |
972 |
1001 |
973 iBuffer.Append( KSpaceChar ); |
1002 iBuffer.Append( KSpaceChar ); |
974 |
1003 |
975 if ( iActiveMsgType == EMSRPMessage ) |
1004 if ( iActiveMsgType == EMSRPMessage ) |
976 { |
1005 { |
1090 |
1133 |
1091 |
1134 |
1092 void CMSRPMessageHandler::WriteFileContentToBufferL() |
1135 void CMSRPMessageHandler::WriteFileContentToBufferL() |
1093 { |
1136 { |
1094 MSRPLOG( "CMSRPMessageHandler::WriteFileContentToBuffer enter" ) |
1137 MSRPLOG( "CMSRPMessageHandler::WriteFileContentToBuffer enter" ) |
1095 TInt endlineSize = iTransactionId.Length() + KEndlineConstLength; |
1138 TInt endlineSize = iSentChunks[ iSentChunks.Count() -1 ]->Length() + KEndlineConstLength; |
1096 TInt remBufferSize = iBuffer.MaxLength() - iBuffer.Length() - endlineSize - KCRAndLF().Length(); |
1139 TInt remBufferSize = iBuffer.MaxLength() - iBuffer.Length() - endlineSize - KCRAndLF().Length(); |
1097 TInt chunkLength = iFileBuffer->Length() - iEndPosInBuffer; |
1140 TInt chunkLength = iFileBuffer->Length() - iEndPosInBuffer; |
1098 |
1141 |
1099 /*if(remBufferSize<0) TODO*/ |
|
1100 if(chunkLength > remBufferSize) |
1142 if(chunkLength > remBufferSize) |
1101 { |
1143 { |
1102 iFileBytesSent = remBufferSize; |
1144 iFileBytesSent = remBufferSize; |
1103 iBuffer.Append(iFileBuffer->Mid(iEndPosInBuffer, iFileBytesSent)); |
1145 iBuffer.Append(iFileBuffer->Mid(iEndPosInBuffer, iFileBytesSent)); |
1104 iEndPosInBuffer += iFileBytesSent; |
1146 iEndPosInBuffer += iFileBytesSent; |
1105 if(iInterrupt) |
1147 |
1106 { |
1148 if( iTerminateSending ) |
|
1149 { |
|
1150 iBuffer.Append(KCRAndLF()); |
|
1151 WriteEndLineToBuffer( EMessageTerminated ); |
|
1152 iStartPosInBuffer = iEndPosInBuffer; |
|
1153 iState = ETerminated; |
|
1154 } |
|
1155 else if(iInterrupt) |
|
1156 { |
|
1157 iBuffer.Append(KCRAndLF()); |
1107 WriteEndLineToBuffer(EMessageContinues); |
1158 WriteEndLineToBuffer(EMessageContinues); |
1108 //add chunk entry |
|
1109 CMSRPMessageChunkState* iChunk = CMSRPMessageChunkState::NewL( ); |
|
1110 iChunk->SetStartPos(iBufPosInFile+iStartPosInBuffer); |
|
1111 iChunk->SetEndPos(iBufPosInFile+iEndPosInBuffer-1);//since endpos is pointing to next start pos |
|
1112 iChunk->SetTransactionId(iTransactionId); |
|
1113 iChunkList.Append(iChunk); |
|
1114 |
|
1115 iStartPosInBuffer = iEndPosInBuffer; |
1159 iStartPosInBuffer = iEndPosInBuffer; |
1116 iState = EChunkSent; |
1160 } |
1117 } |
|
1118 /* else |
1161 /* else |
1119 { |
1162 { |
1120 //msg state remains InProgress (in write done return pending) |
1163 //msg state remains InProgress (in write done return pending) |
1121 }*/ |
1164 }*/ |
1122 } |
1165 } |
|
1166 else //bytes completed in current file buffer |
|
1167 { |
|
1168 iFileBytesSent = chunkLength; |
|
1169 iBuffer.Append(iFileBuffer->Mid(iEndPosInBuffer, iFileBytesSent)); |
|
1170 iEndPosInBuffer += iFileBytesSent; |
|
1171 |
|
1172 if ( FillFileBufferL() == 0 ) |
|
1173 { |
|
1174 iBuffer.Append( KCRAndLF( ) ); |
|
1175 WriteEndLineToBuffer( EMessageEnd ); |
|
1176 iState = EMessageSent; |
|
1177 } |
|
1178 |
|
1179 if( iTerminateSending && iState != EMessageSent ) |
|
1180 { |
|
1181 iBuffer.Append( KCRAndLF( ) ); |
|
1182 WriteEndLineToBuffer( EMessageTerminated ); |
|
1183 iState = ETerminated; |
|
1184 } |
|
1185 } |
|
1186 #if 0 |
|
1187 /* This is an alternative piece of code which writes the message in chunks. |
|
1188 * The size of chunk is determined by the size of the iBuffer |
|
1189 */ |
1123 else //bytes completed in current file buffer |
1190 else //bytes completed in current file buffer |
1124 { |
1191 { |
1125 iFileBytesSent = chunkLength; |
1192 iFileBytesSent = chunkLength; |
1126 iBuffer.Append(iFileBuffer->Mid(iEndPosInBuffer, iFileBytesSent)); |
1193 iBuffer.Append(iFileBuffer->Mid(iEndPosInBuffer, iFileBytesSent)); |
1127 iEndPosInBuffer += iFileBytesSent; |
1194 iEndPosInBuffer += iFileBytesSent; |
1128 iBuffer.Append(KCRAndLF()); |
1195 iBuffer.Append(KCRAndLF()); |
1129 |
1196 |
1130 //add chunk entry |
1197 if(iTerminateFS) |
1131 CMSRPMessageChunkState* iChunk = CMSRPMessageChunkState::NewL( ); |
1198 { |
1132 iChunk->SetStartPos(iBufPosInFile+iStartPosInBuffer); |
1199 WriteEndLineToBuffer(EMessageTerminated); |
1133 iChunk->SetEndPos(iBufPosInFile+iEndPosInBuffer-1); |
1200 iState = ETerminated; |
1134 iChunk->SetTransactionId(iTransactionId); |
1201 } |
1135 iChunkList.Append(iChunk); |
1202 else if(FillFileBufferL() > 0) |
1136 |
|
1137 if(FillFileBufferL() > 0) |
|
1138 { |
1203 { |
1139 //next file buffer has data |
1204 //next file buffer has data |
1140 WriteEndLineToBuffer(EMessageContinues); |
1205 WriteEndLineToBuffer(EMessageContinues); |
1141 iState = EChunkSent; |
|
1142 } |
1206 } |
1143 else |
1207 else |
1144 { |
1208 { |
1145 WriteEndLineToBuffer(EMessageEnd); |
1209 WriteEndLineToBuffer(EMessageEnd); |
1146 iState = EMessageSent; |
1210 iState = EMessageSent; |
1147 } |
1211 } |
1148 |
1212 } |
1149 } |
1213 #endif |
1150 |
1214 |
1151 iWriteDone = ETrue; |
1215 iWriteDone = ETrue; |
1152 MSRPLOG( "CMSRPMessageHandler::WriteFileContentToBuffer exit" ) |
1216 MSRPLOG( "CMSRPMessageHandler::WriteFileContentToBuffer exit" ) |
1153 } |
1217 } |
1154 |
1218 |
1250 RStringF statusString; |
1325 RStringF statusString; |
1251 CleanupClosePushL( statusString ); |
1326 CleanupClosePushL( statusString ); |
1252 |
1327 |
1253 switch( aStatusCode ) |
1328 switch( aStatusCode ) |
1254 { |
1329 { |
1255 case CMSRPResponse::EAllOk: |
1330 case EAllOk: |
1256 { |
1331 { |
1257 statusString = MSRPStrings::StringF( MSRPStrConsts::EAllOk ); |
1332 statusString = MSRPStrings::StringF( MSRPStrConsts::EAllOk ); |
1258 break; |
1333 break; |
1259 } |
1334 } |
1260 case CMSRPResponse::EUnintelligibleRequest: |
1335 case EUnintelligibleRequest: |
1261 { |
1336 { |
1262 statusString = MSRPStrings::StringF( MSRPStrConsts::EUnintelligibleRequest ); |
1337 statusString = MSRPStrings::StringF( MSRPStrConsts::EUnintelligibleRequest ); |
1263 break; |
1338 break; |
1264 } |
1339 } |
1265 case CMSRPResponse::EActionNotAllowed: |
1340 case EActionNotAllowed: |
1266 { |
1341 { |
1267 statusString = MSRPStrings::StringF( MSRPStrConsts::EActionNotAllowed ); |
1342 statusString = MSRPStrings::StringF( MSRPStrConsts::EActionNotAllowed ); |
1268 break; |
1343 break; |
1269 } |
1344 } |
1270 case CMSRPResponse::ETimeout: |
1345 case ETimeout: |
1271 { |
1346 { |
1272 statusString = MSRPStrings::StringF( MSRPStrConsts::ETimeout ); |
1347 statusString = MSRPStrings::StringF( MSRPStrConsts::ETimeout ); |
1273 break; |
1348 break; |
1274 } |
1349 } |
1275 case CMSRPResponse::EStopSending: |
1350 case EStopSending: |
1276 { |
1351 { |
1277 statusString = MSRPStrings::StringF( MSRPStrConsts::EStopSending ); |
1352 statusString = MSRPStrings::StringF( MSRPStrConsts::EStopSending ); |
1278 break; |
1353 break; |
1279 } |
1354 } |
1280 case CMSRPResponse::EMimeNotUnderstood: |
1355 case EMimeNotUnderstood: |
1281 { |
1356 { |
1282 statusString = MSRPStrings::StringF( MSRPStrConsts::EMimeNotUnderstood ); |
1357 statusString = MSRPStrings::StringF( MSRPStrConsts::EMimeNotUnderstood ); |
1283 break; |
1358 break; |
1284 } |
1359 } |
1285 case CMSRPResponse::EParameterOutOfBounds: |
1360 case EParameterOutOfBounds: |
1286 { |
1361 { |
1287 statusString = MSRPStrings::StringF( MSRPStrConsts::EParameterOutOfBounds ); |
1362 statusString = MSRPStrings::StringF( MSRPStrConsts::EParameterOutOfBounds ); |
1288 break; |
1363 break; |
1289 } |
1364 } |
1290 case CMSRPResponse::ESessionDoesNotExist: |
1365 case ESessionDoesNotExist: |
1291 { |
1366 { |
1292 statusString = MSRPStrings::StringF( MSRPStrConsts::ESessionDoesNotExist ); |
1367 statusString = MSRPStrings::StringF( MSRPStrConsts::ESessionDoesNotExist ); |
1293 break; |
1368 break; |
1294 } |
1369 } |
1295 case CMSRPResponse::EUnknownRequestMethod: |
1370 case EUnknownRequestMethod: |
1296 { |
1371 { |
1297 statusString = MSRPStrings::StringF( MSRPStrConsts::EUnknownRequestMethod ); |
1372 statusString = MSRPStrings::StringF( MSRPStrConsts::EUnknownRequestMethod ); |
1298 break; |
1373 break; |
1299 } |
1374 } |
1300 case CMSRPResponse::ESessionAlreadyBound: |
1375 case ESessionAlreadyBound: |
1301 { |
1376 { |
1302 statusString = MSRPStrings::StringF( MSRPStrConsts::ESessionAlreadyBound ); |
1377 statusString = MSRPStrings::StringF( MSRPStrConsts::ESessionAlreadyBound ); |
1303 break; |
1378 break; |
1304 } |
1379 } |
1305 default: |
1380 default: |
1320 |
1395 |
1321 if( aMessageType == EMSRPMessage ) |
1396 if( aMessageType == EMSRPMessage ) |
1322 { |
1397 { |
1323 if(!aMessage->MessageIdHeader()) |
1398 if(!aMessage->MessageIdHeader()) |
1324 { |
1399 { |
1325 return CMSRPResponse::EUnintelligibleRequest; |
1400 return EUnintelligibleRequest; |
1326 } |
1401 } |
1327 CMSRPMessage* message = static_cast<CMSRPMessage*>(aMessage); |
1402 CMSRPMessage* message = static_cast<CMSRPMessage*>(aMessage); |
1328 if(message->IsContent() && !message->ContentTypeHeader()) |
1403 if(message->IsContent() && !message->ContentTypeHeader()) |
1329 { |
1404 { |
1330 return CMSRPResponse::EUnintelligibleRequest; |
1405 return EUnintelligibleRequest; |
1331 } |
1406 } |
1332 } |
1407 } |
1333 |
1408 |
1334 MSRPLOG( "CMSRPMessageHandler::CheckValidityOfMessage exit" ) |
1409 MSRPLOG( "CMSRPMessageHandler::CheckValidityOfMessage exit" ) |
1335 return CMSRPResponse::EAllOk; |
1410 return EAllOk; |
1336 } |
1411 } |
1337 |
1412 |
|
1413 // ----------------------------------------------------------------------------- |
|
1414 // CMSRPMessageHandler::OpenTemporaryFileL |
|
1415 // ----------------------------------------------------------------------------- |
|
1416 // |
|
1417 void CMSRPMessageHandler::OpenTemporaryFileL( const TDesC& aFilename ) |
|
1418 { |
|
1419 MSRPLOG( "CMSRPMessageHandler::OpenTemporaryFileL enter" ) |
|
1420 |
|
1421 iTempFile = new ( ELeave ) RFile(); |
|
1422 // create temporary filename |
|
1423 iTempFile->Open( iFs, aFilename, EFileShareExclusive | EFileWrite ); |
|
1424 |
|
1425 MSRPLOG2( "CMSRPMessageHandler::OpenTemporaryFileL exit, filename = %S", &iTempFileName ) |
|
1426 } |
|
1427 |
|
1428 // ----------------------------------------------------------------------------- |
|
1429 // CMSRPMessageHandler::CreateTemporaryFileL |
|
1430 // ----------------------------------------------------------------------------- |
|
1431 // |
|
1432 void CMSRPMessageHandler::CreateTemporaryFileL( ) |
|
1433 { |
|
1434 MSRPLOG( "CMSRPMessageHandler::CreateTemporaryFileL enter" ) |
|
1435 |
|
1436 iTempFile = new ( ELeave ) RFile(); |
|
1437 // create temporary filename |
|
1438 User::LeaveIfError( iTempFile->Temp( |
|
1439 iFs, KDefaultTempFilePath, iTempFileName, EFileShareExclusive | EFileWrite ) ); |
|
1440 iMessage->SetFileName( iTempFileName ); |
|
1441 |
|
1442 MSRPLOG2( "CMSRPMessageHandler::CreateTemporaryFileL exit, filename = %S", &iTempFileName ) |
|
1443 } |
|
1444 |
|
1445 // ----------------------------------------------------------------------------- |
|
1446 // CMSRPMessageHandler::WriteMessageToFileL |
|
1447 // ----------------------------------------------------------------------------- |
|
1448 // |
|
1449 void CMSRPMessageHandler::WriteMessageToFileL( TDesC8& aBuffer ) |
|
1450 { |
|
1451 MSRPLOG( "CMSRPSocketReader::WriteMessageToFileL enter" ) |
|
1452 |
|
1453 if ( !iTempFileName.Length() ) |
|
1454 { |
|
1455 CreateTemporaryFileL(); |
|
1456 } |
|
1457 else |
|
1458 { |
|
1459 OpenTemporaryFileL( iTempFileName ); |
|
1460 } |
|
1461 |
|
1462 MSRPLOG2( "CMSRPSocketReader::WriteMessageToFileL writing to file = %S", &iMessage->GetFileName() ); |
|
1463 |
|
1464 TInt fileSize; |
|
1465 iTempFile->Size( fileSize ); |
|
1466 if ( iMessage->ByteRangeHeader()->StartPosition() > fileSize ) |
|
1467 { |
|
1468 iTempFile->SetSize( |
|
1469 iMessage->ByteRangeHeader()->StartPosition() ); |
|
1470 } |
|
1471 iTempFile->Size( fileSize ); |
|
1472 |
|
1473 iTempFile->Write( |
|
1474 iMessage->ByteRangeHeader()->StartPosition() - 1, aBuffer ); |
|
1475 MSRPLOG2( "CMSRPSocketReader::WriteMessageToFileL writing to pos = %d", iMessage->ByteRangeHeader()->StartPosition() - 1 ); |
|
1476 iTempFile->Size( iCurrentNumberOfBytes ); |
|
1477 iTempFile->Close(); |
|
1478 delete iTempFile; |
|
1479 iTempFile = NULL; |
|
1480 |
|
1481 MSRPLOG( "CMSRPSocketReader::WriteMessageToFileL exit" ) |
|
1482 } |
|
1483 |
|
1484 // ----------------------------------------------------------------------------- |
|
1485 // CMSRPMessageHandler::AppendMessageToFileL |
|
1486 // ----------------------------------------------------------------------------- |
|
1487 // |
|
1488 void CMSRPMessageHandler::AppendMessageToFileL( TDesC8& aBuffer ) |
|
1489 { |
|
1490 MSRPLOG( "CMSRPSocketReader::AppendMessageToFileL enter" ) |
|
1491 OpenTemporaryFileL( iMessage->GetFileName() ); |
|
1492 |
|
1493 TInt filePos( 0 ); |
|
1494 iTempFile->Seek( ESeekEnd, filePos ); |
|
1495 |
|
1496 TInt fileSize; |
|
1497 iTempFile->Size( fileSize ); |
|
1498 MSRPLOG2( "CMSRPSocketReader::AppendMessageToFileL writing to pos = %d", fileSize ); |
|
1499 |
|
1500 iTempFile->Write( aBuffer ); |
|
1501 iTempFile->Size( iCurrentNumberOfBytes ); |
|
1502 iTempFile->Close(); |
|
1503 delete iTempFile; |
|
1504 iTempFile = NULL; |
|
1505 |
|
1506 MSRPLOG( "CMSRPSocketReader::AppendMessageToFileL exit" ) |
|
1507 } |
|
1508 |
|
1509 // ----------------------------------------------------------------------------- |
|
1510 // CMSRPMessageHandler::MessageId |
|
1511 // ----------------------------------------------------------------------------- |
|
1512 // |
|
1513 HBufC8* CMSRPMessageHandler::MessageIdLC( ) |
|
1514 { |
|
1515 return iMessage->MessageIdHeader()->ToTextValueLC(); |
|
1516 } |
|
1517 |
|
1518 // ----------------------------------------------------------------------------- |
|
1519 // CMSRPMessageHandler::CurrentReceiveProgress |
|
1520 // ----------------------------------------------------------------------------- |
|
1521 // |
|
1522 void CMSRPMessageHandler::CurrentReceiveProgress( TInt& aBytesTransferred, TInt& aTotalBytes ) |
|
1523 { |
|
1524 aBytesTransferred = iCurrentNumberOfBytes; |
|
1525 aTotalBytes = iMessage->ByteRangeHeader()->TotalLength(); |
|
1526 } |
|
1527 |
|
1528 // ----------------------------------------------------------------------------- |
|
1529 // CMSRPMessageHandler::CurrentSendProgress |
|
1530 // ----------------------------------------------------------------------------- |
|
1531 // |
|
1532 void CMSRPMessageHandler::CurrentSendProgress( TInt& aBytesTransferred, TInt& aTotalBytes ) |
|
1533 { |
|
1534 if ( iBufPosInFile ) |
|
1535 { |
|
1536 aBytesTransferred = iBufPosInFile; |
|
1537 aTotalBytes = iFileSize; |
|
1538 } |
|
1539 else |
|
1540 { |
|
1541 aBytesTransferred = iMessage->Content().Length() - iContentPtr.Length(); |
|
1542 aTotalBytes = iMessage->Content().Length(); |
|
1543 } |
|
1544 } |
|
1545 |
|
1546 // ----------------------------------------------------------------------------- |
|
1547 // CMSRPMessageHandler::CheckMessageChunk |
|
1548 // ----------------------------------------------------------------------------- |
|
1549 // |
|
1550 TBool CMSRPMessageHandler::CheckMessageChunkL( CMSRPMessageHandler& aOtherMessage ) |
|
1551 { |
|
1552 MSRPLOG( "-> CMSRPMessageHandler::CheckMessageChunk" ) |
|
1553 HBufC8* ownToPath = iMessage->ToPathHeader()->ToTextValueLC(); |
|
1554 HBufC8* ownMessageId = iMessage->MessageIdHeader()->ToTextValueLC(); |
|
1555 HBufC8* otherToPath = aOtherMessage.GetIncomingMessage()->ToPathHeader()->ToTextValueLC(); |
|
1556 HBufC8* otherMessageId = aOtherMessage.GetIncomingMessage()->MessageIdHeader()->ToTextValueLC(); |
|
1557 |
|
1558 if ( *ownToPath == *otherToPath && *ownMessageId == *otherMessageId ) |
|
1559 { |
|
1560 CleanupStack::PopAndDestroy( 4 ); // above texts |
|
1561 MSRPLOG( "CMSRPMessageHandler::CheckMessageChunk MATCH!" ) |
|
1562 // there is already a message, this chunk belongs to a previous |
|
1563 // message |
|
1564 if ( iMessage->ByteRangeHeader() ) |
|
1565 { |
|
1566 CMSRPByteRangeHeader* byteR = CMSRPByteRangeHeader::NewL( |
|
1567 iMessage->ByteRangeHeader()->StartPosition( ), |
|
1568 iMessage->ByteRangeHeader()->EndPosition( ), |
|
1569 iMessage->ByteRangeHeader()->TotalLength( ) ); |
|
1570 aOtherMessage.GetIncomingMessage()->SetByteRangeHeader( byteR ); |
|
1571 } |
|
1572 aOtherMessage.SetTransactionId( *iSentChunks[ iSentChunks.Count() -1 ] ); |
|
1573 MSRPLOG( "CMSRPMessageHandler::CheckMessageChunk MATCH2!" ) |
|
1574 return ETrue; |
|
1575 } |
|
1576 |
|
1577 CleanupStack::PopAndDestroy( 4 ); // above texts |
|
1578 MSRPLOG( "<- CMSRPMessageHandler::CheckMessageChunk" ) |
|
1579 return EFalse; |
|
1580 } |
|
1581 |
|
1582 // ----------------------------------------------------------------------------- |
|
1583 // CMSRPMessageHandler::CheckMessageChunk |
|
1584 // ----------------------------------------------------------------------------- |
|
1585 // |
|
1586 void CMSRPMessageHandler::SetMessageObserver( MMSRPMessageObserver* aMessageObserver ) |
|
1587 { |
|
1588 iMSRPMessageObserver = aMessageObserver; |
|
1589 } |
|
1590 |
|
1591 // ----------------------------------------------------------------------------- |
|
1592 // CMSRPMessageHandler::IsSending |
|
1593 // ----------------------------------------------------------------------------- |
|
1594 // |
|
1595 TBool CMSRPMessageHandler::IsSending( ) |
|
1596 { |
|
1597 return isSending; |
|
1598 } |
|
1599 |
|
1600 // ----------------------------------------------------------------------------- |
|
1601 // CMSRPMessageHandler::TemporaryFileName |
|
1602 // ----------------------------------------------------------------------------- |
|
1603 // |
|
1604 TFileName& CMSRPMessageHandler::TemporaryFileName( ) |
|
1605 { |
|
1606 return iTempFileName; |
|
1607 } |
|
1608 |
|
1609 // ----------------------------------------------------------------------------- |
|
1610 // CMSRPMessageHandler::SetTemporaryFileName |
|
1611 // ----------------------------------------------------------------------------- |
|
1612 // |
|
1613 void CMSRPMessageHandler::SetTemporaryFileName( TFileName aFileName ) |
|
1614 { |
|
1615 iTempFileName = aFileName; |
|
1616 iMessage->SetFileName( iTempFileName ); |
|
1617 } |
|
1618 |
|
1619 // ----------------------------------------------------------------------------- |
|
1620 // CMSRPMessageHandler::ResponseHandled |
|
1621 // ----------------------------------------------------------------------------- |
|
1622 // |
|
1623 void CMSRPMessageHandler::ResponseHandled( ) |
|
1624 { |
|
1625 delete iResponse; |
|
1626 iResponse = NULL; |
|
1627 iActiveMsgType = EMSRPMessage; |
|
1628 iBuffer.Zero(); |
|
1629 } |
|
1630 |
|
1631 // End of file |