# HG changeset patch # User hgs # Date 1288642296 0 # Node ID b5a01337d0180cabf03296cb4ac1dd11a5bc3e87 # Parent b2826f67641fc977cace1399ec334d55da6df1f2 201043_04 diff -r b2826f67641f -r b5a01337d018 kernel/eka/drivers/locmedia/locmedia.cpp --- a/kernel/eka/drivers/locmedia/locmedia.cpp Tue Oct 26 12:49:20 2010 +0100 +++ b/kernel/eka/drivers/locmedia/locmedia.cpp Mon Nov 01 20:11:36 2010 +0000 @@ -553,6 +553,26 @@ #endif /* +Acquires ownership of the (already opened) client thread object stored in TheCurrentThread::iExtTempObj +by retrieving and then clearing iExtTempObj + +On exit TheCurrentThread::iExtTempObj should be NULL + +@see EControlSetMountInfo +*/ +DThread* AcquireRemoteThread() + { + NKern::ThreadEnterCS(); + + DThread& t = Kern::CurrentThread(); + DThread* remoteThread = (DThread*)__e32_atomic_swp_ord_ptr(&t.iExtTempObj, 0); + + NKern::ThreadLeaveCS(); + + return remoteThread; + } + +/* * Requests are passed in message as follows: * iValue = request ID * iArg[0,1]= Position @@ -744,6 +764,11 @@ if(!pM || r!=KErrNone) break; +#ifdef __DEMAND_PAGING__ + // Clear existing mount info + UnlockMountInfo(*pM); +#endif + if (pM->iMountInfo.iThread) { NKern::ThreadEnterCS(); @@ -758,17 +783,11 @@ break; #endif pM->iMountInfo.iInfo=(TDesC8*)m.RemoteDes(); - pM->iMountInfo.iThread=m.RemoteThread(); + pM->iMountInfo.iThread = AcquireRemoteThread(); } else { - //Clear existing mount info and close setting thread - -#ifdef __DEMAND_PAGING__ - // unlock the mount info if this is a data paging media - UnlockMountInfo(*pM); -#endif - + // Close setting thread pM->iMountInfo.iInfo=NULL; pM->iMountInfo.iThread=NULL; m.CloseRemoteThread(); @@ -794,7 +813,8 @@ #endif pM->iMountInfo.iInfo=(TDesC8*)m.RemoteDes(); - pM->iMountInfo.iThread=m.RemoteThread(); + pM->iMountInfo.iThread = AcquireRemoteThread(); + NKern::ThreadLeaveCS(); r=KErrNone; } diff -r b2826f67641f -r b5a01337d018 kerneltest/f32test/group/bld.inf --- a/kerneltest/f32test/group/bld.inf Tue Oct 26 12:49:20 2010 +0100 +++ b/kerneltest/f32test/group/bld.inf Mon Nov 01 20:11:36 2010 +0000 @@ -99,6 +99,7 @@ t_misc t_nmbs t_notify +t_tfsys_notify support t_dspace t_open t_parse diff -r b2826f67641f -r b5a01337d018 kerneltest/f32test/group/t_tfsys_notify.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/f32test/group/t_tfsys_notify.mmp Mon Nov 01 20:11:36 2010 +0000 @@ -0,0 +1,40 @@ +// Copyright (c) 1997-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: +// f32test/group/t_tfsys.mmp +// +// + +TARGET t_tfsys_notify.fsy +TARGETTYPE fsy + +SOURCEPATH ../testfsys +SOURCE t_tfsys_notify.cpp + +USERINCLUDE ../../../userlibandfileserver/fileserver/inc // assumes f32test and f32 components in same directory +OS_LAYER_SYSTEMINCLUDE_SYMBIAN + +LIBRARY euser.lib efile.lib + + +START WINS +BASEADDRESS 0x61000000 +END + + +UID 0x100039df 0x10000CEE +VENDORID 0x70000001 + +#include "../../../userlibandfileserver/fileserver/group/f32caps.mmh" // Capabilities of File Server process + +SMPSAFE diff -r b2826f67641f -r b5a01337d018 kerneltest/f32test/server/t_notifier.cpp --- a/kerneltest/f32test/server/t_notifier.cpp Tue Oct 26 12:49:20 2010 +0100 +++ b/kerneltest/f32test/server/t_notifier.cpp Mon Nov 01 20:11:36 2010 +0000 @@ -23,6 +23,7 @@ #include "t_server.h" #include "t_chlffs.h" #include "t_notify_plugin.h" +#include "f32_test_utils.h" const TInt KNotificationHeaderSize = (sizeof(TUint16)*2)+(sizeof(TUint)); const TInt KMinNotificationBufferSize = 2*KNotificationHeaderSize + 2*KMaxFileName; @@ -31,6 +32,9 @@ RTest test(_L("T_NOTIFIER")); const TInt KMaxHeapSize = 0x800000; TInt globalDriveNum; +TBuf<50> filesystem; //storing original file system name +_LIT(KTestNotifyFileSystemExeName,"t_tfsys_notify.fsy"); +_LIT(KNotifyTestFileSystem,"CNotifyTestFileSystem"); void DismountPlugin() { @@ -38,6 +42,24 @@ TheFs.RemovePlugin(KNotifyPluginFileName); } +void RemountOriginalFileSystem() + { + //Replace old FS. + TheFs.DismountFileSystem(KNotifyTestFileSystem,globalDriveNum); + TheFs.MountFileSystem(filesystem,globalDriveNum); + TheFs.RemoveFileSystem(KNotifyTestFileSystem); + } + +inline void safe_external_test(RTest& aTest, TInt aError, TInt aLine, TText* aName) + { + if(aError!=KErrNone) + { + test.Printf(_L(": ERROR : %d received on line %d\n"),aError,aLine); + RemountOriginalFileSystem(); + aTest.operator()(aError==KErrNone,aLine,(TText*)aName); + } + } + inline void safe_test(RTest& aTest, TInt aError, TInt aLine, TText* aName) { if(aError!=KErrNone) @@ -519,7 +541,7 @@ if(_path.Match(fullname)!=KErrNone) safe_test(simpleTestWatcher,KErrBadName,__LINE__,(TText*)Expand("t_notifier.cpp")); - /* + TInt driveNumber = 0; TInt gDriveNum = -1; notification->DriveNumber(driveNumber); @@ -528,11 +550,11 @@ safe_test(simpleTestWatcher,KErrBadHandle,__LINE__,(TText*)Expand("t_notifier.cpp")); TUid uid; - TUint32 realUID = 0x76543210; + TInt32 realUID = 0x76543210; r = notification->UID(uid); safe_test(simpleTestWatcher,r,__LINE__,(TText*)Expand("t_notifier.cpp")); - safe_test(simpleTestWatcher,(realUID == uid.iUid)==1,__LINE__,(TText*)Expand("t_notifier.cpp")); - */ + safe_test(simpleTestWatcher,((realUID == uid.iUid)?KErrNone:KErrNotFound),__LINE__,(TText*)Expand("t_notifier.cpp")); + delete notify; fs.Close(); simpleTestWatcher.End(); @@ -3621,6 +3643,138 @@ return KErrNone; } +_LIT(KPhantomExtendedReplace,"?:\\PhantomExtended_Replaced.txt"); +_LIT(KPhantomExtendedRenamed,"?:\\PhantomExtended_Renamed.txt"); +_LIT(KPhantomExtendedRenameMe,"?:\\PhantomExtended_RenameMe.txt"); + +TInt DoTestExternalNotificationL() + { + TRequestStatus statusN, statusT; + RTimer timer1; + TTimeIntervalMicroSeconds32 time = 10000000; + + test.Printf(_L("DoTestExternalNotification")); + CFsNotify* notify = CFsNotify::NewL(TheFs,1024); + TInt r = notify->AddNotification(TFsNotification::ECreate, _L("?:\\"),_L("PhantomExtended_Replaced.txt")); + safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp")); + r = notify->RequestNotifications(statusN); + safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp")); + + RFile file; + r = file.Replace(TheFs,_L("\\Extended_Replaced.txt"),EFileWrite); + safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp")); + file.Close(); + + r = timer1.CreateLocal(); + safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp")); + timer1.After(statusT,time); + User::WaitForRequest(statusN,statusT); + test_Compare(statusN.Int(),!=,KRequestPending) + timer1.Cancel(); + timer1.Close(); + User::WaitForRequest(statusT); + + const TFsNotification* notification = notify->NextNotification(); + if(!notification) + safe_external_test(test,KErrUnderflow,__LINE__,(TText*)Expand("t_notifier.cpp")); + + //Check Path + TPtrC path; + r = notification->Path(path); + safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp")); + + if(path.Match(KPhantomExtendedReplace)==KErrNotFound) + { + safe_external_test(test,KErrNotFound,__LINE__,(TText*)Expand("t_notifier.cpp")); + } + + //Check NewName + TPtrC newName; + r = notification->NewName(newName); + safe_external_test(test,(r==KErrNotSupported) ? KErrNone : r,__LINE__,(TText*)Expand("t_notifier.cpp")); + + notify->CancelNotifications(statusN); + delete notify; + + //************************************************************* + // Rename: + //************************************************************* + + notify = CFsNotify::NewL(TheFs,1024); + r = notify->AddNotification(TFsNotification::ERename, _L("?:\\"),_L("PhantomExtended_Renamed.txt")); + safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp")); + r = notify->RequestNotifications(statusN); + safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp")); + + r = file.Replace(TheFs,_L("\\Extended_RenameMe.txt"),EFileWrite); + safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp")); + file.Close(); + + r = timer1.CreateLocal(); + safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp")); + timer1.After(statusT,time); + User::WaitForRequest(statusN,statusT); + test_Compare(statusN.Int(),!=,KRequestPending) + timer1.Cancel(); + timer1.Close(); + User::WaitForRequest(statusT); + + notification = notify->NextNotification(); + if(!notification) + safe_external_test(test,KErrUnderflow,__LINE__,(TText*)Expand("t_notifier.cpp")); + + r = notification->Path(path); + safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp")); + + if(path.Match(KPhantomExtendedRenameMe)==KErrNotFound) + { + safe_external_test(test,KErrNotFound,__LINE__,(TText*)Expand("t_notifier.cpp")); + } + + //Check NewName + r = notification->NewName(newName); + if(newName.Match(KPhantomExtendedRenamed)==KErrNotFound) + { + safe_external_test(test,KErrNotFound,__LINE__,(TText*)Expand("t_notifier.cpp")); + } + + notify->CancelNotifications(statusN); + delete notify; + + return KErrNone; + } + +void TestExternalNotifications() + { + test.Printf(_L("Test External Notifications (Load test file system)")); + + if(F32_Test_Utils::Is_SimulatedSystemDrive(TheFs,globalDriveNum)) + { + test.Printf(_L("Not testing External Notifications on SimulatedSystemDrive")); + return; + } + + TInt r = TheFs.FileSystemName(filesystem,globalDriveNum); + safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp")); + r = TheFs.DismountFileSystem(filesystem,globalDriveNum); + safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp")); + r = TheFs.AddFileSystem(KTestNotifyFileSystemExeName); + safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp")); + r = TheFs.MountFileSystem(KNotifyTestFileSystem,globalDriveNum); + safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp")); + + TRAP(r,DoTestExternalNotificationL()); + safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp")); + + //Replace old FS. + r = TheFs.DismountFileSystem(KNotifyTestFileSystem,globalDriveNum); + safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp")); + r = TheFs.MountFileSystem(filesystem,globalDriveNum); + safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp")); + r = TheFs.RemoveFileSystem(KNotifyTestFileSystem); + safe_external_test(test,r,__LINE__,(TText*)Expand("t_notifier.cpp")); + } + /* * This test is testing the use cases * and for negative testing of SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION @@ -4515,6 +4669,10 @@ test_KErrNone(r); test.Printf(_L("------- End of Data-Caging Tests -------------------------------------\n")); + PrintLine(); + test.Next(_L("Test TestExternalNotifications()")); + TestExternalNotifications(); + test.Printf(_L("------- End of TestExternalNotifications Tests -------------------------------------\n")); test.End(); test.Close(); diff -r b2826f67641f -r b5a01337d018 kerneltest/f32test/server/t_notify.cpp --- a/kerneltest/f32test/server/t_notify.cpp Tue Oct 26 12:49:20 2010 +0100 +++ b/kerneltest/f32test/server/t_notify.cpp Mon Nov 01 20:11:36 2010 +0000 @@ -31,6 +31,8 @@ const TInt KNotifyChangeAfter=100000; const TInt KMediaRemountForceMediaChange = 0x00000001; +TInt gDriveNum = -1; + RTest test(_L("T_NOTIFY")); RSemaphore gSleepThread; TInt gSocketNumber=0; @@ -4233,7 +4235,212 @@ } - +_LIT(KTestNotifyFileSystemExeName,"t_tfsys_notify.fsy"); +_LIT(KNotifyTestFileSystem,"CNotifyTestFileSystem"); + +TInt TestExternalNotificationsWellformedness() + { + //Do Something to cause a notification: + + //******************************************** + // + // Opening(Replacing) \\Wellformed_functionWrite, + // will issue a create notification on file \PhantomFile_functionWrite.txt + TRequestStatus status1, status2; + TheFs.NotifyChange(ENotifyFile,status1,_L("\\PhantomFile_functionReplace.txt")); + RFile file; + TInt r = file.Replace(TheFs,_L("\\Wellformed_functionReplace.txt"),EFileWrite); + test_KErrNone(r); + + + RTimer timer1; + r = timer1.CreateLocal(); + test_KErrNone(r); + TTimeIntervalMicroSeconds32 time = 10000000; + timer1.After(status2,time); + User::WaitForRequest(status1,status2); + test_Compare(status1.Int(),!=,KRequestPending) + timer1.Cancel(); + timer1.Close(); + User::WaitForRequest(status2); + + //******************************************** + // + // Rename \Wellformed_functionWrite.txt --> \Wellformed_functionRename.txt, + // will issue a rename notification on \PhantomFile_functionWrite.txt --> \PhantomFile_functionRename.txt + TheFs.NotifyChange(ENotifyEntry,status1,_L("\\PhantomFile_functionRename.txt")); + r = file.Rename(_L("\\Wellformed_functionWrite.txt")); + test_KErrNone(r); + + r = timer1.CreateLocal(); + test_KErrNone(r); + timer1.After(status2,time); + User::WaitForRequest(status1,status2); + test_Compare(status1.Int(),!=,KRequestPending); + timer1.Cancel(); + timer1.Close(); + User::WaitForRequest(status2); + file.Close(); + + //******************************************** + // + // SetAttributes + // + TheFs.NotifyChange(ENotifyAttributes,status1,_L("\\PhantomFile_functionAttributes.txt")); + r = file.Open(TheFs,_L("\\Wellformed_functionAttributes.txt"),EFileWrite); + test_KErrNone(r); + r = file.SetAtt(KEntryAttHidden,KEntryAttSystem); + test_KErrNone(r); + + { + r = timer1.CreateLocal(); + test_KErrNone(r); + timer1.After(status2,time); + User::WaitForRequest(status1,status2); + test_Compare(status1.Int(),!=,KRequestPending); + timer1.Cancel(); + timer1.Close(); + User::WaitForRequest(status2); + } + file.Close(); + + //******************************************** + // + // File Write + // \\Wellformed_functionWrite.txt -> \\PhantomFile_functionWrite.txt + // + TheFs.NotifyChange(ENotifyWrite,status1,_L("\\PhantomFile_functionWrite.txt")); + r = file.Replace(TheFs,_L("\\Wellformed_functionWrite.txt"),EFileWrite); + test_KErrNone(r); + TBuf8<4> blah; + blah.Append(_L("Blah")); + r = file.Write(blah); + test_KErrNone(r); + { + r = timer1.CreateLocal(); + test_KErrNone(r); + timer1.After(status2,time); + User::WaitForRequest(status1,status2); + test_Compare(status1.Int(),!=,KRequestPending); + timer1.Cancel(); + timer1.Close(); + User::WaitForRequest(status2); + } + + file.Close(); + return KErrNone; + } + +TInt TestExternalNotificationsMalformed() + { + + TRequestStatus status1, status2; + RTimer timer1; + TInt r = timer1.CreateLocal(); + test_KErrNone(r); + TTimeIntervalMicroSeconds32 time = 5000000; + + //******************************************** + // + // Don't set file size + // + TheFs.NotifyChange(ENotifyWrite,status1,_L("\\PhantomFileMalformed_functionWrite.txt")); + RFile file; + r = file.Open(TheFs,_L("\\Malformed_functionWrite.txt"),EFileWrite); + test_KErrNone(r); + r = file.Write(_L8("abcd")); + test_Value(KErrArgument,r); + { + r = timer1.CreateLocal(); + test_KErrNone(r); + timer1.After(status2,time); + test.Printf(_L("Wait for timeout..")); + User::WaitForRequest(status1,status2); + test_Compare(status1.Int(),==,KRequestPending); + timer1.Cancel(); + timer1.Close(); + TheFs.NotifyChangeCancel(status1); + User::WaitForRequest(status1); + } + + //******************************************** + // + // Set new name incorrectly + // + TheFs.NotifyChange(ENotifyFile,status1,_L("\\PhantomFileMalformed_functionRename.txt")); + r = file.Rename(_L("\\Malformed_functionRename.txt")); + test_Value(KErrArgument,r); + { + r = timer1.CreateLocal(); + test_KErrNone(r); + timer1.After(status2,time); + test.Printf(_L("Wait for timeout..")); + User::WaitForRequest(status1,status2); + test_Compare(status1.Int(),==,KRequestPending) + timer1.Cancel(); + timer1.Close(); + TheFs.NotifyChangeCancel(status1); + User::WaitForRequest(status1); + } + + + file.Close(); + return KErrNone; + } + +void TestExternalNotifications() + { + test.Printf(_L("Test External Notifications (Load test file system)")); + + if(F32_Test_Utils::Is_SimulatedSystemDrive(TheFs,gDriveNum)) + { + test.Printf(_L("Not testing External Notifications on SimulatedSystemDrive")); + return; + } + + test.Printf(_L("Test External Notifications (get file system name)")); + TBuf<50> filesystem; + TInt r = TheFs.FileSystemName(filesystem,gDriveNum); + test_KErrNone(r); + test.Printf(_L("Test External Notifications (add new file system)")); + r = TheFs.AddFileSystem(KTestNotifyFileSystemExeName); + if(r != KErrNone && r!=KErrAlreadyExists) + { + test_KErrNone(r); + } + test.Printf(_L("Test External Notifications (dismount existing file system)")); + r = TheFs.DismountFileSystem(filesystem,gDriveNum); + test_KErrNone(r); + test.Printf(_L("Test External Notifications (mount new file system)")); + r = TheFs.MountFileSystem(KNotifyTestFileSystem,gDriveNum); + test_KErrNone(r); + + CHECK_NO_PENDING_REQUESTS; + + test.Printf(_L("Test External Notifications (Perform tests)")); + r = TestExternalNotificationsWellformedness(); + test_KErrNone(r); + + CHECK_NO_PENDING_REQUESTS; + +// only test this in UREL +// as in DEBUG it PANICS. +#if !defined _DEBUG + test.Printf(_L("Test External Notifications (Perform malformed tests (UREL only))")); + r = TestExternalNotificationsMalformed(); + test_KErrNone(r); + CHECK_NO_PENDING_REQUESTS; +#endif + + test.Printf(_L("Test External Notifications (Replace FS)")); + //Replace old FS. + r = TheFs.DismountFileSystem(KNotifyTestFileSystem,gDriveNum); + test_KErrNone(r); + r = TheFs.MountFileSystem(filesystem,gDriveNum); + test_KErrNone(r); + r = TheFs.RemoveFileSystem(KNotifyTestFileSystem); + test_KErrNone(r); + } //----------------------------------------------------------------------- @@ -4242,7 +4449,9 @@ // GLDEF_C void CallTestsL() { - + TInt nRes=TheFs.CharToDrive(gDriveToTest, gDriveNum); + test_KErrNone(nRes); + CreateTestDirectory(_L("\\F32-TST\\NOTIFY\\")); // Test RFs::NotifyChange() @@ -4358,4 +4567,6 @@ CHECK_NO_PENDING_REQUESTS; TestRootDirNotifyChange(); CHECK_NO_PENDING_REQUESTS; + TestExternalNotifications(); + CHECK_NO_PENDING_REQUESTS; } diff -r b2826f67641f -r b5a01337d018 kerneltest/f32test/testfsys/t_tfsys_notify.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/f32test/testfsys/t_tfsys_notify.cpp Mon Nov 01 20:11:36 2010 +0000 @@ -0,0 +1,310 @@ +// Copyright (c) 1997-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: +// f32test\testfsys\t_tfsys.cpp +// +// + +#include "t_tfsys_notify.h" + + +const TInt KMajorVersionNumber=1; +const TInt KMinorVersionNumber=0; + +void CTestNotificationMountCB::FileOpenL(const TDesC& aName,TUint /*aMode*/,TFileOpen /*anOpen*/,CFileCB* /*aFile*/) + { + RDebug::Print(_L("CTestMountCB::FileOpenL - aName = %S"),&aName); + + if(aName.Match(_L("\\Wellformed_functionReplace.txt"))!= KErrNotFound) //PhantomFile_functionWrite.txt + { + CFsNotificationInfo* notificationInfo = CFsNotificationInfo::Allocate(*this,EFsFileReplace); + TBuf phantomName; + phantomName.Append(_L("\\")); + phantomName.Append(_L("PhantomFile_functionReplace.txt")); + TInt r = notificationInfo->SetSourceName(phantomName); + User::LeaveIfError(r); + r = notificationInfo->SetUid(TUid::Uid(KErrUnknown)); + User::LeaveIfError(r); + r = IssueNotification(notificationInfo); + User::LeaveIfError(r); + CFsNotificationInfo::Free(notificationInfo); + return; + } + else if(aName.Match(_L("\\Extended_Replaced.txt"))!= KErrNotFound) //\\Extended_Replaced.txt + { + CFsNotificationInfo* notificationInfo = CFsNotificationInfo::Allocate(*this,EFsFileReplace); + TBuf phantomName; + phantomName.Append(_L("\\")); + phantomName.Append(_L("PhantomExtended_Replaced.txt")); + TInt r = notificationInfo->SetSourceName(phantomName); + User::LeaveIfError(r); + r = notificationInfo->SetUid(TUid::Uid(KErrUnknown)); + User::LeaveIfError(r); + r = IssueNotification(notificationInfo); + User::LeaveIfError(r); + CFsNotificationInfo::Free(notificationInfo); + return; + } + else if(aName.Match(_L("\\Extended_RenameMe.txt"))!= KErrNotFound) //\\PhantomExtended_Renamed.txt + { + CFsNotificationInfo* notificationInfo = CFsNotificationInfo::Allocate(*this,EFsRename); + TBuf phantomName; + phantomName.Append(_L("\\")); + phantomName.Append(_L("PhantomExtended_RenameMe.txt")); + TInt r = notificationInfo->SetSourceName(phantomName); + User::LeaveIfError(r); + TBuf phantomRename; + phantomRename.Append(_L("\\")); + phantomRename.Append(_L("PhantomExtended_Renamed.txt")); + r = notificationInfo->SetNewName(phantomRename); + User::LeaveIfError(r); + r = notificationInfo->SetUid(TUid::Uid(KErrUnknown)); + User::LeaveIfError(r); + r = IssueNotification(notificationInfo); + User::LeaveIfError(r); + CFsNotificationInfo::Free(notificationInfo); + return; + } + + + } + +void CTestNotificationFileCB::RenameL(const TDesC& /*aNewName*/) + { + RDebug::Print(_L("CTestNotificationFileCB::RenameL - aName = %S"),iFileName); + + if(iFileName->Match(_L("\\Wellformed_functionReplace.txt"))!= KErrNotFound) //PhantomFile_functionWrite.txt + { + CFsNotificationInfo* notificationInfo = CFsNotificationInfo::Allocate(Mount(),EFsFileRename); + TBuf phantomName; + phantomName.Append(_L("\\")); + phantomName.Append(_L("PhantomFile_functionReplace.txt")); + TInt r = notificationInfo->SetSourceName(phantomName); + User::LeaveIfError(r); + TBuf phantomNewName; + phantomNewName.Append(_L("\\")); + phantomNewName.Append(_L("PhantomFile_functionRename.txt")); + r = notificationInfo->SetNewName(phantomNewName); + User::LeaveIfError(r); + r = notificationInfo->SetUid(TUid::Uid(KErrUnknown)); + User::LeaveIfError(r); + r = Mount().IssueNotification(notificationInfo); + User::LeaveIfError(r); + CFsNotificationInfo::Free(notificationInfo); + return; + } + + //MALFORMED + if(iFileName->Match(_L("\\Malformed_functionWrite.txt"))!=KErrNotFound) + { + CFsNotificationInfo* notificationInfo = CFsNotificationInfo::Allocate(Mount(),EFsFileRename); + TBuf phantomName; + phantomName.Append(_L("\\")); + phantomName.Append(_L("Malformed_functionWrite.txt")); + TInt r = notificationInfo->SetSourceName(phantomName); + User::LeaveIfError(r); + // Don't set NewName - Should cause error. + // SetNewName(phantomNewName); + r = notificationInfo->SetUid(TUid::Uid(KErrUnknown)); + User::LeaveIfError(r); + r = Mount().IssueNotification(notificationInfo); + User::LeaveIfError(r); + CFsNotificationInfo::Free(notificationInfo); + return; + } + } + +void CTestNotificationFileCB::WriteL(TInt /*aPos*/,TInt& /*aLength*/,const TAny* /*aDes*/,const RMessagePtr2& /*aMessage*/) + { + if(iFileName->Match(_L("\\Wellformed_functionWrite.txt"))!= KErrNotFound) //PhantomFile_functionWrite.txt + { + RDebug::Printf("CTestNotificationFileCB::WriteL - wellformed_functionWrite.txt"); + CFsNotificationInfo* notificationInfo = CFsNotificationInfo::Allocate(Mount(),EFsFileWrite); + TBuf phantomName; + phantomName.Append(_L("\\")); + phantomName.Append(_L("PhantomFile_functionWrite.txt")); + TInt r = notificationInfo->SetSourceName(phantomName); + User::LeaveIfError(r); + r = notificationInfo->SetFilesize((TInt64)4); + User::LeaveIfError(r); + r = notificationInfo->SetUid(TUid::Uid(KErrUnknown)); + User::LeaveIfError(r); + r = Mount().IssueNotification(notificationInfo); + User::LeaveIfError(r); + CFsNotificationInfo::Free(notificationInfo); + return; + } + + //MALFORMED + if(iFileName->Match(_L("\\Malformed_functionWrite.txt"))!=KErrNotFound) + { + RDebug::Printf("CTestNotificationFileCB::WriteL - malformed_functionWrite.txt"); + CFsNotificationInfo* notificationInfo = CFsNotificationInfo::Allocate(Mount(),EFsFileWrite); + TBuf phantomName; + phantomName.Append(_L("\\")); + phantomName.Append(_L("PhantomFileMalformed_functionWrite.txt")); + TInt r = notificationInfo->SetSourceName(phantomName); + User::LeaveIfError(r); + //We won't set filesize - which should result in an error. + // SetFilesize((TInt64)4); + // + r = notificationInfo->SetUid(TUid::Uid(KErrUnknown)); + User::LeaveIfError(r); + r = Mount().IssueNotification(notificationInfo); + User::LeaveIfError(r); + CFsNotificationInfo::Free(notificationInfo); + return; + } + + } + +void CTestNotificationFileCB::SetEntryL(const TTime& /*aTime*/,TUint /*aSetAttMask*/,TUint /*aClearAttMask*/) + { + if(iFileName->Match(_L("\\Wellformed_functionAttributes.txt"))!= KErrNotFound) //PhantomFile_functionWrite.txt + { + CFsNotificationInfo* notificationInfo = CFsNotificationInfo::Allocate(Mount(),EFsFileSetAtt); + TBuf phantomName; + phantomName.Append(_L("\\")); + phantomName.Append(_L("PhantomFile_functionAttributes.txt")); + TInt r = notificationInfo->SetSourceName(phantomName); + User::LeaveIfError(r); + r = notificationInfo->SetAttributes(KEntryAttSystem,KEntryAttHidden); + User::LeaveIfError(r); + r = notificationInfo->SetUid(TUid::Uid(KErrUnknown)); + User::LeaveIfError(r); + r = Mount().IssueNotification(notificationInfo); + User::LeaveIfError(r); + CFsNotificationInfo::Free(notificationInfo); + return; + } + } + +CTestFileSystem::CTestFileSystem() +// +// Constructor +// + { + __DECLARE_NAME(_S("CNotifyTestFileSystem")); + } + +CTestFileSystem::~CTestFileSystem() +// +// Destructor +// + {} + +TInt CTestFileSystem::Install() +// +// Install the file system +// + { + iVersion=TVersion(KMajorVersionNumber,KMinorVersionNumber,KF32BuildVersionNumber); + TPtrC name=_L("CNotifyTestFileSystem"); + return(SetName(&name)); + } + +CMountCB* CTestFileSystem::NewMountL() const +// +// Create a new mount control block +// + { + return (new(ELeave) CTestNotificationMountCB); + } + +CFileCB* CTestFileSystem::NewFileL() const +// +// Create a new file +// + { + return (new(ELeave) CTestNotificationFileCB); + } + +CDirCB* CTestFileSystem::NewDirL() const +// +// create a new directory lister +// + { + return (new(ELeave) CTestDirCB); + } + +CFormatCB* CTestFileSystem::NewFormatL() const +// +// Create a new media formatter +// + { + return (new(ELeave) CTestFormatCB); + } + +TInt CTestFileSystem::DefaultPath(TDes& aPath) const +// +// Return the intial default path +// + { + aPath=_L("C:\\"); + return (KErrNone); + } + + +/** +Reports whether the specified interface is supported - if it is, +the supplied interface object is modified to it + +@param aInterfaceId The interface of interest +@param aInterface The interface object +@return KErrNone if the interface is supported, otherwise KErrNotFound + +@see CFileSystem::GetInterface() +*/ +TInt CTestFileSystem::GetInterface(TInt aInterfaceId, TAny*& aInterface,TAny* aInput) + { + switch(aInterfaceId) + { + case CFileSystem::EProxyDriveSupport: // The FAT Filesystem supports proxy drives + return KErrNone; + + default: + return(CFileSystem::GetInterface(aInterfaceId, aInterface, aInput)); + } + } + +CFileSystem* CTestFileSystem::NewL() +// +// +// + { + CFileSystem* testFSys = new(ELeave) CTestFileSystem; + return testFSys; + } + + +CTestNotificationMountCB::CTestNotificationMountCB(){}; +CTestNotificationMountCB::~CTestNotificationMountCB(){}; +CTestDirCB::CTestDirCB(){}; +CTestDirCB::~CTestDirCB(){}; +CTestNotificationFileCB::CTestNotificationFileCB(){}; +CTestNotificationFileCB::~CTestNotificationFileCB(){}; +CTestFormatCB::CTestFormatCB(){}; +CTestFormatCB::~CTestFormatCB(){}; + + +extern "C" { + +EXPORT_C CFileSystem* CreateFileSystem() +// +// Create a new file system +// + { + return(CTestFileSystem::NewL()); + } +} + diff -r b2826f67641f -r b5a01337d018 kerneltest/f32test/testfsys/t_tfsys_notify.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/f32test/testfsys/t_tfsys_notify.h Mon Nov 01 20:11:36 2010 +0000 @@ -0,0 +1,110 @@ +// Copyright (c) 1997-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: +// f32test\testfsys\t_tfsys.h +// +// + +#include +#include "common.h" +#include +#include +#include +#include +#include + +class CTestNotificationMountCB : public CMountCB + { +public: + CTestNotificationMountCB(); + ~CTestNotificationMountCB(); + void MountL(TBool /*aForceMount*/){ + iUniqueID=0; + iSize=(TUint)2 << 30; //2GB + SetVolumeName(_L("TestNotificationFS").AllocL()); + } + TInt ReMount(){return KErrNone;} + void Dismounted(){} + void VolumeL(TVolumeInfo& aVolume) const{ + aVolume.iFree = 1 << 30; + } + void SetVolumeL(TDes& /*aName*/){ } + void MkDirL(const TDesC& /*aName*/){} + void RmDirL(const TDesC& /*aName*/){} + void DeleteL(const TDesC& /*aName*/){} + void RenameL(const TDesC& /*aName*/,const TDesC& /*aNewName*/){} + void ReplaceL(const TDesC& /*anOldName*/,const TDesC& /*anNewName*/){} + void EntryL(const TDesC& /*aName*/,TEntry& /*anEntry*/) const{} + void SetEntryL(const TDesC& /*aName*/,const TTime& /*aTime*/,TUint /*aSetAttMask*/,TUint /*aClearAttMask*/){} + void FileOpenL(const TDesC& /*aName*/,TUint /*aMode*/,TFileOpen /*anOpen*/,CFileCB* /*aFile*/); + void DirOpenL(const TDesC& /*aName*/,CDirCB* /*aDir*/){} + void RawReadL(TInt64 /*aPos*/,TInt /*aLength*/,const TAny* /*aTrg*/,TInt /*anOffset*/,const RMessagePtr2& /*aMessage*/) const{} + void RawWriteL(TInt64 /*aPos*/,TInt /*aLength*/,const TAny* /*aSrc*/,TInt /*anOffset*/,const RMessagePtr2& /*aMessage*/){} + void ReadUidL(const TDesC& /*aName*/,TEntry& /*anEntry*/) const{} + void GetShortNameL(const TDesC& /*aLongName*/,TDes& /*aShortName*/){} + void GetLongNameL(const TDesC& /*aShortName*/,TDes& /*aLongName*/){} + void IsFileInRom(const TDesC& /*aFileName*/,TUint8*& /*aFileStart*/){} + void ReadSectionL(const TDesC& /*aName*/,TInt /*aPos*/,TAny* /*aTrg*/,TInt /*aLength*/,const RMessagePtr2& /*aMessage*/){} + }; + + + +class CTestNotificationFileCB : public CFileCB + { +public: + CTestNotificationFileCB(); + ~CTestNotificationFileCB(); + void RenameL(const TDesC& /*aNewName*/); + void ReadL(TInt /*aPos*/,TInt& /*aLength*/,const TAny* /*aDes*/,const RMessagePtr2& /*aMessage*/){} + void WriteL(TInt /*aPos*/,TInt& /*aLength*/,const TAny* /*aDes*/,const RMessagePtr2& /*aMessage*/); + TInt Address(TInt& /*aPos*/) const{return 0;} + void SetSizeL(TInt /*aSize*/){} + void SetEntryL(const TTime& /*aTime*/,TUint /*aSetAttMask*/,TUint /*aClearAttMask*/); + void FlushDataL(){} + void FlushAllL(){} + void CheckPos(TInt /*aPos*/){} + }; + +class CTestDirCB : public CDirCB + { +public: + CTestDirCB(); + ~CTestDirCB(); + void ReadL(TEntry& /*anEntry*/){} + }; + +class CTestFormatCB : public CFormatCB + { +public: + CTestFormatCB(); + ~CTestFormatCB(); + void DoFormatStepL(){} + }; + +class CTestFileSystem : public CFileSystem + { +public: + CTestFileSystem(); + ~CTestFileSystem(); + TInt Install(); + TInt DefaultPath(TDes& aPath) const; + TBusLocalDrive& DriveNumberToLocalDrive(TInt aDriveNumber); + TInt GetInterface(TInt aInterfaceId, TAny*& aInterface,TAny* aInput); +private: + CMountCB* NewMountL() const; + CFileCB* NewFileL() const; + CDirCB* NewDirL() const; + CFormatCB* NewFormatL() const; +public: + static CFileSystem* NewL(); + }; diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/bmarm/efileu.def --- a/userlibandfileserver/fileserver/bmarm/efileu.def Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/bmarm/efileu.def Mon Nov 01 20:11:36 2010 +0000 @@ -242,3 +242,12 @@ Volume__C9RFsPluginR11TVolumeInfoi @ 241 NONAME R3UNUSED ; RFsPlugin::Volume(TVolumeInfo &, int) const IsSequentialMode__C7CFileCB @ 242 NONAME R3UNUSED ; CFileCB::IsSequentialMode(void) const DirectIOMode__7CFileCBRC12RMessagePtr2 @ 243 NONAME R3UNUSED ; CFileCB::DirectIOMode(RMessagePtr2 const &) + Allocate__19CFsNotificationInfoRC8CMountCBi @ 244 NONAME R3UNUSED ; CFsNotificationInfo::Allocate(CMountCB const &, int) + Free__19CFsNotificationInfoRP19CFsNotificationInfo @ 245 NONAME R3UNUSED ; CFsNotificationInfo::Free(CFsNotificationInfo *&) + IssueNotification__8CMountCBP19CFsNotificationInfo @ 246 NONAME R3UNUSED ; CMountCB::IssueNotification(CFsNotificationInfo *) + SetAttributes__19CFsNotificationInfoUiUi @ 247 NONAME R3UNUSED ; CFsNotificationInfo::SetAttributes(unsigned int, unsigned int) + SetFilesize__19CFsNotificationInfox @ 248 NONAME ; CFsNotificationInfo::SetFilesize(long long) + SetNewName__19CFsNotificationInfoRC7TDesC16 @ 249 NONAME R3UNUSED ; CFsNotificationInfo::SetNewName(TDesC16 const &) + SetSourceName__19CFsNotificationInfoRC7TDesC16 @ 250 NONAME R3UNUSED ; CFsNotificationInfo::SetSourceName(TDesC16 const &) + SetUid__19CFsNotificationInfoRC4TUid @ 251 NONAME R3UNUSED ; CFsNotificationInfo::SetUid(TUid const &) + diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/bmarm/efsrvu.def --- a/userlibandfileserver/fileserver/bmarm/efsrvu.def Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/bmarm/efsrvu.def Mon Nov 01 20:11:36 2010 +0000 @@ -375,4 +375,6 @@ MountFileSystem__C14CFsMountHelper @ 374 NONAME R3UNUSED ; CFsMountHelper::MountFileSystem(void) const New__14CFsMountHelperR3RFsi @ 375 NONAME R3UNUSED ; CFsMountHelper::New(RFs &, int) "_._14CFsMountHelper" @ 376 NONAME R3UNUSED ; CFsMountHelper::~CFsMountHelper(void) + DriveNumber__C15TFsNotificationRi @ 377 NONAME R3UNUSED ; TFsNotification::DriveNumber(int &) const + UID__C15TFsNotificationR4TUid @ 378 NONAME R3UNUSED ; TFsNotification::UID(TUid &) const diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/bwins/efileu.def --- a/userlibandfileserver/fileserver/bwins/efileu.def Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/bwins/efileu.def Mon Nov 01 20:11:36 2010 +0000 @@ -243,3 +243,12 @@ ?Volume@RFsPlugin@@QBEHAAVTVolumeInfo@@H@Z @ 242 NONAME ; int RFsPlugin::Volume(class TVolumeInfo &, int) const ?IsSequentialMode@CFileCB@@QBEHXZ @ 243 NONAME ; int CFileCB::IsSequentialMode(void) const ?DirectIOMode@CFileCB@@QAEHABVRMessagePtr2@@@Z @ 244 NONAME ; int CFileCB::DirectIOMode(class RMessagePtr2 const &) + ?Allocate@CFsNotificationInfo@@SAPAV1@ABVCMountCB@@H@Z @ 245 NONAME ; class CFsNotificationInfo * CFsNotificationInfo::Allocate(class CMountCB const &, int) + ?SetNewName@CFsNotificationInfo@@QAEHABVTDesC16@@@Z @ 246 NONAME ; int CFsNotificationInfo::SetNewName(class TDesC16 const &) + ?IssueNotification@CMountCB@@QAEHPAVCFsNotificationInfo@@@Z @ 247 NONAME ; int CMountCB::IssueNotification(class CFsNotificationInfo *) + ?SetUid@CFsNotificationInfo@@QAEHABVTUid@@@Z @ 248 NONAME ; int CFsNotificationInfo::SetUid(class TUid const &) + ?Free@CFsNotificationInfo@@SAXAAPAV1@@Z @ 249 NONAME ; void CFsNotificationInfo::Free(class CFsNotificationInfo * &) + ?SetFilesize@CFsNotificationInfo@@QAEH_J@Z @ 250 NONAME ; int CFsNotificationInfo::SetFilesize(long long) + ?SetSourceName@CFsNotificationInfo@@QAEHABVTDesC16@@@Z @ 251 NONAME ; int CFsNotificationInfo::SetSourceName(class TDesC16 const &) + ?SetAttributes@CFsNotificationInfo@@QAEHII@Z @ 252 NONAME ; int CFsNotificationInfo::SetAttributes(unsigned int, unsigned int) + diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/bwins/efsrvu.def --- a/userlibandfileserver/fileserver/bwins/efsrvu.def Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/bwins/efsrvu.def Mon Nov 01 20:11:36 2010 +0000 @@ -375,4 +375,6 @@ ?GetMountProperties@CFsMountHelper@@QAEHXZ @ 374 NONAME ; public: int __thiscall CFsMountHelper::GetMountProperties(void) ?MountFileSystem@CFsMountHelper@@QBEHXZ @ 375 NONAME ; public: int __thiscall CFsMountHelper::MountFileSystem(void)const ?New@CFsMountHelper@@SAPAV1@AAVRFs@@H@Z @ 376 NONAME ; public: static class CFsMountHelper * __cdecl CFsMountHelper::New(class RFs &,int) + ?DriveNumber@TFsNotification@@QBEHAAH@Z @ 377 NONAME ; int TFsNotification::DriveNumber(int &) const + ?UID@TFsNotification@@QBEHAAVTUid@@@Z @ 378 NONAME ; int TFsNotification::UID(class TUid &) const diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/bx86/efileu.def --- a/userlibandfileserver/fileserver/bx86/efileu.def Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/bx86/efileu.def Mon Nov 01 20:11:36 2010 +0000 @@ -243,4 +243,12 @@ ?Volume@RFsPlugin@@QBEHAAVTVolumeInfo@@H@Z @ 242 NONAME ; public: int __thiscall RFsPlugin::Volume(class TVolumeInfo &,int)const ?IsSequentialMode@CFileCB@@QBEHXZ @ 243 NONAME ; public: int __thiscall CFileCB::IsSequentialMode(void)const ?DirectIOMode@CFileCB@@QAEHABVRMessagePtr2@@@Z @ 244 NONAME ; int CFileCB::DirectIOMode(class RMessagePtr2 const &) + ?Allocate@CFsNotificationInfo@@SAPAV1@ABVCMountCB@@H@Z @ 245 NONAME ; public: static class CFsNotificationInfo * __cdecl CFsNotificationInfo::Allocate(class CMountCB const &,int) + ?Free@CFsNotificationInfo@@SAXAAPAV1@@Z @ 246 NONAME ; public: static void __cdecl CFsNotificationInfo::Free(class CFsNotificationInfo * &) + ?IssueNotification@CMountCB@@QAEHPAVCFsNotificationInfo@@@Z @ 247 NONAME ; public: int __thiscall CMountCB::IssueNotification(class CFsNotificationInfo *) + ?SetAttributes@CFsNotificationInfo@@QAEHII@Z @ 248 NONAME ; public: int __thiscall CFsNotificationInfo::SetAttributes(unsigned int,unsigned int) + ?SetFilesize@CFsNotificationInfo@@QAEH_J@Z @ 249 NONAME ; public: int __thiscall CFsNotificationInfo::SetFilesize(__int64) + ?SetNewName@CFsNotificationInfo@@QAEHABVTDesC16@@@Z @ 250 NONAME ; public: int __thiscall CFsNotificationInfo::SetNewName(class TDesC16 const &) + ?SetSourceName@CFsNotificationInfo@@QAEHABVTDesC16@@@Z @ 251 NONAME ; public: int __thiscall CFsNotificationInfo::SetSourceName(class TDesC16 const &) + ?SetUid@CFsNotificationInfo@@QAEHABVTUid@@@Z @ 252 NONAME ; public: int __thiscall CFsNotificationInfo::SetUid(class TUid const &) diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/bx86/efsrvu.def --- a/userlibandfileserver/fileserver/bx86/efsrvu.def Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/bx86/efsrvu.def Mon Nov 01 20:11:36 2010 +0000 @@ -1,378 +1,380 @@ EXPORTS - ??0CDir@@IAE@XZ @ 1 NONAME ; protected: __thiscall CDir::CDir(void) - ??0CFileBase@@IAE@AAVRFs@@@Z @ 2 NONAME ; protected: __thiscall CFileBase::CFileBase(class RFs &) - ??0TDriveUnit@@QAE@ABVTDesC16@@@Z @ 3 NONAME ; public: __thiscall TDriveUnit::TDriveUnit(class TDesC16 const &) - ??0TDriveUnit@@QAE@H@Z @ 4 NONAME ; public: __thiscall TDriveUnit::TDriveUnit(int) - ??0TEntryArray@@QAE@XZ @ 5 NONAME ; public: __thiscall TEntryArray::TEntryArray(void) - ??0TFileText@@QAE@XZ @ 6 NONAME ; public: __thiscall TFileText::TFileText(void) - ??0TFindFile@@QAE@AAVRFs@@@Z @ 7 NONAME ; public: __thiscall TFindFile::TFindFile(class RFs &) - ??0TOpenFileScan@@QAE@AAVRFs@@@Z @ 8 NONAME ; public: __thiscall TOpenFileScan::TOpenFileScan(class RFs &) - ??0TParseBase@@QAE@XZ @ 9 NONAME ; public: __thiscall TParseBase::TParseBase(void) - ??0TParsePtr@@QAE@AAVTDes16@@@Z @ 10 NONAME ; public: __thiscall TParsePtr::TParsePtr(class TDes16 &) - ??0TParsePtrC@@QAE@ABVTDesC16@@@Z @ 11 NONAME ; public: __thiscall TParsePtrC::TParsePtrC(class TDesC16 const &) - ??0TVolumeInfo@@QAE@XZ @ 12 NONAME ; public: __thiscall TVolumeInfo::TVolumeInfo(void) - ??1CDir@@UAE@XZ @ 13 NONAME ; public: virtual __thiscall CDir::~CDir(void) - ??1CDirScan@@UAE@XZ @ 14 NONAME ; public: virtual __thiscall CDirScan::~CDirScan(void) - ??1CFileBase@@MAE@XZ @ 15 NONAME ; protected: virtual __thiscall CFileBase::~CFileBase(void) - ??4TDriveUnit@@QAEAAV0@ABVTDesC16@@@Z @ 16 NONAME ; public: class TDriveUnit & __thiscall TDriveUnit::operator=(class TDesC16 const &) - ??4TDriveUnit@@QAEAAV0@H@Z @ 17 NONAME ; public: class TDriveUnit & __thiscall TDriveUnit::operator=(int) - ??ACDir@@QBEABVTEntry@@H@Z @ 18 NONAME ; public: class TEntry const & __thiscall CDir::operator[](int)const - ??ATEntryArray@@QBEABVTEntry@@H@Z @ 19 NONAME ; public: class TEntry const & __thiscall TEntryArray::operator[](int)const - ?AbbreviatedPath@CDirScan@@QAE?AVTPtrC16@@XZ @ 20 NONAME ; public: class TPtrC16 __thiscall CDirScan::AbbreviatedPath(void) - ?AbbreviatedPath@CFileBase@@QAE?AVTPtrC16@@XZ @ 21 NONAME ; public: class TPtrC16 __thiscall CFileBase::AbbreviatedPath(void) - ?AddDir@TParseBase@@QAEHABVTDesC16@@@Z @ 22 NONAME ; public: int __thiscall TParseBase::AddDir(class TDesC16 const &) - ?AddFileSystem@RFs@@QBEHABVTDesC16@@@Z @ 23 NONAME ; public: int __thiscall RFs::AddFileSystem(class TDesC16 const &)const - ?AddL@CDir@@IAEXABVTEntry@@@Z @ 24 NONAME ; protected: void __thiscall CDir::AddL(class TEntry const &) - ?Att@RFile@@QBEHAAI@Z @ 25 NONAME ; public: int __thiscall RFile::Att(unsigned int &)const - ?Att@RFs@@QBEHABVTDesC16@@AAI@Z @ 26 NONAME ; public: int __thiscall RFs::Att(class TDesC16 const &,unsigned int &)const - ?Attribs@CFileMan@@QAEHABVTDesC16@@IIABVTTime@@I@Z @ 27 NONAME ; public: int __thiscall CFileMan::Attribs(class TDesC16 const &,unsigned int,unsigned int,class TTime const &,unsigned int) - ?Attribs@CFileMan@@QAEHABVTDesC16@@IIABVTTime@@IAAVTRequestStatus@@@Z @ 28 NONAME ; public: int __thiscall CFileMan::Attribs(class TDesC16 const &,unsigned int,unsigned int,class TTime const &,unsigned int,class TRequestStatus &) - ?BytesTransferredByCopyStep@CFileMan@@QAEHXZ @ 29 NONAME ; public: int __thiscall CFileMan::BytesTransferredByCopyStep(void) - ?ChangeMode@RFile@@QAEHW4TFileMode@@@Z @ 30 NONAME ; public: int __thiscall RFile::ChangeMode(enum TFileMode) - ?CharToDrive@RFs@@SAHVTChar@@AAH@Z @ 31 NONAME ; public: static int __cdecl RFs::CharToDrive(class TChar,int &) - ?CheckDisk@RFs@@QBEHABVTDesC16@@@Z @ 32 NONAME ; public: int __thiscall RFs::CheckDisk(class TDesC16 const &)const - ?ClearPassword@RFs@@QAEHHABV?$TBuf8@$0BA@@@@Z @ 33 NONAME ; public: int __thiscall RFs::ClearPassword(int,class TBuf8<16> const &) - ?Duplicate@RFile@@QAEHABV1@W4TOwnerType@@@Z @ 34 NONAME ; public: int __thiscall RFile::Duplicate(class RFile const &,enum TOwnerType) - ?Close@RRawDisk@@QAEXXZ @ 35 NONAME ; public: void __thiscall RRawDisk::Close(void) - ?Compress@CDir@@IAEXXZ @ 36 NONAME ; protected: void __thiscall CDir::Compress(void) - ?Connect@RFs@@QAEHH@Z @ 37 NONAME ; public: int __thiscall RFs::Connect(int) - ?ConstructL@CFileBase@@IAEXXZ @ 38 NONAME ; protected: void __thiscall CFileBase::ConstructL(void) - ?ControlIo@RFs@@QAEHHHPAX0@Z @ 39 NONAME ; public: int __thiscall RFs::ControlIo(int,int,void *,void *) - ?Copy@CFileMan@@QAEHABVTDesC16@@0I@Z @ 40 NONAME ; public: int __thiscall CFileMan::Copy(class TDesC16 const &,class TDesC16 const &,unsigned int) - ?Copy@CFileMan@@QAEHABVTDesC16@@0IAAVTRequestStatus@@@Z @ 41 NONAME ; public: int __thiscall CFileMan::Copy(class TDesC16 const &,class TDesC16 const &,unsigned int,class TRequestStatus &) - ?Count@CDir@@QBEHXZ @ 42 NONAME ; public: int __thiscall CDir::Count(void)const - ?Count@TEntryArray@@QBEHXZ @ 43 NONAME ; public: int __thiscall TEntryArray::Count(void)const - ?Create@RFile@@QAEHAAVRFs@@ABVTDesC16@@I@Z @ 44 NONAME ; public: int __thiscall RFile::Create(class RFs &,class TDesC16 const &,unsigned int) - ?CurrentAction@CFileMan@@QAE?AW4TAction@1@XZ @ 45 NONAME ; public: enum CFileMan::TAction __thiscall CFileMan::CurrentAction(void) - ?CurrentEntry@CFileBase@@QAEABVTEntry@@XZ @ 46 NONAME ; public: class TEntry const & __thiscall CFileBase::CurrentEntry(void) - ?DefaultPath@RFs@@QBEHAAVTDes16@@@Z @ 47 NONAME ; public: int __thiscall RFs::DefaultPath(class TDes16 &)const - ?Delete@CFileMan@@QAEHABVTDesC16@@I@Z @ 48 NONAME ; public: int __thiscall CFileMan::Delete(class TDesC16 const &,unsigned int) - ?Delete@CFileMan@@QAEHABVTDesC16@@IAAVTRequestStatus@@@Z @ 49 NONAME ; public: int __thiscall CFileMan::Delete(class TDesC16 const &,unsigned int,class TRequestStatus &) - ?Delete@RFs@@QAEHABVTDesC16@@@Z @ 50 NONAME ; public: int __thiscall RFs::Delete(class TDesC16 const &) - ?DismountFileSystem@RFs@@QBEHABVTDesC16@@H@Z @ 51 NONAME ; public: int __thiscall RFs::DismountFileSystem(class TDesC16 const &,int)const - ?Drive@RFs@@QBEHAAVTDriveInfo@@H@Z @ 52 NONAME ; public: int __thiscall RFs::Drive(class TDriveInfo &,int)const - ?Drive@TParseBase@@QBE?AVTPtrC16@@XZ @ 53 NONAME ; public: class TPtrC16 __thiscall TParseBase::Drive(void)const - ?DriveAndPath@TParseBase@@QBE?AVTPtrC16@@XZ @ 54 NONAME ; public: class TPtrC16 __thiscall TParseBase::DriveAndPath(void)const - ?DriveList@RFs@@QBEHAAV?$TBuf8@$0BK@@@@Z @ 55 NONAME ; public: int __thiscall RFs::DriveList(class TBuf8<26> &)const - ?DrivePresent@TParseBase@@QBEHXZ @ 56 NONAME ; public: int __thiscall TParseBase::DrivePresent(void)const - ?DriveToChar@RFs@@SAHHAAVTChar@@@Z @ 57 NONAME ; public: static int __cdecl RFs::DriveToChar(int,class TChar &) - ?Entry@RFs@@QBEHABVTDesC16@@AAVTEntry@@@Z @ 58 NONAME ; public: int __thiscall RFs::Entry(class TDesC16 const &,class TEntry &)const - ?Ext@TParseBase@@QBE?AVTPtrC16@@XZ @ 59 NONAME ; public: class TPtrC16 __thiscall TParseBase::Ext(void)const - ?ExtPresent@TParseBase@@QBEHXZ @ 60 NONAME ; public: int __thiscall TParseBase::ExtPresent(void)const - ?ExtractL@CDir@@IAEXHAAPAV1@@Z @ 61 NONAME ; protected: void __thiscall CDir::ExtractL(int,class CDir * &) - ?FileSystemName@RFs@@QBEHAAVTDes16@@H@Z @ 62 NONAME ; public: int __thiscall RFs::FileSystemName(class TDes16 &,int)const - ?Find@TFindFile@@QAEHXZ @ 63 NONAME ; public: int __thiscall TFindFile::Find(void) - ?FindByDir@TFindFile@@QAEHABVTDesC16@@0@Z @ 64 NONAME ; public: int __thiscall TFindFile::FindByDir(class TDesC16 const &,class TDesC16 const &) - ?FindByPath@TFindFile@@QAEHABVTDesC16@@PBV2@@Z @ 65 NONAME ; public: int __thiscall TFindFile::FindByPath(class TDesC16 const &,class TDesC16 const *) - ?FindWild@TFindFile@@QAEHAAPAVCDir@@@Z @ 66 NONAME ; public: int __thiscall TFindFile::FindWild(class CDir * &) - ?FindWildByDir@TFindFile@@QAEHABVTDesC16@@0AAPAVCDir@@@Z @ 67 NONAME ; public: int __thiscall TFindFile::FindWildByDir(class TDesC16 const &,class TDesC16 const &,class CDir * &) - ?FindWildByPath@TFindFile@@QAEHABVTDesC16@@PBV2@AAPAVCDir@@@Z @ 68 NONAME ; public: int __thiscall TFindFile::FindWildByPath(class TDesC16 const &,class TDesC16 const *,class CDir * &) - ?Flush@RFile@@QAEHXZ @ 69 NONAME ; public: int __thiscall RFile::Flush(void) - ?FullName@TParseBase@@QBEABVTDesC16@@XZ @ 70 NONAME ; public: class TDesC16 const & __thiscall TParseBase::FullName(void)const - ?FullPath@CDirScan@@QAE?AVTPtrC16@@XZ @ 71 NONAME ; public: class TPtrC16 __thiscall CDirScan::FullPath(void) - ?FullPath@CFileBase@@QAE?AVTPtrC16@@XZ @ 72 NONAME ; public: class TPtrC16 __thiscall CFileBase::FullPath(void) - ?GetCurrentSource@CFileMan@@QAEXAAV?$TBuf@$0BAA@@@@Z @ 73 NONAME ; public: void __thiscall CFileMan::GetCurrentSource(class TBuf<256> &) - ?GetCurrentTarget@CFileMan@@QAEXAAV?$TBuf@$0BAA@@@@Z @ 74 NONAME ; public: void __thiscall CFileMan::GetCurrentTarget(class TBuf<256> &) - ?GetDir@RFs@@QBEHABVTDesC16@@ABVTUidType@@IAAPAVCDir@@@Z @ 75 NONAME ; public: int __thiscall RFs::GetDir(class TDesC16 const &,class TUidType const &,unsigned int,class CDir * &)const - ?GetDir@RFs@@QBEHABVTDesC16@@IIAAPAVCDir@@1@Z @ 76 NONAME ; public: int __thiscall RFs::GetDir(class TDesC16 const &,unsigned int,unsigned int,class CDir * &,class CDir * &)const - ?GetDir@RFs@@QBEHABVTDesC16@@IIAAPAVCDir@@@Z @ 77 NONAME ; public: int __thiscall RFs::GetDir(class TDesC16 const &,unsigned int,unsigned int,class CDir * &)const - ?GetDriveName@RFs@@QBEHHAAVTDes16@@@Z @ 78 NONAME ; public: int __thiscall RFs::GetDriveName(int,class TDes16 &)const - ?GetLastError@CFileBase@@QAEHXZ @ 79 NONAME ; public: int __thiscall CFileBase::GetLastError(void) - ?GetLongName@RFs@@QBEHABVTDesC16@@AAVTDes16@@@Z @ 80 NONAME ; public: int __thiscall RFs::GetLongName(class TDesC16 const &,class TDes16 &)const - ?GetMoreInfoAboutError@CFileBase@@QAE?AW4TFileManError@@XZ @ 81 NONAME ; public: enum TFileManError __thiscall CFileBase::GetMoreInfoAboutError(void) - ?GetNotifyUser@RFs@@QAEHXZ @ 82 NONAME ; public: int __thiscall RFs::GetNotifyUser(void) - ?GetShortName@RFs@@QBEHABVTDesC16@@AAVTDes16@@@Z @ 83 NONAME ; public: int __thiscall RFs::GetShortName(class TDesC16 const &,class TDes16 &)const - ?IsArchive@TEntry@@QBEHXZ @ 84 NONAME ; public: int __thiscall TEntry::IsArchive(void)const - ?IsDir@TEntry@@QBEHXZ @ 85 NONAME ; public: int __thiscall TEntry::IsDir(void)const - ?IsExtWild@TParseBase@@QBEHXZ @ 86 NONAME ; public: int __thiscall TParseBase::IsExtWild(void)const - ?IsFileInRom@RFs@@QBEPAEABVTDesC16@@@Z @ 87 NONAME ; public: unsigned char * __thiscall RFs::IsFileInRom(class TDesC16 const &)const - ?IsFileOpen@RFs@@QBEHABVTDesC16@@AAH@Z @ 88 NONAME ; public: int __thiscall RFs::IsFileOpen(class TDesC16 const &,int &)const - ?IsHidden@TEntry@@QBEHXZ @ 89 NONAME ; public: int __thiscall TEntry::IsHidden(void)const - ?IsKMatchAny@TParseBase@@QBEHXZ @ 90 NONAME ; public: int __thiscall TParseBase::IsKMatchAny(void)const - ?IsKMatchOne@TParseBase@@QBEHXZ @ 91 NONAME ; public: int __thiscall TParseBase::IsKMatchOne(void)const - ?IsNameWild@TParseBase@@QBEHXZ @ 92 NONAME ; public: int __thiscall TParseBase::IsNameWild(void)const - ?IsReadOnly@TEntry@@QBEHXZ @ 93 NONAME ; public: int __thiscall TEntry::IsReadOnly(void)const - ?IsRomAddress@RFs@@SAHPAX@Z @ 94 NONAME ; public: static int __cdecl RFs::IsRomAddress(void *) - ?IsRoot@TParseBase@@QBEHXZ @ 95 NONAME ; public: int __thiscall TParseBase::IsRoot(void)const - ?IsSystem@TEntry@@QBEHXZ @ 96 NONAME ; public: int __thiscall TEntry::IsSystem(void)const - ?IsValidDrive@RFs@@SAHH@Z @ 97 NONAME ; public: static int __cdecl RFs::IsValidDrive(int) - ?IsValidName@RFs@@QBEHABVTDesC16@@@Z @ 98 NONAME ; public: int __thiscall RFs::IsValidName(class TDesC16 const &)const - ?IsValidName@RFs@@QBEHABVTDesC16@@AAG@Z @ 99 NONAME ; public: int __thiscall RFs::IsValidName(class TDesC16 const &,unsigned short &)const - ?IsWild@TParseBase@@QBEHXZ @ 100 NONAME ; public: int __thiscall TParseBase::IsWild(void)const - ?LoaderHeapFunction@RFs@@QAEHHPAX0@Z @ 101 NONAME ; public: int __thiscall RFs::LoaderHeapFunction(int,void *,void *) - ?Lock@RFile@@QBEHHH@Z @ 102 NONAME ; public: int __thiscall RFile::Lock(int,int)const - ?LockDrive@RFs@@QAEHHABV?$TBuf8@$0BA@@@0H@Z @ 103 NONAME ; public: int __thiscall RFs::LockDrive(int,class TBuf8<16> const &,class TBuf8<16> const &,int) - ?MkDir@RFs@@QAEHABVTDesC16@@@Z @ 104 NONAME ; public: int __thiscall RFs::MkDir(class TDesC16 const &) - ?MkDirAll@RFs@@QAEHABVTDesC16@@@Z @ 105 NONAME ; public: int __thiscall RFs::MkDirAll(class TDesC16 const &) - ?Modified@RFile@@QBEHAAVTTime@@@Z @ 106 NONAME ; public: int __thiscall RFile::Modified(class TTime &)const - ?Modified@RFs@@QBEHABVTDesC16@@AAVTTime@@@Z @ 107 NONAME ; public: int __thiscall RFs::Modified(class TDesC16 const &,class TTime &)const - ?MountFileSystem@RFs@@QBEHABVTDesC16@@H@Z @ 108 NONAME ; public: int __thiscall RFs::MountFileSystem(class TDesC16 const &,int)const - ?Move@CFileMan@@QAEHABVTDesC16@@0I@Z @ 109 NONAME ; public: int __thiscall CFileMan::Move(class TDesC16 const &,class TDesC16 const &,unsigned int) - ?Move@CFileMan@@QAEHABVTDesC16@@0IAAVTRequestStatus@@@Z @ 110 NONAME ; public: int __thiscall CFileMan::Move(class TDesC16 const &,class TDesC16 const &,unsigned int,class TRequestStatus &) - ?Name@TDriveUnit@@QBE?AV?$TBuf@$01@@XZ @ 111 NONAME ; public: class TBuf<2> __thiscall TDriveUnit::Name(void)const - ?Name@TParseBase@@QBE?AVTPtrC16@@XZ @ 112 NONAME ; public: class TPtrC16 __thiscall TParseBase::Name(void)const - ?NameAndExt@TParseBase@@QBE?AVTPtrC16@@XZ @ 113 NONAME ; public: class TPtrC16 __thiscall TParseBase::NameAndExt(void)const - ?NameBuf@TParse@@MAEAAVTDes16@@XZ @ 114 NONAME ; protected: virtual class TDes16 & __thiscall TParse::NameBuf(void) - ?NameBuf@TParsePtr@@MAEAAVTDes16@@XZ @ 115 NONAME ; protected: virtual class TDes16 & __thiscall TParsePtr::NameBuf(void) - ?NameBuf@TParsePtrC@@MAEAAVTDes16@@XZ @ 116 NONAME ; protected: virtual class TDes16 & __thiscall TParsePtrC::NameBuf(void) - ?NameBufC@TParse@@MBEABVTDesC16@@XZ @ 117 NONAME ; protected: virtual class TDesC16 const & __thiscall TParse::NameBufC(void)const - ?NameBufC@TParsePtr@@MBEABVTDesC16@@XZ @ 118 NONAME ; protected: virtual class TDesC16 const & __thiscall TParsePtr::NameBufC(void)const - ?NameBufC@TParsePtrC@@MBEABVTDesC16@@XZ @ 119 NONAME ; protected: virtual class TDesC16 const & __thiscall TParsePtrC::NameBufC(void)const - ?NameOrExtPresent@TParseBase@@QBEHXZ @ 120 NONAME ; public: int __thiscall TParseBase::NameOrExtPresent(void)const - ?NamePresent@TParseBase@@QBEHXZ @ 121 NONAME ; public: int __thiscall TParseBase::NamePresent(void)const - ?NewL@CDir@@KAPAV1@XZ @ 122 NONAME ; protected: static class CDir * __cdecl CDir::NewL(void) - ?NewL@CDirScan@@SAPAV1@AAVRFs@@@Z @ 123 NONAME ; public: static class CDirScan * __cdecl CDirScan::NewL(class RFs &) - ?NewL@CFileMan@@SAPAV1@AAVRFs@@@Z @ 124 NONAME ; public: static class CFileMan * __cdecl CFileMan::NewL(class RFs &) - ?NewL@CFileMan@@SAPAV1@AAVRFs@@PAVMFileManObserver@@@Z @ 125 NONAME ; public: static class CFileMan * __cdecl CFileMan::NewL(class RFs &,class MFileManObserver *) - ?NewLC@CDirScan@@SAPAV1@AAVRFs@@@Z @ 126 NONAME ; public: static class CDirScan * __cdecl CDirScan::NewLC(class RFs &) - ?Next@RFormat@@QAEHAAH@Z @ 127 NONAME ; public: int __thiscall RFormat::Next(int &) - ?Next@RFormat@@QAEXAAV?$TPckgBuf@H@@AAVTRequestStatus@@@Z @ 128 NONAME ; public: void __thiscall RFormat::Next(class TPckgBuf &,class TRequestStatus &) - ?NextL@CDirScan@@QAEXAAPAVCDir@@@Z @ 129 NONAME ; public: void __thiscall CDirScan::NextL(class CDir * &) - ?NextL@TOpenFileScan@@QAEXAAPAVCDir@@@Z @ 130 NONAME ; public: void __thiscall TOpenFileScan::NextL(class CDir * &) - ?NotifyChange@RFs@@QAEXW4TNotifyType@@AAVTRequestStatus@@@Z @ 131 NONAME ; public: void __thiscall RFs::NotifyChange(enum TNotifyType,class TRequestStatus &) - ?NotifyChange@RFs@@QAEXW4TNotifyType@@AAVTRequestStatus@@ABVTDesC16@@@Z @ 132 NONAME ; public: void __thiscall RFs::NotifyChange(enum TNotifyType,class TRequestStatus &,class TDesC16 const &) - ?NotifyChangeCancel@RFs@@QAEXAAVTRequestStatus@@@Z @ 133 NONAME ; public: void __thiscall RFs::NotifyChangeCancel(class TRequestStatus &) - ?NotifyChangeCancel@RFs@@QAEXXZ @ 134 NONAME ; public: void __thiscall RFs::NotifyChangeCancel(void) - ?NotifyFileManEnded@MFileManObserver@@UAE?AW4TControl@1@XZ @ 135 NONAME ; public: virtual enum MFileManObserver::TControl __thiscall MFileManObserver::NotifyFileManEnded(void) - ?NotifyFileManOperation@MFileManObserver@@UAE?AW4TControl@1@XZ @ 136 NONAME ; public: virtual enum MFileManObserver::TControl __thiscall MFileManObserver::NotifyFileManOperation(void) - ?NotifyFileManStarted@MFileManObserver@@UAE?AW4TControl@1@XZ @ 137 NONAME ; public: virtual enum MFileManObserver::TControl __thiscall MFileManObserver::NotifyFileManStarted(void) - ?Open@RDir@@QAEHAAVRFs@@ABVTDesC16@@ABVTUidType@@@Z @ 138 NONAME ; public: int __thiscall RDir::Open(class RFs &,class TDesC16 const &,class TUidType const &) - ?Open@RDir@@QAEHAAVRFs@@ABVTDesC16@@I@Z @ 139 NONAME ; public: int __thiscall RDir::Open(class RFs &,class TDesC16 const &,unsigned int) - ?Open@RFile@@QAEHAAVRFs@@ABVTDesC16@@I@Z @ 140 NONAME ; public: int __thiscall RFile::Open(class RFs &,class TDesC16 const &,unsigned int) - ?Open@RFormat@@QAEHAAVRFs@@ABVTDesC16@@IAAH@Z @ 141 NONAME ; public: int __thiscall RFormat::Open(class RFs &,class TDesC16 const &,unsigned int,int &) - ?Open@RRawDisk@@QAEHAAVRFs@@H@Z @ 142 NONAME ; public: int __thiscall RRawDisk::Open(class RFs &,int) - ?Parse@RFs@@QBEHABVTDesC16@@0AAVTParse@@@Z @ 143 NONAME ; public: int __thiscall RFs::Parse(class TDesC16 const &,class TDesC16 const &,class TParse &)const - ?Parse@RFs@@QBEHABVTDesC16@@AAVTParse@@@Z @ 144 NONAME ; public: int __thiscall RFs::Parse(class TDesC16 const &,class TParse &)const - ?Path@TParseBase@@QBE?AVTPtrC16@@XZ @ 145 NONAME ; public: class TPtrC16 __thiscall TParseBase::Path(void)const - ?PathPresent@TParseBase@@QBEHXZ @ 146 NONAME ; public: int __thiscall TParseBase::PathPresent(void)const - ?PopDir@TParseBase@@QAEHXZ @ 147 NONAME ; public: int __thiscall TParseBase::PopDir(void) - ?Read@RDir@@QBEHAAVTEntry@@@Z @ 148 NONAME ; public: int __thiscall RDir::Read(class TEntry &)const - ?Read@RDir@@QBEHAAVTEntryArray@@@Z @ 149 NONAME ; public: int __thiscall RDir::Read(class TEntryArray &)const - ?Read@RDir@@QBEXAAV?$TPckg@VTEntry@@@@AAVTRequestStatus@@@Z @ 150 NONAME ; public: void __thiscall RDir::Read(class TPckg &,class TRequestStatus &)const - ?Read@RDir@@QBEXAAVTEntryArray@@AAVTRequestStatus@@@Z @ 151 NONAME ; public: void __thiscall RDir::Read(class TEntryArray &,class TRequestStatus &)const - ?Read@RFile@@QBEHAAVTDes8@@@Z @ 152 NONAME ; public: int __thiscall RFile::Read(class TDes8 &)const - ?Read@RFile@@QBEHAAVTDes8@@H@Z @ 153 NONAME ; public: int __thiscall RFile::Read(class TDes8 &,int)const - ?Read@RFile@@QBEHHAAVTDes8@@@Z @ 154 NONAME ; public: int __thiscall RFile::Read(int,class TDes8 &)const - ?Read@RFile@@QBEHHAAVTDes8@@H@Z @ 155 NONAME ; public: int __thiscall RFile::Read(int,class TDes8 &,int)const - ?Read@RFile@@QBEXAAVTDes8@@AAVTRequestStatus@@@Z @ 156 NONAME ; public: void __thiscall RFile::Read(class TDes8 &,class TRequestStatus &)const - ?Read@RFile@@QBEXAAVTDes8@@HAAVTRequestStatus@@@Z @ 157 NONAME ; public: void __thiscall RFile::Read(class TDes8 &,int,class TRequestStatus &)const - ?Read@RFile@@QBEXHAAVTDes8@@AAVTRequestStatus@@@Z @ 158 NONAME ; public: void __thiscall RFile::Read(int,class TDes8 &,class TRequestStatus &)const - ?Read@RFile@@QBEXHAAVTDes8@@HAAVTRequestStatus@@@Z @ 159 NONAME ; public: void __thiscall RFile::Read(int,class TDes8 &,int,class TRequestStatus &)const - ?Read@_RRawDisk@@QAEHHAAVTDes8@@@Z @ 160 NONAME ; public: int __thiscall _RRawDisk::Read(int,class TDes8 &) - ?Read@TFileText@@QAEHAAVTDes16@@@Z @ 161 NONAME ; public: int __thiscall TFileText::Read(class TDes16 &) - ?ReadFileSection_RESERVED@RFs@@ABEHABVTDesC16@@HAAVTDes8@@H@Z @ 162 NONAME ; public: int __thiscall RFs::ReadFileSection_RESERVED(class TDesC16 const &,int,class TDes8 &,int)const - ?RealName@RFs@@QBEHABVTDesC16@@AAVTDes16@@@Z @ 163 NONAME ; public: int __thiscall RFs::RealName(class TDesC16 const &,class TDes16 &)const - ?RemoveFileSystem@RFs@@QBEHABVTDesC16@@@Z @ 164 NONAME ; public: int __thiscall RFs::RemoveFileSystem(class TDesC16 const &)const - ?Rename@CFileMan@@QAEHABVTDesC16@@0I@Z @ 165 NONAME ; public: int __thiscall CFileMan::Rename(class TDesC16 const &,class TDesC16 const &,unsigned int) - ?Rename@CFileMan@@QAEHABVTDesC16@@0IAAVTRequestStatus@@@Z @ 166 NONAME ; public: int __thiscall CFileMan::Rename(class TDesC16 const &,class TDesC16 const &,unsigned int,class TRequestStatus &) - ?Rename@RFile@@QAEHABVTDesC16@@@Z @ 167 NONAME ; public: int __thiscall RFile::Rename(class TDesC16 const &) - ?Rename@RFs@@QAEHABVTDesC16@@0@Z @ 168 NONAME ; public: int __thiscall RFs::Rename(class TDesC16 const &,class TDesC16 const &) - ?Replace@RFile@@QAEHAAVRFs@@ABVTDesC16@@I@Z @ 169 NONAME ; public: int __thiscall RFile::Replace(class RFs &,class TDesC16 const &,unsigned int) - ?Replace@RFs@@QAEHABVTDesC16@@0@Z @ 170 NONAME ; public: int __thiscall RFs::Replace(class TDesC16 const &,class TDesC16 const &) - ?ResourceCount@RFs@@QBEHXZ @ 171 NONAME ; public: int __thiscall RFs::ResourceCount(void)const - ?ResourceCountMarkEnd@RFs@@QBEXXZ @ 172 NONAME ; public: void __thiscall RFs::ResourceCountMarkEnd(void)const - ?ResourceCountMarkStart@RFs@@QBEXXZ @ 173 NONAME ; public: void __thiscall RFs::ResourceCountMarkStart(void)const - ?RmDir@CFileMan@@QAEHABVTDesC16@@@Z @ 174 NONAME ; public: int __thiscall CFileMan::RmDir(class TDesC16 const &) - ?RmDir@CFileMan@@QAEHABVTDesC16@@AAVTRequestStatus@@@Z @ 175 NONAME ; public: int __thiscall CFileMan::RmDir(class TDesC16 const &,class TRequestStatus &) - ?RmDir@RFs@@QAEHABVTDesC16@@@Z @ 176 NONAME ; public: int __thiscall RFs::RmDir(class TDesC16 const &) - ?RunInSeparateThreadL@CFileBase@@IAEXP6AHPAX@Z@Z @ 177 NONAME ; protected: void __thiscall CFileBase::RunInSeparateThreadL(int (__cdecl*)(void *)) - ?RunL@CFileBase@@IAEXXZ @ 178 NONAME ; protected: void __thiscall CFileBase::RunL(void) - ?ScanDrive@RFs@@QBEHABVTDesC16@@@Z @ 179 NONAME ; public: int __thiscall RFs::ScanDrive(class TDesC16 const &)const - ?Seek@RFile@@QBEHW4TSeek@@AAH@Z @ 180 NONAME ; public: int __thiscall RFile::Seek(enum TSeek,int &)const - ?Seek@TFileText@@QAEHW4TSeek@@@Z @ 181 NONAME ; public: int __thiscall TFileText::Seek(enum TSeek) - ?SessionPath@RFs@@QBEHAAVTDes16@@@Z @ 182 NONAME ; public: int __thiscall RFs::SessionPath(class TDes16 &)const - ?Set@RFile@@QAEHABVTTime@@II@Z @ 183 NONAME ; public: int __thiscall RFile::Set(class TTime const &,unsigned int,unsigned int) - ?Set@TFileText@@QAEXAAVRFile@@@Z @ 184 NONAME ; public: void __thiscall TFileText::Set(class RFile &) - ?Set@TParse@@QAEHABVTDesC16@@PBV2@1@Z @ 185 NONAME ; public: int __thiscall TParse::Set(class TDesC16 const &,class TDesC16 const *,class TDesC16 const *) - ?SetAllocFailure@RFs@@QAEHH@Z @ 186 NONAME ; public: int __thiscall RFs::SetAllocFailure(int) - ?SetAtt@RFile@@QAEHII@Z @ 187 NONAME ; public: int __thiscall RFile::SetAtt(unsigned int,unsigned int) - ?SetAtt@RFs@@QAEHABVTDesC16@@II@Z @ 188 NONAME ; public: int __thiscall RFs::SetAtt(class TDesC16 const &,unsigned int,unsigned int) - ?SetDebugRegister@RFs@@QAEHH@Z @ 189 NONAME ; public: int __thiscall RFs::SetDebugRegister(int) - ?SetDefaultPath@RFs@@QAEHABVTDesC16@@@Z @ 190 NONAME ; public: int __thiscall RFs::SetDefaultPath(class TDesC16 const &) - ?SetDriveName@RFs@@QAEHHABVTDesC16@@@Z @ 191 NONAME ; public: int __thiscall RFs::SetDriveName(int,class TDesC16 const &) - ?SetEntry@RFs@@QAEHABVTDesC16@@ABVTTime@@II@Z @ 192 NONAME ; public: int __thiscall RFs::SetEntry(class TDesC16 const &,class TTime const &,unsigned int,unsigned int) - ?SetErrorCondition@RFs@@QAEHHH@Z @ 193 NONAME ; public: int __thiscall RFs::SetErrorCondition(int,int) - ?SetModified@RFile@@QAEHABVTTime@@@Z @ 194 NONAME ; public: int __thiscall RFile::SetModified(class TTime const &) - ?SetModified@RFs@@QAEHABVTDesC16@@ABVTTime@@@Z @ 195 NONAME ; public: int __thiscall RFs::SetModified(class TDesC16 const &,class TTime const &) - ?SetNoWild@TParse@@QAEHABVTDesC16@@PBV2@1@Z @ 196 NONAME ; public: int __thiscall TParse::SetNoWild(class TDesC16 const &,class TDesC16 const *,class TDesC16 const *) - ?SetNotifyUser@RFs@@QAEXH@Z @ 197 NONAME ; public: void __thiscall RFs::SetNotifyUser(int) - ?SetObserver@CFileBase@@QAEXPAVMFileManObserver@@@Z @ 198 NONAME ; public: void __thiscall CFileBase::SetObserver(class MFileManObserver *) - ?SetScanDataL@CDirScan@@QAEXABVTDesC16@@IIW4TScanDirection@1@@Z @ 199 NONAME ; public: void __thiscall CDirScan::SetScanDataL(class TDesC16 const &,unsigned int,unsigned int,enum CDirScan::TScanDirection) - ?SetSessionPath@RFs@@QAEHABVTDesC16@@@Z @ 200 NONAME ; public: int __thiscall RFs::SetSessionPath(class TDesC16 const &) - ?SetSize@RFile@@QAEHH@Z @ 201 NONAME ; public: int __thiscall RFile::SetSize(int) - ?SetSubst@RFs@@QAEHABVTDesC16@@H@Z @ 202 NONAME ; public: int __thiscall RFs::SetSubst(class TDesC16 const &,int) - ?SetVolumeLabel@RFs@@QAEHABVTDesC16@@H@Z @ 203 NONAME ; public: int __thiscall RFs::SetVolumeLabel(class TDesC16 const &,int) - ?Size@RFile@@QBEHAAH@Z @ 204 NONAME ; public: int __thiscall RFile::Size(int &)const - ?Sort@CDir@@QAEHI@Z @ 205 NONAME ; public: int __thiscall CDir::Sort(unsigned int) - ?Subst@RFs@@QBEHAAVTDes16@@H@Z @ 206 NONAME ; public: int __thiscall RFs::Subst(class TDes16 &,int)const - ?Temp@RFile@@QAEHAAVRFs@@ABVTDesC16@@AAV?$TBuf@$0BAA@@@I@Z @ 207 NONAME ; public: int __thiscall RFile::Temp(class RFs &,class TDesC16 const &,class TBuf<256> &,unsigned int) - ?ThreadId@TOpenFileScan@@QBE?AVTThreadId@@XZ @ 208 NONAME ; public: class TThreadId __thiscall TOpenFileScan::ThreadId(void)const - ?UnLock@RFile@@QBEHHH@Z @ 209 NONAME ; public: int __thiscall RFile::UnLock(int,int)const - ?UnlockDrive@RFs@@QAEHHABV?$TBuf8@$0BA@@@H@Z @ 210 NONAME ; public: int __thiscall RFs::UnlockDrive(int,class TBuf8<16> const &,int) - ?Version@RFs@@QBE?AVTVersion@@XZ @ 211 NONAME ; public: class TVersion __thiscall RFs::Version(void)const - ?Volume@RFs@@QBEHAAVTVolumeInfo@@H@Z @ 212 NONAME ; public: int __thiscall RFs::Volume(class TVolumeInfo &,int)const - ?Write@RFile@@QAEHABVTDesC8@@@Z @ 213 NONAME ; public: int __thiscall RFile::Write(class TDesC8 const &) - ?Write@RFile@@QAEHABVTDesC8@@H@Z @ 214 NONAME ; public: int __thiscall RFile::Write(class TDesC8 const &,int) - ?Write@RFile@@QAEHHABVTDesC8@@@Z @ 215 NONAME ; public: int __thiscall RFile::Write(int,class TDesC8 const &) - ?Write@RFile@@QAEHHABVTDesC8@@H@Z @ 216 NONAME ; public: int __thiscall RFile::Write(int,class TDesC8 const &,int) - ?Write@RFile@@QAEXABVTDesC8@@AAVTRequestStatus@@@Z @ 217 NONAME ; public: void __thiscall RFile::Write(class TDesC8 const &,class TRequestStatus &) - ?Write@RFile@@QAEXABVTDesC8@@HAAVTRequestStatus@@@Z @ 218 NONAME ; public: void __thiscall RFile::Write(class TDesC8 const &,int,class TRequestStatus &) - ?Write@RFile@@QAEXHABVTDesC8@@AAVTRequestStatus@@@Z @ 219 NONAME ; public: void __thiscall RFile::Write(int,class TDesC8 const &,class TRequestStatus &) - ?Write@RFile@@QAEXHABVTDesC8@@HAAVTRequestStatus@@@Z @ 220 NONAME ; public: void __thiscall RFile::Write(int,class TDesC8 const &,int,class TRequestStatus &) - ?Write@_RRawDisk@@QAEHHAAVTDesC8@@@Z @ 221 NONAME ; public: int __thiscall _RRawDisk::Write(int,class TDesC8 &) - ?Write@TFileText@@QAEHABVTDesC16@@@Z @ 222 NONAME ; public: int __thiscall TFileText::Write(class TDesC16 const &) - ?DebugNotify@RFs@@QAEXHIAAVTRequestStatus@@@Z @ 223 NONAME ; public: void __thiscall RFs::DebugNotify(int,unsigned int,class TRequestStatus &) - ?NotifyDiskSpace@RFs@@QAEX_JHAAVTRequestStatus@@@Z @ 224 NONAME ; public: void __thiscall RFs::NotifyDiskSpace(__int64,int,class TRequestStatus &) - ?NotifyDiskSpaceCancel@RFs@@QAEXAAVTRequestStatus@@@Z @ 225 NONAME ; public: void __thiscall RFs::NotifyDiskSpaceCancel(class TRequestStatus &) - ?NotifyDiskSpaceCancel@RFs@@QAEXXZ @ 226 NONAME ; public: void __thiscall RFs::NotifyDiskSpaceCancel(void) - ??0TEntry@@QAE@ABV0@@Z @ 227 NONAME ; public: __thiscall TEntry::TEntry(class TEntry const &) - ??0TEntry@@QAE@XZ @ 228 NONAME ; public: __thiscall TEntry::TEntry(void) - ??4TEntry@@QAEAAV0@ABV0@@Z @ 229 NONAME ; public: class TEntry & __thiscall TEntry::operator=(class TEntry const &) - ??0TParse@@QAE@XZ @ 230 NONAME ; public: __thiscall TParse::TParse(void) - ?Drive@RFile@@QBEHAAHAAVTDriveInfo@@@Z @ 231 NONAME ; public: int __thiscall RFile::Drive(int &,class TDriveInfo &)const - ?RemountDrive@RFs@@QAEHHPBVTDesC8@@I@Z @ 232 NONAME ; public: int __thiscall RFs::RemountDrive(int,class TDesC8 const *,unsigned int) - ?MountFileSystemAndScan@RFs@@QBEHABVTDesC16@@HAAH@Z @ 233 NONAME ; public: int __thiscall RFs::MountFileSystemAndScan(class TDesC16 const &,int,int &)const - ?CreatePrivatePath@RFs@@QAEHH@Z @ 234 NONAME ; public: int __thiscall RFs::CreatePrivatePath(int) - ?PrivatePath@RFs@@QAEHAAVTDes16@@@Z @ 235 NONAME ; public: int __thiscall RFs::PrivatePath(class TDes16 &) - ?SetSessionToPrivate@RFs@@QAEHH@Z @ 236 NONAME ; public: int __thiscall RFs::SetSessionToPrivate(int) - ?FileNamesIdentical@@YAHABVTDesC16@@0@Z @ 237 NONAME ; int __cdecl FileNamesIdentical(class TDesC16 const &,class TDesC16 const &) - ?AddExtension@RFs@@QAEHABVTDesC16@@@Z @ 238 NONAME ; public: int __thiscall RFs::AddExtension(class TDesC16 const &) - ?DismountExtension@RFs@@QAEHABVTDesC16@@H@Z @ 239 NONAME ; public: int __thiscall RFs::DismountExtension(class TDesC16 const &,int) - ?ExtensionName@RFs@@QAEHAAVTDes16@@HH@Z @ 240 NONAME ; public: int __thiscall RFs::ExtensionName(class TDes16 &,int,int) - ?MountExtension@RFs@@QAEHABVTDesC16@@H@Z @ 241 NONAME ; public: int __thiscall RFs::MountExtension(class TDesC16 const &,int) - ?MountFileSystem@RFs@@QAEHABVTDesC16@@0H@Z @ 242 NONAME ; public: int __thiscall RFs::MountFileSystem(class TDesC16 const &,class TDesC16 const &,int) - ?RemoveExtension@RFs@@QAEHABVTDesC16@@@Z @ 243 NONAME ; public: int __thiscall RFs::RemoveExtension(class TDesC16 const &) - ?StartupInitComplete@RFs@@QAEXAAVTRequestStatus@@@Z @ 244 NONAME ; public: void __thiscall RFs::StartupInitComplete(class TRequestStatus &) - ?SetLocalDriveMapping@RFs@@QAEHABVTDesC8@@@Z @ 245 NONAME ; public: int __thiscall RFs::SetLocalDriveMapping(class TDesC8 const &) - ?ControlIo@RFs@@QAEHHH@Z @ 246 NONAME ; public: int __thiscall RFs::ControlIo(int,int) - ?ControlIo@RFs@@QAEHHHAAVTDes8@@@Z @ 247 NONAME ; public: int __thiscall RFs::ControlIo(int,int,class TDes8&) ?Adopt@RFile@@QAEHAAVRFs@@AAH@Z @ 246 NONAME ; public: int __thiscall RFile::Adopt(class RFs &,int &) - ?ControlIo@RFs@@QAEHHHAAVTDes8@@0@Z @ 248 NONAME ; public: int __thiscall RFs::ControlIo(int,int,class TDes8&,class TDes8&) - ?Adopt@RFile@@QAEHAAVRFs@@H@Z @ 249 NONAME ; public: int __thiscall RFile::Adopt(class RFs &,int) - ?MountFileSystem@RFs@@QAEHABVTDesC16@@0HH@Z @ 250 NONAME ; public: int __thiscall RFs::MountFileSystem(class TDesC16 const &,class TDesC16 const &,int,int) - ?MountFileSystem@RFs@@QBEHABVTDesC16@@HH@Z @ 251 NONAME ; public: int __thiscall RFs::MountFileSystem(class TDesC16 const &,int,int)const - ?Read@RRawDisk@@QAEH_JAAVTDes8@@@Z @ 252 NONAME ; public: int __thiscall RRawDisk::Read(__int64,class TDes8 &) - ?Write@RRawDisk@@QAEH_JAAVTDesC8@@@Z @ 253 NONAME ; public: int __thiscall RRawDisk::Write(__int64,class TDesC8 &) - ?FinaliseDrives@RFs@@QAEHXZ @ 254 NONAME ; public: int __thiscall RFs::FinaliseDrives(void) - ?SwapFileSystem@RFs@@QBEHABVTDesC16@@0H@Z @ 255 NONAME ; public: int __thiscall RFs::SwapFileSystem(class TDesC16 const &,class TDesC16 const &,int)const - ?ErasePassword@RFs@@QAEHH@Z @ 256 NONAME ; public: int __thiscall RFs::ErasePassword(int) - ?GetReserveAccess@RFs@@QAEHH@Z @ 257 NONAME ; public: int __thiscall RFs::GetReserveAccess(int) - ?ReleaseReserveAccess@RFs@@QAEHH@Z @ 258 NONAME ; public: int __thiscall RFs::ReleaseReserveAccess(int) - ?ReserveDriveSpace@RFs@@QAEHHH@Z @ 259 NONAME ; public: int __thiscall RFs::ReserveDriveSpace(int,int) - ?AdoptFromClient@RFile@@QAEHABVRMessage2@@HH@Z @ 260 NONAME ; public: int __thiscall RFile::AdoptFromClient(class RMessage2 const &,int,int) - ?AdoptFromCreator@RFile@@QAEHHH@Z @ 261 NONAME ; public: int __thiscall RFile::AdoptFromCreator(int,int) - ?AdoptFromServer@RFile@@QAEHHH@Z @ 262 NONAME ; public: int __thiscall RFile::AdoptFromServer(int,int) - ?TransferToClient@RFile@@QBEHABVRMessage2@@H@Z @ 263 NONAME ; public: int __thiscall RFile::TransferToClient(class RMessage2 const &,int)const - ?TransferToProcess@RFile@@QBEHAAVRProcess@@HH@Z @ 264 NONAME ; public: int __thiscall RFile::TransferToProcess(class RProcess &,int,int)const - ?TransferToServer@RFile@@QBEHAAVTIpcArgs@@HH@Z @ 265 NONAME ; public: int __thiscall RFile::TransferToServer(class TIpcArgs &,int,int)const - ?Name@RFile@@QBEHAAVTDes16@@@Z @ 266 NONAME ; public: int __thiscall RFile::Name(class TDes16 &)const - ?Close@RDir@@QAEXXZ @ 267 NONAME ; public: void __thiscall RDir::Close(void) - ?Close@RFile@@QAEXXZ @ 268 NONAME ; public: void __thiscall RFile::Close(void) - ?Close@RFormat@@QAEXXZ @ 269 NONAME ; public: void __thiscall RFormat::Close(void) - ?GetMediaSerialNumber@RFs@@QAEHAAV?$TBuf8@$0EA@@@H@Z @ 270 NONAME ; public: int __thiscall RFs::GetMediaSerialNumber(class TBuf8<64> &,int) - ?Copy@CFileMan@@QAEHABVRFile@@ABVTDesC16@@I@Z @ 271 NONAME ; public: int __thiscall CFileMan::Copy(class RFile const &,class TDesC16 const &,unsigned int) - ?Copy@CFileMan@@QAEHABVRFile@@ABVTDesC16@@IAAVTRequestStatus@@@Z @ 272 NONAME ; public: int __thiscall CFileMan::Copy(class RFile const &,class TDesC16 const &,unsigned int,class TRequestStatus &) - ?FullName@RFile@@QBEHAAVTDes16@@@Z @ 273 NONAME ; public: int __thiscall RFile::FullName(class TDes16 &)const - ?AddPlugin@RFs@@QBEHABVTDesC16@@@Z @ 274 NONAME ; public: int __thiscall RFs::AddPlugin(class TDesC16 const &)const - ?Close@RPlugin@@QAEXXZ @ 275 NONAME ; public: void __thiscall RPlugin::Close(void) - ?DismountPlugin@RFs@@QBEHABVTDesC16@@@Z @ 276 NONAME ; public: int __thiscall RFs::DismountPlugin(class TDesC16 const &)const - ?DismountPlugin@RFs@@QBEHABVTDesC16@@H@Z @ 277 NONAME ; public: int __thiscall RFs::DismountPlugin(class TDesC16 const &,int)const - ?DismountPlugin@RFs@@QBEHABVTDesC16@@HH@Z @ 278 NONAME ; public: int __thiscall RFs::DismountPlugin(class TDesC16 const &,int,int)const - ?DoCancel@RPlugin@@IBEXI@Z @ 279 NONAME ; protected: void __thiscall RPlugin::DoCancel(unsigned int)const - ?DoControl@RPlugin@@IBEHH@Z @ 280 NONAME ; protected: int __thiscall RPlugin::DoControl(int)const - ?DoControl@RPlugin@@IBEHHAAVTDes8@@0@Z @ 281 NONAME ; protected: int __thiscall RPlugin::DoControl(int,class TDes8 &,class TDes8 &)const - ?DoControl@RPlugin@@IBEHHAAVTDes8@@@Z @ 282 NONAME ; protected: int __thiscall RPlugin::DoControl(int,class TDes8 &)const - ?DoRequest@RPlugin@@IBEXHAAVTRequestStatus@@@Z @ 283 NONAME ; protected: void __thiscall RPlugin::DoRequest(int,class TRequestStatus &)const - ?DoRequest@RPlugin@@IBEXHAAVTRequestStatus@@AAVTDes8@@1@Z @ 284 NONAME ; protected: void __thiscall RPlugin::DoRequest(int,class TRequestStatus &,class TDes8 &,class TDes8 &)const - ?DoRequest@RPlugin@@IBEXHAAVTRequestStatus@@AAVTDes8@@@Z @ 285 NONAME ; protected: void __thiscall RPlugin::DoRequest(int,class TRequestStatus &,class TDes8 &)const - ?MountPlugin@RFs@@QBEHABVTDesC16@@@Z @ 286 NONAME ; public: int __thiscall RFs::MountPlugin(class TDesC16 const &)const - ?MountPlugin@RFs@@QBEHABVTDesC16@@H@Z @ 287 NONAME ; public: int __thiscall RFs::MountPlugin(class TDesC16 const &,int)const - ?MountPlugin@RFs@@QBEHABVTDesC16@@HH@Z @ 288 NONAME ; public: int __thiscall RFs::MountPlugin(class TDesC16 const &,int,int)const - ?Open@RPlugin@@QAEHAAVRFs@@H@Z @ 289 NONAME ; public: int __thiscall RPlugin::Open(class RFs &,int) - ?PluginName@RFs@@QAEHAAVTDes16@@HH@Z @ 290 NONAME ; public: int __thiscall RFs::PluginName(class TDes16 &,int,int) - ?RemovePlugin@RFs@@QBEHABVTDesC16@@@Z @ 291 NONAME ; public: int __thiscall RFs::RemovePlugin(class TDesC16 const &)const - ?AllowDismount@RFs@@QBEHH@Z @ 292 NONAME ; public: int __thiscall RFs::AllowDismount(int)const - ?NotifyDismount@RFs@@QBEXHAAVTRequestStatus@@W4TNotifyDismountMode@@@Z @ 293 NONAME ; public: void __thiscall RFs::NotifyDismount(int,class TRequestStatus &,enum TNotifyDismountMode)const - ?NotifyDismountCancel@RFs@@QBEXAAVTRequestStatus@@@Z @ 294 NONAME ; public: void __thiscall RFs::NotifyDismountCancel(class TRequestStatus &)const - ?NotifyDismountCancel@RFs@@QBEXXZ @ 295 NONAME ; public: void __thiscall RFs::NotifyDismountCancel(void)const - ?Open@RFormat@@QAEHAAVRFs@@ABVTDesC16@@IAAHABVTDesC8@@@Z @ 296 NONAME ; public: int __thiscall RFormat::Open(class RFs &,class TDesC16 const &,unsigned int,int &,class TDesC8 const &) - ?SetStartupConfiguration@RFs@@QBEHHPAX0@Z @ 297 NONAME ; public: int __thiscall RFs::SetStartupConfiguration(int,void *,void *)const - ?ReadCancel@RFile@@QBEXAAVTRequestStatus@@@Z @ 298 NONAME ; public: void __thiscall RFile::ReadCancel(class TRequestStatus &)const - ?ReadCancel@RFile@@QBEXXZ @ 299 NONAME ; public: void __thiscall RFile::ReadCancel(void)const - ?MountFileSystemAndScan@RFs@@QBEHABVTDesC16@@0HAAH@Z @ 300 NONAME ; public: int __thiscall RFs::MountFileSystemAndScan(class TDesC16 const &,class TDesC16 const &,int,int &)const - ?SetNotifyChange@RFs@@QAEHH@Z @ 301 NONAME ; public: int __thiscall RFs::SetNotifyChange(int) - ?AddCompositeMount@RFs@@QBEHABVTDesC16@@HHH@Z @ 302 NONAME ; int RFs::AddCompositeMount(class TDesC16 const &, int, int, int) const - ?Flush@RFile@@QAEXAAVTRequestStatus@@@Z @ 303 NONAME ; public: void __thiscall RFile::Flush(class TRequestStatus &) - ?GetSystemDrive@RFs@@SA?AW4TDriveNumber@@XZ @ 304 NONAME ; public: static enum TDriveNumber __cdecl RFs::GetSystemDrive(void) - ??0TBlockMapEntry@@QAE@XZ @ 305 NONAME ; public: __thiscall TBlockMapEntry::TBlockMapEntry(void) - ?BlockMap@RFile@@QBEHAAUSBlockMapInfo@@AA_J_JH@Z @ 306 NONAME ; public: int __thiscall RFile::BlockMap(struct SBlockMapInfo &,__int64 &,__int64,int)const - ?SetNumberOfBlocks@TBlockMapEntry@@QAEXI@Z @ 307 NONAME ; public: void __thiscall TBlockMapEntry::SetNumberOfBlocks(unsigned int) - ?SetStartBlock@TBlockMapEntry@@QAEXI@Z @ 308 NONAME ; public: void __thiscall TBlockMapEntry::SetStartBlock(unsigned int) - ?Clamp@RFileClamp@@QAEHAAVRFile@@@Z @ 309 NONAME ; public: int __thiscall RFileClamp::Clamp(class RFile &) - ?Close@RFileClamp@@QAEHAAVRFs@@@Z @ 310 NONAME ; public: int __thiscall RFileClamp::Close(class RFs &) - ?FileSystemSubType@RFs@@QBEHHAAVTDes16@@@Z @ 311 NONAME ; public: int __thiscall RFs::FileSystemSubType(int,class TDes16 &)const - ?InitialisePropertiesFile@RFs@@QBEHABVTPtrC8@@@Z @ 312 NONAME ; public: int __thiscall RFs::InitialisePropertiesFile(class TPtrC8 const &)const - ?QueryVolumeInfoExt@RFs@@QBEHHW4TQueryVolumeInfoExtCmd@@AAVTDes8@@@Z @ 313 NONAME ; public: int __thiscall RFs::QueryVolumeInfoExt(int,enum TQueryVolumeInfoExtCmd,class TDes8 &)const - ?VolumeIOParam@RFs@@QBEHHAAVTVolumeIOParamInfo@@@Z @ 314 NONAME ; public: int __thiscall RFs::VolumeIOParam(int,class TVolumeIOParamInfo &)const - ?GetSystemDriveChar@RFs@@SA?AVTChar@@XZ @ 315 NONAME ; public: static class TChar __cdecl RFs::GetSystemDriveChar(void) - ?SetSystemDrive@RFs@@QAEHW4TDriveNumber@@@Z @ 316 NONAME ; public: int __thiscall RFs::SetSystemDrive(enum TDriveNumber) - ?DriveList@RFs@@QBEHAAV?$TBuf8@$0BK@@@I@Z @ 317 NONAME ; public: int __thiscall RFs::DriveList(class TBuf8<26> &,unsigned int)const - ?SetFindMask@TFindFile@@QAEHI@Z @ 318 NONAME ; public: int __thiscall TFindFile::SetFindMask(unsigned int) - ?FinaliseDrive@RFs@@QBEHHW4TFinaliseDrvMode@1@@Z @ 319 NONAME ; public: int __thiscall RFs::FinaliseDrive(int,enum RFs::TFinaliseDrvMode)const - ?Volume@RFs@@QBEXAAVTVolumeInfo@@HAAVTRequestStatus@@@Z @ 320 NONAME ; public: void __thiscall RFs::Volume(class TVolumeInfo &,int,class TRequestStatus &)const - ?AddProxyDrive@RFs@@QAEHABVTDesC16@@@Z @ 321 NONAME ; public: int __thiscall RFs::AddProxyDrive(class TDesC16 const &) - ?Caps@RRawDisk@@QAEHAAVTDes8@@@Z @ 322 NONAME ABSENT ; public: int __thiscall RRawDisk::Caps(class TDes8 &) - ?DismountProxyDrive@RFs@@QAEHI@Z @ 323 NONAME ; public: int __thiscall RFs::DismountProxyDrive(unsigned int) - ?DoMountProxyDrive@RFs@@AAEHABVTIpcArgs@@@Z @ 324 NONAME ; private: int __thiscall RFs::DoMountProxyDrive(class TIpcArgs const &) - ?RemoveProxyDrive@RFs@@QAEHABVTDesC16@@@Z @ 325 NONAME ; public: int __thiscall RFs::RemoveProxyDrive(class TDesC16 const &) - ?ReadFileSection@RFs@@QBEHABVTDesC16@@_JAAVTDes8@@H@Z @ 326 NONAME ; public: int __thiscall RFs::ReadFileSection(class TDesC16 const &,__int64,class TDes8 &,int)const - ?AdoptFromClient@RFile64@@QAEHABVRMessage2@@HH@Z @ 327 NONAME ; public: int __thiscall RFile64::AdoptFromClient(class RMessage2 const &,int,int) - ?AdoptFromCreator@RFile64@@QAEHHH@Z @ 328 NONAME ; public: int __thiscall RFile64::AdoptFromCreator(int,int) - ?AdoptFromServer@RFile64@@QAEHHH@Z @ 329 NONAME ; public: int __thiscall RFile64::AdoptFromServer(int,int) - ?Create@RFile64@@QAEHAAVRFs@@ABVTDesC16@@I@Z @ 330 NONAME ; public: int __thiscall RFile64::Create(class RFs &,class TDesC16 const &,unsigned int) - ?FileSize@TEntry@@QBE_JXZ @ 331 NONAME ; public: __int64 __thiscall TEntry::FileSize(void)const - ?Lock@RFile64@@QBEH_J0@Z @ 332 NONAME ; public: int __thiscall RFile64::Lock(__int64,__int64)const - ?Open@RFile64@@QAEHAAVRFs@@ABVTDesC16@@I@Z @ 333 NONAME ; public: int __thiscall RFile64::Open(class RFs &,class TDesC16 const &,unsigned int) - ?Read@RFile64@@QBEHIAAVTDes8@@@Z @ 334 NONAME ; public: int __thiscall RFile64::Read(unsigned int,class TDes8 &)const - ?Read@RFile64@@QBEHIAAVTDes8@@H@Z @ 335 NONAME ; public: int __thiscall RFile64::Read(unsigned int,class TDes8 &,int)const - ?Read@RFile64@@QBEH_JAAVTDes8@@@Z @ 336 NONAME ; public: int __thiscall RFile64::Read(__int64,class TDes8 &)const - ?Read@RFile64@@QBEH_JAAVTDes8@@H@Z @ 337 NONAME ; public: int __thiscall RFile64::Read(__int64,class TDes8 &,int)const - ?Read@RFile64@@QBEXIAAVTDes8@@AAVTRequestStatus@@@Z @ 338 NONAME ; public: void __thiscall RFile64::Read(unsigned int,class TDes8 &,class TRequestStatus &)const - ?Read@RFile64@@QBEXIAAVTDes8@@HAAVTRequestStatus@@@Z @ 339 NONAME ; public: void __thiscall RFile64::Read(unsigned int,class TDes8 &,int,class TRequestStatus &)const - ?Read@RFile64@@QBEX_JAAVTDes8@@AAVTRequestStatus@@@Z @ 340 NONAME ; public: void __thiscall RFile64::Read(__int64,class TDes8 &,class TRequestStatus &)const - ?Read@RFile64@@QBEX_JAAVTDes8@@HAAVTRequestStatus@@@Z @ 341 NONAME ; public: void __thiscall RFile64::Read(__int64,class TDes8 &,int,class TRequestStatus &)const - ?Replace@RFile64@@QAEHAAVRFs@@ABVTDesC16@@I@Z @ 342 NONAME ; public: int __thiscall RFile64::Replace(class RFs &,class TDesC16 const &,unsigned int) - ?Seek@RFile64@@QBEHW4TSeek@@AA_J@Z @ 343 NONAME ; public: int __thiscall RFile64::Seek(enum TSeek,__int64 &)const - ?SetSize@RFile64@@QAEH_J@Z @ 344 NONAME ; public: int __thiscall RFile64::SetSize(__int64) - ?Size@RFile64@@QBEHAA_J@Z @ 345 NONAME ; public: int __thiscall RFile64::Size(__int64 &)const - ?Temp@RFile64@@QAEHAAVRFs@@ABVTDesC16@@AAV?$TBuf@$0BAA@@@I@Z @ 346 NONAME ; public: int __thiscall RFile64::Temp(class RFs &,class TDesC16 const &,class TBuf<256> &,unsigned int) - ?UnLock@RFile64@@QBEH_J0@Z @ 347 NONAME ; public: int __thiscall RFile64::UnLock(__int64,__int64)const - ?Write@RFile64@@QAEHIABVTDesC8@@@Z @ 348 NONAME ; public: int __thiscall RFile64::Write(unsigned int,class TDesC8 const &) - ?Write@RFile64@@QAEHIABVTDesC8@@H@Z @ 349 NONAME ; public: int __thiscall RFile64::Write(unsigned int,class TDesC8 const &,int) - ?Write@RFile64@@QAEH_JABVTDesC8@@@Z @ 350 NONAME ; public: int __thiscall RFile64::Write(__int64,class TDesC8 const &) - ?Write@RFile64@@QAEH_JABVTDesC8@@H@Z @ 351 NONAME ; public: int __thiscall RFile64::Write(__int64,class TDesC8 const &,int) - ?Write@RFile64@@QAEXIABVTDesC8@@AAVTRequestStatus@@@Z @ 352 NONAME ; public: void __thiscall RFile64::Write(unsigned int,class TDesC8 const &,class TRequestStatus &) - ?Write@RFile64@@QAEXIABVTDesC8@@HAAVTRequestStatus@@@Z @ 353 NONAME ; public: void __thiscall RFile64::Write(unsigned int,class TDesC8 const &,int,class TRequestStatus &) - ?Write@RFile64@@QAEX_JABVTDesC8@@AAVTRequestStatus@@@Z @ 354 NONAME ; public: void __thiscall RFile64::Write(__int64,class TDesC8 const &,class TRequestStatus &) - ?Write@RFile64@@QAEX_JABVTDesC8@@HAAVTRequestStatus@@@Z @ 355 NONAME ; public: void __thiscall RFile64::Write(__int64,class TDesC8 const &,int,class TRequestStatus &) - ?IsValidName@RFs@@QAEHABVTDesC16@@AAVTNameValidParam@1@@Z @ 356 NONAME ; public: int __thiscall RFs::IsValidName(class TDesC16 const &,class RFs::TNameValidParam &) - ?Close@RFs@@QAEXXZ @ 357 NONAME ; public: void __thiscall RFs::Close(void) - ??1CFsNotify@@UAE@XZ @ 358 NONAME ; public: virtual __thiscall CFsNotify::~CFsNotify(void) - ?AddNotification@CFsNotify@@QAEHIABVTDesC16@@0@Z @ 359 NONAME ; public: int __thiscall CFsNotify::AddNotification(unsigned int,class TDesC16 const &,class TDesC16 const &) - ?Attributes@TFsNotification@@QBEHAAI0@Z @ 360 NONAME ; public: int __thiscall TFsNotification::Attributes(unsigned int &,unsigned int &)const - ?CancelNotifications@CFsNotify@@QAEHAAVTRequestStatus@@@Z @ 361 NONAME ; public: int __thiscall CFsNotify::CancelNotifications(class TRequestStatus &) - ?FileSize@TFsNotification@@QBEHAA_J@Z @ 362 NONAME ; public: int __thiscall TFsNotification::FileSize(__int64 &)const - ?NewL@CFsNotify@@SAPAV1@AAVRFs@@H@Z @ 363 NONAME ; public: static class CFsNotify * __cdecl CFsNotify::NewL(class RFs &,int) - ?NewName@TFsNotification@@QBEHAAVTPtrC16@@@Z @ 364 NONAME ; public: int __thiscall TFsNotification::NewName(class TPtrC16 &)const - ?NextNotification@CFsNotify@@QAEPBVTFsNotification@@XZ @ 365 NONAME ; public: class TFsNotification const * __thiscall CFsNotify::NextNotification(void) - ?NotificationType@TFsNotification@@QBE?AW4TFsNotificationType@1@XZ @ 366 NONAME ; public: enum TFsNotification::TFsNotificationType __thiscall TFsNotification::NotificationType(void)const - ?Path@TFsNotification@@QBEHAAVTPtrC16@@@Z @ 367 NONAME ; public: int __thiscall TFsNotification::Path(class TPtrC16 &)const - ?RemoveNotifications@CFsNotify@@QAEHXZ @ 368 NONAME ; public: int __thiscall CFsNotify::RemoveNotifications(void) - ?RequestNotifications@CFsNotify@@QAEHAAVTRequestStatus@@@Z @ 369 NONAME ; public: int __thiscall CFsNotify::RequestNotifications(class TRequestStatus &) - ?SupportedFileSystemName@RFs@@QBEHAAVTDes16@@HH@Z @ 370 NONAME ; public: int __thiscall RFs::SupportedFileSystemName(class TDes16 &,int,int)const + ??0CDir@@IAE@XZ @ 1 NONAME ; protected: __thiscall CDir::CDir(void) + ??0CFileBase@@IAE@AAVRFs@@@Z @ 2 NONAME ; protected: __thiscall CFileBase::CFileBase(class RFs &) + ??0TDriveUnit@@QAE@ABVTDesC16@@@Z @ 3 NONAME ; public: __thiscall TDriveUnit::TDriveUnit(class TDesC16 const &) + ??0TDriveUnit@@QAE@H@Z @ 4 NONAME ; public: __thiscall TDriveUnit::TDriveUnit(int) + ??0TEntryArray@@QAE@XZ @ 5 NONAME ; public: __thiscall TEntryArray::TEntryArray(void) + ??0TFileText@@QAE@XZ @ 6 NONAME ; public: __thiscall TFileText::TFileText(void) + ??0TFindFile@@QAE@AAVRFs@@@Z @ 7 NONAME ; public: __thiscall TFindFile::TFindFile(class RFs &) + ??0TOpenFileScan@@QAE@AAVRFs@@@Z @ 8 NONAME ; public: __thiscall TOpenFileScan::TOpenFileScan(class RFs &) + ??0TParseBase@@QAE@XZ @ 9 NONAME ; public: __thiscall TParseBase::TParseBase(void) + ??0TParsePtr@@QAE@AAVTDes16@@@Z @ 10 NONAME ; public: __thiscall TParsePtr::TParsePtr(class TDes16 &) + ??0TParsePtrC@@QAE@ABVTDesC16@@@Z @ 11 NONAME ; public: __thiscall TParsePtrC::TParsePtrC(class TDesC16 const &) + ??0TVolumeInfo@@QAE@XZ @ 12 NONAME ; public: __thiscall TVolumeInfo::TVolumeInfo(void) + ??1CDir@@UAE@XZ @ 13 NONAME ; public: virtual __thiscall CDir::~CDir(void) + ??1CDirScan@@UAE@XZ @ 14 NONAME ; public: virtual __thiscall CDirScan::~CDirScan(void) + ??1CFileBase@@MAE@XZ @ 15 NONAME ; protected: virtual __thiscall CFileBase::~CFileBase(void) + ??4TDriveUnit@@QAEAAV0@ABVTDesC16@@@Z @ 16 NONAME ; public: class TDriveUnit & __thiscall TDriveUnit::operator=(class TDesC16 const &) + ??4TDriveUnit@@QAEAAV0@H@Z @ 17 NONAME ; public: class TDriveUnit & __thiscall TDriveUnit::operator=(int) + ??ACDir@@QBEABVTEntry@@H@Z @ 18 NONAME ; public: class TEntry const & __thiscall CDir::operator[](int)const + ??ATEntryArray@@QBEABVTEntry@@H@Z @ 19 NONAME ; public: class TEntry const & __thiscall TEntryArray::operator[](int)const + ?AbbreviatedPath@CDirScan@@QAE?AVTPtrC16@@XZ @ 20 NONAME ; public: class TPtrC16 __thiscall CDirScan::AbbreviatedPath(void) + ?AbbreviatedPath@CFileBase@@QAE?AVTPtrC16@@XZ @ 21 NONAME ; public: class TPtrC16 __thiscall CFileBase::AbbreviatedPath(void) + ?AddDir@TParseBase@@QAEHABVTDesC16@@@Z @ 22 NONAME ; public: int __thiscall TParseBase::AddDir(class TDesC16 const &) + ?AddFileSystem@RFs@@QBEHABVTDesC16@@@Z @ 23 NONAME ; public: int __thiscall RFs::AddFileSystem(class TDesC16 const &)const + ?AddL@CDir@@IAEXABVTEntry@@@Z @ 24 NONAME ; protected: void __thiscall CDir::AddL(class TEntry const &) + ?Att@RFile@@QBEHAAI@Z @ 25 NONAME ; public: int __thiscall RFile::Att(unsigned int &)const + ?Att@RFs@@QBEHABVTDesC16@@AAI@Z @ 26 NONAME ; public: int __thiscall RFs::Att(class TDesC16 const &,unsigned int &)const + ?Attribs@CFileMan@@QAEHABVTDesC16@@IIABVTTime@@I@Z @ 27 NONAME ; public: int __thiscall CFileMan::Attribs(class TDesC16 const &,unsigned int,unsigned int,class TTime const &,unsigned int) + ?Attribs@CFileMan@@QAEHABVTDesC16@@IIABVTTime@@IAAVTRequestStatus@@@Z @ 28 NONAME ; public: int __thiscall CFileMan::Attribs(class TDesC16 const &,unsigned int,unsigned int,class TTime const &,unsigned int,class TRequestStatus &) + ?BytesTransferredByCopyStep@CFileMan@@QAEHXZ @ 29 NONAME ; public: int __thiscall CFileMan::BytesTransferredByCopyStep(void) + ?ChangeMode@RFile@@QAEHW4TFileMode@@@Z @ 30 NONAME ; public: int __thiscall RFile::ChangeMode(enum TFileMode) + ?CharToDrive@RFs@@SAHVTChar@@AAH@Z @ 31 NONAME ; public: static int __cdecl RFs::CharToDrive(class TChar,int &) + ?CheckDisk@RFs@@QBEHABVTDesC16@@@Z @ 32 NONAME ; public: int __thiscall RFs::CheckDisk(class TDesC16 const &)const + ?ClearPassword@RFs@@QAEHHABV?$TBuf8@$0BA@@@@Z @ 33 NONAME ; public: int __thiscall RFs::ClearPassword(int,class TBuf8<16> const &) + ?Duplicate@RFile@@QAEHABV1@W4TOwnerType@@@Z @ 34 NONAME ; public: int __thiscall RFile::Duplicate(class RFile const &,enum TOwnerType) + ?Close@RRawDisk@@QAEXXZ @ 35 NONAME ; public: void __thiscall RRawDisk::Close(void) + ?Compress@CDir@@IAEXXZ @ 36 NONAME ; protected: void __thiscall CDir::Compress(void) + ?Connect@RFs@@QAEHH@Z @ 37 NONAME ; public: int __thiscall RFs::Connect(int) + ?ConstructL@CFileBase@@IAEXXZ @ 38 NONAME ; protected: void __thiscall CFileBase::ConstructL(void) + ?ControlIo@RFs@@QAEHHHPAX0@Z @ 39 NONAME ; public: int __thiscall RFs::ControlIo(int,int,void *,void *) + ?Copy@CFileMan@@QAEHABVTDesC16@@0I@Z @ 40 NONAME ; public: int __thiscall CFileMan::Copy(class TDesC16 const &,class TDesC16 const &,unsigned int) + ?Copy@CFileMan@@QAEHABVTDesC16@@0IAAVTRequestStatus@@@Z @ 41 NONAME ; public: int __thiscall CFileMan::Copy(class TDesC16 const &,class TDesC16 const &,unsigned int,class TRequestStatus &) + ?Count@CDir@@QBEHXZ @ 42 NONAME ; public: int __thiscall CDir::Count(void)const + ?Count@TEntryArray@@QBEHXZ @ 43 NONAME ; public: int __thiscall TEntryArray::Count(void)const + ?Create@RFile@@QAEHAAVRFs@@ABVTDesC16@@I@Z @ 44 NONAME ; public: int __thiscall RFile::Create(class RFs &,class TDesC16 const &,unsigned int) + ?CurrentAction@CFileMan@@QAE?AW4TAction@1@XZ @ 45 NONAME ; public: enum CFileMan::TAction __thiscall CFileMan::CurrentAction(void) + ?CurrentEntry@CFileBase@@QAEABVTEntry@@XZ @ 46 NONAME ; public: class TEntry const & __thiscall CFileBase::CurrentEntry(void) + ?DefaultPath@RFs@@QBEHAAVTDes16@@@Z @ 47 NONAME ; public: int __thiscall RFs::DefaultPath(class TDes16 &)const + ?Delete@CFileMan@@QAEHABVTDesC16@@I@Z @ 48 NONAME ; public: int __thiscall CFileMan::Delete(class TDesC16 const &,unsigned int) + ?Delete@CFileMan@@QAEHABVTDesC16@@IAAVTRequestStatus@@@Z @ 49 NONAME ; public: int __thiscall CFileMan::Delete(class TDesC16 const &,unsigned int,class TRequestStatus &) + ?Delete@RFs@@QAEHABVTDesC16@@@Z @ 50 NONAME ; public: int __thiscall RFs::Delete(class TDesC16 const &) + ?DismountFileSystem@RFs@@QBEHABVTDesC16@@H@Z @ 51 NONAME ; public: int __thiscall RFs::DismountFileSystem(class TDesC16 const &,int)const + ?Drive@RFs@@QBEHAAVTDriveInfo@@H@Z @ 52 NONAME ; public: int __thiscall RFs::Drive(class TDriveInfo &,int)const + ?Drive@TParseBase@@QBE?AVTPtrC16@@XZ @ 53 NONAME ; public: class TPtrC16 __thiscall TParseBase::Drive(void)const + ?DriveAndPath@TParseBase@@QBE?AVTPtrC16@@XZ @ 54 NONAME ; public: class TPtrC16 __thiscall TParseBase::DriveAndPath(void)const + ?DriveList@RFs@@QBEHAAV?$TBuf8@$0BK@@@@Z @ 55 NONAME ; public: int __thiscall RFs::DriveList(class TBuf8<26> &)const + ?DrivePresent@TParseBase@@QBEHXZ @ 56 NONAME ; public: int __thiscall TParseBase::DrivePresent(void)const + ?DriveToChar@RFs@@SAHHAAVTChar@@@Z @ 57 NONAME ; public: static int __cdecl RFs::DriveToChar(int,class TChar &) + ?Entry@RFs@@QBEHABVTDesC16@@AAVTEntry@@@Z @ 58 NONAME ; public: int __thiscall RFs::Entry(class TDesC16 const &,class TEntry &)const + ?Ext@TParseBase@@QBE?AVTPtrC16@@XZ @ 59 NONAME ; public: class TPtrC16 __thiscall TParseBase::Ext(void)const + ?ExtPresent@TParseBase@@QBEHXZ @ 60 NONAME ; public: int __thiscall TParseBase::ExtPresent(void)const + ?ExtractL@CDir@@IAEXHAAPAV1@@Z @ 61 NONAME ; protected: void __thiscall CDir::ExtractL(int,class CDir * &) + ?FileSystemName@RFs@@QBEHAAVTDes16@@H@Z @ 62 NONAME ; public: int __thiscall RFs::FileSystemName(class TDes16 &,int)const + ?Find@TFindFile@@QAEHXZ @ 63 NONAME ; public: int __thiscall TFindFile::Find(void) + ?FindByDir@TFindFile@@QAEHABVTDesC16@@0@Z @ 64 NONAME ; public: int __thiscall TFindFile::FindByDir(class TDesC16 const &,class TDesC16 const &) + ?FindByPath@TFindFile@@QAEHABVTDesC16@@PBV2@@Z @ 65 NONAME ; public: int __thiscall TFindFile::FindByPath(class TDesC16 const &,class TDesC16 const *) + ?FindWild@TFindFile@@QAEHAAPAVCDir@@@Z @ 66 NONAME ; public: int __thiscall TFindFile::FindWild(class CDir * &) + ?FindWildByDir@TFindFile@@QAEHABVTDesC16@@0AAPAVCDir@@@Z @ 67 NONAME ; public: int __thiscall TFindFile::FindWildByDir(class TDesC16 const &,class TDesC16 const &,class CDir * &) + ?FindWildByPath@TFindFile@@QAEHABVTDesC16@@PBV2@AAPAVCDir@@@Z @ 68 NONAME ; public: int __thiscall TFindFile::FindWildByPath(class TDesC16 const &,class TDesC16 const *,class CDir * &) + ?Flush@RFile@@QAEHXZ @ 69 NONAME ; public: int __thiscall RFile::Flush(void) + ?FullName@TParseBase@@QBEABVTDesC16@@XZ @ 70 NONAME ; public: class TDesC16 const & __thiscall TParseBase::FullName(void)const + ?FullPath@CDirScan@@QAE?AVTPtrC16@@XZ @ 71 NONAME ; public: class TPtrC16 __thiscall CDirScan::FullPath(void) + ?FullPath@CFileBase@@QAE?AVTPtrC16@@XZ @ 72 NONAME ; public: class TPtrC16 __thiscall CFileBase::FullPath(void) + ?GetCurrentSource@CFileMan@@QAEXAAV?$TBuf@$0BAA@@@@Z @ 73 NONAME ; public: void __thiscall CFileMan::GetCurrentSource(class TBuf<256> &) + ?GetCurrentTarget@CFileMan@@QAEXAAV?$TBuf@$0BAA@@@@Z @ 74 NONAME ; public: void __thiscall CFileMan::GetCurrentTarget(class TBuf<256> &) + ?GetDir@RFs@@QBEHABVTDesC16@@ABVTUidType@@IAAPAVCDir@@@Z @ 75 NONAME ; public: int __thiscall RFs::GetDir(class TDesC16 const &,class TUidType const &,unsigned int,class CDir * &)const + ?GetDir@RFs@@QBEHABVTDesC16@@IIAAPAVCDir@@1@Z @ 76 NONAME ; public: int __thiscall RFs::GetDir(class TDesC16 const &,unsigned int,unsigned int,class CDir * &,class CDir * &)const + ?GetDir@RFs@@QBEHABVTDesC16@@IIAAPAVCDir@@@Z @ 77 NONAME ; public: int __thiscall RFs::GetDir(class TDesC16 const &,unsigned int,unsigned int,class CDir * &)const + ?GetDriveName@RFs@@QBEHHAAVTDes16@@@Z @ 78 NONAME ; public: int __thiscall RFs::GetDriveName(int,class TDes16 &)const + ?GetLastError@CFileBase@@QAEHXZ @ 79 NONAME ; public: int __thiscall CFileBase::GetLastError(void) + ?GetLongName@RFs@@QBEHABVTDesC16@@AAVTDes16@@@Z @ 80 NONAME ; public: int __thiscall RFs::GetLongName(class TDesC16 const &,class TDes16 &)const + ?GetMoreInfoAboutError@CFileBase@@QAE?AW4TFileManError@@XZ @ 81 NONAME ; public: enum TFileManError __thiscall CFileBase::GetMoreInfoAboutError(void) + ?GetNotifyUser@RFs@@QAEHXZ @ 82 NONAME ; public: int __thiscall RFs::GetNotifyUser(void) + ?GetShortName@RFs@@QBEHABVTDesC16@@AAVTDes16@@@Z @ 83 NONAME ; public: int __thiscall RFs::GetShortName(class TDesC16 const &,class TDes16 &)const + ?IsArchive@TEntry@@QBEHXZ @ 84 NONAME ; public: int __thiscall TEntry::IsArchive(void)const + ?IsDir@TEntry@@QBEHXZ @ 85 NONAME ; public: int __thiscall TEntry::IsDir(void)const + ?IsExtWild@TParseBase@@QBEHXZ @ 86 NONAME ; public: int __thiscall TParseBase::IsExtWild(void)const + ?IsFileInRom@RFs@@QBEPAEABVTDesC16@@@Z @ 87 NONAME ; public: unsigned char * __thiscall RFs::IsFileInRom(class TDesC16 const &)const + ?IsFileOpen@RFs@@QBEHABVTDesC16@@AAH@Z @ 88 NONAME ; public: int __thiscall RFs::IsFileOpen(class TDesC16 const &,int &)const + ?IsHidden@TEntry@@QBEHXZ @ 89 NONAME ; public: int __thiscall TEntry::IsHidden(void)const + ?IsKMatchAny@TParseBase@@QBEHXZ @ 90 NONAME ; public: int __thiscall TParseBase::IsKMatchAny(void)const + ?IsKMatchOne@TParseBase@@QBEHXZ @ 91 NONAME ; public: int __thiscall TParseBase::IsKMatchOne(void)const + ?IsNameWild@TParseBase@@QBEHXZ @ 92 NONAME ; public: int __thiscall TParseBase::IsNameWild(void)const + ?IsReadOnly@TEntry@@QBEHXZ @ 93 NONAME ; public: int __thiscall TEntry::IsReadOnly(void)const + ?IsRomAddress@RFs@@SAHPAX@Z @ 94 NONAME ; public: static int __cdecl RFs::IsRomAddress(void *) + ?IsRoot@TParseBase@@QBEHXZ @ 95 NONAME ; public: int __thiscall TParseBase::IsRoot(void)const + ?IsSystem@TEntry@@QBEHXZ @ 96 NONAME ; public: int __thiscall TEntry::IsSystem(void)const + ?IsValidDrive@RFs@@SAHH@Z @ 97 NONAME ; public: static int __cdecl RFs::IsValidDrive(int) + ?IsValidName@RFs@@QBEHABVTDesC16@@@Z @ 98 NONAME ; public: int __thiscall RFs::IsValidName(class TDesC16 const &)const + ?IsValidName@RFs@@QBEHABVTDesC16@@AAG@Z @ 99 NONAME ; public: int __thiscall RFs::IsValidName(class TDesC16 const &,unsigned short &)const + ?IsWild@TParseBase@@QBEHXZ @ 100 NONAME ; public: int __thiscall TParseBase::IsWild(void)const + ?LoaderHeapFunction@RFs@@QAEHHPAX0@Z @ 101 NONAME ; public: int __thiscall RFs::LoaderHeapFunction(int,void *,void *) + ?Lock@RFile@@QBEHHH@Z @ 102 NONAME ; public: int __thiscall RFile::Lock(int,int)const + ?LockDrive@RFs@@QAEHHABV?$TBuf8@$0BA@@@0H@Z @ 103 NONAME ; public: int __thiscall RFs::LockDrive(int,class TBuf8<16> const &,class TBuf8<16> const &,int) + ?MkDir@RFs@@QAEHABVTDesC16@@@Z @ 104 NONAME ; public: int __thiscall RFs::MkDir(class TDesC16 const &) + ?MkDirAll@RFs@@QAEHABVTDesC16@@@Z @ 105 NONAME ; public: int __thiscall RFs::MkDirAll(class TDesC16 const &) + ?Modified@RFile@@QBEHAAVTTime@@@Z @ 106 NONAME ; public: int __thiscall RFile::Modified(class TTime &)const + ?Modified@RFs@@QBEHABVTDesC16@@AAVTTime@@@Z @ 107 NONAME ; public: int __thiscall RFs::Modified(class TDesC16 const &,class TTime &)const + ?MountFileSystem@RFs@@QBEHABVTDesC16@@H@Z @ 108 NONAME ; public: int __thiscall RFs::MountFileSystem(class TDesC16 const &,int)const + ?Move@CFileMan@@QAEHABVTDesC16@@0I@Z @ 109 NONAME ; public: int __thiscall CFileMan::Move(class TDesC16 const &,class TDesC16 const &,unsigned int) + ?Move@CFileMan@@QAEHABVTDesC16@@0IAAVTRequestStatus@@@Z @ 110 NONAME ; public: int __thiscall CFileMan::Move(class TDesC16 const &,class TDesC16 const &,unsigned int,class TRequestStatus &) + ?Name@TDriveUnit@@QBE?AV?$TBuf@$01@@XZ @ 111 NONAME ; public: class TBuf<2> __thiscall TDriveUnit::Name(void)const + ?Name@TParseBase@@QBE?AVTPtrC16@@XZ @ 112 NONAME ; public: class TPtrC16 __thiscall TParseBase::Name(void)const + ?NameAndExt@TParseBase@@QBE?AVTPtrC16@@XZ @ 113 NONAME ; public: class TPtrC16 __thiscall TParseBase::NameAndExt(void)const + ?NameBuf@TParse@@MAEAAVTDes16@@XZ @ 114 NONAME ; protected: virtual class TDes16 & __thiscall TParse::NameBuf(void) + ?NameBuf@TParsePtr@@MAEAAVTDes16@@XZ @ 115 NONAME ; protected: virtual class TDes16 & __thiscall TParsePtr::NameBuf(void) + ?NameBuf@TParsePtrC@@MAEAAVTDes16@@XZ @ 116 NONAME ; protected: virtual class TDes16 & __thiscall TParsePtrC::NameBuf(void) + ?NameBufC@TParse@@MBEABVTDesC16@@XZ @ 117 NONAME ; protected: virtual class TDesC16 const & __thiscall TParse::NameBufC(void)const + ?NameBufC@TParsePtr@@MBEABVTDesC16@@XZ @ 118 NONAME ; protected: virtual class TDesC16 const & __thiscall TParsePtr::NameBufC(void)const + ?NameBufC@TParsePtrC@@MBEABVTDesC16@@XZ @ 119 NONAME ; protected: virtual class TDesC16 const & __thiscall TParsePtrC::NameBufC(void)const + ?NameOrExtPresent@TParseBase@@QBEHXZ @ 120 NONAME ; public: int __thiscall TParseBase::NameOrExtPresent(void)const + ?NamePresent@TParseBase@@QBEHXZ @ 121 NONAME ; public: int __thiscall TParseBase::NamePresent(void)const + ?NewL@CDir@@KAPAV1@XZ @ 122 NONAME ; protected: static class CDir * __cdecl CDir::NewL(void) + ?NewL@CDirScan@@SAPAV1@AAVRFs@@@Z @ 123 NONAME ; public: static class CDirScan * __cdecl CDirScan::NewL(class RFs &) + ?NewL@CFileMan@@SAPAV1@AAVRFs@@@Z @ 124 NONAME ; public: static class CFileMan * __cdecl CFileMan::NewL(class RFs &) + ?NewL@CFileMan@@SAPAV1@AAVRFs@@PAVMFileManObserver@@@Z @ 125 NONAME ; public: static class CFileMan * __cdecl CFileMan::NewL(class RFs &,class MFileManObserver *) + ?NewLC@CDirScan@@SAPAV1@AAVRFs@@@Z @ 126 NONAME ; public: static class CDirScan * __cdecl CDirScan::NewLC(class RFs &) + ?Next@RFormat@@QAEHAAH@Z @ 127 NONAME ; public: int __thiscall RFormat::Next(int &) + ?Next@RFormat@@QAEXAAV?$TPckgBuf@H@@AAVTRequestStatus@@@Z @ 128 NONAME ; public: void __thiscall RFormat::Next(class TPckgBuf &,class TRequestStatus &) + ?NextL@CDirScan@@QAEXAAPAVCDir@@@Z @ 129 NONAME ; public: void __thiscall CDirScan::NextL(class CDir * &) + ?NextL@TOpenFileScan@@QAEXAAPAVCDir@@@Z @ 130 NONAME ; public: void __thiscall TOpenFileScan::NextL(class CDir * &) + ?NotifyChange@RFs@@QAEXW4TNotifyType@@AAVTRequestStatus@@@Z @ 131 NONAME ; public: void __thiscall RFs::NotifyChange(enum TNotifyType,class TRequestStatus &) + ?NotifyChange@RFs@@QAEXW4TNotifyType@@AAVTRequestStatus@@ABVTDesC16@@@Z @ 132 NONAME ; public: void __thiscall RFs::NotifyChange(enum TNotifyType,class TRequestStatus &,class TDesC16 const &) + ?NotifyChangeCancel@RFs@@QAEXAAVTRequestStatus@@@Z @ 133 NONAME ; public: void __thiscall RFs::NotifyChangeCancel(class TRequestStatus &) + ?NotifyChangeCancel@RFs@@QAEXXZ @ 134 NONAME ; public: void __thiscall RFs::NotifyChangeCancel(void) + ?NotifyFileManEnded@MFileManObserver@@UAE?AW4TControl@1@XZ @ 135 NONAME ; public: virtual enum MFileManObserver::TControl __thiscall MFileManObserver::NotifyFileManEnded(void) + ?NotifyFileManOperation@MFileManObserver@@UAE?AW4TControl@1@XZ @ 136 NONAME ; public: virtual enum MFileManObserver::TControl __thiscall MFileManObserver::NotifyFileManOperation(void) + ?NotifyFileManStarted@MFileManObserver@@UAE?AW4TControl@1@XZ @ 137 NONAME ; public: virtual enum MFileManObserver::TControl __thiscall MFileManObserver::NotifyFileManStarted(void) + ?Open@RDir@@QAEHAAVRFs@@ABVTDesC16@@ABVTUidType@@@Z @ 138 NONAME ; public: int __thiscall RDir::Open(class RFs &,class TDesC16 const &,class TUidType const &) + ?Open@RDir@@QAEHAAVRFs@@ABVTDesC16@@I@Z @ 139 NONAME ; public: int __thiscall RDir::Open(class RFs &,class TDesC16 const &,unsigned int) + ?Open@RFile@@QAEHAAVRFs@@ABVTDesC16@@I@Z @ 140 NONAME ; public: int __thiscall RFile::Open(class RFs &,class TDesC16 const &,unsigned int) + ?Open@RFormat@@QAEHAAVRFs@@ABVTDesC16@@IAAH@Z @ 141 NONAME ; public: int __thiscall RFormat::Open(class RFs &,class TDesC16 const &,unsigned int,int &) + ?Open@RRawDisk@@QAEHAAVRFs@@H@Z @ 142 NONAME ; public: int __thiscall RRawDisk::Open(class RFs &,int) + ?Parse@RFs@@QBEHABVTDesC16@@0AAVTParse@@@Z @ 143 NONAME ; public: int __thiscall RFs::Parse(class TDesC16 const &,class TDesC16 const &,class TParse &)const + ?Parse@RFs@@QBEHABVTDesC16@@AAVTParse@@@Z @ 144 NONAME ; public: int __thiscall RFs::Parse(class TDesC16 const &,class TParse &)const + ?Path@TParseBase@@QBE?AVTPtrC16@@XZ @ 145 NONAME ; public: class TPtrC16 __thiscall TParseBase::Path(void)const + ?PathPresent@TParseBase@@QBEHXZ @ 146 NONAME ; public: int __thiscall TParseBase::PathPresent(void)const + ?PopDir@TParseBase@@QAEHXZ @ 147 NONAME ; public: int __thiscall TParseBase::PopDir(void) + ?Read@RDir@@QBEHAAVTEntry@@@Z @ 148 NONAME ; public: int __thiscall RDir::Read(class TEntry &)const + ?Read@RDir@@QBEHAAVTEntryArray@@@Z @ 149 NONAME ; public: int __thiscall RDir::Read(class TEntryArray &)const + ?Read@RDir@@QBEXAAV?$TPckg@VTEntry@@@@AAVTRequestStatus@@@Z @ 150 NONAME ; public: void __thiscall RDir::Read(class TPckg &,class TRequestStatus &)const + ?Read@RDir@@QBEXAAVTEntryArray@@AAVTRequestStatus@@@Z @ 151 NONAME ; public: void __thiscall RDir::Read(class TEntryArray &,class TRequestStatus &)const + ?Read@RFile@@QBEHAAVTDes8@@@Z @ 152 NONAME ; public: int __thiscall RFile::Read(class TDes8 &)const + ?Read@RFile@@QBEHAAVTDes8@@H@Z @ 153 NONAME ; public: int __thiscall RFile::Read(class TDes8 &,int)const + ?Read@RFile@@QBEHHAAVTDes8@@@Z @ 154 NONAME ; public: int __thiscall RFile::Read(int,class TDes8 &)const + ?Read@RFile@@QBEHHAAVTDes8@@H@Z @ 155 NONAME ; public: int __thiscall RFile::Read(int,class TDes8 &,int)const + ?Read@RFile@@QBEXAAVTDes8@@AAVTRequestStatus@@@Z @ 156 NONAME ; public: void __thiscall RFile::Read(class TDes8 &,class TRequestStatus &)const + ?Read@RFile@@QBEXAAVTDes8@@HAAVTRequestStatus@@@Z @ 157 NONAME ; public: void __thiscall RFile::Read(class TDes8 &,int,class TRequestStatus &)const + ?Read@RFile@@QBEXHAAVTDes8@@AAVTRequestStatus@@@Z @ 158 NONAME ; public: void __thiscall RFile::Read(int,class TDes8 &,class TRequestStatus &)const + ?Read@RFile@@QBEXHAAVTDes8@@HAAVTRequestStatus@@@Z @ 159 NONAME ; public: void __thiscall RFile::Read(int,class TDes8 &,int,class TRequestStatus &)const + ?Read@_RRawDisk@@QAEHHAAVTDes8@@@Z @ 160 NONAME ; public: int __thiscall _RRawDisk::Read(int,class TDes8 &) + ?Read@TFileText@@QAEHAAVTDes16@@@Z @ 161 NONAME ; public: int __thiscall TFileText::Read(class TDes16 &) + ?ReadFileSection_RESERVED@RFs@@ABEHABVTDesC16@@HAAVTDes8@@H@Z @ 162 NONAME ; public: int __thiscall RFs::ReadFileSection_RESERVED(class TDesC16 const &,int,class TDes8 &,int)const + ?RealName@RFs@@QBEHABVTDesC16@@AAVTDes16@@@Z @ 163 NONAME ; public: int __thiscall RFs::RealName(class TDesC16 const &,class TDes16 &)const + ?RemoveFileSystem@RFs@@QBEHABVTDesC16@@@Z @ 164 NONAME ; public: int __thiscall RFs::RemoveFileSystem(class TDesC16 const &)const + ?Rename@CFileMan@@QAEHABVTDesC16@@0I@Z @ 165 NONAME ; public: int __thiscall CFileMan::Rename(class TDesC16 const &,class TDesC16 const &,unsigned int) + ?Rename@CFileMan@@QAEHABVTDesC16@@0IAAVTRequestStatus@@@Z @ 166 NONAME ; public: int __thiscall CFileMan::Rename(class TDesC16 const &,class TDesC16 const &,unsigned int,class TRequestStatus &) + ?Rename@RFile@@QAEHABVTDesC16@@@Z @ 167 NONAME ; public: int __thiscall RFile::Rename(class TDesC16 const &) + ?Rename@RFs@@QAEHABVTDesC16@@0@Z @ 168 NONAME ; public: int __thiscall RFs::Rename(class TDesC16 const &,class TDesC16 const &) + ?Replace@RFile@@QAEHAAVRFs@@ABVTDesC16@@I@Z @ 169 NONAME ; public: int __thiscall RFile::Replace(class RFs &,class TDesC16 const &,unsigned int) + ?Replace@RFs@@QAEHABVTDesC16@@0@Z @ 170 NONAME ; public: int __thiscall RFs::Replace(class TDesC16 const &,class TDesC16 const &) + ?ResourceCount@RFs@@QBEHXZ @ 171 NONAME ; public: int __thiscall RFs::ResourceCount(void)const + ?ResourceCountMarkEnd@RFs@@QBEXXZ @ 172 NONAME ; public: void __thiscall RFs::ResourceCountMarkEnd(void)const + ?ResourceCountMarkStart@RFs@@QBEXXZ @ 173 NONAME ; public: void __thiscall RFs::ResourceCountMarkStart(void)const + ?RmDir@CFileMan@@QAEHABVTDesC16@@@Z @ 174 NONAME ; public: int __thiscall CFileMan::RmDir(class TDesC16 const &) + ?RmDir@CFileMan@@QAEHABVTDesC16@@AAVTRequestStatus@@@Z @ 175 NONAME ; public: int __thiscall CFileMan::RmDir(class TDesC16 const &,class TRequestStatus &) + ?RmDir@RFs@@QAEHABVTDesC16@@@Z @ 176 NONAME ; public: int __thiscall RFs::RmDir(class TDesC16 const &) + ?RunInSeparateThreadL@CFileBase@@IAEXP6AHPAX@Z@Z @ 177 NONAME ; protected: void __thiscall CFileBase::RunInSeparateThreadL(int (__cdecl*)(void *)) + ?RunL@CFileBase@@IAEXXZ @ 178 NONAME ; protected: void __thiscall CFileBase::RunL(void) + ?ScanDrive@RFs@@QBEHABVTDesC16@@@Z @ 179 NONAME ; public: int __thiscall RFs::ScanDrive(class TDesC16 const &)const + ?Seek@RFile@@QBEHW4TSeek@@AAH@Z @ 180 NONAME ; public: int __thiscall RFile::Seek(enum TSeek,int &)const + ?Seek@TFileText@@QAEHW4TSeek@@@Z @ 181 NONAME ; public: int __thiscall TFileText::Seek(enum TSeek) + ?SessionPath@RFs@@QBEHAAVTDes16@@@Z @ 182 NONAME ; public: int __thiscall RFs::SessionPath(class TDes16 &)const + ?Set@RFile@@QAEHABVTTime@@II@Z @ 183 NONAME ; public: int __thiscall RFile::Set(class TTime const &,unsigned int,unsigned int) + ?Set@TFileText@@QAEXAAVRFile@@@Z @ 184 NONAME ; public: void __thiscall TFileText::Set(class RFile &) + ?Set@TParse@@QAEHABVTDesC16@@PBV2@1@Z @ 185 NONAME ; public: int __thiscall TParse::Set(class TDesC16 const &,class TDesC16 const *,class TDesC16 const *) + ?SetAllocFailure@RFs@@QAEHH@Z @ 186 NONAME ; public: int __thiscall RFs::SetAllocFailure(int) + ?SetAtt@RFile@@QAEHII@Z @ 187 NONAME ; public: int __thiscall RFile::SetAtt(unsigned int,unsigned int) + ?SetAtt@RFs@@QAEHABVTDesC16@@II@Z @ 188 NONAME ; public: int __thiscall RFs::SetAtt(class TDesC16 const &,unsigned int,unsigned int) + ?SetDebugRegister@RFs@@QAEHH@Z @ 189 NONAME ; public: int __thiscall RFs::SetDebugRegister(int) + ?SetDefaultPath@RFs@@QAEHABVTDesC16@@@Z @ 190 NONAME ; public: int __thiscall RFs::SetDefaultPath(class TDesC16 const &) + ?SetDriveName@RFs@@QAEHHABVTDesC16@@@Z @ 191 NONAME ; public: int __thiscall RFs::SetDriveName(int,class TDesC16 const &) + ?SetEntry@RFs@@QAEHABVTDesC16@@ABVTTime@@II@Z @ 192 NONAME ; public: int __thiscall RFs::SetEntry(class TDesC16 const &,class TTime const &,unsigned int,unsigned int) + ?SetErrorCondition@RFs@@QAEHHH@Z @ 193 NONAME ; public: int __thiscall RFs::SetErrorCondition(int,int) + ?SetModified@RFile@@QAEHABVTTime@@@Z @ 194 NONAME ; public: int __thiscall RFile::SetModified(class TTime const &) + ?SetModified@RFs@@QAEHABVTDesC16@@ABVTTime@@@Z @ 195 NONAME ; public: int __thiscall RFs::SetModified(class TDesC16 const &,class TTime const &) + ?SetNoWild@TParse@@QAEHABVTDesC16@@PBV2@1@Z @ 196 NONAME ; public: int __thiscall TParse::SetNoWild(class TDesC16 const &,class TDesC16 const *,class TDesC16 const *) + ?SetNotifyUser@RFs@@QAEXH@Z @ 197 NONAME ; public: void __thiscall RFs::SetNotifyUser(int) + ?SetObserver@CFileBase@@QAEXPAVMFileManObserver@@@Z @ 198 NONAME ; public: void __thiscall CFileBase::SetObserver(class MFileManObserver *) + ?SetScanDataL@CDirScan@@QAEXABVTDesC16@@IIW4TScanDirection@1@@Z @ 199 NONAME ; public: void __thiscall CDirScan::SetScanDataL(class TDesC16 const &,unsigned int,unsigned int,enum CDirScan::TScanDirection) + ?SetSessionPath@RFs@@QAEHABVTDesC16@@@Z @ 200 NONAME ; public: int __thiscall RFs::SetSessionPath(class TDesC16 const &) + ?SetSize@RFile@@QAEHH@Z @ 201 NONAME ; public: int __thiscall RFile::SetSize(int) + ?SetSubst@RFs@@QAEHABVTDesC16@@H@Z @ 202 NONAME ; public: int __thiscall RFs::SetSubst(class TDesC16 const &,int) + ?SetVolumeLabel@RFs@@QAEHABVTDesC16@@H@Z @ 203 NONAME ; public: int __thiscall RFs::SetVolumeLabel(class TDesC16 const &,int) + ?Size@RFile@@QBEHAAH@Z @ 204 NONAME ; public: int __thiscall RFile::Size(int &)const + ?Sort@CDir@@QAEHI@Z @ 205 NONAME ; public: int __thiscall CDir::Sort(unsigned int) + ?Subst@RFs@@QBEHAAVTDes16@@H@Z @ 206 NONAME ; public: int __thiscall RFs::Subst(class TDes16 &,int)const + ?Temp@RFile@@QAEHAAVRFs@@ABVTDesC16@@AAV?$TBuf@$0BAA@@@I@Z @ 207 NONAME ; public: int __thiscall RFile::Temp(class RFs &,class TDesC16 const &,class TBuf<256> &,unsigned int) + ?ThreadId@TOpenFileScan@@QBE?AVTThreadId@@XZ @ 208 NONAME ; public: class TThreadId __thiscall TOpenFileScan::ThreadId(void)const + ?UnLock@RFile@@QBEHHH@Z @ 209 NONAME ; public: int __thiscall RFile::UnLock(int,int)const + ?UnlockDrive@RFs@@QAEHHABV?$TBuf8@$0BA@@@H@Z @ 210 NONAME ; public: int __thiscall RFs::UnlockDrive(int,class TBuf8<16> const &,int) + ?Version@RFs@@QBE?AVTVersion@@XZ @ 211 NONAME ; public: class TVersion __thiscall RFs::Version(void)const + ?Volume@RFs@@QBEHAAVTVolumeInfo@@H@Z @ 212 NONAME ; public: int __thiscall RFs::Volume(class TVolumeInfo &,int)const + ?Write@RFile@@QAEHABVTDesC8@@@Z @ 213 NONAME ; public: int __thiscall RFile::Write(class TDesC8 const &) + ?Write@RFile@@QAEHABVTDesC8@@H@Z @ 214 NONAME ; public: int __thiscall RFile::Write(class TDesC8 const &,int) + ?Write@RFile@@QAEHHABVTDesC8@@@Z @ 215 NONAME ; public: int __thiscall RFile::Write(int,class TDesC8 const &) + ?Write@RFile@@QAEHHABVTDesC8@@H@Z @ 216 NONAME ; public: int __thiscall RFile::Write(int,class TDesC8 const &,int) + ?Write@RFile@@QAEXABVTDesC8@@AAVTRequestStatus@@@Z @ 217 NONAME ; public: void __thiscall RFile::Write(class TDesC8 const &,class TRequestStatus &) + ?Write@RFile@@QAEXABVTDesC8@@HAAVTRequestStatus@@@Z @ 218 NONAME ; public: void __thiscall RFile::Write(class TDesC8 const &,int,class TRequestStatus &) + ?Write@RFile@@QAEXHABVTDesC8@@AAVTRequestStatus@@@Z @ 219 NONAME ; public: void __thiscall RFile::Write(int,class TDesC8 const &,class TRequestStatus &) + ?Write@RFile@@QAEXHABVTDesC8@@HAAVTRequestStatus@@@Z @ 220 NONAME ; public: void __thiscall RFile::Write(int,class TDesC8 const &,int,class TRequestStatus &) + ?Write@_RRawDisk@@QAEHHAAVTDesC8@@@Z @ 221 NONAME ; public: int __thiscall _RRawDisk::Write(int,class TDesC8 &) + ?Write@TFileText@@QAEHABVTDesC16@@@Z @ 222 NONAME ; public: int __thiscall TFileText::Write(class TDesC16 const &) + ?DebugNotify@RFs@@QAEXHIAAVTRequestStatus@@@Z @ 223 NONAME ; public: void __thiscall RFs::DebugNotify(int,unsigned int,class TRequestStatus &) + ?NotifyDiskSpace@RFs@@QAEX_JHAAVTRequestStatus@@@Z @ 224 NONAME ; public: void __thiscall RFs::NotifyDiskSpace(__int64,int,class TRequestStatus &) + ?NotifyDiskSpaceCancel@RFs@@QAEXAAVTRequestStatus@@@Z @ 225 NONAME ; public: void __thiscall RFs::NotifyDiskSpaceCancel(class TRequestStatus &) + ?NotifyDiskSpaceCancel@RFs@@QAEXXZ @ 226 NONAME ; public: void __thiscall RFs::NotifyDiskSpaceCancel(void) + ??0TEntry@@QAE@ABV0@@Z @ 227 NONAME ; public: __thiscall TEntry::TEntry(class TEntry const &) + ??0TEntry@@QAE@XZ @ 228 NONAME ; public: __thiscall TEntry::TEntry(void) + ??4TEntry@@QAEAAV0@ABV0@@Z @ 229 NONAME ; public: class TEntry & __thiscall TEntry::operator=(class TEntry const &) + ??0TParse@@QAE@XZ @ 230 NONAME ; public: __thiscall TParse::TParse(void) + ?Drive@RFile@@QBEHAAHAAVTDriveInfo@@@Z @ 231 NONAME ; public: int __thiscall RFile::Drive(int &,class TDriveInfo &)const + ?RemountDrive@RFs@@QAEHHPBVTDesC8@@I@Z @ 232 NONAME ; public: int __thiscall RFs::RemountDrive(int,class TDesC8 const *,unsigned int) + ?MountFileSystemAndScan@RFs@@QBEHABVTDesC16@@HAAH@Z @ 233 NONAME ; public: int __thiscall RFs::MountFileSystemAndScan(class TDesC16 const &,int,int &)const + ?CreatePrivatePath@RFs@@QAEHH@Z @ 234 NONAME ; public: int __thiscall RFs::CreatePrivatePath(int) + ?PrivatePath@RFs@@QAEHAAVTDes16@@@Z @ 235 NONAME ; public: int __thiscall RFs::PrivatePath(class TDes16 &) + ?SetSessionToPrivate@RFs@@QAEHH@Z @ 236 NONAME ; public: int __thiscall RFs::SetSessionToPrivate(int) + ?FileNamesIdentical@@YAHABVTDesC16@@0@Z @ 237 NONAME ; int __cdecl FileNamesIdentical(class TDesC16 const &,class TDesC16 const &) + ?AddExtension@RFs@@QAEHABVTDesC16@@@Z @ 238 NONAME ; public: int __thiscall RFs::AddExtension(class TDesC16 const &) + ?DismountExtension@RFs@@QAEHABVTDesC16@@H@Z @ 239 NONAME ; public: int __thiscall RFs::DismountExtension(class TDesC16 const &,int) + ?ExtensionName@RFs@@QAEHAAVTDes16@@HH@Z @ 240 NONAME ; public: int __thiscall RFs::ExtensionName(class TDes16 &,int,int) + ?MountExtension@RFs@@QAEHABVTDesC16@@H@Z @ 241 NONAME ; public: int __thiscall RFs::MountExtension(class TDesC16 const &,int) + ?MountFileSystem@RFs@@QAEHABVTDesC16@@0H@Z @ 242 NONAME ; public: int __thiscall RFs::MountFileSystem(class TDesC16 const &,class TDesC16 const &,int) + ?RemoveExtension@RFs@@QAEHABVTDesC16@@@Z @ 243 NONAME ; public: int __thiscall RFs::RemoveExtension(class TDesC16 const &) + ?StartupInitComplete@RFs@@QAEXAAVTRequestStatus@@@Z @ 244 NONAME ; public: void __thiscall RFs::StartupInitComplete(class TRequestStatus &) + ?SetLocalDriveMapping@RFs@@QAEHABVTDesC8@@@Z @ 245 NONAME ; public: int __thiscall RFs::SetLocalDriveMapping(class TDesC8 const &) + ?ControlIo@RFs@@QAEHHH@Z @ 246 NONAME ; public: int __thiscall RFs::ControlIo(int,int) + ?ControlIo@RFs@@QAEHHHAAVTDes8@@@Z @ 247 NONAME ; public: int __thiscall RFs::ControlIo(int,int,class TDes8&) ?Adopt@RFile@@QAEHAAVRFs@@AAH@Z @ 246 NONAME ; public: int __thiscall RFile::Adopt(class RFs &,int &) + ?ControlIo@RFs@@QAEHHHAAVTDes8@@0@Z @ 248 NONAME ; public: int __thiscall RFs::ControlIo(int,int,class TDes8&,class TDes8&) + ?Adopt@RFile@@QAEHAAVRFs@@H@Z @ 249 NONAME ; public: int __thiscall RFile::Adopt(class RFs &,int) + ?MountFileSystem@RFs@@QAEHABVTDesC16@@0HH@Z @ 250 NONAME ; public: int __thiscall RFs::MountFileSystem(class TDesC16 const &,class TDesC16 const &,int,int) + ?MountFileSystem@RFs@@QBEHABVTDesC16@@HH@Z @ 251 NONAME ; public: int __thiscall RFs::MountFileSystem(class TDesC16 const &,int,int)const + ?Read@RRawDisk@@QAEH_JAAVTDes8@@@Z @ 252 NONAME ; public: int __thiscall RRawDisk::Read(__int64,class TDes8 &) + ?Write@RRawDisk@@QAEH_JAAVTDesC8@@@Z @ 253 NONAME ; public: int __thiscall RRawDisk::Write(__int64,class TDesC8 &) + ?FinaliseDrives@RFs@@QAEHXZ @ 254 NONAME ; public: int __thiscall RFs::FinaliseDrives(void) + ?SwapFileSystem@RFs@@QBEHABVTDesC16@@0H@Z @ 255 NONAME ; public: int __thiscall RFs::SwapFileSystem(class TDesC16 const &,class TDesC16 const &,int)const + ?ErasePassword@RFs@@QAEHH@Z @ 256 NONAME ; public: int __thiscall RFs::ErasePassword(int) + ?GetReserveAccess@RFs@@QAEHH@Z @ 257 NONAME ; public: int __thiscall RFs::GetReserveAccess(int) + ?ReleaseReserveAccess@RFs@@QAEHH@Z @ 258 NONAME ; public: int __thiscall RFs::ReleaseReserveAccess(int) + ?ReserveDriveSpace@RFs@@QAEHHH@Z @ 259 NONAME ; public: int __thiscall RFs::ReserveDriveSpace(int,int) + ?AdoptFromClient@RFile@@QAEHABVRMessage2@@HH@Z @ 260 NONAME ; public: int __thiscall RFile::AdoptFromClient(class RMessage2 const &,int,int) + ?AdoptFromCreator@RFile@@QAEHHH@Z @ 261 NONAME ; public: int __thiscall RFile::AdoptFromCreator(int,int) + ?AdoptFromServer@RFile@@QAEHHH@Z @ 262 NONAME ; public: int __thiscall RFile::AdoptFromServer(int,int) + ?TransferToClient@RFile@@QBEHABVRMessage2@@H@Z @ 263 NONAME ; public: int __thiscall RFile::TransferToClient(class RMessage2 const &,int)const + ?TransferToProcess@RFile@@QBEHAAVRProcess@@HH@Z @ 264 NONAME ; public: int __thiscall RFile::TransferToProcess(class RProcess &,int,int)const + ?TransferToServer@RFile@@QBEHAAVTIpcArgs@@HH@Z @ 265 NONAME ; public: int __thiscall RFile::TransferToServer(class TIpcArgs &,int,int)const + ?Name@RFile@@QBEHAAVTDes16@@@Z @ 266 NONAME ; public: int __thiscall RFile::Name(class TDes16 &)const + ?Close@RDir@@QAEXXZ @ 267 NONAME ; public: void __thiscall RDir::Close(void) + ?Close@RFile@@QAEXXZ @ 268 NONAME ; public: void __thiscall RFile::Close(void) + ?Close@RFormat@@QAEXXZ @ 269 NONAME ; public: void __thiscall RFormat::Close(void) + ?GetMediaSerialNumber@RFs@@QAEHAAV?$TBuf8@$0EA@@@H@Z @ 270 NONAME ; public: int __thiscall RFs::GetMediaSerialNumber(class TBuf8<64> &,int) + ?Copy@CFileMan@@QAEHABVRFile@@ABVTDesC16@@I@Z @ 271 NONAME ; public: int __thiscall CFileMan::Copy(class RFile const &,class TDesC16 const &,unsigned int) + ?Copy@CFileMan@@QAEHABVRFile@@ABVTDesC16@@IAAVTRequestStatus@@@Z @ 272 NONAME ; public: int __thiscall CFileMan::Copy(class RFile const &,class TDesC16 const &,unsigned int,class TRequestStatus &) + ?FullName@RFile@@QBEHAAVTDes16@@@Z @ 273 NONAME ; public: int __thiscall RFile::FullName(class TDes16 &)const + ?AddPlugin@RFs@@QBEHABVTDesC16@@@Z @ 274 NONAME ; public: int __thiscall RFs::AddPlugin(class TDesC16 const &)const + ?Close@RPlugin@@QAEXXZ @ 275 NONAME ; public: void __thiscall RPlugin::Close(void) + ?DismountPlugin@RFs@@QBEHABVTDesC16@@@Z @ 276 NONAME ; public: int __thiscall RFs::DismountPlugin(class TDesC16 const &)const + ?DismountPlugin@RFs@@QBEHABVTDesC16@@H@Z @ 277 NONAME ; public: int __thiscall RFs::DismountPlugin(class TDesC16 const &,int)const + ?DismountPlugin@RFs@@QBEHABVTDesC16@@HH@Z @ 278 NONAME ; public: int __thiscall RFs::DismountPlugin(class TDesC16 const &,int,int)const + ?DoCancel@RPlugin@@IBEXI@Z @ 279 NONAME ; protected: void __thiscall RPlugin::DoCancel(unsigned int)const + ?DoControl@RPlugin@@IBEHH@Z @ 280 NONAME ; protected: int __thiscall RPlugin::DoControl(int)const + ?DoControl@RPlugin@@IBEHHAAVTDes8@@0@Z @ 281 NONAME ; protected: int __thiscall RPlugin::DoControl(int,class TDes8 &,class TDes8 &)const + ?DoControl@RPlugin@@IBEHHAAVTDes8@@@Z @ 282 NONAME ; protected: int __thiscall RPlugin::DoControl(int,class TDes8 &)const + ?DoRequest@RPlugin@@IBEXHAAVTRequestStatus@@@Z @ 283 NONAME ; protected: void __thiscall RPlugin::DoRequest(int,class TRequestStatus &)const + ?DoRequest@RPlugin@@IBEXHAAVTRequestStatus@@AAVTDes8@@1@Z @ 284 NONAME ; protected: void __thiscall RPlugin::DoRequest(int,class TRequestStatus &,class TDes8 &,class TDes8 &)const + ?DoRequest@RPlugin@@IBEXHAAVTRequestStatus@@AAVTDes8@@@Z @ 285 NONAME ; protected: void __thiscall RPlugin::DoRequest(int,class TRequestStatus &,class TDes8 &)const + ?MountPlugin@RFs@@QBEHABVTDesC16@@@Z @ 286 NONAME ; public: int __thiscall RFs::MountPlugin(class TDesC16 const &)const + ?MountPlugin@RFs@@QBEHABVTDesC16@@H@Z @ 287 NONAME ; public: int __thiscall RFs::MountPlugin(class TDesC16 const &,int)const + ?MountPlugin@RFs@@QBEHABVTDesC16@@HH@Z @ 288 NONAME ; public: int __thiscall RFs::MountPlugin(class TDesC16 const &,int,int)const + ?Open@RPlugin@@QAEHAAVRFs@@H@Z @ 289 NONAME ; public: int __thiscall RPlugin::Open(class RFs &,int) + ?PluginName@RFs@@QAEHAAVTDes16@@HH@Z @ 290 NONAME ; public: int __thiscall RFs::PluginName(class TDes16 &,int,int) + ?RemovePlugin@RFs@@QBEHABVTDesC16@@@Z @ 291 NONAME ; public: int __thiscall RFs::RemovePlugin(class TDesC16 const &)const + ?AllowDismount@RFs@@QBEHH@Z @ 292 NONAME ; public: int __thiscall RFs::AllowDismount(int)const + ?NotifyDismount@RFs@@QBEXHAAVTRequestStatus@@W4TNotifyDismountMode@@@Z @ 293 NONAME ; public: void __thiscall RFs::NotifyDismount(int,class TRequestStatus &,enum TNotifyDismountMode)const + ?NotifyDismountCancel@RFs@@QBEXAAVTRequestStatus@@@Z @ 294 NONAME ; public: void __thiscall RFs::NotifyDismountCancel(class TRequestStatus &)const + ?NotifyDismountCancel@RFs@@QBEXXZ @ 295 NONAME ; public: void __thiscall RFs::NotifyDismountCancel(void)const + ?Open@RFormat@@QAEHAAVRFs@@ABVTDesC16@@IAAHABVTDesC8@@@Z @ 296 NONAME ; public: int __thiscall RFormat::Open(class RFs &,class TDesC16 const &,unsigned int,int &,class TDesC8 const &) + ?SetStartupConfiguration@RFs@@QBEHHPAX0@Z @ 297 NONAME ; public: int __thiscall RFs::SetStartupConfiguration(int,void *,void *)const + ?ReadCancel@RFile@@QBEXAAVTRequestStatus@@@Z @ 298 NONAME ; public: void __thiscall RFile::ReadCancel(class TRequestStatus &)const + ?ReadCancel@RFile@@QBEXXZ @ 299 NONAME ; public: void __thiscall RFile::ReadCancel(void)const + ?MountFileSystemAndScan@RFs@@QBEHABVTDesC16@@0HAAH@Z @ 300 NONAME ; public: int __thiscall RFs::MountFileSystemAndScan(class TDesC16 const &,class TDesC16 const &,int,int &)const + ?SetNotifyChange@RFs@@QAEHH@Z @ 301 NONAME ; public: int __thiscall RFs::SetNotifyChange(int) + ?AddCompositeMount@RFs@@QBEHABVTDesC16@@HHH@Z @ 302 NONAME ; int RFs::AddCompositeMount(class TDesC16 const &, int, int, int) const + ?Flush@RFile@@QAEXAAVTRequestStatus@@@Z @ 303 NONAME ; public: void __thiscall RFile::Flush(class TRequestStatus &) + ?GetSystemDrive@RFs@@SA?AW4TDriveNumber@@XZ @ 304 NONAME ; public: static enum TDriveNumber __cdecl RFs::GetSystemDrive(void) + ??0TBlockMapEntry@@QAE@XZ @ 305 NONAME ; public: __thiscall TBlockMapEntry::TBlockMapEntry(void) + ?BlockMap@RFile@@QBEHAAUSBlockMapInfo@@AA_J_JH@Z @ 306 NONAME ; public: int __thiscall RFile::BlockMap(struct SBlockMapInfo &,__int64 &,__int64,int)const + ?SetNumberOfBlocks@TBlockMapEntry@@QAEXI@Z @ 307 NONAME ; public: void __thiscall TBlockMapEntry::SetNumberOfBlocks(unsigned int) + ?SetStartBlock@TBlockMapEntry@@QAEXI@Z @ 308 NONAME ; public: void __thiscall TBlockMapEntry::SetStartBlock(unsigned int) + ?Clamp@RFileClamp@@QAEHAAVRFile@@@Z @ 309 NONAME ; public: int __thiscall RFileClamp::Clamp(class RFile &) + ?Close@RFileClamp@@QAEHAAVRFs@@@Z @ 310 NONAME ; public: int __thiscall RFileClamp::Close(class RFs &) + ?FileSystemSubType@RFs@@QBEHHAAVTDes16@@@Z @ 311 NONAME ; public: int __thiscall RFs::FileSystemSubType(int,class TDes16 &)const + ?InitialisePropertiesFile@RFs@@QBEHABVTPtrC8@@@Z @ 312 NONAME ; public: int __thiscall RFs::InitialisePropertiesFile(class TPtrC8 const &)const + ?QueryVolumeInfoExt@RFs@@QBEHHW4TQueryVolumeInfoExtCmd@@AAVTDes8@@@Z @ 313 NONAME ; public: int __thiscall RFs::QueryVolumeInfoExt(int,enum TQueryVolumeInfoExtCmd,class TDes8 &)const + ?VolumeIOParam@RFs@@QBEHHAAVTVolumeIOParamInfo@@@Z @ 314 NONAME ; public: int __thiscall RFs::VolumeIOParam(int,class TVolumeIOParamInfo &)const + ?GetSystemDriveChar@RFs@@SA?AVTChar@@XZ @ 315 NONAME ; public: static class TChar __cdecl RFs::GetSystemDriveChar(void) + ?SetSystemDrive@RFs@@QAEHW4TDriveNumber@@@Z @ 316 NONAME ; public: int __thiscall RFs::SetSystemDrive(enum TDriveNumber) + ?DriveList@RFs@@QBEHAAV?$TBuf8@$0BK@@@I@Z @ 317 NONAME ; public: int __thiscall RFs::DriveList(class TBuf8<26> &,unsigned int)const + ?SetFindMask@TFindFile@@QAEHI@Z @ 318 NONAME ; public: int __thiscall TFindFile::SetFindMask(unsigned int) + ?FinaliseDrive@RFs@@QBEHHW4TFinaliseDrvMode@1@@Z @ 319 NONAME ; public: int __thiscall RFs::FinaliseDrive(int,enum RFs::TFinaliseDrvMode)const + ?Volume@RFs@@QBEXAAVTVolumeInfo@@HAAVTRequestStatus@@@Z @ 320 NONAME ; public: void __thiscall RFs::Volume(class TVolumeInfo &,int,class TRequestStatus &)const + ?AddProxyDrive@RFs@@QAEHABVTDesC16@@@Z @ 321 NONAME ; public: int __thiscall RFs::AddProxyDrive(class TDesC16 const &) + ?Caps@RRawDisk@@QAEHAAVTDes8@@@Z @ 322 NONAME ABSENT ; public: int __thiscall RRawDisk::Caps(class TDes8 &) + ?DismountProxyDrive@RFs@@QAEHI@Z @ 323 NONAME ; public: int __thiscall RFs::DismountProxyDrive(unsigned int) + ?DoMountProxyDrive@RFs@@AAEHABVTIpcArgs@@@Z @ 324 NONAME ; private: int __thiscall RFs::DoMountProxyDrive(class TIpcArgs const &) + ?RemoveProxyDrive@RFs@@QAEHABVTDesC16@@@Z @ 325 NONAME ; public: int __thiscall RFs::RemoveProxyDrive(class TDesC16 const &) + ?ReadFileSection@RFs@@QBEHABVTDesC16@@_JAAVTDes8@@H@Z @ 326 NONAME ; public: int __thiscall RFs::ReadFileSection(class TDesC16 const &,__int64,class TDes8 &,int)const + ?AdoptFromClient@RFile64@@QAEHABVRMessage2@@HH@Z @ 327 NONAME ; public: int __thiscall RFile64::AdoptFromClient(class RMessage2 const &,int,int) + ?AdoptFromCreator@RFile64@@QAEHHH@Z @ 328 NONAME ; public: int __thiscall RFile64::AdoptFromCreator(int,int) + ?AdoptFromServer@RFile64@@QAEHHH@Z @ 329 NONAME ; public: int __thiscall RFile64::AdoptFromServer(int,int) + ?Create@RFile64@@QAEHAAVRFs@@ABVTDesC16@@I@Z @ 330 NONAME ; public: int __thiscall RFile64::Create(class RFs &,class TDesC16 const &,unsigned int) + ?FileSize@TEntry@@QBE_JXZ @ 331 NONAME ; public: __int64 __thiscall TEntry::FileSize(void)const + ?Lock@RFile64@@QBEH_J0@Z @ 332 NONAME ; public: int __thiscall RFile64::Lock(__int64,__int64)const + ?Open@RFile64@@QAEHAAVRFs@@ABVTDesC16@@I@Z @ 333 NONAME ; public: int __thiscall RFile64::Open(class RFs &,class TDesC16 const &,unsigned int) + ?Read@RFile64@@QBEHIAAVTDes8@@@Z @ 334 NONAME ; public: int __thiscall RFile64::Read(unsigned int,class TDes8 &)const + ?Read@RFile64@@QBEHIAAVTDes8@@H@Z @ 335 NONAME ; public: int __thiscall RFile64::Read(unsigned int,class TDes8 &,int)const + ?Read@RFile64@@QBEH_JAAVTDes8@@@Z @ 336 NONAME ; public: int __thiscall RFile64::Read(__int64,class TDes8 &)const + ?Read@RFile64@@QBEH_JAAVTDes8@@H@Z @ 337 NONAME ; public: int __thiscall RFile64::Read(__int64,class TDes8 &,int)const + ?Read@RFile64@@QBEXIAAVTDes8@@AAVTRequestStatus@@@Z @ 338 NONAME ; public: void __thiscall RFile64::Read(unsigned int,class TDes8 &,class TRequestStatus &)const + ?Read@RFile64@@QBEXIAAVTDes8@@HAAVTRequestStatus@@@Z @ 339 NONAME ; public: void __thiscall RFile64::Read(unsigned int,class TDes8 &,int,class TRequestStatus &)const + ?Read@RFile64@@QBEX_JAAVTDes8@@AAVTRequestStatus@@@Z @ 340 NONAME ; public: void __thiscall RFile64::Read(__int64,class TDes8 &,class TRequestStatus &)const + ?Read@RFile64@@QBEX_JAAVTDes8@@HAAVTRequestStatus@@@Z @ 341 NONAME ; public: void __thiscall RFile64::Read(__int64,class TDes8 &,int,class TRequestStatus &)const + ?Replace@RFile64@@QAEHAAVRFs@@ABVTDesC16@@I@Z @ 342 NONAME ; public: int __thiscall RFile64::Replace(class RFs &,class TDesC16 const &,unsigned int) + ?Seek@RFile64@@QBEHW4TSeek@@AA_J@Z @ 343 NONAME ; public: int __thiscall RFile64::Seek(enum TSeek,__int64 &)const + ?SetSize@RFile64@@QAEH_J@Z @ 344 NONAME ; public: int __thiscall RFile64::SetSize(__int64) + ?Size@RFile64@@QBEHAA_J@Z @ 345 NONAME ; public: int __thiscall RFile64::Size(__int64 &)const + ?Temp@RFile64@@QAEHAAVRFs@@ABVTDesC16@@AAV?$TBuf@$0BAA@@@I@Z @ 346 NONAME ; public: int __thiscall RFile64::Temp(class RFs &,class TDesC16 const &,class TBuf<256> &,unsigned int) + ?UnLock@RFile64@@QBEH_J0@Z @ 347 NONAME ; public: int __thiscall RFile64::UnLock(__int64,__int64)const + ?Write@RFile64@@QAEHIABVTDesC8@@@Z @ 348 NONAME ; public: int __thiscall RFile64::Write(unsigned int,class TDesC8 const &) + ?Write@RFile64@@QAEHIABVTDesC8@@H@Z @ 349 NONAME ; public: int __thiscall RFile64::Write(unsigned int,class TDesC8 const &,int) + ?Write@RFile64@@QAEH_JABVTDesC8@@@Z @ 350 NONAME ; public: int __thiscall RFile64::Write(__int64,class TDesC8 const &) + ?Write@RFile64@@QAEH_JABVTDesC8@@H@Z @ 351 NONAME ; public: int __thiscall RFile64::Write(__int64,class TDesC8 const &,int) + ?Write@RFile64@@QAEXIABVTDesC8@@AAVTRequestStatus@@@Z @ 352 NONAME ; public: void __thiscall RFile64::Write(unsigned int,class TDesC8 const &,class TRequestStatus &) + ?Write@RFile64@@QAEXIABVTDesC8@@HAAVTRequestStatus@@@Z @ 353 NONAME ; public: void __thiscall RFile64::Write(unsigned int,class TDesC8 const &,int,class TRequestStatus &) + ?Write@RFile64@@QAEX_JABVTDesC8@@AAVTRequestStatus@@@Z @ 354 NONAME ; public: void __thiscall RFile64::Write(__int64,class TDesC8 const &,class TRequestStatus &) + ?Write@RFile64@@QAEX_JABVTDesC8@@HAAVTRequestStatus@@@Z @ 355 NONAME ; public: void __thiscall RFile64::Write(__int64,class TDesC8 const &,int,class TRequestStatus &) + ?IsValidName@RFs@@QAEHABVTDesC16@@AAVTNameValidParam@1@@Z @ 356 NONAME ; public: int __thiscall RFs::IsValidName(class TDesC16 const &,class RFs::TNameValidParam &) + ?Close@RFs@@QAEXXZ @ 357 NONAME ; public: void __thiscall RFs::Close(void) + ??1CFsNotify@@UAE@XZ @ 358 NONAME ; public: virtual __thiscall CFsNotify::~CFsNotify(void) + ?AddNotification@CFsNotify@@QAEHIABVTDesC16@@0@Z @ 359 NONAME ; public: int __thiscall CFsNotify::AddNotification(unsigned int,class TDesC16 const &,class TDesC16 const &) + ?Attributes@TFsNotification@@QBEHAAI0@Z @ 360 NONAME ; public: int __thiscall TFsNotification::Attributes(unsigned int &,unsigned int &)const + ?CancelNotifications@CFsNotify@@QAEHAAVTRequestStatus@@@Z @ 361 NONAME ; public: int __thiscall CFsNotify::CancelNotifications(class TRequestStatus &) + ?FileSize@TFsNotification@@QBEHAA_J@Z @ 362 NONAME ; public: int __thiscall TFsNotification::FileSize(__int64 &)const + ?NewL@CFsNotify@@SAPAV1@AAVRFs@@H@Z @ 363 NONAME ; public: static class CFsNotify * __cdecl CFsNotify::NewL(class RFs &,int) + ?NewName@TFsNotification@@QBEHAAVTPtrC16@@@Z @ 364 NONAME ; public: int __thiscall TFsNotification::NewName(class TPtrC16 &)const + ?NextNotification@CFsNotify@@QAEPBVTFsNotification@@XZ @ 365 NONAME ; public: class TFsNotification const * __thiscall CFsNotify::NextNotification(void) + ?NotificationType@TFsNotification@@QBE?AW4TFsNotificationType@1@XZ @ 366 NONAME ; public: enum TFsNotification::TFsNotificationType __thiscall TFsNotification::NotificationType(void)const + ?Path@TFsNotification@@QBEHAAVTPtrC16@@@Z @ 367 NONAME ; public: int __thiscall TFsNotification::Path(class TPtrC16 &)const + ?RemoveNotifications@CFsNotify@@QAEHXZ @ 368 NONAME ; public: int __thiscall CFsNotify::RemoveNotifications(void) + ?RequestNotifications@CFsNotify@@QAEHAAVTRequestStatus@@@Z @ 369 NONAME ; public: int __thiscall CFsNotify::RequestNotifications(class TRequestStatus &) + ?SupportedFileSystemName@RFs@@QBEHAAVTDes16@@HH@Z @ 370 NONAME ; public: int __thiscall RFs::SupportedFileSystemName(class TDes16 &,int,int)const ??1CFsMountHelper@@UAE@XZ @ 371 NONAME ; public: virtual __thiscall CFsMountHelper::~CFsMountHelper(void) ?DismountFileSystem@CFsMountHelper@@QBEHXZ @ 372 NONAME ; public: int __thiscall CFsMountHelper::DismountFileSystem(void)const ?DismountFileSystem@CFsMountHelper@@QBEXAAVTRequestStatus@@W4TFsDismountMode@1@@Z @ 373 NONAME ; public: void __thiscall CFsMountHelper::DismountFileSystem(class TRequestStatus &,enum CFsMountHelper::TFsDismountMode)const ?GetMountProperties@CFsMountHelper@@QAEHXZ @ 374 NONAME ; public: int __thiscall CFsMountHelper::GetMountProperties(void) ?MountFileSystem@CFsMountHelper@@QBEHXZ @ 375 NONAME ; public: int __thiscall CFsMountHelper::MountFileSystem(void)const ?New@CFsMountHelper@@SAPAV1@AAVRFs@@H@Z @ 376 NONAME ; public: static class CFsMountHelper * __cdecl CFsMountHelper::New(class RFs &,int) + ?DriveNumber@TFsNotification@@QBEHAAH@Z @ 377 NONAME ; public: int __thiscall TFsNotification::DriveNumber(int &)const + ?UID@TFsNotification@@QBEHAAVTUid@@@Z @ 378 NONAME ; public: int __thiscall TFsNotification::UID(class TUid &)const diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/eabi/efileu.def --- a/userlibandfileserver/fileserver/eabi/efileu.def Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/eabi/efileu.def Mon Nov 01 20:11:36 2010 +0000 @@ -315,4 +315,14 @@ _ZNK9RFsPlugin6VolumeER11TVolumeInfoi @ 314 NONAME _ZNK7CFileCB16IsSequentialModeEv @ 315 NONAME _ZN7CFileCB12DirectIOModeERK12RMessagePtr2 @ 316 NONAME + _ZN19CFsNotificationInfo10SetNewNameERK7TDesC16 @ 317 NONAME + _ZN19CFsNotificationInfo11SetFilesizeEx @ 318 NONAME + _ZN19CFsNotificationInfo13SetAttributesEjj @ 319 NONAME + _ZN19CFsNotificationInfo13SetSourceNameERK7TDesC16 @ 320 NONAME + _ZN19CFsNotificationInfo4FreeERPS_ @ 321 NONAME + _ZN19CFsNotificationInfo6SetUidERK4TUid @ 322 NONAME + _ZN19CFsNotificationInfo8AllocateERK8CMountCBi @ 323 NONAME + _ZN8CMountCB17IssueNotificationEP19CFsNotificationInfo @ 324 NONAME + _ZTI19CFsNotificationInfo @ 325 NONAME + _ZTV19CFsNotificationInfo @ 326 NONAME diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/eabi/efsrvu.def --- a/userlibandfileserver/fileserver/eabi/efsrvu.def Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/eabi/efsrvu.def Mon Nov 01 20:11:36 2010 +0000 @@ -418,4 +418,6 @@ _ZNK14CFsMountHelper15MountFileSystemEv @ 417 NONAME _ZNK14CFsMountHelper18DismountFileSystemER14TRequestStatusNS_15TFsDismountModeE @ 418 NONAME _ZNK14CFsMountHelper18DismountFileSystemEv @ 419 NONAME + _ZNK15TFsNotification11DriveNumberERi @ 420 NONAME + _ZNK15TFsNotification3UIDER4TUid @ 421 NONAME diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/group/release.txt --- a/userlibandfileserver/fileserver/group/release.txt Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/group/release.txt Mon Nov 01 20:11:36 2010 +0000 @@ -1,3 +1,16 @@ +Version 2.00.4009 +================= +(Made by fadhliM 25/10/2010) + +1. michcox + 1. Release Plan 590182 Files deployment over Virtual File System to PlatSim from Carbide + REQ 428-2409 PlatSim development environment enhancements + SUB 417-70025 Files deployment over Virtual File System to PlatSim from Carbide + +2. migubarr + 1. ou1cimx1#627410 Atlantisry21x T_NOTIFY F32test case failed on e drive + + Version 2.00.4008 ================= (Made by fadhliM 25/10/2010) diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/inc/f32fsys.h --- a/userlibandfileserver/fileserver/inc/f32fsys.h Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/inc/f32fsys.h Mon Nov 01 20:11:36 2010 +0000 @@ -564,6 +564,169 @@ friend class TFsControlIo; // for access to LocateDrives() #endif }; + +#ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION + typedef TFsNotification::TFsNotificationType TNotificationType; +#else + typedef TInt TNotificationType; +#endif +__ASSERT_COMPILE(sizeof(TNotificationType) == sizeof(TInt)); + +class CFsNotificationInfoBody; //Forward-declaration +class CFsClientMessageRequest; //Forward-declaration +class TParsePtrC; //Forward-declaration +template class CFsPool; //Forward-declaration + +class CFsNotificationInfo : public CBase + { +public: + + /** + * For construction from File systems / CMountCBs + * + * Provides a CFsNotificationInfo to populate. Populate with the change information. + * Supply this object to CMountCB::IssueNotification. + * + * Once CMountCB::IssueNotification has been called, + * free the object by passing it to CFsNotificationInfo::Free + * (i.e. Do not call delete on the object) + * + * @param aMount The mount control block which is issuing this notification + * @param aFunction The function as defined in TFsMessage, f32plugin.h, such as EFsFileWrite. + * + * @return A CFsNotificationInfo* which may be populated with notification info. + * Will return NULL in error conditions. + * + * @see CMountCB::IssueNotification + * @see CFsNotificationInfo::Free + */ + IMPORT_C static CFsNotificationInfo* Allocate(const CMountCB& aMount, TInt aFunction); + + /** + * Free CFsNotificationInfo objects allocated by CFsNotificationInfo::Allocate with this function. + * + * On return aNotificationInfo will be set to NULL. + */ + IMPORT_C static void Free(CFsNotificationInfo*& aNotificationInfo); + + //Set data: + + /** + * Set the source name for the changes. + * This is the name of the file/directory that has changed. + * + * "drive-letter:" is not to be included. + * + * e.g. "x:\\myfile.txt" is incorrect + * "\\myfile.txt" is correct. + */ + IMPORT_C TInt SetSourceName(const TDesC& aSrc); + + /** + * Set the new name for the file. + * This is the new name of the file in the case of a rename. + * + * "drive-letter:" is not to be included. + */ + IMPORT_C TInt SetNewName(const TDesC& aDest); + + /** + * In the case of a File Write or File Set Size operation being notified, + * the new file size of the file must be provided. + */ + IMPORT_C TInt SetFilesize(TInt64 aFilesize); + + /** + * In the case of a change of attributes, the set and cleared attributes must be provided. + * (If these are not known, then the current attributes can be provided to aSet and + * inverse of the current attributes can be provided to aCleared. + */ + IMPORT_C TInt SetAttributes(TUint aSet,TUint aCleared); + + /** + * Set the UID of the process that has caused the change. + * + */ + IMPORT_C TInt SetUid(const TUid& aUid); + + + + //******************************************** + // File server internal : + //******************************************** + + static CFsNotificationInfo* Allocate(CFsMessageRequest& aRequest); + static CFsNotificationInfo* Allocate(TInt aFunction, TInt aDrive); + + //Initialise notification object pool + static TInt Initialise(); + + //Getters + TInt SetDriveNumber(TInt aDriveNumber); + void SetRequest(CFsRequest*); + TInt Function(); + TInt DriveNumber(); + TParsePtrC& Source(); + TParsePtrC& NewName(); + CFsRequest* Request(); + TInt64* Data(); + TUid& Uid(); + TNotificationType& NotificationType(); + TBool DestDriveIsSet(); + + /* + * This is the source length including the drive and colon + * which isn't actually saved as part of the stored source + */ + TInt SourceSize(); + /* + * This is the new name length including the drive and colon + * which may (or may not (- see below)) be actually part of the stored newname. + * + * "Drive:" is stored when the notification request originates from a + * file server client and the drive could be different to the source's drive. + * + * In the case of a request originating from a CMountCB::IssueNotification call, + * the CMountCB does not know about drive letters and only operates on a single + * drive so in this case the "drive:" is missing. + */ + TInt NewNameSize(); + + static void NotificationType(TInt aFunction,TNotificationType& aNotificationType); + static void PathName(CFsClientMessageRequest& aRequest, TParsePtrC& aName); + static void NewPathName(CFsClientMessageRequest& aRequest, TParsePtrC& aName); + static TInt NotificationSize(CFsNotificationInfo& aRequest); + static TInt TypeToIndex(TNotificationType aType); + static TNotificationType NotificationType(TInt& aIndex); + static TInt DriveNumber(const TPtrC& aPath); + static void Attributes(CFsMessageRequest& aRequest, TUint& aSet, TUint& aClear); + static TInt64 FileSize(CFsMessageRequest& aRequest); + static TInt ValidateNotification(CFsNotificationInfo& aNotificationInfo); + static void SetData(CFsMessageRequest* aRequest, CFsNotificationInfo* aNotificationInfo); + static TUint NotifyType(TInt aFunction); + +private: + //Don't delete instances, free them. + virtual ~CFsNotificationInfo(); + CFsNotificationInfo& operator=(CFsNotificationInfo& aNotification); //to prevent copying + + // called from New + CFsNotificationInfo(); + + //Used to populate NotificationInfoPool + static CFsNotificationInfo* New(); + + //Called after construction/allocation from pool + TInt Init(TInt aFunction, TInt aDriveNumber); + + //Resets notification + void CleanNotification(); + + CFsNotificationInfoBody* iBody; + friend class FsNotify; + friend class CFsPool; //For access to ~CFsNotificationInfo for compilation purposes + }; + class CFileCB; class CDirCB; @@ -1395,9 +1558,36 @@ // calls GetInterface() with tracepoints added TInt GetInterfaceTraced(TInt aInterfaceId,TAny*& aInterface,TAny* aInput); - - - +public: + /* + * This function is provided for file systems to issue notifications to file server clients + * that have registered for notifications using the RFs::NotifyChange and CFsNotify client-side APIs. + * + * @param aNotificationInfo This object should contain the relevant Source (and if appropriate, NewName) + * as well as any other required information. + * + * The Source provided should be a fullpath of the form: + * \[path\]directory\ - in the case of changes to a directory + * \[path\]filename.ext - in the case of changes to a file + * + * The drive letter information is not to be included. + * + * In the case of 'File Write' or 'File Set Size' operations, the resulting file size must be set. + * @see CFsNotificationInfo::SetFileSize + * + * In the case of a attributes change, the attributes set and cleared must be set. + * @see CFsNotificationInfo::SetAttributes + * + * All CFsNotificationInfo objects must have a Uid set. This is the Uid of the + * process which caused the change. i.e. A photo browser may wish to know if it was the camera app + * or the photo editor which has caused a change. @see CFsNotificationInfo::SetUID + * + * @see class TFsNotification. + * + * @return Symbian Standard error code. KErrNone on success. + */ + IMPORT_C TInt IssueNotification(CFsNotificationInfo* aNotificationInfo); + private: void SetFileSystem(CFileSystem* aFS); @@ -2041,7 +2231,7 @@ void InitL(); inline CFileCB& File(); - // For serialising aync requests + // For serialising async requests TBool RequestStart(CFsMessageRequest* aRequest); void RequestEnd(CFsMessageRequest* aRequest); TBool RequestInProgress() const; diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/inc/f32notification.h --- a/userlibandfileserver/fileserver/inc/f32notification.h Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/inc/f32notification.h Mon Nov 01 20:11:36 2010 +0000 @@ -115,13 +115,16 @@ /* * @returns The Drive Number associated with the Path. + */ IMPORT_C TInt DriveNumber(TInt& aDriveNumber) const; - */ - + /* * @returns the UID of the process that caused this change. + * NB, the UID of the process causing the change is not always available + * such as when memory cards are physically removed. + */ IMPORT_C TInt UID(TUid& aUID) const; - */ + private: //Declared private to prevent construction TFsNotification(); @@ -182,7 +185,7 @@ * CFsNotify stores notifications in a buffer. * Clients of CFsNotify must specify how large this buffer should be. * - * As a guideline: Notification objects in the buffer typically have a 8byte header, + * As a guideline: Notification objects in the buffer typically have a 12-byte header, * followed by a word aligned string containing the fullname of the file that has changed. * In the case of a rename notification both the original and the new fullnames are stored. * diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/inc/f32ver.h --- a/userlibandfileserver/fileserver/inc/f32ver.h Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/inc/f32ver.h Mon Nov 01 20:11:36 2010 +0000 @@ -58,6 +58,6 @@ @see TVersion */ -const TInt KF32BuildVersionNumber=4008; +const TInt KF32BuildVersionNumber=4009; // #endif diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/sfile/efile.mmh --- a/userlibandfileserver/fileserver/sfile/efile.mmh Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/efile.mmh Mon Nov 01 20:11:36 2010 +0000 @@ -48,8 +48,9 @@ SOURCE sf_memory_man.cpp sf_memory_client.cpp SOURCE sf_plugin_shim.cpp SOURCE sf_notifier_handlers.cpp +SOURCE sf_pool.cpp #ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION -SOURCE sf_pool.cpp sf_notifier.cpp +SOURCE sf_notifier.cpp #endif #ifdef WINS diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/sfile/sf_dat.cpp --- a/userlibandfileserver/fileserver/sfile/sf_dat.cpp Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_dat.cpp Mon Nov 01 20:11:36 2010 +0000 @@ -27,6 +27,7 @@ CFsObjectCon* RawDisks; CFsObjectCon* Extensions; CFsObjectCon* ProxyDrives; +CFsPool* NotificationInfoPool; CServerFs* TheFileServer; TDrive TheDrives[KMaxDrives]; diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/sfile/sf_dir.cpp --- a/userlibandfileserver/fileserver/sfile/sf_dir.cpp Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_dir.cpp Mon Nov 01 20:11:36 2010 +0000 @@ -149,7 +149,7 @@ TInt r=ParseSubstPtr0(aRequest,aRequest->Src()); if (r!=KErrNone) return(r); - r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysDirOpen,&KCapFsPriDirOpen, __PLATSEC_DIAGNOSTIC_STRING("Dir Open")); + r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysDirOpen,&KCapFsPriDirOpen, __PLATSEC_DIAGNOSTIC_STRING("Dir Open")); if(r != KErrNone) return r; return KErrNone; diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/sfile/sf_file.cpp --- a/userlibandfileserver/fileserver/sfile/sf_file.cpp Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_file.cpp Mon Nov 01 20:11:36 2010 +0000 @@ -290,7 +290,7 @@ TInt r=ParseNoWildSubstCheckPtr0(aRequest,aRequest->Src()); if (r!=KErrNone) return(r); - r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysFileCreate,&KCapFsPriFileCreate,&KCapFsROFileCreate, __PLATSEC_DIAGNOSTIC_STRING("Create File")); + r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysFileCreate,&KCapFsPriFileCreate,&KCapFsROFileCreate, __PLATSEC_DIAGNOSTIC_STRING("Create File")); if (r!=KErrNone) return(r); if (OpenOnDriveZOnly) @@ -320,7 +320,7 @@ TInt r=ParseNoWildSubstCheckPtr0(aRequest,aRequest->Src()); if (r!=KErrNone) return(r); - r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysFileReplace,&KCapFsPriFileReplace,&KCapFsROFileReplace, __PLATSEC_DIAGNOSTIC_STRING("Replace File")); + r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysFileReplace,&KCapFsPriFileReplace,&KCapFsROFileReplace, __PLATSEC_DIAGNOSTIC_STRING("Replace File")); if (r!=KErrNone) return(r); @@ -419,7 +419,7 @@ if(ComparePrivate(thisPath)) { - if(! SIDCheck(aRequest,thisPath)) + if(! SIDCheck(aRequest->Message(),thisPath)) { if(!KCapFsPriFileOpen.CheckPolicy(aRequest->Message(), __PLATSEC_DIAGNOSTIC_MESSAGE("File Open in private path"))) return KErrPermissionDenied; @@ -492,7 +492,7 @@ TInt r=ParseNoWildSubstCheckPtr0(aRequest,aRequest->Src()); if (r!=KErrNone) return(r); - r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysIsFileOpen,&KCapFsPriIsFileOpen, __PLATSEC_DIAGNOSTIC_STRING("Is File Open")); + r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysIsFileOpen,&KCapFsPriIsFileOpen, __PLATSEC_DIAGNOSTIC_STRING("Is File Open")); return(r); } @@ -628,7 +628,7 @@ TInt r=ParseNoWildSubstPtr0(aRequest,aRequest->Src()); if (r!=KErrNone) return(r); - r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysFileTemp,&KCapFsPriFileTemp,&KCapFsROFileTemp, __PLATSEC_DIAGNOSTIC_STRING("Temp File")); + r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysFileTemp,&KCapFsPriFileTemp,&KCapFsROFileTemp, __PLATSEC_DIAGNOSTIC_STRING("Temp File")); if (r!=KErrNone) return(r); if (aRequest->Src().NameOrExtPresent()) @@ -1496,9 +1496,6 @@ CFileCache* fileCache = share->File().FileCache(); if (fileCache && (r = fileCache->FlushDirty(aRequest)) != CFsRequest::EReqActionComplete) { - //To be used in notification framework - //CFsMessageRequest& msgRequest = (CFsMessageRequest&)*aRequest; - //msgRequest.iUID = msgRequest.Message().Identity(); return r; } @@ -1950,7 +1947,7 @@ return(KErrBadName); if (IsIllegalFullName(aRequest->Dest().FullName().Mid(2))) return(KErrBadName); - r=PathCheck(aRequest,aRequest->Dest().FullName().Mid(2),&KCapFsSysFileRename,&KCapFsPriFileRename,&KCapFsROFileRename, __PLATSEC_DIAGNOSTIC_STRING("File Rename")); + r=PathCheck(aRequest->Message(),aRequest->Dest().FullName().Mid(2),&KCapFsSysFileRename,&KCapFsPriFileRename,&KCapFsROFileRename, __PLATSEC_DIAGNOSTIC_STRING("File Rename")); return(r); } diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/sfile/sf_file_cache.cpp --- a/userlibandfileserver/fileserver/sfile/sf_file_cache.cpp Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_file_cache.cpp Mon Nov 01 20:11:36 2010 +0000 @@ -1623,7 +1623,7 @@ -TInt CFileCache::AllocateRequest(CFsClientMessageRequest*& aNewRequest, TBool aWrite, CSessionFs* aSession) +TInt CFileCache::AllocateRequest(CFsClientMessageRequest*& aNewRequest, TBool aWrite, CSessionFs* aSession,TUid aUid) { RLocalMessage msgNew; @@ -1632,7 +1632,7 @@ if (r != KErrNone) return r; - aNewRequest->Set(msgNew, oP, aSession); + aNewRequest->Set(msgNew, oP, aSession, aUid); aNewRequest->SetDrive(iDrive); // read-aheads and write-dirty requests should not be posted to plugins @@ -1676,8 +1676,6 @@ if (newRequest) { - //To be used in notification framework. - //newRequest->iUID = aOldRequest->Message().Identity(); newRequest->Dispatch(); } @@ -1762,8 +1760,8 @@ CSessionFs* session = aOldRequest && aOldRequest->Session() ? aOldRequest->Session() : iDirtyDataOwner; __ASSERT_ALWAYS(session, Fault(EFlushingWithSessionNull)); - - TInt r = AllocateRequest(aNewRequest, ETrue, session); + + TInt r = AllocateRequest(aNewRequest, ETrue, session, (aOldRequest) ? aOldRequest->Uid() : TUid::Null()); if (r != KErrNone) return r; diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/sfile/sf_file_cache.h --- a/userlibandfileserver/fileserver/sfile/sf_file_cache.h Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_file_cache.h Mon Nov 01 20:11:36 2010 +0000 @@ -91,7 +91,7 @@ static TInt CompleteFlushDirty(CFsRequest* aMsgRequest); TInt FlushDirtySm(CFsMessageRequest& aMsgRequest); - TInt AllocateRequest(CFsClientMessageRequest*& aNewRequest, TBool aWrite, CSessionFs* aSession = NULL); + TInt AllocateRequest(CFsClientMessageRequest*& aNewRequest, TBool aWrite, CSessionFs* aSession = NULL,TUid aUid = KNullUid); void DoReadAhead(CFsMessageRequest& aMsgRequest, TUint aMode); diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/sfile/sf_local.cpp --- a/userlibandfileserver/fileserver/sfile/sf_local.cpp Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_local.cpp Mon Nov 01 20:11:36 2010 +0000 @@ -500,11 +500,14 @@ #ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION if(FsNotificationManager::IsInitialised()) { + CFsNotificationInfo* notificationInfo = CFsNotificationInfo::Allocate(EFsDismountFileSystem,aDrive); __PRINT3(_L("LocalDrives::CompleteDriveNotifications() Initialised=%d, Count=%d, Drive=%d"),FsNotificationManager::IsInitialised(),FsNotificationManager::Count(), aDrive); TBuf<2> driveDes; driveDes.Append((TChar)aDrive+(TChar)'A'); driveDes.Append((TChar)':'); - FsNotificationManager::HandleChange(NULL,driveDes,TFsNotification::EMediaChange); + notificationInfo->SetSourceName(driveDes); + FsNotificationManager::HandleChange(*notificationInfo); + CFsNotificationInfo::Free(notificationInfo); } #endif //SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/sfile/sf_main.cpp --- a/userlibandfileserver/fileserver/sfile/sf_main.cpp Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_main.cpp Mon Nov 01 20:11:36 2010 +0000 @@ -166,7 +166,7 @@ aMessage.Complete(r); return; } - pR->Set(aMessage, oP, this); + pR->Set(aMessage, oP, this, aMessage.Identity()); __PRINT4TEMP(_L("***** Received Message sess %08x req %08x func 0x%x - %S"), this, pR, ipcFunction, GetFunctionName(ipcFunction)); pR->Dispatch(); } @@ -485,6 +485,11 @@ // initialise notification information FsNotify::Initialise(); + + // initialise notification pool + r = CFsNotificationInfo::Initialise(); + __ASSERT_ALWAYS(r==KErrNone,Fault(ENotifyPoolCreation)); + // initialise local drive specific information LocalDrives::Initialise(); diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/sfile/sf_mnt.cpp --- a/userlibandfileserver/fileserver/sfile/sf_mnt.cpp Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_mnt.cpp Mon Nov 01 20:11:36 2010 +0000 @@ -19,7 +19,7 @@ #include "sf_mntTraces.h" #endif - +#include "sf_notifier.h" /** @@ -453,6 +453,22 @@ } +EXPORT_C TInt CMountCB::IssueNotification(CFsNotificationInfo* aNotificationInfo) + { + //Validate Notification + TInt r = CFsNotificationInfo::ValidateNotification(*aNotificationInfo); + if(r != KErrNone) + return r; + + //Target RFs::NotifyChange + FsNotify::HandleChange(*aNotificationInfo); + +#ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION + //Target CFsNotify + FsNotificationManager::HandleChange(*aNotificationInfo); +#endif + return KErrNone; + } diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/sfile/sf_nbs.cpp --- a/userlibandfileserver/fileserver/sfile/sf_nbs.cpp Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_nbs.cpp Mon Nov 01 20:11:36 2010 +0000 @@ -82,7 +82,7 @@ TInt r=ParseSubstPtr0(aRequest,aRequest->Src()); if (r!=KErrNone) return(r); - r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysMkDir,&KCapFsPriMkDir,&KCapFsROMkDir, __PLATSEC_DIAGNOSTIC_STRING("Make Directory")); + r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysMkDir,&KCapFsPriMkDir,&KCapFsROMkDir, __PLATSEC_DIAGNOSTIC_STRING("Make Directory")); return(r); } @@ -110,7 +110,7 @@ TInt r=ParseSubstPtr0(aRequest,aRequest->Src()); if (r!=KErrNone) return(r); - r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysRmDir,&KCapFsPriRmDir,&KCapFsRORmDir, __PLATSEC_DIAGNOSTIC_STRING("Remove Directory")); + r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysRmDir,&KCapFsPriRmDir,&KCapFsRORmDir, __PLATSEC_DIAGNOSTIC_STRING("Remove Directory")); return(r); } @@ -132,7 +132,7 @@ TInt r=ParseNoWildSubstCheckPtr0(aRequest,aRequest->Src()); if (r!=KErrNone) return(r); - r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysDelete,&KCapFsPriDelete,&KCapFsRODelete, __PLATSEC_DIAGNOSTIC_STRING("Delete")); + r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysDelete,&KCapFsPriDelete,&KCapFsRODelete, __PLATSEC_DIAGNOSTIC_STRING("Delete")); return(r); } @@ -159,13 +159,13 @@ TInt r=ParseNoWildSubstCheckPathPtr0(aRequest,aRequest->Src()); if (r!=KErrNone) return(r); - r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysRename,&KCapFsPriRename,&KCapFsRORename, __PLATSEC_DIAGNOSTIC_STRING("File Server Rename")); + r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysRename,&KCapFsPriRename,&KCapFsRORename, __PLATSEC_DIAGNOSTIC_STRING("File Server Rename")); if(r!=KErrNone) return(r); TDrive* pOldDrive=aRequest->Drive(); if ((r=ParseNoWildSubstCheckPathPtr1(aRequest,aRequest->Dest()))!=KErrNone) return(r); - r=PathCheck(aRequest,aRequest->Dest().FullName().Mid(2),&KCapFsSysRename,&KCapFsPriRename,&KCapFsRORename, __PLATSEC_DIAGNOSTIC_STRING("File Server Rename")); + r=PathCheck(aRequest->Message(),aRequest->Dest().FullName().Mid(2),&KCapFsSysRename,&KCapFsPriRename,&KCapFsRORename, __PLATSEC_DIAGNOSTIC_STRING("File Server Rename")); if(r == KErrNone) { if (pOldDrive!=aRequest->Drive()) @@ -197,13 +197,13 @@ TInt r=ParseNoWildSubstCheckPtr0(aRequest,aRequest->Src()); if (r!=KErrNone) return(r); - r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysReplace,&KCapFsPriReplace,&KCapFsROReplace, __PLATSEC_DIAGNOSTIC_STRING("File Server Replace")); + r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysReplace,&KCapFsPriReplace,&KCapFsROReplace, __PLATSEC_DIAGNOSTIC_STRING("File Server Replace")); if(r!=KErrNone) return(r); TDrive* pOldDrive=aRequest->Drive(); if ((r=ParseNoWildSubstCheckPtr1(aRequest,aRequest->Dest()))!=KErrNone) return(r); - r=PathCheck(aRequest,aRequest->Dest().FullName().Mid(2),&KCapFsSysReplace,&KCapFsPriReplace,&KCapFsROReplace, __PLATSEC_DIAGNOSTIC_STRING("File Server Replace")); + r=PathCheck(aRequest->Message(),aRequest->Dest().FullName().Mid(2),&KCapFsSysReplace,&KCapFsPriReplace,&KCapFsROReplace, __PLATSEC_DIAGNOSTIC_STRING("File Server Replace")); if(r == KErrNone) { if (pOldDrive!=aRequest->Drive()) @@ -242,7 +242,7 @@ // Check the capabilites but always allow the entry to be read for private, system and // resource directories as long as there are no sub folders or files specified - r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsEntry, __PLATSEC_DIAGNOSTIC_STRING("Entry"), ETrue); + r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsEntry, __PLATSEC_DIAGNOSTIC_STRING("Entry"), ETrue); return(r); } @@ -277,7 +277,7 @@ TInt r=ParseNoWildSubstCheckPathPtr0(aRequest,aRequest->Src()); if (r!=KErrNone) return(r); - r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysSetEntry,&KCapFsPriSetEntry,&KCapFsROSetEntry, __PLATSEC_DIAGNOSTIC_STRING("Set Entry")); + r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysSetEntry,&KCapFsPriSetEntry,&KCapFsROSetEntry, __PLATSEC_DIAGNOSTIC_STRING("Set Entry")); return(r); } @@ -390,7 +390,7 @@ TInt r=ParseNoWildSubstFileCheckPtr1(aRequest,aRequest->Src()); if (r!=KErrNone) return(r); - r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysReadFileSection,&KCapFsPriReadFileSection, __PLATSEC_DIAGNOSTIC_STRING("Read File Section")); + r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysReadFileSection,&KCapFsPriReadFileSection, __PLATSEC_DIAGNOSTIC_STRING("Read File Section")); return(r); } @@ -481,7 +481,7 @@ TInt r=ParseNoWildSubstCheckPathPtr0(aRequest,aRequest->Src()); if (r!=KErrNone) return(r); - r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysGetShortName,&KCapFsPriGetShortName, __PLATSEC_DIAGNOSTIC_STRING("Get Short Name")); + r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysGetShortName,&KCapFsPriGetShortName, __PLATSEC_DIAGNOSTIC_STRING("Get Short Name")); return(r); } @@ -508,7 +508,7 @@ TInt r=ParseNoWildSubstCheckPathPtr0(aRequest,aRequest->Src()); if (r!=KErrNone) return(r); - r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysGetLongName,&KCapFsPriGetLongName, __PLATSEC_DIAGNOSTIC_STRING("Get Long Name")); + r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysGetLongName,&KCapFsPriGetLongName, __PLATSEC_DIAGNOSTIC_STRING("Get Long Name")); return(r); } @@ -537,7 +537,7 @@ TInt r=ParseNoWildSubstCheckPathPtr0(aRequest,aRequest->Src()); if (r!=KErrNone) return (r); - r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysIsFileInRom,&KCapFsPriIsFileInRom, __PLATSEC_DIAGNOSTIC_STRING("Is File In Rom")); + r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysIsFileInRom,&KCapFsPriIsFileInRom, __PLATSEC_DIAGNOSTIC_STRING("Is File In Rom")); return(r); } diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/sfile/sf_notifier.cpp --- a/userlibandfileserver/fileserver/sfile/sf_notifier.cpp Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_notifier.cpp Mon Nov 01 20:11:36 2010 +0000 @@ -24,20 +24,21 @@ CFsPool* FsNotificationManager::iPool; -CFsNotificationPathFilter* CFsNotificationPathFilter::NewL(const TDesC& aPath, const TDesC& aFilename) +CFsNotificationPathFilter* CFsNotificationPathFilter::NewL(const TDesC& aPath, const TDesC& aFilename, TInt aDriveNum) { CFsNotificationPathFilter* self = new (ELeave) CFsNotificationPathFilter(); CleanupStack::PushL(self); - self->ConstructL(aPath,aFilename); + self->ConstructL(aPath,aFilename,aDriveNum); CleanupStack::Pop(self); return self; } -void CFsNotificationPathFilter::ConstructL(const TDesC& aPath, const TDesC& aFilename) +void CFsNotificationPathFilter::ConstructL(const TDesC& aPath, const TDesC& aFilename, TInt aDriveNum) { //Allocate the path and filename iPath = aPath.AllocL(); iFilename = aFilename.AllocL(); + iDriveNum = aDriveNum; } CFsNotificationPathFilter::~CFsNotificationPathFilter() @@ -176,7 +177,7 @@ if(filterTypeCount) { //Remove this type from the filter register - TFsNotification::TFsNotificationType type = FsNotificationHelper::NotificationType(filterType); + TFsNotification::TFsNotificationType type = CFsNotificationInfo::NotificationType(filterType); FsNotificationManager::SetFilterRegister(type,EFalse,filterTypeCount); } filterList.Reset(); @@ -188,8 +189,6 @@ currentDriveFilters = (TFsNotificationTypeDriveArray*)iterator.NextValue(); } iDrivesTypesFiltersMap.Close(); - iPathFilterList.ResetAndDestroy(); - iPathFilterList.Close(); return KErrNone; } @@ -197,10 +196,8 @@ { __PRINT(_L("CFsNotifyRequest::AddFilterL")); - iPathFilterList.AppendL(aFilter); - //Get the drive number to so know which drive array to add the filter(s) to. - TInt driveNum = FsNotificationHelper::DriveNumber(aFilter->iPath->Des()); + TInt driveNum = aFilter->iDriveNum; TInt notifyType = 1; TInt r = KErrNone; @@ -213,7 +210,7 @@ TFsNotificationTypeFilter typeFilter; typeFilter.iNotificationType = (TFsNotification::TFsNotificationType) notifyType; typeFilter.iPathFilter = aFilter; - TInt index = FsNotificationHelper::TypeToIndex(typeFilter.iNotificationType); + TInt index = CFsNotificationInfo::TypeToIndex(typeFilter.iNotificationType); //If the per-drive-filterLists have not //been set up yet then do so now. @@ -256,6 +253,11 @@ return iClientMsg.Handle(); } +const RMessage2& CFsNotifyRequest::BufferMessage() + { + return iBufferMsg; + } + void CFsNotifyRequest::CloseNotification() { __PRINT(_L("CFsNotifyRequest::CloseNotification()")); @@ -328,7 +330,7 @@ User::LeaveIfError(iChainLock.CreateLocal()); } iNotifyRequests = TheContainer->CreateL(); - iPool = CFsPool::New(KNotificationPoolSize); + iPool = CFsPool::New(KNotificationPoolSize,CFsNotificationBlock::New); User::LeaveIfNull(iPool); } } @@ -336,7 +338,7 @@ void FsNotificationManager::SetFilterRegister(TUint aFilter, TBool aAdd, TInt aCount) { __PRINT2(_L("FsNotificationManager::SetFilterRegister(aFilter=%u,aAdd=%d)"),aFilter,aAdd); - TInt index = FsNotificationHelper::TypeToIndex((TFsNotification::TFsNotificationType)aFilter); + TInt index = CFsNotificationInfo::TypeToIndex((TFsNotification::TFsNotificationType)aFilter); TInt& fr = FsNotificationManager::FilterRegister(index); __ASSERT_DEBUG((aAdd) ? fr >= 0 : fr > 0,Fault(ENotificationFault)); fr+= aAdd ? aCount : -aCount; @@ -400,9 +402,9 @@ } //Get the notification type based on the TFsMessage function -void FsNotificationHelper::NotificationType(TInt aFunction,TFsNotification::TFsNotificationType& aNotificationType) +void CFsNotificationInfo::NotificationType(TInt aFunction,TNotificationType& aNotificationType) { - __PRINT(_L("FsNotificationHelper::NotificationType")); + __PRINT(_L("CFsNotificationInfo::NotificationType")); switch(aFunction) { case EFsFileWrite: @@ -486,258 +488,7 @@ } -//=====FsNotificationManager=========================== -//Get the path of the file, folder or drive name based on the TFsMessage function -void FsNotificationHelper::PathName(CFsClientMessageRequest& aRequest, TDes& aPath) - { - __PRINT(_L("FsNotificationHelper::PathName")); - //Get the notification type - TInt function = aRequest.Operation()->Function(); - - //Get the filename(s) - switch(function) - { - case EFsFileWrite: //EParseSrc | EFileShare - case EFsFileSetSize: //EParseSrc | EFileShare - case EFsFileSetAtt: //EParseDst | EParseSrc, - should not use these; has share. - case EFsFileSet: - case EFsFileWriteDirty: //EFileShare - { - CFileShare* share = NULL; - CFileCB* file = NULL; - GetFileFromScratch(&aRequest,share,file); - aPath.Append(file->DriveNumber() + 'A'); - aPath.Append(':'); - aPath.Append(file->FileName().Des()); - break; - } - case EFsFileCreate: //EParseSrc - case EFsDelete: //EParseSrc - case EFsSetEntry: //EParseSrc, - case EFsFileRename: //EParseDst | EParseSrc, - case EFsRename: //EParseDst | EParseSrc, - case EFsReplace: //EParseDst | EParseSrc, - case EFsFileReplace: //EParseSrc - { - aPath.Copy(aRequest.Src().FullName()); - break; - } - case EFsRmDir: //EParseSrc - case EFsMkDir: //EParseSrc - { - aPath.Copy(aRequest.Src().DriveAndPath()); - break; - } - case EFsFormatNext: //EParseSrc - case EFsDismountFileSystem: //0 - case EFsMountFileSystem: //0 - case EFsSetVolume: //0 - case EFsSetDriveName: //ESync - case EFsRawDiskWrite: //EParseSrc - case EFsMountFileSystemScan: - { - _LIT(KFormatDrive,"?:"); - TBuf<2> drive; - drive.Append(KFormatDrive); - drive[0] = TText(aRequest.Drive()->DriveNumber() + 'A'); - aPath.Copy(drive); - break; - } - default: - ASSERT(0); - break; - } - } - -//Get the new path of the file, folder or drive name based on the TFsMessage function -void FsNotificationHelper::NewPathName(CFsClientMessageRequest& aRequest, TPtrC& aNewPath) - { - __PRINT(_L("FsNotificationHelper::NewPathName")); - //Get the notification type - TInt function = aRequest.Operation()->Function(); - - //Get the filename(s) - switch(function) - { - case EFsFileRename: //EParseDst | EParseSrc, - case EFsRename: //EParseDst | EParseSrc, - case EFsReplace: //EParseDst | EParseSrc, - { - aNewPath.Set(aRequest.Dest().FullName()); - break; - } - case EFsSetDriveName: //ESync - { - TFileName name; - aRequest.ReadL(KMsgPtr1, name); - aNewPath.Set(name); - break; - } - case EFsSetVolume: //0 - { - TFileName name; - aRequest.ReadL(KMsgPtr0, name); - aNewPath.Set(name); - break; - } - default: - { - ASSERT(0); - break; - } - } - } - -//Get the size of the notification based on its type -TInt FsNotificationHelper::NotificationSize(CFsClientMessageRequest& aRequest, TFsNotification::TFsNotificationType aNotificationType, const TDesC& aName) - { - __PRINT(_L("FsNotificationHelper::NotificationSize")); - - /* - * If there are no new names, the order of the data in the buffer is: - * Word1 : NotificationSize (2 bytes) , PathSize (2 bytes) - * Word2 : NotificationType (Lower 2 bytes) - * Word(s) : Path (TText8) , [Any sub-class members] - * - * Else for notification types ERename, EVolumeName and EDriveName the order is: - * Word1 : NotificationSize (2 bytes) , PathSize (2 bytes) - * Word2 : NewNameSize (2 bytes) , NotificationType (2 bytes) - * Word(s) : Path (TText8) , NewName (TText8) - * - * EOverflow size: KNotificationHeaderSize - */ - - TInt size = KNotificationHeaderSize + Align4(aName.Size()); - - switch(aNotificationType) - { - //NewName - case TFsNotification::ERename: - case TFsNotification::EVolumeName: - case TFsNotification::EDriveName: - { - TPtrC dest; - NewPathName(aRequest,dest); - size += Align4(dest.Size()); - break; - } - case TFsNotification::EFileChange: - { - size += sizeof(TInt64); - break; - } - case TFsNotification::EAttribute: - { - size += sizeof(TUint64); - break; - } - case TFsNotification::ECreate: - case TFsNotification::EDelete: - case TFsNotification::EMediaChange: - { - break; - } - default: - { - ASSERT(0); - break; - } - } - return (TUint16) size; - } - -TFsNotification::TFsNotificationType FsNotificationHelper::NotificationType(TInt& aIndex) - { - __PRINT(_L("FsNotificationHelper::NotificationType(TInt)")); - __ASSERT_DEBUG(aIndex < KNumRegisterableFilters, Fault(ENotificationFault)); - - switch(aIndex) //No break statements here on purpose - { - case 7 : return TFsNotification::EMediaChange; - case 6 : return TFsNotification::EDriveName; - case 5 : return TFsNotification::EVolumeName; - case 4 : return TFsNotification::EDelete; - case 3 : return TFsNotification::EAttribute; - case 2 : return TFsNotification::ECreate; - case 1 : return TFsNotification::ERename; - case 0 : return TFsNotification::EFileChange; - default: ASSERT(0); return (TFsNotification::TFsNotificationType) 0; - } - } - -//Get the array index of the notification based on its type -TInt FsNotificationHelper::TypeToIndex(TFsNotification::TFsNotificationType aType) - { - __PRINT(_L("FsNotificationHelper::ArrayIndex")); - - TInt index = 0; - switch(aType) //No break statements here on purpose - { - case TFsNotification::EMediaChange: index++; - case TFsNotification::EDriveName: index++; - case TFsNotification::EVolumeName: index++; - case TFsNotification::EDelete: index++; - case TFsNotification::EAttribute: index++; - case TFsNotification::ECreate: index++; - case TFsNotification::ERename: index++; - case TFsNotification::EFileChange: // skip; - default: break; - } - __ASSERT_DEBUG(index < KNumRegisterableFilters, Fault(ENotificationFault)); - return index; - } - -TInt FsNotificationHelper::DriveNumber(const TPtrC& aPath) - { - if(aPath.Length() >= 2 && ((TChar)aPath[1])==(TChar)':') - { - TChar driveChar = ((TChar)aPath[0]); - driveChar.UpperCase(); - TInt driveNum = driveChar-(TChar)'A'; - return driveNum; - } - else - { - return KErrNotFound; - } - } - -//Get the attributes set and cleared -void FsNotificationHelper::Attributes(CFsClientMessageRequest& aRequest, TUint& aSet, TUint& aClear) - { - __PRINT(_L("FsNotificationHelper::Attributes")); - - TInt function = aRequest.Operation()->Function(); - const RMessage2& msg = aRequest.Message(); - - switch(function) - { - case EFsFileSet: - { - aSet = msg.Int1(); - aClear = msg.Int2(); - break; - } - case EFsFileSetAtt: - { - aSet = msg.Int0(); - aClear = msg.Int1(); - break; - } - case EFsSetEntry: - { - aSet = msg.Int2(); - aClear = msg.Int3(); - break; - } - default: - { - ASSERT(0); - break; - } - } - } TBool CFsNotifyRequest::ValidateNotification(TInt aNotificationSize, TInt& aServerTail) @@ -898,7 +649,7 @@ // If there is a iClientMsg then this is the first time this // has been called since the client called RequestNotifications. // In this situation we complete the client request. -TInt CFsNotifyRequest::NotifyChange(CFsClientMessageRequest* aRequest,const TDesC& aName, TFsNotification::TFsNotificationType aNotificationType, CFsNotificationBlock& aBlock) +TInt CFsNotifyRequest::NotifyChange(CFsNotificationInfo* aRequest, CFsNotificationBlock& aBlock) { /* * Different notification types have different data associated with them. @@ -920,8 +671,8 @@ __PRINT(_L("CFsNotifyRequest::NotifyChange()")); - TInt notificationSize = FsNotificationHelper::NotificationSize(*aRequest,aNotificationType,aName); - + TInt notificationSize = CFsNotificationInfo::NotificationSize(*aRequest); + iClientSyncLock.Wait(); iTailSemaphore.Wait(); @@ -936,16 +687,23 @@ //We can store the size of the notification //and the size of the name in the same word. + TBuf<2> driveBuf; + driveBuf.SetLength(2); + TChar driveLetter = 'A'; + RFs::DriveToChar(aRequest->DriveNumber(),driveLetter); + driveBuf[0] = (TText)driveLetter; + driveBuf[1] = (TText)':'; + TUint16 nameLen = 0; //Overflow has no name TInt notifSize = KNotificationHeaderSize; if(!overflow) { - nameLen = (TUint16)aName.Size(); + nameLen = (TUint16)aRequest->SourceSize(); notifSize = notificationSize; } else { - aNotificationType = TFsNotification::EOverflow; + aRequest->NotificationType() = TFsNotification::EOverflow; } iServerTail = tail + notifSize; @@ -958,62 +716,47 @@ memcpy((TText8*)aBlock.Data()+writeOffset,&sizeNameLen,sizeof(TUint)); writeOffset+=sizeof(TUint); - TPtrC newName; - - if (aNotificationType == TFsNotification::ERename || - aNotificationType == TFsNotification::EVolumeName || - aNotificationType == TFsNotification::EDriveName) - { - FsNotificationHelper::NewPathName(*aRequest,newName); - //Store NewNameSize and notification Type (Word2) - TUint typeNewNameLen = ((TUint16)newName.Size() << 16) | (TUint16)aNotificationType; + if (aRequest->NotificationType() == TFsNotification::ERename || + aRequest->NotificationType() == TFsNotification::EVolumeName || + aRequest->NotificationType() == TFsNotification::EDriveName) + { + //Store NewNameSize and notification Type (Word2) + TUint typeNewNameLen = ((TUint16)aRequest->NewNameSize() << 16) | (TUint16)aRequest->NotificationType(); memcpy((TText8*)aBlock.Data()+writeOffset,&typeNewNameLen,sizeof(TUint)); } else { //Store notification Type (Word2) - memcpy((TText8*)aBlock.Data()+writeOffset,&aNotificationType,sizeof(TUint)); + memcpy((TText8*)aBlock.Data()+writeOffset,&aRequest->NotificationType(),sizeof(TUint)); } writeOffset+=sizeof(TUint); - CFileShare* share = NULL; - CFileCB* file = NULL; - if(aRequest) //Don't always have a request such as when called from localdrives. - { - GetFileFromScratch(aRequest, share, file); - } - // //Store UID - /* - TUid uid; - uid.iUid = KErrUnknown; - if(aRequest && aRequest->Operation()->iFunction == EFsFileWriteDirty) - { - uid = aRequest->iUID; - } - else if(aRequest) - { - uid = aRequest->Message().Identity(); - } - memcpy((TText8*)aBlock.Data()+writeOffset,&uid.iUid,sizeof(TUint32)); + memcpy((TText8*)aBlock.Data()+writeOffset,&aRequest->Uid().iUid,sizeof(TUint32)); writeOffset+=sizeof(TUint32); - */ + if(!overflow) { //Store Name (Word3) - memcpy((TText8*)aBlock.Data()+writeOffset,aName.Ptr(),aName.Size()); - writeOffset += Align4(aName.Size()); - + { + //Store driveColon + if(aRequest->NotificationType()!=TFsNotification::EMediaChange) + { + memcpy((TText8*)aBlock.Data()+writeOffset,driveBuf.Ptr(),driveBuf.Size()); + writeOffset += driveBuf.Size(); //NB: Not Align4'd deliberately. + } + memcpy((TText8*)aBlock.Data()+writeOffset,aRequest->Source().FullName().Ptr(),aRequest->Source().FullName().Size()); + writeOffset += Align4(aRequest->Source().FullName().Size()); + } - switch (aNotificationType) + switch (aRequest->NotificationType()) { case TFsNotification::EFileChange: + case TFsNotification::EAttribute: { - TInt64 size = 0; - size = file->CachedSize64(); - memcpy((TText8*)aBlock.Data()+writeOffset,&size,sizeof(TInt64)); + memcpy((TText8*)aBlock.Data()+writeOffset,aRequest->Data(),sizeof(TInt64)); writeOffset += sizeof(TInt64); break; } @@ -1022,20 +765,19 @@ case TFsNotification::EDriveName: { //Store NewName - memcpy((TText8*)aBlock.Data()+writeOffset,newName.Ptr(),newName.Size()); - writeOffset += Align4(newName.Size()); + + if(!aRequest->DestDriveIsSet()) + { + //This means that the notification has come from a Mount rather than from FileServer + //It also means that the new name will have the same drive letter as the source. + memcpy((TText8*)aBlock.Data()+writeOffset,driveBuf.Ptr(),driveBuf.Size()); + writeOffset += driveBuf.Size(); //NB: Not Align4'd deliberately. + } + memcpy((TText8*)aBlock.Data()+writeOffset,aRequest->NewName().FullName().Ptr(),aRequest->NewName().FullName().Size()); + writeOffset += Align4(aRequest->NewName().FullName().Size()); break; } - case TFsNotification::EAttribute: - { - TUint set=0; - TUint clear=0; - FsNotificationHelper::Attributes(*aRequest,set,clear); - TUint64 att = MAKE_TUINT64(set,clear); - memcpy((TText8*)aBlock.Data()+writeOffset,&att,sizeof(TUint64)); - writeOffset += sizeof(TUint64); - break; - } + default: { break; @@ -1085,107 +827,71 @@ //A change has occurred in f32 represented by this //request object. Work out which CfsNotify’s are interested // (if any) and call CfsNotifyRequest::NotifyChange. -void FsNotificationManager::HandleChange(CFsClientMessageRequest* aRequest,const TDesC& aOperationName, TFsNotification::TFsNotificationType aType) - { - __PRINT2(_L("FsNotificationManager::HandleChange() aRequest=0x%x, aType=%d"),&aRequest,aType); - - Lock(); //ToDo: Read Lock (Read/Write Lock) - if(Count()) - { - //Only search while there are filters of this type set up. - TInt index = FsNotificationHelper::TypeToIndex(aType); - TInt& filterCount = FsNotificationManager::FilterRegister(index); - TInt seenFilter = filterCount; //Number of requests set up for this type - - //Iterate CFsNotifyRequests - TInt count = iNotifyRequests->Count(); - - if(aType == TFsNotification::EMediaChange) - seenFilter = count; - - //If there aren't any requests then breakout - if(count == 0) - { - Unlock(); - return; - } - - TInt driveNum = FsNotificationHelper::DriveNumber(aOperationName); +void FsNotificationManager::HandleChange(CFsNotificationInfo& aRequest) + { + __PRINT2(_L("FsNotificationManager::HandleChange() aNotificationInfo=0x%x,NotificationType=%d"),&aRequest,aRequest.NotificationType()); + if(Count()) + { + Lock(); //ToDo: Read Lock (Read/Write Lock) + if(Count()) + { + //Only search while there are filters of this type set up. + TInt index = CFsNotificationInfo::TypeToIndex(aRequest.NotificationType()); + TInt& filterCount = FsNotificationManager::FilterRegister(index); + TInt seenFilter = filterCount; //Number of requests set up for this type + + //Iterate CFsNotifyRequests + TInt count = iNotifyRequests->Count(); + + if(aRequest.NotificationType() == TFsNotification::EMediaChange) + seenFilter = count; + + //If there aren't any requests then breakout + if(count == 0) + { + Unlock(); + return; + } + + //For every notification request(i.e. every CFsNotify client-side). + for(TInt i=0; iActiveStatus(); + if(! (status==CFsNotifyRequest::EActive || + status==CFsNotifyRequest::EOutstanding)) + { + //Not active; check next notification request + continue; + } + + //Check whether we are interested in this change. + //Get the filters associated with this operation on this drive + TFsNotificationTypeArray* filterList = notifyRequest->FilterTypeList(aRequest.DriveNumber(),index); + DoHandleChange(filterList,seenFilter,aRequest,notifyRequest); - //For every notification request. - for(TInt i=0; iActiveStatus(); - if(! (status==CFsNotifyRequest::EActive || - status==CFsNotifyRequest::EOutstanding)) - { - //Not active; check next notification request - continue; - } - - //Check whether we are interested in this change. - //Get the filters associated with this operation on this drive - TFsNotificationTypeArray* filterList = notifyRequest->FilterTypeList(driveNum,index); - DoHandleChange(filterList,seenFilter,aRequest,notifyRequest,aOperationName,aType); - - if(aType==TFsNotification::EMediaChange) - continue; //next request - - //If there are still filters to check - if(seenFilter) - { - //Check changes that are not tied to a particular drive - filterList = notifyRequest->FilterTypeList(KErrNotFound,index); - DoHandleChange(filterList,seenFilter,aRequest,notifyRequest,aOperationName,aType); - } - } - } - Unlock(); - } - -//A change has occurred in f32 represented by this -//request object. Work out which CfsNotify’s are interested -// (if any) and call CfsNotifyRequest::NotifyChange. -void FsNotificationManager::HandleChange(CFsClientMessageRequest& aRequest, TFsNotification::TFsNotificationType aType) - { - __PRINT(_L("FsNotificationManager::HandleChange")); - TFileName currentOperationsName; - FsNotificationHelper::PathName(aRequest, currentOperationsName); - if(currentOperationsName.Length()) - HandleChange(&aRequest,currentOperationsName,aType); - } - -//A change has occurred in f32 represented by this -//request object. Work out which CfsNotify’s are interested -// (if any) and call CfsNotifyRequest::NotifyChange. -void FsNotificationManager::HandleChange(CFsClientMessageRequest& aRequest) - { - if(Count() && aRequest.Message().Handle() != KLocalMessageHandle) - { - __PRINT(_L("FsNotificationManager::HandleChange")); - TFsNotification::TFsNotificationType operationNotificationType; - FsNotificationHelper::NotificationType(aRequest.FsFunction(), operationNotificationType); - HandleChange(aRequest,operationNotificationType); - } - } + if(aRequest.NotificationType()==TFsNotification::EMediaChange) + continue; //next request + + //If there are still filters to check + if(seenFilter) + { + //Check changes that are not tied to a particular drive + filterList = notifyRequest->FilterTypeList(KErrNotFound,index); + DoHandleChange(filterList,seenFilter,aRequest,notifyRequest); + } + } + } + Unlock(); + } + } //// #else //// -void FsNotificationManager::HandleChange(CFsClientMessageRequest* ,const TDesC&, TFsNotification::TFsNotificationType) - { - return; - } - -void FsNotificationManager::HandleChange(CFsClientMessageRequest& , TFsNotification::TFsNotificationType) - { - return; - } - -void FsNotificationManager::HandleChange(CFsClientMessageRequest&) +void FsNotificationManager::HandleChange(CFsNotificationInfo&) { return; } @@ -1193,10 +899,11 @@ #endif //SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION //Called from FsNotificationManager::DoHandleChange -FsNotificationManager::TFsNotificationFilterMatch FsNotificationManager::DoMatchFilter(CFsClientMessageRequest* aRequest, const TDesC& aOperationName,CFsNotificationPathFilter& aFilter) +FsNotificationManager::TFsNotificationFilterMatch FsNotificationManager::DoMatchFilter(const RMessage2& aMessage, const TDesC& aOperationName,CFsNotificationPathFilter& aFilter) { TFsNotificationFilterMatch filterMatch = EDifferent; TParsePtrC parseOp(aOperationName); + TPtrC pathOpDes = parseOp.DriveAndPath(); TPtrC nameOpDes = parseOp.NameAndExt(); TInt pathLength = aFilter.iPath->Des().Length(); @@ -1210,7 +917,7 @@ else //if no path filter was set up // then we need to ensure we don't notify on data-caged areas which we shouldn't { - TInt r = PathCheck(aRequest,aOperationName.Mid(2),&KCapFsSysFileTemp,&KCapFsPriFileTemp,&KCapFsROFileTemp, __PLATSEC_DIAGNOSTIC_STRING("FsNotificationManager::DoHandleChange")); + TInt r = PathCheck(aMessage,aOperationName.Mid(2),&KCapFsSysFileTemp,&KCapFsPriFileTemp,&KCapFsROFileTemp, __PLATSEC_DIAGNOSTIC_STRING("FsNotificationManager::DoHandleChange")); if(r != KErrNone) return EContinue; //next filter } @@ -1228,8 +935,9 @@ return filterMatch; } -// This is called on a per drive basis. -void FsNotificationManager::DoHandleChange(TFsNotificationTypeArray* aFilterTypeArray,TInt& aSeenFilter, CFsClientMessageRequest* aRequest, CFsNotifyRequest* aNotifyRequest, const TDesC& aOperationName, TFsNotification::TFsNotificationType& aType) +// The aFilterTypeArray is an array for the filters that target the current drive (only). +// This is called on a per client (CFsNotify) basis. +void FsNotificationManager::DoHandleChange(TFsNotificationTypeArray* aFilterTypeArray,TInt& aSeenFilter, CFsNotificationInfo& aNotificationInfo, CFsNotifyRequest* aNotifyRequest) { __PRINT(_L("FsNotificationManager::DoHandleChange()")); @@ -1238,36 +946,39 @@ TInt numFilters = aFilterTypeArray->Count(); - if(aType == TFsNotification::EMediaChange) - numFilters = 1; //Only need to notify once per drive. - - //For every filter in this request + if(aNotificationInfo.NotificationType() == TFsNotification::EMediaChange) + numFilters = 1; //Only need to notify once per client for EMediaChange. + + //For every filter in this request (CFsNotify) for(TInt j = 0; j < numFilters;++j) { //Is the correct notification type aSeenFilter--; TBool filterMatch = EDifferent; - if(aType != TFsNotification::EMediaChange) + if(aNotificationInfo.NotificationType() != TFsNotification::EMediaChange) { CFsNotificationPathFilter& filter = *(((*aFilterTypeArray)[j]).iPathFilter); - __PRINT2(_L("FsNotificationManager::DoHandleChange() operationName=%S, filterName=%S"),&aOperationName,filter.iPath); - - filterMatch = DoMatchFilter(aRequest,aOperationName,filter); + __PRINT2(_L("FsNotificationManager::DoHandleChange() operationName=%S, filterName=%S"),&aNotificationInfo.Source().FullName(),filter.iPath); + + //buferMsg here is the message of the client *recieving* the notification + const RMessage2& bufferMsg = aNotifyRequest->BufferMessage(); + filterMatch = DoMatchFilter(bufferMsg,aNotificationInfo.Source().FullName(),filter); if(filterMatch == FsNotificationManager::EContinue) continue; //triggers for data cages //We need to check for changes coming in to a directory when its rename - if(aType == TFsNotification::ERename && filterMatch==FsNotificationManager::EDifferent) + if(aNotificationInfo.NotificationType() == TFsNotification::ERename && filterMatch==FsNotificationManager::EDifferent) { - TPtrC aDestinationNamePtrC; - FsNotificationHelper::NewPathName(*aRequest,aDestinationNamePtrC); - __PRINT2(_L("FsNotificationManager::DoHandleChange() destinationName=%S, filterName=%S"),&aDestinationNamePtrC,filter.iPath); - filterMatch = DoMatchFilter(aRequest,aDestinationNamePtrC,filter); + __PRINT2(_L("FsNotificationManager::DoHandleChange() destinationName=%S, filterName=%S"),&aNotificationInfo.NewName().FullName(),filter.iPath); + if(aNotificationInfo.DestDriveIsSet()) + filterMatch = DoMatchFilter(bufferMsg,aNotificationInfo.NewName().FullName().Mid(2),filter); + else + filterMatch = DoMatchFilter(bufferMsg,aNotificationInfo.NewName().FullName(),filter); } } - if(filterMatch || (aType == TFsNotification::EMediaChange))//Match or MediaChange (report regardless of filters) + if(filterMatch || (aNotificationInfo.NotificationType() == TFsNotification::EMediaChange))//Match or MediaChange (report regardless of filters) { //Matching - Handle change @@ -1275,7 +986,7 @@ //So that we can do IPC from a single place. CFsNotificationBlock* block = iPool->Allocate(); - TInt r = aNotifyRequest->NotifyChange(aRequest,aOperationName,aType,*block); + TInt r = aNotifyRequest->NotifyChange(&aNotificationInfo,*block); //Free block iPool->Free(block); diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/sfile/sf_notifier.h --- a/userlibandfileserver/fileserver/sfile/sf_notifier.h Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_notifier.h Mon Nov 01 20:11:36 2010 +0000 @@ -51,12 +51,13 @@ class CFsNotificationPathFilter { public: - static CFsNotificationPathFilter* NewL(const TDesC& aPath, const TDesC& aFilename); + static CFsNotificationPathFilter* NewL(const TDesC& aPath, const TDesC& aFilename, TInt aDriveNum); ~CFsNotificationPathFilter(); private: - void ConstructL(const TDesC& aPath, const TDesC& aFilename); + void ConstructL(const TDesC& aPath, const TDesC& aFilename, TInt aDriveNum); CFsNotificationPathFilter(); public: + TInt iDriveNum; HBufC* iPath; HBufC* iFilename; }; @@ -119,7 +120,7 @@ /* * Returns the RArray for an index - * as returned from FsNotificationHelper::TypeToIndex() + * as returned from CFsNotificationInfo::TypeToIndex() */ TFsNotificationTypeArray* FilterTypeList(TInt aDrive,TInt aIndex); @@ -157,11 +158,8 @@ * notification of this operation to the client. * * Calling of this function means that we are notifying about this operation. (all checks passed) - * - * aRequest can be NULL when the request doesn't come from the file server - * (such as when a media card is removed) */ - TInt NotifyChange(CFsClientMessageRequest* aRequest, const TDesC& aName, TFsNotification::TFsNotificationType aNotificationType, CFsNotificationBlock& aBlock); + TInt NotifyChange(CFsNotificationInfo* aRequest, CFsNotificationBlock& aBlock); /* * This function performs the IPC to the client's buffer. @@ -174,6 +172,9 @@ //Simple getter TInt ClientMsgHandle(); + //Platsec needs to check against the path with a message of the *receiving* client. + const RMessage2& BufferMessage(); + private: CFsNotifyRequest(); void ConstructL(); @@ -216,15 +217,7 @@ * Each index of the TFsNotificationTypeDriveArray is a TFsNotificationTypeArray */ RHashMap iDrivesTypesFiltersMap; - - /* - * The iPathFilterList is an RPointerArray of CFsNotificationPathFilters. - * - * These are normally only accessed via a TFsNotificationTypeFilter (via iDrivesTypesFiltersMap), - * not via this array directly. - */ - RPointerArray iPathFilterList; - + RMessage2 iBufferMsg; //To update buffer RMessage2 iClientMsg; //client notification request @@ -270,24 +263,6 @@ }; /** - * Helper class to get certain attributes from or about a particular operation to used in a notification - * - * @internalTechnology - */ -class FsNotificationHelper - { -public: - static void NotificationType(TInt aFunction,TFsNotification::TFsNotificationType& aNotificationType); - static void PathName(CFsClientMessageRequest& aRequest, TDes& aName); - static void NewPathName(CFsClientMessageRequest& aRequest, TPtrC& aName); - static TInt NotificationSize(CFsClientMessageRequest& aRequest, TFsNotification::TFsNotificationType aNotificationType, const TDesC& aName); - static TInt TypeToIndex(TFsNotification::TFsNotificationType aType); - static TFsNotification::TFsNotificationType NotificationType(TInt& aIndex); - static TInt DriveNumber(const TPtrC& aPath); - static void Attributes(CFsClientMessageRequest& aRequest, TUint& aSet, TUint& aClear); - }; - -/** * The FsNotificationManager is a static object * *@internalTechnology @@ -307,26 +282,8 @@ * Work out which CFsNotifyRequests are interested * (if any) and call CFsNotifyRequest::NotifyChange. */ - static void HandleChange(CFsClientMessageRequest& aRequest); - - /* A change has occurred represented by this request. - * Work out which CFsNotifyRequests are interested - * (if any) and call CFsNotifyRequest::NotifyChange. - * - * This override is used directly when we want to force a particular notification type - */ - static void HandleChange(CFsClientMessageRequest& aRequest, TFsNotification::TFsNotificationType aType); + static void HandleChange(CFsNotificationInfo& aRequest); - /* - * This override is used directly when we want to specify the current operation's name (src) and notification type. - * - * aRequest can be NULL when the request doesn't come from the file server - * such as when a media card is removed, see LocalDrives::CompleteDriveNotifications - * - * @See LocalDrives::CompleteDriveNotifications(TInt aDrive) - */ - static void HandleChange(CFsClientMessageRequest* aRequest, const TDesC& aOperationName, TFsNotification::TFsNotificationType aType); - //Initialise iNotifyRequests and iStaticNotification static void OpenL(); static TBool IsInitialised(); @@ -350,7 +307,7 @@ static void SetFilterRegister(TUint aFilter, TBool aAdd, TInt aCount = 1); /* * Get the number of registers filters set up on a particular type. - * @param aIndex the TFsNotificationType's index as determined from FsNotificationHelper::TypeToIndex + * @param aIndex the TFsNotificationType's index as determined from CFsNotificationInfo::TypeToIndex */ static TInt& FilterRegister(TInt aIndex); @@ -386,13 +343,13 @@ /* * Checks whether aOperation matches the filter name and/or path set in aFilter. */ - static TFsNotificationFilterMatch DoMatchFilter(CFsClientMessageRequest* aRequest, const TDesC& aOperationName,CFsNotificationPathFilter& aFilter); + static TFsNotificationFilterMatch DoMatchFilter(const RMessage2& aMessage, const TDesC& aOperationName,CFsNotificationPathFilter& aFilter); /* * Iterates filters for a particular drive. * Called from HandleChange */ - static void DoHandleChange(TFsNotificationTypeArray* aFilterTypeArray, TInt& aSeenFilter, CFsClientMessageRequest* aRequest, CFsNotifyRequest* aNotifyRequest, const TDesC& aOperationName, TFsNotification::TFsNotificationType& aType); + static void DoHandleChange(TFsNotificationTypeArray* aFilterTypeArray, TInt& aSeenFilter, CFsNotificationInfo& aNotificationInfo, CFsNotifyRequest* aNotifyRequest); /* * Stores the CFsNotifyRequests diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/sfile/sf_notifier_handlers.cpp --- a/userlibandfileserver/fileserver/sfile/sf_notifier_handlers.cpp Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_notifier_handlers.cpp Mon Nov 01 20:11:36 2010 +0000 @@ -261,7 +261,7 @@ } if(path.Length() >= 2) - r=PathCheck(aRequest,path.Mid(2),&KCapFsSysFileTemp,&KCapFsPriFileTemp,&KCapFsROFileTemp, __PLATSEC_DIAGNOSTIC_STRING("Notification Add Filter")); + r=PathCheck(aRequest->Message(),path.Mid(2),&KCapFsSysFileTemp,&KCapFsPriFileTemp,&KCapFsROFileTemp, __PLATSEC_DIAGNOSTIC_STRING("Notification Add Filter")); return r; } @@ -284,14 +284,32 @@ __PRINT2(_L("TFsNotificationAdd::AddNotification() path=%S, filename=%S"),&path,&filename); //If this is a path starting with 'drive-letter:' - TInt driveNum = FsNotificationHelper::DriveNumber(path); - if(path.Length() >= 2 && (driveNum < 0 || driveNum > 25) && ((TChar)driveNum)!=((TChar)'?') && ((TChar)path[1])==(TChar)':') - { - return KErrPathNotFound; - } + TInt driveNum = CFsNotificationInfo::DriveNumber(path); + if(path.Length() >= 2) + { + if(path[1] != (TText)':') + { + if(path[0]!=(TText)'*') + { + return KErrPathNotFound; + } + } + else // 2nd char is ':' + { + if(driveNum < EDriveA || driveNum > EDriveZ) + { + if(path[0]!=(TText)'?') + return KErrPathNotFound; + } + } + } CleanupStack::PushL(notifyRequest); - CFsNotificationPathFilter* filter = CFsNotificationPathFilter::NewL(path,filename); + TPtrC pathPtr(path); + if(driveNum!=KErrNotFound || ((path.Length() >=1) && path[0]=='?')) + //Remove the drive: part of the the path if it's got one. + pathPtr.Set(path.Mid(2)); + CFsNotificationPathFilter* filter = CFsNotificationPathFilter::NewL(pathPtr,filename,driveNum); //Bitmask of filter types TUint filterMask = (TUint) aRequest->Message().Int0(); diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/sfile/sf_notify.cpp --- a/userlibandfileserver/fileserver/sfile/sf_notify.cpp Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_notify.cpp Mon Nov 01 20:11:36 2010 +0000 @@ -16,14 +16,866 @@ // #include "sf_std.h" +#include "sf_notifier.h" +#include "sf_pool.h" - +#ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION +#include +#endif TChangeQue FsNotify::iChangeQues[KMaxNotifyQues]; TDiskSpaceQue FsNotify::iDiskSpaceQues[KMaxDiskQues]; TDebugQue FsNotify::iDebugQue; TDismountNotifyQue FsNotify::iDismountNotifyQue; +_LIT(KEmptyString,""); + +CFsNotificationInfoBody::CFsNotificationInfoBody() +: iSrc(KEmptyString), + iSrcBuf(KEmptyString), + iDest(KEmptyString), + iDestDriveStored(EFalse), + iFunction(KErrNotFound), + iData(KErrNotFound), +#ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION + iNotificationType(TFsNotification::EOverflow), +#else + iNotificationType(KErrNotFound), +#endif + iUid(TUid::Null()) + { + } + +CFsNotificationInfo::CFsNotificationInfo() + { + } + +/* + * These do not get deleted, they get Freed via CFsNotificationInfo::Free. + */ +CFsNotificationInfo::~CFsNotificationInfo() + { + Fault(ENotificationInfoDeletion); + } + +TInt CFsNotificationInfo::Init(TInt aFunction, TInt aDriveNum) + { + //Clean notification before use + CleanNotification(); + + iBody->iFunction = aFunction; + TInt err = SetDriveNumber(aDriveNum); + if(err != KErrNone) + { + return err; + } + + //Set notification type +#ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION + CFsNotificationInfo::NotificationType(iBody->iFunction, iBody->iNotificationType); +#else + iBody->iNotificationType = KErrNotSupported; +#endif + return KErrNone; + } + +void CFsNotificationInfo::CleanNotification() + { + //Clear all variables + TParsePtrC empty(KEmptyString); + memcpy(&iBody->iSrc,&empty,sizeof(TParsePtrC)); + memcpy(&iBody->iDest,&empty,sizeof(TParsePtrC)); + iBody->iData = KErrNotFound; + iBody->iRequest = NULL; + iBody->iDriveNumber = KErrNotFound; + iBody->iUid = TUid::Null(); + iBody->iDestDriveStored = EFalse; +#ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION + iBody->iNotificationType=TFsNotification::EOverflow; +#else + iBody->iNotificationType=KErrNotFound; +#endif + } + +EXPORT_C CFsNotificationInfo* CFsNotificationInfo::Allocate(const CMountCB& aMount, TInt aFunction) + { + CFsNotificationInfo* info = NotificationInfoPool->Allocate(); + __ASSERT_DEBUG(info,User::Panic(_L("CFsNotificationInfo::Allocate, Could not allocate"),KErrNotFound)); + + TInt driveNum = aMount.Drive().DriveNumber(); + __ASSERT_ALWAYS((driveNum >= EDriveA && driveNum <= EDriveZ), User::Panic(_L("CFsNotificationInfo::Allocate - Invalid Drive Num"),KErrArgument)); + TInt err = info->Init(aFunction,driveNum); + if(err != KErrNone) + { + Free(info); + return NULL; + } + return info; + } + + +CFsNotificationInfo* CFsNotificationInfo::Allocate(CFsMessageRequest& aRequest) + { + //Get a notification Info block from the pool. + CFsNotificationInfo* notificationInfo = NotificationInfoPool->Allocate(); + + //Set the function and call Init. + TInt function = aRequest.Operation()->Function(); + notificationInfo->iBody->iFunction = function; + TInt err = notificationInfo->Init(function,aRequest.DriveNumber()); + if(err != KErrNone) + { + CFsNotificationInfo::Free(notificationInfo); + return NULL; + } + + //Set request + notificationInfo->SetRequest(&aRequest); + + //Set UID + notificationInfo->SetUid(aRequest.Uid()); + + //Set notification type +#ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION + CFsNotificationInfo::SetData(&aRequest,notificationInfo); +#endif + + CFsClientMessageRequest& msgRequest = (CFsClientMessageRequest&)aRequest; + + //Get and store Src + CFsNotificationInfo::PathName(msgRequest,notificationInfo->Source()); + + //Get and store NewName/Dest + switch(function) + { + case EFsFileRename: + case EFsRename: + case EFsReplace: + case EFsSetDriveName: + case EFsSetVolume: + { + CFsNotificationInfo::NewPathName((CFsClientMessageRequest&)aRequest,notificationInfo->NewName()); + notificationInfo->iBody->iDestDriveStored = ETrue; + } + default: + break; + } + return notificationInfo; + } + +CFsNotificationInfo* CFsNotificationInfo::Allocate(TInt aFunction, TInt aDrive) + { + //Get a notification Info block from the pool. + CFsNotificationInfo* notificationInfo = NotificationInfoPool->Allocate(); + + //Set the function and call Init. + notificationInfo->iBody->iFunction = aFunction; + TInt err = notificationInfo->Init(aFunction,aDrive); + if(err != KErrNone) + { + CFsNotificationInfo::Free(notificationInfo); + return NULL; + } + + //Set request (NULL) + notificationInfo->SetRequest(NULL); + + //Set UID (KNullUid) + notificationInfo->SetUid(TUid::Null()); + return notificationInfo; + } + +EXPORT_C void CFsNotificationInfo::Free(CFsNotificationInfo*& aNotificationInfo) + { + __ASSERT_DEBUG(aNotificationInfo,User::Panic(_L("CFsNotificationInfo::Free - KErrArgument"), KErrArgument)); + NotificationInfoPool->Free(aNotificationInfo); + aNotificationInfo = NULL; + } + + +TInt CFsNotificationInfo::Initialise() + { + //Have to trap as sf_main.cpp commonInitialize doesn't. + TRAPD(r, NotificationInfoPool = CFsPool::New(KMaxDrives,CFsNotificationInfo::New)); + if(r != KErrNone) + return r; + if(!NotificationInfoPool) + return KErrNoMemory; + return KErrNone; + } + +CFsNotificationInfo* CFsNotificationInfo::New() + { + CFsNotificationInfo* info = new CFsNotificationInfo; + __ASSERT_ALWAYS(info,Fault(ENotifyPoolCreation)); + info->iBody = new CFsNotificationInfoBody(); + __ASSERT_ALWAYS(info->iBody,Fault(ENotifyPoolCreation)); + return info; + } + +EXPORT_C TInt CFsNotificationInfo::SetSourceName(const TDesC& aSrc) + { + //Add the aSrc to a TParsePtrC (no copying the filename) + TParsePtrC sourceParsePtr(aSrc); + + if(sourceParsePtr.DrivePresent() || !sourceParsePtr.FullName().Length()) + return KErrArgument; + + switch(iBody->iFunction) + { + + case EFsFileWrite: //EParseSrc | EFileShare + case EFsFileSetSize: //EParseSrc | EFileShare + case EFsFileSetAtt: //EParseDst | EParseSrc, - should not use these; has share. + case EFsFileSet: //EParseSrc | EFileShare + case EFsFileSetModified: //EParseSrc | EFileShare - new + case EFsFileWriteDirty: //EFileShare + case EFsFileCreate: //EParseSrc + case EFsFileTemp: //EParseSrc - new + case EFsFileRename: //EParseDst | EParseSrc, + case EFsFileReplace: //EParseSrc + { + //Should look like this: \[path\]filename + if(!sourceParsePtr.Name().Length()) + { + return KErrArgument; + } + break; + } + case EFsDelete: //EParseSrc + case EFsSetEntry: //EParseSrc, + case EFsRename: //EParseDst | EParseSrc, + case EFsReplace: //EParseDst | EParseSrc, + { + if(!sourceParsePtr.PathPresent() && !sourceParsePtr.NamePresent()) + { + return KErrArgument; + } + break; + } + case EFsRmDir: //EParseSrc + case EFsMkDir: //EParseSrc + { + if(!sourceParsePtr.PathPresent()) + { + return KErrArgument; + } + break; + } + /*case EFsFormatNext: //EParseSrc + case EFsDismountFileSystem: //0 + case EFsMountFileSystem: //0 + case EFsSetVolume: //0 + case EFsSetDriveName: //ESync + case EFsRawDiskWrite: //EParseSrc + case EFsMountFileSystemScan: */ + default: + { + __ASSERT_DEBUG(EFalse,User::Panic(_L("CFsNotificationInfo::SetSourceName Invalid Operation"),KErrArgument)); + return KErrNotSupported; + } + } + memcpy(&iBody->iSrc,&sourceParsePtr,sizeof(TParsePtrC)); + return KErrNone; + } + +EXPORT_C TInt CFsNotificationInfo::SetNewName(const TDesC& aDest) + { + //Add the aSrc to a TParsePtr for some validation without copying the filename + TParsePtrC destParsePtr(aDest); + + if(destParsePtr.DrivePresent() || !destParsePtr.FullName().Length()) + return KErrArgument; + + switch(iBody->iFunction) + { + case EFsFileRename: //EParseDst | EParseSrc, + case EFsRename: //EParseDst | EParseSrc, + case EFsReplace: //EParseDst | EParseSrc, + { + if(!destParsePtr.PathPresent() && !destParsePtr.NamePresent()) + { + return KErrArgument; + } + break; + } + case EFsSetDriveName: + case EFsSetVolume: + { + if(!destParsePtr.NamePresent()) + { + return KErrArgument; + } + break; + } + default: + { + __ASSERT_DEBUG(ETrue,User::Panic(_L("CFsNotificationInfo::SetNewName Invalid Operation"),KErrArgument)); + } + } + + memcpy(&iBody->iDest,&destParsePtr,sizeof(TParsePtrC)); + return KErrNone; + } + +EXPORT_C TInt CFsNotificationInfo::SetFilesize(TInt64 aFilesize) + { + if(aFilesize<0) + return KErrArgument; + + iBody->iData = aFilesize; + return KErrNone; + } +EXPORT_C TInt CFsNotificationInfo::SetAttributes(TUint aSet,TUint aCleared) + { + iBody->iData = MAKE_TUINT64(aSet,aCleared); + return KErrNone; + } + +EXPORT_C TInt CFsNotificationInfo::SetUid(const TUid& aUid) + { + iBody->iUid = aUid; + return KErrNone; + } + + +TInt CFsNotificationInfo::SetDriveNumber(TInt aDriveNumber) + { + if(aDriveNumber >= EDriveA && aDriveNumber <= EDriveZ) + { + iBody->iDriveNumber = aDriveNumber; + return KErrNone; + } + return KErrArgument; + } +void CFsNotificationInfo::SetRequest(CFsRequest* aRequest) + { + iBody->iRequest = aRequest; + } +TInt CFsNotificationInfo::Function() + { return iBody->iFunction; } +TInt CFsNotificationInfo::DriveNumber() + { return iBody->iDriveNumber; } +TParsePtrC& CFsNotificationInfo::Source() + { + switch(iBody->iFunction) + { + case EFsFormatNext: //EParseSrc + case EFsDismountFileSystem: //0 + case EFsMountFileSystem: //0 + case EFsSetVolume: //0 + case EFsSetDriveName: //ESync + case EFsRawDiskWrite: //EParseSrc + case EFsMountFileSystemScan: + { + _LIT(KFormatDrive,"?:"); + iBody->iSrcBuf = KFormatDrive; + iBody->iSrcBuf[0] = TText(DriveNumber() + 'A'); + TParsePtrC parse(iBody->iSrcBuf); + memcpy(&iBody->iSrc,&parse,sizeof(TParsePtrC)); + } + } + return iBody->iSrc; + } +TParsePtrC& CFsNotificationInfo::NewName() + { return iBody->iDest; } +CFsRequest* CFsNotificationInfo::Request() + { return iBody->iRequest; } +TInt64* CFsNotificationInfo::Data() + { return &iBody->iData; } +TUid& CFsNotificationInfo::Uid() + { return iBody->iUid; } +TNotificationType& CFsNotificationInfo::NotificationType() + { return iBody->iNotificationType; } +TBool CFsNotificationInfo::DestDriveIsSet() + { return iBody->iDestDriveStored; } +TInt CFsNotificationInfo::SourceSize() + { + TInt size = Source().FullName().Size(); + if(NotificationType()!=TFsNotification::EMediaChange && + NotificationType()!=TFsNotification::EDriveName && + NotificationType()!=TFsNotification::EVolumeName) + { + size += sizeof(TText)*2; + } + return size; + } +TInt CFsNotificationInfo::NewNameSize() + { + TInt size = NewName().FullName().Size(); + if(!DestDriveIsSet()) + size += sizeof(TText)*2; + return size; + } + +//Get the path of the file, folder or drive name based on the TFsMessage function +void CFsNotificationInfo::PathName(CFsClientMessageRequest& aRequest, TParsePtrC& aPath) + { + __PRINT(_L("CFsNotificationInfo::PathName")); + //Get the notification type + TInt function = aRequest.Operation()->Function(); + + //Get the filename(s) + switch(function) + { + case EFsFileWrite: //EParseSrc | EFileShare + case EFsFileSetSize: //EParseSrc | EFileShare + case EFsFileSetAtt: //EParseDst | EParseSrc, - should not use these; has share. + case EFsFileSet: //EParseSrc | EFileShare + case EFsFileSetModified: //EParseSrc | EFileShare - new + case EFsFileWriteDirty: //EFileShare + { + CFileShare* share = NULL; + CFileCB* file = NULL; + GetFileFromScratch(&aRequest,share,file); + TParsePtrC ptrC(file->iFileName->Des()); + memcpy(&aPath,&ptrC,sizeof(TParsePtrC)); + break; + } + case EFsFileCreate: //EParseSrc + case EFsFileTemp: //EParseSrc - new + case EFsDelete: //EParseSrc + case EFsSetEntry: //EParseSrc, + case EFsFileRename: //EParseDst | EParseSrc, + case EFsRename: //EParseDst | EParseSrc, + case EFsReplace: //EParseDst | EParseSrc, + case EFsFileReplace: //EParseSrc + { + TParsePtrC parsePtrC(aRequest.Src().FullName().Mid(2)); //Don't want drive letter + memcpy(&aPath,&parsePtrC,sizeof(TParsePtrC)); + break; + } + case EFsRmDir: //EParseSrc + case EFsMkDir: //EParseSrc + { + TParsePtrC parsePtrC(aRequest.Src().Path()); + memcpy(&aPath,&parsePtrC,sizeof(TParsePtrC)); + break; + + //aPath.Set(aRequest.Src().DriveAndPath(),NULL,NULL); + //break; + } + case EFsFormatNext: //EParseSrc + case EFsDismountFileSystem: //0 + case EFsMountFileSystem: //0 + case EFsSetVolume: //0 + case EFsSetDriveName: //ESync + case EFsRawDiskWrite: //EParseSrc + case EFsLockDrive: + case EFsUnlockDrive: + case EFsReserveDriveSpace: + case EFsMountFileSystemScan: + { + break; + } + default: + ASSERT(0); + break; + } + } + +//Get the new path of the file, folder or drive name based on the TFsMessage function +void CFsNotificationInfo::NewPathName(CFsClientMessageRequest& aRequest, TParsePtrC& aNewPath) + { + __PRINT(_L("CFsNotificationInfo::NewPathName")); + //Get the notification type + TInt function = aRequest.Operation()->Function(); + + //Get the filename(s) + switch(function) + { + case EFsFileRename: //EParseDst | EParseSrc, + case EFsRename: //EParseDst | EParseSrc, + case EFsReplace: //EParseDst | EParseSrc, + { + //We must provide the drive letter too as in the case + //of the file being monitored being renamed to a + //different drive. + //In that case we need to provide the new drive letter to the client. + TParsePtrC ptrC(aRequest.Dest().FullName()); + memcpy(&aNewPath,&ptrC,sizeof(TParsePtrC)); + break; + } + case EFsSetVolume: //EParseDst + case EFsSetDriveName: //ESync | EParseDst + { + TParsePtrC ptrC(aRequest.Dest().FullName()); + memcpy(&aNewPath,&ptrC,sizeof(TParsePtrC)); + break; + } + default: + { + ASSERT(0); + } + } + } + +//Get the size of the notification based on its type +TInt CFsNotificationInfo::NotificationSize(CFsNotificationInfo& aRequest) + { + __PRINT(_L("CFsNotificationInfo::NotificationSize")); + + /* + * If there are no new names, the order of the data in the buffer is: + * Word1 : NotificationSize (2 bytes) , PathSize (2 bytes) + * Word2 : NotificationType (Lower 2 bytes) + * Word3 : UID + * Word(s) : Path (TText8) , [Any sub-class members] + * + * Else for notification types ERename, EVolumeName and EDriveName the order is: + * Word1 : NotificationSize (2 bytes) , PathSize (2 bytes) + * Word2 : NewNameSize (2 bytes) , NotificationType (2 bytes) + * Word3 : UID + * Word(s) : Path (TText8) , NewName (TText8) + * + * EOverflow size: KNotificationHeaderSize + */ + + //Size of the filename +(with ':') + TInt size = KNotificationHeaderSize + Align4(aRequest.SourceSize()); + + switch(aRequest.NotificationType()) + { + //NewName + case TFsNotification::ERename: + case TFsNotification::EVolumeName: + case TFsNotification::EDriveName: + { + if(!aRequest.NewName().FullName().Length()) + __ASSERT_ALWAYS(false,User::Panic(_L("CFsNotificationInfo::NotificationSize"),KErrArgument)); + + size += Align4(aRequest.NewNameSize()); + break; + } + case TFsNotification::EFileChange: + { + size += sizeof(TInt64); + break; + } + case TFsNotification::EAttribute: + { + size += sizeof(TUint64); + break; + } + case TFsNotification::ECreate: + case TFsNotification::EDelete: + case TFsNotification::EMediaChange: + { + break; + } + default: + { + ASSERT(0); + break; + } + } + return (TUint16) size; + } + + +TNotificationType CFsNotificationInfo::NotificationType(TInt& aIndex) + { + __PRINT(_L("CFsNotificationInfo::NotificationType(TInt)")); + __ASSERT_DEBUG(aIndex < KNumRegisterableFilters, Fault(ENotificationFault)); + + switch(aIndex) //No break statements here on purpose + { + case 7 : return TFsNotification::EMediaChange; + case 6 : return TFsNotification::EDriveName; + case 5 : return TFsNotification::EVolumeName; + case 4 : return TFsNotification::EDelete; + case 3 : return TFsNotification::EAttribute; + case 2 : return TFsNotification::ECreate; + case 1 : return TFsNotification::ERename; + case 0 : return TFsNotification::EFileChange; + default: ASSERT(0); return (TFsNotification::TFsNotificationType) 0; + } + } + +//Get the array index of the notification based on its type +TInt CFsNotificationInfo::TypeToIndex(TNotificationType aType) + { + __PRINT(_L("CFsNotificationInfo::ArrayIndex")); + + TInt index = 0; + switch(aType) //No break statements here on purpose + { + case TFsNotification::EMediaChange: index++; + case TFsNotification::EDriveName: index++; + case TFsNotification::EVolumeName: index++; + case TFsNotification::EDelete: index++; + case TFsNotification::EAttribute: index++; + case TFsNotification::ECreate: index++; + case TFsNotification::ERename: index++; + case TFsNotification::EFileChange: // skip; + default: break; + } + __ASSERT_DEBUG(index < KNumRegisterableFilters, Fault(ENotificationFault)); + return index; + } + +TInt CFsNotificationInfo::DriveNumber(const TPtrC& aPath) + { + if(aPath.Length() >= 1) + { + TInt drive; + TInt r = RFs::CharToDrive(aPath[0],drive); + if(r!=KErrNone) + return KErrNotFound; + return drive; + } + return KErrNotFound; + } + +//Get the attributes set and cleared +void CFsNotificationInfo::Attributes(CFsMessageRequest& aRequest, TUint& aSet, TUint& aClear) + { + __PRINT(_L("CFsNotificationInfo::Attributes")); + + TInt function = aRequest.Operation()->Function(); + const RMessage2& msg = aRequest.Message(); + + //Client notification + switch(function) + { + case EFsFileSet: + { + aSet = msg.Int1(); + aClear = msg.Int2(); + break; + } + case EFsFileSetAtt: + { + aSet = msg.Int0(); + aClear = msg.Int1(); + break; + } + case EFsSetEntry: + { + aSet = msg.Int2(); + aClear = msg.Int3(); + break; + } + default: + { + ASSERT(0); + break; + } + } + } + +TInt64 CFsNotificationInfo::FileSize(CFsMessageRequest& aRequest) + { + CFileShare* share = NULL; + CFileCB* file = NULL; + GetFileFromScratch(&aRequest, share, file); + TInt64 size = file->CachedSize64(); + return size; + } + + +void CFsNotificationInfo::SetData(CFsMessageRequest* aRequest, CFsNotificationInfo* aNotificationInfo) + { + TInt function = aRequest->Operation()->Function(); + + switch(function) + { + case EFsFileWrite: + case EFsFileWriteDirty: + case EFsFileSetSize: + { + aNotificationInfo->SetFilesize(FileSize(*aRequest)); + break; + } + case EFsSetEntry: + case EFsFileSetAtt: + case EFsFileSet: + { + TUint set = 0; + TUint clear = 0; + Attributes(*aRequest,set,clear); + *(aNotificationInfo->Data())= MAKE_TUINT64(set,clear); + break; + } + default: + { + return; + } + } + } + +TInt CFsNotificationInfo::ValidateNotification(CFsNotificationInfo& aNotificationInfo) + { + //Validate UID + if(aNotificationInfo.Uid() == TUid::Null()) + { + __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - Uid not set"),KErrArgument)); + return KErrArgument; + } + + switch(aNotificationInfo.Function()) + { + case EFsFileWrite: + case EFsFileWriteDirty: + case EFsFileSetSize: + { + if(*aNotificationInfo.Data() == -1) + { + __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - File size not set"),KErrArgument)); + return KErrArgument; + } + if(!aNotificationInfo.Source().FullName().Length()) + { + __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - Source Name not set"),KErrArgument)); + return KErrArgument; + } + if(aNotificationInfo.NewName().FullName().Length()) + { + __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - New Name set in err"),KErrArgument)); + return KErrArgument; + } + break; + } + case EFsRename: + case EFsFileRename: + case EFsReplace: + case EFsSetVolume: + case EFsSetDriveName: + { + if(!aNotificationInfo.Source().FullName().Length()) + { + __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - Source Name not set"),KErrArgument)); + return KErrArgument; + } + if(!aNotificationInfo.NewName().FullName().Length()) + { + __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - New Name not set"),KErrArgument)); + return KErrArgument; + } + if(*aNotificationInfo.Data() != -1) + { + __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - Data set in err"),KErrArgument)); + return KErrArgument; + } + break; + } + case EFsMkDir: + case EFsFileCreate: + case EFsFileReplace: + case EFsDelete: + case EFsRmDir: + { + if(!aNotificationInfo.Source().FullName().Length()) + { + __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - Source Name not set"),KErrArgument)); + return KErrArgument; + } + if(aNotificationInfo.NewName().FullName().Length()) + { + __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - New Name set in err"),KErrArgument)); + return KErrArgument; + } + if(*aNotificationInfo.Data() != -1) + { + __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - Data set in err"),KErrArgument)); + return KErrArgument; + } + break; + } + case EFsFileSetAtt: + case EFsFileSet: + case EFsSetEntry: + { + if(!aNotificationInfo.Source().FullName().Length()) + { + __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - Source Name not set"),KErrArgument)); + return KErrArgument; + } + if(*aNotificationInfo.Data() == -1) + { + __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - Attributes not set"),KErrArgument)); + return KErrArgument; + } + if(aNotificationInfo.NewName().FullName().Length()) + { + __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - New Name set in err"),KErrArgument)); + return KErrArgument; + } + break; + } + case EFsDismountFileSystem: + case EFsMountFileSystem: + case EFsFormatNext: + case EFsRawDiskWrite: + case EFsMountFileSystemScan: + { + if(aNotificationInfo.NewName().FullName().Length()) + { + __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - New Name set in err"),KErrArgument)); + return KErrArgument; + } + if(aNotificationInfo.Source().FullName().Length()) + { + __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - Source Name set in err"),KErrArgument)); + return KErrArgument; + } + if(*aNotificationInfo.Data() != -1) + { + __ASSERT_DEBUG(false,User::Panic(_L("::ValidateNotification - Data set in err"),KErrArgument)); + return KErrArgument; + } + break; + } + default: + { + break; + } + } + return KErrNone; + } + +TUint CFsNotificationInfo::NotifyType(TInt aFunction) +// +// Convert aFunction that caused the notification to a +// value corresponding to the correct TNotifyType enum +// + { + switch (aFunction) + { + case EFsFileCreate: + case EFsFileReplace: + case EFsDelete: + case EFsReplace: + case EFsFileRename: + return(ENotifyFile|ENotifyEntry); + case EFsMkDir: + case EFsRmDir: + return(ENotifyDir|ENotifyEntry); + case EFsRename: + return(ENotifyDir|ENotifyFile|ENotifyEntry); + case EFsSetVolume: + return(ENotifyDisk|ENotifyEntry); + case EFsFileSet: + case EFsFileSetAtt: + case EFsFileSetModified: + case EFsFileSetSize: + case EFsSetEntry: + return(ENotifyAttributes); + case EFsFileWrite: + case EFsFileWriteDirty: + return(ENotifyWrite); + case EFsRawDiskWrite: + case EFsLockDrive: + case EFsUnlockDrive: + return(ENotifyDisk); + case EFsFileTemp: + case EFsSetDriveName: + return(ENotifyAll); + default: + return(0); + } + } + void CNotifyInfo::Initialise(TInfoType aType,TRequestStatus* aStatus,const RMessagePtr2& aMessage,CSessionFs* aSession) // // @@ -67,16 +919,16 @@ CNotifyInfo::Initialise(EStdChange,aStatus,aMessage,aSession); } -TUint CStdChangeInfo::RequestNotifyType(CFsRequest* aRequest) +TUint CStdChangeInfo::RequestNotifyType(CFsNotificationInfo* aRequest) // // return notification type for the request // { - TUint notifyType=aRequest->Operation()->NotifyType(); - if(aRequest->Operation()->Function()==EFsRename) + TUint notifyType=CFsNotificationInfo::NotifyType(aRequest->Function()); + if(aRequest->Function()==EFsRename) { __ASSERT_DEBUG(notifyType==(ENotifyDir|ENotifyFile|ENotifyEntry),Fault(EStdChangeRequestType)); - if(aRequest->Src().NamePresent()) + if(aRequest->Source().NamePresent()) notifyType=ENotifyFile|ENotifyEntry; else notifyType=ENotifyDir|ENotifyEntry; @@ -84,12 +936,13 @@ return(notifyType); } -TBool CStdChangeInfo::IsMatching(CFsRequest* aRequest) + +TBool CStdChangeInfo::IsMatching(CFsNotificationInfo* aNotificationInfo) // // return ETrue if operation type of request matches that of change notification // - { - if((iChangeType&ENotifyAll) || (iChangeType&aRequest->Operation()->NotifyType())) + { + if((iChangeType&ENotifyAll) || (iChangeType&CFsNotificationInfo::NotifyType(aNotificationInfo->Function()))) return(ETrue); else return(EFalse); @@ -107,17 +960,17 @@ } -TBool CExtChangeInfo::IsMatching(CFsRequest* aRequest) +TBool CExtChangeInfo::IsMatching(CFsNotificationInfo* aRequest) // // return ETrue if operation notify type of request matches that of change notification // and paths match // - { - TInt function=aRequest->Operation()->Function(); + { + TInt function=aRequest->Function(); // if a rename occurred inform any requests if their path has been changed regardless of the notification type if(function==EFsRename) { - TBuf renamePath=aRequest->Src().FullName().Mid(2); + TBuf renamePath=aRequest->Source().FullName(); renamePath+=_L("*"); if (iName.MatchF(renamePath)!=KErrNotFound) return(ETrue); @@ -127,18 +980,14 @@ //Special case where the dir the notifier is setup on has just been created if(function==EFsMkDir) { - TInt notDrive; - RFs::CharToDrive(aRequest->Src().Drive()[0],notDrive); //can not fail as the drive letter has been parsed already - if(aRequest->Src().Path().MatchF(iName) == 0 && aRequest->DriveNumber() == notDrive) + if(aRequest->Source().Path().MatchF(iName) == 0) return ETrue; } - //Special case where the File the notifier is setup on has just been created by temp as the name is not known unti it has been created + //Special case where the File the notifier is setup on has just been created by temp as the name is not known until it has been created if(function==EFsRename||function==EFsFileOpen||function==EFsFileCreate||function==EFsFileReplace) { - TInt notDrive; - RFs::CharToDrive(aRequest->Src().Drive()[0],notDrive); //can not fail as the drive letter has been parsed already - if(aRequest->Src().FullName().Mid(2).MatchF(iName) == 0 && aRequest->DriveNumber() == notDrive) + if(aRequest->Source().FullName().MatchF(iName) == 0) return ETrue; } @@ -162,13 +1011,10 @@ TBuf root=iName; root+=_L("*"); - // NB share may be NULL if file server has initiated a flush of the file cache - CFileShare* share; - CFileCB* fileCache; - GetFileFromScratch(aRequest, share, fileCache); - if (share && share->File().FileName().MatchF(root) != KErrNotFound) - return(ETrue); - + if (aRequest->Source().FullName().MatchF(root) != KErrNotFound) + { + return(ETrue); + } } break; case EFsSetDriveName: @@ -186,18 +1032,26 @@ TBuf root = iName; root+=_L("*"); - if(aRequest->Src().FullName().Mid(2).MatchF(root)!=KErrNotFound) + if(aRequest->Source().FullName().MatchF(root)!=KErrNotFound) return(ETrue); else if(function==EFsRename||function==EFsReplace||function==EFsFileRename) { // - rename/replace causes the file/path to disappear - if(aRequest->Dest().FullName().Mid(2).MatchF(root)!=KErrNotFound) + TPtrC newName; + if(aRequest->DestDriveIsSet()) + newName.Set(aRequest->NewName().FullName().Mid(2)); + else + newName.Set(aRequest->NewName().FullName()); + if(newName.MatchF(root)!=KErrNotFound) { return(ETrue); } // - rename/replace causes the file/path to arrive - root=aRequest->Dest().FullName().Mid(2); + if(aRequest->DestDriveIsSet()) + root=aRequest->NewName().FullName().Mid(2); + else + root=aRequest->NewName().FullName(); root+=_L("*"); if (iName.MatchF(root)!=KErrNotFound) @@ -416,7 +1270,7 @@ iQLock.Signal(); } -void TChangeQue::CheckChange(CFsRequest* aRequest) +void TChangeQue::CheckChange(CFsNotificationInfo& aRequest) // // complete any notification in que that matches aRequest // @@ -429,9 +1283,9 @@ __ASSERT_DEBUG(info->Type()==CNotifyInfo::EStdChange||info->Type()==CNotifyInfo::EExtChange,Fault(EChangeQueType)); TBool isMatching; if(info->Type()==CNotifyInfo::EStdChange) - isMatching=((CStdChangeInfo*)info)->IsMatching(aRequest); + isMatching=((CStdChangeInfo*)info)->IsMatching(&aRequest); else - isMatching=((CExtChangeInfo*)info)->IsMatching(aRequest); + isMatching=((CExtChangeInfo*)info)->IsMatching(&aRequest); if(isMatching) { __PRINT1(_L("TChangeQue::CheckChange()-Matching info=0x%x"),info); @@ -842,17 +1696,18 @@ return(KErrNone); } -void FsNotify::HandleChange(CFsRequest* aRequest,TInt aDrive) + +void FsNotify::HandleChange(CFsNotificationInfo& aNotificationInfo) // // Check whether any change notifications need to be completed due to aRequest on aDrive // - { - __PRINT2(_L("FsNotify::HandleChange() aRequest=0x%x, aDrive=%d"),aRequest,aDrive); - if(!aRequest->IsChangeNotify()) - return; - iChangeQues[ChangeIndex(aDrive)].CheckChange(aRequest); - iChangeQues[ChangeIndex(KDriveInvalid)].CheckChange(aRequest); - } + { + __PRINT1(_L("FsNotify::HandleChange(TFsNotificationInfo) DriveNumber=%d"),aNotificationInfo.DriveNumber()); + if(aNotificationInfo.Request() && !aNotificationInfo.Request()->IsChangeNotify()) + return; + iChangeQues[ChangeIndex(aNotificationInfo.DriveNumber())].CheckChange(aNotificationInfo); + iChangeQues[ChangeIndex(KDriveInvalid)].CheckChange(aNotificationInfo); + } void FsNotify::HandleDiskSpace(CFsRequest* aRequest,TInt aDrive) diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/sfile/sf_ops.cpp --- a/userlibandfileserver/fileserver/sfile/sf_ops.cpp Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_ops.cpp Mon Nov 01 20:11:36 2010 +0000 @@ -165,48 +165,6 @@ } } -TUint TOperation::NotifyType() const -// -// Convert operation that caused the notification to a -// value corresponding to the correct TNotifyType enum -// - { - switch (iFunction) - { - case EFsFileCreate: - case EFsFileReplace: - case EFsDelete: - case EFsReplace: - case EFsFileRename: - return(ENotifyFile|ENotifyEntry); - case EFsMkDir: - case EFsRmDir: - return(ENotifyDir|ENotifyEntry); - case EFsRename: - return(ENotifyDir|ENotifyFile|ENotifyEntry); - case EFsSetVolume: - return(ENotifyDisk|ENotifyEntry); - case EFsFileSet: - case EFsFileSetAtt: - case EFsFileSetModified: - case EFsFileSetSize: - case EFsSetEntry: - return(ENotifyAttributes); - case EFsFileWrite: - case EFsFileWriteDirty: - return(ENotifyWrite); - case EFsRawDiskWrite: - case EFsLockDrive: - case EFsUnlockDrive: - return(ENotifyDisk); - case EFsFileTemp: - case EFsSetDriveName: - return(ENotifyAll); - default: - return(0); - } - } - TBool TOperation::IsCompleted() const // // diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/sfile/sf_ops.h --- a/userlibandfileserver/fileserver/sfile/sf_ops.h Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_ops.h Mon Nov 01 20:11:36 2010 +0000 @@ -34,7 +34,7 @@ { EFsDriveList, ESync, &TFsDriveList::Initialise, NULL, &TFsDriveList::DoRequestL }, { EFsDrive, ESync, &TFsDrive::Initialise, NULL, &TFsDrive::DoRequestL }, { EFsVolume, 0, &TFsVolume::Initialise, NULL, &TFsVolume::DoRequestL , MSG0(EVolumeInfo)}, - { EFsSetVolume, 0, &TFsSetVolume::Initialise, NULL, &TFsSetVolume::DoRequestL }, + { EFsSetVolume, EParseDst, &TFsSetVolume::Initialise, NULL, &TFsSetVolume::DoRequestL }, { EFsSubst, ESync, &TFsSubst::Initialise, NULL, &TFsSubst::DoRequestL }, { EFsSetSubst, ESync | EParseSrc, &TFsSetSubst::Initialise, NULL, &TFsSetSubst::DoRequestL }, { EFsRealName, ESync | EParseSrc, &TFsRealName::Initialise, NULL, &TFsRealName::DoRequestL }, @@ -51,7 +51,7 @@ { EFsEntry, EParseSrc, &TFsEntry::Initialise, NULL, &TFsEntry::DoRequestL , MSG0(EName) | MSG1(EEntry)}, { EFsSetEntry, EParseSrc, &TFsSetEntry::Initialise, NULL, &TFsSetEntry::DoRequestL , MSG0(EName) | MSG1(ETime) | MSG2(ESetAtt) | MSG3(EClearAtt)}, { EFsGetDriveName, ESync, &TFsGetDriveName::Initialise, NULL, &TFsGetDriveName::DoRequestL }, - { EFsSetDriveName, ESync, &TFsSetDriveName::Initialise, NULL, &TFsSetDriveName::DoRequestL }, + { EFsSetDriveName, ESync | EParseDst, &TFsSetDriveName::Initialise, NULL, &TFsSetDriveName::DoRequestL }, { EFsFormatSubClose, ESync, &TFsSubClose::Initialise, NULL, &TFsSubClose::DoRequestL }, { EFsDirSubClose, ESync, &TFsSubClose::Initialise, NULL, &TFsSubClose::DoRequestL }, { EFsFileSubClose, EFileShare | EFsDspObj, &TFsSubClose::Initialise, NULL, &TFsSubClose::DoRequestL }, diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/sfile/sf_pool.cpp --- a/userlibandfileserver/fileserver/sfile/sf_pool.cpp Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_pool.cpp Mon Nov 01 20:11:36 2010 +0000 @@ -23,13 +23,13 @@ //=====CFsPool============================= template -CFsPool* CFsPool::New(TInt aPoolSize) +CFsPool* CFsPool::New(TInt aPoolSize, T*(*aNewFunction)()) { CFsPool* pool = new CFsPool(); if(!pool) return NULL; - TInt r = pool->Construct(aPoolSize); + TInt r = pool->Construct(aPoolSize,aNewFunction); if(r!=KErrNone) { delete pool; @@ -46,20 +46,20 @@ } template -TInt CFsPool::Construct(TInt aPoolSize) +TInt CFsPool::Construct(TInt aPoolSize,T*(*aNewFunction)()) { - TInt r = iPoolLock.CreateLocal(KNotificationPoolSize); + TInt r = iPoolLock.CreateLocal(aPoolSize); if(r != KErrNone) return r; - r = iFreeList.Reserve(KNotificationPoolSize); + r = iFreeList.Reserve(aPoolSize); if(r != KErrNone) return r; TInt i = 0; while(i < aPoolSize) { - T* t = T::New(); + T* t = aNewFunction(); if(!t) { return KErrNoMemory; @@ -120,9 +120,9 @@ iPoolLock.Signal(); } +//These are needed here because the compiler needs to know which types will be +//instantiating the template (because it's in a separate file) #ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION -//This is needed here because the compiler needs to know which types will be -//instantiating the template (because it's in a separate file) template class CFsPool; #endif //SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION - +template class CFsPool; diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/sfile/sf_pool.h --- a/userlibandfileserver/fileserver/sfile/sf_pool.h Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_pool.h Mon Nov 01 20:11:36 2010 +0000 @@ -27,13 +27,14 @@ class CFsPool { public: - static CFsPool* New(TInt aPoolSize); + + static CFsPool* New(TInt aPoolSize,T*(*aNewFunction)()); ~CFsPool(); /* * Allocate returns a pointer of class T. * The pointer returned is removed from the pool. - * When the pool is empty this function will wait. + * WAITs when the pool is empty. */ T* Allocate(); @@ -44,7 +45,7 @@ void Free(T* aBlock); private: CFsPool(); - TInt Construct(TInt aPoolSize); + TInt Construct(TInt aPoolSize,T*(*aNewFunction)()); void Lock(); void Unlock(); diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/sfile/sf_request.cpp --- a/userlibandfileserver/fileserver/sfile/sf_request.cpp Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_request.cpp Mon Nov 01 20:11:36 2010 +0000 @@ -471,6 +471,19 @@ return(-1); } +/* + * Gets the UID of the client + */ +TUid CFsRequest::Uid() + { + return TUid::Null(); + } + +TUid CFsMessageRequest::Uid() + { + return iUID; + } + TBool CFsMessageRequest::IsNotifierSpecific() const { @@ -910,11 +923,12 @@ } -void CFsMessageRequest::Set(const RMessage2& aMessage,const TOperation& aOperation,CSessionFs* aSession) +void CFsMessageRequest::Set(const RMessage2& aMessage,const TOperation& aOperation,CSessionFs* aSession, TUid aUid) // // // { + iUID = aUid; iCurrentPlugin=NULL; iMessage=aMessage; iDrive=NULL; @@ -924,11 +938,6 @@ EnablePostIntercept(ETrue); } -void CFsMessageRequest::Set(const TOperation& aOperation) - { - iOperation=const_cast(&aOperation); - } - void CFsMessageRequest::Process() // // Process the request - (passing to a plugin or a drive thread) @@ -1326,10 +1335,46 @@ if(aError==KErrNone) { + //Get a notificationInfo block (freed again after notification complete) + CFsNotificationInfo* notificationInfo = NULL; + if(!(FsNotify::IsChangeQueEmpty(driveNumber))) - FsNotify::HandleChange(this,driveNumber); - + { + if(CFsNotificationInfo::NotifyType(Operation()->Function())) + { + notificationInfo = CFsNotificationInfo::Allocate(*this); + if(notificationInfo) + FsNotify::HandleChange(*notificationInfo); + } + } + + #ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION + + if(!FsNotificationManager::IsInitialised()) + { + if(notificationInfo) + { + CFsNotificationInfo::Free(notificationInfo); + } + return; + } + + if(!notificationInfo) + { + TFsNotification::TFsNotificationType type; + CFsNotificationInfo::NotificationType(Operation()->Function(),type); + if(type) + { + notificationInfo = CFsNotificationInfo::Allocate(*this); + if(!notificationInfo) + return; + } + else + { + return; + } + } if (iOperation->iFunction == EFsFileWrite) { CFileShare* share = (CFileShare*) this->ScratchValue(); @@ -1339,29 +1384,19 @@ // Manage notifications for write with no cache or a write-through if (!fileCache || !fileCache->IsDirty()) { - FsNotificationManager::HandleChange((CFsClientMessageRequest&)*this); + FsNotificationManager::HandleChange(*notificationInfo); } } - else if((iOperation->iFunction == EFsFileWriteDirty) && FsNotificationManager::IsInitialised()) - { - CFileShare* share; - CFileCB* file; - GetFileFromScratch(this, share, file); - - TFileName path; - path.Append(file->DriveNumber() + 'A'); - path.Append(':'); - path.Append(file->FileName().Des()); - - // Manage notifications for write with caching enabled - FsNotificationManager::HandleChange((CFsClientMessageRequest*)this, path, TFsNotification::EFileChange); - } else if(IsNotifierSupported()) { - FsNotificationManager::HandleChange((CFsClientMessageRequest&)*this); + FsNotificationManager::HandleChange(*notificationInfo); } #endif //SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION - } + + //Free the notificationInfo block + if(notificationInfo) + CFsNotificationInfo::Free(notificationInfo); + }// Err==KErrNone } void CFsMessageRequest::DoNotifyDiskSpace(TInt aError) @@ -1782,7 +1817,7 @@ void CFsMessageRequest::SetOperationFunc(TInt aFunction) { const TOperation& oP = OperationArray[aFunction]; - Set(oP); + iOperation = const_cast(&oP); // modified because some requests were set to PostInitialise. They are set to DoRequest in Dispatch anyway, so this is possibly ok? //__ASSERT_ALWAYS(iReqState == EReqStateDoRequest, Fault(EInvalidMsgState)); } diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/sfile/sf_ses.cpp --- a/userlibandfileserver/fileserver/sfile/sf_ses.cpp Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_ses.cpp Mon Nov 01 20:11:36 2010 +0000 @@ -375,13 +375,13 @@ TInt TFsSetDriveName::DoRequestL(CFsRequest* aRequest) { TInt driveNum=aRequest->Drive()->DriveNumber(); - TFileName driveName; - aRequest->ReadL(KMsgPtr1,driveName); + // Validate name - return KErrBadName if it contains illegal characters such as // * ? / | > < - TNameChecker checker(driveName); + TPtrC driveName(aRequest->Dest().FullName()); + TNameChecker checker(driveName); TText badChar; if (checker.IsIllegalName(badChar)) return(KErrBadName); @@ -398,7 +398,7 @@ } if (TheDriveNames[driveNum]==NULL || TheDriveNames[driveNum]->Des().MaxLength()Dest().FullName(); return(KErrNone); } @@ -407,6 +407,13 @@ TInt r=ValidateDrive(aRequest->Message().Int0(),aRequest); if (r!=KErrNone) return(r); + + TFileName driveName; + aRequest->ReadL(KMsgPtr1,driveName); + r = aRequest->Dest().Set(driveName,NULL,NULL); + if (r!=KErrNone) + return(r); + if (!KCapFsSetDriveName.CheckPolicy(aRequest->Message(), __PLATSEC_DIAGNOSTIC_STRING("Set Drive Name"))) return KErrPermissionDenied; return KErrNone; diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/sfile/sf_std.h --- a/userlibandfileserver/fileserver/sfile/sf_std.h Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_std.h Mon Nov 01 20:11:36 2010 +0000 @@ -34,7 +34,7 @@ #include "sf_func.h" #include #include "f32trace.h" - +#include "sf_pool.h" #define __PRINT1TEMP_ALWAYS(t,a) {{TBuftemp(a);RDebug::Print(t,&temp);}} #define __PRINT2TEMP_ALWAYS(t,a,b) {{TBuftemp(b);RDebug::Print(t,a,&temp);}} @@ -455,6 +455,8 @@ EFsObjectOpen, EContainerHeapCorruptionOnRemove, ESessionOpenError, + ENotifyPoolCreation, + ENotificationInfoDeletion }; @@ -1006,7 +1008,6 @@ TBool IsChangeNotify() const; TBool IsDiskSpaceNotify() const; TBool IsWrite() const; - TUint NotifyType() const; TBool IsCompleted() const; TBool IsOpenSubSess() const; //used to allocate for close as well as open task for subsessions TBool IsCloseSubSess() const; @@ -1209,8 +1210,10 @@ inline TInt FsFunction(); void Close(); // close the session & dispatch object this request is using -public: CFsRequest(); + + virtual TUid Uid(); + protected: inline void Set(const TOperation& aOperation,CSessionFs* aSession); inline void Set(CSessionFs* aSession); @@ -1262,8 +1265,7 @@ { public: void Set(const RMessage2& aMessage,CSessionFs* aSession); - void Set(const RMessage2& aMessage,const TOperation& aOperation,CSessionFs* aSession); - void Set(const TOperation& aOperation); + void Set(const RMessage2& aMessage,const TOperation& aOperation,CSessionFs* aSession, TUid aUid = TUid::Null()); inline void SetPostInitialise(TFsRequestFunc aCacheFunction); // inline void SetMessage(RMessage2& aMessage); @@ -1305,8 +1307,7 @@ TBool IsPluginRequest(); static inline CFsMessageRequest* RequestFromMessage(const RMessagePtr2& aMessage); - // UID of the process to touching the file. (To be used in notification framework). - // TUid iUID; + virtual TUid Uid(); private: void DoNotify(TInt aError); void DoNotifyDiskSpace(TInt aError); @@ -1327,6 +1328,7 @@ private: TMsgOperation* iCurrentOperation; TInt iLastError; + TUid iUID;//UID of the process this message belongs to }; @@ -1486,8 +1488,8 @@ { public: void Initialise(TNotifyType aChangeType,TRequestStatus* aStatus,const RMessagePtr2& aMessage,CSessionFs* aSession); - TUint RequestNotifyType(CFsRequest* aRequest); - TBool IsMatching(CFsRequest* aRequest); + TUint RequestNotifyType(CFsNotificationInfo* aRequest); + TBool IsMatching(CFsNotificationInfo* aRequest); protected: TNotifyType iChangeType; }; @@ -1496,7 +1498,7 @@ { public: void Initialise(TNotifyType aChangeType,TRequestStatus* aStatus,const RMessagePtr2& aMessage,CSessionFs* aSession,const TDesC& aName); - TBool IsMatching(CFsRequest* aRequest); + TBool IsMatching(CFsNotificationInfo* aRequest); private: TFileName iName; }; @@ -1557,7 +1559,7 @@ TInt AddNotify(CNotifyInfo* aInfo); TBool CancelSession(CSessionFs* aSession,TInt aCompletionCode,TRequestStatus* aStatus=NULL); void CancelAll(TInt aCompletionCode); - void CheckChange(CFsRequest* aRequest); + void CheckChange(CFsNotificationInfo& aNotificationInfo); TBool IsEmpty(); }; @@ -1598,6 +1600,30 @@ TBool HandlePendingDismount(CSessionFs* aSession, TInt aDrive); }; +class CFsNotificationInfo; + +class CFsNotificationInfoBody : public CBase + { +public: + CFsNotificationInfoBody(); +private: + TParsePtrC iSrc; + TBuf<2> iSrcBuf; + TParsePtrC iDest; + TBool iDestDriveStored; + TInt iDriveNumber; + TInt iFunction; + CFsRequest* iRequest; //Can be NULL + + //CFsNotify framework + TInt64 iData; + TNotificationType iNotificationType; + TUid iUid; + + friend class CFsNotificationInfo; + }; + + class FsNotify { public: @@ -1607,7 +1633,7 @@ static TInt AddDebug(CNotifyInfo* aDebugInfo); static TInt AddDismountNotify(CNotifyInfo* aDismountNotifyInfo); static void DiskChange(TInt aDrive); - static void HandleChange(CFsRequest* aRequest,TInt aDrive); + static void HandleChange(CFsNotificationInfo& aNotificationInfo); static void HandleDiskSpace(CFsRequest* aRequest,TInt aDrive); static void HandleDiskSpace(TInt aDrive, TInt64& aFreeSpace); static void HandleDebug(TUint aFunction); @@ -1689,6 +1715,7 @@ extern CFsObjectCon* RawDisks; extern CFsObjectCon* Extensions; extern CFsObjectCon* ProxyDrives; +extern CFsPool* NotificationInfoPool; extern CKernEventNotifier* TheKernEventNotifier; @@ -1767,18 +1794,18 @@ TBool CompareResource(const TDesC & aThePath); #ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ - TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const char* aDiag); - TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const TSecurityPolicy* aROCap, const char* aDiag); - TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath,const TSecurityPolicy* aCap, const char* aDiag, TBool aExactMatchAllowed = EFalse); + TInt PathCheck(const RMessage2& aMessage, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const char* aDiag); + TInt PathCheck(const RMessage2& aMessage, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const TSecurityPolicy* aROCap, const char* aDiag); + TInt PathCheck(const RMessage2& aMessage, const TDesC& aThePath,const TSecurityPolicy* aCap, const char* aDiag, TBool aExactMatchAllowed = EFalse); #else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ - TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, OnlyCreateWithNull aDiag); - TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const TSecurityPolicy* aROCap, OnlyCreateWithNull aDiag); - TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath,const TSecurityPolicy* aCap, OnlyCreateWithNull aDiag, TBool aExactMatchAllowed = EFalse); + TInt PathCheck(const RMessage2& aRequest, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, OnlyCreateWithNull aDiag); + TInt PathCheck(const RMessage2& aRequest, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const TSecurityPolicy* aROCap, OnlyCreateWithNull aDiag); + TInt PathCheck(const RMessage2& aRequest, const TDesC& aThePath,const TSecurityPolicy* aCap, OnlyCreateWithNull aDiag, TBool aExactMatchAllowed = EFalse); #endif //!__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ TBool ComparePrivate(const TDesC & aThePath); TBool CompareSystem(const TDesC & aThePath); - TBool SIDCheck(CFsRequest* aRequest, const TDesC& aThePath); + TBool SIDCheck(const RMessage2& aMessage, const TDesC& aThePath); TBool ComparePaths(const TDesC& aPath1,const TDesC& aPath2); TUint32 CalcNameHash(const TDesC& aName); diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/sfile/sf_svr.cpp --- a/userlibandfileserver/fileserver/sfile/sf_svr.cpp Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_svr.cpp Mon Nov 01 20:11:36 2010 +0000 @@ -211,7 +211,7 @@ return(ret); } aRequest->SetScratchValue(monitorAllDrives); - ret = PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsNotifyChangeEx, __PLATSEC_DIAGNOSTIC_STRING("Extended Change Notifier")); + ret = PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsNotifyChangeEx, __PLATSEC_DIAGNOSTIC_STRING("Extended Change Notifier")); return(ret); } @@ -594,13 +594,9 @@ if(r != KErrNone) return r; - TFileName volumeName; - aRequest->ReadL(KMsgPtr0,volumeName); - if (volumeName.Length()>KMaxVolumeNameLength) // KMaxVolumeNameLength = 11 - return(KErrBadName); - // Validate name - return KErrBadName if it contains illegal characters such as * ? / | > < - TNameChecker checker(volumeName); + TPtrC volumeName(aRequest->Dest().FullName()); + TNameChecker checker(volumeName); TText badChar; if (checker.IsIllegalName(badChar)) return(KErrBadName); @@ -617,6 +613,17 @@ TInt r=ValidateDriveDoSubst(aRequest->Message().Int1(),aRequest); if (r!=KErrNone) return(r); + TFileName volumeName; + TRAP(r,aRequest->ReadL(KMsgPtr0,volumeName)); + if(r!=KErrNone) + return r; + if (volumeName.Length()>KMaxVolumeNameLength) // KMaxVolumeNameLength = 11 + return(KErrBadName); + + r = aRequest->Dest().Set(volumeName,NULL,NULL); + if(r!=KErrNone) + return r; + if (!KCapFsSetVolume.CheckPolicy(aRequest->Message(), __PLATSEC_DIAGNOSTIC_STRING("Set Volume"))) return KErrPermissionDenied; return KErrNone; @@ -671,7 +678,7 @@ pD->SetSubstedDrive(NULL); return(KErrNone); } - r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysSetSubst,&KCapFsPriSetSubst,&KCapFsROSetSubst, __PLATSEC_DIAGNOSTIC_STRING("Set Subst")); + r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysSetSubst,&KCapFsPriSetSubst,&KCapFsROSetSubst, __PLATSEC_DIAGNOSTIC_STRING("Set Subst")); if (r!=KErrNone) return(r); if (pD->Att()&(KDriveAttLocal|KDriveAttRom|KDriveAttRedirected|KDriveAttSubsted)) @@ -710,7 +717,7 @@ TInt r=ParseSubstPtr0(aRequest,aRequest->Src()); if (r!=KErrNone) return(r); - r=PathCheck(aRequest,aRequest->Src().FullName().Mid(2),&KCapFsSysRealName,&KCapFsPriRealName, __PLATSEC_DIAGNOSTIC_STRING("Real Name")); + r=PathCheck(aRequest->Message(),aRequest->Src().FullName().Mid(2),&KCapFsSysRealName,&KCapFsPriRealName, __PLATSEC_DIAGNOSTIC_STRING("Real Name")); if (r!=KErrNone) return(r); TFileName substName; @@ -869,7 +876,7 @@ TInt r=ParsePathPtr0(aRequest,parse); if (r!=KErrNone && r!=KErrInUse) return(r); - r=PathCheck(aRequest,parse.FullName().Mid(2),&KCapFsSysSetSessionPath,&KCapFsPriSetSessionPath, __PLATSEC_DIAGNOSTIC_STRING("Set Session Path")); + r=PathCheck(aRequest->Message(),parse.FullName().Mid(2),&KCapFsSysSetSessionPath,&KCapFsPriSetSessionPath, __PLATSEC_DIAGNOSTIC_STRING("Set Session Path")); if (r!=KErrNone) return(r); if (IsIllegalFullName(parse.FullName())) diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/sfile/sf_utl.cpp --- a/userlibandfileserver/fileserver/sfile/sf_utl.cpp Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_utl.cpp Mon Nov 01 20:11:36 2010 +0000 @@ -133,14 +133,14 @@ return ETrue; } -TBool SIDCheck(CFsRequest* aRequest, const TDesC& aThePath) +TBool SIDCheck(const RMessage2& aMessage, const TDesC& aThePath) // // Compare the Private/XXXXXXXX/ portion of a path be accessed to make sure it matches the process SID // { if(aThePath.Length() >= KPrivateLengthCheck) { - TSecureId appUID = aRequest->Message().SecureId(); + TSecureId appUID = aMessage.SecureId(); TBuf dirName; dirName.AppendNumFixedWidth(appUID.iId, EHex, 8); @@ -155,16 +155,16 @@ } #ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ -TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const TSecurityPolicy* aROCap, const char* aDiag) +TInt PathCheck(const RMessage2& aMessage, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const TSecurityPolicy* aROCap, const char* aDiag) #else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ -TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const TSecurityPolicy* aROCap, OnlyCreateWithNull /*aDiag*/) +TInt PathCheck(const RMessage2& aMessage, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const TSecurityPolicy* aROCap, OnlyCreateWithNull /*aDiag*/) #endif //!__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ // // Compare the parsed path with protected path names path must be parsed b4 using // { - if(aRequest->Message().Handle() == KLocalMessageHandle) + if(aMessage.Handle() == KLocalMessageHandle) return KErrNone; #ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ @@ -185,11 +185,11 @@ if(ComparePrivate(aThePath)) { - if(SIDCheck(aRequest, aThePath)) + if(SIDCheck(aMessage, aThePath)) return KErrNone; else { - if(aPriCap->CheckPolicy(aRequest->Message(), __PLATSEC_DIAGNOSTIC_STRING(diagout))) + if(aPriCap->CheckPolicy(aMessage, __PLATSEC_DIAGNOSTIC_STRING(diagout))) return KErrNone; else return KErrPermissionDenied; @@ -197,14 +197,14 @@ } else if(CompareSystem(aThePath)) { - if(aSysCap->CheckPolicy(aRequest->Message(), __PLATSEC_DIAGNOSTIC_STRING(diagout))) + if(aSysCap->CheckPolicy(aMessage, __PLATSEC_DIAGNOSTIC_STRING(diagout))) return KErrNone; else return KErrPermissionDenied; } else if(CompareResource(aThePath)) { - if(aROCap->CheckPolicy(aRequest->Message(), __PLATSEC_DIAGNOSTIC_STRING(diagout))) + if(aROCap->CheckPolicy(aMessage, __PLATSEC_DIAGNOSTIC_STRING(diagout))) return KErrNone; else return KErrPermissionDenied; @@ -214,16 +214,16 @@ } #ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ -TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const char* aDiag) +TInt PathCheck(const RMessage2& aMessage, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, const char* aDiag) #else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ -TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, OnlyCreateWithNull /*aDiag*/) +TInt PathCheck(const RMessage2& aMessage, const TDesC& aThePath, const TSecurityPolicy* aSysCap, const TSecurityPolicy* aPriCap, OnlyCreateWithNull /*aDiag*/) #endif //!__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ // // Compare the parsed path with protected path names path must be parsed b4 using // { - if(aRequest->Message().Handle() == KLocalMessageHandle) + if(aMessage.Handle() == KLocalMessageHandle) return KErrNone; #ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ @@ -244,11 +244,11 @@ if(ComparePrivate(aThePath)) { - if(SIDCheck(aRequest, aThePath)) + if(SIDCheck(aMessage, aThePath)) return KErrNone; else { - if(aPriCap->CheckPolicy(aRequest->Message(), __PLATSEC_DIAGNOSTIC_STRING(diagout))) + if(aPriCap->CheckPolicy(aMessage, __PLATSEC_DIAGNOSTIC_STRING(diagout))) return KErrNone; else return KErrPermissionDenied; @@ -256,7 +256,7 @@ } else if(CompareSystem(aThePath)) { - if(aSysCap->CheckPolicy(aRequest->Message(), __PLATSEC_DIAGNOSTIC_STRING(diagout))) + if(aSysCap->CheckPolicy(aMessage, __PLATSEC_DIAGNOSTIC_STRING(diagout))) return KErrNone; else return KErrPermissionDenied; @@ -266,16 +266,16 @@ } #ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ -TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath, const TSecurityPolicy* aCap, const char* aDiag, TBool aExactMatchAllowed) +TInt PathCheck(const RMessage2& aMessage, const TDesC& aThePath, const TSecurityPolicy* aCap, const char* aDiag, TBool aExactMatchAllowed) #else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ -TInt PathCheck(CFsRequest* aRequest, const TDesC& aThePath, const TSecurityPolicy* aCap, OnlyCreateWithNull /*aDiag*/, TBool aExactMatchAllowed) +TInt PathCheck(const RMessage2& aMessage, const TDesC& aThePath, const TSecurityPolicy* aCap, OnlyCreateWithNull /*aDiag*/, TBool aExactMatchAllowed) #endif //!__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ // // Compare the parsed path with protected path names path must be parsed b4 using // { - if(aRequest->Message().Handle() == KLocalMessageHandle) + if(aMessage.Handle() == KLocalMessageHandle) return KErrNone; #ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__ @@ -296,11 +296,11 @@ if(ComparePrivate(aThePath)) { - if(SIDCheck(aRequest, aThePath)) + if(SIDCheck(aMessage, aThePath)) return KErrNone; else { - if(aCap->CheckPolicy(aRequest->Message(), __PLATSEC_DIAGNOSTIC_STRING(diagout))) + if(aCap->CheckPolicy(aMessage, __PLATSEC_DIAGNOSTIC_STRING(diagout))) return KErrNone; else if (aExactMatchAllowed && aThePath.Length() <= KPrivateLength + 1) return KErrNone; @@ -310,7 +310,7 @@ } else if(CompareSystem(aThePath)) { - if(aCap->CheckPolicy(aRequest->Message(), __PLATSEC_DIAGNOSTIC_STRING(diagout))) + if(aCap->CheckPolicy(aMessage, __PLATSEC_DIAGNOSTIC_STRING(diagout))) return KErrNone; else if (aExactMatchAllowed && aThePath.Length() <= KSystemLength + 1) return KErrNone; diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/sfsrv/cl_notification.cpp --- a/userlibandfileserver/fileserver/sfsrv/cl_notification.cpp Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/sfsrv/cl_notification.cpp Mon Nov 01 20:11:36 2010 +0000 @@ -179,7 +179,7 @@ * Word2 : NewNameSize (2 bytes) , NotificationType (2 bytes) * Word3 : UID * Word(s) : Path (TText8) , [Any sub-class members] - + */ EXPORT_C TInt TFsNotification::DriveNumber(TInt& aDriveNumber) const { TPtrC path(NULL,0); @@ -193,7 +193,7 @@ } return r; } - */ + /* * The order of the data in the buffer is: @@ -201,14 +201,14 @@ * Word2 : NewNameSize (2 bytes) , NotificationType (2 bytes) * Word3 : UID * Word(s) : Path (TText8) , [Any sub-class members] - + */ EXPORT_C TInt TFsNotification::UID(TUid& aUID) const { TUint* word3 = PtrAdd((TUint*)this, sizeof(TUint)*2); aUID.iUid = *word3; return KErrNone; } - */ + CFsNotificationList* CFsNotificationList::NewL(TInt aBufferSize) @@ -321,12 +321,34 @@ } EXPORT_C TInt CFsNotify::AddNotification(TUint aNotificationType, const TDesC& aPath, const TDesC& aFilename) - { - if(aNotificationType == 0 || (aPath.Length() <= 0 && aFilename.Length() <= 0)) - return KErrArgument; + { + TInt pathLength = aPath.Length(); + if(aNotificationType == 0 || (pathLength <= 0 && aFilename.Length() <= 0)) + return KErrArgument; + + //Validate path. + //Paths must be fully formed. i.e. with a valid or wild drive letter. + if(pathLength) + { + if(aPath[0] != '*' && aPath[0] != '?') + { + TInt drive = KErrNotFound; + TInt r = RFs::CharToDrive(aPath[0],drive); - return iBody->iFsNotify.AddNotification(aNotificationType, aPath, aFilename); - } + if(r!=KErrNone) + return KErrPathNotFound; + if(drive < EDriveA || drive > EDriveZ) + return KErrPathNotFound; + if(pathLength < 2) + return KErrPathNotFound; + else if(aPath[1] != ':') + return KErrPathNotFound; + } + } + + + return iBody->iFsNotify.AddNotification(aNotificationType, aPath, aFilename); + } //Removes notification request, does not close session EXPORT_C TInt CFsNotify::RemoveNotifications() @@ -450,19 +472,17 @@ return KErrNotSupported; } -/* EXPORT_C TInt TFsNotification::DriveNumber(TInt&) const { Panic(ENotificationPanic); return KErrNotSupported; } -EXPORT_C TInt TFsNotification::UID(TUid& aUID) const +EXPORT_C TInt TFsNotification::UID(TUid&) const { Panic(ENotificationPanic); return KErrNotSupported; } -*/ EXPORT_C CFsNotify* CFsNotify::NewL(RFs& , TInt) { diff -r b2826f67641f -r b5a01337d018 userlibandfileserver/fileserver/sfsrv/cl_notification.h --- a/userlibandfileserver/fileserver/sfsrv/cl_notification.h Tue Oct 26 12:49:20 2010 +0100 +++ b/userlibandfileserver/fileserver/sfsrv/cl_notification.h Mon Nov 01 20:11:36 2010 +0000 @@ -61,15 +61,12 @@ * All types have the following data and are aligned in the buffer like so: * Word1 : Size (TUint16 - upper 2 bytes) , NameLength (TUint16 - lower 2 bytes), * Word2 : Type (TUint - 4 bytes) - * [not yet supported - Word3 : UID (TUint32 - 4 Bytes) ] + * Word3 : UID (TUint32 - 4 Bytes) * @internalTechnology @released */ -const TInt KNotificationHeaderSize = (sizeof(TUint16)*2)+(sizeof(TUint)); -// -//When UID is added: -//const TInt KNotificationHeaderSize = (sizeof(TUint16)*2)+(sizeof(TUint))+sizeof(TUint32); +const TInt KNotificationHeaderSize = (sizeof(TUint16)*2)+sizeof(TUint)+sizeof(TUint32); /* * This is the minimum allowed size of the buffer set by the client that is