--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/userlibandfileserver/fileserver/sfile/Sf_plugin_util.cpp Thu Dec 17 09:24:54 2009 +0200
@@ -0,0 +1,984 @@
+// Copyright (c) 2005-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:
+// f32\sfile\sf_plugin_util.cpp
+//
+//
+
+#include "sf_std.h"
+
+/**
+Utility function to obtain the file name from a file share object
+
+@param aFileShare A pointer to the file share
+@param aName A reference to the descriptor to contain the file name
+*/
+LOCAL_C void NameFromShare(CFileShare* aFileShare, TDes& aName)
+ {
+ if(aFileShare)
+ {
+ CFileCB& theFile = aFileShare->File();
+ aName = _L("?:");
+ aName[0] = TText('A' + theFile.Drive().DriveNumber());
+ aName.Append(theFile.FileName());
+ }
+ }
+
+/**
+Utility function for obtaining info on file duplicate or adopt requests.
+
+@param aRequest File access request
+@param aDriveNumber The drive number
+@param aHandle sub-session handle
+@param aAtt File attributes
+@param aSize FileSize
+@param aName Name of the file
+@return File modification time in format of TTime
+*/
+LOCAL_C TInt FileDuplicateAdoptVars(CFsRequest* aRequest, TInt& aDriveNumber, TInt& aHandle, TInt& aAtt, TInt& aSize, TDes& aName, TTime& aTime)
+ {
+ __ASSERT_ALWAYS(aRequest->Operation()->Function()==EFsFileDuplicate || aRequest->Operation()->Function()==EFsFileAdopt,Fault(EBaseRequestMessage));
+
+ aDriveNumber = aRequest->DriveNumber();
+ aHandle = aRequest->Message().Int0();
+
+ CFileShare* share = (CFileShare*)aRequest->ScratchValue();
+ if(share == NULL)
+ return(KErrBadHandle);
+
+ NameFromShare(share, aName);
+
+ CFileCB& theFile = share->File();
+ aAtt = theFile.Att();
+ aSize = theFile.Size();
+ aTime = theFile.Modified();
+
+ return(KErrNone);
+ }
+
+/**
+Utility function for obtaining info on file open requests.
+
+@param aRequest File open request
+@param aMode File Open Mode
+@param aHandle File handle
+@param aName File's name
+*/
+LOCAL_C TInt FileOpenVar(CFsRequest* aRequest, TUint32& aMode, TInt& aHandle, TDes& aName)
+ {
+ __ASSERT_ALWAYS(aRequest->Operation()->Function()==EFsFileOpen,Fault(EBaseRequestMessage));
+
+ aMode = aRequest->Message().Int1();
+ TPtr8 handle((TUint8*)&aHandle,sizeof(TInt));
+ TRAPD(err,aRequest->ReadL(KMsgPtr3,handle));
+ if(err != KErrNone)
+ {
+ handle=0;
+ return(err);
+ }
+
+ aName = aRequest->Src().FullName();
+
+ return(KErrNone);
+ }
+
+/**
+Utility function for obtaining info on file Create/Replace requests.
+
+@param aRequest File Create/Replace request
+@param aMode File Create/Replace Mode
+@param aName File's name
+*/
+LOCAL_C TInt FileCreateReplaceVar(CFsRequest* aRequest, TUint32& aMode, TDes& aName)
+ {
+ __ASSERT_ALWAYS(aRequest->Operation()->Function()==EFsFileCreate || aRequest->Operation()->Function()==EFsFileReplace,Fault(EBaseRequestMessage));
+
+ aMode = aRequest->Message().Int1();
+ aName = aRequest->Src().FullName();
+
+ return(KErrNone);
+ }
+
+/**
+Utility function for obtaining info on file temp requests.
+
+@param aRequest File temp request
+@param aMode File Mode
+@param aName File's name
+@param aPath File's path
+*/
+LOCAL_C TInt FileTempVar(CFsRequest* aRequest, TUint32& aMode, TDes& aName,TDes& aPath)
+ {
+ __ASSERT_ALWAYS(aRequest->Operation()->Function()==EFsFileTemp,Fault(EBaseRequestMessage));
+
+ aMode = aRequest->Message().Int1();
+ aPath = aRequest->Src().FullName();
+
+ TInt nameLen = aRequest->GetDesLength(KMsgPtr2);
+ if(nameLen < 0 || nameLen > KMaxFileName)
+ {
+ return KErrBadName;
+ }
+
+ TRAPD(err, aRequest->ReadL(KMsgPtr2, aName));
+ return(err);
+ }
+
+/**
+Utility function for obtaining info on file read/write requests.
+
+@param aRequest File access request
+@param aLen The length of file for access
+@param aPos Position of first byte to be accessed
+@param aName File name
+@return Client's buffer
+*/
+LOCAL_C TInt FileAccessVars(CFsRequest* aRequest, TInt& aLen, TInt& aPos, TDes& aName, const TAny*& aPtr)
+ {
+ __ASSERT_ALWAYS(aRequest->Operation()->Function()==EFsFileRead || aRequest->Operation()->Function()==EFsFileWrite,Fault(EBaseRequestMessage));
+
+ TMsgOperation& currentOperation = ((CFsMessageRequest*) aRequest)->CurrentOperation();
+ aLen = currentOperation.iReadWriteArgs.iLength;
+ aPos = (TInt) currentOperation.iReadWriteArgs.iPos;
+
+ CFileShare* share = (CFileShare*)aRequest->ScratchValue();
+ if(share == NULL)
+ return(KErrBadHandle);
+
+ NameFromShare(share, aName);
+ if (aPos == KCurrentPosition64)
+ {
+ aPos = (TInt)share->iPos;
+ }
+
+ aPtr = (TAny*)aRequest->Message().Ptr0();
+
+ return(KErrNone);
+ }
+
+/**
+Utility function for obtaining info on file lock/unlcok requests.
+
+@param aRequest File lock request
+@param aLen The length of file
+@param aPos Position of first byte
+@param aName File name
+*/
+LOCAL_C TInt FileLockVars(CFsRequest* aRequest, TInt& aLen, TInt& aPos, TDes& aName)
+ {
+ __ASSERT_ALWAYS(aRequest->Operation()->Function()==EFsFileLock || aRequest->Operation()->Function()==EFsFileUnLock,Fault(EBaseRequestMessage));
+
+ aLen = aRequest->Message().Int0();
+ aPos = aRequest->Message().Int1();
+
+ CFileShare* share = (CFileShare*)aRequest->ScratchValue();
+ if(share == NULL)
+ return(KErrBadHandle);
+
+ NameFromShare(share, aName);
+
+ return(KErrNone);
+ }
+
+/**
+Utility function for obtaining info on file seek requests.
+
+@param aRequest File seek request
+@param aPos The position within the file
+@param aName File name
+@return Seek mode in format of TSeek
+*/
+LOCAL_C TInt FileSeekVars(CFsRequest* aRequest, TInt& aPos, TDes& aName, const TAny*& aPtr)
+ {
+ __ASSERT_ALWAYS(aRequest->Operation()->Function()==EFsFileSeek,Fault(EBaseRequestMessage));
+
+ aPos = aRequest->Message().Int0();
+
+ CFileShare* share = (CFileShare*)aRequest->ScratchValue();
+ if(share == NULL)
+ return(KErrBadHandle);
+
+ NameFromShare(share, aName);
+
+ aPtr = aRequest->Message().Ptr1();
+
+ return(KErrNone);
+ }
+
+/**
+Utility function for obtaining info on file flush requests.
+
+@param aRequest File flush request
+@param aName File name
+*/
+LOCAL_C TInt FileFlushVars(CFsRequest* aRequest, TDes& aName)
+ {
+ __ASSERT_ALWAYS(aRequest->Operation()->Function()==EFsFileFlush,Fault(EBaseRequestMessage));
+
+ CFileShare* share = (CFileShare*)aRequest->ScratchValue();
+ if(share == NULL)
+ return(KErrBadHandle);
+
+ NameFromShare(share, aName);
+
+ return(KErrNone);
+ }
+
+/**
+Utility function for obtaining info on file size/SetSize requests.
+
+@param aRequest File Size/SetSize request
+@param aSize In case of Size() it is client's buffer, otherwise it is the desired size for SetSize
+@param aName File name
+*/
+LOCAL_C TInt FileSizeVars(CFsRequest* aRequest,TInt& aSize, TDes& aName)
+ {
+ __ASSERT_ALWAYS(aRequest->Operation()->Function()==EFsFileSize || aRequest->Operation()->Function()==EFsFileSetSize,Fault(EBaseRequestMessage));
+
+ aSize = aRequest->Message().Int0();
+
+ CFileShare* share = (CFileShare*)aRequest->ScratchValue();
+ if(share == NULL)
+ return(KErrBadHandle);
+
+ NameFromShare(share, aName);
+
+ return(KErrNone);
+ }
+
+/**
+Utility function for obtaining info on file Att requests.
+
+@param aRequest File Att request
+@param aAtt Attribute of the file in question.
+@param aName File name
+*/
+LOCAL_C TInt FileAttVars(CFsRequest* aRequest,TInt& aAtt, TDes& aName)
+ {
+ __ASSERT_ALWAYS(aRequest->Operation()->Function()==EFsFileAtt,Fault(EBaseRequestMessage));
+
+ CFileShare* share = (CFileShare*)aRequest->ScratchValue();
+ if(share == NULL)
+ return(KErrBadHandle);
+
+ aAtt = (TInt)share->File().Att();
+ NameFromShare(share, aName);
+
+ return(KErrNone);
+ }
+
+/**
+Utility function for obtaining info on file SetAtt requests.
+
+@param aRequest File SetAtt request
+@param aAtt Current Attribute of the file
+@param aName File name
+@param aSetAttMask The attribute mask to be set
+@param aClearAttMask The attribute mask to be cleared
+*/
+LOCAL_C TInt FileSetAttVars(CFsRequest* aRequest,TInt& aAtt, TDes& aName, TUint& aSetAttMask,TUint& aClearAttMask)
+ {
+ __ASSERT_ALWAYS(aRequest->Operation()->Function()==EFsFileSetAtt,Fault(EBaseRequestMessage));
+
+ CFileShare* share=(CFileShare*)aRequest->ScratchValue();
+ if(share == NULL)
+ return(KErrBadHandle);
+
+ aAtt = (TInt)share->File().Att();
+ NameFromShare(share, aName);
+
+ aSetAttMask = aRequest->Message().Int0();
+ aClearAttMask = aRequest->Message().Int1();
+
+ return(KErrNone);
+ }
+
+/**
+Utility function for obtaining info on file modification requests.
+
+@param aRequest File Modified/SetModified request
+@param aAtt Current Attribute of the file
+@param aSize Current size of the file
+@param aName File name
+@param Moidfied Last modified time of the file
+@return if request is Modified, returns clients buffer
+ if request is SetModified returns the desired last modification time
+*/
+LOCAL_C TInt FileModificationVars(CFsRequest* aRequest,TInt& aAtt, TInt& aSize, TDes& aName, TTime& aModified, TTime& aOldTime)
+ {
+ __ASSERT_ALWAYS(aRequest->Operation()->Function()==EFsFileModified || aRequest->Operation()->Function()==EFsFileSetModified,Fault(EBaseRequestMessage));
+
+ CFileShare* share = (CFileShare*)aRequest->ScratchValue();
+ if(share == NULL)
+ return(KErrBadHandle);
+
+ NameFromShare(share, aName);
+
+ CFileCB& file = share->File();
+ aAtt = file.Att();
+ aSize = file.Size();
+ aOldTime = file.Modified();
+
+ TPtr8 timePkg((TUint8*)&aModified, sizeof(TTime));
+ TRAPD(err, aRequest->ReadL(KMsgPtr0, timePkg));
+
+ return(err);
+ }
+
+/**
+Utility function for obtaining info on file Set requests.
+
+@param aRequest File Set request
+@param aName File name
+@param aCurrentAtt Current Attribute of the file
+@param aNewSetAtt The new attribute to be set
+@param aNewClearAtt The attribute to be cleared
+@param aCurrentModified Last modified time of the file
+@param aNewModified New last modified time of the file
+*/
+LOCAL_C TInt FileSetVars(CFsRequest* aRequest, TDes& aName, TInt& aCurrentAtt,TInt& aNewSetAtt, TInt& aNewClearAtt, TTime& aCurrentModified, TTime& aNewModified)
+ {
+ __ASSERT_ALWAYS(aRequest->Operation()->Function()==EFsFileSet,Fault(EBaseRequestMessage));
+
+ CFileShare* share = (CFileShare*)aRequest->ScratchValue();
+ if(share == NULL)
+ return(KErrBadHandle);
+
+ NameFromShare(share, aName);
+
+ CFileCB& file = share->File();
+ aCurrentAtt= file.Att();
+ aCurrentModified = file.Modified();
+
+ aNewSetAtt = aRequest->Message().Int1();
+ aNewClearAtt = aRequest->Message().Int2();
+
+ TPtr8 timePkg((TUint8*)&aNewModified, sizeof(TTime));
+ TRAPD(err, aRequest->ReadL(KMsgPtr0, timePkg));
+ return(err);
+ }
+
+/**
+Utility function for obtaining info on file ChangeMode requests.
+
+@param aRequest File Set request
+@param aName File name
+@param aCurrentMode Current mode of the file
+@param aNewMode The new mode of file (switch between EFileShareExclusive and EFileShareReadersOnly
+@param aModified Last modified time of the file
+*/
+LOCAL_C TInt FileChangeModeVars(CFsRequest* aRequest, TDes& aName, TInt& aCurrentMode,TInt& aNewMode, TTime& aModified)
+ {
+ __ASSERT_ALWAYS(aRequest->Operation()->Function()==EFsFileChangeMode,Fault(EBaseRequestMessage));
+
+ CFileShare* share = (CFileShare*)aRequest->ScratchValue();
+ if(share == NULL)
+ return(KErrBadHandle);
+
+ NameFromShare(share, aName);
+ aCurrentMode = share->iMode & KFileShareMask;
+ aModified = share->File().Modified();
+
+ aNewMode = aRequest->Message().Int0();
+
+ return(KErrNone);
+ }
+
+/**
+Utility function for obtaining info on file Rename requests.
+
+@param aRequest File Rename request
+@param aCurrentName File's current name
+@param aCurrentDrive File's current drive
+@param aNewName the new name
+@return KErrNone on successful read of info from CFsRequest or a system wide error
+*/
+LOCAL_C TInt FileRenameVars(CFsRequest* aRequest, TDes& aCurrentName, TDriveUnit& aCurrentDrive, TDes& aNewName)
+ {
+ __ASSERT_ALWAYS(aRequest->Operation()->Function()==EFsFileRename,Fault(EBaseRequestMessage));
+
+ CFileShare* share = (CFileShare*)aRequest->ScratchValue();
+ if(share == NULL)
+ return(KErrBadHandle);
+
+ NameFromShare(share, aCurrentName);
+ aCurrentDrive = share->File().Mount().Drive().DriveNumber();
+
+ aNewName = aRequest->Dest().FullName();
+
+ return(KErrNone);
+ }
+
+/**
+Utility function for obtaining info on file Drive/Name requests.
+
+@param aRequest File Rename request
+@param aFileName File's current name
+@param aCurrentDrive File's current drive
+@param aDriveInfo File's drive information
+*/
+LOCAL_C TInt FileDriveNameVars(CFsRequest* aRequest, TDes& aFileName, TDriveUnit& aCurrentDrive,TDriveInfo& aDriveInfo)
+ {
+ __ASSERT_ALWAYS(aRequest->Operation()->Function()==EFsFileDrive || aRequest->Operation()->Function()==EFsFileName,Fault(EBaseRequestMessage));
+
+ CFileShare* share = (CFileShare*)aRequest->ScratchValue();
+ if(share == NULL)
+ return(KErrBadHandle);
+
+ NameFromShare(share, aFileName);
+ aCurrentDrive = share->File().Mount().Drive().DriveNumber();
+ share->File().Mount().Drive().DriveInfo(aDriveInfo);
+
+ return(KErrNone);
+ }
+
+/**
+Utility function for obtaining info on file delete requests.
+
+@param aRequest Dir read request
+@param aFileName The name of the file
+*/
+LOCAL_C TInt FileDelVars(CFsRequest* aRequest, TDes& aFileName)
+ {
+ __ASSERT_ALWAYS(aRequest->Operation()->Function()==EFsDelete,Fault(EBaseRequestMessage));
+
+ aFileName = aRequest->Src().FullName();
+
+ return(KErrNone);
+ }
+
+/**
+Utility function for obtaining info on file rename/replace requests.
+
+@param aRequest File rename/replace request
+@param aOldFileName The old name of the file
+@param aNewFileName The new name of the file
+*/
+LOCAL_C TInt FileRenameReplaceVars(CFsRequest* aRequest, TDes& aOldFileName,TDes& aNewFileName)
+ {
+ __ASSERT_ALWAYS(aRequest->Operation()->Function()==EFsRename || aRequest->Operation()->Function()==EFsReplace,Fault(EBaseRequestMessage));
+
+ aOldFileName = aRequest->Src().FullName();
+ aNewFileName = aRequest->Dest().FullName();
+
+ return(KErrNone);
+ }
+
+/**
+Utility function for obtaining info on file close requests.
+
+@param aRequest File close request
+@param aPath The path of the file
+@return KErrNone
+*/
+LOCAL_C TInt FileCloseVars(CFsRequest* aRequest, TDes& aFileName)
+ {
+ __ASSERT_ALWAYS(aRequest->Operation()->Function()==EFsFileSubClose,Fault(EBaseRequestMessage));
+
+ const TDes* fileName=(TDes*) I64HIGH(aRequest->ScratchValue64());
+ if(fileName == NULL)
+ return(KErrBadName);
+
+ aFileName = _L("?:");
+ aFileName[0] = TText('A' + aRequest->DriveNumber());
+ aFileName.Append(*fileName);
+
+ return(KErrNone);
+ }
+
+/**
+Dir Operations
+*/
+
+/**
+Utility function for obtaining info on dir Open requests.
+
+@param aRequest Dir Open request
+@param aDirName Name of Dir
+@param aAtt Attribute
+@param aUidType Uid Type
+*/
+LOCAL_C TInt DirOpenVars(CFsRequest* aRequest, TDes& aDirName, TInt& aAtt,TInt& aUidType)
+ {
+ __ASSERT_ALWAYS(aRequest->Operation()->Function()==EFsDirOpen,Fault(EBaseRequestMessage));
+
+ aDirName = aRequest->Src().FullName();
+
+ aAtt = aRequest->Message().Int1();
+ aUidType = aRequest->Message().Int2();
+
+ return(KErrNone);
+ }
+
+
+/**
+Utility function for obtaining info on dir Make requests.
+
+@param aRequest MkDir/MkDirAll request
+@param aMkDirAll if MkDirAll it will be 1
+@param aPath The path name specifiying the directory or directories to create.
+*/
+LOCAL_C TInt DirMakeVars(CFsRequest* aRequest, TInt& aMkDirAll, TDes& aPath)
+ {
+ __ASSERT_ALWAYS(aRequest->Operation()->Function()==EFsMkDir,Fault(EBaseRequestMessage));
+
+ aMkDirAll = aRequest->Message().Int1();
+ aPath = aRequest->Src().FullName();
+
+ return(KErrNone);
+ }
+
+/**
+Utility function for obtaining info on dir remove requests.
+
+@param aRequest RmDir request
+@param aPath The path name specifiying the directory to be removed.
+*/
+LOCAL_C TInt DirRemoveVars(CFsRequest* aRequest, TDes& aPath)
+ {
+ __ASSERT_ALWAYS(aRequest->Operation()->Function()==EFsRmDir,Fault(EBaseRequestMessage));
+
+ aPath = aRequest->Src().FullName();
+
+ return(KErrNone);
+ }
+
+/**
+Utility function for obtaining info on file entry requests.
+
+@param aRequest File entry request
+@param aName Entry name
+*/
+LOCAL_C TInt FileEntryVars(CFsRequest* aRequest, TDes& aName)
+ {
+ __ASSERT_ALWAYS(aRequest->Operation()->Function()==EFsEntry,Fault(EBaseRequestMessage));
+
+ aName = aRequest->Src().FullName();
+
+ return(KErrNone);
+ }
+
+/**
+Utility function for obtaining info on file read file section requests.
+
+@param aRequest Read file section request
+@param aLen The length of file for access
+@param aPos Position of first byte to be accessed
+@param aName File name
+@return KErrNone successful (aLen aPos and aName updated)
+*/
+LOCAL_C TInt FileSectionVars(CFsRequest* aRequest, TInt& aLen, TInt& aPos, TDes& aName)
+ {
+ __ASSERT_ALWAYS(aRequest->Operation()->Function()==EFsReadFileSection,Fault(EBaseRequestMessage));
+
+ aPos = aRequest->Message().Int2();
+ aLen = aRequest->Message().Int3();
+
+ aName = aRequest->Src().FullName();
+
+ return(KErrNone);
+ }
+
+/**
+@internalTechnology
+
+Utility function for obtaining the name of the file/dir from the client request
+Supported requests are:
+
+ EFsFileDuplicate
+ EFsFileAdopt
+ EFsFileOpen
+ EFsFileCreate
+ EFsFileReplace
+ EFsFileTemp
+ EFsFileRead
+ EFsFileWrite
+ EFsFileLock
+ EFsFileUnLock
+ EFsFileSeek
+ EFsFileFlush
+ EFsFileSize
+ EFsFileSetSize
+ EFsFileAtt
+ EFsFileSetAtt
+ EFsFileModified
+ EFsFileSetModified
+ EFsFileSet
+ EFsFileChangeMode
+ EFsFileRename
+ EFsFileDrive
+ EFsFileName
+ EFsDelete
+ EFsRename
+ EFsReplace
+ EFsDirOpen
+ EFsFileSubClose
+ EFsEntry
+ EFsReadFileSection
+ EFsFileWriteDirty
+
+@param aRequest The client request
+@param aName Name of the file/folder
+@return KErrNone on successful completion, KErrNotSupported if the request is not supported
+*/
+EXPORT_C TInt GetName(TFsPluginRequest* aRequest, TDes& aName)
+ {
+ TInt driveNumber;
+ TInt handle;
+ TInt att;
+ TInt size;
+ TUint32 mode;
+ TPath path;
+ TFileName newName;
+ TInt pos;
+ TInt len;
+ TUint attMask;
+ TTime modified;
+ TInt fmode;
+ TDriveUnit drive;
+ TDriveInfo info;
+ TInt uidType;
+ const TAny* ptr;
+ TInt err = KErrNone;
+ switch(aRequest->Function())
+ {
+ case EFsFileDuplicate:
+ case EFsFileAdopt:
+ err = FileDuplicateAdoptVars(aRequest->Request(), driveNumber, handle, att, size, aName, modified);
+ break;
+ case EFsFileOpen:
+ err = FileOpenVar(aRequest->Request(), mode, handle, aName);
+ break;
+ case EFsFileCreate:
+ case EFsFileReplace:
+ err = FileCreateReplaceVar(aRequest->Request(), mode, aName);
+ break;
+ case EFsFileTemp:
+ err = FileTempVar(aRequest->Request(), mode, aName, path);
+ break;
+ case EFsFileRead:
+ case EFsFileWrite:
+ err = FileAccessVars(aRequest->Request(), len, pos, aName, ptr);
+ break;
+ case EFsFileLock:
+ case EFsFileUnLock:
+ err = FileLockVars(aRequest->Request(), len, pos, aName);
+ break;
+ case EFsFileSeek:
+ err = FileSeekVars(aRequest->Request(), pos, aName, ptr);
+ break;
+ case EFsFileFlush:
+ err = FileFlushVars(aRequest->Request(), aName);
+ break;
+ case EFsFileSize:
+ case EFsFileSetSize:
+ err = FileSizeVars(aRequest->Request(),size, aName);
+ break;
+ case EFsFileAtt:
+ err = FileAttVars(aRequest->Request(),att, aName);
+ break;
+ case EFsFileSetAtt:
+ err = FileSetAttVars(aRequest->Request(),att, aName, attMask, attMask);
+ break;
+ case EFsFileModified:
+ case EFsFileSetModified:
+ err = FileModificationVars(aRequest->Request(),att, size, aName, modified, modified);
+ break;
+ case EFsFileSet:
+ err = FileSetVars(aRequest->Request(), aName, att,att, att, modified, modified);
+ break;
+ case EFsFileChangeMode:
+ err = FileChangeModeVars(aRequest->Request(), aName, fmode,fmode, modified);
+ break;
+ case EFsFileRename:
+ err = FileRenameVars(aRequest->Request(), aName, drive, (TDes&)newName);
+ break;
+ case EFsFileDrive:
+ case EFsFileName:
+ err = FileDriveNameVars(aRequest->Request(), aName, drive, info);
+ break;
+ case EFsDelete:
+ err = FileDelVars(aRequest->Request(), aName);
+ break;
+ case EFsRename:
+ case EFsReplace:
+ err = FileRenameReplaceVars(aRequest->Request(), aName, (TDes&)newName);
+ break;
+ case EFsDirOpen:
+ err = DirOpenVars(aRequest->Request(), aName, att,uidType);
+ break;
+ case EFsFileSubClose:
+ err = FileCloseVars(aRequest->Request(), aName);
+ break;
+ case EFsEntry:
+ err = FileEntryVars(aRequest->Request(), aName);
+ break;
+ case EFsReadFileSection:
+ err = FileSectionVars(aRequest->Request(), len, pos, (TDes&)aName);
+ break;
+ default:
+ err = KErrNotSupported;
+ }
+
+ return(err);
+ }
+
+/**
+@internalTechnology
+
+Utility function for obtaining the proposed new name of the file/dir from the client rename/replace request
+Supported requests are:
+
+ EFsFileRename
+ EFsRename
+ EFsReplace
+
+@param aRequest The client request
+@param aName New name of the file/folder
+@return KErrNone on successful completion, KErrNotSupported if the request is not supported
+*/
+EXPORT_C TInt GetNewName(TFsPluginRequest* aRequest, TDes& aNewName)
+ {
+ TFileName name;
+ TDriveUnit drive;
+ TInt err = KErrNone;
+
+ switch(aRequest->Function())
+ {
+ case EFsFileRename:
+ err = FileRenameVars(aRequest->Request(), (TDes&)name, drive, aNewName);
+ break;
+ case EFsRename:
+ case EFsReplace:
+ err = FileRenameReplaceVars(aRequest->Request(), name, aNewName);
+ break;
+ default:
+ err = KErrNotSupported;
+ }
+
+ return(err);
+ }
+
+
+/**
+@internalTechnology
+
+Utility function for obtaining the path from the client request
+Supported requests currently are:
+
+ EFsFileTemp
+ EFsMkDir
+ EFsRmDir
+
+@param aRequest The client request
+@param aPath The path
+@return KErrNone on successful completion, KErrNotSupported if the request is not supported
+*/
+EXPORT_C TInt GetPath(TFsPluginRequest* aRequest, TDes& aPath)
+ {
+ TFileName name;
+ TUint32 mode;
+ TInt fmode;
+ TInt err = KErrNone;
+
+ switch(aRequest->Function())
+ {
+ case EFsFileTemp:
+ err = FileTempVar(aRequest->Request(), mode, (TDes&)name, aPath);
+ break;
+ case EFsMkDir:
+ err = DirMakeVars(aRequest->Request(), fmode, aPath);
+ break;
+ case EFsRmDir:
+ err = DirRemoveVars(aRequest->Request(), aPath);
+ break;
+ default:
+ err = KErrNotSupported;
+ }
+
+ return(err);
+ }
+
+/**
+@internalTechnology
+
+Utility function for obtaining the attribute of the file/folder from the client request
+Supported requests currently are:
+
+ EFsFileDuplicate
+ EFsFileAdopt
+ EFsFileAtt
+ EFsFileSetAtt
+ EFsFileModified
+ EFsFileSetModified
+ EFsFileSet
+ EFsDirOpen
+
+@param aRequest The client request
+@param aAtt The attribute
+@return KErrNone on successful completion, KErrNotSupported if the request is not supported
+*/
+EXPORT_C TInt GetAtt(TFsPluginRequest* aRequest, TInt& aAtt)
+ {
+ TInt size;
+ TFileName name;
+ TInt handle;
+ TInt driveNumber;
+ TUint attMask;
+ TTime modified;
+ TInt att;
+ TInt uidType;
+ TInt err = KErrNone;
+
+ switch(aRequest->Function())
+ {
+ case EFsFileDuplicate:
+ case EFsFileAdopt:
+ err = FileDuplicateAdoptVars(aRequest->Request(), driveNumber, handle, aAtt, size,(TDes&)name, modified);
+ break;
+ case EFsFileAtt:
+ err = FileAttVars(aRequest->Request(),aAtt, (TDes&)name);
+ break;
+ case EFsFileSetAtt:
+ err = FileSetAttVars(aRequest->Request(),aAtt, (TDes&)name, attMask, attMask);
+ break;
+ case EFsFileModified:
+ case EFsFileSetModified:
+ err = FileModificationVars(aRequest->Request(),aAtt, size,(TDes&)name, modified, modified);
+ break;
+ case EFsFileSet:
+ err = FileSetVars(aRequest->Request(), (TDes&)name, aAtt, att, att, modified, modified);
+ break;
+ case EFsDirOpen:
+ err = DirOpenVars(aRequest->Request(), (TDes&)name, aAtt, uidType);
+ break;
+ default:
+ err = KErrNotSupported;
+ }
+
+ return(err);
+ }
+
+
+/**
+@internalTechnology
+
+Utility function for obtaining the last modified time of a file from the client request
+Supported requests currently are:
+
+ EFsFileDuplicate
+ EFsFileAdopt
+ EFsFileModified
+ EFsFileSetModified
+ EFsFileSet
+ EFsFileChangeMode
+
+@param aRequest The client request
+@param aModified The last modified time
+@param aCurrent If true it returns the current last modified time, otherwise it will return
+ the requested last modified time
+@return KErrNone on successful completion, KErrNotSupported if the request is not supported
+*/
+EXPORT_C TInt GetModifiedTime(TFsPluginRequest* aRequest, TTime*& aModified, TBool aCurrent)
+ {
+ TFileName name;
+ TInt handle;
+ TInt att;
+ TInt size;
+ TInt driveNumber;
+ TTime modified;
+ TInt fmode;
+
+ TTime& _aModified = aModified ? *aModified : modified;
+
+ TInt err = KErrNone;
+
+ switch(aRequest->Function())
+ {
+ case EFsFileDuplicate:
+ case EFsFileAdopt:
+ err = FileDuplicateAdoptVars(aRequest->Request(), driveNumber, handle, att, size, (TDes&)name, _aModified);
+ break;
+ case EFsFileModified:
+ err = FileModificationVars(aRequest->Request(), att, size, (TDes&)name, _aModified, modified);
+ break;
+ case EFsFileSetModified:
+ if(aCurrent)
+ err = FileModificationVars(aRequest->Request(), att, size, (TDes&)name, _aModified, modified);
+ else
+ err = FileModificationVars(aRequest->Request(), att, size, (TDes&)name, modified, _aModified);
+ break;
+ case EFsFileSet:
+ if(aCurrent)
+ err = FileSetVars(aRequest->Request(), (TDes&)name, att, att, att, _aModified, modified);
+ else
+ err = FileSetVars(aRequest->Request(), (TDes&)name, att, att, att, modified, _aModified);
+ break;
+ case EFsFileChangeMode:
+ err = FileChangeModeVars(aRequest->Request(), (TDes&)name, fmode, fmode, _aModified);
+ break;
+ default:
+ err = KErrNotSupported;
+ }
+
+ return(err);
+ }
+
+/**
+@internalTechnology
+
+Utility function for obtaining the file access information from the client request
+Supported requests currently are:
+
+ EFsFileRead
+ EFsFileWrite
+ EFsFileLock
+ EFsFileUnLock
+ EFsFileSeek
+ EFsReadFileSection
+
+@param aRequest The client request
+@param aLength Length of access
+@param aPos Position of access
+@return KErrNone on successful completion, KErrNotSupported if the request is not supported
+*/
+EXPORT_C TInt GetFileAccessInfo(TFsPluginRequest* aRequest, TInt& aLength, TInt& aPos)
+ {
+ TFileName name;
+ const TAny* ptr;
+ TInt err = KErrNone;
+
+ switch(aRequest->Function())
+ {
+
+ case EFsFileRead:
+ case EFsFileWrite:
+ err = FileAccessVars(aRequest->Request(), aLength, aPos, (TDes&)name, ptr);
+ break;
+ case EFsFileLock:
+ case EFsFileUnLock:
+ err = FileLockVars(aRequest->Request(), aLength, aPos, (TDes&)name);
+ break;
+ case EFsFileSeek:
+ err = FileSeekVars(aRequest->Request(), aPos, (TDes&)name, ptr);
+ aLength=0;
+ break;
+ case EFsReadFileSection:
+ err = FileSectionVars(aRequest->Request(), aLength, aPos, (TDes&)name);
+ break;
+ default:
+ err = KErrNotSupported;
+ }
+
+ return(err);
+ }