wmdrm/wmdrmengine/wmdrmagent/src/wmdrmagentimportfile.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:52:27 +0200
changeset 0 95b198f216e5
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* 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:  ?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 <WmdrmAgent.h>
#include "WmDrmAgentImportfile.h"
#include "logfn.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 ===============================

// -----------------------------------------------------------------------------
// CWmDrmAgentImportFile::
// 
// -----------------------------------------------------------------------------
//
CWmDrmAgentImportFile* CWmDrmAgentImportFile::NewL(
    const TDesC8& aMimeType,
    const CMetaDataArray& aMetaDataArray,
    const TDesC& aOutputDirectory,
    const TDesC& aSuggestedFileName)
	{
	LOGFN( "CWmDrmAgentImportFile::NewL" );
	CWmDrmAgentImportFile* self=new(ELeave) CWmDrmAgentImportFile(EFalse);
	CleanupStack::PushL(self);
	self->ConstructL(aMimeType, aMetaDataArray, aOutputDirectory,
	    aSuggestedFileName);
	CleanupStack::Pop(self);
	return self;
	}

// -----------------------------------------------------------------------------
// CWmDrmAgentImportFile::
// 
// -----------------------------------------------------------------------------
//
CWmDrmAgentImportFile* CWmDrmAgentImportFile::NewL(
    const TDesC8& aMimeType,
    const CMetaDataArray& aMetaDataArray)
	{
	LOGFN( "CWmDrmAgentImportFile::NewL (2)" );
	CWmDrmAgentImportFile* self=new(ELeave) CWmDrmAgentImportFile(EFalse);
	CleanupStack::PushL(self);
	self->ConstructL(aMimeType, aMetaDataArray, KNullDesC(), KNullDesC());
	CleanupStack::Pop(self);
	return self;
	}
	
// -----------------------------------------------------------------------------
// CWmDrmAgentImportFile::
// 
// -----------------------------------------------------------------------------
//
CWmDrmAgentImportFile::CWmDrmAgentImportFile(
    TBool aAgentCreatesOutputFiles):
    iOutputDirectory(NULL),
    iSuggestedFileName(NULL),
    iOutputFileName(NULL),
    iLastWriteData(NULL),
    iAgentCreatesOutputFiles(aAgentCreatesOutputFiles)
	{
	LOGFN( "CWmDrmAgentImportFile::CWmDrmAgentImportFile" );
	iImportStatus = EInProgress;
	}

// -----------------------------------------------------------------------------
// CWmDrmAgentImportFile::
// 
// -----------------------------------------------------------------------------
//
CWmDrmAgentImportFile::~CWmDrmAgentImportFile()
	{
	LOGFN( "CWmDrmAgentImportFile::~CWmDrmAgentImportFile" );
	if (iFileOpen)
		{
		iFile.Close();
		iFileOpen = EFalse;
		}
	iFs.Close();
	delete iOutputDirectory;
	delete iSuggestedFileName;
    delete iOutputFileName;
	delete iLastWriteData;
	iOutputFiles.ResetAndDestroy();
	iOutputFiles.Close();
	}
  
// -----------------------------------------------------------------------------
// CWmDrmAgentImportFile::
// 
// -----------------------------------------------------------------------------
//
void CWmDrmAgentImportFile::ConstructL(
    const TDesC8& aMimeType,
    const CMetaDataArray& /*aMetaDataArray*/,
    const TDesC& aOutputDirectory,
    const TDesC& aSuggestedFileName)
	{
	LOGFN( "CWmDrmAgentImportFile::ConstructL" );

    iMimeType = aMimeType.AllocL();
	iOutputDirectory = aOutputDirectory.AllocL();
	iSuggestedFileName = aSuggestedFileName.AllocL();
    iOutputFileName = HBufC::NewL(iOutputDirectory->Des().Length() +
                                  iSuggestedFileName->Des().Length());
	iAgentCreatesOutputFiles = ETrue;

	User::LeaveIfError(iFs.Connect());
    User::LeaveIfError(iFs.ShareAuto());
	}

// -----------------------------------------------------------------------------
// CWmDrmAgentImportFile::
// 
// -----------------------------------------------------------------------------
//
TInt CWmDrmAgentImportFile::OpenOutputFile()
	{
	TInt r = KErrNone;
	TPtr fileNamePtr = iOutputFileName->Des();
	
	fileNamePtr.Copy(*iOutputDirectory);
	fileNamePtr.Append(*iSuggestedFileName);

	r = iFile.Create(iFs, fileNamePtr, EFileShareReadersOrWriters  | EFileStream |
	    EFileWrite);
	if (r == KErrNone)
		{
		iFileOpen = ETrue;
		}
    else
        {
        r = KErrCANewFileHandleRequired;
        }
    return r;
	}

// -----------------------------------------------------------------------------
// CWmDrmAgentImportFile::
// 
// -----------------------------------------------------------------------------
//
void CWmDrmAgentImportFile::WriteDataL( const TDesC8& aData )
    {
    LOGFN( "CWmDrmAgentImportFile::WriteDataL" );
    TInt err = KErrNone;
    
    if( !iFileOpen ) 
        {
        err = OpenOutputFile();
        if( err )
            {
            User::Leave(KErrCANewFileHandleRequired);
            }
        }
    User::LeaveIfError( iFile.Write( aData ) );        
    }
    
// -----------------------------------------------------------------------------
// CWmDrmAgentImportFile::
// 
// -----------------------------------------------------------------------------
//
TInt CWmDrmAgentImportFile::WriteData(const TDesC8& aData)
	{
	LOGFN( "CWmDrmAgentImportFile::WriteData" );
	TInt r = KErrNone;
	TRAP(r, WriteDataL(aData));
	return r;
	}

