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 <push/cmultipartpushmsgentry.h>
+#include <push/cunknownpushmsgentry.h>
+#include <push/cwappushmsgutils.h>
+
+
+// System includes
+//
+#include <msvids.h>
+
+// 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);
+ }