omadrm/drmengine/agentv2/src/Oma2AgentImportFile.cpp
changeset 0 95b198f216e5
child 18 8a03a285ab14
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/omadrm/drmengine/agentv2/src/Oma2AgentImportFile.cpp	Thu Dec 17 08:52:27 2009 +0200
@@ -0,0 +1,544 @@
+/*
+* Copyright (c) 2002-2004 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:  ?Description
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32std.h>
+#include <s32mem.h>
+#include <f32file.h>
+#include <caf/caf.h>
+#include <caf/caferr.h>
+#include <caf/SupplierOutputFile.h>
+#include "Oma2Agent.h"
+#include "Oma2AgentImportfile.h"
+#include "DcfCommon.h"
+#include "DrmRights.h"
+#include "DrmMessageParser.h"
+#include "Oma1DcfCreator.h"
+#include "DrmRightsParser.h"
+#include "DrmProtectedRoParser.h"
+
+using namespace ContentAccess;
+
+// LOCAL FUNCTION PROTOTYPES
+template<class S>
+LOCAL_C void PointerArrayResetDestroyAndClose(TAny* aPtr);
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// ?function_name ?description.
+// ?description
+// Returns: ?value_1: ?description
+//          ?value_n: ?description_line1
+//                    ?description_line2
+// -----------------------------------------------------------------------------
+//
+template<class S>
+void PointerArrayResetDestroyAndClose(TAny* aPtr)
+    {
+    (reinterpret_cast<RPointerArray<S>*>(aPtr))->ResetAndDestroy();
+    (reinterpret_cast<RPointerArray<S>*>(aPtr))->Close();
+    }
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// COma2AgentImportFile::
+// 
+// -----------------------------------------------------------------------------
+//
+COma2AgentImportFile* COma2AgentImportFile::NewL(
+    const TDesC8& aMimeType,
+    const CMetaDataArray& aMetaDataArray,
+    const TDesC& aOutputDirectory,
+    const TDesC& aSuggestedFileName)
+	{
+	COma2AgentImportFile* self=new(ELeave) COma2AgentImportFile(EFalse);
+	CleanupStack::PushL(self);
+	self->ConstructL(aMimeType, aMetaDataArray, aOutputDirectory,
+	    aSuggestedFileName);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// COma2AgentImportFile::
+// 
+// -----------------------------------------------------------------------------
+//
+COma2AgentImportFile* COma2AgentImportFile::NewL(
+    const TDesC8& aMimeType,
+    const CMetaDataArray& aMetaDataArray)
+	{
+	COma2AgentImportFile* self=new(ELeave) COma2AgentImportFile(EFalse);
+	CleanupStack::PushL(self);
+	self->ConstructL(aMimeType, aMetaDataArray, KNullDesC(), KNullDesC());
+	CleanupStack::Pop(self);
+	return self;
+	}
+	
+// -----------------------------------------------------------------------------
+// COma2AgentImportFile::
+// 
+// -----------------------------------------------------------------------------
+//
+COma2AgentImportFile::COma2AgentImportFile(
+    TBool aAgentCreatesOutputFiles):
+    iOutputDirectory(NULL),
+    iSuggestedFileName(NULL),
+    iOutputFileName(NULL),
+    iLastWriteData(NULL),
+    iAgentCreatesOutputFiles(aAgentCreatesOutputFiles),
+    iMessageParser(NULL),
+    iDcfCreator(NULL),
+    iDcfRights(NULL),
+    iDcfMimeType(NULL)
+	{
+	iImportStatus = EInProgress;
+	}
+
+// -----------------------------------------------------------------------------
+// COma2AgentImportFile::
+// 
+// -----------------------------------------------------------------------------
+//
+COma2AgentImportFile::~COma2AgentImportFile()
+	{
+	if (iFileOpen)
+		{
+		iFile.Close();
+		iFileOpen = EFalse;
+		}
+	iFs.Close();
+	delete iOutputDirectory;
+	delete iSuggestedFileName;
+    delete iOutputFileName;
+	delete iLastWriteData;
+	iOutputFiles.ResetAndDestroy();
+	iOutputFiles.Close();
+	delete iMessageParser;
+	delete iDcfCreator;
+	delete iDcfRights;
+	delete iDcfMimeType;
+	}
+  
+// -----------------------------------------------------------------------------
+// COma2AgentImportFile::
+// 
+// -----------------------------------------------------------------------------
+//
+void COma2AgentImportFile::ConstructL(
+    const TDesC8& aMimeType,
+    const CMetaDataArray& aMetaDataArray,
+    const TDesC& aOutputDirectory,
+    const TDesC& aSuggestedFileName)
+	{
+	RMemReadStream rights;
+	
+	if (aMimeType.CompareF(KOma1DrmMessageContentType) == 0 ||
+	    aMimeType.CompareF(KOmaImportContentType) == 0)
+	    {
+	    if (aMimeType.CompareF(KOma1DrmMessageContentType) == 0)
+	        {
+            iMessageParser = CDRMMessageParser::NewL();
+	        iImportType = EOma1DrmMessage;
+	        }
+	    else
+	        {
+	        iDcfCreator = COma1DcfCreator::NewL();
+    	    iImportType = EPlainContent;
+            const TDesC8& mimeDes = aMetaDataArray.SearchL(
+                KOmaImportMimeTypeField);
+            if (mimeDes.Length() == 0)
+                {
+                User::Leave(KErrArgument);
+                }
+    	    iDcfMimeType = mimeDes.AllocL();
+    	    const TDesC8& rightsDes = aMetaDataArray.SearchL(
+    	        KOmaImportRightsField);
+            if (rightsDes.Length() > 0)
+    	        {
+    	        rights.Open(rightsDes.Ptr(), rightsDes.Length());
+    	        CleanupClosePushL(rights);
+        	    iDcfRights = CDRMRights::NewL();
+    	        iDcfRights->InternalizeL(rights);
+    	        CleanupStack::PopAndDestroy(); // rights
+    	        }
+	        }
+    	iOutputDirectory = aOutputDirectory.AllocL();
+    	iSuggestedFileName = aSuggestedFileName.AllocL();
+    	iOutputFileName = HBufC::NewL(iOutputDirectory->Des().Length() +
+            iSuggestedFileName->Des().Length());
+	    iAgentCreatesOutputFiles = ETrue;
+	    }
+    else if (aMimeType.CompareF(KOma1XmlRoContentType) == 0)
+	    {
+	    iImportType = EOma1XmlRo;
+	    }
+    else if (aMimeType.CompareF(KOma1WbxmlRoContentType) == 0)
+	    {
+	    iImportType = EOma1WbxmlRo;
+	    }
+    else if (aMimeType.CompareF(KOma2RoContentType) == 0)
+	    {
+	    iImportType = EOma2Ro;
+	    }
+    else
+        {
+		User::Leave(KErrCANotSupported);
+		}
+	User::LeaveIfError(iFs.Connect());
+    User::LeaveIfError(iFs.ShareAuto());	
+	}
+
+// -----------------------------------------------------------------------------
+// COma2AgentImportFile::
+// 
+// -----------------------------------------------------------------------------
+//
+TInt COma2AgentImportFile::OpenOutputFile()
+	{
+	TInt r = KErrNone;
+	TPtr fileNamePtr = iOutputFileName->Des();
+	
+	fileNamePtr.Copy(*iOutputDirectory);
+	fileNamePtr.Append(*iSuggestedFileName);
+
+	r = iFile.Create(iFs, fileNamePtr, EFileShareAny  | EFileStream |
+	    EFileWrite);
+	if (r == KErrNone)
+		{
+		iFileOpen = ETrue;
+		if (iImportType == EOma1DrmMessage)
+		    {
+		    TRAP(r, iMessageParser->InitializeMessageParserL(iFile));
+		    }
+		else
+		    {
+		    TRAP(r, iDcfCreator->EncryptInitializeL(iFile, *iDcfMimeType,
+		        iDcfRights));
+		    }
+		}
+    else
+        {
+        r = KErrCANewFileHandleRequired;
+        }
+    return r;
+	}
+
+// -----------------------------------------------------------------------------
+// COma2AgentImportFile::
+// 
+// -----------------------------------------------------------------------------
+//
+void COma2AgentImportFile::WriteDataL(const TDesC8& aData)
+    {
+	CDrmRightsParser* oma1Parser = NULL;
+	CDrmProtectedRoParser* oma2Parser = NULL;
+	RPointerArray<CDRMRights> rights;
+    TCleanupItem listCleanup(PointerArrayResetDestroyAndClose<CDRMRights>,
+        &rights);
+	TInt r;
+	
+    switch (iImportType)
+        {
+        case EOma1DrmMessage:
+        	if (!iFileOpen)
+        		{
+        		r = OpenOutputFile();
+        		if (r == KErrNone)
+        		    {
+                    iMessageParser->ProcessMessageDataL(aData);
+        		    }
+        		else
+        		    {
+                    iLastWriteData = aData.AllocL();
+                    User::Leave(r);
+        		    }
+                }
+            else
+                {
+                iMessageParser->ProcessMessageDataL(aData);
+                }
+            break;
+        case EPlainContent:
+        	if (!iFileOpen)
+        		{
+        		r = OpenOutputFile();
+        		if (r == KErrNone)
+        		    {
+                    iDcfCreator->EncryptUpdateL(aData);
+        		    }
+        		else
+        		    {
+                    iLastWriteData = aData.AllocL();
+                    User::Leave(r);
+        		    }
+                }
+            else
+                {
+                iDcfCreator->EncryptUpdateL(aData);
+                }
+            break;
+        case EOma1XmlRo:
+        case EOma1WbxmlRo:
+            oma1Parser = CDrmRightsParser::NewL();
+            CleanupStack::PushL(oma1Parser);
+            CleanupStack::PushL(listCleanup);
+            oma1Parser->ParseAndStoreL(aData, rights);
+            CleanupStack::PopAndDestroy(2); // listCleanup, oma1Parser
+            break;
+        case EOma2Ro:
+            __UHEAP_MARK;
+            oma2Parser = CDrmProtectedRoParser::NewL();
+            CleanupStack::PushL(oma2Parser);
+            CleanupStack::PushL(listCleanup);
+            oma2Parser->ParseAndStoreL(aData, rights);
+            CleanupStack::PopAndDestroy(2); // listCleanup, oma2Parser
+            __UHEAP_MARKEND;
+            break;
+        }
+    }
+    
+// -----------------------------------------------------------------------------
+// COma2AgentImportFile::
+// 
+// -----------------------------------------------------------------------------
+//
+TInt COma2AgentImportFile::WriteData(const TDesC8& aData)
+	{
+	TInt r = KErrNone;
+	TRAP(r, WriteDataL(aData));
+	return r;
+	}
+
+// -----------------------------------------------------------------------------
+// COma2AgentImportFile::
+// 
+// -----------------------------------------------------------------------------
+//
+TInt COma2AgentImportFile::WriteDataComplete()
+	{
+	TInt r = KErrNone;
+	CSupplierOutputFile *temp = NULL;
+	TPtrC8 type(NULL, 0);
+	
+	if (iFileOpen)
+		{
+		if (iImportType == EOma1DrmMessage)
+		    {
+		    TRAP(r, iMessageParser->FinalizeMessageParserL());
+		    }
+		else
+		    {
+		    TRAP(r, iDcfCreator->EncryptFinalizeL());
+		    }
+		iFile.Close();
+		iFileOpen = EFalse;
+		}
+	if( r ) 
+	    {
+		  return r;
+      }
+	if (iOutputFileName)
+		{
+		switch (iImportType)
+		    {
+		    case EPlainContent:
+            case EOma1DrmMessage:
+                type.Set(KOma1DcfContentType());
+                break;
+            default:
+                return KErrGeneral;;
+		    }
+		TRAP(r, temp = CSupplierOutputFile::NewL(iOutputFileName->Des(),
+		    EContent, type));
+		if (r == KErrNone)
+			{
+			r = iOutputFiles.Append(temp);
+			if (r != KErrNone)
+				{
+				delete temp;
+				}
+			}
+		}
+	return r;
+	}
+		
+// -----------------------------------------------------------------------------
+// COma2AgentImportFile::
+// 
+// -----------------------------------------------------------------------------
+//
+void COma2AgentImportFile::WriteData(
+    const TDesC8& aData,
+    TRequestStatus &aStatus)
+	{
+	TRequestStatus *ptr = &aStatus;
+	TInt r = WriteData(aData);
+	User::RequestComplete(ptr,r);
+	}
+
+// -----------------------------------------------------------------------------
+// COma2AgentImportFile::
+// 
+// -----------------------------------------------------------------------------
+//
+void COma2AgentImportFile::WriteDataComplete(
+    TRequestStatus &aStatus)
+	{
+	TRequestStatus *ptr = &aStatus;
+	TInt r = WriteDataComplete();
+	User::RequestComplete(ptr,r);
+	}
+	
+// -----------------------------------------------------------------------------
+// COma2AgentImportFile::
+// 
+// -----------------------------------------------------------------------------
+//
+TInt COma2AgentImportFile::OutputFileCountL() const
+	{
+	return iOutputFiles.Count();
+	}
+
+// -----------------------------------------------------------------------------
+// COma2AgentImportFile::
+// 
+// -----------------------------------------------------------------------------
+//
+CSupplierOutputFile& COma2AgentImportFile::OutputFileL(
+    TInt aIndex)
+	{
+	return *iOutputFiles[aIndex];
+	}
+
+// -----------------------------------------------------------------------------
+// COma2AgentImportFile::
+// 
+// -----------------------------------------------------------------------------
+//
+TImportStatus COma2AgentImportFile::GetImportStatus() const
+	{
+	return iImportStatus;
+	}	
+
+// -----------------------------------------------------------------------------
+// COma2AgentImportFile::
+// 
+// -----------------------------------------------------------------------------
+//
+TInt COma2AgentImportFile::GetSuggestedOutputFileExtension(
+    TDes& aFileExtension)
+	{
+	aFileExtension.Copy(_L(".dcf"));
+	return KErrNone;
+	}
+
+// -----------------------------------------------------------------------------
+// COma2AgentImportFile::
+// 
+// -----------------------------------------------------------------------------
+//
+TInt COma2AgentImportFile::GetSuggestedOutputFileName(
+    TDes& aFileName)
+	{
+	aFileName.Append(_L(".dcf"));
+	return KErrNone;
+	}
+
+// -----------------------------------------------------------------------------
+// COma2AgentImportFile::
+// 
+// -----------------------------------------------------------------------------
+//
+TInt COma2AgentImportFile::ContinueWithNewOutputFile(
+    RFile& aFile,
+    const TDesC& aFileName)
+	{
+	RFile file;
+	TInt r = KErrNone;
+
+	if (iOutputFileName != NULL)
+	    {
+	    delete iOutputFileName;
+	    iOutputFileName = NULL;
+	    }
+	TRAP(r, iOutputFileName = aFileName.AllocL());
+	if (r == KErrNone)
+	    {
+	    file.Duplicate(aFile);
+        iFile.Attach(file);
+        iFileOpen = ETrue;
+		if (iImportType == EOma1DrmMessage)
+		    {
+		    TRAP(r, iMessageParser->InitializeMessageParserL(iFile));
+		    }
+		else
+		    {
+		    TRAP(r, iDcfCreator->EncryptInitializeL(iFile, *iDcfMimeType,
+		        iDcfRights));
+		    }
+        if (r == KErrNone)
+            {
+            r = WriteData(*iLastWriteData);
+            }
+        delete iLastWriteData;
+        iLastWriteData = NULL;
+	    }
+	return r;
+	}
+
+// -----------------------------------------------------------------------------
+// COma2AgentImportFile::
+// 
+// -----------------------------------------------------------------------------
+//
+void COma2AgentImportFile::ContinueWithNewOutputFile(
+    RFile& aFile,
+    const TDesC& aFileName,
+    TRequestStatus& aStatus)
+	{
+	TRequestStatus *ptr = &aStatus;
+	TInt r = ContinueWithNewOutputFile(aFile, aFileName);
+	User::RequestComplete(ptr,r);
+	}
+
+// -----------------------------------------------------------------------------
+// COma2AgentImportFile::
+// 
+// -----------------------------------------------------------------------------
+//
+void COma2AgentImportFile::NewMimePartL(
+    const TDesC8& /*aMimeType*/,
+    const CMetaDataArray& /*aImportMetaData*/)
+	{
+	User::Leave(KErrCANotSupported);
+	}
+
+// -----------------------------------------------------------------------------
+// COma2AgentImportFile::
+// 
+// -----------------------------------------------------------------------------
+//
+void COma2AgentImportFile::EndMimePartL()
+	{
+	User::Leave(KErrCANotSupported);
+	}
+
+// End of file