diff -r 000000000000 -r 8e480a14352b messagingfw/wappushfw/plugins/PushContentHandler/CMultiPartMixedContentHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingfw/wappushfw/plugins/PushContentHandler/CMultiPartMixedContentHandler.cpp Mon Jan 18 20:36:02 2010 +0200 @@ -0,0 +1,251 @@ +// 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 Mixed Loading Content Handler 'CMultiPartMixedContentHandler' +// +// + +// Local includes +// +#include "CMultiPartMixedContentHandler.h" + +// System includes +#include "cmultiparttextiterator.h" +#include "pushdispatcher.h" + +// Constants +_LIT(KReserved, "Reserved"); + +void CMultiPartMixedContentHandler::CPushHandlerBase_Reserved1() + { + User::Panic(KReserved, KErrNotSupported); + } + +void CMultiPartMixedContentHandler::CPushHandlerBase_Reserved2() + { + User::Panic(KReserved, KErrNotSupported); + } + +/** + * Constructor + * + * @param aFs Reference to a file session + * @param aLibrary Reference to DLL Library Object + * @param aIndex Index number corresponding to the Unknown App Handler Class 'EMultiPartMixedContentHandler' + */ +CMultiPartMixedContentHandler::CMultiPartMixedContentHandler() +: CContentHandlerBase() + { + } + +/** + * This will complete initialization of the object + */ +void CMultiPartMixedContentHandler::ConstructL() + { + CActiveScheduler::Add(this); + } + +/** + * Static Factory Construction + * + * @param aFs Reference to a file session + * @param aLibrary Reference to DLL Library Object + * @param aIndex Index number corresponding to the Unknown App Handler Class 'EMultiPartMixedContentHandler' + * + * @return fully initialized instance of this class + */ +CMultiPartMixedContentHandler* CMultiPartMixedContentHandler::NewL() + { + CMultiPartMixedContentHandler* self = new(ELeave) CMultiPartMixedContentHandler; + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +/** + * Destructor + */ +CMultiPartMixedContentHandler::~CMultiPartMixedContentHandler() + { + __LOG_PTR_DEBUG("CMultiPartMixedContentHandler:: Destructor"); + delete iMultiMessage; + } + + +/** + * Creates a Multipart Binary Iterator that will be used for splitting apart the binary + * mulitpart. + * + * @param aPushMsg A WAP binary multipart.mixed message that will be processed + */ +void CMultiPartMixedContentHandler::LoadMultipartMsgL() + { + __ASSERT_DEBUG( iMessage!= 0 , User::Panic(_L("NULL CPushMessage"),0)); + + 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(); + iState = EHandlePart; + + IdleComplete(); + } + + +/** + * The Asynchronous entry point for this plug-in to handle the CPushMessage. + * + * Since we really didn't start an async event, make it look as though our + * asynchronous request has been completed. + * + * @param aPushMsg A WAP binary multipart.mixed message that will be processed + * @param aStatus The TRequestStatus of the caller indicating that this will be used aysnchronously + */ +void CMultiPartMixedContentHandler::HandleMessageL(CPushMessage* aPushMsg, TRequestStatus& aStatus) + { + __LOG_PTR_DEBUG("CMultiPartMixedContentHandler:: HandleMessage Async"); + + iAcknowledge = ETrue; + iMessage = aPushMsg; + SetConfirmationStatus(aStatus); + iState = ELoadMsgData; + IdleComplete(); + } + + +/** + * The Synchronous entry point for this plug-in to handle the CPushMessage. + * + * @param aPushMsg A WAP binary multipart.mixed message that will be processed + * @param aStatus The TRequestStatus of the caller indicating that this will be used aysnchronously + */ +void CMultiPartMixedContentHandler::HandleMessageL(CPushMessage* aPushMsg) + { + __LOG_PTR_DEBUG("CMultiPartMixedContentHandler:: HandleMessage Sync"); + + iAcknowledge = EFalse; + iMessage = aPushMsg; + iState = ELoadMsgData; + IdleComplete(); + } + + +/** + * Cancels Asynronous requests on called handler. + */ +void CMultiPartMixedContentHandler::CancelHandleMessage() + { + if(iContentHandler) + iContentHandler->CancelHandleMessage(); + } + +/** + * Cancels Asynronous requests on caller and completes self. + */ +void CMultiPartMixedContentHandler::DoCancel() + { + __LOG_PTR_DEBUG("CMultiPartMixedContentHandler:: DoCancel"); + + if (iAcknowledge) + User::RequestComplete(iConfirmStatus,KErrCancel); + + Complete(KErrCancel); + } + +/** + * State machine to step through the multipart message until it is done + * + * State EHandlePart: Starts the processing of each part of the multipart + * State ENextPart: Moves the interator to point to the next part of the multipart + * when there are no more parts, EDone will be the next state + * State EDone: Clean up and complete + */ +void CMultiPartMixedContentHandler::RunL() + { + switch(iState) + { + case ELoadMsgData: + LoadMultipartMsgL(); + break; + case EHandlePart: + HandlePartL(); + break; + case ENextPart: + NextPartL(); + break; + case EDone: + Complete(KErrNone); + break; + default: + break; + } + } + +/** + * Clean up + */ +TInt CMultiPartMixedContentHandler::RunError(TInt aError) + { + __LOG_PTR_DEBUG("CMultiPartMixedContentHandler::RunError Called"); + iState=EDone; + Complete(aError); + return KErrNone; + } + + +/** + * Handles the Message Part returned from the Multipart iterator + * by creating a new handler based on the Content-Type, then dispatches it + * synchronously. + */ +void CMultiPartMixedContentHandler::HandlePartL() + { + __LOG_PTR_DEBUG("CMultiPartMixedContentHandler:: HandlePart"); + CPushMessage* msgPart = iMultiMessage->PartL(); + CleanupStack::PushL(msgPart); + + TPtrC contentType; + msgPart->GetContentType(contentType); + CContentHandlerBase& contentHandler = PushContentTypeDispatcher::GetHandlerL(contentType, *iLog, *iManager); + iContentHandler = &contentHandler; + CleanupStack::Pop(msgPart); + + // treat as an acknowledged message always to ensure + // sequential creation of handlers + iContentHandler->HandleMessageL(msgPart, iStatus); + iState = ENextPart; + SetActive(); + } + +/** + * Moves multipart iterator to the next part. If there is none, + * State: EDone will be set to complete this handler + */ +void CMultiPartMixedContentHandler::NextPartL() + { + __LOG_PTR_DEBUG("CMultiPartMixedContentHandler:: NextPartL"); + if (iMultiMessage->NextL()) + iState = EHandlePart; + else + iState = EDone; + + IdleComplete(); + }