// -----------------------------------------------------------------------------
// CWmDrmAgentImportFile::
// 
// -----------------------------------------------------------------------------
//
TInt CWmDrmAgentImportFile::WriteDataComplete()
	{
	LOGFN( "CWmDrmAgentImportFile::WriteDataComplete" );
    TInt r = KErrNone;
    CSupplierOutputFile *temp = NULL;
    
    if( iFileOpen )
        {
        iFile.Close();
        iFileOpen = EFalse;
        }

    if( iOutputFileName )
        {
        TRAP(r, temp = CSupplierOutputFile::NewL( iOutputFileName->Des(), EContent, iMimeType->Des()));
        if( r == KErrNone )
            {
            r = iOutputFiles.Append(temp);
            if( r != KErrNone )
                {
                delete temp;
                }
            }
        }
	return r;
	}
		
// -----------------------------------------------------------------------------
// CWmDrmAgentImportFile::
// 
// -----------------------------------------------------------------------------
//
void CWmDrmAgentImportFile::WriteData(
    const TDesC8& aData,
    TRequestStatus &aStatus)
	{
	LOGFN( "CWmDrmAgentImportFile::WriteData" );
	TRequestStatus *ptr = &aStatus;
	TInt r = WriteData(aData);
	User::RequestComplete(ptr,r);
	}

// -----------------------------------------------------------------------------
// CWmDrmAgentImportFile::
// 
// -----------------------------------------------------------------------------
//
void CWmDrmAgentImportFile::WriteDataComplete(
    TRequestStatus &aStatus)
	{
	LOGFN( "CWmDrmAgentImportFile::WriteDataComplete" );
	TRequestStatus *ptr = &aStatus;
	TInt r = WriteDataComplete();
	User::RequestComplete(ptr,r);
	}
	
// -----------------------------------------------------------------------------
// CWmDrmAgentImportFile::
// 
// -----------------------------------------------------------------------------
//
TInt CWmDrmAgentImportFile::OutputFileCountL() const
	{
	LOGFN( "CWmDrmAgentImportFile::OutputFileCountL" );
	return iOutputFiles.Count();
	}

// -----------------------------------------------------------------------------
// CWmDrmAgentImportFile::
// 
// -----------------------------------------------------------------------------
//
CSupplierOutputFile& CWmDrmAgentImportFile::OutputFileL(
    TInt aIndex)
	{
	LOGFN( "CWmDrmAgentImportFile::OutputFileL" );
	return *iOutputFiles[aIndex];
	}

// -----------------------------------------------------------------------------
// CWmDrmAgentImportFile::
// 
// -----------------------------------------------------------------------------
//
TImportStatus CWmDrmAgentImportFile::GetImportStatus() const
	{
	LOGFN( "CWmDrmAgentImportFile::GetImportStatus" );
	return iImportStatus;
	}	

// -----------------------------------------------------------------------------
// CWmDrmAgentImportFile::
// 
// -----------------------------------------------------------------------------
//
TInt CWmDrmAgentImportFile::GetSuggestedOutputFileExtension(
    TDes& /*aFileExtension*/)
	{
	LOGFN( "CWmDrmAgentImportFile::GetSuggestedOutputFileExtension" );
    return KErrNotSupported;
	}

// -----------------------------------------------------------------------------
// CWmDrmAgentImportFile::
// 
// -----------------------------------------------------------------------------
//
TInt CWmDrmAgentImportFile::GetSuggestedOutputFileName(
    TDes& /*aFileName*/)
	{
	LOGFN( "CWmDrmAgentImportFile::GetSuggestedOutputFileName" );
	return KErrNotSupported;
	}

// -----------------------------------------------------------------------------
// CWmDrmAgentImportFile::
// 
// -----------------------------------------------------------------------------
//
TInt CWmDrmAgentImportFile::ContinueWithNewOutputFile(
    RFile& aFile,
    const TDesC& aFileName)
	{
	RFile file;
	TInt r = KErrNone;
	LOGFN( "CWmDrmAgentImportFile::ContinueWithNewOutputFile" );

	if (iOutputFileName != NULL)
	    {
	    delete iOutputFileName;
	    iOutputFileName = NULL;
	    }
	    
	TRAP(r, iOutputFileName = aFileName.AllocL());
	
	if (r == KErrNone)
	    {
	    iFile.Close();
	    iFile.Duplicate(aFile);
        iFileOpen = ETrue;
	    }
	return r;
	}

// -----------------------------------------------------------------------------
// CWmDrmAgentImportFile::
// 
// -----------------------------------------------------------------------------
//
void CWmDrmAgentImportFile::ContinueWithNewOutputFile(
    RFile& aFile,
    const TDesC& aFileName,
    TRequestStatus& aStatus)
	{
	LOGFN( "CWmDrmAgentImportFile::ContinueWithNewOutputFile (2)" );
	TRequestStatus *ptr = &aStatus;
	TInt r = ContinueWithNewOutputFile(aFile, aFileName);
	User::RequestComplete(ptr,r);
	}

// -----------------------------------------------------------------------------
// CWmDrmAgentImportFile::
// 
// -----------------------------------------------------------------------------
//
void CWmDrmAgentImportFile::NewMimePartL(
    const TDesC8& /*aMimeType*/,
    const CMetaDataArray& /*aImportMetaData*/)
	{
	LOGFN( "CWmDrmAgentImportFile::NewMimePartL" );
	User::Leave(KErrCANotSupported);
	}

// -----------------------------------------------------------------------------
// CWmDrmAgentImportFile::
// 
// -----------------------------------------------------------------------------
//
void CWmDrmAgentImportFile::EndMimePartL()
	{
	LOGFN( "CWmDrmAgentImportFile::EndMimePartL" );
	User::Leave(KErrCANotSupported);
	}

// End of file