diff -r 000000000000 -r 8e480a14352b messagingfw/wappushfw/plugins/PushContentHandler/CMultiPartRelAndAltContentHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingfw/wappushfw/plugins/PushContentHandler/CMultiPartRelAndAltContentHandler.cpp Mon Jan 18 20:36:02 2010 +0200 @@ -0,0 +1,325 @@ +// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Implements Multipart Related Content Handler class 'CMultipartRelatedContentHandler' +// +// + +// Local includes +// +#include "CMultiPartRelAndAltContentHandler.h" + +// System includes +// +#include "cmultiparttextiterator.h" +#include +#include +#include + + +// System includes +// +#include + +// Constants +_LIT(KReserved, "Reserved"); + +void CMultiPartRelAndAltContentHandler::CPushHandlerBase_Reserved1() + { + User::Panic(KReserved, KErrNotSupported); + } + +void CMultiPartRelAndAltContentHandler::CPushHandlerBase_Reserved2() + { + User::Panic(KReserved, KErrNotSupported); + } + +/** + * The Multipart Related Content handler + * Index number : ESLContentHandlerIndex + */ +CMultiPartRelAndAltContentHandler::CMultiPartRelAndAltContentHandler() +: CContentHandlerBase(), iMsgEntryId(KMsvNullIndexEntryId) + { + } + +/** + * This will complete initialization of the object + */ +void CMultiPartRelAndAltContentHandler::ConstructL() + { + CActiveScheduler::Add(this); + iPushUtilities = CWapPushMsgUtils::NewL(); + } + +/** + * Static Factory Construction + * + * version of NewLC which leaves nothing + * on the cleanup stack + */ +CMultiPartRelAndAltContentHandler* CMultiPartRelAndAltContentHandler::NewL() + { + CMultiPartRelAndAltContentHandler* self = new (ELeave) CMultiPartRelAndAltContentHandler; + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +/** + * Default d'tor + */ +CMultiPartRelAndAltContentHandler::~CMultiPartRelAndAltContentHandler() + { + delete iMultiMessage; + delete iPushUtilities; + } + +/** +* Setup the multipart message. +*/ +void CMultiPartRelAndAltContentHandler::LoadMultiPartMsgL() + { +#ifdef _DEBUG + _LIT(KNullMsg,"NULL CPushMessage"); + __ASSERT_DEBUG( iMessage != 0 , User::Panic(KNullMsg,0)); +#endif + TPtrC contentType; + iMessage->GetContentType(contentType); + if (!contentType.FindF(KMultipartText)) + iMultiMessage = CMultipartTextIterator::NewL(*iMessage); + else if (!contentType.FindF(KMultipartBin)) + iMultiMessage = CMultipartBinIterator::NewL(*iMessage); + else + User::Leave(KErrCorrupt); + iMultiMessage->FirstL(); + } + +/** + * + */ +void CMultiPartRelAndAltContentHandler::SaveMsgRootL() + { + TPtrC8 msgHeaderPtr; + iMessage->GetHeader(msgHeaderPtr); + + TBool isInt; + TPtrC8 appURI; + TInt appID=0; + iMessage->GetAppIdL(appURI, appID,isInt); + + CMultiPartPushMsgEntry* msgEntry=NULL; + if (isInt) + { + msgEntry=CMultiPartPushMsgEntry::NewL(appID); + } + else + { + msgEntry=CMultiPartPushMsgEntry::NewL(appURI); + } + + CleanupStack::PushL(msgEntry); + msgEntry->SetHeaderL(msgHeaderPtr); //Top level entry + TPtrC contentType; + iMessage->GetContentType(contentType); + msgEntry->SetContentTypeL(contentType); + + __LOG_PTR_DEBUG("CMultiPartPushMsgEntry: SaveL called"); + iMsgEntryId = msgEntry->SaveL(iPushUtilities->Session(), + KMsvGlobalInBoxIndexEntryId); + CleanupStack::PopAndDestroy(msgEntry); + IdleComplete(); + } + + +/** + * Async. Version + */ +void CMultiPartRelAndAltContentHandler::HandleMessageL(CPushMessage* aPushMsg, TRequestStatus& aStatus) + { + __LOG_PTR_DEBUG("CMultiPartRelAndAltContentHandler:HandleMessageL called"); + iAcknowledge=ETrue; + SetConfirmationStatus(aStatus); + iMessage = aPushMsg; + iState = ELoadMsgData; + IdleComplete(); + } + +/** + * Sync. Version + */ +void CMultiPartRelAndAltContentHandler::HandleMessageL(CPushMessage* aPushMsg) + { + __LOG_PTR_DEBUG("CMultiPartRelAndAltContentHandler:HandleMessageL called"); + iAcknowledge=EFalse; + iMessage = aPushMsg; + iState = ELoadMsgData; + IdleComplete(); + } + +void CMultiPartRelAndAltContentHandler::CancelHandleMessage() + { + } + +void CMultiPartRelAndAltContentHandler::DoCancel() + { + if (iAcknowledge) + User::RequestComplete(iConfirmStatus,KErrCancel); + Complete (KErrCancel); + } + +/** +*RunL handles each part separately +*/ +void CMultiPartRelAndAltContentHandler::RunL() + { + switch(iState) + { + case ELoadMsgData: + LoadMsgDataL(); + break; + case EHandlePart: + HandlePartL(); + break; + case ENextPart: + NextPartL(); + break; + case EDone: + Complete(KErrNone); + break; + default: + break; + } + } + +/** + * Clean up + */ +TInt CMultiPartRelAndAltContentHandler::RunError(TInt aError) + { + __LOG_PTR_DEBUG("CMultiPartRelAndAltContentHandler:: RunError Called"); + iState=EDone; + if (iMsgEntryId != KMsvNullIndexEntryId) + { + TRAP_IGNORE(SetMsgCorruptFlagL()); + } + Complete(aError); + return KErrNone; + } + +/** + * Loads multipart data and creates multipart head entry in the message + * server index. + * @leave KErrCorrupt - message data is corrupt + */ + +void CMultiPartRelAndAltContentHandler::LoadMsgDataL() + { + LoadMultiPartMsgL(); + SaveMsgRootL(); + iState = EHandlePart; + } + + +/** + * Move multipart iterator to the next part + */ +void CMultiPartRelAndAltContentHandler::NextPartL() + { + __LOG_PTR_DEBUG("CMultiPartRelAndAltContentHandler:NextPart called"); + if (iMultiMessage->NextL()) + { + iState = EHandlePart; + } + else + { + iState = EDone; + } + IdleComplete(); + } + + +/** + * Saves message part to messaging server + */ +void CMultiPartRelAndAltContentHandler::HandlePartL() + { + __LOG_PTR_DEBUG("CMultiPartRelAndAltContentHandler:HandlePart called"); + CPushMessage* msgPart = iMultiMessage->PartL(); + CleanupStack::PushL(msgPart); + + // Create a new Unknown Push Entry to hold the header and body data + TBool isInt; + TPtrC8 appURI; + TInt appID=0; + iMessage->GetAppIdL(appURI, appID,isInt); + + CUnknownPushMsgEntry* msgEntry =NULL; + if (isInt) + { + msgEntry = CUnknownPushMsgEntry::NewL(appID); + } + else + { + msgEntry = CUnknownPushMsgEntry::NewL(appURI); + } + CleanupStack::PushL(msgEntry); + // Get the header + TPtrC8 header; + msgPart->GetHeader(header); + //Get the From field + TPtrC8 from; + if (!msgPart->GetBinaryHeaderField(EHttpFrom,from) && + !msgPart->GetBinaryHeaderField(EHttpXWapInitiatorURI,from) && + !msgPart->GetBinaryHeaderField(EHttpContentLocation,from) ) + { + from.Set(KNullDesC8); + } + // Get the body + TPtrC8 body; + msgPart->GetMessageBody(body); + TPtrC content; + msgPart->GetContentType(content); + + //Set fields of the Unknown Entry + msgEntry->SetHeaderL(header); + msgEntry->SetMessageDataL(body); + msgEntry->SetFromL(from); + //Need this next bit so UI knows what to do with the data in the Push Entry + msgEntry->SetContentTypeL(content); + + + __LOG_PTR_DEBUG("CUnknownPushMsgEntry: SaveL called"); + msgEntry->SaveL(iPushUtilities->Session(),iMsgEntryId); + CleanupStack::PopAndDestroy(2);//msgEntry, msgPart + + iState = ENextPart; + IdleComplete(); + + } + +void CMultiPartRelAndAltContentHandler::SetMsgCorruptFlagL() + { + CMsvEntry* msvEntry = iPushUtilities->Session().GetEntryL(iMsgEntryId); + CleanupStack::PushL(msvEntry); + TMsvEntry entry = msvEntry->Entry(); + // get the iMtmData1 value & zero bits 0-3 then add new status + TInt32 mtmdata1 = (entry.MtmData1()&0xFFFFFFF0); + mtmdata1 += CPushMsgEntryBase::EPushMsgStatusCorrupt; + // Now set values for TMsvEntry and update the server entry + entry.SetMtmData1(mtmdata1); + msvEntry->ChangeL(entry); + + CleanupStack::PopAndDestroy(msvEntry); + }