sl@0: /* sl@0: * Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: * All rights reserved. sl@0: * This component and the accompanying materials are made available sl@0: * under the terms of the License "Eclipse Public License v1.0" sl@0: * which accompanies this distribution, and is available sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: * sl@0: * Initial Contributors: sl@0: * Nokia Corporation - initial contribution. sl@0: * sl@0: * Contributors: sl@0: * sl@0: * Description: sl@0: * sl@0: */ sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: #include sl@0: #include "resolver.h" sl@0: sl@0: #ifndef REMOVE_CAF1 sl@0: #include sl@0: #include sl@0: #include sl@0: #endif sl@0: sl@0: sl@0: using namespace ContentAccess; sl@0: sl@0: #ifndef REMOVE_CAF1 sl@0: EXPORT_C CSupplierOutputFile* CSupplierOutputFile::NewL(const TDesC& aFileName, const TOutputType aOutputType) sl@0: { sl@0: return CSupplierOutputFile::NewL(aFileName, aOutputType, KNullDesC8()); sl@0: } sl@0: #endif sl@0: sl@0: EXPORT_C CSupplierOutputFile* CSupplierOutputFile::NewL(const TDesC& aFileName, const TOutputType aOutputType, const TDesC8& aMimeType) sl@0: { sl@0: CSupplierOutputFile *self = new (ELeave) CSupplierOutputFile(); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aFileName, aMimeType, aOutputType); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: EXPORT_C CSupplierOutputFile* CSupplierOutputFile::NewL(RReadStream& aStream) sl@0: { sl@0: CSupplierOutputFile *self = new (ELeave) CSupplierOutputFile(); sl@0: CleanupStack::PushL(self); sl@0: self->InternalizeL(aStream); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: CSupplierOutputFile::CSupplierOutputFile() sl@0: { sl@0: } sl@0: sl@0: sl@0: void CSupplierOutputFile::ConstructL(const TDesC& aFileName, const TDesC8& aMimeType, const TOutputType aOutputType) sl@0: { sl@0: iOutputType = aOutputType; sl@0: sl@0: CAgentResolver *resolver = CAgentResolver::NewL(EFalse); sl@0: CleanupStack::PushL(resolver); sl@0: iFileName = resolver->ConvertAgentFileNameL(aFileName); sl@0: CleanupStack::PopAndDestroy(resolver); sl@0: iMimeType.Copy(aMimeType); sl@0: sl@0: // convert mime type to lower case sl@0: iMimeType.LowerCase(); sl@0: } sl@0: sl@0: sl@0: CSupplierOutputFile::~CSupplierOutputFile() sl@0: { sl@0: delete iFileName; sl@0: #ifndef REMOVE_CAF1 sl@0: delete iAttr; sl@0: #endif sl@0: } sl@0: sl@0: sl@0: EXPORT_C TPtrC CSupplierOutputFile::FileName() const sl@0: { sl@0: return *iFileName; sl@0: } sl@0: sl@0: EXPORT_C TOutputType CSupplierOutputFile::OutputType() const sl@0: { sl@0: return iOutputType; sl@0: } sl@0: sl@0: EXPORT_C TPtrC8 CSupplierOutputFile::MimeTypeL() sl@0: { sl@0: TUid uid; sl@0: TDataType dataType; sl@0: RApaLsSession apparcSession; sl@0: sl@0: if(iMimeType.Length() == 0) sl@0: { sl@0: // Use the Application Architecture Server to find the Mime type of the output File sl@0: User::LeaveIfError(apparcSession.Connect()); sl@0: CleanupClosePushL(apparcSession); sl@0: sl@0: // Use a temp FS session to preserve platsec sl@0: RFs tempFsSession; sl@0: User::LeaveIfError(tempFsSession.Connect()); sl@0: CleanupClosePushL(tempFsSession); sl@0: User::LeaveIfError(tempFsSession.ShareProtected()); sl@0: sl@0: // Open file here and send the handle because AppArc doesn't have Allfiles capability sl@0: #ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API sl@0: // If file size is greater than 2GB than RFile::Open will fail with KErrTooBig. sl@0: // So RFile64. sl@0: RFile64 tempFile; sl@0: #else sl@0: RFile tempFile; sl@0: #endif //SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API sl@0: User::LeaveIfError(tempFile.Open(tempFsSession, *iFileName, EFileRead|EFileShareAny)); sl@0: CleanupClosePushL(tempFile); sl@0: sl@0: User::LeaveIfError(apparcSession.AppForDocument(tempFile, uid, dataType)); sl@0: sl@0: iMimeType.Copy(dataType.Des8().Left(KMaxDataTypeLength)); sl@0: sl@0: CleanupStack::PopAndDestroy(&tempFile); // close sl@0: CleanupStack::PopAndDestroy(&tempFsSession); // close sl@0: CleanupStack::PopAndDestroy(&apparcSession); // close sl@0: } sl@0: sl@0: return iMimeType; sl@0: } sl@0: sl@0: EXPORT_C void CSupplierOutputFile::ExternalizeL(RWriteStream& aStream) const sl@0: { sl@0: aStream.WriteInt32L(static_cast (iOutputType)); sl@0: aStream.WriteInt32L(iFileName->Des().Length()); sl@0: aStream.WriteL(*iFileName); sl@0: aStream.WriteInt32L(iMimeType.Length()); sl@0: aStream.WriteL(iMimeType); sl@0: } sl@0: sl@0: void CSupplierOutputFile::InternalizeL(RReadStream& aStream) sl@0: { sl@0: TInt length = 0; sl@0: iOutputType = static_cast (aStream.ReadInt32L()); sl@0: length = aStream.ReadInt32L(); sl@0: iFileName = HBufC::NewL(length); sl@0: if(length) sl@0: { sl@0: TPtr filename = iFileName->Des(); sl@0: aStream.ReadL(filename, length); sl@0: } sl@0: length = aStream.ReadInt32L(); sl@0: aStream.ReadL(iMimeType, length); sl@0: } sl@0: sl@0: sl@0: sl@0: #ifndef REMOVE_CAF1 sl@0: EXPORT_C CAttribute & CSupplierOutputFile::AttributesL (TBool aPreloaded) sl@0: { sl@0: // retrieve the attributes, only need to do this once since this instance sl@0: // will only ever refer to one output file sl@0: if(!iAttr) sl@0: { sl@0: // create a content consumer interface for the output file produced sl@0: CContent* content = CContent::NewLC(FileName()); sl@0: iAttr = content->NewAttributeL(ETrue); sl@0: CleanupStack::PopAndDestroy(content); sl@0: } sl@0: else if(aPreloaded) // update all attribute bits sl@0: { sl@0: CBitset &bitset = iAttr->QuerySet(); sl@0: bitset.SetAll(); sl@0: iAttr->GetL(); sl@0: } sl@0: return *iAttr; sl@0: } sl@0: #endif // #ifndef REMOVE_CAF1