messagingfw/wappushfw/plugins/PushContentHandler/CMultiPartMixedContentHandler.cpp
changeset 0 8e480a14352b
child 44 7c176670643f
--- /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();
+	}