diff -r 000000000000 -r bde4ae8d615e os/security/contentmgmt/contentaccessfwfordrm/source/caf/supplieroutputfile.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/security/contentmgmt/contentaccessfwfordrm/source/caf/supplieroutputfile.cpp Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,185 @@ +/* +* Copyright (c) 2003-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 +#include +#include + +#include +#include "resolver.h" + +#ifndef REMOVE_CAF1 +#include +#include +#include +#endif + + +using namespace ContentAccess; + +#ifndef REMOVE_CAF1 +EXPORT_C CSupplierOutputFile* CSupplierOutputFile::NewL(const TDesC& aFileName, const TOutputType aOutputType) + { + return CSupplierOutputFile::NewL(aFileName, aOutputType, KNullDesC8()); + } +#endif + +EXPORT_C CSupplierOutputFile* CSupplierOutputFile::NewL(const TDesC& aFileName, const TOutputType aOutputType, const TDesC8& aMimeType) + { + CSupplierOutputFile *self = new (ELeave) CSupplierOutputFile(); + CleanupStack::PushL(self); + self->ConstructL(aFileName, aMimeType, aOutputType); + CleanupStack::Pop(self); + return self; + } + +EXPORT_C CSupplierOutputFile* CSupplierOutputFile::NewL(RReadStream& aStream) + { + CSupplierOutputFile *self = new (ELeave) CSupplierOutputFile(); + CleanupStack::PushL(self); + self->InternalizeL(aStream); + CleanupStack::Pop(self); + return self; + } + +CSupplierOutputFile::CSupplierOutputFile() + { + } + + +void CSupplierOutputFile::ConstructL(const TDesC& aFileName, const TDesC8& aMimeType, const TOutputType aOutputType) + { + iOutputType = aOutputType; + + CAgentResolver *resolver = CAgentResolver::NewL(EFalse); + CleanupStack::PushL(resolver); + iFileName = resolver->ConvertAgentFileNameL(aFileName); + CleanupStack::PopAndDestroy(resolver); + iMimeType.Copy(aMimeType); + + // convert mime type to lower case + iMimeType.LowerCase(); + } + + +CSupplierOutputFile::~CSupplierOutputFile() + { + delete iFileName; +#ifndef REMOVE_CAF1 + delete iAttr; +#endif + } + + +EXPORT_C TPtrC CSupplierOutputFile::FileName() const + { + return *iFileName; + } + +EXPORT_C TOutputType CSupplierOutputFile::OutputType() const + { + return iOutputType; + } + +EXPORT_C TPtrC8 CSupplierOutputFile::MimeTypeL() + { + TUid uid; + TDataType dataType; + RApaLsSession apparcSession; + + if(iMimeType.Length() == 0) + { + // Use the Application Architecture Server to find the Mime type of the output File + User::LeaveIfError(apparcSession.Connect()); + CleanupClosePushL(apparcSession); + + // Use a temp FS session to preserve platsec + RFs tempFsSession; + User::LeaveIfError(tempFsSession.Connect()); + CleanupClosePushL(tempFsSession); + User::LeaveIfError(tempFsSession.ShareProtected()); + + // Open file here and send the handle because AppArc doesn't have Allfiles capability +#ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API + // If file size is greater than 2GB than RFile::Open will fail with KErrTooBig. + // So RFile64. + RFile64 tempFile; +#else + RFile tempFile; +#endif //SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API + User::LeaveIfError(tempFile.Open(tempFsSession, *iFileName, EFileRead|EFileShareAny)); + CleanupClosePushL(tempFile); + + User::LeaveIfError(apparcSession.AppForDocument(tempFile, uid, dataType)); + + iMimeType.Copy(dataType.Des8().Left(KMaxDataTypeLength)); + + CleanupStack::PopAndDestroy(&tempFile); // close + CleanupStack::PopAndDestroy(&tempFsSession); // close + CleanupStack::PopAndDestroy(&apparcSession); // close + } + + return iMimeType; + } + +EXPORT_C void CSupplierOutputFile::ExternalizeL(RWriteStream& aStream) const + { + aStream.WriteInt32L(static_cast (iOutputType)); + aStream.WriteInt32L(iFileName->Des().Length()); + aStream.WriteL(*iFileName); + aStream.WriteInt32L(iMimeType.Length()); + aStream.WriteL(iMimeType); + } + +void CSupplierOutputFile::InternalizeL(RReadStream& aStream) + { + TInt length = 0; + iOutputType = static_cast (aStream.ReadInt32L()); + length = aStream.ReadInt32L(); + iFileName = HBufC::NewL(length); + if(length) + { + TPtr filename = iFileName->Des(); + aStream.ReadL(filename, length); + } + length = aStream.ReadInt32L(); + aStream.ReadL(iMimeType, length); + } + + + +#ifndef REMOVE_CAF1 +EXPORT_C CAttribute & CSupplierOutputFile::AttributesL (TBool aPreloaded) + { + // retrieve the attributes, only need to do this once since this instance + // will only ever refer to one output file + if(!iAttr) + { + // create a content consumer interface for the output file produced + CContent* content = CContent::NewLC(FileName()); + iAttr = content->NewAttributeL(ETrue); + CleanupStack::PopAndDestroy(content); + } + else if(aPreloaded) // update all attribute bits + { + CBitset &bitset = iAttr->QuerySet(); + bitset.SetAll(); + iAttr->GetL(); + } + return *iAttr; + } +#endif // #ifndef REMOVE_CAF1