userlibandfileserver/fileserver/sfsrv/cl_cli.cpp
changeset 0 a41df078684a
child 4 56f325a607ea
equal deleted inserted replaced
-1:000000000000 0:a41df078684a
       
     1 // Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of the License "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // f32\sfsrv\cl_cli.cpp
       
    15 // 
       
    16 //
       
    17 
       
    18 #include "cl_std.h"
       
    19 #include <f32fsys.h>
       
    20 
       
    21 
       
    22 
       
    23 
       
    24 
       
    25 
       
    26 
       
    27 EFSRV_EXPORT_C TBool RFs::IsValidDrive(TInt aDrive)
       
    28 /**
       
    29 Tests whether the specified drive number is valid.
       
    30 
       
    31 A valid drive number is any number between 0 and (KMaxDrives-1) inclusive,
       
    32 or the specific value KDefaultDrive (implying the session default drive).
       
    33 
       
    34 @param aDrive The drive number.
       
    35 			
       
    36 @return True if the drive is valid; false if not.				
       
    37 
       
    38 @see TDriveNumber 				
       
    39 */
       
    40 	{
       
    41 
       
    42 	return((aDrive>=0 && aDrive<KMaxDrives) || aDrive==KDefaultDrive);
       
    43 	}
       
    44 
       
    45 
       
    46 
       
    47 
       
    48 EFSRV_EXPORT_C TInt RFs::CharToDrive(TChar aChar,TInt& aDrive)
       
    49 /**
       
    50 Maps a drive character to a drive number.
       
    51 
       
    52 The drive character must be in the range A to Z or a to z. For example, drive A (or a)
       
    53 corresponds to zero, drive B (or b) corresponds to 1 etc. For the drive number
       
    54 enumeration, see TDriveNumber.
       
    55 
       
    56 @param aChar  The drive character.
       
    57 @param aDrive On return, contains the drive number.
       
    58 
       
    59 @return KErrNone, if successful;
       
    60         KErrArgument, if the drive character is not in the range A to Z or a to z.
       
    61         
       
    62 @see TDriveNumber        
       
    63 */
       
    64 	{
       
    65 
       
    66 	aChar.UpperCase();
       
    67 	if (aChar>='A' && aChar<='Z')
       
    68 		{
       
    69 		aDrive=(TInt)aChar-'A';
       
    70 		return(KErrNone);
       
    71 		}
       
    72 	return(KErrArgument);
       
    73 	}
       
    74 
       
    75 
       
    76 
       
    77 
       
    78 EFSRV_EXPORT_C TInt RFs::DriveToChar(TInt aDrive,TChar& aChar)
       
    79 /**
       
    80 Maps a drive number to the corresponding character.
       
    81 
       
    82 The drive number must be in the range 0 to (KMaxDrives-1). For example, drive
       
    83 number zero (EDriveA) corresponds to drive A, one (EDriveB)
       
    84 corresponds to drive B. For the drive number enumeration, see TDriveNumber.
       
    85 
       
    86 The drive number can also be KDefaultDrive, implying the default drive. In this
       
    87 case the current drive is taken and converted.
       
    88 
       
    89 @param aDrive The drive number.
       
    90 @param aChar  On return, contains the drive character.
       
    91 
       
    92 @return KErrNone, if successful;
       
    93         KErrArgument, if the drive number is invalid;
       
    94         otherwise one of the other system-wide error codes.
       
    95 */
       
    96 	{
       
    97 
       
    98 	if (aDrive==KDefaultDrive)
       
    99 		{
       
   100 		TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFsDriveToChar, MODULEUID, aDrive);
       
   101 		RFs fs;
       
   102 		TFileName path;
       
   103 		TInt r=fs.Connect();
       
   104 		if (r!=KErrNone)
       
   105 			return(r);
       
   106 		r=fs.SessionPath(path);
       
   107 		fs.Close();
       
   108 		if (r!=KErrNone)
       
   109 			return(r);
       
   110 		aChar=path[0];
       
   111 		TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFsDriveToCharReturn, MODULEUID, KErrNone, aChar);
       
   112 		return(KErrNone);
       
   113 		}
       
   114 	if (!IsValidDrive(aDrive))
       
   115 		return(KErrArgument);
       
   116 	aChar=aDrive+'A';
       
   117 	return(KErrNone);
       
   118 	}
       
   119 
       
   120 
       
   121 
       
   122 
       
   123 EFSRV_EXPORT_C TBool RFs::IsRomAddress(TAny *aPtr)
       
   124 /**
       
   125 Tests whether the specified address is in ROM.
       
   126 
       
   127 @param aPtr The address.
       
   128 
       
   129 @return True, if the address is in ROM; false, if not.
       
   130 */
       
   131 	{
       
   132 	TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFsIsRomAddress, MODULEUID, aPtr);
       
   133 
       
   134 	TBool res;
       
   135 	TInt r=User::IsRomAddress(res,aPtr); // Only returns error on WINS
       
   136 	if (r!=KErrNone)
       
   137 		res=EFalse;
       
   138 
       
   139 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsIsRomAddressReturn, MODULEUID, res);
       
   140 	return(res);
       
   141 	}
       
   142 
       
   143 
       
   144 
       
   145 /** 
       
   146 Obtain the system drive number.
       
   147  
       
   148 The System Drive is a defined drive on the device which is:
       
   149  - Read/Writeable
       
   150  - Internal: Always available and not removable from the device
       
   151  - Non-Volatile (e.g. Flash memory, battery-backed RAM)
       
   152  - Only Accessible via Rfs (e.g. not available via USB mass storage)
       
   153      
       
   154 The System drive is utilised as:
       
   155  - Storage for Persistent settings from system and application software
       
   156  - Storage for Localisation resources
       
   157  - A Default Drive for user data
       
   158  - A Target Drive for Software installations
       
   159 
       
   160 It the system drive is not set previously (see RFs::SetSystemDrive) EDriveC is returned by default.
       
   161  
       
   162 @see RFs::GetSystemDriveChar
       
   163 @see RFs::SetSystemDrive   
       
   164 @see TDriveNumber
       
   165 @return TDriveNumber contains the drive number of the system drive.
       
   166  */
       
   167 EFSRV_EXPORT_C TDriveNumber RFs::GetSystemDrive()
       
   168     {
       
   169 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFsGetSystemDrive, MODULEUID);
       
   170     TInt drive;
       
   171 	TInt err = RProperty::Get(TSecureId(KFileServerUidValue), KSystemDriveKey, drive);
       
   172     if(err==KErrNone)
       
   173         {
       
   174         if((drive>=EDriveA) && (drive<=EDriveZ))
       
   175             {
       
   176 			TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFsGetSystemDriveReturn, MODULEUID, drive);
       
   177             return static_cast<TDriveNumber>(drive);
       
   178             }
       
   179         }
       
   180 
       
   181 	TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFsGetSystemDriveReturn, MODULEUID, EDriveC);
       
   182     return EDriveC;
       
   183 	}
       
   184     
       
   185 
       
   186 
       
   187 /**
       
   188 This is a wrapper around GetSystemDrive() function. It returns the character corresponding to the system drive.
       
   189 
       
   190 @parameter aDriveChar On return, contains the system drive character
       
   191 @return KErrNone if successful, otherwise one of the other system-wide error codes
       
   192 @see RFs::GetSystemDrive
       
   193 */
       
   194 EFSRV_EXPORT_C TChar RFs::GetSystemDriveChar()
       
   195 	{
       
   196 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFsGetSystemDriveChar, MODULEUID);
       
   197 
       
   198 	TInt r = 'A' + GetSystemDrive();
       
   199 
       
   200 	TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFsGetSystemDriveCharReturn, MODULEUID, r);
       
   201 	return r;
       
   202 	}
       
   203 
       
   204 
       
   205 
       
   206 /**
       
   207 Set a specified drive as a "System Drive", see RFs::GetSystemDrive().
       
   208 The "System Drive" can be set only once, any subsequent calls will result in the error 'KErrAlreadyExists'.
       
   209 
       
   210 The media type for the system drive shall be one of the: EMediaHardDisk, EMediaFlash, EMediaNANDFlash, EMediaRam
       
   211 Required drive attributes: KDriveAttLocal, KDriveAttInternal
       
   212 Prohibited drive attributes: KDriveAttRom,KDriveAttRedirected,KDriveAttSubsted,KDriveAttRemovable
       
   213 
       
   214 @param  aSystemDrive specifies the drive number to be set as System Drive
       
   215 @return KErrNone if successful, otherwise one of the other system-wide error codes
       
   216 @capability TCB
       
   217 */
       
   218 EFSRV_EXPORT_C TInt RFs::SetSystemDrive(TDriveNumber aSystemDrive)
       
   219 	{
       
   220 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFsSetSystemDrive, MODULEUID, Handle(), aSystemDrive);
       
   221     TInt r = SendReceive(EFsSetSystemDrive, TIpcArgs(aSystemDrive));
       
   222 
       
   223 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsSetSystemDriveReturn, MODULEUID, r);
       
   224 	return r;
       
   225 	}
       
   226 
       
   227     
       
   228 
       
   229 EFSRV_EXPORT_C TInt RFs::Connect(TInt aMessageSlots)
       
   230 /**
       
   231 Connects a client to the file server.
       
   232 
       
   233 To end the file server session, use Close().
       
   234 
       
   235 @param aMessageSlots The number of message slots required. The default value of
       
   236 				     KFileServerDefaultMessageSlots indicates that message
       
   237 				     slots will be acquired dynamically from the system
       
   238 				     wide pool. Override this value with a fixed number, if
       
   239 				     a fixed number of slots are to be allocated to the session.
       
   240 				     If overriding, note that the number of message slots
       
   241 				     represents the number of operations, such as reads
       
   242 				     and writes, that can be outstanding at once;
       
   243 				     always remember to provide a spare slot for
       
   244 				     the cancel operation.
       
   245 
       
   246 @return KErrNone, if successful, otherwise one of the other system-wide
       
   247         error codes.
       
   248 */
       
   249 	{
       
   250 	TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFsConnect, MODULEUID, aMessageSlots);
       
   251 	_LIT(KFileServerName,"!FileServer");
       
   252 	TInt r = CreateSession(KFileServerName,Version(),aMessageSlots);
       
   253 
       
   254 	TRACERET2(UTF::EBorder, UTraceModuleEfsrv::EFsConnectReturn, MODULEUID, r, Handle());
       
   255 	return r;
       
   256 	}
       
   257 
       
   258 
       
   259 
       
   260 
       
   261 EFSRV_EXPORT_C TInt RFs::SetSessionToPrivate(TInt aDrive)
       
   262 /**
       
   263 Sets the session path to point to the private path on the specified drive.
       
   264 
       
   265 The private directory does not need to exist at this point.
       
   266 
       
   267 The private path for a process has the form: \\Private\\13579BDF\\
       
   268 where 13579BDF is the identity of the process.
       
   269 
       
   270 @param aDrive The drive for which information is requested.
       
   271               Specify a drive in the range EDriveA to EDriveZ for drives
       
   272 			  A to Z respectively.
       
   273 
       
   274 @return KErrNone, if successful, otherwise one of the other system-wide
       
   275         error codes.
       
   276 */
       
   277 	{	
       
   278 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFsSetSessionToPrivate, MODULEUID, Handle(), aDrive);
       
   279 	TInt r = SendReceive(EFsSessionToPrivate,TIpcArgs(aDrive));
       
   280 
       
   281 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsSetSessionToPrivateReturn, MODULEUID, r);
       
   282 	return r;
       
   283 	}
       
   284 
       
   285 
       
   286 
       
   287 EFSRV_EXPORT_C TInt RFs::PrivatePath(TDes& aPath)
       
   288 /**
       
   289 Creates the text defining the private path for a process.
       
   290 
       
   291 The private path for a process has the form: \\Private\\13579BDF\\
       
   292 where 13579BDF is the identity of the process.
       
   293 
       
   294 @param aPath On successful return, contains the private path for a process.
       
   295 */
       
   296 	{
       
   297 	TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFsPrivatePath, MODULEUID, Handle());
       
   298 	TInt r = SendReceive(EFsPrivatePath,TIpcArgs(&aPath));
       
   299 
       
   300 	TRACERETMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsPrivatePathReturn, MODULEUID, r, aPath);
       
   301 	return r;
       
   302 	}
       
   303 
       
   304 
       
   305 
       
   306 EFSRV_EXPORT_C TInt RFs::CreatePrivatePath(TInt aDrive)
       
   307 /**
       
   308 Creates the private path for a process on the specified drive.
       
   309 
       
   310 The private path for a process has the form: \\Private\\13579BDF\\
       
   311 where 13579BDF is the identity of the process.
       
   312 
       
   313 @param aDrive The drive for which the private path is to be created.
       
   314               Specify a drive in the range EDriveA to EDriveZ for drives
       
   315 			  A to Z respectively.
       
   316 
       
   317 @return KErrNone, if successful, otherwise one of the other system-wide
       
   318         error codes.
       
   319 */
       
   320 	{
       
   321 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFsCreatePrivatePath, MODULEUID, Handle(), aDrive);
       
   322 	TInt r = SendReceive(EFsCreatePrivatePath,TIpcArgs(aDrive));
       
   323 
       
   324 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsCreatePrivatePathReturn, MODULEUID, r);
       
   325 	return r;
       
   326 	}	
       
   327 
       
   328 
       
   329 
       
   330 
       
   331 EFSRV_EXPORT_C TVersion RFs::Version() const
       
   332 /**
       
   333 Gets the client side version number.
       
   334 
       
   335 @return The client side version number.
       
   336 */
       
   337 	{
       
   338 	TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFsVersion, MODULEUID, Handle());
       
   339 
       
   340 	TVersion r = TVersion(KF32MajorVersionNumber,KF32MinorVersionNumber,KF32BuildVersionNumber);
       
   341 
       
   342 	TRACERET3(UTF::EBorder, UTraceModuleEfsrv::EFsVersionReturn, MODULEUID, r.iMajor, r.iMinor, r.iBuild);
       
   343 	return r;
       
   344 	}
       
   345 
       
   346 
       
   347 
       
   348 
       
   349 EFSRV_EXPORT_C TInt RFs::AddFileSystem(const TDesC& aFileName) const
       
   350 /**
       
   351 Adds a file system to the file server.
       
   352 
       
   353 After calling this function, use MountFileSystem() to mount the file system
       
   354 on a drive.
       
   355 
       
   356 @param aFileName The name of the file system .FSY to install. Its full path can
       
   357 				 be specified.
       
   358 
       
   359 @return KErrNone, if successful, otherwise one of the other system-wide
       
   360         error codes.
       
   361 
       
   362 @capability DiskAdmin
       
   363         
       
   364 @see RFs::MountFileSystem        
       
   365 */
       
   366 	{
       
   367 	TRACEMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsAddFileSystem, MODULEUID, Handle(), aFileName);
       
   368 	RLoader loader;
       
   369 	TInt r = loader.Connect();
       
   370 	if (r==KErrNone)
       
   371 		{
       
   372 		r = loader.SendReceive(ELoadFileSystem, TIpcArgs(0, &aFileName, 0));
       
   373 		loader.Close();
       
   374 		}
       
   375 
       
   376 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsAddFileSystemReturn, MODULEUID, r);
       
   377 	return r;
       
   378 	}
       
   379 
       
   380 
       
   381 
       
   382 
       
   383 EFSRV_EXPORT_C TInt RFs::RemoveFileSystem(const TDesC& aFileSystemName) const
       
   384 /**
       
   385 Removes the specified file system.
       
   386 
       
   387 @param aFileSystemName The fullname of the file system, as returned from
       
   388                        a call to FileSystemName(), to be removed.
       
   389 
       
   390 @return KErrNone, if successful;
       
   391         KErrNotFound, if aFileSystemName is not found;
       
   392         otrherwise one of the other system-wide error codes.
       
   393 
       
   394 @capability DiskAdmin
       
   395 
       
   396 */
       
   397 	{
       
   398 	TRACEMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsRemoveFileSystem, MODULEUID, Handle(), aFileSystemName);
       
   399 	TInt r = SendReceive(EFsRemoveFileSystem,TIpcArgs(&aFileSystemName));
       
   400 
       
   401 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsRemoveFileSystemReturn, MODULEUID, r);
       
   402 	return r;
       
   403 	}
       
   404 
       
   405 
       
   406 
       
   407 
       
   408 EFSRV_EXPORT_C TInt RFs::MountFileSystem(const TDesC& aFileSystemName,TInt aDrive) const
       
   409 /**
       
   410 Mounts a file system on a drive.
       
   411 
       
   412 The file system must first have been added to the file server using AddFileSystem().
       
   413 The drive is mounted as asynchronous, i.e operations on it don't block the file server and other drives;
       
   414 
       
   415 @param aFileSystemName The fullname of the file system, as returned from  a call to FileSystemName().
       
   416 @param aDrive          The drive on which the file system is to be mounted; this can be one of the values defined by TDriveNumber.
       
   417 
       
   418 @return KErrNone if successful, otherwise one of the other system-wide error codes.
       
   419 
       
   420 @capability DiskAdmin
       
   421 
       
   422 @see RFs::AddFileSystem
       
   423 @see RFs::FileSystemName
       
   424 */
       
   425 	{
       
   426 	TRACEMULT3(UTF::EBorder, UTraceModuleEfsrv::EFsMountFileSystem1, MODULEUID, Handle(), aFileSystemName, aDrive);
       
   427 	TInt r = SendReceive(EFsMountFileSystem,TIpcArgs(&aFileSystemName,aDrive,NULL,EFalse));
       
   428 
       
   429 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsMountFileSystem1Return, MODULEUID, r);
       
   430 	return r;
       
   431 	}
       
   432 
       
   433 
       
   434 
       
   435 
       
   436 
       
   437 EFSRV_EXPORT_C TInt RFs::MountFileSystem(const TDesC& aFileSystemName,TInt aDrive, TBool aIsSync) const
       
   438 /**
       
   439 Mounts a file system on a specified drive.
       
   440 
       
   441 The file system must first have been added to the file server using AddFileSystem().
       
   442 Depending on the aIsSync parameter, the drive can be mounted as synchronous or asynchronous.
       
   443 
       
   444 Asynchronous drive has its own processing thread, i.e operations on it don't block the file server and other drives;
       
   445 Synchronous drives' requests are being processed by the main file server thread and there is a possibility to block it along with
       
   446 all operations on other drives. Mounting a drive as synch. makes a sense if the operations on such drive are very fast e.g. this is an
       
   447 internal RAM or ROFS drive.
       
   448 
       
   449 @param aFileSystemName The fullname of the file system, as returned from a call to FileSystemName().
       
   450 @param aDrive          The drive number on which the file system is to be mounted; this can be one of the values defined by TDriveNumber.
       
   451 
       
   452 @param aIsSync         if ETrue  the drive will be mounted as synchronous one;
       
   453                        if EFalse the drive will be mounted as Asynchronous.
       
   454 
       
   455 @return KErrNone if successful, otherwise one of the other system-wide error codes.
       
   456 @capability DiskAdmin
       
   457 
       
   458 @see RFs::AddFileSystem
       
   459 @see RFs::FileSystemName
       
   460 */
       
   461 	{
       
   462 	TRACEMULT4(UTF::EBorder, UTraceModuleEfsrv::EFsMountFileSystem2, MODULEUID, Handle(), aFileSystemName, aDrive, aIsSync);
       
   463 
       
   464 	TInt r = SendReceive(EFsMountFileSystem,TIpcArgs(&aFileSystemName,aDrive,NULL,aIsSync));
       
   465 
       
   466 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsMountFileSystem2Return, MODULEUID, r);
       
   467 	return r;
       
   468 	}
       
   469 
       
   470 
       
   471 
       
   472 
       
   473 EFSRV_EXPORT_C TInt RFs::MountFileSystem(const TDesC& aFileSystemName,const TDesC& aExtensionName,TInt aDrive)
       
   474 /**
       
   475 Mounts a file system on a drive, and the specified extension.
       
   476 
       
   477 The file system must first have been added to the file server using AddFileSystem().
       
   478 The drive is mounted as asynchronous, i.e operations on it don't block the file server and other drives;
       
   479 
       
   480 @param aFileSystemName The fullname of the file system, as returned from a call to FileSystemName().
       
   481 @param aExtensionName  The filename of the extension.
       
   482 @param aDrive          The drive on which the file system is to be mounted; this can be one of the values defined by TDriveNumber.
       
   483 
       
   484 @return KErrNone if successful, otherwise one of the other system-wide error codes.
       
   485 
       
   486 @capability DiskAdmin
       
   487 
       
   488 @see RFs::AddFileSystem
       
   489 @see RFs::FileSystemName
       
   490 */
       
   491 	{
       
   492 	TRACEMULT4(UTF::EBorder, UTraceModuleEfsrv::EFsMountFileSystem3, MODULEUID, Handle(), aFileSystemName, aExtensionName, aDrive);
       
   493 
       
   494 	TInt r = SendReceive(EFsMountFileSystem,TIpcArgs(&aFileSystemName,aDrive,&aExtensionName,EFalse));
       
   495 
       
   496 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsMountFileSystem3Return, MODULEUID, r);
       
   497 	return r;
       
   498 	}
       
   499 
       
   500 
       
   501 
       
   502 
       
   503 EFSRV_EXPORT_C TInt RFs::MountFileSystem(const TDesC& aFileSystemName,const TDesC& aExtensionName,TInt aDrive, TBool aIsSync)
       
   504 /**
       
   505 Mounts a file system on a drive, and the specified extension.
       
   506 
       
   507 The file system must first have been added to the file server using AddFileSystem().
       
   508 
       
   509 Depending on the aIsSync parameter, the drive can be mounted as synchronous or asynchronous.
       
   510 
       
   511 Asynchronous drive has its own processing thread, i.e operations on it don't block the file server and other drives;
       
   512 Synchronous drives' requests are being processed by the main file server thread and there is a possibility to block it along with
       
   513 all operations on other drives. Mounting a drive as synch. makes  sense if the operations on such drive are very fast e.g. this is an
       
   514 internal RAM or ROFS drive.
       
   515 
       
   516 @param aFileSystemName The fullname of the file system, as returned from a call to FileSystemName().
       
   517 @param aExtensionName  The filename of the extension.
       
   518 @param aDrive          The drive on which the file system is to be mounted; this can be one of the values defined by TDriveNumber.
       
   519 
       
   520 @param aIsSync         if ETrue  the drive will be mounted as synchronous one;
       
   521                        if EFalse the drive will be mounted as Asynchronous.
       
   522 
       
   523 @return KErrNone if successful, otherwise one of the other system-wide error codes.
       
   524 
       
   525 @capability DiskAdmin
       
   526 
       
   527 @see RFs::AddFileSystem
       
   528 @see RFs::FileSystemName
       
   529 */
       
   530 	{
       
   531 	TRACEMULT5(UTF::EBorder, UTraceModuleEfsrv::EFsMountFileSystem4, MODULEUID, Handle(), aFileSystemName, aExtensionName, aDrive, aIsSync);
       
   532 	TInt r = SendReceive(EFsMountFileSystem,TIpcArgs(&aFileSystemName,aDrive,&aExtensionName,aIsSync));
       
   533 
       
   534 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsMountFileSystem4Return, MODULEUID, r);
       
   535 	return r;
       
   536 	}
       
   537 
       
   538 
       
   539 
       
   540 
       
   541 EFSRV_EXPORT_C TInt RFs::MountFileSystemAndScan(const TDesC& aFileSystemName,TInt aDrive,TBool& aIsMountSuccess) const
       
   542 /**
       
   543 Mounts a file system on a drive, and performs a scan on that drive.
       
   544 The file system must first have been added to the file server using AddFileSystem().
       
   545 
       
   546 Note that the scan is done only if the mount is successful.
       
   547 
       
   548 The drive is mounted as asynchronous, i.e operations on it don't block the file server and other drives;
       
   549 
       
   550 @param aFileSystemName The fullname of the file system, as returned from a call to FileSystemName().
       
   551 @param aDrive          The drive on which the file system is to be mounted; this can be one of the values defined by TDriveNumber.
       
   552 @param aIsMountSuccess On return, set to: ETrue, if the  if the mount is successful, set to EFalse otherwise.
       
   553 
       
   554 @return KErrNone if successful, otherwise one of the other system-wide error codes, reflecting the failure of the mount operation. 
       
   555 
       
   556 @capability DiskAdmin
       
   557 
       
   558 @see RFs::TDriveNumber
       
   559 @see RFs::AddFileSystem
       
   560 @see RFs::FileSystemName
       
   561 */
       
   562 	{
       
   563 	TRACEMULT3(UTF::EBorder, UTraceModuleEfsrv::EFsMountFileSystemAndScan1, MODULEUID, Handle(), aFileSystemName, aDrive);
       
   564 	aIsMountSuccess=EFalse;
       
   565 	TPckg<TInt> pckg(aIsMountSuccess);
       
   566 	TInt r = SendReceive(EFsMountFileSystemScan,TIpcArgs(&aFileSystemName,aDrive,NULL,&pckg));
       
   567 
       
   568 	TRACERET2(UTF::EBorder, UTraceModuleEfsrv::EFsMountFileSystemAndScan1Return, MODULEUID, r, aIsMountSuccess);
       
   569 	return r;
       
   570 	}
       
   571 
       
   572 EFSRV_EXPORT_C TInt RFs::MountFileSystemAndScan(const TDesC& aFileSystemName,const TDesC& aExtensionName,TInt aDrive,TBool& aIsMountSuccess) const
       
   573 /**
       
   574 Mounts a file system on a drive, and the specified extension and performs a scan on that drive.
       
   575 
       
   576 The file system must first have been added to the file server,
       
   577 using AddFileSystem().
       
   578 
       
   579 Note that the scan is done only if the mount is successful.
       
   580 
       
   581 The operation is asynchronous, i.e other concurrent file server operations can continue.
       
   582 
       
   583 @param aFileSystemName The fullname of the file system, as returned from
       
   584                        a call to FileSystemName().
       
   585 @param aExtensionName  The filename of the extension.
       
   586 @param aDrive          The drive on which the file system is to be mounted;
       
   587                        this can be one of the values defined by TDriveNumber.
       
   588 @param aIsMountSuccess On return, set to: ETrue, if the  if the mount
       
   589                        is successful, set to EFalse otherwise.
       
   590 
       
   591 @return KErrNone if successful, otherwise one of the other system-wide
       
   592         error codes, reflecting the failure of the mount operation. 
       
   593 
       
   594 @capability DiskAdmin
       
   595 
       
   596 @see RFs::TDriveNumber
       
   597 @see RFs::AddFileSystem
       
   598 @see RFs::FileSystemName
       
   599 */
       
   600 	{
       
   601 	TRACEMULT5(UTF::EBorder, UTraceModuleEfsrv::EFsMountFileSystemAndScan2, MODULEUID, 
       
   602 		Handle(), aFileSystemName, aExtensionName, aDrive, aIsMountSuccess);
       
   603 
       
   604 	aIsMountSuccess=EFalse;
       
   605 	TPckg<TInt> pckg(aIsMountSuccess);
       
   606 	TInt r = SendReceive(EFsMountFileSystemScan,TIpcArgs(&aFileSystemName,aDrive,&aExtensionName,&pckg));
       
   607 
       
   608 	TRACERET2(UTF::EBorder, UTraceModuleEfsrv::EFsMountFileSystemAndScan2Return, MODULEUID, r, aIsMountSuccess);
       
   609 	return r;
       
   610 	}
       
   611 
       
   612 EFSRV_EXPORT_C TInt RFs::DismountFileSystem(const TDesC& aFileSystemName,TInt aDrive) const
       
   613 /**
       
   614 Dismounts the file system from the specified drive.
       
   615 
       
   616 @param aFileSystemName The fullname of the file system, as returned from
       
   617                        a call to FileSystemName().
       
   618 @param aDrive          The drive from which the file system is to be dismounted.
       
   619 
       
   620 @return KErrNone, if successful;
       
   621         KErrNotFound, if aFileSystemName is not found;
       
   622         KErrNotReady, if the drive does not have a file	system mounted on it;
       
   623         KErrInUse, if the drive has a resource open	on it;
       
   624         KErrAccessDenied, if there is an attempt to dismount a ROM file system,
       
   625         a substituted drive, or the drive which is the default drive;
       
   626  		KErrArgument, if the specified drive value is outsdide of the valid range.
       
   627  		KErrPermissionDenied, if the client does not have the necessary capabilities 
       
   628  		to dismount the file system. 		
       
   629 
       
   630 @capability DiskAdmin
       
   631  		
       
   632 @see RFs::FileSystemName 		
       
   633 */
       
   634 	{
       
   635 	TRACEMULT3(UTF::EBorder, UTraceModuleEfsrv::EFsDismountFileSystem, MODULEUID, Handle(), aFileSystemName, aDrive);
       
   636 	TInt r = SendReceive(EFsDismountFileSystem,TIpcArgs(&aFileSystemName,aDrive));
       
   637 
       
   638 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsDismountFileSystemReturn, MODULEUID, r);
       
   639 	return r;
       
   640 	}
       
   641 
       
   642 
       
   643 
       
   644 
       
   645 /**
       
   646     Gets the name of the file system mounted on the specified drive.
       
   647 
       
   648     The function can be called before calling DismountFileSystem().
       
   649 			     
       
   650     @param aName  On successful return, contains the name of the file system.
       
   651     @param aDrive The drive for which the file system name is required.
       
   652 
       
   653     @return KErrNone, if successful;
       
   654             KErrNotFound if aFileSystemName is not found, or the drive does not have a file	system mounted on it;
       
   655             KErrArgument, if the drive value is outside the valid range, i.e. zero to KMaxDrives-1 inclusive.
       
   656 
       
   657     @see RFs::DismountFileSystem				
       
   658 */
       
   659 EFSRV_EXPORT_C TInt RFs::FileSystemName(TDes& aName,TInt aDrive) const
       
   660 	{
       
   661 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFsFileSystemName, MODULEUID, Handle(), aDrive);
       
   662 
       
   663 	//-- ipc argument "-1" here is to indicate legacy FileSystemName() API
       
   664     TInt r = SendReceive(EFsFileSystemName,TIpcArgs(&aName, aDrive, -1)); 
       
   665 
       
   666 	TRACERETMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsFileSystemNameReturn, MODULEUID, r, aName);
       
   667 	return r;
       
   668 	}
       
   669 
       
   670 
       
   671 /**
       
   672     Get one of the supported file system names on a specified drive. This API can be used for enumerating 
       
   673     file systems that can be recognised and mounted automatically, without user's interaction. 
       
   674     If the automatic recognition and mountng some known file systems is supported on the specified drive, there 
       
   675     shall be at least 2 names in the list. For example "FAT" and "exFAT". 
       
   676     If "automatic file system recognising" feature is not supported, the list will consist of just one name, and 
       
   677     this will be the name returned by RFs::FileSystemName() API.
       
   678 
       
   679     @param  aName           On successful return, contains the name of the file system that correspond to the aFsEnumerator value.
       
   680     m@param aDrive          The drive number 
       
   681     @param  aFsEnumerator   The supported file system enumerator. can be:
       
   682                             KRootFileSystem a special value; in this case the returned name will be the same as obtained by FileSystemName()
       
   683                             0,1,2... integer values specifying the sequential number of supported filesystem. See the return error code.
       
   684     
       
   685     @return KErrNone        success, aName contains a valid name for the supported file system number "aFsEnumerator" on this drive.
       
   686             KErrNotFound    the end of the supported file names list; "aFsEnumerator-1" was the last correct value
       
   687             KErrArgument    incorrect arguments
       
   688             
       
   689     
       
   690     @see FileSystemName()
       
   691     @see KRootFileSystem   
       
   692 */
       
   693 EFSRV_EXPORT_C TInt RFs::SupportedFileSystemName(TDes& aName, TInt aDrive, TInt aFsEnumerator) const
       
   694     {
       
   695 	if(aFsEnumerator < 0)
       
   696         return KErrArgument; //-- see RFs::FileSystemName(). "-1" is a reserved value
       
   697 
       
   698     TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFsFileSystemName, MODULEUID, Handle(), aDrive);
       
   699     
       
   700     TInt r = SendReceive(EFsFileSystemName,TIpcArgs(&aName, aDrive, aFsEnumerator));
       
   701 
       
   702 	TRACERETMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsFileSystemNameReturn, MODULEUID, r, aName);
       
   703 	return r;
       
   704     }
       
   705 
       
   706 
       
   707 
       
   708 
       
   709 
       
   710 EFSRV_EXPORT_C TInt RFs::AddExtension(const TDesC& aFileName)
       
   711 /**
       
   712 Loads the specified extension.
       
   713 
       
   714 @param aFileName The file name of the extension
       
   715 
       
   716 @return KErrNone, if successful; otherwise one of the other system wide error codes.
       
   717 */
       
   718 	{
       
   719 	TRACEMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsAddExtension, MODULEUID, Handle(), aFileName);
       
   720 	RLoader loader;
       
   721 	TInt r = loader.Connect();
       
   722 	if (r==KErrNone)
       
   723 		{
       
   724 		r = loader.SendReceive(ELoadFSExtension, TIpcArgs(0, &aFileName, 0));
       
   725 		loader.Close();
       
   726 		}
       
   727 
       
   728 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsAddExtensionReturn, MODULEUID, r);
       
   729 	return r;
       
   730 	}
       
   731 
       
   732 
       
   733 
       
   734 
       
   735 EFSRV_EXPORT_C TInt RFs::MountExtension(const TDesC& aExtensionName,TInt aDrive)
       
   736 /**
       
   737 Mounts the the specified extension.
       
   738 
       
   739 The extension must first have been loaded using AddExtension().
       
   740 
       
   741 @param aExtensionName  The fullname of the extension, as returned from
       
   742                        a call to ExtensionName().
       
   743 @param aDrive          The drive on which the extension is to be mounted;
       
   744 
       
   745 @return KErrNone if successful;
       
   746         KErrNotFound, if the extension cannot be found;
       
   747         otherwise one of the other system-wide error codes.
       
   748 
       
   749 @see RFs::ExtensionName
       
   750 */
       
   751 	{
       
   752 	TRACEMULT3(UTF::EBorder, UTraceModuleEfsrv::EFsMountExtension, MODULEUID, Handle(), aExtensionName, aDrive);
       
   753 	TInt r = SendReceive(EFsMountExtension,TIpcArgs(&aExtensionName,aDrive));
       
   754 
       
   755 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsMountExtensionReturn, MODULEUID, r);
       
   756 	return r;
       
   757 	}
       
   758 
       
   759 
       
   760 
       
   761 
       
   762 /**
       
   763 Dismounts the specified extension.
       
   764 
       
   765 @param aExtensionName  The fullname of the extension, as returned from a call to ExtensionName().
       
   766 @param aDrive          The drive this extension is to be dismounted from.
       
   767 
       
   768 @return KErrNone if successful;
       
   769         KErrNotFound    if the extension cannot be found;
       
   770         otherwise one of the other system-wide error codes.
       
   771         
       
   772 @see RFs::ExtensionName
       
   773 */
       
   774 EFSRV_EXPORT_C TInt RFs::DismountExtension(const TDesC& aExtensionName,TInt aDrive)
       
   775 	{
       
   776 	TRACEMULT3(UTF::EBorder, UTraceModuleEfsrv::EFsDismountExtension, MODULEUID, Handle(), aExtensionName, aDrive);
       
   777 	TInt r = SendReceive(EFsDismountExtension,TIpcArgs(&aExtensionName,aDrive));
       
   778 
       
   779 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsDismountExtensionReturn, MODULEUID, r);
       
   780 	return r;
       
   781 	}
       
   782 
       
   783 
       
   784 EFSRV_EXPORT_C TInt RFs::RemoveExtension(const TDesC& aExtensionName)
       
   785 /**
       
   786 Removes the specified extension.
       
   787 
       
   788 @param aExtensionName The fullname of the extension, as returned from
       
   789                       a call to ExtensionName().
       
   790 
       
   791 @return KErrNone, if successful;
       
   792         KErrNotFound, if aExtensionName is not found;
       
   793         otrherwise one of the other system-wide error codes.
       
   794 */
       
   795 	{
       
   796 	TRACEMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsRemoveExtension, MODULEUID, Handle(), aExtensionName);
       
   797 	TInt r = SendReceive(EFsRemoveExtension,TIpcArgs(&aExtensionName));
       
   798 
       
   799 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsRemoveExtensionReturn, MODULEUID, r);
       
   800 	return r;
       
   801 	}
       
   802 
       
   803 
       
   804 
       
   805 
       
   806 EFSRV_EXPORT_C TInt RFs::ExtensionName(TDes& aExtensionName,TInt aDrive,TInt aPos)
       
   807 /**
       
   808 Gets the name of the extension on the specified drive at the specified position
       
   809 in the extension hierarchy.
       
   810 			 
       
   811 @param aExtensionName  On successful return, contains the name of the extension.
       
   812 @param aDrive          The drive for which the extension name is required.
       
   813 @param aPos            The position of the extension in the extension hierarchy.
       
   814 
       
   815 @return KErrNone, if successful;
       
   816         KErrNotFound if the extension name is not found;
       
   817 */
       
   818 	{
       
   819 	TRACEMULT4(UTF::EBorder, UTraceModuleEfsrv::EFsExtensionName, MODULEUID, Handle(), aExtensionName, aDrive, aPos);
       
   820 	TInt r = SendReceive(EFsExtensionName,TIpcArgs(&aExtensionName,aDrive,aPos));
       
   821 
       
   822 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsExtensionNameReturn, MODULEUID, r);
       
   823 	return r;
       
   824 	}
       
   825 
       
   826 
       
   827 
       
   828 
       
   829 EFSRV_EXPORT_C TInt RFs::RemountDrive(TInt aDrive,const TDesC8* aMountInfo,TUint aFlags)
       
   830 /**
       
   831 Forces a remount of the specified drive.
       
   832 
       
   833 @param aDrive     The drive for which a remount is to be forced.
       
   834 @param aMountInfo Information passed down to the media driver. The meaning of
       
   835                   this information depends on the media driver, for example,
       
   836                   keys for secure areas.
       
   837 @param aFlags     When the flag is set to
       
   838                   0x00000001 - Used to simulate ejecting and re-inserting the media.
       
   839                   0x80000000 - used to force the media driver for the specified logical
       
   840                                drive to be closed and reopened.
       
   841 
       
   842 @return KErrNone if successful, otherwise one of
       
   843         the other system wide error codes.
       
   844 */
       
   845 	{
       
   846 	TRACE4(UTF::EBorder, UTraceModuleEfsrv::EFsRemountDrive, MODULEUID, Handle(), aDrive, aMountInfo, aFlags);
       
   847 	TInt r = SendReceive(EFsRemountDrive,TIpcArgs(aDrive,aMountInfo,aFlags));
       
   848 
       
   849 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsRemountDriveReturn, MODULEUID, r);
       
   850 	return r;
       
   851 	}
       
   852 
       
   853 
       
   854 
       
   855 EFSRV_EXPORT_C void RFs::NotifyChange(TNotifyType aType,TRequestStatus& aStat)
       
   856 /**
       
   857 Requests a notification of change to files or directories.
       
   858 
       
   859 Changes are notified either:
       
   860 
       
   861 1. following any change in the file system
       
   862 
       
   863 or
       
   864 
       
   865 2. only following the addition or deletion of a directory entry, or after
       
   866    a disk has been formatted or changed.
       
   867  
       
   868 Such notification is useful for programs that maintain displays
       
   869 of file lists which must be dynamically updated. The alternative is to do
       
   870 no updating, or to perform periodic monitoring for change, which
       
   871 is inefficient.
       
   872 
       
   873 This is an asynchronous request and, as such, results in precisely one signal
       
   874 to the request status passed as a parameter. To avoid missing any change, this
       
   875 request should be issued before the first file list is constructed. When
       
   876 the request completes, a new request should be issued before the next file
       
   877 list is constructed. When the file server session is
       
   878 closed, this request is implicitly cancelled.
       
   879 
       
   880 Call NotifyChangeCancel() to explicitly cancel a notification request.
       
   881 
       
   882 @param aType Indicates the kind of change that should result in notification.
       
   883 			 For example:
       
   884 			 ENotifyEntry causes notification only when an entry is added or
       
   885              deleted, or when a disk is formatted or changed;
       
   886              ENotifyAll causes notification following any type of change, such
       
   887              as when a file is written to, or when a file's attributes
       
   888              are changed.
       
   889 @param aStat The request status.
       
   890              This is set to KErrNone on completion, otherwise one of the other
       
   891              system-wide error codes.
       
   892 
       
   893 */
       
   894 	{
       
   895 	TRACE3(UTF::EBorder, UTraceModuleEfsrv::EFsNotifyChange1, MODULEUID, Handle(), aType, &aStat);
       
   896 	aStat=KRequestPending;
       
   897 	// for backward compatibility
       
   898 	TNotifyType type = (aType == 0 ? ENotifyEntry : aType);
       
   899 	RSessionBase::SendReceive(EFsNotifyChange, TIpcArgs(type,&aStat) , aStat );
       
   900 	//This call is to synchronise with the file server when this functions stack varibles can go out of scope
       
   901 	SendReceive(EFsSynchroniseDriveThread, TIpcArgs(-1));		
       
   902 
       
   903 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFsNotifyChange1Return, MODULEUID);
       
   904 	}
       
   905 
       
   906 
       
   907 
       
   908 
       
   909 EFSRV_EXPORT_C void RFs::NotifyChange(TNotifyType aType,TRequestStatus& aStat,const TDesC& aPathName)
       
   910 /**
       
   911 Requests a notification of change to files or directories, allowing
       
   912 a directory/file path to be specified.
       
   913 
       
   914 Changes are notified either:
       
   915 
       
   916 1. following any change in the file system
       
   917 
       
   918 or
       
   919 
       
   920 2. only following the addition or deletion of a directory entry, or after
       
   921    a disk has been formatted or changed.
       
   922  
       
   923 Such notification is useful for programs that maintain displays
       
   924 of file lists which must be dynamically updated. The alternative is to do
       
   925 no updating, or to perform periodic monitoring for change, which
       
   926 is inefficient.
       
   927 
       
   928 This is an asynchronous request and, as such, results in precisely one signal
       
   929 to the request status passed as a parameter. To avoid missing any change, this
       
   930 request should be issued before the first file list is constructed. When
       
   931 the request completes, a new request should be issued before the next file
       
   932 list is constructed. When the file server session is
       
   933 closed, this request is implicitly cancelled.
       
   934 
       
   935 Call NotifyChangeCancel() to explicitly cancel a notification request.
       
   936 
       
   937 @param aType     Indicates the kind of change that should result in
       
   938                  notification. For example:
       
   939 			     ENotifyEntry causes notification only when an entry is added
       
   940 			     or deleted, or when a disk is formatted or changed;
       
   941                  ENotifyAll causes notification following any type of change,
       
   942                  such as when a file is written to, or when a file's attributes
       
   943                  are changed.
       
   944 @param aStat     The request status.
       
   945                  This is set to KErrNone on completion, otherwise one of
       
   946                  the other system-wide error codes.
       
   947 @param aPathName The directory or file for which notification is required. By
       
   948                  specifying a drive as a wildcard, for example
       
   949                  "?:\\Resource\\apps\\", or
       
   950 				 "*:\\Resource\\apps\\", a client can ask to be notified of changes
       
   951 				 to a given directory on any drive.
       
   952 				 As with all directory paths aPathName must be terminated with '\\',
       
   953 				 Please refer to "Structure of paths and filenames" section in the
       
   954 				 Symbian OS Library.
       
   955 
       
   956 @capability Dependent If aName is /Sys then AllFiles capability is required.
       
   957 @capability Dependent If aName begins with /Private and does not match this process' SID
       
   958 					  then AllFiles capability is required.
       
   959 
       
   960 */
       
   961 	{
       
   962 	TRACEMULT4(UTF::EBorder, UTraceModuleEfsrv::EFsNotifyChange2, MODULEUID, Handle(), (TUint) aType, (TUint) &aStat, aPathName);
       
   963 	aStat=KRequestPending;
       
   964 	// for backward compatibility
       
   965 	TNotifyType type = (aType == 0 ? ENotifyEntry : aType);
       
   966 	RSessionBase::SendReceive(EFsNotifyChangeEx,TIpcArgs(type,&aPathName,&aStat),aStat);
       
   967 	//This call is to synchronise with the file server when this functions stack varibles can go out of scope
       
   968 	SendReceive(EFsSynchroniseDriveThread, TIpcArgs(-1));
       
   969 
       
   970 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFsNotifyChange2Return, MODULEUID);
       
   971 	}
       
   972 
       
   973 
       
   974 
       
   975 
       
   976 EFSRV_EXPORT_C void RFs::NotifyChangeCancel()
       
   977 /**
       
   978 Cancels all outstanding requests for notification of change
       
   979 to files or directories.
       
   980 
       
   981 All outstanding requests complete with KErrCancel.
       
   982 
       
   983 Note that this is a synchronous function.
       
   984 
       
   985 */
       
   986 	{
       
   987 	TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFsNotifyChangeCancel1, MODULEUID, Handle());
       
   988 	RSessionBase::SendReceive(EFsNotifyChangeCancel);
       
   989 
       
   990 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFsNotifyChangeCancel1Return, MODULEUID);
       
   991 	}
       
   992 
       
   993 
       
   994 
       
   995 
       
   996 EFSRV_EXPORT_C void RFs::NotifyChangeCancel(TRequestStatus& aStat)
       
   997 /**
       
   998 Cancels the specific request for notification of change
       
   999 to files or directories.
       
  1000 
       
  1001 The outstanding request completes with KErrCancel.
       
  1002 
       
  1003 Note that this is an asynchronous function.
       
  1004 
       
  1005 @param aStat The request status object associated with the request
       
  1006              to be cancelled. Note that the function does not change
       
  1007              this parameter.
       
  1008 
       
  1009 */
       
  1010 	{
       
  1011 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFsNotifyChangeCancel2, MODULEUID, Handle(), &aStat);
       
  1012 	if (aStat==KRequestPending)			//	May be better to ASSERT this?
       
  1013 		SendReceive(EFsNotifyChangeCancelEx,TIpcArgs(&aStat));
       
  1014 
       
  1015 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFsNotifyChangeCancel2Return, MODULEUID);
       
  1016 	}
       
  1017 
       
  1018 
       
  1019 
       
  1020 
       
  1021 EFSRV_EXPORT_C void RFs::NotifyDiskSpace(TInt64 aThreshold,TInt aDrive,TRequestStatus& aStat)
       
  1022 /**
       
  1023 Requests notification when the free disk space on the specified
       
  1024 drive crosses the specified threshold value.
       
  1025 
       
  1026 The threshold is crossed if free disk space increases to a value above
       
  1027 the threshold value or decreases to a value below the threshold value.
       
  1028 
       
  1029 This is an asynchronous request that completes if any of the
       
  1030 following events occur:
       
  1031 
       
  1032 1. the threshold is crossed 
       
  1033 
       
  1034 2. any drive is formatted 
       
  1035 
       
  1036 3. there is a media change on any socket 
       
  1037 
       
  1038 4. power up 
       
  1039 
       
  1040 5. the scandrive utility is run on any drive
       
  1041 
       
  1042 5. the specified threshold value is outside its limits 
       
  1043 
       
  1044 7. the outstanding request is cancelled. 
       
  1045 
       
  1046 Note that free disk space notification is not supported for
       
  1047 drives using remote file systems.
       
  1048 
       
  1049 @param aThreshold The threshold value. This must be greater than zero and less
       
  1050                   than the total size of the disk.
       
  1051 @param aDrive     The drive number. This is an explicit drive defined by one of
       
  1052 				  the TDriveNumber enum values or the value
       
  1053 				  KDefaultDrive. If KDefaultDrive is specified, then
       
  1054                   the drive monitored is the session path drive.
       
  1055 @param aStat      The request status object. On request completion, contains:
       
  1056 				  KErrNone, if the threshold value is crossed, if any drive is
       
  1057                   formatted, if there is a media change on any socket, if there is a power up or
       
  1058 				  if the scandrive utility is run on any drive;
       
  1059 				  KErrCancel, if the outstanding request is cancelled by a call to
       
  1060                   NotifyDiskSpaceCancel();
       
  1061                   KErrArgument, if the threshold value is outside its limits.
       
  1062 
       
  1063 @see TDriveNumber
       
  1064 */
       
  1065 	{
       
  1066 	TRACE5(UTF::EBorder, UTraceModuleEfsrv::EFsNotifyDiskSpace, MODULEUID, 
       
  1067 		Handle(), I64LOW(aThreshold),I64HIGH(aThreshold), aDrive,(TUint) &aStat);
       
  1068 	aStat=KRequestPending;
       
  1069 	TPtrC8 tBuf((TUint8*)&aThreshold,sizeof(TInt64));
       
  1070 	RSessionBase::SendReceive(EFsNotifyDiskSpace,TIpcArgs(&tBuf,aDrive,&aStat), aStat);
       
  1071 	//This call is to synchronise with the driver thread as corresponding cancel function (NotifyDiskSpaceCancel)
       
  1072 	//is synchronous, so it can complete before this notify request has even been added to TDiskSpaceQue.
       
  1073 	//This call guarantees that the notify request has been added to queue.
       
  1074 	SendReceive(EFsSynchroniseDriveThread, TIpcArgs(aDrive));
       
  1075 
       
  1076 
       
  1077 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFsNotifyDiskSpaceReturn, MODULEUID);
       
  1078 	}
       
  1079 
       
  1080 
       
  1081 
       
  1082 
       
  1083 EFSRV_EXPORT_C void RFs::NotifyDiskSpaceCancel(TRequestStatus& aStat)
       
  1084 /**
       
  1085 Cancels a specific outstanding request for free disk space
       
  1086 notification.
       
  1087 
       
  1088 The outstanding request completes with KErrCancel.
       
  1089 
       
  1090 @param aStat The request status object identified with the original
       
  1091 			 notification request.
       
  1092 */
       
  1093 	{
       
  1094 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFsNotifyDiskSpaceCancel1, MODULEUID, Handle(), &aStat);
       
  1095 	
       
  1096 	if(aStat==KRequestPending)
       
  1097 		SendReceive(EFsNotifyDiskSpaceCancel,TIpcArgs(&aStat));
       
  1098 
       
  1099 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFsNotifyDiskSpaceCancel1Return, MODULEUID);
       
  1100 	}
       
  1101 
       
  1102 
       
  1103 
       
  1104 
       
  1105 EFSRV_EXPORT_C void RFs::NotifyDiskSpaceCancel()
       
  1106 /**
       
  1107 Cancels all outstanding requests for free disk space
       
  1108 notification.
       
  1109 
       
  1110 Outstanding requests complete with KErrCancel.
       
  1111 */
       
  1112 	{
       
  1113 	TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFsNotifyDiskSpaceCancel2, MODULEUID, Handle());
       
  1114 	SendReceive(EFsNotifyDiskSpaceCancel,TIpcArgs(NULL));
       
  1115 
       
  1116 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFsNotifyDiskSpaceCancel2Return, MODULEUID);
       
  1117 	}
       
  1118 
       
  1119 
       
  1120 
       
  1121 
       
  1122 EFSRV_EXPORT_C TInt RFs::DriveList(TDriveList& aList) const
       
  1123 /**
       
  1124 Gets a list of the available (not remote and non hidden) drives.
       
  1125 
       
  1126 The drive list consists of an array of 26 bytes. Array index zero corresponds
       
  1127 to drive A, index one equals B etc.
       
  1128 
       
  1129 Each byte with a non zero value signifies that the corresponding drive is available
       
  1130 to the system. In the case of removable media, RFs::Drive should be used to determine
       
  1131 whether the media is inserted or not.
       
  1132 
       
  1133 The local file system always reserves drive letters A through I.
       
  1134 Drive letter Z is always used for the ROM which means that letters J through Y
       
  1135 are available to be used by SetSubst() or for redirecting.				
       
  1136 
       
  1137 @param aList On return, contains a list of drive attributes (only the first 8 bits) for the available non-remote and non-hidden drives.
       
  1138 
       
  1139 @return KErrNone, successful, otherwise one of the other system-wide error codes.
       
  1140 */
       
  1141 	{
       
  1142 	TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFsDriveList1, MODULEUID, Handle());
       
  1143 	TInt r = SendReceive(EFsDriveList,TIpcArgs(&aList, KDriveAttExclude|KDriveAttRemote|KDriveAttHidden));
       
  1144 
       
  1145 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsDriveList1Return, MODULEUID, r);
       
  1146 	return r;
       
  1147 	}
       
  1148 
       
  1149 
       
  1150 
       
  1151 EFSRV_EXPORT_C TInt RFs::DriveList(TDriveList& aList, TUint aFlags) const
       
  1152 /**
       
  1153 Gets a list of the available drives that match a combination of drive attributes,specified in aFlags.
       
  1154 This combination may include,exclude or exclusively specify the attributes that that drives to be returned 
       
  1155 should match.
       
  1156 
       
  1157 The drive list consists of an array of 26 bytes. Array index zero corresponds
       
  1158 to drive A, index one equals B etc.
       
  1159 
       
  1160 Each byte with a non zero value signifies that the corresponding drive is available
       
  1161 to the system. In the case of removable media, RFs::Drive should be used to determine
       
  1162 whether the media is inserted or not.
       
  1163 
       
  1164 The local file system always reserves drive letters A through I.
       
  1165 Drive letter Z is always used for the ROM which means that letters J through Y
       
  1166 are available to be used by SetSubst() or for redirecting.				
       
  1167 
       
  1168 @param aList On return, contains a list of available drives that qualify aFlags.
       
  1169 
       
  1170 @param aFlags A combination of drive attributes that drives to be returned must qualify. 
       
  1171 
       
  1172 @return KErrNone, successful, otherwise one of the other system-wide error codes;
       
  1173 		KErrArgument, If aFlags contains an invalid attribute combination.
       
  1174 */
       
  1175 	{
       
  1176 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFsDriveList2, MODULEUID, Handle(), aFlags);
       
  1177 	TInt r = SendReceive(EFsDriveList,TIpcArgs(&aList,aFlags));
       
  1178 
       
  1179 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsDriveList2Return, MODULEUID, r);
       
  1180 	return r;
       
  1181 	}
       
  1182 
       
  1183 
       
  1184 
       
  1185 
       
  1186 EFSRV_EXPORT_C TInt RFs::Drive(TDriveInfo& anInfo,TInt aDrive) const
       
  1187 /**
       
  1188 Gets information about a drive and the medium mounted on it.
       
  1189 
       
  1190 Note that Volume() can also be used to give information about the drive and
       
  1191 the volume mounted on it. These two functions are separate because, while
       
  1192 the characteristics of a drive cannot change, those of a
       
  1193 volume can, by mounting different media, reformatting etc.
       
  1194 			 
       
  1195 @param anInfo On return, contains information describing the drive
       
  1196 			  and the medium mounted on it. The value of TDriveInfo::iType
       
  1197 			  shows whether the drive contains media.
       
  1198 @param aDrive The drive for which information is requested.
       
  1199               Specify KDefaultDrive for the session default drive.
       
  1200 			  Specify a drive in the range EDriveA to EDriveZ for drives
       
  1201 			  A to Z respectively.
       
  1202 
       
  1203 @return       KErrNone, if successful, otherwise one of the other
       
  1204               system-wide error codes.
       
  1205 			 
       
  1206 @see RFs::Volume
       
  1207 */
       
  1208 	{
       
  1209 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFsDrive, MODULEUID, Handle(), aDrive);
       
  1210 
       
  1211 	TPckg<TDriveInfo> m(anInfo);
       
  1212 	TInt r = SendReceive(EFsDrive,TIpcArgs(&m,aDrive));
       
  1213 
       
  1214 	TRACERET4(UTF::EBorder, UTraceModuleEfsrv::EFsDriveReturn, MODULEUID, r, anInfo.iDriveAtt, anInfo.iMediaAtt, anInfo.iType);
       
  1215 	return r;
       
  1216 	}
       
  1217 
       
  1218 
       
  1219 
       
  1220 
       
  1221 EFSRV_EXPORT_C TInt RFs::Volume(TVolumeInfo& aVol,TInt aDrive) const
       
  1222 /**
       
  1223 Gets volume information for a formatted device.
       
  1224 
       
  1225 This function provides additional information to that given by Drive(),
       
  1226 including the volume label, if set, and the amount of free space on the
       
  1227 disk.
       
  1228 
       
  1229 Note, use Drive() to get information about the drive without reference to
       
  1230 a volume. These two functions are separate because, while the characteristics
       
  1231 of a drive cannot change, those of a volume can, by mounting different media,
       
  1232 reformatting etc. A volume may not even be present if the media is removable.
       
  1233 
       
  1234 @param aVol   On return, contains the volume information.
       
  1235 @param aDrive The drive which contains the media for which volume information is to be displayed.
       
  1236               Specify a drive in the range EDriveA to EDriveZ for drives A to Z respectively. 
       
  1237               The default drive is the session default drive KDefaultDrive.
       
  1238 
       
  1239 @return KErrNone, if successful;
       
  1240         KErrNotReady, if the drive contains no media;
       
  1241         otherwise one of the other system-wide error codes.
       
  1242 			
       
  1243 @see RFs::Drive
       
  1244 */
       
  1245 	{
       
  1246 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFsVolume1, MODULEUID, Handle(), aDrive);
       
  1247 	TPckg<TVolumeInfo> v(aVol);
       
  1248     TInt r = SendReceive(EFsVolume,TIpcArgs(&v,aDrive,NULL));
       
  1249 
       
  1250 	TRACE7(UTF::EBorder, UTraceModuleEfsrv::EFsVolume1Return, MODULEUID, 
       
  1251 		r, aVol.iUniqueID, I64LOW(aVol.iSize), I64HIGH(aVol.iSize),
       
  1252 		I64LOW(aVol.iFree), I64HIGH(aVol.iFree), aVol.iFileCacheFlags);
       
  1253 	return r;
       
  1254 	}
       
  1255 
       
  1256 /**
       
  1257 Gets volume information for a formatted device asynchronously.
       
  1258 @see TInt RFs::Volume(TVolumeInfo& aVol,TInt aDrive) for the synchronous version.
       
  1259 
       
  1260 "Asynchronously" corresponds to the amount of free space on the volume in TVolumeInfo::iFree.
       
  1261 I.e. this function returns the _current_ amount of free space on the volume, which can be changing due to some
       
  1262 filesystems' activities. For example, some filesystems can be performing free space calculations in the background. 
       
  1263 Comparing to the RFs::Volume(TVolumeInfo& aVol,TInt aDrive), this method doesn't block the client until background filesystem 
       
  1264 activity finishes, which can be useful in some situations. 
       
  1265 
       
  1266 @param aVol   On return, contains the volume information with the _current_ value in the TVolumeInfo::iFree.
       
  1267 @param aDrive Drive number to query. Specify a drive in the range EDriveA to EDriveZ for drives A to Z respectively. 
       
  1268 @param aStat  request status. At present is used just for indication of the asynchronous version and gets immediately completed, so there is no reason to analyse its value.                                                                                                                      
       
  1269 			
       
  1270 @publishedPartner
       
  1271 @prototype
       
  1272 */
       
  1273 EFSRV_EXPORT_C void RFs::Volume(TVolumeInfo& aVol,TInt aDrive, TRequestStatus& aStat) const
       
  1274     {
       
  1275 	TRACE3(UTF::EBorder, UTraceModuleEfsrv::EFsVolume2, MODULEUID, Handle(), aDrive, &aStat);
       
  1276 	TPckg<TVolumeInfo> v(aVol);
       
  1277     aStat=KRequestPending;
       
  1278     RSessionBase::SendReceive(EFsVolume,TIpcArgs(&v,aDrive,&aStat), aStat);
       
  1279 
       
  1280 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFsVolume2Return, MODULEUID);
       
  1281     }
       
  1282 
       
  1283 
       
  1284 EFSRV_EXPORT_C TInt RFs::SetVolumeLabel(const TDesC& aName,TInt aDrive)
       
  1285 /**
       
  1286 Sets the label for a volume.
       
  1287 
       
  1288 Note that similar to file names, volume labels can be set with unicode characters.
       
  1289 However it may not be recognized properly if correct code page is not
       
  1290 loaded or it is mounted onto a system that does not support DBCS volume
       
  1291 labels
       
  1292 
       
  1293 @param aName  The volume label.
       
  1294 @param aDrive The drive containing the media whose label is to be set.
       
  1295 	          Specify a drive in the range EDriveA to EDriveZ for
       
  1296 			  drives A to Z.
       
  1297               The default drive is the session default drive KDefaultDrive.
       
  1298 
       
  1299 @return KErrNone, if successful;
       
  1300         KErrNotReady, if the drive contains no media;
       
  1301         otherwise one of the other system-wide error codes.
       
  1302 
       
  1303 @capability DiskAdmin
       
  1304 
       
  1305 @see TDriveNumber
       
  1306 @see TVolumeInfo::iName
       
  1307 @see RFs::Volume
       
  1308 */
       
  1309 	{
       
  1310 	TRACEMULT3(UTF::EBorder, UTraceModuleEfsrv::EFsSetVolumeLabel, MODULEUID, 
       
  1311 		Handle(), aName, aDrive);
       
  1312 
       
  1313 	TInt r = SendReceive(EFsSetVolume,TIpcArgs(&aName,aDrive));
       
  1314 
       
  1315 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsSetVolumeLabelReturn, MODULEUID, r);
       
  1316 	return r;
       
  1317 	}
       
  1318 
       
  1319 
       
  1320 
       
  1321 
       
  1322 EFSRV_EXPORT_C TInt RFs::Subst(TDes& aPath,TInt aDrive) const
       
  1323 /**
       
  1324 Gets the path assigned to a drive letter by an earlier call to SetSubst().
       
  1325 
       
  1326 To find out whether a drive letter has been substituted, first get the drive
       
  1327 information, using Drive(), and then test the value of the KDriveAttSubsted bit
       
  1328 provided by TDriveInfo::iDriveAtt.
       
  1329 
       
  1330 @param aPath  On return, contains the path which has been assigned to the
       
  1331               drive. If the drive letter has not been substituted, this argument
       
  1332               returns an empty descriptor.
       
  1333 @param aDrive The drive which is the subject of the enquiry. Specify a number
       
  1334 			  in the range 0 (EDriveA) to 25 (>EDriveZ) for drives
       
  1335 			  A to Z. The default drive is the session default
       
  1336               drive KDefaultDrive.
       
  1337               
       
  1338 @return KErrNone, if successful, otherwise one of the other
       
  1339         system-wide error codes.
       
  1340 
       
  1341 @see RFs::SetSubst
       
  1342 @see TDriveInfo
       
  1343 @see RFs::Drive
       
  1344 */
       
  1345 	{
       
  1346 	TRACEMULT3(UTF::EBorder, UTraceModuleEfsrv::EFsSubst, MODULEUID, Handle(), aPath, aDrive);
       
  1347 	TInt r = SendReceive(EFsSubst,TIpcArgs(&aPath,aDrive));
       
  1348 
       
  1349 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsSubstReturn, MODULEUID, r);
       
  1350 	return r;
       
  1351 	}
       
  1352 
       
  1353 
       
  1354 
       
  1355 
       
  1356 EFSRV_EXPORT_C TInt RFs::SetSubst(const TDesC& aPath,TInt aDrive)
       
  1357 /**
       
  1358 Assigns a path to a drive letter.
       
  1359 
       
  1360 Whenever that drive letter is used, it will be translated into a reference
       
  1361 to the path specified here. To	clear a drive substitution, specify an empty
       
  1362 descriptor for aPath. 
       
  1363 
       
  1364 Note that the substituted path is text-only. Its components need not
       
  1365 be syntactically correct, nor must they be valid at the time the substitution
       
  1366 is set. Any component may be deleted, removed or unmounted while the
       
  1367 substitution is set.
       
  1368 
       
  1369 @param aPath  The path to be assigned to the drive letter. If a drive letter
       
  1370 			  is specified in the path, it must not itself be substituted or
       
  1371 			  redirected, or the function will return an error. If no drive is
       
  1372 			  specified, the drive contained in the default session path is
       
  1373 			  used, and if no path is specified, the default session path is
       
  1374 			  used. If a filename or extension is included in the  path,
       
  1375 			  the function will return an error. Therefore, the final component
       
  1376 			  in the path must have a trailing backslash to indicate that it is
       
  1377 			  a directory.
       
  1378 			 
       
  1379 @param aDrive The drive to which a path is to be assigned. Specify a number
       
  1380 			  in the range 0 (EDriveA) to 25 (EDriveZ) for drives
       
  1381 			  A to Z. Must not be local, ROM, or redirected, otherwise an
       
  1382               error is returned. May be substituted, but only if the function
       
  1383               is being used	to clear the substitution. If the same drive is
       
  1384               specified in the path, the function will return an error.
       
  1385               The default drive is the session default drive
       
  1386 			  KDefaultDrive.
       
  1387 			 
       
  1388 @return KErrNone, if successful; otherwise one of the other	system-wide
       
  1389         error codes.
       
  1390 
       
  1391 @capability DiskAdmin
       
  1392 @capability Dependent If aPath is /Sys then Tcb capability is required.
       
  1393 @capability Dependent If aPath begins with /Private and does not match this process' SID
       
  1394 					  then AllFiles capability is required.
       
  1395 @capability Dependent If aPath is /Resource then Tcb capability is required.
       
  1396 */
       
  1397 	{
       
  1398 	TRACEMULT3(UTF::EBorder, UTraceModuleEfsrv::EFsSetSubst, MODULEUID, Handle(), aPath, aDrive);
       
  1399 	TInt r = SendReceive(EFsSetSubst,TIpcArgs(&aPath,aDrive));
       
  1400 
       
  1401 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsSetSubstReturn, MODULEUID, r);
       
  1402 	return r;
       
  1403 	}
       
  1404 
       
  1405 
       
  1406 
       
  1407 
       
  1408 EFSRV_EXPORT_C TInt RFs::RealName(const TDesC& aName,TDes& aResult) const
       
  1409 /**
       
  1410 Gets the real name of a file.
       
  1411 
       
  1412 This is used in circumstances where a file system needs to
       
  1413 mangle Symbian OS natural names so that it can store them on that file
       
  1414 system.
       
  1415 
       
  1416 @param aName   Contains the name by which the file is normally referred.
       
  1417 @param aResult On return, contains the real name of the file, comprising the
       
  1418                full path, including the drive letter.
       
  1419 
       
  1420 @return KErrNone if successful, otherwise one of the other
       
  1421         system-wide error codes.
       
  1422 
       
  1423 @capability Dependent If aName is /Sys then AllFiles capability is required.
       
  1424 @capability Dependent If aName begins with /Private and does not match this process' SID
       
  1425 					  then AllFiles capability is required.
       
  1426 
       
  1427 */
       
  1428 	{
       
  1429 	TRACEMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsRealName, MODULEUID, Handle(), aName);
       
  1430 	TInt r = SendReceive(EFsRealName,TIpcArgs(&aName,&aResult));
       
  1431 
       
  1432 	TRACERETMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsRealNameReturn, MODULEUID, r, aResult);
       
  1433 	return r;
       
  1434 	}
       
  1435 
       
  1436 
       
  1437 
       
  1438 
       
  1439 /**
       
  1440 Gets the serial number of media.
       
  1441 
       
  1442 Only local drive is allowed. Substed drive number will return KErrNotSupported.
       
  1443 
       
  1444 @param aSerialNum Contains serial number on successful return.
       
  1445 @param aDrive     Drive number.
       
  1446 
       
  1447 @return KErrNone            if successful;
       
  1448         KErrNotSupported    if media doesn't support serial number (e.g. substed drives);
       
  1449         KErrBadName         if drive number is invalid;
       
  1450         otherwise one of system-wide error codes.
       
  1451 
       
  1452 @see TMediaSerialNumber
       
  1453 */
       
  1454 EFSRV_EXPORT_C TInt RFs::GetMediaSerialNumber(TMediaSerialNumber& aSerialNum, TInt aDrive)
       
  1455     {
       
  1456 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFsGetMediaSerialNumber, MODULEUID, Handle(), aDrive);
       
  1457     TInt r = SendReceive(EFsGetMediaSerialNumber, TIpcArgs(&aSerialNum, aDrive));
       
  1458 
       
  1459 	TRACERETMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsGetMediaSerialNumberReturn, MODULEUID, r, aSerialNum);
       
  1460 	return r;
       
  1461     }
       
  1462 
       
  1463 
       
  1464 
       
  1465 
       
  1466 EFSRV_EXPORT_C TInt RFs::SessionPath(TDes& aPath) const
       
  1467 /**
       
  1468 Gets the session path.
       
  1469 
       
  1470 When a client connects to the file server, its session path is initialised to
       
  1471 the system default path. The session path of an existing client can only be
       
  1472 changed by this function.
       
  1473 
       
  1474 @param aPath On return, contains the session path, including a trailing
       
  1475              backslash.
       
  1476 
       
  1477 @return KErrNone if successful, otherwise one of the other
       
  1478         system-wide error codes.
       
  1479 */
       
  1480 	{
       
  1481 	TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFsSessionPath, MODULEUID, Handle());
       
  1482 	TInt r = SendReceive(EFsSessionPath,TIpcArgs(&aPath));
       
  1483 
       
  1484 	TRACERETMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsSessionPathReturn, MODULEUID, r, aPath);
       
  1485 	return r;
       
  1486 	}
       
  1487 
       
  1488 
       
  1489 
       
  1490 
       
  1491 EFSRV_EXPORT_C TInt RFs::SetSessionPath(const TDesC& aPath)
       
  1492 /**
       
  1493 Sets the session path for the current file server client.
       
  1494 
       
  1495 When the client first connects to the file server, its session path
       
  1496 is initialised to the system default path.
       
  1497 
       
  1498 Note that the session path is text-only. It does not cause any locking.
       
  1499 Thus, although the path must be syntactically correct, its components
       
  1500 do not need to be valid at the time the path is set, and any component may be
       
  1501 deleted, removed or unmounted while the path is set.
       
  1502 
       
  1503 @param aPath The new session path. Consists of a drive and path. Normally, a
       
  1504              drive should be specified, but if not, the drive specified in
       
  1505              the existing session path is preserved. If a file is specified,
       
  1506              then the function fails and returns an error code. Therefore,
       
  1507              the final component in the path must have a trailing backslash
       
  1508              to indicate that it is a directory. All components of the
       
  1509              path must be syntactically correct, for example, wildcard
       
  1510              characters and double backslashes are not allowed in any
       
  1511              part of it.
       
  1512 
       
  1513 @return KErrNone if successful, otherwise one of the other
       
  1514         system-wide error codes.
       
  1515 
       
  1516 @capability Dependent If aPath is /Sys then AllFiles capability is required.
       
  1517 @capability Dependent If aPath begins with /Private and does not match this process' SID
       
  1518 					  then AllFiles capability is required.
       
  1519 
       
  1520 */
       
  1521 	{
       
  1522 	TRACEMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsSetSessionPath, MODULEUID, Handle(), aPath);
       
  1523 	TInt r = SendReceive(EFsSetSessionPath,TIpcArgs(&aPath));
       
  1524 
       
  1525 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsSetSessionPathReturn, MODULEUID, r);
       
  1526 	return r;
       
  1527 	}
       
  1528 
       
  1529 
       
  1530 
       
  1531 
       
  1532 
       
  1533 /**
       
  1534 Makes a directory.
       
  1535 
       
  1536 It should be a sub-directory of an existing	directory and its name should be
       
  1537 unique within its parent directory, otherwise the function returns error code KErrAlreadyExists.
       
  1538 				
       
  1539 Note that if a filename is specified in the argument, it is	ignored.
       
  1540 Therefore, there should be a trailing backslash after the final
       
  1541 directory name in the argument to indicate that it is a directory, not a filename. 
       
  1542 
       
  1543 For example, following code will create directory "C:\\DIR1\\"
       
  1544    
       
  1545 @code
       
  1546 fs.MkDir(_L("C:\\DIR1\\"));
       
  1547 @endcode
       
  1548 
       
  1549 The last line in the following example will result in KErrAlreadyExists because "DIR2" doesn't have a trailing backslash, 
       
  1550 therefore is considered as a file name and discarded. Directory "C:\\DIR1\\" has already been created.
       
  1551 
       
  1552 @code
       
  1553 fs.MkDir(_L("C:\\DIR1\\"));     // shall create DIR1 in the root directory
       
  1554 fs.MkDir(_L("C:\\DIR1\\DIR2")); // No trailing backslash, fails with KErrAlreadyExists
       
  1555 @endcode
       
  1556 
       
  1557 This example will always fail because "DIR1" doesn't have a trailing backslash and discarded while the root
       
  1558 directory always exists. 
       
  1559 
       
  1560 @code
       
  1561 fs.MkDir(_L("C:\\DIR1"));  // No trailing backslash, will always fail with KErrAlreadyExists
       
  1562 @endcode
       
  1563 
       
  1564 Note, the following case
       
  1565 
       
  1566 @code
       
  1567 fs.MkDir(_L("C:\\example.txt\\"));	// would normally create a directory "c:\\example.txt\\" with KErrNone
       
  1568 @endcode
       
  1569  
       
  1570 But if there is a file named "example.txt", which exists at the same location, KErrAccessDenied is returned.    
       
  1571 
       
  1572 Note also that because this method can return an error code (eg. because
       
  1573 the disk is full) before checking whether the path already exists, it
       
  1574 is not appropriate to use it just to work out whether a path exists or not.
       
  1575 
       
  1576 See MkDirAll(), which may also create intermediate directories.
       
  1577 
       
  1578 @param aPath The name of the new directory. Any path components which are
       
  1579              not specified here will be taken from the session path.
       
  1580 			 The directory name shall not contain wild cards ('?' or '*' characters) 
       
  1581 			 and illegal characters like '<', '>', ':', '"', '/', '|' and '\000'.
       
  1582 			 The directory name containing only whilte space characters 
       
  1583 			 (See TChar::IsSpace()) is also illegal. 
       
  1584 
       
  1585 @return KErrNone if successful, otherwise one of the other
       
  1586         system-wide error codes. Even if another error code is returned,
       
  1587 		(for example, if the disk is full) it is still possible that the 
       
  1588 		path may already exist.
       
  1589 
       
  1590 @capability Dependent If aPath is /Sys then Tcb capability is required.
       
  1591 @capability Dependent If aPath begins with /Private and does not match this process' SID
       
  1592 					  then AllFiles capability is required.
       
  1593 @capability Dependent If aPath is /Resource then Tcb capability is required.
       
  1594         
       
  1595 @see RFs::MkDirAll       
       
  1596 */
       
  1597 EFSRV_EXPORT_C TInt RFs::MkDir(const TDesC& aPath)
       
  1598 	{
       
  1599 	TRACEMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsMkDir, MODULEUID, Handle(), aPath);
       
  1600 	TInt r = SendReceive(EFsMkDir,TIpcArgs(&aPath,NULL));
       
  1601 
       
  1602 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsMkDirReturn, MODULEUID, r);
       
  1603 	return r;
       
  1604 	}
       
  1605 
       
  1606 
       
  1607 
       
  1608 
       
  1609 
       
  1610 /**
       
  1611 Makes one or more directories.
       
  1612 
       
  1613 Any valid path component specified in aPath which does not already exist is
       
  1614 created as a directory.
       
  1615  
       
  1616 Note that if a filename is specified in the argument, it is	ignored.
       
  1617 Therefore, there should be a trailing backslash after the final
       
  1618 directory name in the argument to indicate that it is a directory, not a
       
  1619 filename.
       
  1620 
       
  1621 See also notes on RFs::MkDir() about trailing backslashes in directory names.
       
  1622 
       
  1623 Note also that because this method can return an error code (eg. because
       
  1624 the disk is full) before checking whether the path already exists, it
       
  1625 is not appropriate to use it just to work out whether a path exists or not.
       
  1626 		
       
  1627 See MkDir(), which creates only a single new directory.
       
  1628 
       
  1629 @param aPath The path name specifiying the directory or directories to
       
  1630              create. If the function completes successfully, this path
       
  1631              identifies a valid	directory. Any path components which are not
       
  1632              specified here are taken from the session path.
       
  1633 
       
  1634 @return KErrNone if successful, otherwise one of the other
       
  1635         system-wide error codes. Even if another error code is returned,
       
  1636 		(for example, if the disk is full) it is still possible that the 
       
  1637 		path may already exist. 
       
  1638 
       
  1639 
       
  1640 @capability Dependent If aPath is /Sys then Tcb capability is required.
       
  1641 @capability Dependent If aPath begins with /Private and does not match this process' SID
       
  1642 					  then AllFiles capability is required.
       
  1643 @capability Dependent If aPath is /Resource then Tcb capability is required.
       
  1644 
       
  1645 @see RFs::MkDir
       
  1646 */
       
  1647 EFSRV_EXPORT_C TInt RFs::MkDirAll(const TDesC& aPath)
       
  1648 	{
       
  1649 	TRACEMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsMkDirAll, MODULEUID, Handle(), aPath);
       
  1650 	TInt r = SendReceive(EFsMkDir,TIpcArgs(&aPath,TRUE));
       
  1651 
       
  1652 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsMkDirAllReturn, MODULEUID, r);
       
  1653 	return r;
       
  1654 	}
       
  1655 
       
  1656 
       
  1657 
       
  1658 
       
  1659 EFSRV_EXPORT_C TInt RFs::RmDir(const TDesC& aPath)
       
  1660 /**
       
  1661 Removes a directory.
       
  1662 
       
  1663 The directory must be empty and cannot be the root directory. 
       
  1664 
       
  1665 Note that if a filename is specified in the argument, it is
       
  1666 ignored. 
       
  1667 
       
  1668 For example, following code will result in directory "C:\\SRC\\" being removed as long as 
       
  1669 it is empty, the existance of "ENTRY" will not be checked:
       
  1670 
       
  1671 @code
       
  1672 fs.RmDir(_L("C:\\SRC\\ENTRY"));
       
  1673 @endcode
       
  1674 
       
  1675 Similarly, following code will try to remove "C:\\SRC\\" instead of "C:\\SRC\DIR\\":
       
  1676 @code
       
  1677 fs.RmDir(_L("C:\\SRC\\DIR"));
       
  1678 @endcode
       
  1679 
       
  1680 Therefore, there should be a trailing backslash after the final
       
  1681 directory name in the argument to indicate that it is a directory, not a
       
  1682 filename.
       
  1683 
       
  1684 See class CFileMan for information on deleting a
       
  1685 non-empty directory and all of its contents.
       
  1686 				
       
  1687 @param aPath The path name of the directory to be removed. Any path	components
       
  1688              which are not specified here are taken from the session path. Only
       
  1689              the lowest-level directory identified is removed.
       
  1690 
       
  1691 @return KErrNone, if successful;
       
  1692         KErrInUse, if trying to remove a non-empty directory or root directory;
       
  1693         otherwise, one of the other system-wide error codes.
       
  1694               
       
  1695 @capability Dependent If aPath is /Sys then Tcb capability is required.
       
  1696 @capability Dependent If aPath begins with /Private and does not match this process' SID
       
  1697 					  then AllFiles capability is required.
       
  1698 @capability Dependent If aPath is /Resource then Tcb capability is required.
       
  1699 
       
  1700 @see CFileMan
       
  1701 */
       
  1702 	{
       
  1703 	TRACEMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsRmDir, MODULEUID, Handle(), aPath);
       
  1704 	TInt r = SendReceive(EFsRmDir,TIpcArgs(&aPath));
       
  1705 
       
  1706 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsRmDirReturn, MODULEUID, r);
       
  1707 	return r;
       
  1708 	}
       
  1709 
       
  1710 
       
  1711 
       
  1712 
       
  1713 void RFs::GetDirL(const TDesC& aName,const TUidType& aUidType,TUint aKey,CDir*& aFileList,RDir& aDir) const
       
  1714 //
       
  1715 // Create a dir array. Leave on any error.
       
  1716 //
       
  1717 	{
       
  1718 	aFileList=NULL;
       
  1719 	User::LeaveIfError(aDir.Open((RFs& )*this,aName,aUidType));
       
  1720 	DoGetDirL(aKey,aFileList,aDir);
       
  1721 	}
       
  1722 
       
  1723 void RFs::GetDirL(const TDesC& aName,TUint anAttMask,TUint aKey,CDir*& aFileList,RDir& aDir) const
       
  1724 //
       
  1725 // Create a dir array. Leave on any error.
       
  1726 //
       
  1727 	{
       
  1728 
       
  1729 	aFileList=NULL;
       
  1730 	User::LeaveIfError(aDir.Open((RFs& )*this,aName,anAttMask));
       
  1731 	DoGetDirL(aKey,aFileList,aDir);
       
  1732 	}
       
  1733 
       
  1734 void RFs::GetDirL(const TDesC& aName,TUint anAttMask,TUint aKey,CDir*& aFileList,CDir*& aDirList,RDir& aDir) const
       
  1735 //
       
  1736 // Create a dir array. Leave on any error.
       
  1737 //
       
  1738 	{
       
  1739 	
       
  1740 	aDirList=NULL;
       
  1741 	GetDirL(aName,anAttMask|KEntryAttDir,aKey,aFileList,aDir);
       
  1742 	aFileList->ExtractL(!(anAttMask&KEntryAttDir),aDirList);
       
  1743 	}
       
  1744 
       
  1745 void RFs::DoGetDirL(TUint aKey,CDir*& aFileList,RDir& aDir) const
       
  1746 //
       
  1747 // Create a dir array. Leave on any error.
       
  1748 //
       
  1749 	{
       
  1750 
       
  1751 	aFileList=CDir::NewL();
       
  1752 	TInt r;
       
  1753 	TEntryArray* pArray=new(ELeave) TEntryArray;
       
  1754 	CleanupStack::PushL(pArray);
       
  1755 	
       
  1756 	TEntryArray& array=*pArray;
       
  1757 	do
       
  1758 		{
       
  1759 		r=aDir.Read(array);
       
  1760 		if (r==KErrNone || r==KErrEof)
       
  1761 			{
       
  1762 			TInt count=array.Count();
       
  1763 			if (count==0)
       
  1764 				break;
       
  1765 			TInt i=0;
       
  1766 			while (i<count)
       
  1767 				aFileList->AddL(array[i++]);
       
  1768 			}
       
  1769 		}while (r==KErrNone);
       
  1770 	
       
  1771 	CleanupStack::PopAndDestroy();
       
  1772 	if (!(r==KErrNone || r==KErrEof))
       
  1773 		User::Leave(r);
       
  1774 	aFileList->Compress();
       
  1775 	if (aKey==ESortNone)
       
  1776 		return;
       
  1777 	
       
  1778 	r=aFileList->Sort(aKey);
       
  1779 	if (r!=KErrNone)
       
  1780 		User::Leave(r);
       
  1781 	}
       
  1782 
       
  1783 
       
  1784 
       
  1785 
       
  1786 EFSRV_EXPORT_C TInt RFs::GetDir(const TDesC& aName,const TUidType& aUidType,TUint aKey,CDir*& aFileList) const
       
  1787 /**
       
  1788 Gets a filtered list of a directory's contents by UID type.
       
  1789 
       
  1790 The aUidType parameter determines which file entry types should be listed.
       
  1791 The sort key determines the order in which they are listed.
       
  1792 
       
  1793 Notes:
       
  1794 
       
  1795 1. The function sets aFileList to NULL, and then allocates memory for it before
       
  1796    appending entries to the list. Therefore, aFileList should have no memory
       
  1797    allocated to it before this function is called, otherwise this memory
       
  1798    will become orphaned.
       
  1799    
       
  1800 2. The caller of this function is responsible for deleting aFileList after
       
  1801    the function has returned.
       
  1802    
       
  1803 @param aName     The name of the directory for which a listing is required.
       
  1804                  Wildcards may be used to specify particular files.
       
  1805 @param aUidType  Only those files whose UIDs match those specified within this
       
  1806                  UID type will be included in the file list. Any, or all, of
       
  1807                  the three UIDs within the UID type may be omitted.
       
  1808 				 Any UID which is omitted acts in a similar manner to
       
  1809 				 a wildcard character, matching to all UIDs.
       
  1810 @param aKey      The sort key. This is a set of flags indicating the order in
       
  1811                  which the entries are to be sorted. These flags are defined
       
  1812                  by TEntryKey.
       
  1813 @param aFileList On return contains a filtered list of directory and file entries.
       
  1814 
       
  1815 @return KErrNone if successful, otherwise one of the other
       
  1816         system-wide error codes.
       
  1817         
       
  1818 @see TEntryKey
       
  1819 */
       
  1820 	{
       
  1821 	TRACEMULT6(UTF::EBorder, UTraceModuleEfsrv::EFsGetDir1, MODULEUID, 
       
  1822 		Handle(), aName, aUidType[0].iUid, aUidType[1].iUid, aUidType[2].iUid, aKey);
       
  1823 
       
  1824 	RDir d;
       
  1825 	TRAPD(r,GetDirL(aName,aUidType,aKey,aFileList,d))
       
  1826 	d.Close();
       
  1827 	if (r!=KErrNone)
       
  1828 		{
       
  1829 		delete aFileList;
       
  1830 		aFileList=NULL;
       
  1831 		}
       
  1832 
       
  1833 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsGetDir1Return, MODULEUID, r);
       
  1834 	return r;
       
  1835 	}
       
  1836 
       
  1837 
       
  1838 
       
  1839 
       
  1840 EFSRV_EXPORT_C TInt RFs::GetDir(const TDesC& aName,TUint anAttMask,TUint aKey,CDir*& aFileList) const
       
  1841 /**
       
  1842 Gets a filtered list of a directory's contents.
       
  1843 
       
  1844 The	bitmask determines which file and directory entry types should be listed.
       
  1845 The sort key determines the order in which they are listed.
       
  1846 
       
  1847 Notes:
       
  1848 
       
  1849 1. If sorting by UID (as indicated when the ESortByUid bit is OR'ed with
       
  1850    the sort key), then UID information will be included in the listing
       
  1851    whether or not KEntryAttAllowUid is specified in anAttMask.
       
  1852 
       
  1853 2. The function sets aFileList to NULL, and then allocates memory for it before
       
  1854    appending entries to the list. Therefore, aFileList should have no memory
       
  1855    allocated to it before this function is called, otherwise this memory will
       
  1856    become orphaned.
       
  1857 
       
  1858 3. The caller of this function is responsible for deleting aFileList after
       
  1859    the function has returned.
       
  1860 
       
  1861 @param aName     The name of the directory for which a listing is required.
       
  1862                  Wildcards may be used to specify particular files.
       
  1863 @param anAttMask Bitmask indicating the attributes of interest. Only files and
       
  1864                  directories whose attributes match those specified here can be
       
  1865                  included in the listing. For more information,
       
  1866                  see KEntryAttMatchMask and the other directory entry details.
       
  1867                  Also see KEntryAttNormal and the other file or directory attributes.
       
  1868 @param aKey      The sort key. This is a set of flags indicating the order in
       
  1869                  which the entries are to be sorted. These flags are defined
       
  1870                  by TEntryKey.
       
  1871 @param aFileList On return contains a filtered list of directory and file entries.
       
  1872 
       
  1873 @return KErrNone if successful, otherwise one of the other
       
  1874         system-wide error codes.
       
  1875         
       
  1876 @see TEntryKey
       
  1877 */
       
  1878 	{
       
  1879 	TRACEMULT4(UTF::EBorder, UTraceModuleEfsrv::EFsGetDir2, MODULEUID, Handle(), aName, anAttMask, aKey);
       
  1880 
       
  1881 	RDir d;
       
  1882 	if ((aKey&0xff)==ESortByUid)
       
  1883 		anAttMask|=KEntryAttAllowUid;
       
  1884 	TRAPD(r,GetDirL(aName,anAttMask,aKey,aFileList,d))
       
  1885 	d.Close();
       
  1886 	if (r!=KErrNone)
       
  1887 		{
       
  1888 		delete aFileList;
       
  1889 		aFileList=NULL;
       
  1890 		}
       
  1891 
       
  1892 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsGetDir2Return, MODULEUID, r);
       
  1893 	return r;
       
  1894 	}
       
  1895 
       
  1896 
       
  1897 
       
  1898 
       
  1899 EFSRV_EXPORT_C TInt RFs::GetDir(const TDesC& aName,TUint anAttMask,TUint aKey,CDir*& aFileList,CDir*& aDirList) const
       
  1900 /**
       
  1901 Gets a filtered list of the directory and file entries contained in
       
  1902 a directory, and a list of the directory entries only.
       
  1903 
       
  1904 The bitmask	determines which file and directory entry types should be listed in
       
  1905 aFileList. The contents of the second list, aDirList are not affected by the bitmask; it
       
  1906 returns all directory entries contained in directory aName. The
       
  1907 sort key determines the order in which both lists are sorted.
       
  1908 
       
  1909 Notes:
       
  1910 
       
  1911 1. If sorting by UID (as indicated when the ESortByUid bit is OR'ed with
       
  1912    the sort key), then UID information will be included in the listing
       
  1913    whether or not KEntryAttAllowUid is specified in anAttMask.
       
  1914    
       
  1915 2. The function sets both aFileList and aDirList to NULL, and then allocates
       
  1916    memory to them before appending entries to the lists. Therefore, aFileList
       
  1917    and aDirList should have no memory allocated to them before this
       
  1918    function is called, otherwise the allocated memory will become orphaned.
       
  1919 
       
  1920 3. The caller of this function is responsible for deleting aFileList
       
  1921    and aDirList after the function has returned.
       
  1922    
       
  1923 @param aName     The name of the directory for which a listing is required.
       
  1924                  Wildcards may be used to specify particular files.
       
  1925 @param anAttMask Bitmask indicating the attributes of interest. Only files and
       
  1926                  directories whose attributes match those specified here can be
       
  1927                  included in aFileList. aDirList is unaffected by this mask. 
       
  1928                  For more information, see KEntryAttMatchMask and the other
       
  1929                  directory entry details.
       
  1930                  Also see KEntryAttNormal and the other file or directory
       
  1931                  attributes.
       
  1932 @param aKey      The sort key. This is a set of flags indicating the order in
       
  1933                  which the entries in both lists are to be sorted. These flags
       
  1934                  are defined by TEntryKey.
       
  1935 @param aFileList On return contains a filtered list of directory and
       
  1936                  file entries.
       
  1937 @param aDirList  On return contains a filtered list of directory entries only.
       
  1938 
       
  1939 @return KErrNone if successful, otherwise one of the other
       
  1940         system-wide error codes.
       
  1941 
       
  1942 @see TEntryKey
       
  1943 */
       
  1944 	{
       
  1945 	TRACEMULT4(UTF::EBorder, UTraceModuleEfsrv::EFsGetDir3, MODULEUID, Handle(), aName, anAttMask, aKey);
       
  1946 
       
  1947 	RDir d;
       
  1948 	if (aKey&ESortByUid)
       
  1949 		anAttMask|=KEntryAttAllowUid;
       
  1950 	TRAPD(r,GetDirL(aName,anAttMask,aKey,aFileList,aDirList,d))
       
  1951 	d.Close();
       
  1952 	if (r!=KErrNone)
       
  1953 		{
       
  1954 		delete aFileList;
       
  1955 		aFileList=NULL;
       
  1956 		delete aDirList;
       
  1957 		aDirList=NULL;
       
  1958 		}
       
  1959 
       
  1960 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsGetDir3Return, MODULEUID, r);
       
  1961 	return r;
       
  1962 	}
       
  1963 
       
  1964 
       
  1965 
       
  1966 
       
  1967 EFSRV_EXPORT_C TInt RFs::Parse(const TDesC& aName,TParse& aParse) const
       
  1968 /**
       
  1969 Parses a filename specification.
       
  1970 
       
  1971 Parsing is done with wildcard resolution, using the session path as
       
  1972 the default. You can then use TParse's getter functions to extract individual
       
  1973 components of the resulting name. All the path components that are included
       
  1974 in aName are put into the resulting	filename. Any components that are still
       
  1975 missing are taken from the session path.
       
  1976 
       
  1977 Specifying:
       
  1978 
       
  1979 @code
       
  1980 TParse fp;
       
  1981 @endcode
       
  1982 @code
       
  1983 fs.Parse(name,fp);
       
  1984 @endcode
       
  1985 
       
  1986 is equivalent to 
       
  1987 
       
  1988 @code
       
  1989 TParse fp;
       
  1990 @endcode
       
  1991 @code
       
  1992 fp.Set(name,NULL,&fs.SessionPath());
       
  1993 @endcode
       
  1994 
       
  1995 Note that the function does not check for illegal characters, or for
       
  1996 illegal path components in either of the paths specified.
       
  1997 
       
  1998 @param aName  The file name to be parsed, using the session path to provide
       
  1999               the missing components.
       
  2000 @param aParse A TParse objct that provides functions for
       
  2001               extracting individual components of the resulting file name.
       
  2002 
       
  2003 @return KErrNone if successful, otherwise one of the other
       
  2004         system-wide error codes.
       
  2005 */
       
  2006 	{
       
  2007 	TRACEMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsParse1, MODULEUID, Handle(), aName);
       
  2008 	TFileName session_path;
       
  2009 	TInt r = SessionPath(session_path);
       
  2010 	if (r==KErrNone)
       
  2011 		r = aParse.Set(aName, NULL, &session_path);
       
  2012 
       
  2013 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsParse1Return, MODULEUID, r);
       
  2014 	return r;
       
  2015 	}
       
  2016 
       
  2017 
       
  2018 
       
  2019 
       
  2020 EFSRV_EXPORT_C TInt RFs::Parse(const TDesC& aName,const TDesC& aRelated,TParse& aParse) const
       
  2021 /**
       
  2022 Parses a filename specification, specifying related file path components.
       
  2023 
       
  2024 Parsing is done with wildcard resolution, using the session path as
       
  2025 the default. You can then use TParse's getter functions to extract individual
       
  2026 components of the resulting name. All the path components that are included
       
  2027 in aName are put into the resulting	filename. Any missing components are taken
       
  2028 from the optional aRelated argument, which has the next order of precedence.
       
  2029 Finally, any components that are still missing are taken from the session path.
       
  2030 
       
  2031 Specifying:
       
  2032 
       
  2033 @code
       
  2034 TParse fp;
       
  2035 @endcode
       
  2036 @code
       
  2037 fs.Parse(name,related,fp);
       
  2038 @endcode
       
  2039 
       
  2040 is equivalent to 
       
  2041 
       
  2042 @code
       
  2043 TParse fp;
       
  2044 @endcode
       
  2045 @code
       
  2046 fp.Set(name,related,&fs.SessionPath());
       
  2047 @endcode
       
  2048 
       
  2049 Note that the function does not check for illegal characters, or for
       
  2050 illegal path components in any of the paths specified.
       
  2051 
       
  2052 @param aName    The file name to be parsed, using the session path and the
       
  2053                 related path to provide the missing components.
       
  2054 @param aRelated The related file specification.
       
  2055 @param aParse   A TParse objct that provides functions for
       
  2056                 extracting individual components of the resulting file name.
       
  2057 
       
  2058 @return KErrNone if successful, otherwise one of the other
       
  2059         system-wide error codes.
       
  2060 */
       
  2061 	{
       
  2062 	TRACEMULT3(UTF::EBorder, UTraceModuleEfsrv::EFsParse2, MODULEUID, Handle(), aName, aRelated);
       
  2063 	TFileName session_path;
       
  2064 	TInt r = SessionPath(session_path);
       
  2065 	if (r==KErrNone)
       
  2066 		r = aParse.Set(aName, &aRelated, &session_path);
       
  2067 
       
  2068 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsParse2Return, MODULEUID, r);
       
  2069 	return r;
       
  2070 	}
       
  2071 
       
  2072 
       
  2073 
       
  2074 
       
  2075 EFSRV_EXPORT_C TInt RFs::Delete(const TDesC& aName)
       
  2076 /**
       
  2077 Deletes a single file.
       
  2078 
       
  2079 Wildcards are not allowed in either the	file name or the extension,
       
  2080 otherwise an error is returned.
       
  2081 
       
  2082 Note that the file must be closed and must not be read-only.
       
  2083 Hidden files can be deleted but system files cannot.
       
  2084 
       
  2085 See class CFileMan for information on deleting multiple files.
       
  2086 		  
       
  2087 @param aName The name of the file to be deleted. Any path components which
       
  2088              are not specified here will be taken from the session path.
       
  2089 
       
  2090 @return KErrNone if successful, otherwise one of the other
       
  2091         system-wide error codes.
       
  2092 
       
  2093 @capability Dependent If aName is /Sys then Tcb capability is required.
       
  2094 @capability Dependent If aName begins with /Private and does not match this process' SID
       
  2095 					  then AllFiles capability is required.
       
  2096 @capability Dependent If aName is /Resource then Tcb capability is required.
       
  2097         
       
  2098 @see CFileMan        
       
  2099 */
       
  2100 	{
       
  2101 	TRACEMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsDelete, MODULEUID, Handle(), aName);
       
  2102 	TInt r = SendReceive(EFsDelete,TIpcArgs(&aName));
       
  2103 
       
  2104 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsDeleteReturn, MODULEUID, r);
       
  2105 	return r;
       
  2106 	}
       
  2107 
       
  2108 
       
  2109 
       
  2110 
       
  2111 EFSRV_EXPORT_C TInt RFs::Rename(const TDesC& anOldName,const TDesC& aNewName)
       
  2112 /**
       
  2113 Renames a single file or directory.
       
  2114 
       
  2115 It can also be used to move a file or directory by specifying different
       
  2116 destination and source directories.	If so, the destination and source
       
  2117 directories must be on the same drive. If a	directory is moved, then
       
  2118 the directory structure beneath it is also	moved.
       
  2119 
       
  2120 If a directory specified by aNewName is different from one specified
       
  2121 by anOldName, then the file or directory is	moved to the new directory.
       
  2122 The file or directory cannot be moved to another device by this means,
       
  2123 either explicitly (by another drive	specified in the name) or implicitly
       
  2124 (because the directory has been mapped to another device with SetSubst().
       
  2125 
       
  2126 The function fails and returns an error code in the following
       
  2127 circumstances:
       
  2128 
       
  2129 1. If either the old or new name includes wildcards.
       
  2130 
       
  2131 2. If a file or directory with the new name already exists in
       
  2132    the target directory. Overwriting is not permitted.
       
  2133 
       
  2134 3. If file anOldName does not exist, or is open.
       
  2135 
       
  2136 Read-only, system and hidden files may be renamed. The renamed
       
  2137 file's attributes are preserved.
       
  2138 
       
  2139 Note that when this function is operating on directories, a	trailing backslash
       
  2140 is not required after the final directory name in either anOldName or aNewName.
       
  2141 
       
  2142 See class CFileMan for information on renaming multiple files.
       
  2143 		  				
       
  2144 @param anOldName File or directory to be renamed. Any path components which are
       
  2145                  not specified here will be taken from the session path.
       
  2146 @param aNewName  Path specifying the new name for the file or directory and/or
       
  2147 				 its new parent directory. All directories specified in this path
       
  2148 				 must exist.
       
  2149 				 Any path components which are not specified here will be taken
       
  2150 				 from the session path.
       
  2151 
       
  2152 @return KErrNone if successful, otherwise one of the other
       
  2153         system-wide error codes.
       
  2154 
       
  2155 @capability Dependent If either anOldName or aNewName is /Sys then Tcb capability is required.
       
  2156 @capability Dependent If either anOldName or aNewName begins with /Private and does not match
       
  2157 					  this process' SID then AllFiles capability is required.
       
  2158 @capability Dependent If either anOldName or aNewName is /Resource then Tcb capability is required.
       
  2159         
       
  2160 @see CFileMan        
       
  2161 */
       
  2162 	{
       
  2163 	TRACEMULT3(UTF::EBorder, UTraceModuleEfsrv::EFsRename, MODULEUID, Handle(), anOldName, aNewName);
       
  2164 
       
  2165 	TInt r;
       
  2166 	if (anOldName.Length() <= 0 || aNewName.Length() <= 0 )
       
  2167 		r = KErrBadName;
       
  2168 	else
       
  2169 		r = SendReceive(EFsRename,TIpcArgs(&anOldName,&aNewName));
       
  2170 
       
  2171 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsRenameReturn, MODULEUID, r);
       
  2172 	return r;
       
  2173 	}
       
  2174 
       
  2175 
       
  2176 
       
  2177 
       
  2178 EFSRV_EXPORT_C TInt RFs::Replace(const TDesC& anOldName,const TDesC& aNewName)
       
  2179 /**
       
  2180 Replaces a single file with another.
       
  2181 
       
  2182 This function does not support the use of wildcards. Unlike Rename(), it only
       
  2183 applies to files.
       
  2184 
       
  2185 This function operates as follows:
       
  2186 
       
  2187 1. if the aNewName file does not exist, it is created.
       
  2188 
       
  2189 2. anOldName's contents, attributes and the date and time of its last
       
  2190    modification are copied to file aNewName, overwriting any existing contents
       
  2191    and attribute details.
       
  2192 
       
  2193 3. anOldName is deleted.
       
  2194 				 
       
  2195 anOldName may be hidden, read-only or a system file. However,
       
  2196 neither anOldName, nor, if it exists, aNewName, can be open;
       
  2197 aNewName must not be read-only.
       
  2198 Both files must be on the same drive.
       
  2199 
       
  2200 @param anOldName The file to be replaced. Must exist and must be closed. It is
       
  2201                  deleted by this function.
       
  2202 @param aNewName  The file to replace anOldName. Does not need to exist, but if
       
  2203                  it does exist, it must be closed. If it exists, its name
       
  2204                  remains unchanged but its contents, attributes and the date
       
  2205                  and time of its last modification are replaced by those
       
  2206                  of anOldName.
       
  2207                  If it does not exist, it will be created and is assigned
       
  2208                  the contents and attributes of anOldName. Must not be followed
       
  2209                  by a trailing backslash.
       
  2210 
       
  2211 @return KErrNone, if successful;
       
  2212         KErrAccessDenied, if an attempt is made to replace a directory;
       
  2213         otherwise one of the other system-wide error codes. 
       
  2214 
       
  2215 @capability Dependent If either anOldName or aNewName is /Sys then Tcb capability is required.
       
  2216 @capability Dependent If either anOldName or aNewName begins with /Private and does not match
       
  2217 					  this process' SID then AllFiles capability is required.
       
  2218 @capability Dependent If either anOldName or aNewName is /Resource then Tcb capability is required.
       
  2219 
       
  2220 */
       
  2221 	{
       
  2222 	TRACEMULT3(UTF::EBorder, UTraceModuleEfsrv::EFsReplace, MODULEUID, Handle(), anOldName, aNewName);
       
  2223 	TInt r = SendReceive(EFsReplace,TIpcArgs(&anOldName,&aNewName));
       
  2224 
       
  2225 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsReplaceReturn, MODULEUID, r);
       
  2226 	return r;
       
  2227 	}
       
  2228 
       
  2229 
       
  2230 
       
  2231 
       
  2232 EFSRV_EXPORT_C TInt RFs::Att(const TDesC& aName,TUint& aVal) const
       
  2233 /**
       
  2234 Gets a file's attributes.
       
  2235 
       
  2236 @param aName The filename. Any path components which are not specified here
       
  2237              will be taken from the session path.
       
  2238 @param aVal  On return, the individual bits within the byte indicate which
       
  2239              attributes have been set. For more information see KEntryAttNormal
       
  2240 	         and the other file/directory attributes.
       
  2241 
       
  2242 @return KErrNone if successful, otherwise one of the other
       
  2243         system-wide error codes.
       
  2244 
       
  2245 @capability Dependent If aName contains /sys/ then AllFiles capability is required.
       
  2246 @capability Dependent If aName contains /Private/ and does not match
       
  2247 					  this process' SID then AllFiles capability is required.
       
  2248         
       
  2249 @see KEntryAttNormal
       
  2250 */
       
  2251 	{
       
  2252 	TRACEMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsAtt, MODULEUID, Handle(), aName);
       
  2253 
       
  2254 	TEntry e;
       
  2255 	TInt r=Entry(aName,e);
       
  2256 	if (r==KErrNone)
       
  2257 		aVal=e.iAtt;
       
  2258 
       
  2259 	TRACERET2(UTF::EBorder, UTraceModuleEfsrv::EFsAttReturn, MODULEUID, r, aVal);
       
  2260 	return r;
       
  2261 	}
       
  2262 
       
  2263 
       
  2264 
       
  2265 
       
  2266 EFSRV_EXPORT_C TInt RFs::SetAtt(const TDesC& aName,TUint aSetAttMask,TUint aClearAttMask)
       
  2267 /**
       
  2268 Sets or clears the attributes of a single file or directory.
       
  2269 
       
  2270 The function uses two bitmasks. The first bitmask specifies the	attributes
       
  2271 to be set; the second specifies the attributes to be cleared.
       
  2272 
       
  2273 An attempt to set or clear the KEntryAttDir, KEntryAttVolume or KEntryAttRemote
       
  2274 attributes have no effect.
       
  2275 
       
  2276 @param aName          File or directory name. Any path components which are not
       
  2277                       specified here will be taken from the session path. Must
       
  2278                       not include wildcard characters. The file must be closed.
       
  2279 @param aSetAttMask    Bitmask indicating the attributes to be set.
       
  2280 @param aClearAttMask  Bitmask indicating the attributes to be cleared. For more
       
  2281 				      information, see KEntryAttNormal and the other file or
       
  2282 				      directory attributes.
       
  2283 
       
  2284 @return KErrNone if successful, otherwise one of the other
       
  2285         system-wide error codes.
       
  2286 
       
  2287 @panic FSCLIENT 21 if any attribute appears in both bitmasks.
       
  2288 
       
  2289 
       
  2290 @capability Dependent If aName is /Sys then Tcb capability is required.
       
  2291 @capability Dependent If aName begins with /Private and does not match
       
  2292 					  this process' SID then AllFiles capability is required.
       
  2293 @capability Dependent If aName is /Resource then Tcb capability is required.
       
  2294 	
       
  2295 @see RFs::SetEntry
       
  2296 
       
  2297 */
       
  2298 	{
       
  2299 	TRACEMULT4(UTF::EBorder, UTraceModuleEfsrv::EFsSetAtt, MODULEUID, 
       
  2300 		Handle(), aName, aSetAttMask, aClearAttMask);
       
  2301 
       
  2302  	TInt r = SetEntry(aName,TTime(0),aSetAttMask,aClearAttMask);
       
  2303 
       
  2304 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsSetAttReturn, MODULEUID, r);
       
  2305 	return r;
       
  2306 	}
       
  2307 
       
  2308 
       
  2309 
       
  2310 
       
  2311 EFSRV_EXPORT_C TInt RFs::Modified(const TDesC& aName,TTime& aTime) const
       
  2312 /**
       
  2313 Gets the last modification date and time of a file or a directory,
       
  2314 in UTC.
       
  2315 
       
  2316 If there has been no modification, the function gets the date and
       
  2317 time of the file or directory's creation.
       
  2318 
       
  2319 @param aName File or directory name.
       
  2320 @param aTime On return, contains the date and time of the file or
       
  2321              directory's last modification in universal time.
       
  2322 
       
  2323 @return KErrNone if successful, otherwise one of the other
       
  2324         system-wide error codes.
       
  2325 
       
  2326 @capability Dependent If aName contains /sys/ then AllFiles capability is required.
       
  2327 @capability Dependent If aName contains /Private/ and does not match
       
  2328 					  this process' SID then AllFiles capability is required.
       
  2329 
       
  2330 */
       
  2331 	{
       
  2332 	TRACEMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsModified, MODULEUID, Handle(), aName);
       
  2333 
       
  2334 	TEntry e;
       
  2335 	TInt r=Entry(aName,e);
       
  2336 	if (r==KErrNone)
       
  2337 		aTime=e.iModified;
       
  2338 
       
  2339 	TRACERET3(UTF::EBorder, UTraceModuleEfsrv::EFsModifiedReturn, MODULEUID, r, I64LOW(aTime.Int64()), I64HIGH(aTime.Int64()));
       
  2340 	return r;
       
  2341 	}
       
  2342 
       
  2343 
       
  2344 
       
  2345 
       
  2346 EFSRV_EXPORT_C TInt RFs::SetModified(const TDesC& aName,const TTime& aTime)
       
  2347 /**
       
  2348 Sets the date and time that the contents of a file or directory
       
  2349 were modified, in UTC.
       
  2350 
       
  2351 @param aName File or directory name.
       
  2352 @param aTime The new date and time that the file or directory was modified
       
  2353              in universal time.
       
  2354 
       
  2355 @return KErrNone if successful;
       
  2356         KErrInUse, if the file is open;
       
  2357         otherwise one of the other system-wide error codes.
       
  2358 
       
  2359 @capability Dependent If aName is /Sys then Tcb capability is required.
       
  2360 @capability Dependent If aName begins with /Private and does not match
       
  2361 					  this process' SID then AllFiles capability is required.
       
  2362 @capability Dependent If aName is /Resource then Tcb capability is required.
       
  2363 
       
  2364 */
       
  2365 	{
       
  2366 	TRACEMULT4(UTF::EBorder, UTraceModuleEfsrv::EFsSetModified, MODULEUID, Handle(), aName, I64LOW(aTime.Int64()), I64HIGH(aTime.Int64()) );
       
  2367 
       
  2368 	TInt r = SetEntry(aName,aTime,KEntryAttModified,0);
       
  2369 
       
  2370 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsSetModifiedReturn, MODULEUID, r);
       
  2371 	return r;
       
  2372 	}
       
  2373 
       
  2374 
       
  2375 
       
  2376 
       
  2377 EFSRV_EXPORT_C TInt RFs::Entry(const TDesC& aName,TEntry& anEntry) const
       
  2378 /**
       
  2379 Gets the entry details for a file or directory.
       
  2380 
       
  2381 This information includes UID information.
       
  2382 
       
  2383 @param aName   Name of file or directory.
       
  2384 @param anEntry On return, contains the entry details for the file or directory. TEntry::iModified contains UTC date and time.
       
  2385 
       
  2386 @return KErrNone if successful, otherwise one of the other
       
  2387         system-wide error codes.
       
  2388 
       
  2389 @capability Dependent If aName contains "\\Sys\\" and includes an additional file or directory then AllFiles capability 
       
  2390 					  is required. For example, the paths "c:\\sys" and "c:\\sys\\" will always be readable, whereas
       
  2391 					  the path "c:\\sys\\abc\\" will only be readable with AllFiles capability.
       
  2392 
       
  2393 @capability Dependent If aName contains \\Private\\ and includes an additional file, or a directory which does not match
       
  2394 					  this process' SID, then AllFiles capability is required. For example, the paths "c:\\private" and 
       
  2395 					  "c:\\private\\" will always be readable, whereas the path "c:\\private\\<n>\\" will only be 
       
  2396 					  readable with AllFiles capability or if <n> matches the process' SID.
       
  2397 */
       
  2398 	{
       
  2399 	TRACEMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsEntry, MODULEUID, Handle(), aName);
       
  2400 	TPckg<TEntry> e(anEntry);
       
  2401 	TInt r = SendReceive(EFsEntry,TIpcArgs(&aName,&e));
       
  2402 
       
  2403 	TRACE5(UTF::EBorder, UTraceModuleEfsrv::EFsEntryReturn, MODULEUID, 
       
  2404 		r, anEntry.iAtt, 
       
  2405 		I64LOW(anEntry.iModified.Int64()), I64HIGH(anEntry.iModified.Int64()), 
       
  2406 		anEntry.iSize);
       
  2407 	return r;
       
  2408 	}
       
  2409 
       
  2410 
       
  2411 
       
  2412 
       
  2413 EFSRV_EXPORT_C TInt RFs::SetEntry(const TDesC& aName,const TTime& aTime,TUint aSetAttMask,TUint aClearAttMask)
       
  2414 /**
       
  2415 Sets both the attributes and the last modified date and time for a file or directory.
       
  2416 
       
  2417 The function uses two bitmasks. The first bitmask determines
       
  2418 which attributes should be set. The second bitmask determines which should be cleared.
       
  2419 
       
  2420 An attempt to set or clear the KEntryAttDir, KEntryAttVolume or KEntryAttRemote
       
  2421 attributes have no effect.
       
  2422 			 
       
  2423 @param aName          File or directory name.
       
  2424 @param aTime	      New date and time. UTC date and time should be used.
       
  2425 @param aSetAttMask    Bitmask indicating which attributes are to be set.
       
  2426 @param aClearAttMask  Bitmask indicating which attributes are cleared. For more
       
  2427                       information, see KEntryAttNormal, and the other file
       
  2428                       or directory attributes.
       
  2429 
       
  2430 @return KErrNone, if successful;
       
  2431         KErrInUse, if the file is open;
       
  2432         otherwise one of the other system-wide error codes.
       
  2433 
       
  2434 @panic FSCLIENT 21 if any attribute appears in both bitmasks.        
       
  2435 
       
  2436 @capability Dependent If aName is /Sys then Tcb capability is required.
       
  2437 @capability Dependent If aName begins with /Private and does not match
       
  2438 					  this process' SID then AllFiles capability is required.
       
  2439 @capability Dependent If aName is /Resource then Tcb capability is required.
       
  2440 
       
  2441 @see KEntryAttNormal
       
  2442 @see KEntryAttDir
       
  2443 @see KEntryAttVolume
       
  2444 */
       
  2445 	{
       
  2446 	TRACEMULT6(UTF::EBorder, UTraceModuleEfsrv::EFsSetEntry, MODULEUID, 
       
  2447 		Handle(), aName, 
       
  2448 		I64LOW(aTime.Int64()), I64HIGH(aTime.Int64()), 
       
  2449 		aSetAttMask, aClearAttMask);
       
  2450 
       
  2451 	__ASSERT_ALWAYS((aSetAttMask&aClearAttMask)==0,Panic(EAttributesIllegal));
       
  2452 	TPtrC8 timeBuf((TUint8*)&aTime,sizeof(TTime));
       
  2453 	TInt r = SendReceive(EFsSetEntry,TIpcArgs(&aName,&timeBuf,aSetAttMask,aClearAttMask));
       
  2454 
       
  2455 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsSetEntryReturn, MODULEUID, r);
       
  2456 	return r;
       
  2457 	}
       
  2458 
       
  2459 /**
       
  2460 Reads data from a file without opening it.
       
  2461 
       
  2462 The contents of the	file can be accessed regardless of the file's lock state.
       
  2463 
       
  2464 The file may be open by any number of other clients for reading	or writing.
       
  2465 In allowing such access to a file, the fileserver makes no guarantees as to
       
  2466 the validity of the data it returns.
       
  2467 
       
  2468 @param aName    Name of the file to be accessed.
       
  2469 @param aPos     The offset, in bytes, from the start of the file where
       
  2470 				reading is to start.
       
  2471 @param aDes     On return, contains the data read from the file. The length of
       
  2472 				the descriptor is set to the number of bytes read. If the
       
  2473 				specified offset lies beyond the end of the file, no data is
       
  2474 				read and the length of this descriptor is set to zero.
       
  2475 @param aLength  The number of bytes to be read from the file.
       
  2476 
       
  2477 @return KErrNone if successful, 
       
  2478 		KErrArgument if aLength is negative,
       
  2479 		otherwise one of the other system-wide error codes.
       
  2480 
       
  2481 @panic FSCLIENT 19 if aPos negative.
       
  2482 @panic FSCLIENT 27 if aLength is greater than the maximum length of
       
  2483        the target descriptor.
       
  2484 
       
  2485 @capability Dependent If the path for aName starts with /Sys capability AllFiles is required
       
  2486 @capability Dependent If the path for aName starts with /Private and this process does not have 
       
  2487                       the relevant SID capability AllFiles is required
       
  2488 
       
  2489 */
       
  2490 EFSRV_EXPORT_C TInt RFs::ReadFileSection(const TDesC& aName,TInt64 aPos,TDes8& aDes,TInt aLength) const
       
  2491 	{
       
  2492 	TRACEMULT5(UTF::EBorder, UTraceModuleEfsrv::EFsReadFileSection, MODULEUID, 
       
  2493 		Handle(), aName, I64LOW(aPos), I64HIGH(aPos), aLength);
       
  2494 
       
  2495 	__ASSERT_ALWAYS(aPos>=0,Panic(EPosNegative));
       
  2496 	
       
  2497 #ifndef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
       
  2498 	if(aPos > KMaxTInt)
       
  2499 		{
       
  2500 		TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFsReadFileSectionReturn, MODULEUID, KErrTooBig);
       
  2501 		return KErrTooBig;
       
  2502 		}
       
  2503 	if((aPos + aLength) > KMaxTInt)
       
  2504 		aLength = KMaxTInt - (TInt)aPos;
       
  2505 #endif
       
  2506 	if (aLength)	//	Number of characters to read
       
  2507 		{
       
  2508 		__ASSERT_ALWAYS(aDes.MaxLength()>=aLength,Panic(EBadLength));
       
  2509   	 	}
       
  2510 	else
       
  2511 		{
       
  2512 		aDes.Zero();
       
  2513 		TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFsReadFileSectionReturn, MODULEUID, KErrNone);
       
  2514 		return(KErrNone);
       
  2515 		}
       
  2516 		
       
  2517 	__ASSERT_ALWAYS(aDes.MaxLength()>=aLength,Panic(EBadLength));
       
  2518 	
       
  2519 	TInt r;
       
  2520 	if(!(I64HIGH(aPos)))
       
  2521 		{
       
  2522 		r = SendReceive(EFsReadFileSection,TIpcArgs(&aDes,&aName,I64LOW(aPos),aLength));
       
  2523 		}
       
  2524 	else
       
  2525 		{
       
  2526 		TPckgC<TInt64> pkPos(aPos);
       
  2527 		r = SendReceive(EFsReadFileSection|KIpcArgSlot2Desc,TIpcArgs(&aDes,&aName,&pkPos,aLength));
       
  2528 		}
       
  2529 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsReadFileSectionReturn, MODULEUID, r);
       
  2530 	return r;
       
  2531 	}
       
  2532 /**
       
  2533 Maintained for BC
       
  2534 
       
  2535 @internalTechnology
       
  2536 */
       
  2537 EFSRV_EXPORT_C TInt RFs::ReadFileSection_RESERVED(const TDesC& aName,TInt aPos,TDes8& aDes,TInt aLength) const
       
  2538 	{
       
  2539 	TRACEMULT5(UTF::EBorder, UTraceModuleEfsrv::EFsReadFileSection, MODULEUID, 
       
  2540 		Handle(), aName, aPos, 0, aLength);
       
  2541 
       
  2542 	__ASSERT_ALWAYS(aPos>=0,Panic(EPosNegative));
       
  2543 	
       
  2544 	if (aLength)	//	Number of characters to read
       
  2545 		{
       
  2546 		__ASSERT_ALWAYS(aDes.MaxLength()>=aLength,Panic(EBadLength));
       
  2547   	 	}
       
  2548 	else
       
  2549 		{
       
  2550 		aDes.Zero();
       
  2551 		TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFsReadFileSectionReturn, MODULEUID, KErrNone);
       
  2552 		return(KErrNone);
       
  2553 		}
       
  2554 		
       
  2555 	__ASSERT_ALWAYS(aDes.MaxLength()>=aLength,Panic(EBadLength));
       
  2556 		
       
  2557 	TInt r = SendReceive(EFsReadFileSection,TIpcArgs(&aDes,&aName,aPos,aLength));
       
  2558 
       
  2559 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsReadFileSectionReturn, MODULEUID, r);
       
  2560 	return r;
       
  2561 	}
       
  2562 
       
  2563 
       
  2564 
       
  2565 
       
  2566 EFSRV_EXPORT_C void RFs::ResourceCountMarkStart() const
       
  2567 /**
       
  2568 Marks the start of resource count checking.
       
  2569 
       
  2570 Typically, this function is called immediately after a client is connected
       
  2571 to the file server, and before any resources are opened.
       
  2572 */
       
  2573 	{
       
  2574 	TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFsResourceCountMarkStart, MODULEUID, Handle());
       
  2575 	
       
  2576 	RSessionBase::SendReceive(EFsResourceCountMarkStart);
       
  2577 
       
  2578 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFsResourceCountMarkStartReturn, MODULEUID);
       
  2579 	}
       
  2580 
       
  2581 
       
  2582 
       
  2583 
       
  2584 EFSRV_EXPORT_C void RFs::ResourceCountMarkEnd() const
       
  2585 /**
       
  2586 Ends resource count checking. Typically, this function is called immediately 
       
  2587 before closing a session with the file server.
       
  2588 
       
  2589 @panic CSessionFs 2 if the number of resources opened since the start of resource 
       
  2590        count checking is not equal to the number of resources closed.
       
  2591 */
       
  2592 	{
       
  2593 	TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFsResourceCountMarkEnd, MODULEUID, Handle());
       
  2594 
       
  2595 	RSessionBase::SendReceive(EFsResourceCountMarkEnd);
       
  2596 
       
  2597 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFsResourceCountMarkEndReturn, MODULEUID);
       
  2598 	}
       
  2599 
       
  2600 
       
  2601 
       
  2602 
       
  2603 EFSRV_EXPORT_C TInt RFs::ResourceCount() const
       
  2604 /**
       
  2605 Gets the number of currently open resources.
       
  2606 
       
  2607 The resource count is incremented by one: when a file or directory
       
  2608 is opened, when a device is opened in preparation for formatting, when a direct access channel
       
  2609 to a disk is opened.
       
  2610 
       
  2611 @return The number of resources currently open.
       
  2612 */
       
  2613 	{
       
  2614 	TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFsResourceCount, MODULEUID, Handle());
       
  2615 
       
  2616 	TInt count;
       
  2617 	TPckg<TInt> pckg(count);
       
  2618 	SendReceive(EFsResourceCount,TIpcArgs(&pckg));
       
  2619 	TInt r = *(TInt*)pckg.Ptr();
       
  2620 
       
  2621 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsResourceCountReturn, MODULEUID, r);
       
  2622 	return r;
       
  2623 	}
       
  2624 
       
  2625 
       
  2626 
       
  2627 
       
  2628 EFSRV_EXPORT_C TInt RFs::CheckDisk(const TDesC& aDrive) const
       
  2629 /**
       
  2630 Checks the integrity of the disk on the specified drive.
       
  2631 On FAT, this checks if a cluster number is invalid, if a cluster is allocated to
       
  2632 more than one file entry, if an unallocated cluster is not set free, and if size
       
  2633 of an entry is invalid.
       
  2634 
       
  2635 @param aDrive Path indicating the drive which contains the disk to be checked. If the drive 
       
  2636         information is not specified the current session drive is taken by default.
       
  2637 		Checkdisk is performed on the requested drive irrespective of the correctness or
       
  2638 		existance of the given path.
       
  2639 
       
  2640 @return KErrNone, if successful;
       
  2641 		1, if successful but a file cluster contains a bad value;
       
  2642 		2, if successful but two files are linked to the same cluster;
       
  2643 		3, if successful but an unallocated cluster contains a value;
       
  2644 		4, if successful but the size of a file is not equal to the number of clusters in chain;
       
  2645         KErrNotReady, if the specified drive is empty;
       
  2646         KErrNotSupported, if the drive cannot handle this request;
       
  2647         KErrPermissionDenied, if the caller doesn't have DiskAdmin capability;
       
  2648 		KErrTooBig, if the drives folder depth exceeds maximum allowed. For the current FAT file system implementation this limit is 50.
       
  2649         Other system wide error codes may also be returned.
       
  2650 
       
  2651 @capability DiskAdmin
       
  2652 */
       
  2653 	{
       
  2654 	TRACEMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsCheckDisk, MODULEUID, Handle(), aDrive);
       
  2655 	TInt r = SendReceive(EFsCheckDisk,TIpcArgs(&aDrive));
       
  2656 
       
  2657 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsCheckDiskReturn, MODULEUID, r);
       
  2658 	return r;
       
  2659 	}
       
  2660 
       
  2661 
       
  2662 
       
  2663 
       
  2664 EFSRV_EXPORT_C TInt RFs::ScanDrive(const TDesC& aDrive) const
       
  2665 /**
       
  2666 Checks the specified drive for errors and corrects them. Specifically, it
       
  2667 checks if long file name entries' IDs are in sequence and short name is valid,
       
  2668 and file's allocated clusters are not used by other files.
       
  2669 
       
  2670 This does not run on the internal RAM drive, and only applies to a
       
  2671 FAT file system.
       
  2672 
       
  2673 @param aDrive Path indicating the drive which contains the disk to be checked. If the drive 
       
  2674         information is not specified the current session drive is taken by default.
       
  2675 		ScanDrive is performed on the requested drive irrespective of the correctness or
       
  2676 		existance of the given path.
       
  2677 
       
  2678 @return KErrNone if successful,
       
  2679         KErrPermissionDenied if caller doesn't have capability DiskAdmin,
       
  2680         KErrInUse if drive is in use,
       
  2681         otherwise one of the other system-wide error codes
       
  2682 
       
  2683 @capability DiskAdmin
       
  2684 */
       
  2685 	{
       
  2686 	TRACEMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsScanDrive, MODULEUID, Handle(), aDrive);
       
  2687 	TInt r = SendReceive(EFsScanDrive,TIpcArgs(&aDrive));
       
  2688 
       
  2689 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsScanDriveReturn, MODULEUID, r);
       
  2690 	return r;
       
  2691 	}
       
  2692 
       
  2693 
       
  2694 
       
  2695 
       
  2696 EFSRV_EXPORT_C TInt RFs::GetShortName(const TDesC& aLongName,TDes& aShortName) const
       
  2697 /**
       
  2698 Gets the short filename associated with a VFAT long filename.
       
  2699 
       
  2700 The short filename has a limit of eight characters for the file name and three
       
  2701 characters for the extension.
       
  2702 
       
  2703 @param aLongName  The long filename. Any path components which are not
       
  2704                   specified	here will be taken from the session path.
       
  2705                   If the path specifies a directory, it may or may not be
       
  2706                   followed by a trailing backslash.
       
  2707 @param aShortName On return, contains the short filename associated with the file
       
  2708                   or directory specified in aLongName.
       
  2709 
       
  2710 @return KErrNone if successful, otherwise one of the other
       
  2711         system-wide error codes.
       
  2712 
       
  2713 @capability Dependent If the path for aLongName starts with /Sys capability AllFiles is required
       
  2714 @capability Dependent If the path for aLongName starts with /Private and this process does not
       
  2715 					  have the relevant SID capability AllFiles is required
       
  2716 */
       
  2717 	{
       
  2718 	TRACEMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsGetShortName, MODULEUID, Handle(), aLongName);
       
  2719 	TInt r = SendReceive(EFsGetShortName,TIpcArgs(&aLongName,&aShortName));
       
  2720 
       
  2721 	TRACERETMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsGetShortNameReturn, MODULEUID, r, aShortName);
       
  2722 	return r;
       
  2723 	}
       
  2724 
       
  2725 
       
  2726 
       
  2727 
       
  2728 EFSRV_EXPORT_C TInt RFs::GetLongName(const TDesC& aShortName,TDes& aLongName) const
       
  2729 /**
       
  2730 Gets the long filename associated with a short (8.3) filename.
       
  2731 
       
  2732 A long filename has a limit of 256 characters for each component, as well as a
       
  2733 limit of 256 characters for the entire path.
       
  2734 
       
  2735 @param aShortName The short file name. Any path components which are not
       
  2736                   specified here will be taken from the session path. If
       
  2737                   the path specifies a directory, it may or may not be followed
       
  2738                   by a trailing backslash.
       
  2739 @param aLongName  On return, contains the long version of the name.
       
  2740 				
       
  2741 @return KErrNone if successful, otherwise one of the other
       
  2742         system-wide error codes.
       
  2743 
       
  2744 @capability Dependent If the path for aShortName starts with /Sys capability AllFiles is required
       
  2745 @capability Dependent If the path for aShortName starts with /Private and this process does not
       
  2746 					  have the relevant SID capability AllFiles is required
       
  2747 
       
  2748 */
       
  2749 	{
       
  2750 	TRACEMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsGetLongName, MODULEUID, Handle(), aShortName);
       
  2751 	TInt r = SendReceive(EFsGetLongName,TIpcArgs(&aShortName,&aLongName));
       
  2752 
       
  2753 	TRACERETMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsGetLongNameReturn, MODULEUID, r, aLongName);
       
  2754 	return r;
       
  2755 	}
       
  2756 
       
  2757 
       
  2758 
       
  2759 
       
  2760 EFSRV_EXPORT_C TInt RFs::IsFileOpen(const TDesC& aFileName,TBool& anAnswer) const
       
  2761 /**
       
  2762 Tests whether a file is open.
       
  2763 
       
  2764 This function is useful because several file based operations provided by
       
  2765 the RFs class, for example: Delete(), Replace() and Rename(), require that
       
  2766 the file be closed.
       
  2767 
       
  2768 @param aFileName The name of the file to test. Any path components which are
       
  2769                  not specified here will be taken from the session path. If a
       
  2770 				 directory is specified instead of a file then KErrNone will be
       
  2771 				 returned and anAnswer will be set to EFalse.
       
  2772 @param anAnswer  On return, true if the file is open, false if closed.
       
  2773 
       
  2774 @return KErrNone if successful, otherwise one of the other
       
  2775         system-wide error codes.
       
  2776 
       
  2777 @capability Dependent If the path for aFileName starts with /Sys capability AllFiles is required
       
  2778 @capability Dependent If the path for aFileName starts with /Private and this process does not
       
  2779 					  have the relevant SID capability AllFiles is required
       
  2780         
       
  2781 @see RFs::Delete
       
  2782 @see RFs::Rename 
       
  2783 @see RFs::Replace
       
  2784 */
       
  2785 	{
       
  2786 	TRACEMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsIsFileOpen, MODULEUID, Handle(), aFileName);
       
  2787 	TPckg<TBool> b(anAnswer);
       
  2788 	TInt r = SendReceive(EFsIsFileOpen,TIpcArgs(&aFileName,&b));
       
  2789 
       
  2790 	TRACERET2(UTF::EBorder, UTraceModuleEfsrv::EFsIsFileOpenReturn, MODULEUID, r, anAnswer);
       
  2791 	return r;
       
  2792 	}
       
  2793 
       
  2794 
       
  2795 
       
  2796 
       
  2797 TInt RFs::GetOpenFileList(TInt& aSessionNumber,TInt& aLocalPos,TThreadId& aThreadId,TEntryArray& anArray) const
       
  2798 //
       
  2799 // Private function to get a list of open files 
       
  2800 //
       
  2801 	{
       
  2802 	TOpenFileListPos s(aSessionNumber,aLocalPos);
       
  2803 	TPckg<TOpenFileListPos> pS(s);
       
  2804 	TPckg<TThreadId> threadId(aThreadId);
       
  2805 	anArray.iCount=KCountNeeded;
       
  2806 	TInt r=SendReceive(EFsListOpenFiles,TIpcArgs(&pS,&threadId,&anArray.iBuf));
       
  2807 	aSessionNumber=s.iSession;
       
  2808 	aLocalPos=s.iEntryListPos;
       
  2809 	return r;
       
  2810 	}
       
  2811 
       
  2812 
       
  2813 
       
  2814 
       
  2815 EFSRV_EXPORT_C TBool RFs::GetNotifyUser()
       
  2816 /**
       
  2817 Tests whether user notification of file read or write failure is in effect.
       
  2818 
       
  2819 @return True if notification in effect, false if not.
       
  2820 */
       
  2821 	{
       
  2822 	TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFsGetNotifyUser, MODULEUID, Handle());
       
  2823 
       
  2824 	TInt notifyUser;
       
  2825 	TPckg<TInt> pckgNotify(notifyUser);
       
  2826 	SendReceive(EFsGetNotifyUser,TIpcArgs(&pckgNotify));
       
  2827 	TBool r = notifyUser;
       
  2828 
       
  2829 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsGetNotifyUserReturn, MODULEUID, r);
       
  2830 	return r;
       
  2831 	}
       
  2832 
       
  2833 
       
  2834 
       
  2835 
       
  2836 EFSRV_EXPORT_C void RFs::SetNotifyUser(TBool aValue)
       
  2837 /**
       
  2838 Sets whether the user should be notified of file read or write failure.
       
  2839 Note that if some drive is mounted as synchronous (see RFs::MountFileSystem), the user won't be 
       
  2840 notified about read/write failures on it. 
       
  2841 
       
  2842 @param aValue ETrue, if user is to be notified of read or write failures;
       
  2843               EFalse, for no notification.
       
  2844 */
       
  2845 	{
       
  2846 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFsSetNotifyUser, MODULEUID, Handle(), aValue);
       
  2847 	SendReceive(EFsSetNotifyUser,TIpcArgs(aValue));
       
  2848 
       
  2849 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFsSetNotifyUserReturn, MODULEUID);
       
  2850 	}
       
  2851 
       
  2852 
       
  2853 
       
  2854 
       
  2855 EFSRV_EXPORT_C TUint8* RFs::IsFileInRom(const TDesC& aFileName) const
       
  2856 /**
       
  2857 Gets a pointer to the specified file, if it is in ROM.
       
  2858 
       
  2859 Note that this is not a test of whether the file is on the Z: drive, as
       
  2860 the Z: drive may consist of a ROM and another file system, using the composite
       
  2861 file system. For example, the file system may be ROFS, and the underlying media
       
  2862 NAND flash.
       
  2863 
       
  2864 @param aFileName The filename whose address is sought. Cannot include wildcards.
       
  2865                  Any path components which are not specified here will be taken
       
  2866                  from the session path.
       
  2867 
       
  2868 @return Address of the start of the file, if it is in ROM. This is NULL, if
       
  2869         the file is not in ROM. Note that for the composite file system, the file
       
  2870         might be on the Z: drive but in a non-ROM file system (i.e. ROFS), in
       
  2871         which case the function still returns NULL.
       
  2872 
       
  2873 @capability Dependent If the path for aFileName starts with /Sys capability AllFiles is required
       
  2874 @capability Dependent If the path for aFileName starts with /Private and this process does not
       
  2875 					  have the relevant SID capability AllFiles is required
       
  2876 
       
  2877 */
       
  2878 	{
       
  2879 	TRACEMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsIsFileInRom, MODULEUID, Handle(), aFileName);
       
  2880 
       
  2881 	TPckgBuf<TUint8*> start;
       
  2882 
       
  2883 	TUint8* r;
       
  2884 	if (SendReceive(EFsIsFileInRom,TIpcArgs(&aFileName,&start))!=KErrNone)
       
  2885 		r = NULL;
       
  2886 	else
       
  2887 		r = start();
       
  2888 
       
  2889 	TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFsIsFileInRomReturn, MODULEUID, r);
       
  2890 	return r;
       
  2891 	}
       
  2892 
       
  2893 
       
  2894 
       
  2895 
       
  2896 /**
       
  2897 Tests whether a filename and path are syntactically correct.
       
  2898 
       
  2899 The following restrictions apply to the path and to its components:
       
  2900 
       
  2901 1.  Wildcards are not allowed in any path component, including the filename and extension.
       
  2902 2.  Double backslashes are not allowed anywhere in the path
       
  2903 3.  The following 6 characters cannot appear in the path: < > : " / |
       
  2904 4.  Either or both of a filename or extension must be present. This means that a valid aFileName can not 
       
  2905     end with backslash (like "c:\\SomeName\\"), because it will mean that "SomeName" is a directory.
       
  2906 
       
  2907 5.  The entire component following the final backslash (the filename and extension) cannot consist solely of space characters, 
       
  2908     or of a single or double dot.
       
  2909 
       
  2910 6.  Spaces between the drive, if specified, and the first directory in the path are illegal, although there may be 
       
  2911     spaces between other path components, for example, between directories.
       
  2912 
       
  2913 7.  If the path in aFileName is not fully specified, i.e. doesn't look like "c:\\Dir1\\File1.bin", all missing 
       
  2914     parts of the full path will be taken from the session path, @see RFs::SetSessionPath, @see RFs::SessionPath.
       
  2915     In this case the session path must be set, otherwise this method will return EFalse.
       
  2916     For example: for the case "\\file1.txt" only the drive letter will be taken from the session path;
       
  2917                  for the case "file1.txt"   whole session path will be internally prepended to the "file1.txt" and whole path checked.
       
  2918     Note that in this case total length of the name in the aFileName parameter and the session path shall not exceed KMaxFileName characters.
       
  2919     
       
  2920    
       
  2921 @param aFileName    The path to be checked for validity. 
       
  2922                     May specify a filename alone, or an entire path specification, including drive letter. 
       
  2923                     If a path is specified, all components are checked for validity.
       
  2924 
       
  2925 @return ETrue, if the name is valid (conforms to the mentioned above criteria); EFalse otherwise.
       
  2926 */
       
  2927 EFSRV_EXPORT_C TBool RFs::IsValidName(const TDesC& aFileName) const
       
  2928 	{
       
  2929 	TRACEMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsIsValidName1, MODULEUID, Handle(), aFileName);
       
  2930 	TBool returnInvalidChar=EFalse;
       
  2931 	TPckg<TBool> bPckg(returnInvalidChar);
       
  2932 	TBool b;
       
  2933 	if (SendReceive(EFsIsValidName,TIpcArgs(&aFileName,&bPckg,NULL,NULL))!=KErrNone)
       
  2934 		b = EFalse;
       
  2935 	else
       
  2936 		b = ETrue;
       
  2937 	TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFsIsValidName1Return, MODULEUID, b);
       
  2938 	return b;
       
  2939 	}
       
  2940 
       
  2941 
       
  2942 
       
  2943 
       
  2944 /**
       
  2945 The following restrictions apply to the path and to its components:
       
  2946 
       
  2947 1.  Wildcards are not allowed in any path component, including the filename and extension.
       
  2948 2.  Double backslashes are not allowed anywhere in the path
       
  2949 3.  The following 6 characters cannot appear in the path: < > : " / |
       
  2950 4.  Either or both of a filename or extension must be present. This means that a valid aFileName can not 
       
  2951     end with backslash (like "c:\\SomeName\\"), because it will mean that "SomeName" is a directory.
       
  2952 
       
  2953 5.  The entire component following the final backslash (the filename and extension) cannot consist solely of space characters, 
       
  2954     or of a single or double dot.
       
  2955 
       
  2956 6.  Spaces between the drive, if specified, and the first directory in the path are illegal, although there may be 
       
  2957     spaces between other path components, for example, between directories.
       
  2958 
       
  2959 7.  If the path in aFileName is not fully specified, i.e. doesn't look like "c:\\Dir1\\File1.bin", all missing 
       
  2960     parts of the full path will be taken from the session path, @see RFs::SetSessionPath, @see RFs::SessionPath.
       
  2961     In this case the session path must be set, otherwise this method will return EFalse.
       
  2962     For example: for the case "\\file1.txt" only the drive letter will be taken from the session path;
       
  2963                  for the case "file1.txt"   whole session path will be internally prepended to the "file1.txt" and whole path checked.
       
  2964     Note that in this case total length of the name in the aFileName parameter and the session path shall not exceed KMaxFileName characters.
       
  2965    
       
  2966 @param aFileName    The path to be checked for validity. 
       
  2967                     May specify a filename alone, or an entire path specification, including drive letter. 
       
  2968                     If a path is specified, all components are checked for validity.
       
  2969 
       
  2970 @param aBadChar     reference to the variable that on return can contain illegal character from aFileName.
       
  2971                     1. if the filename and optional path in aFileName are valid, this method will return ETrue and aBadChar will be set to 0x00.
       
  2972                     2. if there is an illegal character in aFileName, this method will return EFalse and aBadChar will contain this illegal character.
       
  2973                     3. if there is no illegal characters in aFileName, but this is still not a valid filename (like "\\SomeName\\") 
       
  2974                         this method will return EFalse and aBadChar will contain space ' ' or code 0x20.
       
  2975 
       
  2976 @return ETrue, if the name is valid (conforms to the mentioned above criteria); EFalse otherwise.
       
  2977 */
       
  2978 EFSRV_EXPORT_C TBool RFs::IsValidName(const TDesC& aFileName,TText& aBadChar) const
       
  2979 	{
       
  2980 	TRACEMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsIsValidName2, MODULEUID, Handle(), aFileName);
       
  2981 	TBool returnInvalidChar=ETrue;
       
  2982 	TPckg<TBool> boolPckg(returnInvalidChar);
       
  2983 	TPckg<TText> textPckg(aBadChar);
       
  2984 	TBool b;
       
  2985 	if (SendReceive(EFsIsValidName,TIpcArgs(&aFileName,&boolPckg,&textPckg,NULL))!=KErrNone)
       
  2986 		b = EFalse;
       
  2987 	else 
       
  2988 		b = ETrue;
       
  2989 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFsIsValidName2Return, MODULEUID, b, aBadChar);
       
  2990 	return b;
       
  2991 	}
       
  2992 /**
       
  2993 This API can be used to validate both directory and file names.
       
  2994 If the name ends with a trailing backslash '\\' then it is considered to be a directory
       
  2995 else a filename.
       
  2996 For example: "C:\\test\\" would mean a directory, whereas
       
  2997 			 "C:\\test" would mean a file, both of which would be returned as a Valid Name.
       
  2998 However a name such as "C:\\test\\\\" would be returned as an Invalid name with error code TError::ErrBadName
       
  2999 
       
  3000 The following restrictions apply to the path and to its components:
       
  3001 
       
  3002 1.  Wildcards are not allowed in any path component, including the name and extension.
       
  3003 2.  Double backslashes are not allowed anywhere in the path
       
  3004 3.  The following 6 characters cannot appear in the path: < > : " / |
       
  3005 4.  The entire component following the final backslash (the filename and extension) cannot consist solely of space characters, 
       
  3006     or of a single or double dot.
       
  3007 5.  Spaces between the drive, if specified, and the first directory in the path are illegal, although there may be 
       
  3008     spaces between other path components, for example, between directories.
       
  3009 6.  If TNameValidParam::iUseSesssionPath is set to ETrue, and if the path in aName is not fully specified, 
       
  3010 	i.e. doesn't look like "c:\\Dir1\\File1.bin", all missing parts of the full path will be taken from the session path,
       
  3011  	@see RFs::SetSessionPath, @see RFs::SessionPath.
       
  3012     In this case the session path must be set, otherwise this method will return EFalse.
       
  3013     For example: for the case "\\file1.txt" only the drive letter will be taken from the session path;
       
  3014                  for the case "file1.txt"   whole session path will be internally prepended to the "file1.txt" and whole path checked.
       
  3015     Note that in this case total length of the name in the aName parameter and the session path shall not exceed KMaxFileName characters.
       
  3016 7. If TNameValidParam::iUseSesssionPath is set to EFalse, which is the default value, then
       
  3017    the session path is not used to fill in the missing parts of the name as stated above.
       
  3018    For example: for the case "file1.txt", session path will not be used to check the validity of the name. 
       
  3019 @param aName    The path to be checked for validity. 
       
  3020                 May specify a name alone, or an entire path specification, including drive letter. 
       
  3021                 If a path is specified, all components are checked for validity.
       
  3022 
       
  3023 @param aParam     reference to the variable that on return can contain details of the error if any.
       
  3024 				  While constructing an object of this type one could specify whether one wants to use the sessionPath for filling up missing parts of aName,
       
  3025 				  or one would want to test aName as it is without prepending the sessionPath.
       
  3026 				  By default the sessionPath is NOT used. 
       
  3027                     1. if the name and optional path in aName are valid, this method will return ETrue and TError::iError will contain ErrNone.
       
  3028                     2. if there is an illegal character in aName, this method will return EFalse and TError::iError will contain KErrBadCharacter.
       
  3029                        Also TError::iInvalidCharPos will indicate the position of the rightmost invalid character. 
       
  3030                     3. if there is no illegal characters in aName, but this is still not a valid name (like "") 
       
  3031                        this method will return EFalse and TError::iError will contain KErrBadCharacter, while iInvalidCharPos will be set to 0
       
  3032 					4. if length of the name exceeds 256 characters, this method will return EFalse and TError::iError will contain KErrTooLong.
       
  3033 					   if the optional sessionPath is used, then the length of the sessionPath is also used to determine whether the length exceeds 256 characters.
       
  3034 @return ETrue, if the name is valid (conforms to the mentioned above criteria); EFalse otherwise.
       
  3035 */
       
  3036 EFSRV_EXPORT_C TBool RFs::IsValidName(const TDesC& aName, TNameValidParam& aParam )
       
  3037 	{
       
  3038 	TRACEMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsIsValidName3, MODULEUID, Handle(), aName);
       
  3039 	TPckg<TNameValidParam> paramPckg(aParam);
       
  3040 	TBool b;
       
  3041 	if (SendReceive(EFsIsValidName,TIpcArgs(&aName,NULL,NULL,&paramPckg))!=KErrNone)
       
  3042 		b = EFalse;
       
  3043 	else
       
  3044 		b = ETrue;
       
  3045 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFsIsValidName3Return, MODULEUID, b, aParam.ErrorCode());
       
  3046 	return b;
       
  3047 	}
       
  3048 
       
  3049 
       
  3050 
       
  3051 
       
  3052 EFSRV_EXPORT_C TInt RFs::GetDriveName(TInt aDrive,TDes& aDriveName) const
       
  3053 /**
       
  3054 Gets the name of a drive.
       
  3055 
       
  3056 Drive naming is optional. If the drive specified has not been assigned a name,
       
  3057 this function returns a descriptor whose length is zero.
       
  3058 
       
  3059 @param aDrive     The drive number. Specify a drive in the range
       
  3060                   EDriveA to EDriveZ for drives A to Z, respectively.
       
  3061                   The default drive is the session default drive represented
       
  3062                   by KDefaultDrive.
       
  3063 @param aDriveName On return, the drive name.
       
  3064 
       
  3065 @return KErrNone if successful, otherwise one of the other
       
  3066         system-wide error codes.
       
  3067 
       
  3068 @see TDriveNumber
       
  3069 */
       
  3070 	{
       
  3071 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFsGetDriveName, MODULEUID, Handle(), aDrive);
       
  3072 	TInt r = SendReceive(EFsGetDriveName,TIpcArgs(aDrive,&aDriveName));
       
  3073 
       
  3074 	TRACERETMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsGetDriveNameReturn, MODULEUID, r, aDriveName);
       
  3075 	return r;
       
  3076 	}
       
  3077 
       
  3078 
       
  3079 
       
  3080 
       
  3081 EFSRV_EXPORT_C TInt RFs::SetDriveName(TInt aDrive,const TDesC& aDriveName)
       
  3082 /**
       
  3083 Sets the name of a drive.
       
  3084 
       
  3085 Drive naming is optional. Any drive can be assigned a name, and more than
       
  3086 one drive can share the same name.
       
  3087 
       
  3088 @param aDrive     The drive number. Specify a drive in the range
       
  3089                   EDriveA to EDriveZ for drives A to Z, respectively.
       
  3090                   Specify KDefaultDrive for the session default drive.
       
  3091 @param aDriveName The name of the drive, with a maximum of 256 characters.
       
  3092                   The name cannot contain the 6 characters < > : " / |
       
  3093 
       
  3094 @return KErrNone if successful;
       
  3095         KErrBadName, if the name contains illegal characters;
       
  3096         otherwise one of the other system-wide error codes.
       
  3097 
       
  3098 @capability DiskAdmin
       
  3099 
       
  3100 */
       
  3101 	{
       
  3102 	TRACEMULT3(UTF::EBorder, UTraceModuleEfsrv::EFsSetDriveName, MODULEUID, Handle(), aDrive, aDriveName);
       
  3103 	TInt r = SendReceive(EFsSetDriveName,TIpcArgs(aDrive,&aDriveName));
       
  3104 
       
  3105 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsSetDriveNameReturn, MODULEUID, r);
       
  3106 	return r;
       
  3107 	}
       
  3108 
       
  3109 
       
  3110 
       
  3111 
       
  3112 EFSRV_EXPORT_C TInt RFs::LockDrive(TInt aDrv, const TMediaPassword &aOld, const TMediaPassword &aNew, TBool aStore)
       
  3113 /**
       
  3114 Sets the password for the media in the specified drive. 
       
  3115 
       
  3116 The media is not necessarily locked afterwards. Accessibility is determined 
       
  3117 by the following rules:
       
  3118 
       
  3119  - The media may not become locked until power is removed (such as with MMC cards)
       
  3120  - If the password is added to the password store (the aStore parameter is ETrue), the 
       
  3121    media will be automatically unlocked on the next access.
       
  3122 
       
  3123 @param aDrv   The drive.
       
  3124 @param aOld   The existing password. If no password is set, this must be a zero-length descriptor.
       
  3125 @param aNew   The new password.
       
  3126 @param aStore ETrue if the new password is to be saved to the controller password store; 
       
  3127               EFalse if not.
       
  3128 
       
  3129 @return KErrNone if successful;
       
  3130         KErrNotSupported if the media does not support password locking.
       
  3131 
       
  3132 @capability DiskAdmin
       
  3133 
       
  3134 */
       
  3135 	{
       
  3136 	TRACE3(UTF::EBorder, UTraceModuleEfsrv::EFsLockDrive, MODULEUID, Handle(), aDrv, aStore);
       
  3137 	TInt r = SendReceive(EFsLockDrive,TIpcArgs(aDrv,&aOld,&aNew,aStore));
       
  3138 
       
  3139 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsLockDriveReturn, MODULEUID, r);
       
  3140 	return r;
       
  3141 	}
       
  3142 
       
  3143 
       
  3144 
       
  3145 
       
  3146 EFSRV_EXPORT_C TInt RFs::UnlockDrive(TInt aDrive, const TMediaPassword &aPassword, TBool aStore)
       
  3147 /**
       
  3148 Unlocks the media in the specified drive.
       
  3149 
       
  3150 The password must be added to the MultiMedia card controller's password store
       
  3151 so that the controller can subsequently issue the password without the user
       
  3152 having to be prompted for it again.
       
  3153 
       
  3154 @param aDrive    The drive.
       
  3155 @param aPassword The password.
       
  3156 @param aStore    Specify ETrue to add the password to the
       
  3157                  controller's password store. 
       
  3158              
       
  3159 @return KErrNone, if successful;
       
  3160         KErrAccessDenied, if the password is incorrect;
       
  3161         KErrAlreadyExists, if the card has already been unlocked;
       
  3162         KErrNotSupported, if the media does not support password locking.
       
  3163 
       
  3164 @capability DiskAdmin
       
  3165 
       
  3166 */
       
  3167 	{
       
  3168 	TRACE3(UTF::EBorder, UTraceModuleEfsrv::EFsUnlockDrive, MODULEUID, Handle(), aDrive, aStore);
       
  3169 	TInt r = SendReceive(EFsUnlockDrive,TIpcArgs(aDrive,&aPassword,aStore));
       
  3170 
       
  3171 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsUnlockDriveReturn, MODULEUID, r);
       
  3172 	return r;
       
  3173 	}
       
  3174 
       
  3175 
       
  3176 
       
  3177 
       
  3178 EFSRV_EXPORT_C TInt RFs::ClearPassword(TInt aDrv, const TMediaPassword &aPswd)
       
  3179 /**
       
  3180 Clears the password from the locked MultiMedia card in the specified drive.
       
  3181 
       
  3182 Clearing the password causes the MultiMedia card controller to set
       
  3183 the password to null.
       
  3184 
       
  3185 @param aDrv  The drive.
       
  3186 @param aPswd The current password, which is required to perform this
       
  3187              operation.
       
  3188              
       
  3189 @return KErrNone, if successful;
       
  3190         KErrAccessDenied, if the password is wrong or the card is still locked;              
       
  3191         otherwise one of the other system-wide error codes.
       
  3192 
       
  3193 @capability DiskAdmin
       
  3194 
       
  3195 */
       
  3196 	{
       
  3197 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFsClearPassword, MODULEUID, Handle(), aDrv);
       
  3198 	TInt r = SendReceive(EFsClearPassword,TIpcArgs(aDrv,&aPswd));
       
  3199 
       
  3200 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsClearPasswordReturn, MODULEUID, r);
       
  3201 	return r;
       
  3202 	}
       
  3203 
       
  3204 
       
  3205 
       
  3206 
       
  3207 EFSRV_EXPORT_C TInt RFs::ErasePassword(TInt aDrv)
       
  3208 /**
       
  3209 Erase the password from the locked MultiMedia card in the specified drive.
       
  3210 
       
  3211 Used when the password is unknown, and may result in the media being erased.
       
  3212 
       
  3213 Successful execution of this call may result in leaving the media in unformatted state.
       
  3214 Hence, it is recommended to format the Multimedia card after calling RFs::ErasePassword().
       
  3215 
       
  3216 @param aDrv  The drive.
       
  3217              
       
  3218 @return KErrNone, if successful;
       
  3219         otherwise one of the other system-wide error codes.
       
  3220 
       
  3221 @capability DiskAdmin
       
  3222 
       
  3223 */
       
  3224 	{
       
  3225 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFsErasePassword, MODULEUID, Handle(), aDrv);
       
  3226 	TInt r = SendReceive(EFsErasePassword,TIpcArgs(aDrv));
       
  3227 
       
  3228 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsErasePasswordReturn, MODULEUID, r);
       
  3229 	return r;
       
  3230 	}
       
  3231 
       
  3232 
       
  3233 
       
  3234 
       
  3235 EFSRV_EXPORT_C void RFs::StartupInitComplete(TRequestStatus& aStat)
       
  3236 /**
       
  3237 Noifies the file server that startup initialisation is complete.
       
  3238 
       
  3239 @param aStat Request status object.
       
  3240 */
       
  3241 //
       
  3242 // Notify file server that startup initialisation has been completed
       
  3243 //
       
  3244 	{
       
  3245 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFsStartupInitComplete, MODULEUID, Handle(), &aStat);
       
  3246 	aStat=KRequestPending;
       
  3247 	RSessionBase::SendReceive(EFsStartupInitComplete,aStat);
       
  3248 
       
  3249 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFsStartupInitCompleteReturn, MODULEUID);
       
  3250 	}
       
  3251 
       
  3252 
       
  3253 
       
  3254 
       
  3255 EFSRV_EXPORT_C TInt RFs::SetLocalDriveMapping(const TDesC8& aMapping)
       
  3256 //
       
  3257 // Set the local drive mapping
       
  3258 //
       
  3259 	{
       
  3260 	TRACEMULT2(UTF::EBorder, UTraceModuleEfsrv::EFsSetLocalDriveMapping, MODULEUID, Handle(), aMapping);
       
  3261 
       
  3262 	TInt r = SendReceive(EFsSetLocalDriveMapping,TIpcArgs(&aMapping));
       
  3263 
       
  3264 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsSetLocalDriveMappingReturn, MODULEUID, r);
       
  3265 	return r;
       
  3266 	}
       
  3267 
       
  3268 
       
  3269 /**
       
  3270     Finalise the given drive. This operation is intended to put the drive into the consistent state when it is
       
  3271     safe to remove it physically or switch the power off.
       
  3272 
       
  3273     @param  aDriveNo    drive number
       
  3274     @param  aMode       describes the finalisation operation, see RFs::TFinaliseDrvMode enum
       
  3275 
       
  3276     @return KErrNone on success,
       
  3277             KErrArgument if the function arguments are invalid
       
  3278             KErrInUse    if the drive has opened objects (files, directories etc.) and therefore can not be finalised
       
  3279             KErrCorrupt  if the drive is corrupt.
       
  3280             System wide error codes otherwise.
       
  3281 
       
  3282     @capability DiskAdmin
       
  3283 */
       
  3284 EFSRV_EXPORT_C TInt RFs::FinaliseDrive(TInt aDriveNo, TFinaliseDrvMode aMode) const
       
  3285     {
       
  3286 	TRACE3(UTF::EBorder, UTraceModuleEfsrv::EFsFinaliseDrive, MODULEUID, Handle(), aDriveNo, aMode);
       
  3287     TInt r = SendReceive(EFsFinaliseDrive,TIpcArgs(aDriveNo, (TInt)aMode));
       
  3288 
       
  3289 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsFinaliseDriveReturn, MODULEUID, r);
       
  3290 	return r;
       
  3291     }
       
  3292 
       
  3293 
       
  3294 /**
       
  3295     Makes the best effort to finalise all drives in the system. 
       
  3296     Effectively calls RFs::FinaliseDrive(..., EFinal_RW) to all present drives in the system. This makes impossible to 
       
  3297     analyse the error code if the finalisation of some fails.
       
  3298     It is much better to use RFs::FinaliseDrive(...) specifying concrete drive number and desired finalisation mode.
       
  3299 
       
  3300     @return KErrNone, if successful; otherwise one of the other system-wide error codes.
       
  3301     @capability DiskAdmin
       
  3302 */
       
  3303 EFSRV_EXPORT_C TInt RFs::FinaliseDrives()
       
  3304 	{
       
  3305 	TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFsFinaliseDrives, MODULEUID, Handle());
       
  3306 	TInt nRes;
       
  3307 	TDriveList driveList;
       
  3308 	TDriveInfo driveInfo;
       
  3309 	
       
  3310 	nRes=DriveList(driveList);
       
  3311 	if(nRes != KErrNone)
       
  3312 		{
       
  3313 		TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFsFinaliseDrivesReturn, MODULEUID, nRes);
       
  3314 	    return nRes; //-- unable to obtain drives list
       
  3315 		}
       
  3316 	
       
  3317 	//-- walk through all drives in the system sending them "Finalise" request
       
  3318 	for (TInt i=0; i<KMaxDrives; ++i)
       
  3319         {
       
  3320 	    if(!driveList[i])
       
  3321 	        continue;   //-- skip unexisting drive
       
  3322 	    
       
  3323 	    if(Drive(driveInfo, i) != KErrNone)
       
  3324 	        continue;   //-- skip this drive, can't get information about it
       
  3325         
       
  3326         const TUint KDrvAttExclude = KDriveAttRom | KDriveAttRedirected; //-- the drive attributes to exlcude from the finalisation
       
  3327 
       
  3328         if(driveInfo.iDriveAtt & KDrvAttExclude) 
       
  3329             continue;
       
  3330         	 
       
  3331 	    nRes = FinaliseDrive(i, EFinal_RW);
       
  3332 	    }
       
  3333 	
       
  3334 
       
  3335 	TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFsFinaliseDrivesReturn, MODULEUID, KErrNone);
       
  3336 	return 	KErrNone;
       
  3337 	}
       
  3338 
       
  3339 
       
  3340 
       
  3341 EFSRV_EXPORT_C TInt RFs::SwapFileSystem(const TDesC& aOldFileSystemName,const TDesC& aNewFileSystemName,TInt aDrive) const
       
  3342 /**
       
  3343 Dismount aOldFileSystemName and mount aNewFileSystemName in an atomic operation
       
  3344 
       
  3345 If swapping in the composite filesystem, and no mounts have been added to it,
       
  3346 then ROFS is added to it by default.  The synchronous state of the composite filesystem
       
  3347 will be used in preference to that of the old filesystem when it is mounted.
       
  3348 
       
  3349 @param aOldFileSystemName The filesystem name that is currently on the drive.
       
  3350 @param aNewFileSystemName The filesystem name that is to be swapped onto the drive.
       
  3351 @param aDrive The drive for which the filesystem is to be swapped.
       
  3352 
       
  3353 @return KErrNone if successful
       
  3354 		KErrInUse if a dismount is pending on the drive
       
  3355 		KErrNotSupported if swapping Z drive with something other then composite or if the drive is asynchronous
       
  3356 		KErrAlreadyExists if swapping the composite filesystem, and it is already mounted
       
  3357 		KErrNotFound If the filesystem name provided could not be found.
       
  3358 		
       
  3359 @capability DiskAdmin
       
  3360 */
       
  3361 	{
       
  3362 	TRACEMULT4(UTF::EBorder, UTraceModuleEfsrv::EFsSwapFileSystem, MODULEUID, Handle(), aOldFileSystemName, aNewFileSystemName, aDrive);
       
  3363 	TInt r = SendReceive(EFsSwapFileSystem,TIpcArgs(&aNewFileSystemName,aDrive,&aOldFileSystemName));
       
  3364 
       
  3365 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsSwapFileSystemReturn, MODULEUID, r);
       
  3366 	return r;
       
  3367 	}
       
  3368 
       
  3369 
       
  3370 EFSRV_EXPORT_C TInt RFs::AddCompositeMount(const TDesC& aFileSystemName,TInt aLocalDriveToMount,TInt aCompositeDrive, TBool aSync) const
       
  3371 /**
       
  3372 Adds a local drive to the composite filesystem.  This can only be used before 
       
  3373 the composite filesystem is mounted.  The local drive is mounted with the
       
  3374 filesystem provided.  If any local drive added is marked to be asynchronous,
       
  3375 then the whole composite drive will be treated asynchronous.
       
  3376 
       
  3377 @param aFileSystemName The filesystem of the local drive to be added.
       
  3378 @param aLocalDriveToMount The local drive to be added.
       
  3379 @param aCompositeDrive The drive the composite filesystem will be mounted on.
       
  3380 @param aSync If the filesystem added here is preferred to be synchronous.
       
  3381 
       
  3382 @return KErrNone if successful
       
  3383 		KErrNotFound If the filesystem name provided could not be found.
       
  3384 		KErrNotReady If the composite filesystem has not been initialised.
       
  3385 		KErrNotSupported If the composite filesystem is already mounted or the parameters passed are unsupported
       
  3386 		
       
  3387 @capability DiskAdmin
       
  3388 */
       
  3389 	{
       
  3390 	TRACEMULT5(UTF::EBorder, UTraceModuleEfsrv::EFsAddCompositeMount, MODULEUID, 
       
  3391 		Handle(), aFileSystemName, aLocalDriveToMount, aCompositeDrive, aSync);
       
  3392 	TInt r = SendReceive(EFsAddCompositeMount,TIpcArgs(&aFileSystemName,aLocalDriveToMount,aCompositeDrive,aSync));
       
  3393 
       
  3394 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsAddCompositeMountReturn, MODULEUID, r);
       
  3395 	return r;
       
  3396 	}
       
  3397 
       
  3398 
       
  3399 EFSRV_EXPORT_C TInt RFs::ReserveDriveSpace(TInt aDriveNo, TInt aSpace)
       
  3400 /**
       
  3401 Reserves an area of a drive. It is intended that sensible (tm) apps will reserve a small
       
  3402 area of disk for 'emergency' use in case of later out of disk situations. If the amount of 
       
  3403 reserved space later needs to be readjusted, this method should be called again with 
       
  3404 aSpace as the amount of extra space needed. 
       
  3405 
       
  3406 Once space has been reserved via this method, an application can use RFs::GetReserveAccess
       
  3407 to gain access to the reserved area prior to executing disk space critical sections of code.
       
  3408 After the section of code is complete, the application should release access to the reserved
       
  3409 area.
       
  3410 
       
  3411 For internal drives, reserved space will be lost if a reboot occurs. For removeable drives,
       
  3412 reserved space may be lost if there is a media change.
       
  3413 
       
  3414 Reserved space will be cleaned up automatically when the RFs is closed.
       
  3415 
       
  3416 Each drive has a max amount of space available to be reserved, and individual sessions also 
       
  3417 have a max amount of space. These are defined in f32/sfile/sf_std.h as KMaxTotalDriveReserved
       
  3418 and KMaxSessionDriveReserved respectively. Once space is reserved, it is only available to 
       
  3419 the reserving session until that session releases the reserved space.
       
  3420 
       
  3421 @param aDriveNo Which drive to reserve space on
       
  3422 
       
  3423 @param aSpace Amount of space to reserve
       
  3424 
       
  3425 @return KErrNone if successful
       
  3426         KErrInUse if the session already has reserved access
       
  3427         KErrArgument if aSpace is invalid (greater than KMaxSessionDriveReserved, negative number, etc.)
       
  3428         KErrDiskFull if insufficient space is left on the drive to service the request
       
  3429         KErrTooBig if this request would overflow the available reserve (greater than KMaxTotalDriveReserved)
       
  3430         any of the possible error return codes from TDrive::Volume()
       
  3431 */
       
  3432 	{
       
  3433 	TRACE3(UTF::EBorder, UTraceModuleEfsrv::EFsReserveDriveSpace, MODULEUID, Handle(), aDriveNo, aSpace);
       
  3434 	TInt r = SendReceive(EFsReserveDriveSpace, TIpcArgs(aDriveNo, aSpace));
       
  3435 
       
  3436 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsReserveDriveSpaceReturn, MODULEUID, r);
       
  3437 	return r;
       
  3438 	}
       
  3439 
       
  3440 
       
  3441 
       
  3442 
       
  3443 EFSRV_EXPORT_C TInt RFs::GetReserveAccess(TInt aDriveNo)
       
  3444 /**
       
  3445 Get exclusive access for this session to overwrite a specific disk area, which has previously
       
  3446 been reserved via RFs::ReserveDriveSpace
       
  3447 
       
  3448 @param aDriveNo drive on which to get reserved access
       
  3449 
       
  3450 @return KErrNone if successful
       
  3451         KErrPermissionDenied if the drive has no spare reserved space
       
  3452 */
       
  3453 	{
       
  3454 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFsGetReserveAccess, MODULEUID, Handle(), aDriveNo);
       
  3455 	TInt r = SendReceive(EFsGetReserveAccess, TIpcArgs(aDriveNo));
       
  3456 
       
  3457 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsGetReserveAccessReturn, MODULEUID, r);
       
  3458 	return r;
       
  3459 	}
       
  3460 
       
  3461 EFSRV_EXPORT_C TInt RFs::ReleaseReserveAccess(TInt aDriveNo)
       
  3462 /**
       
  3463 Release exclusive access for this session to overwrite a specific disk area.
       
  3464 
       
  3465 @param aDriveNo drive on which to release reserved access
       
  3466 
       
  3467 @return KErrNone (always returned)
       
  3468 
       
  3469 */
       
  3470 	{
       
  3471 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFsReleaseReserveAccess, MODULEUID, Handle(), aDriveNo);
       
  3472 	TInt r = SendReceive(EFsReleaseReserveAccess, TIpcArgs(aDriveNo));
       
  3473 
       
  3474 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsReleaseReserveAccessReturn, MODULEUID, r);
       
  3475 	return r;
       
  3476 	}
       
  3477 
       
  3478 
       
  3479 
       
  3480 
       
  3481 /**
       
  3482 Sets up a pending dismount notifier, the type of which is specified by TNotifyDismountMode.
       
  3483 
       
  3484 	EFsDismountRegisterClient - Sets up a notifier to signal the client when a dismount has been requested.
       
  3485 	EFsDismountNotifyClients  - Notifies all clients (who registered using EFsDismountRegisterClient) of a pending dismount, 
       
  3486 					  signalling the caller when all clients have responded.
       
  3487 	EFsDismountForceDismount  - Forcibly dismounts the file system without signalling any registered clients.
       
  3488 
       
  3489 This API is intended to be used to allow applications and servers to commit their data to
       
  3490 the media prior to the file system being dismounted.  The application forcing the dismount
       
  3491 should first attempt to notify all clients.  If all clients don't respond in a a reaonable
       
  3492 time, the dismount request may be cancelled, followed by a forced dismount.
       
  3493 
       
  3494 Any handles left open on the file system shall be disassociated from the media. Attempts to
       
  3495 access these resources shall return with the KErrDismounted error code.
       
  3496 
       
  3497 @param aDriveNo The drive on which to request dismount
       
  3498 @param aMode A TNotifyDismountMode specifying the behaviour of the notification API
       
  3499 @param aStat Completed when all clients have indicated that it is safe to remove the media
       
  3500 */
       
  3501 EFSRV_EXPORT_C void RFs::NotifyDismount(TInt aDrive, TRequestStatus& aStat, TNotifyDismountMode aMode) const
       
  3502 	{
       
  3503 	TRACE4(UTF::EBorder, UTraceModuleEfsrv::EFsNotifyDismount, MODULEUID, Handle(), aDrive, &aStat, aMode);
       
  3504 	aStat = KRequestPending;
       
  3505 	RSessionBase::SendReceive(EFsNotifyDismount, TIpcArgs(aDrive,aMode,&aStat), aStat);
       
  3506 	// This call is to synchronise with the driver thread as the corresponding cancel function (NotifyDismountCancel)
       
  3507 	// is synchronous, so it can complete before this notify request has even been added to TDismountNotifyQue.
       
  3508 	// This call guarantees that the notify request has been added to queue.
       
  3509 	SendReceive(EFsSynchroniseDriveThread, TIpcArgs(aDrive));
       
  3510 
       
  3511 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFsNotifyDismountReturn, MODULEUID);
       
  3512 	}
       
  3513 
       
  3514 
       
  3515 
       
  3516 
       
  3517 EFSRV_EXPORT_C void RFs::NotifyDismountCancel(TRequestStatus& aStat) const
       
  3518 /**
       
  3519 Cancels the oustanding dismount notifier, completing with KErrCancel.
       
  3520 
       
  3521 @param aStat The request status object associated with the request to be cancelled.
       
  3522 
       
  3523 @see RFs::NotifyDismount
       
  3524 */
       
  3525 	{
       
  3526 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFsNotifyDismountCancel1, MODULEUID, Handle(), &aStat);
       
  3527 	
       
  3528 	if (aStat == KRequestPending)
       
  3529 		SendReceive(EFsNotifyDismountCancel, TIpcArgs(&aStat));
       
  3530 
       
  3531 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFsNotifyDismountCancel1Return, MODULEUID);
       
  3532 	}
       
  3533 
       
  3534 
       
  3535 
       
  3536 
       
  3537 EFSRV_EXPORT_C void RFs::NotifyDismountCancel() const
       
  3538 /**
       
  3539 Cancel all oustanding dismount notifiers for this session, completing with KErrCancel.
       
  3540 
       
  3541 @see RFs::NotifyDismount
       
  3542 */
       
  3543 	{
       
  3544 	TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFsNotifyDismountCancel2, MODULEUID, Handle());
       
  3545 
       
  3546 	SendReceive(EFsNotifyDismountCancel, TIpcArgs(NULL));
       
  3547 
       
  3548 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFsNotifyDismountCancel2Return, MODULEUID);
       
  3549 	}
       
  3550 
       
  3551 
       
  3552 
       
  3553 
       
  3554 EFSRV_EXPORT_C TInt RFs::AllowDismount(TInt aDrive) const
       
  3555 /**
       
  3556 Used by a client to indicate that it is safe to dismount the file system.
       
  3557 This should be called after receiving a pending media removal notification.
       
  3558 
       
  3559 Not calling this does not guarantee that the dismount will not occur
       
  3560 as the application requesting the dismount may decide to forcibly dismount
       
  3561 after a given timeout period.
       
  3562 
       
  3563 @param aDriveNo The drive on which to allow the dismount.
       
  3564 
       
  3565 @return KErrNone if successful
       
  3566 
       
  3567 @see RFs::NotifyDismount
       
  3568 */
       
  3569 	{
       
  3570 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFsAllowDismount, MODULEUID, Handle(), aDrive);
       
  3571 	TInt r = SendReceive(EFsAllowDismount, TIpcArgs(aDrive));
       
  3572 
       
  3573 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsAllowDismountReturn, MODULEUID, r);
       
  3574 	return r;
       
  3575 	}
       
  3576 
       
  3577 EFSRV_EXPORT_C TInt RFs::SetStartupConfiguration(TInt aCommand,TAny* aParam1,TAny* aParam2) const
       
  3578 /**
       
  3579 @publishedPartner
       
  3580 @release
       
  3581 
       
  3582 Only can be called in estart. Licensees could use this function to configure
       
  3583 file server at startup through their own version of estart.
       
  3584 
       
  3585 Currently only loader thread priority can be specified.
       
  3586 
       
  3587 @param aCommand Command indicating what aspect of file server should be configured.
       
  3588        aParam1 Command specific parameter.
       
  3589        aParam2 Command specific parameter.
       
  3590 
       
  3591 @return KErrNone if successful, KErrPermissionDenied if called outside estart
       
  3592 */
       
  3593     {
       
  3594 	TRACE4(UTF::EBorder, UTraceModuleEfsrv::EFsSetStartupConfiguration, MODULEUID, Handle(), aCommand, aParam1, aParam2);
       
  3595     TInt r = SendReceive(EFsSetStartupConfiguration, TIpcArgs(aCommand,aParam1,aParam2));
       
  3596 
       
  3597 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsSetStartupConfigurationReturn, MODULEUID, r);
       
  3598 	return r;
       
  3599     }
       
  3600 
       
  3601 
       
  3602 EFSRV_EXPORT_C TInt RFs::SetNotifyChange(TBool aNotifyChange)
       
  3603 /**
       
  3604 Enables/Disables change notification on a per-session basis.  Change notification is enabled
       
  3605 by default, and can be disabled using this API.  Disabling change notification will result in
       
  3606 clients of the file server not being notified of events such as directory/file changes.
       
  3607   
       
  3608 @param aNotifyChange ETrue to enable change notifications, EFalse to disable.
       
  3609 
       
  3610 @return KErrNone if successful.
       
  3611 
       
  3612 @capability DiskAdmin
       
  3613         
       
  3614 @see RFs::NotifyChange
       
  3615  */
       
  3616 	{
       
  3617 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFsSetNotifyChange, MODULEUID, Handle(), aNotifyChange);
       
  3618 	TInt r = SendReceive(EFsSetSessionFlags, TIpcArgs(aNotifyChange ? EFsSessionNotifyChange: 0, aNotifyChange ? 0 : EFsSessionNotifyChange));
       
  3619 
       
  3620 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsSetNotifyChangeReturn, MODULEUID, r);
       
  3621 	return r;
       
  3622 	}
       
  3623 
       
  3624 
       
  3625 TInt RFs::Unclamp(const RFileClamp& aHandle)
       
  3626 /**
       
  3627 Makes available for paging-out the media space occupied by the file identified by
       
  3628 the supplied handle.
       
  3629   
       
  3630 @param aHandle handle to the file on the media.
       
  3631 
       
  3632 @return KErrNone if successful.
       
  3633 
       
  3634 @capability ???
       
  3635         
       
  3636 @see RFile::Clamp
       
  3637  */
       
  3638 	{
       
  3639 	TPckg<RFileClamp> pkHandle(aHandle);
       
  3640 	return SendReceive(EFsUnclamp, TIpcArgs(& pkHandle));
       
  3641 	}
       
  3642 
       
  3643 EFSRV_EXPORT_C TInt RFs::InitialisePropertiesFile(const TPtrC8& aPtr) const
       
  3644 /**
       
  3645 Sets the F32 properties file - Can only be called from the ESTART process
       
  3646 
       
  3647 @param aPtr A descriptor pointing to an INI file in ROM.
       
  3648 
       
  3649 @return KErrNone if successful.
       
  3650 
       
  3651 @capability KDiskAdmin
       
  3652 */
       
  3653 	{
       
  3654 	TRACE3(UTF::EBorder, UTraceModuleEfsrv::EFsInitialisePropertiesFile, MODULEUID, Handle(), aPtr.Ptr(), aPtr.Length());
       
  3655 	TInt r = SendReceive(EFsInitialisePropertiesFile, TIpcArgs(aPtr.Ptr(), aPtr.Length(), ETrue));
       
  3656 
       
  3657 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsInitialisePropertiesFileReturn, MODULEUID, r);
       
  3658 	return r;
       
  3659 	}
       
  3660 
       
  3661 EFSRV_EXPORT_C TInt RFs::QueryVolumeInfoExt(TInt aDrive, TQueryVolumeInfoExtCmd aCommand, TDes8& aInfo) const
       
  3662 /**
       
  3663 @internalTechnology
       
  3664 Queries specific information on volumes by commands. Available commands is defined by TQueryVolumeInfoExtCmd.
       
  3665 
       
  3666 @param aDriveNo The drive on which to query information.
       
  3667 @param aCommand A command to specify which information is under query
       
  3668 @param aInfo A TPckgBuf<> to carry returned results.
       
  3669 
       
  3670 @return KErrNone if successful; otherwise another system-wide error code is returned.
       
  3671         
       
  3672 @see TQueryVolumeInfoExtCmd
       
  3673 @see TVolumeIOParamInfo
       
  3674  */
       
  3675 	{
       
  3676 	TRACE3(UTF::EBorder, UTraceModuleEfsrv::EFsQueryVolumeInfoExt, MODULEUID, Handle(), aDrive, aCommand);
       
  3677 	TInt r = SendReceive(EFsQueryVolumeInfoExt, TIpcArgs(aDrive, aCommand, &aInfo));
       
  3678 
       
  3679 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsQueryVolumeInfoExtReturn, MODULEUID, r);
       
  3680 	return r;
       
  3681 	}
       
  3682 
       
  3683 
       
  3684 EFSRV_EXPORT_C TInt RFs::VolumeIOParam(TInt aDrive, TVolumeIOParamInfo& aParamInfo) const
       
  3685 /**
       
  3686 This function queries a set of I/O parameters on the specified volume, this includes the block size of underlying media,
       
  3687 cluster size of the mounted file system and the recommended read/write buffer sizes. 
       
  3688 
       
  3689 The volume information is retuned through aParamInfo. Even if VolumeIOParam() returns successful, errors 
       
  3690 can effect the return value of each field within aParamInfo.
       
  3691 
       
  3692 @param aDrive A drive number, specifies which volume to query.
       
  3693 @param aParamInfo A TVolumeIOParamInfo containing the volume parameters.
       
  3694 
       
  3695 @return KErrNone if successful; otherwise, another system wide error code is returned.
       
  3696 */
       
  3697 	{
       
  3698 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFsVolumeIOParam, MODULEUID, Handle(), aDrive);
       
  3699 
       
  3700 	TInt r = KErrNone;
       
  3701 
       
  3702 	if (!IsValidDrive(aDrive))
       
  3703 		r = KErrArgument;
       
  3704 	
       
  3705 	if (r == KErrNone)
       
  3706 		{
       
  3707 		TPckgBuf<TVolumeIOParamInfo> infoPckg;
       
  3708 		r = QueryVolumeInfoExt(aDrive, EIOParamInfo, infoPckg);
       
  3709 		if (r == KErrNone)
       
  3710 			aParamInfo = infoPckg();
       
  3711 		}
       
  3712 
       
  3713 	TRACE5(UTF::EBorder, UTraceModuleEfsrv::EFsVolumeIOParamReturn, MODULEUID, 
       
  3714 		r, aParamInfo.iBlockSize, aParamInfo.iClusterSize, aParamInfo.iRecReadBufSize, aParamInfo.iRecWriteBufSize);
       
  3715 	return r;
       
  3716 	}
       
  3717 
       
  3718 
       
  3719 EFSRV_EXPORT_C TInt RFs::FileSystemSubType(TInt aDrive, TDes& aName) const
       
  3720 /**
       
  3721 This function queries the sub type of the file system mounted on the specified volume. For example, 'FAT16' 
       
  3722 of the Fat file system. 
       
  3723 
       
  3724 TFSName is recommended as the type for aName when using this function.
       
  3725 
       
  3726 NOTE: File systems without a sub type (For example, a ROM file system), the name of the file system is 
       
  3727 returned (For example, 'Rom').
       
  3728 
       
  3729 @param aDrive A drive number, specifies which volume to query.
       
  3730 @param aName A descriptor containing the returned sub type name or file system name.
       
  3731 
       
  3732 @return KErrNone if successful; KErrNotSuppoted if sub type is not supported; 
       
  3733 		otherwise another system-wide error code is returned.
       
  3734 
       
  3735 @see TFSName
       
  3736 */
       
  3737 	{
       
  3738 	TRACEMULT3(UTF::EBorder, UTraceModuleEfsrv::EFsFileSystemSubType, MODULEUID, Handle(), aDrive, aName);
       
  3739 
       
  3740 	TInt r = KErrNone;
       
  3741 
       
  3742 	if (!IsValidDrive(aDrive))
       
  3743 		r = KErrArgument;
       
  3744 		
       
  3745 	if (r == KErrNone)
       
  3746 		{
       
  3747 		TPckgBuf<TFSName> namePckg;
       
  3748 		r = QueryVolumeInfoExt(aDrive, EFileSystemSubType, namePckg);
       
  3749 		if (r == KErrNone || r == KErrNotSupported)
       
  3750 			aName = namePckg();
       
  3751 		}
       
  3752 
       
  3753 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFsFileSystemSubTypeReturn, MODULEUID, r);
       
  3754 	return r;
       
  3755 	}
       
  3756 
       
  3757 EXPORT_C TInt RFs::AddProxyDrive(const TDesC& aFileName)
       
  3758 /**
       
  3759 Loads the specified extension.
       
  3760 
       
  3761 @param aFileName The file name of the extension
       
  3762 
       
  3763 @return KErrNone, if successful; otherwise one of the other system wide error codes.
       
  3764 */
       
  3765 	{
       
  3766 	RLoader loader;
       
  3767 	TInt r = loader.Connect();
       
  3768 	if (r==KErrNone)
       
  3769 		{
       
  3770 		r = loader.SendReceive(ELoadFSProxyDrive, TIpcArgs(0, &aFileName, 0));
       
  3771 		loader.Close();
       
  3772 		}
       
  3773 	return r;
       
  3774 	}
       
  3775 
       
  3776 
       
  3777 EXPORT_C TInt RFs::RemoveProxyDrive(const TDesC& aExtensionName)
       
  3778 /**
       
  3779 Removes the specified extension.
       
  3780 
       
  3781 @param aExtensionName The fullname of the extension, as returned from
       
  3782                       a call to ExtensionName().
       
  3783 
       
  3784 @return KErrNone, if successful;
       
  3785 	KErrInUse if there are still drives mounted that are using it
       
  3786        KErrNotFound, if aExtensionName is not found;
       
  3787        otherwise one of the other system-wide error codes.
       
  3788 */
       
  3789 	{
       
  3790 	return(SendReceive(EFsRemoveProxyDrive,TIpcArgs(&aExtensionName)));
       
  3791 	}
       
  3792 
       
  3793 /**
       
  3794 Initialises a proxy drive.
       
  3795 
       
  3796 @param aProxyDriveNumber drive number that will be used to mount the proxy drive
       
  3797 @param aName name of the proxy drive extension
       
  3798 @param anInfo initialisation information to be passed to the proxy drive extension to initialise the drive
       
  3799 
       
  3800 @return If succesful the internal drive number used to represent the drive (equivalent to a local drive 
       
  3801 		number for normal drives) This number is obtained dynmically. The number will range between KMaxLocalDrives
       
  3802 		and KMaxDrives. 
       
  3803 		KErrInUse if aProxyDriveNumber is in use or if there are not proxy drive numbers left
       
  3804 		KErrArgument if aProxyDriveNumber or aName are invalid 
       
  3805 		Any other system wide error code.
       
  3806 		
       
  3807 
       
  3808 */
       
  3809 EXPORT_C TInt RFs::DoMountProxyDrive(const TIpcArgs& ipcArgs)
       
  3810 	{
       
  3811 	return SendReceive(EFsMountProxyDrive, ipcArgs);
       
  3812 	}
       
  3813 
       
  3814 
       
  3815 EXPORT_C TInt RFs::DismountProxyDrive(const TUint aProxyDriveNumber)
       
  3816 /**
       
  3817 Dismounts a proxy drive.
       
  3818 
       
  3819 @param aProxyDriveNumber drive number that will be used to mount the proxy drive
       
  3820 @param aName name of the proxy drive extension
       
  3821 @param anInfo initialisation information to be passed to the proxy drive extension to initialise the drive
       
  3822 
       
  3823 @return If succesful the internal drive number used to represent the drive (equivalent to a local drive 
       
  3824 		number for normal drives) This number is obtained dynmically. The number will range between KMaxLocalDrives
       
  3825 		and KMaxDrives. 
       
  3826 		KErrInUse if aProxyDriveNumber is in use or if there are not proxy drive numbers left
       
  3827 		KErrArgument if aProxyDriveNumber or aName are invalid 
       
  3828 		Any other system wide error code.
       
  3829 		
       
  3830 
       
  3831 */
       
  3832 	{
       
  3833 	return SendReceive(EFsDismountProxyDrive,TIpcArgs(aProxyDriveNumber));
       
  3834 	}
       
  3835 
       
  3836 EFSRV_EXPORT_C void RFs::Close()
       
  3837 	{
       
  3838 	TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFsClose, MODULEUID, Handle());
       
  3839 	RFTRACE_CLOSE;
       
  3840 
       
  3841 	RSessionBase::Close();
       
  3842 
       
  3843 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFsCloseReturn, MODULEUID);
       
  3844 	}
       
  3845 
       
  3846