sl@0: // Copyright (c) 2004-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 "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: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: using namespace ContentAccess; sl@0: #include sl@0: sl@0: #include "FileAccess.h" sl@0: sl@0: CF32File::~CF32File() sl@0: { sl@0: if (!iFileHandle) sl@0: iFile.Close(); sl@0: delete iFilePath; sl@0: } sl@0: sl@0: CF32File* CF32File::NewL(RFs& aSession, TDesC& aFilePath, TUint aMode) sl@0: { sl@0: CF32File* self = new (ELeave) CF32File; sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aSession, aFilePath, aMode); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: sl@0: void CF32File::ConstructL(RFs& aSession, TDesC& aPath, TUint aFileMode) sl@0: { sl@0: iSession = &aSession; sl@0: iFilePath = aPath.AllocL(); sl@0: TUint attributes = 0; sl@0: TInt err = iSession->Att(*iFilePath, attributes); sl@0: if (err == KErrNone) sl@0: { sl@0: if ( attributes & KEntryAttReadOnly ) sl@0: User::LeaveIfError(iFile.Open(*iSession, *iFilePath, EFileShareReadersOnly )) ; sl@0: else //if ( !( attributes & KEntryAttReadOnly ) ) sl@0: User::LeaveIfError(iFile.Open(*iSession, *iFilePath, aFileMode)) ; sl@0: } sl@0: else if ((err == KErrNotFound) && (aFileMode & EFileWrite)) sl@0: { sl@0: User::LeaveIfError(iFile.Create(*iSession, *iFilePath, aFileMode )) ; sl@0: } sl@0: else sl@0: { sl@0: User::Leave(err); sl@0: } sl@0: } sl@0: sl@0: sl@0: RFile& CF32File::FileL() sl@0: { sl@0: return iFile; sl@0: } sl@0: sl@0: TInt CF32File::Data(CData*& /*aData*/) sl@0: { sl@0: return KErrNotSupported; sl@0: } sl@0: sl@0: TInt CF32File::Seek(TSeek aSeekMode, TInt aPos) sl@0: { sl@0: return iFile.Seek(aSeekMode, aPos); sl@0: } sl@0: sl@0: TInt CF32File::Read(TDes8& aDes,TInt aLength) sl@0: { sl@0: return iFile.Read(aDes, aLength); sl@0: } sl@0: sl@0: void CF32File::Read(TDes8& aDes, TInt aLength, TRequestStatus& aStatus) sl@0: { sl@0: iFile.Read(aDes, aLength, aStatus); sl@0: } sl@0: sl@0: TInt CF32File::Write(const TDesC8& aDes,TInt aLength) sl@0: { sl@0: return iFile.Write(aDes, aLength); sl@0: } sl@0: sl@0: void CF32File::Write(const TDesC8& aDes, TInt aLength, TRequestStatus& aStatus) sl@0: { sl@0: iFile.Write(aDes, aLength, aStatus); sl@0: } sl@0: sl@0: TInt CF32File::Size(TInt& aSize) sl@0: { sl@0: return iFile.Size(aSize); sl@0: } sl@0: sl@0: TInt CF32File::SetSize(TInt aSize) sl@0: { sl@0: TInt err = iFile.SetSize(aSize); sl@0: if(err == KErrNone) sl@0: iFileSize = aSize; sl@0: else sl@0: iFileSize = -1; sl@0: sl@0: return err; sl@0: } sl@0: sl@0: TInt CF32File::EvaluateIntent(TIntent /*aIntent*/) const sl@0: { sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: TInt CF32File::ExecuteIntent(TIntent /*aIntent*/) sl@0: { sl@0: return KErrNone; sl@0: } sl@0: sl@0: TBool CF32File::IsProtected() const sl@0: { sl@0: return EFalse; sl@0: } sl@0: sl@0: TInt CF32File::Read(TInt aPosition, TDes8& aDes, TInt aLength, TRequestStatus& aStatus) sl@0: { sl@0: iFile.Read(aPosition, aDes, aLength, aStatus); sl@0: return KErrNone; sl@0: } sl@0: sl@0: TInt CF32File::SetAgentProperty(TAgentProperty /*aProperty*/, TInt /*aValue*/) sl@0: { sl@0: // not an error to set this if not supported, just wont do anything sl@0: return KErrNone; sl@0: } sl@0: sl@0: CContentFile::~CContentFile() sl@0: { sl@0: delete iData; sl@0: sl@0: iLegacyFile.Close(); sl@0: iFile64.Close(); //For defect EASA-84ZC6J sl@0: sl@0: delete iFilePath; sl@0: } sl@0: sl@0: sl@0: CContentFile* CContentFile::NewL(RFs& aSession, const TDesC& aFilePath, const TDesC& aUniqueId, TUint aMode, TBool aEnableUI) sl@0: { sl@0: CContentFile* self = new (ELeave) CContentFile; sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aSession, aFilePath, aUniqueId, aMode, aEnableUI); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: void CContentFile::ConstructL(RFs& aSession, const TDesC& aPath, const TDesC& aUniqueId, TUint /*aMode*/, TBool aEnableUI) sl@0: { sl@0: iSession = &aSession; sl@0: iFilePath = aPath.AllocL(); sl@0: sl@0: // Assume that we want the content to be shared and read-only. sl@0: if (aUniqueId.Length() > 0) sl@0: { sl@0: iData = CData::NewL(TVirtualPathPtr(*iFilePath, aUniqueId), EContentShareReadWrite); sl@0: } sl@0: else sl@0: { sl@0: iData = CData::NewL(TVirtualPathPtr(*iFilePath), EContentShareReadWrite); sl@0: } sl@0: sl@0: TInt err = iData->SetProperty(EAgentPropertyAgentUI, aEnableUI); sl@0: if (err != KErrNone && err != KErrCANotSupported) sl@0: { sl@0: User::Leave(err); sl@0: } sl@0: User::LeaveIfError(iData->EvaluateIntent(EPeek)); sl@0: } sl@0: sl@0: sl@0: sl@0: TInt CContentFile::EvaluateIntent(TIntent aIntent) const sl@0: { sl@0: ASSERT(iData); sl@0: return iData->EvaluateIntent(aIntent); sl@0: } sl@0: sl@0: sl@0: TInt CContentFile::ExecuteIntent(TIntent aIntent) sl@0: { sl@0: ASSERT(iData); sl@0: return iData->ExecuteIntent(aIntent); sl@0: } sl@0: sl@0: TBool CContentFile::IsProtected() const sl@0: { sl@0: ASSERT(iData); sl@0: TInt value = 0; sl@0: TInt err =iData->GetAttribute(EIsProtected, value); sl@0: return (err == KErrNone && value); sl@0: } sl@0: sl@0: TInt CContentFile::SetAgentProperty(ContentAccess::TAgentProperty aProperty, TInt aValue) sl@0: { sl@0: ASSERT(iData); sl@0: return iData->SetProperty(aProperty, aValue); sl@0: } sl@0: sl@0: TInt CContentFile::Seek(TSeek aSeekMode, TInt aPos) sl@0: { sl@0: ASSERT(iData); sl@0: return iData->Seek(aSeekMode, aPos); sl@0: } sl@0: sl@0: TInt CContentFile::Read(TDes8& aDes,TInt aLength) sl@0: { sl@0: ASSERT(iData); sl@0: return iData->Read(aDes,aLength); sl@0: } sl@0: sl@0: void CContentFile::Read(TDes8& aDes, TInt aLength, TRequestStatus& aStatus) sl@0: { sl@0: ASSERT(iData); sl@0: iData->Read(aDes, aLength, aStatus); sl@0: } sl@0: sl@0: TInt CContentFile::Write(const TDesC8& /*aDes*/,TInt /*aLength*/) sl@0: { sl@0: return KErrAccessDenied; sl@0: } sl@0: void CContentFile::Write(const TDesC8& /*aDes*/, TInt /*aLength*/, TRequestStatus& aStatus) sl@0: { sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, KErrAccessDenied); sl@0: } sl@0: sl@0: TInt CContentFile::SetSize(TInt /*aSize*/) sl@0: { sl@0: // Only a source is implemented, hence this cannot be allowed sl@0: return KErrAccessDenied; sl@0: } sl@0: sl@0: sl@0: // Get the size of file sl@0: // this method opens a new, read-only, RFile the first time this method is called sl@0: sl@0: TInt CContentFile::Size(TInt& aSize) sl@0: { sl@0: ASSERT(iData); sl@0: TRAPD(err, iData->DataSizeL(aSize)); sl@0: return err; sl@0: } sl@0: sl@0: /** sl@0: * return a RFile for the legacy RFile method sl@0: * this method opens a new, read-only, RFile the first time this method is called sl@0: * @internalTechnology sl@0: * @return Reference to RFile handle to current file sl@0: */ sl@0: RFile& CContentFile::FileL() sl@0: { sl@0: if (!iLegacyFileOpen) sl@0: {//For defect EASA-84ZC6J sl@0: TInt error = iLegacyFile.Open(*iSession, *iFilePath, EFileRead | EFileStream | EFileShareReadersOrWriters); sl@0: if ( error == KErrTooBig ) sl@0: { sl@0: User::LeaveIfError(iFile64.Open(*iSession, *iFilePath, EFileRead | EFileStream | EFileShareReadersOrWriters)); sl@0: iLegacyFileOpen = ETrue; sl@0: return iFile64; sl@0: } sl@0: sl@0: else if (error == KErrNone) sl@0: { sl@0: iLegacyFileOpen = ETrue; sl@0: return iLegacyFile; sl@0: } sl@0: sl@0: else sl@0: { sl@0: User::Leave(error); sl@0: } sl@0: } sl@0: if(iLegacyFile.SubSessionHandle()) sl@0: { sl@0: return iLegacyFile; sl@0: } sl@0: else sl@0: { sl@0: return iFile64; sl@0: } sl@0: } sl@0: sl@0: TInt CContentFile::Data(CData*& aData) sl@0: { sl@0: if (iData==NULL) sl@0: { sl@0: return KErrNotReady; sl@0: } sl@0: else sl@0: { sl@0: aData = iData; sl@0: return KErrNone; sl@0: } sl@0: } sl@0: sl@0: CF32File* CF32File::NewL(RFile& aFile) sl@0: { sl@0: CF32File* self = new (ELeave) CF32File; sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aFile); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: void CF32File::ConstructL(RFile& aFile) sl@0: { sl@0: iFile = aFile; sl@0: iFileHandle = ETrue; sl@0: } sl@0: sl@0: CContentFile* CContentFile::NewL(RFile& aFile, const TDesC& aUniqueId, TBool aEnableUI) sl@0: { sl@0: CContentFile* self = new (ELeave) CContentFile; sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aFile, aUniqueId, aEnableUI); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: void CContentFile::ConstructL(RFile& aFile, const TDesC& aUniqueId, TBool aEnableUI) sl@0: { sl@0: iData = CData::NewL(aFile, aUniqueId); sl@0: TInt err = iData->SetProperty(EAgentPropertyAgentUI, aEnableUI); sl@0: if (err != KErrNone && err != KErrCANotSupported) sl@0: { sl@0: User::Leave(err); sl@0: } sl@0: User::LeaveIfError(iData->EvaluateIntent(EPeek)); sl@0: } sl@0: sl@0: TInt CContentFile::Read(TInt aPosition, TDes8& aDes, TInt aLength, TRequestStatus& aStatus) sl@0: { sl@0: return iData->Read(aPosition, aDes, aLength, aStatus); sl@0: }