diff -r 581b7c2ef978 -r c11c717470d0 contentmgmt/cafstreamingsupport/test/tscaf/source/tpostacquisition.cpp --- /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 +#include +#include +#include +#include +#include + +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; + }