First public contribution.
1 // Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
2 // All rights reserved.
3 // This component and the accompanying materials are made available
4 // under the terms of "Eclipse Public License v1.0"
5 // which accompanies this distribution, and is available
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
17 #include <f32file64.h>
19 #include <caf/attribute.h>
20 #include <caf/bitset.h>
21 #include <caf/content.h>
23 using namespace ContentAccess;
26 #include "FileAccess.h"
35 CF32File* CF32File::NewL(RFs& aSession, TDesC& aFilePath, TUint aMode)
37 CF32File* self = new (ELeave) CF32File;
38 CleanupStack::PushL(self);
39 self->ConstructL(aSession, aFilePath, aMode);
40 CleanupStack::Pop(self);
45 void CF32File::ConstructL(RFs& aSession, TDesC& aPath, TUint aFileMode)
48 iFilePath = aPath.AllocL();
50 TInt err = iSession->Att(*iFilePath, attributes);
53 if ( attributes & KEntryAttReadOnly )
54 User::LeaveIfError(iFile.Open(*iSession, *iFilePath, EFileShareReadersOnly )) ;
55 else //if ( !( attributes & KEntryAttReadOnly ) )
56 User::LeaveIfError(iFile.Open(*iSession, *iFilePath, aFileMode)) ;
58 else if ((err == KErrNotFound) && (aFileMode & EFileWrite))
60 User::LeaveIfError(iFile.Create(*iSession, *iFilePath, aFileMode )) ;
69 RFile& CF32File::FileL()
74 TInt CF32File::Data(CData*& /*aData*/)
76 return KErrNotSupported;
79 TInt CF32File::Seek(TSeek aSeekMode, TInt aPos)
81 return iFile.Seek(aSeekMode, aPos);
84 TInt CF32File::Read(TDes8& aDes,TInt aLength)
86 return iFile.Read(aDes, aLength);
89 void CF32File::Read(TDes8& aDes, TInt aLength, TRequestStatus& aStatus)
91 iFile.Read(aDes, aLength, aStatus);
94 TInt CF32File::Write(const TDesC8& aDes,TInt aLength)
96 return iFile.Write(aDes, aLength);
99 void CF32File::Write(const TDesC8& aDes, TInt aLength, TRequestStatus& aStatus)
101 iFile.Write(aDes, aLength, aStatus);
104 TInt CF32File::Size(TInt& aSize)
106 return iFile.Size(aSize);
109 TInt CF32File::SetSize(TInt aSize)
111 TInt err = iFile.SetSize(aSize);
120 TInt CF32File::EvaluateIntent(TIntent /*aIntent*/) const
126 TInt CF32File::ExecuteIntent(TIntent /*aIntent*/)
131 TBool CF32File::IsProtected() const
136 TInt CF32File::Read(TInt aPosition, TDes8& aDes, TInt aLength, TRequestStatus& aStatus)
138 iFile.Read(aPosition, aDes, aLength, aStatus);
142 TInt CF32File::SetAgentProperty(TAgentProperty /*aProperty*/, TInt /*aValue*/)
144 // not an error to set this if not supported, just wont do anything
148 CContentFile::~CContentFile()
153 iFile64.Close(); //For defect EASA-84ZC6J
159 CContentFile* CContentFile::NewL(RFs& aSession, const TDesC& aFilePath, const TDesC& aUniqueId, TUint aMode, TBool aEnableUI)
161 CContentFile* self = new (ELeave) CContentFile;
162 CleanupStack::PushL(self);
163 self->ConstructL(aSession, aFilePath, aUniqueId, aMode, aEnableUI);
164 CleanupStack::Pop(self);
168 void CContentFile::ConstructL(RFs& aSession, const TDesC& aPath, const TDesC& aUniqueId, TUint /*aMode*/, TBool aEnableUI)
170 iSession = &aSession;
171 iFilePath = aPath.AllocL();
173 // Assume that we want the content to be shared and read-only.
174 if (aUniqueId.Length() > 0)
176 iData = CData::NewL(TVirtualPathPtr(*iFilePath, aUniqueId), EContentShareReadWrite);
180 iData = CData::NewL(TVirtualPathPtr(*iFilePath), EContentShareReadWrite);
183 TInt err = iData->SetProperty(EAgentPropertyAgentUI, aEnableUI);
184 if (err != KErrNone && err != KErrCANotSupported)
188 User::LeaveIfError(iData->EvaluateIntent(EPeek));
193 TInt CContentFile::EvaluateIntent(TIntent aIntent) const
196 return iData->EvaluateIntent(aIntent);
200 TInt CContentFile::ExecuteIntent(TIntent aIntent)
203 return iData->ExecuteIntent(aIntent);
206 TBool CContentFile::IsProtected() const
210 TInt err =iData->GetAttribute(EIsProtected, value);
211 return (err == KErrNone && value);
214 TInt CContentFile::SetAgentProperty(ContentAccess::TAgentProperty aProperty, TInt aValue)
217 return iData->SetProperty(aProperty, aValue);
220 TInt CContentFile::Seek(TSeek aSeekMode, TInt aPos)
223 return iData->Seek(aSeekMode, aPos);
226 TInt CContentFile::Read(TDes8& aDes,TInt aLength)
229 return iData->Read(aDes,aLength);
232 void CContentFile::Read(TDes8& aDes, TInt aLength, TRequestStatus& aStatus)
235 iData->Read(aDes, aLength, aStatus);
238 TInt CContentFile::Write(const TDesC8& /*aDes*/,TInt /*aLength*/)
240 return KErrAccessDenied;
242 void CContentFile::Write(const TDesC8& /*aDes*/, TInt /*aLength*/, TRequestStatus& aStatus)
244 TRequestStatus* status = &aStatus;
245 User::RequestComplete(status, KErrAccessDenied);
248 TInt CContentFile::SetSize(TInt /*aSize*/)
250 // Only a source is implemented, hence this cannot be allowed
251 return KErrAccessDenied;
255 // Get the size of file
256 // this method opens a new, read-only, RFile the first time this method is called
258 TInt CContentFile::Size(TInt& aSize)
261 TRAPD(err, iData->DataSizeL(aSize));
266 * return a RFile for the legacy RFile method
267 * this method opens a new, read-only, RFile the first time this method is called
268 * @internalTechnology
269 * @return Reference to RFile handle to current file
271 RFile& CContentFile::FileL()
273 if (!iLegacyFileOpen)
274 {//For defect EASA-84ZC6J
275 TInt error = iLegacyFile.Open(*iSession, *iFilePath, EFileRead | EFileStream | EFileShareReadersOrWriters);
276 if ( error == KErrTooBig )
278 User::LeaveIfError(iFile64.Open(*iSession, *iFilePath, EFileRead | EFileStream | EFileShareReadersOrWriters));
279 iLegacyFileOpen = ETrue;
283 else if (error == KErrNone)
285 iLegacyFileOpen = ETrue;
294 if(iLegacyFile.SubSessionHandle())
304 TInt CContentFile::Data(CData*& aData)
317 CF32File* CF32File::NewL(RFile& aFile)
319 CF32File* self = new (ELeave) CF32File;
320 CleanupStack::PushL(self);
321 self->ConstructL(aFile);
322 CleanupStack::Pop(self);
326 void CF32File::ConstructL(RFile& aFile)
332 CContentFile* CContentFile::NewL(RFile& aFile, const TDesC& aUniqueId, TBool aEnableUI)
334 CContentFile* self = new (ELeave) CContentFile;
335 CleanupStack::PushL(self);
336 self->ConstructL(aFile, aUniqueId, aEnableUI);
337 CleanupStack::Pop(self);
341 void CContentFile::ConstructL(RFile& aFile, const TDesC& aUniqueId, TBool aEnableUI)
343 iData = CData::NewL(aFile, aUniqueId);
344 TInt err = iData->SetProperty(EAgentPropertyAgentUI, aEnableUI);
345 if (err != KErrNone && err != KErrCANotSupported)
349 User::LeaveIfError(iData->EvaluateIntent(EPeek));
352 TInt CContentFile::Read(TInt aPosition, TDes8& aDes, TInt aLength, TRequestStatus& aStatus)
354 return iData->Read(aPosition, aDes, aLength, aStatus);