installationservices/switestfw/test/rtautils/archiveStep.cpp
changeset 0 ba25891c3a9e
child 4 3eebb1e54d3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/installationservices/switestfw/test/rtautils/archiveStep.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,281 @@
+/*
+* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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: 
+*
+*/
+
+
+#include <test/testexecutelog.h>
+#include <apmstd.h>
+#include <caf/caf.h>
+#include <caf/manager.h>
+#include "archivestep.h"
+#include "rtaArchive.h"
+#include "reftestagentconstants.h"
+
+#include <apgcli.h>
+using namespace ReferenceTestAgent;
+using namespace ContentAccess;
+
+CCreateDrmArchive::~CCreateDrmArchive()
+	{
+	}
+
+CCreateDrmArchive::CCreateDrmArchive(CRTAUtilsServer& aParent) : iParent(aParent)
+	{
+	SetTestStepName(KCreateDrmArchive);
+	}
+
+
+TVerdict CCreateDrmArchive::doTestStepL()
+	{
+	// SetTestStepResult(EInconclusive) is a bad idea.
+	// It makes the TEST macroes unusable.
+
+	TPtrC contentXml;
+	TPtrC rightsXml;
+	TPtrC outputFile;
+	GetStringFromConfig(ConfigSection(),_L("ContentDescription"),contentXml);
+	GetStringFromConfig(ConfigSection(),_L("RightsDescription"),rightsXml);
+	GetStringFromConfig(ConfigSection(),_L("OutputFile"),outputFile);
+	__UHEAP_MARK;	
+	
+	INFO_PRINTF1(_L("Creating DRM archive using the following parameters"));
+	INFO_PRINTF2(_L("		Content Xml Description : %S"),&contentXml);
+	INFO_PRINTF2(_L("		Rights Xml Description  : %S"),&rightsXml);
+	INFO_PRINTF2(_L("		Output File             : %S"),&outputFile);
+
+	// CreateArchive will need to modify the output file name
+	TFileName outputFileName;
+	outputFileName.Copy(outputFile);
+	
+	TBuf8 <KMaxDataTypeLength> mimeType;
+	
+	TInt err = CRefTestAgentArchive::CreateArchive(contentXml, rightsXml, outputFileName, mimeType);
+	if(err != KErrNone)
+		{
+		INFO_PRINTF3(_L("ERROR: %d, Create Archive \"%S\" failed"), err, &outputFileName);
+		INFO_PRINTF1(_L("            Check c:\\logs\\rta\\rta.log to make sure input XML is correct and make sure the output file does not already exist"));
+		SetTestStepResult(EFail);
+		}
+	else
+		{
+		TBuf <KMaxDataTypeLength> mimeType16;
+		mimeType16.Copy(mimeType);
+		INFO_PRINTF1(_L("Drm Archive Created Successfully"));
+		INFO_PRINTF2(_L("		Mime Type of Output File: %S"),&mimeType16);
+		INFO_PRINTF2(_L("		Output File Produced    : %S"),&outputFileName);
+		}
+
+	__UHEAP_MARKEND;
+	
+	
+	return TestStepResult();
+	}	
+
+
+CImportDrmArchive::~CImportDrmArchive()
+	{
+	}
+
+CImportDrmArchive::CImportDrmArchive(CRTAUtilsServer& aParent) : iParent(aParent)
+	{
+	SetTestStepName(KImportDrmArchive);
+	}
+
+
+TVerdict CImportDrmArchive::doTestStepL()
+	{
+	// SetTestStepResult(EInconclusive) is a bad idea.
+	// It makes the TEST macroes unusable.
+
+	TPtrC source;
+	TPtrC target;
+	TPtrC importerMode;
+
+	GetStringFromConfig(ConfigSection(),_L("source"),source);
+	GetStringFromConfig(ConfigSection(),_L("target"),target);
+
+	// importerMode is optional in ini file. If the token exist and its
+	// value == ClientCreateFiles, then RTAUtils will hide the output
+	// filename from CImportFile and handle opening the output file
+	// and receipt files itself.
+	GetStringFromConfig(ConfigSection(),_L("importerMode"),importerMode);
+	
+	_LIT(KClientCreateFiles, "ClientCreateFiles");
+	TBool doFileCreate = (importerMode.CompareF(KClientCreateFiles) == 0);
+
+	INFO_PRINTF2(_L("Importing DRM archive : %S "), &source);
+	INFO_PRINTF2(_L("Writing output archive: %S "), &target);
+
+	TPtrC outputPath;
+	TPtrC suggestedOutFileName;
+
+	TParsePtrC parser(target);
+	outputPath.Set( parser.DriveAndPath() );
+	suggestedOutFileName.Set( parser.NameAndExt() );
+
+	__UHEAP_MARK;	
+	TInt numpushed(0);
+
+	// create a supplier session
+	CSupplier *mySupplier = CSupplier::NewLC();
+	numpushed++;
+
+	mySupplier->SetOutputDirectoryL(outputPath);
+
+	// fill in a metadata array with just the mime type
+	CMetaDataArray *metaDataArray = CMetaDataArray::NewL();
+	CleanupStack::PushL(metaDataArray);
+	numpushed++;
+
+	_LIT8(KContentType,"content-type");
+	metaDataArray->AddL(KContentType(), KRtaMimeRights);
+	metaDataArray->AddL(KContentType(), KRtaMimeContentRights);
+
+	CImportFile* import = NULL;
+	if (doFileCreate)
+		{
+		import = mySupplier->ImportFileL(KRtaMimeContentRights, *metaDataArray);
+		}
+	else
+		{
+		import = mySupplier->ImportFileL(KRtaMimeContentRights, *metaDataArray, suggestedOutFileName);
+		}
+
+	CleanupStack::PopAndDestroy(metaDataArray);  // numpushed--
+	CleanupStack::PushL(import);  // numpushed++, so cancel with line above
+
+	RFs fs;
+	User::LeaveIfError(fs.Connect());
+	CleanupClosePushL(fs);
+	numpushed++;
+	
+#ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API 
+	RFile64 sourcefile;
+#else
+	RFile sourcefile;
+#endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
+	
+	User::LeaveIfError(sourcefile.Open(fs, source, EFileRead | EFileStream | EFileShareReadersOnly));
+	CleanupClosePushL(sourcefile);
+	numpushed++;
+
+	RFile targetfile;
+	TBool targetFileOpen = EFalse;
+	TInt err(KErrNone);
+	TFileName fn;
+
+	const TInt KMyBufSize = 10;
+	TBuf8 <KMyBufSize> buffer;
+	TInt length = KMyBufSize;
+	while(length > 0)
+		{
+		User::LeaveIfError(sourcefile.Read(buffer, buffer.MaxLength()));
+		length = buffer.Length();
+		err = import->WriteData(buffer);
+		
+		if(err != KErrNone)
+			{
+			if(err == KErrCANewFileHandleRequired)
+				{
+				TESTL(doFileCreate);
+				TESTL(!targetFileOpen);
+
+				import->GetSuggestedOutputFileName(fn);
+				fn.Insert(0, outputPath);
+
+				INFO_PRINTF3(_L("Agent suggested name is %S, target is %S."), &fn, &target);
+
+				User::LeaveIfError(targetfile.Create(fs, target, EFileStream | EFileWrite | EFileShareAny));
+				CleanupClosePushL(targetfile);
+				numpushed++;
+				targetFileOpen = ETrue;
+				User::LeaveIfError(import->ContinueWithNewOutputFile(targetfile, fn));
+				}
+			else
+				{					
+				INFO_PRINTF2(_L("Error writing data, Error code is: %d"),err);
+				User::LeaveIfError(err);
+				}
+			}
+		}
+
+	if(targetFileOpen)
+		{
+		CleanupStack::PopAndDestroy(&targetfile);	
+		numpushed--;
+		}
+
+	// process the rights that were received alongside the content
+	err = import->WriteDataComplete();
+	while(err == KErrCANewFileHandleRequired)
+		{
+		TEST(doFileCreate);
+
+		import->GetSuggestedOutputFileName(fn);
+		fn.Insert(0, outputPath);
+		
+		INFO_PRINTF2(_L("Creating Receipt File: %S "), &fn);								
+		RFile receiptFile;
+		User::LeaveIfError(receiptFile.Replace(fs, fn, EFileStream | EFileWrite | EFileShareAny));
+		CleanupClosePushL(receiptFile);
+		err = import->ContinueWithNewOutputFile(receiptFile, fn);
+		CleanupStack::PopAndDestroy(&receiptFile);	
+		}
+
+	User::LeaveIfError(err);
+
+	TPtrC importOutFileName;
+	TPtrC contentOutputName(KNullDesC);
+	for (TInt i = 0; i < import->OutputFileCountL(); i++)
+		{
+		importOutFileName.Set( import->OutputFileL(i).FileName() );
+
+		if (import->OutputFileL(i).OutputType() == EContent)
+			{
+			contentOutputName.Set(importOutFileName);
+			}
+		else
+			{
+			// delete the receipt we just created
+			// they only get in the way when importing files using the utility
+			INFO_PRINTF2(_L("Receipt files %S deleted (not important) when using ImportDrmArchive step"), &importOutFileName);										
+			fs.Delete(importOutFileName); // ignore return code
+			}
+		}
+
+	if (contentOutputName.CompareF(target) != 0)
+		{
+		// This must be the case that RTA automatically create
+		// output file. See the line targetfile.Create(fs, target, ...).
+
+		// Before DEF088475, users of RTAUtils test harness can
+		// specify whatever extension for the output file. The 
+		// defect fix changed the importer from CRefTestAgentImport
+		// (unit test) to CImportFile (end-to-end test). CImportFile
+		// converts non-standard ext to .content. To maintain backward
+		// compatibility, we need to rename the generated output.
+
+		fs.Delete(target); // ignore return code
+		TEST(fs.Rename(contentOutputName, target) == 0);
+		}
+	
+	CleanupStack::PopAndDestroy(numpushed);
+
+	__UHEAP_MARKEND;
+	
+	return TestStepResult();
+	}
+