contentmgmt/cafstreamingsupport/test/tscaf/source/tpostacquisition.cpp
changeset 56 c11c717470d0
child 66 8873e6835f7b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contentmgmt/cafstreamingsupport/test/tscaf/source/tpostacquisition.cpp	Fri Apr 16 16:52:34 2010 +0300
@@ -0,0 +1,196 @@
+// Copyright (c) 2007-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:
+// Implements the post-acquisition content protection test.
+// 
+//
+
+#include "tpostacquisition.h"
+#include "testprotstrdesc.h"
+#include "testagentkeystreamdecoder.h"
+#include <caf/data.h>
+#include <caf/content.h>
+#include <caf/supplier.h>
+#include <caf/metadataarray.h>
+#include <caf/supplieroutputfile.h>
+#include <caf/streaming/keystreamdecoder.h>
+
+using namespace StreamAccess;
+using namespace ContentAccess;
+
+CScafPostAcquisition::CScafPostAcquisition(CScafServer& aParent)
+/**
+ 	Constructor for the postacquisition test object.
+ */
+	:	CScafStep(aParent)
+	{
+	SetTestStepName(KScafPostAcquisitionStep);
+	}
+
+CScafPostAcquisition::~CScafPostAcquisition()
+/**
+ 	Destructor for the postacquisition test object.
+ */
+	{
+	//empty
+	}
+
+void DeleteFileL(RFs& aFs, const TDesC& aPath)
+	{
+	TInt err = 0;
+	err = aFs.Delete(aPath);
+	if(err != KErrNone && err != KErrNotFound && err != KErrPathNotFound)
+		{
+		User::Leave(err);
+		}
+	}
+
+TVerdict CScafPostAcquisition::doTestL()
+	{
+#ifdef INTERNALLY_ENABLE_UPWARD_DEPENDENCY
+	TBool createOutputFile = EFalse;
+	
+	if(!GetBoolFromConfig(ConfigSection(), KCreateOutputFiles, createOutputFile))
+		{
+		ERR_PRINTF2(_L("Failed to read '%S' key of configuration"), &KCreateOutputFiles);
+		SetTestStepResult(EFail);
+		return TestStepResult();
+		}
+	
+	//Ensure pre-conditions
+	CleanAgentsPrivateFolderL(KRtaPrivateFolder());
+	CleanAgentsPrivateFolderL(KStaPrivateFolder());
+	CleanAgentsPrivateFolderL(KTestServerPrivateFolder());
+	CleanAgentsPrivateFolderL(KRtaTestFolder());
+	DeleteFileL(iParent.Fs(), _L("c:\\PostAcquisitionTest.dr"));
+	DeleteFileL(iParent.Fs(), _L("c:\\PostAcquisitionTest.TXT"));
+
+	//First copy the RO, which allows to record the protected content, into the test agent's private directory
+	CopyFile2AgentsPrivateFolderL(iParent.Fs(), KRecordableRoFileName(), KStaPrivateFolder());
+	
+	//Secondly copy the program protected RO into the test agent's private directory
+	CopyFile2AgentsPrivateFolderL(iParent.Fs(), KPostAcquisitionRoFileName(), KStaPrivateFolder());
+	
+	//Create an SDP document object and set the created key stream field object
+	CSdpDocument* sdpDoc = CreateSdpDocumentLC();
+	//Create a SDP object for RO-Recordable
+	CSdpMediaField* sdp = CreateSdpLC(0);
+	AddMediaFieldL(*sdpDoc, sdp);
+	CleanupStack::Pop(sdp);
+	
+	// Generate a protected key stream description. 
+	HBufC* filePath = GetFullPathLC(KStaPrivateFolder, KNullDesC);
+	CTestProtectedStreamDesc* protectStreamDesc = CTestProtectedStreamDesc::NewL(*filePath);
+	CleanupStack::PopAndDestroy(filePath);
+	CleanupStack::PushL(protectStreamDesc);
+	
+	//Create a key stream decoder
+	CKeyStreamDecoder* decoder = CKeyStreamDecoder::NewL(*protectStreamDesc, *sdp, *sdpDoc); 
+	CleanupStack::PushL(decoder);
+	
+	//Check whether the content is recordable
+	TBool value = EFalse;
+	decoder->GetAttributeL(ECanExport, value);
+	if(!value)
+		{
+		ERR_PRINTF1(_L("The content can not be exported. Unexpected result!"));
+		SetTestStepResult(EFail);
+		User::Leave(KErrCANotSupported);
+		}
+	
+	CImportFile* import(0);
+	_LIT(KPostAcqContentFileName, "postacquisition.content");
+	if(!createOutputFile)
+		{
+		HBufC* outputDir = GetFullPathLC(KRtaPrivateFolder(), KNullDesC());
+		import = decoder->CreateImportSessionLC(_L8("text/plain"), KPostAcqContentFileName(), *outputDir);
+		CleanupStack::Pop(import);
+		CleanupStack::PopAndDestroy(outputDir);
+		CleanupStack::PushL(import);
+		}
+	else
+		{
+		import = decoder->CreateImportSessionLC(_L8("text/plain")); 
+		//To get a better coverage, delete this import object and create another one with zero-length-output-directory.
+		CleanupStack::PopAndDestroy(import);
+		DeleteFileL(iParent.Fs(), _L("c:\\PostAcquisitionTest.dr"));
+		DeleteFileL(iParent.Fs(), _L("c:\\PostAcquisitionTest.TXT"));
+		import = decoder->CreateImportSessionLC(_L8("text/plain"), _L("NULL"), KNullDesC()); 
+		}
+	
+	_LIT8(KStreamingData1,"SampleStreamingDataBegan");
+	_LIT8(KStreamingData2,"TheEndOfStreamingData");
+	_LIT8(KStreamingDataFull,"SampleStreamingDataBeganTheEndOfStreamingData");
+	
+	User::LeaveIfError(import->WriteData(KStreamingData1()));
+	User::LeaveIfError(import->WriteData(KStreamingData2()));
+	//Import has been completed
+	TFileName fileName;
+	TInt err = 0;
+	err = import->WriteDataComplete();
+	while (err == KErrCANewFileHandleRequired)              
+        {
+        err = ProvideNewOutputFileL(*import, fileName);
+        if(err == KErrNone)
+        	{
+        	err = import->WriteDataComplete();
+        	}
+        }
+	User::LeaveIfError(err);
+	
+	CleanupStack::PopAndDestroy(3, protectStreamDesc);
+	CleanupStack::PopAndDestroy(); //sdpDoc
+	
+	//Try to read what we have imported
+	CContent* content(0);
+	if(!createOutputFile)
+		{
+		HBufC* filePath = GetFullPathLC(KRtaPrivateFolder(), KPostAcqContentFileName());
+		content = CContent::NewL(*filePath);
+		CleanupStack::PopAndDestroy(filePath);
+		CleanupStack::PushL(content);
+		}
+	else
+		{
+		content = CContent::NewLC(fileName);
+		}
+	CData* mydata = content->OpenContentL(EView);
+	CleanupStack::PushL(mydata);
+	
+	RBuf8 rdata;
+	rdata.CreateL(KStreamingDataFull().Length());
+	rdata.CleanupClosePushL();
+	User::LeaveIfError(mydata->Read(rdata));
+	if(rdata.Compare(KStreamingDataFull()))
+		{
+		SetTestStepResult(EFail);		
+		}
+	CleanupStack::PopAndDestroy(3, content);
+#endif	
+	return TestStepResult();
+	}
+
+TInt CScafPostAcquisition::ProvideNewOutputFileL(CImportFile& aImport, TDes& aName)
+	{
+	TInt err = 0;
+	// supply new file in order to continue writing
+	aImport.GetSuggestedOutputFileName(aName);
+    HBufC* newFullName = GetFullPathLC(KRtaTestFolder(), aName);
+    RFile newFile;
+    User::LeaveIfError(newFile.Replace(iParent.Fs(), *newFullName, EFileWrite));
+    err = aImport.ContinueWithNewOutputFile(newFile, *newFullName);
+    newFile.Close();
+    aName.Copy(*newFullName);
+    CleanupStack::PopAndDestroy(newFullName);
+    return err;
+	}