messagingfw/wappushfw/ROContentHandler/src/ROContentHandler.cpp
changeset 0 8e480a14352b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/wappushfw/ROContentHandler/src/ROContentHandler.cpp	Mon Jan 18 20:36:02 2010 +0200
@@ -0,0 +1,332 @@
+// Copyright (c) 2006-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:
+//
+
+
+// User Include
+#include "ROContentHandler.h"
+#include "MessageComposer.h"
+
+//Rights object text MIME types
+_LIT8(KROTextContentType, "application/vnd.oma.drm.rights+xml");
+_LIT(KROBinContentType, "application/vnd.oma.drm.rights+wbxml");
+
+#if defined(_DEBUG)
+_LIT(KErrPushMsgNull,	"NULL CPushMessage");
+#endif
+
+//temp output file
+_LIT(KWapPushDir, "C:\\system\\data\\wappush\\");
+_LIT(KTempROFile, "rightsobject.Dat");
+
+// Constants
+_LIT(KReserved, "Reserved");
+
+const TInt KXMLHeader=12;
+
+void CROContentHandler::CPushHandlerBase_Reserved1()
+	{
+	User::Panic(KReserved, KErrNotSupported);
+	}
+
+void CROContentHandler::CPushHandlerBase_Reserved2()
+	{
+	User::Panic(KReserved, KErrNotSupported);
+	}
+
+/**
+ * The RO Content handler private constructor.
+ **/ 
+CROContentHandler::CROContentHandler(): CContentHandlerBase(), iPushMsgAction(KErrNotFound)
+	{
+	//Do nothing
+	}
+
+/**
+ *  This will complete initialization of the object
+ **/
+void CROContentHandler::ConstructL()
+	{
+	CActiveScheduler::Add(this);
+	User::LeaveIfError(iFs.Connect());		
+	}
+
+/**
+ * Static Factory Construction
+ *
+ * Version of NewL which leaves nothing
+ * on the cleanup stack
+ **/
+CROContentHandler* CROContentHandler::NewL()
+	{
+	CROContentHandler* self = new(ELeave) CROContentHandler;
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+/**
+ * Default d'tor
+ */
+CROContentHandler::~CROContentHandler()
+	{
+	__LOG_PTR_DEBUG("CROContentHandler:: Destructor Called"); 
+	delete iCAFInterface;
+	delete iData;
+	}
+
+/**
+ * HandleMessage Async. Version
+ *	Takes ownership of Push Message and sets self active to continue
+ *	processing message.
+ *	@param aPushMsg
+ *		CPushMessage to process
+ *	@param aStatus
+ *		request status variable for use in asynchronous operations
+ */
+void CROContentHandler::HandleMessageL(CPushMessage* aPushMsg, TRequestStatus& aStatus)
+	{
+	__LOG_PTR_DEBUG("CROContentHandler:: HandleMessage Async Func. Called"); 
+	__ASSERT_DEBUG( aPushMsg != NULL, User::Panic(KErrPushMsgNull, KErrNone));
+
+	iMessage = aPushMsg;
+	SetConfirmationStatus(aStatus);
+
+	iState= EConverting;
+	IdleComplete();
+	}
+
+/**
+ * HandleMessage Sync. Version
+ *	Takes ownership of Push Message and sets self active to continue
+ *	processing message.
+ *
+ *	Initial State: Set data members then go to the next state 
+ *	@param aPushMsg
+ *		CPushMessage to process
+ */
+void CROContentHandler::HandleMessageL(CPushMessage* aPushMsg)
+	{
+	__LOG_PTR_DEBUG("CROContentHandler:: HandleMessage Sync Func. Called");
+	__ASSERT_DEBUG( aPushMsg != NULL, User::Panic(KErrPushMsgNull, KErrNone));
+	
+	iMessage = aPushMsg;
+
+	iState =EConverting;
+	IdleComplete();
+	}
+
+/** 
+ *	Convert the RO message from WBXML to XML if necessary
+ *	@leave KErrNotFound
+ *		indicates general processing error and to abandon processing
+ *	@leave KErrCorrupt
+ *		there is no body in the message
+ *	@leave TDesC::AllocL
+ 
+ */
+void CROContentHandler::ConvertPushMsgL()
+	{
+	__LOG_PTR_DEBUG("CROContentHandler:: ConvertPushMsgL Called");
+	
+	TPtrC contentType;
+	iMessage->GetContentType(contentType);
+	
+	if(contentType.CompareF(KROBinContentType) == 0)
+		{
+		//This is a WBXML Push Msg, we need to convert it into XML format before passing to DRM agent.
+		CMessageComposer* msgComposer = CMessageComposer::NewL ( *iMessage );
+		CleanupStack::PushL ( msgComposer );
+		const TDesC8& convertedMsg = msgComposer->ParseMessageL ();
+		User::LeaveIfError ( msgComposer->LastError() );
+		HBufC8* msgBody = convertedMsg.AllocLC();
+		TPtrC8 hdr;
+		iMessage->GetHeader(hdr);
+		HBufC8* hdrBuf = hdr.AllocLC();
+		delete iMessage;
+		iMessage = NULL;
+		
+		//CPushMessage now takes ownership of hdrBuf and convertedBody
+		//replace received Binary Push message with newly converted XML Massage
+		iMessage = CPushMessage::NewL(hdrBuf, msgBody);
+
+		CleanupStack::Pop(2,msgBody); //msgBody, hdrBuf
+		CleanupStack::PopAndDestroy( msgComposer );	
+		}
+	iState = EStoring;
+	IdleComplete();
+	}
+
+
+/** 
+ *	Save push message in message store.
+ * 	Creates link to message service provided by wap push utils
+ *	and uses this and the associated push entry class to save
+ *	the push message.
+ */
+void CROContentHandler::SaveROToXMLFileL() 
+	{
+	__LOG_PTR_DEBUG("CROContentHandler:: SaveROToXMLFile called");
+
+	TPtrC8 body;
+	iMessage->GetMessageBody(body);
+	// If there is no body in the message leave with an error
+	if (body.Length() ==0)
+		{
+		User::Leave(KErrCorrupt);
+		}
+		
+	HBufC8* bodyBuf = body.AllocLC();
+	//Create file to store the message in Wap Push temp area 
+	TFileName rofilename;
+	RFile file;
+	rofilename.Append(KWapPushDir);
+	rofilename.Append(KTempROFile);
+	iFs.MkDirAll(KWapPushDir);
+	User::LeaveIfError(file.Replace(iFs, rofilename, EFileWrite));
+	CleanupClosePushL(file);
+
+	//Create a heap buffer to store message with header.
+	//Agent expects the 12 bytes of header to store the message.
+	//First four bytes to store the offset of the rights message size in the buffer.
+	//Next four bytes to store the offset of the content message size in the buffer.
+	//Last four bytes to store the size of rights message.
+	TInt size=bodyBuf->Length();
+	iData=HBufC8::NewL(size+KXMLHeader);
+	TPtr8 bufPtr(iData->Des());
+	TPckg<TInt> rightsOffset(8);	//There is no content. the rights message size is at offset of 8 bytes.
+	bufPtr.Append(rightsOffset);
+	TPckg<TInt> contentOffset(0);
+	bufPtr.Append(contentOffset);	//No content. Hence set it to zero.
+	TPckg<TInt> rightsSize(size);
+	bufPtr.Append(rightsSize);		//Append the size of the rights message
+	//Append the xml message
+	bufPtr.Append(*bodyBuf);
+	
+	//Now write this buffer to file
+	User::LeaveIfError(file.Write(*iData));
+	CleanupStack::PopAndDestroy(&file);
+	CleanupStack::PopAndDestroy(bodyBuf);
+
+	iState = ECAFInterface;
+	IdleComplete();
+	}
+
+void CROContentHandler::ProcessToCAFL() 
+	{
+	__LOG_PTR_DEBUG("CROContentHandler:: ProcessToCAF called");
+
+	iCAFInterface = new(ELeave) CROCHCAFInterface(iFs);
+
+	//Register with the CAF session - this initialises the generic variables
+	iCAFInterface->RegisterL(KROTextContentType);
+	
+	if(!iCAFInterface->Registered())
+		{
+		//No CAF agent registered which can handle this mime type.
+		User::Leave(KErrNotFound);
+		}
+	//Initialise the CAF session - this initialises the interface variables and import file
+	iCAFInterface->PrepareProcessingL();
+	//Then start the CAF processing
+	
+	
+	if(iCAFInterface->Processing())
+		{
+		//Write the data to CAF
+		iCAFInterface->WriteDataL(*iData);
+		//Finally terminate CAF session
+		iCAFInterface->EndProcessingL();
+		}
+
+	iState = EDeleteFile;
+	IdleComplete();	
+	}
+
+void CROContentHandler::DeleteTempROFile()
+	{
+	TFileName roFileName;
+	roFileName.Append(KWapPushDir);
+	roFileName.Append(KTempROFile);
+	iFs.Delete(roFileName);
+	iState = EDone;
+	IdleComplete();
+	}
+
+/** 
+ *	Same functionality as DoCancel()
+ */
+void CROContentHandler::CancelHandleMessage()
+	{
+	__LOG_PTR_DEBUG("CROContentHandler:: CancelHandleMessage called");
+	Complete(KErrCancel);
+	}
+
+/** 
+ *	Cancels the handling of the message and revokes the active status
+ *	of the handler 
+ */
+void CROContentHandler::DoCancel()
+	{
+	__LOG_PTR_DEBUG("CROContentHandler:: DoCancel Called");
+	Complete(KErrCancel);	
+	}
+
+/** 
+ *	Step through the various representative states for handling a message 
+ *	1. Conversion of WBXML if necessary
+ *	2. Store the xml file
+ *	3. Pass file to CAF
+ *	4. Delete File
+ *	5. Complete
+ */
+void CROContentHandler::RunL()
+	{
+	__LOG_PTR_DEBUG("CROContentHandler:: RunL Called");
+	
+
+	// use active state machine routine to manage activites:
+	switch (iState)
+		{
+	case EConverting : 	
+		ConvertPushMsgL();
+		break;
+	case EStoring:
+		SaveROToXMLFileL();
+		break;
+	case ECAFInterface:
+		ProcessToCAFL();
+		break;
+	case EDeleteFile:		
+		DeleteTempROFile();
+		break;	
+	case EDone:
+		Complete(KErrNone);
+		break;
+	default:
+		break;
+		}
+	}
+
+/** 
+ * CPluginActiveBase methods
+ */
+TInt CROContentHandler::RunError(TInt aError)
+	{
+	__LOG_PTR_DEBUG("CROContentHandler:: RunError Called"); 
+	iState=EDone;
+	Complete(aError);
+	return KErrNone;
+	}