os/kernelhwsrv/userlibandfileserver/fileserver/sfsrv/cl_file.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
     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_file.cpp
    15 // 
    16 //
    17 
    18 #include "cl_std.h"
    19 
    20 static _LIT_SECURITY_POLICY_S1(KFileServerPolicy,KFileServerUidValue,ECapabilityTCB);
    21 
    22 EFSRV_EXPORT_C TInt RFile::Adopt(RFs& aFs, TInt aHandle)
    23 /**
    24 Adopts an already open file.
    25 
    26 @param aFs     The file server session.
    27 @param aHandle The handle number of the already opened file
    28             
    29 @return KErrNone if successful, 
    30 		KErrBadHandle if the sub-session handle is invalid, 
    31 		otherwise one of the other system-wide error codes.
    32 
    33 @deprecated
    34 */
    35 	{
    36 
    37 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFileAdopt, MODULEUID, aFs.Handle(), aHandle);
    38 
    39 	// duplicate the sub-session handle; don't panic if it's invalid.
    40 	RFile file;
    41 	TInt r = file.CreateSubSession(aFs, EFsFileDuplicate, TIpcArgs(aHandle, EFalse));
    42 	if (r == KErrArgument)
    43 		{
    44 		TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFileAdoptReturn, MODULEUID, KErrBadHandle);
    45 		return KErrBadHandle;
    46 		}
    47 	else if (r != KErrNone)
    48 		{
    49 		TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileAdoptReturn, MODULEUID, r);
    50 		return r;
    51 		}
    52 	// adopt the duplicated handle
    53 	r = CreateAutoCloseSubSession(aFs, EFsFileAdopt, TIpcArgs(file.SubSessionHandle(), KFileAdopt32));
    54 
    55 	TRACERET3(UTF::EBorder, UTraceModuleEfsrv::EFileAdoptReturn, MODULEUID, r, Session().Handle(), SubSessionHandle());
    56 
    57 	return r;
    58 	}
    59 
    60 
    61 
    62 
    63 EFSRV_EXPORT_C TInt RFile::AdoptFromServer(TInt aFsHandle, TInt aFileHandle)
    64 /**
    65 Allows a client to adopt an already open file from a server.
    66 
    67 Assumes that the server's RFs and RFile handles have been sent to the 
    68 client using TransferToClient().
    69 
    70 This RFile will own it's RFs session so that when the sub-session (RFile) 
    71 is closed so will the RFs session.
    72 
    73 @param aFsHandle The file server session (RFs) handle
    74 @param aFileHandle The file (RFile) handle of the already opened file
    75             
    76 @return KErrNone if successful, otherwise one of the other system-wide
    77         error codes.
    78 */
    79 	{
    80 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFileAdoptFromServer, MODULEUID, aFsHandle, aFileHandle);
    81 
    82 	RFs fs;
    83 	TInt r = fs.SetReturnedHandle(aFsHandle, KFileServerPolicy);
    84 	if (r != KErrNone)
    85 		{
    86 		TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileAdoptFromServerReturn, MODULEUID, r);
    87 		return r;
    88 		}
    89 	r = CreateAutoCloseSubSession(fs, EFsFileAdopt, TIpcArgs(aFileHandle, KFileAdopt32));
    90 
    91 	TRACERET3(UTF::EBorder, UTraceModuleEfsrv::EFileAdoptFromServerReturn, MODULEUID, r, Session().Handle(), SubSessionHandle());
    92 
    93 	return r;
    94 	}
    95 
    96 
    97 EFSRV_EXPORT_C TInt RFile::AdoptFromClient(const RMessage2& aMsg, TInt aFsHandleIndex, TInt aFileHandleIndex)
    98 /**
    99 Allows a server to adopt an already open file from a client.
   100 The client's RFs and RFile handles are contained in message slots within aMsg.
   101 
   102 Assumes that the client's RFs and RFile handles have been sent to the server
   103 using TransferToServer().
   104 
   105 
   106 This RFile will own it's RFs session so that when the sub-session (RFile) 
   107 is closed so will the RFs session.
   108 
   109 @param	aMsg		The message received from the client
   110 @param	aFsHandleIndex	The index that identifies the message slot 
   111 					of a file server session (RFs) handle
   112 @param aFileHandleIndex The index that identifies the message slot 
   113 					of the sub-session (RFile) handle of the already opened file
   114             
   115 @return KErrNone if successful, otherwise one of the other system-wide
   116         error codes.
   117 */
   118 	{
   119 	TInt fileHandle = NULL;
   120 
   121 	TInt r = KErrNone;
   122 	if (aFileHandleIndex == 0)
   123 		fileHandle = aMsg.Int0();
   124 	else if (aFileHandleIndex == 1)
   125    		fileHandle = aMsg.Int1();
   126 	else if (aFileHandleIndex == 2)
   127 		fileHandle = aMsg.Int2();
   128 	else if (aFileHandleIndex == 3)
   129 		fileHandle = aMsg.Int3();
   130 	else
   131 		r = KErrArgument;
   132 
   133 #ifdef SYMBIAN_FTRACE_ENABLE
   134 	TInt handle = NULL;
   135 	if (aFsHandleIndex == 0)
   136 		handle = aMsg.Int0();
   137 	else if (aFsHandleIndex == 1)
   138    		handle = aMsg.Int1();
   139 	else if (aFsHandleIndex == 2)
   140 		handle = aMsg.Int2();
   141 	else if (aFsHandleIndex == 3)
   142 		handle = aMsg.Int3();
   143 	TRACE4(UTF::EBorder, UTraceModuleEfsrv::EFileAdoptFromClient, MODULEUID, handle, fileHandle, aFsHandleIndex, aFileHandleIndex);
   144 #endif
   145 
   146 	if (r != KErrNone)
   147 		{
   148 		TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileAdoptFromClientReturn, MODULEUID, r);
   149 		return r;
   150 		}
   151 
   152 	// Duplicates the file server (RFs) session handle identified by an 
   153 	// existing handle contained in the message slot at index aFsHandleIndex
   154 	RFs fs;
   155 	r = fs.Open(aMsg, aFsHandleIndex, KFileServerPolicy);
   156 	if (r != KErrNone)
   157 		{
   158 		TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileAdoptFromClientReturn, MODULEUID, r);
   159 		return r;
   160 		}
   161 
   162 	r = CreateAutoCloseSubSession(fs, EFsFileAdopt, TIpcArgs(fileHandle, KFileAdopt32));
   163 
   164 	TRACERET3(UTF::EBorder, UTraceModuleEfsrv::EFileAdoptFromClientReturn, MODULEUID, r, Session().Handle(), SubSessionHandle());
   165 
   166 	return r;
   167 	}
   168 
   169 
   170 EFSRV_EXPORT_C TInt RFile::AdoptFromCreator(TInt aFsHandleIndex, TInt aFileHandleIndex)
   171 /**
   172 Allows a server to adopt an already open file from a client process.
   173 The client's file-server (RFs) and file (RFile) handles are contained in 
   174 this process's environment data slots.
   175 
   176 Assumes that the client's RFs and RFile handles have been sent to the server process
   177 using TransferToProcess().
   178 
   179 This RFile will own it's RFs session so that when the sub-session (RFile) 
   180 is closed so will the RFs session.
   181 
   182 @param	aFsHandleIndex	An index that identifies the slot in the process
   183 					environment data that contains the file server session (RFs) handle
   184 @param	aFileHandleIndex	An index that identifies the slot in the process
   185 					environment data that contains the sub-session (RFile) handle 
   186 					of the already opened file
   187             
   188 @return KErrNone if successful, otherwise one of the other system-wide
   189         error codes.
   190 */
   191 	{
   192 	TInt fileHandle = NULL;
   193 
   194 	TInt r = User::GetTIntParameter(aFileHandleIndex,  fileHandle);
   195 
   196 	TRACE3(UTF::EBorder, UTraceModuleEfsrv::EFileAdoptFromCreator, MODULEUID, fileHandle, aFsHandleIndex, aFileHandleIndex);
   197 
   198 	if (r != KErrNone)
   199 		{
   200 		TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileAdoptFromCreatorReturn, MODULEUID, r);
   201 		return r;
   202 		}
   203 
   204 
   205 	// Duplicates the file server (RFs) session handle identified by an 
   206 	// existing handle contained in the environment slot at index aFsHandleIndex
   207 	RFs fs;
   208 	r = fs.Open(aFsHandleIndex, KFileServerPolicy);
   209 	if (r != KErrNone)
   210 		{
   211 		TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileAdoptFromCreatorReturn, MODULEUID, r);
   212 		return r;
   213 		}
   214 
   215 	r = CreateAutoCloseSubSession(fs, EFsFileAdopt, TIpcArgs(fileHandle, KFileAdopt32));
   216 
   217 	TRACERET3(UTF::EBorder, UTraceModuleEfsrv::EFileAdoptFromCreatorReturn, MODULEUID, r, Session().Handle(), SubSessionHandle());
   218 
   219 	return r;
   220 	}
   221 
   222 
   223 
   224 /**
   225 Make a duplicate of the passed file handle in the same thread.
   226 
   227 By default, any thread in the process can use the duplicated handle to access the 
   228 file. However, specifying EOwnerThread as the second parameter to this function, 
   229 means that only the creating thread can use the handle.
   230 
   231 @param	aFile	The file handle to duplicate
   232 @param	aType	An enumeration whose enumerators define the ownership of this 
   233 				handle. If not explicitly specified, EOwnerProcess is taken
   234 				as default.
   235 
   236 @return	one of the other system-wide error codes.
   237 */
   238 EFSRV_EXPORT_C TInt RFile::Duplicate(const RFile& aFile, TOwnerType aType)
   239 	{
   240 	TRACE3(UTF::EBorder, UTraceModuleEfsrv::EFileDuplicate, MODULEUID, aFile.Session().Handle(), aFile.SubSessionHandle(), aType);
   241 
   242 	RFs fs;
   243 	fs.SetHandle(aFile.Session().Handle());
   244 
   245 	// Need to make a duplicate of the session handle in the current thread, 
   246 	// otherwise closing one session will close both sub-sessions.
   247 	TInt r = fs.Duplicate(RThread(), aType);
   248 	if (r != KErrNone)
   249 		{
   250 		TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileDuplicateReturn, MODULEUID, r);
   251 		return r;
   252 		}
   253 	
   254 	// duplicate the sub-session handle
   255 	TInt dupSubSessionHandle;
   256 	r = aFile.DuplicateHandle(dupSubSessionHandle);
   257 	if (r != KErrNone)
   258 		{
   259 		TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileDuplicateReturn, MODULEUID, r);
   260 		return r;
   261 		}
   262 
   263 	// adopt the duplicated sub-session handle
   264 	r = CreateAutoCloseSubSession(fs, EFsFileAdopt, TIpcArgs(dupSubSessionHandle, KFileDuplicate));
   265 
   266 	TRACERET3(UTF::EBorder, UTraceModuleEfsrv::EFileDuplicateReturn, MODULEUID, r, Session().Handle(), SubSessionHandle());
   267 
   268 	return r;
   269 	}
   270 
   271 
   272 // Makes a duplicate of this file (RFile) handle in the current thread and 
   273 // returns it in aSubSessionHandle. 
   274 // The duplicate file handle will effectively be in limbo (although still 
   275 // owned by the session) until :
   276 // (1) the session handle is duplicated into another process - 
   277 //     this happens in one of : TransferToClient(), TransferToProcess() or 
   278 //     AdoptFromClient() and
   279 // (2) the sub-session handle is transferred to the other process - using AdoptXXX()
   280 // 
   281 TInt RFile::DuplicateHandle(TInt& aSubSessionHandle) const
   282 	{
   283 	RFs fs;
   284 	fs.SetHandle(Session().Handle());
   285 	RFile file;
   286 	
   287 	// duplicate the sub-session handle; panic if it's invalid.
   288 	TInt r = file.CreateSubSession(fs, EFsFileDuplicate, TIpcArgs(SubSessionHandle(), ETrue));
   289 	
   290 	// return the duplicated handle
   291 	// Note that this handle needs to be adopted before it can be used
   292 	aSubSessionHandle = file.SubSessionHandle();
   293 	
   294 	return r;
   295 	}
   296 
   297 
   298 /**
   299 Transfers an already open file to a server.
   300 
   301 Before this function can be called, the file server session which owns this file handle
   302 must first be marked as shareable by calling RFs::ShareProtected().
   303 
   304 This function packages handle details for this file into 2 arguments of a TIpcArgs object.
   305 When these arguments are sent in an IPC message, the server which receives them may 
   306 call AdoptFromClient() to open a new RFile object which refers to the same file as this.
   307 
   308 @param	aIpcArgs	The IPC message arguments.
   309 @param	aFsHandleIndex	An index that identifies an argument in aIpcArgs where the
   310 					file server session handle will be stored.
   311 					This argument must not be used for anything else otherwise the 
   312 					results will be unpredictable.
   313 @param	aFileHandleIndex	An index that identifies an argument in aIpcArgs where the
   314 					file handle will be stored.
   315 					This argument must not be used for anything else otherwise the 
   316 					results will be unpredictable.
   317 
   318 @return KErrNone if successful, otherwise one of the other system-wide
   319 		error codes.
   320 
   321 */
   322 EFSRV_EXPORT_C TInt RFile::TransferToServer(TIpcArgs& aIpcArgs, TInt aFsHandleIndex, TInt aFileHandleIndex) const
   323 	{
   324 	TRACE4(UTF::EBorder, UTraceModuleEfsrv::EFileTransferToServer, MODULEUID, Session().Handle(), SubSessionHandle(), aFsHandleIndex, aFileHandleIndex);
   325 
   326 	if ((aFsHandleIndex < 0) || (aFsHandleIndex > (KMaxMessageArguments-2)))
   327 		{
   328 		TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFileTransferToServerReturn, MODULEUID,  (TUint) KErrArgument);
   329 		return KErrArgument;
   330 		}
   331 
   332 	TInt dupSubSessionHandle;
   333 	TInt r = DuplicateHandle(dupSubSessionHandle);
   334 	if (r == KErrNone)
   335 		{
   336 		aIpcArgs.Set(aFsHandleIndex, Session());
   337 		aIpcArgs.Set(aFileHandleIndex, dupSubSessionHandle);
   338 		}
   339 
   340 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileTransferToServerReturn, MODULEUID, r);
   341 	return r;
   342 	}
   343 
   344 /**
   345 Transfers an already open file from a server to a client.
   346 
   347 Before this function can be called, the file server session which owns this file handle
   348 must first be marked as shareable by calling RFs::ShareProtected().
   349 
   350 The file (RFile) handle is written to the client's address space to the package 
   351 buffer in the message address slot in aMsg identified by aFileHandleIndex.
   352 
   353 If no error occurs, then the message is completed with the file-server (RFs) 
   354 session handle.
   355 
   356 When the message completes, the client may call AdoptFromServer() to open 
   357 a new RFile object which refers to the same file as this.
   358 
   359 Note that if an error occurs then the message is not completed.
   360 
   361 @param	aMsg		A message received from the client
   362 @param	aFileHandleIndex	Identifies the message slot that contains a package 
   363 					buffer pointing to an address in the client's address space 
   364 					to receive the file (RFile) handle
   365   
   366 @return KErrNone if successful, otherwise one of the other system-wide
   367         error codes.
   368 */
   369 EFSRV_EXPORT_C TInt RFile::TransferToClient(const RMessage2& aMsg, TInt aFileHandleIndex) const
   370 	{
   371 	TRACE3(UTF::EBorder, UTraceModuleEfsrv::EFileTransferToClient, MODULEUID, Session().Handle(), SubSessionHandle(), aFileHandleIndex);
   372 
   373 	if (TUint(aFileHandleIndex) >= TUint(KMaxMessageArguments))
   374 		{
   375 		TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFileTransferToClientReturn, MODULEUID,  (TUint) KErrArgument);
   376 		return KErrArgument;
   377 		}
   378 
   379 	TInt dupSubSessionHandle;
   380 	TInt r = DuplicateHandle(dupSubSessionHandle);
   381 	if (r == KErrNone)
   382 		r = aMsg.Write(aFileHandleIndex, TPckgC<TInt>(dupSubSessionHandle));
   383 
   384 	if (r != KErrNone)
   385 		{
   386 		TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileTransferToClientReturn, MODULEUID, r);
   387 		return r;
   388 		}
   389 
   390 	aMsg.Complete(Session());
   391 	
   392 	TRACE1(UTF::EBorder, UTraceModuleEfsrv::EFileTransferToClientReturn, MODULEUID, r);
   393 
   394 	return r;
   395 	}
   396 
   397 
   398 /**
   399 Transfers an already open file to another process.
   400 
   401 Before this function can be called, the file server session which owns this file handle
   402 must first be marked as shareable by calling RFs::ShareProtected().
   403 
   404 This function packages handle details for this file into 2 arguments in another
   405 process's  environment data slots.
   406 When the other process runs, it may call AdoptFromCreator() to open a new RFile 
   407 object which refers to the same file as this.
   408 
   409 @param	aProcess	A handle to another process.
   410 @param	aFsHandleIndex	An index that identifies a slot in the process's
   411 					environment data which on exit will contain the file server 
   412 					session (RFs) handle 
   413 					This slot must not be used for anything else otherwise the 
   414 					results will be unpredictable.
   415 @param	aFileHandleIndex	An index that identifies a slot in the process's
   416 					environment data which on exit will contain the file 
   417 					(RFile) handle.
   418 					This slot must not be used for anything else otherwise the 
   419 					results will be unpredictable.
   420 @return KErrNone if successful, otherwise one of the other system-wide
   421         error codes.
   422 */
   423 // NB slot 0 is reserved for the command line
   424 EFSRV_EXPORT_C TInt RFile::TransferToProcess(RProcess& aProcess, TInt aFsHandleIndex, TInt aFileHandleIndex) const
   425 	{
   426 	TRACE4(UTF::EBorder, UTraceModuleEfsrv::EFileTransferToProcess, MODULEUID, Session().Handle(), SubSessionHandle(), aFsHandleIndex, aFileHandleIndex);
   427 
   428 	TInt dupSubSessionHandle;
   429 	TInt r = DuplicateHandle(dupSubSessionHandle);
   430 
   431 	if (r == KErrNone)
   432 		r = aProcess.SetParameter(aFsHandleIndex, RHandleBase(Session()));
   433 	
   434 	if (r == KErrNone)
   435 		r = aProcess.SetParameter(aFileHandleIndex, dupSubSessionHandle);
   436 
   437 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileTransferToProcessReturn, MODULEUID, r);
   438 
   439 	return r;
   440 	}
   441 
   442 
   443 EFSRV_EXPORT_C TInt RFile::Name(TDes& aName) const
   444 /**
   445 Gets the final part of a filename
   446 
   447 This is used to retrieve the name and extension of a file that has been 
   448 passed from one process to another using the RFile::AdoptXXX() methods.
   449 
   450 @param	aName	On return, contains the name of the file, including the name and 
   451 				extension but excluding the drive letter and path.
   452 
   453 @return KErrNone if successful, otherwise one of the other
   454         system-wide error codes.
   455 
   456 */
   457 	{
   458 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFileName, MODULEUID, Session().Handle(), SubSessionHandle());
   459 
   460 	TInt r = SendReceive(EFsFileName, TIpcArgs(&aName));
   461 
   462 	TRACERETMULT2(UTF::EBorder, UTraceModuleEfsrv::EFileNameReturn, MODULEUID, r, aName);
   463 
   464 	return r;
   465 	}
   466 
   467 
   468 EFSRV_EXPORT_C TInt RFile::FullName(TDes& aName) const
   469 /**
   470 Gets the full filename
   471 
   472 This is used to retrieve the full filename, including drive and path,
   473 of a file that has been passed from one process to another using the 
   474 RFile::AdoptXXX() methods.
   475 
   476 @param	aName	On return, contains the full name of the file, including drive and path.
   477 
   478 @return KErrNone if successful, otherwise one of the other
   479         system-wide error codes.
   480 
   481 */
   482 	{
   483 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFileFullName, MODULEUID, Session().Handle(), SubSessionHandle());
   484 
   485 	TInt r = SendReceive(EFsFileFullName, TIpcArgs(&aName));
   486 
   487 	TRACERETMULT2(UTF::EBorder, UTraceModuleEfsrv::EFileFullNameReturn, MODULEUID, r, aName);
   488 
   489 	return r;
   490 	}
   491 
   492 
   493 
   494 EFSRV_EXPORT_C TInt RFile::Open(RFs& aFs,const TDesC& aName,TUint aMode)
   495 /**
   496 Opens an existing file for reading or writing.
   497 
   498 If the file does not already exist, an error is returned.
   499 
   500 Notes:
   501 
   502 1. To close the file, use Close()
   503 
   504 2. Attempting to open a file with the read-only attribute using the EFileWrite
   505    access mode results in an error.
   506 
   507 3. Attempting to open a file which is greater than or equal to 2GByte (2,147,483,648 bytes)
   508    will fail with KErrTooBig
   509 
   510 4. After a file has been opened, the current write position is set to the start
   511    of the file.
   512    If necessary, use RFile::Seek() to move to a different position within
   513    the file.
   514 
   515 @param aFs   The file server session.
   516 @param aName The name of the file. Any path components (i.e. drive letter
   517              or directory), which are not specified, are taken from
   518              the session path.The file name shall not contain wild cards
   519              ('?' or '*' characters) and illegal characters like 
   520              '<', '>', ':', '"', '/', '|' and '\000'. Backslash '\\' character 
   521              is allowed only as a path delimiter. The filename containing only 
   522              white space characters (See TChar::IsSpace()) is also illegal.
   523 
   524 @param aMode The mode in which the file is opened. See TFileMode.
   525 
   526 @return KErrNone if successful, otherwise one of the other system-wide
   527         error codes.
   528         
   529 @see TFileMode
   530 
   531 @capability Dependent If the path for aName is /Sys and aMode is neither
   532 					  EFileShareReadersOnly nor EFileRead then Tcb capability is required.
   533 @capability Dependent If the path for aName is /Sys and aMode is either
   534 					  EFileShareReadersOnly or EFileRead then Allfiles capability is required.
   535 @capability Dependent If the path for aName begins with /Private and does not match this process'
   536 					  SID then AllFiles capability is required.
   537 @capability Dependent If the path for aName begins with /Resource and aMode is neither
   538  					  EFileShareReadersOrWriters|EFileRead nor EFileShareReadersOnly 
   539  					  nor EFileRead then Tcb capability is required.
   540 
   541 */
   542 	{
   543 	TRACEMULT3(UTF::EBorder, UTraceModuleEfsrv::EFileOpen, MODULEUID, aFs.Handle(), aMode, aName);
   544 
   545 	aMode &= ~EFileBigFile;
   546 	TInt r = CreateSubSession(aFs,EFsFileOpen,TIpcArgs(&aName,aMode));
   547 
   548 	TRACERET2(UTF::EBorder, UTraceModuleEfsrv::EFileOpenReturn, MODULEUID, r, SubSessionHandle());
   549 
   550 	return r;
   551 	}
   552 
   553 
   554 EFSRV_EXPORT_C void RFile::Close()
   555 /**
   556 Closes the file.
   557 
   558 Any open files are closed when the file server session is closed.
   559 
   560 Close() is guaranteed to return, and provides no indication whether
   561 it completed successfully or not. When closing a file you have written to,
   562 you should ensure that data is committed to the file by invoking RFile::Flush()
   563 before closing. If Flush() completes successfully, Close() is essentially a
   564 no-operation.
   565 */
   566 	{
   567 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFileClose, MODULEUID, Session().Handle(), SubSessionHandle());
   568 	
   569 #if defined (SYMBIAN_FTRACE_ENABLE) && defined(__DLL__)
   570 	// Need to close the handle to the trace LDD if this is an auto-close subsession
   571 	// as these close their parent session by calling RHandleBase::Close(), i.e. they
   572 	// bypass RFs::Close() which would normally be responsible for closing the LDD
   573 	TInt h = Session().Handle() ^ CObjectIx::ENoClose;
   574 	if ( h != NULL && (!(h & CObjectIx::ENoClose)) ) 
   575 		{
   576 		RFTRACE_CLOSE;
   577 		}
   578 #endif
   579 
   580 	CloseSubSession(EFsFileSubClose);
   581 
   582 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFileCloseReturn, MODULEUID);
   583 	}
   584 
   585 
   586 EFSRV_EXPORT_C TInt RFile::Create(RFs& aFs,const TDesC& aName,TUint aMode)
   587 /**
   588 Creates and opens a new file for writing.
   589 
   590 If the file already exists, an error is returned.
   591 
   592 If the resulting path does not exist, then the operation cannot proceed and
   593 the function returns an error code.
   594 
   595 Notes:
   596 
   597 1. To close the file, use Close()
   598 
   599 2. It automatically sets the file's archive attribute.
   600 
   601 @param aFs   The file server session.
   602 @param aName The name of the file. Any path components (i.e. drive letter
   603              or directory), which are not specified, are taken from
   604              the session path. The file name shall not contain wild cards
   605              ('?' or '*' characters) and illegal characters like 
   606              '<', '>', ':', '"', '/', '|' and '\000'. Backslash '\\' character 
   607              is allowed only as a path delimiter. The filename containing only 
   608              white space characters (See TChar::IsSpace()) is also illegal.
   609 
   610 @param aMode The mode in which the file is opened. The access mode is
   611              automatically set to EFileWrite. See TFileMode.
   612 
   613 @return KErrNone if successful, otherwise one of the other system-wide
   614         error codes.
   615         
   616 @see TFileMode
   617 
   618 @capability Dependent If the path in aName starts with /Sys then capability Tcb is required
   619 @capability Dependent If the path in aName starts with /Resource then capability Tcb is required
   620 @capability Dependent If the path in aName starts with /Private and does not match this process'
   621 					  SID then AllFiles capability is required.
   622 
   623 */
   624 	{
   625 	aMode &= ~EFileBigFile;
   626 
   627 	TRACEMULT3(UTF::EBorder, UTraceModuleEfsrv::EFileCreate, MODULEUID, aFs.Handle(), aMode, aName);
   628 
   629 	TInt r = CreateSubSession(aFs,EFsFileCreate,TIpcArgs(&aName,aMode));
   630 
   631 	TRACERET2(UTF::EBorder, UTraceModuleEfsrv::EFileCreateReturn, MODULEUID, r, SubSessionHandle());
   632 
   633 	return r;
   634 	}
   635 
   636 
   637 
   638 
   639 EFSRV_EXPORT_C TInt RFile::Replace(RFs& aFs,const TDesC& aName,TUint aMode)
   640 /**
   641 Opens a file for writing, replacing the content of any existing file of the
   642 same name if it exists, or creating a new file if it does not exist.
   643 
   644 If the resulting path exists, then:
   645 
   646 - the length of an existing file with the same filename is re-set to zero 
   647 
   648 - a new file is created, if no existing file with the same filename can be found.
   649 
   650 If the resulting path does not exist, then the operation cannot proceed and
   651 the function returns an error code.
   652 
   653 Notes:
   654 
   655 - To close the file, use Close(), defined in the base class RFsBase.
   656 
   657 - It automatically sets the file's archive attribute.
   658 
   659 @param aFs   The file server session.
   660 @param aName The name of the file. Any path components (i.e. drive letter
   661              or directory), which are not specified, are taken from
   662              the session path. The file name shall not contain wild cards
   663              ('?' or '*' characters) and illegal characters like 
   664              '<', '>', ':', '"', '/', '|' and '\000'. Backslash '\\' character 
   665              is allowed only as a path delimiter. The filename containing only 
   666              white space characters (See TChar::IsSpace()) is also illegal.
   667 
   668 @param aMode The mode in which the file is opened. The access mode is
   669              automatically set to EFileWrite. See TFileMode.
   670 
   671 @return KErrNone if successful, otherwise one of the other system-wide
   672         error codes.
   673         
   674 @see TFileMode
   675 
   676 @capability Dependent If the path in aName starts with /Sys then capability Tcb is required
   677 @capability Dependent If the path in aName starts with /Resource then capability Tcb is required
   678 @capability Dependent If the path in aName starts with /Private and does not match this process'
   679 					  SID then AllFiles capability is required.
   680 
   681 */
   682 	{
   683 	TRACEMULT3(UTF::EBorder, UTraceModuleEfsrv::EFileReplace, MODULEUID, aFs.Handle(), aMode, aName);
   684 	aMode &= ~EFileBigFile;
   685 	TInt r = CreateSubSession(aFs,EFsFileReplace,TIpcArgs(&aName,aMode));
   686 	TRACERET2(UTF::EBorder, UTraceModuleEfsrv::EFileReplaceReturn, MODULEUID, r, SubSessionHandle());
   687 	return r;
   688 	}
   689 
   690 
   691 
   692 
   693 EFSRV_EXPORT_C TInt RFile::Temp(RFs& aFs,const TDesC& aPath,TFileName& aName,TUint aMode)
   694 /**
   695 Creates and opens a temporary file with a unique name for writing and reading.
   696 
   697 Notes:
   698 
   699 1. To close the file, use Close()
   700 
   701 @param aFs   The file server session.
   702 @param aPath The directory in which the file is created.
   703 @param aName On return, contains the full path and file name of the file.
   704              The filename is guaranteed to be unique within the directory
   705              specified by aPath.
   706 @param aMode The mode in which the file is opened. The access mode is
   707              automatically set to EFileWrite. See TFileMode.
   708 
   709 @return KErrNone if successful, otherwise one of the other system-wide
   710         error codes.
   711         
   712 @see TFileMode
   713 
   714 @capability Dependent If aPath starts with /Sys then capability Tcb is required
   715 @capability Dependent If aPath starts with /Resource then capability Tcb is required
   716 @capability Dependent If aPath starts with /Private and does not match this process'
   717 					  SID then AllFiles capability is required.
   718 */
   719 	{
   720    	TRACEMULT3(UTF::EBorder, UTraceModuleEfsrv::EFileTemp, MODULEUID, aFs.Handle(), aPath, aMode);
   721 	aMode &= ~EFileBigFile;
   722 	TInt r = CreateSubSession(aFs,EFsFileTemp,TIpcArgs(&aPath,aMode,&aName));
   723 	TRACERETMULT3(UTF::EBorder, UTraceModuleEfsrv::EFileTempReturn, MODULEUID, r, SubSessionHandle(), aName);
   724 	return r;
   725 	}
   726 
   727 
   728 
   729 
   730 EFSRV_EXPORT_C TInt RFile::Read(TDes8& aDes) const
   731 /**
   732 Reads from the file at the current position.
   733 
   734 This is a synchronous function.
   735 
   736 Note that when an attempt is made to read beyond the end of the file,
   737 no error is returned. 
   738 The descriptor's length is set to the number of bytes read into 
   739 it. Therefore, when reading through a file,the end of file has been reached 
   740 when the descriptor length, as returned by TDesC8::Length(), is zero.
   741 
   742 @param aDes Descriptor into which binary data is read. Any existing contents 
   743             are overwritten. On return, its length is set to the number of
   744             bytes read.
   745 @return KErrNone if successful, otherwise one of the other system-wide error 
   746         codes.
   747 
   748 @see TDesC8::Length
   749 */
   750 	{
   751 	TRACE3(UTF::EBorder, UTraceModuleEfsrv::EFileRead1, MODULEUID, Session().Handle(), SubSessionHandle(), aDes.MaxLength());
   752 
   753 	TInt r = SendReceive(EFsFileRead,TIpcArgs(&aDes,aDes.MaxLength(),I64LOW(KCurrentPosition64)));
   754 
   755 	TRACERET2(UTF::EBorder, UTraceModuleEfsrv::EFileRead1Return, MODULEUID, r, aDes.Length());
   756 
   757 	return r;
   758 	}
   759 
   760 
   761 
   762 
   763 EFSRV_EXPORT_C void RFile::Read(TDes8& aDes,TRequestStatus& aStatus) const
   764 /**
   765 Reads from the file at the current position.
   766 
   767 This is an asynchronous function.
   768 
   769 Note that when an attempt is made to read beyond the end of the file,
   770 no error is returned. 
   771 The descriptor's length is set to the number of bytes read into 
   772 it. Therefore, when reading through a file,the end of file has been reached 
   773 when the descriptor length, as returned by TDesC8::Length(), is zero.
   774 
   775 @param aDes    Descriptor into which binary data is read. Any existing contents 
   776                are overwritten. On return, its length is set to the number of
   777                bytes read.
   778                NB: this function is asynchronous and the request that it
   779                represents may not complete until some time after the call
   780                to the function has returned. It is important, therefore, that
   781                this descriptor remain valid, or remain in scope, until you have
   782                been notified that the request is complete.
   783                
   784 @param aStatus Request status. On completion contains:
   785        KErrNone, if successful, otherwise one of the other system-wide error codes.
   786 
   787 @see TDesC8::Length       
   788 */
   789 	{
   790 	TRACE4(UTF::EBorder, UTraceModuleEfsrv::EFileRead2, MODULEUID, Session().Handle(), SubSessionHandle(), aDes.MaxLength(), &aStatus);
   791 
   792     RSubSessionBase::SendReceive(EFsFileRead,TIpcArgs(&aDes,aDes.MaxLength(),I64LOW(KCurrentPosition64)),aStatus);
   793 
   794 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFileRead2Return, MODULEUID);
   795 	}
   796 
   797 
   798 
   799 
   800 EFSRV_EXPORT_C TInt RFile::Read(TDes8& aDes,TInt aLength) const
   801 /**
   802 Reads the specified number of bytes of binary data from the file at the current position.
   803 
   804 This is a synchronous function.
   805 
   806 Note that when an attempt is made to read beyond the end of the file,
   807 no error is returned. 
   808 The descriptor's length is set to the number of bytes read into 
   809 it. Therefore, when reading through a file,the end of file has been reached 
   810 when the descriptor length, as returned by TDesC8::Length(), is zero.
   811 Assuming aLength is less than the maximum length of the descriptor, the only circumstances 
   812 in which Read() can return fewer bytes than requested, is when the end of 
   813 file is reached or if an error occurs.
   814 
   815 @param aDes    Descriptor into which binary data is read. Any existing
   816                contents are overwritten. On return, its length is set to
   817                the number of bytes read.
   818             
   819 @param aLength The number of bytes to be read from the file into the descriptor. 
   820                If an attempt is made to read more bytes than the descriptor's 
   821                maximum length, the function returns KErrOverflow.
   822                This value must not be negative, otherwise the function
   823                returns KErrArgument.
   824                
   825 @return KErrNone if successful, otherwise one of the other system-wide error
   826         codes.
   827 */
   828 	{
   829 	TRACE3(UTF::EBorder, UTraceModuleEfsrv::EFileRead1, MODULEUID, Session().Handle(), SubSessionHandle(), aLength);
   830 
   831 	if (aLength==0)
   832 		{
   833 		aDes.Zero();
   834 		return(KErrNone);
   835 		}
   836 	else if(aLength>aDes.MaxLength())
   837 		{
   838 		return(KErrOverflow);
   839 		}
   840 	TInt r = SendReceive(EFsFileRead,TIpcArgs(&aDes,aLength,I64LOW(KCurrentPosition64)));
   841 
   842 	TRACERET2(UTF::EBorder, UTraceModuleEfsrv::EFileRead1Return, MODULEUID, r, aDes.Length());
   843 
   844 	return r;
   845 	}
   846 
   847 
   848 
   849 
   850 EFSRV_EXPORT_C void RFile::Read(TDes8& aDes,TInt aLength,TRequestStatus& aStatus) const
   851 /**
   852 Reads a specified number of bytes of binary data from the file at the current position.
   853 
   854 This is an asynchronous function.
   855 
   856 Note that when an attempt is made to read beyond the end of the file,
   857 no error is returned. 
   858 The descriptor's length is set to the number of bytes read into it.
   859 Therefore, when reading through a file, the end of file has been reached 
   860 when the descriptor length, as returned by TDesC8::Length(), is zero.
   861 Assuming aLength is less than the maximum length of the descriptor, the only
   862 circumstances in which Read() can return fewer bytes than requested is when
   863 the end of file is reached or if an error has occurred.
   864 
   865 @param aDes    Descriptor into which binary data is read. Any existing
   866                contents are overwritten. On return, its length is set to the
   867                number of bytes read.
   868                NB: this function is asynchronous and the request that it
   869                represents may not complete until some time after the call
   870                to the function has returned. It is important, therefore, that
   871                this descriptor remain valid, or remain in scope, until you have
   872                been notified that the request is complete.
   873                
   874 @param aLength The number of bytes to be read from the file into the descriptor. 
   875                If an attempt is made to read more bytes than the descriptor's
   876                maximum length, then the function updates aStatus parameter with KErrOverflow.
   877                It must not be negative otherwise the function updates aStatus with KErrArgument.
   878                
   879 @param aStatus Request status. On completion contains KErrNone if successful, 
   880                otherwise one of the other system-wide error codes.
   881 */
   882 	{
   883 	TRACE4(UTF::EBorder, UTraceModuleEfsrv::EFileRead2, MODULEUID, Session().Handle(), SubSessionHandle(), aLength, &aStatus);
   884 
   885 	if (aLength==0)
   886 		{
   887 		aDes.Zero();
   888 		TRequestStatus* req=(&aStatus);
   889 		User::RequestComplete(req,KErrNone);
   890 		return;
   891 		}
   892 	else if(aLength>aDes.MaxLength())
   893 		{
   894 		TRequestStatus* req=(&aStatus);
   895 		User::RequestComplete(req,KErrOverflow);
   896 		return;
   897 		}
   898 		
   899 	RSubSessionBase::SendReceive(EFsFileRead,TIpcArgs(&aDes,aLength,I64LOW(KCurrentPosition64)),aStatus);
   900 
   901 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFileRead2Return, MODULEUID);
   902 	}
   903 
   904 
   905 
   906 
   907 EFSRV_EXPORT_C TInt RFile::Read(TInt aPos,TDes8& aDes) const
   908 /**
   909 Reads from the file at the specified offset within the file
   910 
   911 This is a synchronous function.
   912 
   913 Note that when an attempt is made to read beyond the end of the file,
   914 no error is returned. 
   915 The descriptor's length is set to the number of bytes read into it.
   916 Therefore, when reading through a file, the end of file has been reached 
   917 when the descriptor length, as returned by TDesC8::Length(), is zero.
   918 
   919 @param aPos Position of first byte to be read.  This is an offset from
   920             the start of the file. If no position is specified, reading
   921             begins at the current file position. 
   922             If aPos is beyond the end of the file, the function returns
   923             a zero length descriptor.
   924             
   925 @param aDes The descriptor into which binary data is read. Any existing content
   926             is overwritten. On return, its length is set to the number of
   927             bytes read.
   928             
   929 @return KErrNone if successful, otherwise one of the other system-wide error 
   930         codes.
   931 
   932 @panic FSCLIENT 19 if aPos is negative.        
   933 */
   934 	{
   935 	TRACE5(UTF::EBorder, UTraceModuleEfsrv::EFileRead3, MODULEUID, Session().Handle(), SubSessionHandle(), aPos, 0, aDes.MaxLength());
   936 
   937 	__ASSERT_ALWAYS(aPos>=0,Panic(EPosNegative));
   938 
   939 	TInt r = SendReceive(EFsFileRead,TIpcArgs(&aDes,aDes.MaxLength(),aPos));
   940 
   941 	TRACERET2(UTF::EBorder, UTraceModuleEfsrv::EFileRead3Return, MODULEUID, r, aDes.Length());
   942 
   943 	return r;
   944 	}
   945 
   946 
   947 
   948 
   949 EFSRV_EXPORT_C void RFile::Read(TInt aPos,TDes8& aDes,TRequestStatus& aStatus) const
   950 /**
   951 Reads from the file at the specified offset within the file.
   952 
   953 This is an asynchronous function.
   954 
   955 Note that when an attempt is made to read beyond the end of the file,
   956 no error is returned. 
   957 The descriptor's length is set to the number of bytes read into it.
   958 Therefore, when reading through a file, the end of file has been reached 
   959 when the descriptor length, as returned by TDesC8::Length(), is zero.
   960 
   961 @param aPos    Position of first byte to be read. This is an offset from
   962                the start of the file. If no position is specified, 
   963                reading begins at the current file position.
   964                If aPos is beyond the end of the file, the function returns
   965                a zero length descriptor.
   966                
   967 @param aDes    The descriptor into which binary data is read. Any existing
   968                content is overwritten. On return, its length is set to
   969                the number of bytes read.
   970                NB: this function is asynchronous and the request that it
   971                represents may not complete until some time after the call
   972                to the function has returned. It is important, therefore, that
   973                this descriptor remain valid, or remain in scope, until you have
   974                been notified that the request is complete.
   975                
   976 @param aStatus The request status. On completion, contains an error code of KErrNone 
   977                if successful, otherwise one of the other system-wide error codes.
   978 
   979 @panic FSCLIENT 19 if aPos is negative.        
   980 */
   981 	{
   982 	TRACE6(UTF::EBorder, UTraceModuleEfsrv::EFileRead4, MODULEUID, Session().Handle(), SubSessionHandle(), aPos, 0, aDes.MaxLength(), &aStatus);
   983 
   984 	__ASSERT_ALWAYS(aPos>=0,Panic(EPosNegative));
   985 	RSubSessionBase::SendReceive(EFsFileRead,TIpcArgs(&aDes,aDes.MaxLength(),aPos),aStatus);
   986 
   987 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFileRead4Return, MODULEUID);
   988 	}
   989 
   990 
   991 
   992 
   993 EFSRV_EXPORT_C TInt RFile::Read(TInt aPos,TDes8& aDes,TInt aLength) const
   994 /**
   995 Reads the specified number of bytes of binary data from the file at a specified 
   996 offset within the file.
   997 
   998 This is a synchronous function.
   999 
  1000 Note that when an attempt is made to read beyond the end of the file,
  1001 no error is returned. 
  1002 The descriptor's length is set to the number of bytes read into it.
  1003 Therefore, when reading through a file, the end of file has been reached 
  1004 when the descriptor length, as returned by TDesC8::Length(), is zero.
  1005 Assuming aLength is less than the maximum length of the descriptor, the only
  1006 circumstances in which Read() can return fewer bytes than requested is when
  1007 the end of file is reached or if an error has occurred.
  1008 
  1009 @param aPos    Position of first byte to be read. This is an offset from
  1010                the start of the file. If no position is specified, 
  1011                reading begins at the current file position.
  1012                If aPos is beyond the end of the file, the function returns
  1013                a zero length descriptor.
  1014                
  1015 @param aDes    The descriptor into which binary data is read. Any existing
  1016                contents are overwritten. On return, its length is set to
  1017                the number of bytes read.
  1018 @param aLength The number of bytes to read from the file into the descriptor. 
  1019                If an attempt is made to read more bytes than the descriptor's
  1020                maximum length, then the function updates aStatus parameter with KErrOverflow.
  1021                It must not be negative otherwise the function updates aStatus with KErrArgument.
  1022                
  1023 @return KErrNone if successful, otherwise one of the other system-wide
  1024         error codes.
  1025 
  1026 @panic FSCLIENT 19 if aPos is negative.        
  1027 */
  1028 	{
  1029 	TRACE5(UTF::EBorder, UTraceModuleEfsrv::EFileRead3, MODULEUID, Session().Handle(), SubSessionHandle(), aPos, 0, aLength);
  1030 
  1031 	__ASSERT_ALWAYS(aPos>=0,Panic(EPosNegative));
  1032 	if (aLength==0)
  1033 		{
  1034 		aDes.Zero();
  1035 		return(KErrNone);
  1036 		}
  1037 	else if(aLength>aDes.MaxLength())
  1038 		{
  1039 		return(KErrOverflow);
  1040 		}
  1041 		
  1042 	TInt r = SendReceive(EFsFileRead,TIpcArgs(&aDes,aLength,aPos));
  1043 
  1044 	TRACERET2(UTF::EBorder, UTraceModuleEfsrv::EFileRead3Return, MODULEUID, r, aDes.Length());
  1045 
  1046 	return r;
  1047 	}
  1048 
  1049 
  1050 
  1051 
  1052 EFSRV_EXPORT_C void RFile::Read(TInt aPos,TDes8& aDes,TInt aLength,TRequestStatus& aStatus) const
  1053 /**
  1054 Reads the specified number of bytes of binary data from the file at a specified 
  1055 offset within the file.
  1056 
  1057 This is an asynchronous function.
  1058 
  1059 Note that when an attempt is made to read beyond the end of the file,
  1060 no error is returned. 
  1061 The descriptor's length is set to the number of bytes read into it.
  1062 Therefore, when reading through a file, the end of file has been reached 
  1063 when the descriptor length, as returned by TDesC8::Length(), is zero.
  1064 Assuming aLength is less than the maximum length of the descriptor, the only
  1065 circumstances in which Read() can return fewer bytes than requested is when
  1066 the end of file is reached or if an error has occurred.
  1067 
  1068 @param aPos    Position of first byte to be read. This is an offset from
  1069                the start of the file. If no position is specified, 
  1070                reading begins at the current file position.
  1071                If aPos is beyond the end of the file, the function returns
  1072                a zero length descriptor.
  1073                
  1074 @param aDes    The descriptor into which binary data is read. Any existing
  1075                contents are overwritten. On return, its length is set to
  1076                the number of bytes read.
  1077                NB: this function is asynchronous and the request that it
  1078                represents may not complete until some time after the call
  1079                to the function has returned. It is important, therefore, that
  1080                this descriptor remain valid, or remain in scope, until you have
  1081                been notified that the request is complete.
  1082 
  1083 @param aLength The number of bytes to read from the file into the descriptor. 
  1084                If an attempt is made to read more bytes than the descriptor's
  1085                maximum length, then the function returns KErrOverflow.
  1086                It must not be negative otherwise the function returns KErrArgument.
  1087 
  1088 @param aStatus Request status. On completion contains KErrNone if successful, 
  1089                otherwise one of the other system-wide error codes.
  1090                
  1091 @panic FSCLIENT 19 if aPos is negative.                       
  1092 */
  1093 	{
  1094 	TRACE6(UTF::EBorder, UTraceModuleEfsrv::EFileRead4, MODULEUID, Session().Handle(), SubSessionHandle(), aPos, 0, aLength, &aStatus);
  1095 
  1096 	__ASSERT_ALWAYS(aPos>=0,Panic(EPosNegative));
  1097 	if (aLength==0)
  1098 		{
  1099 		aDes.Zero();
  1100 		TRequestStatus* req=(&aStatus);
  1101 		User::RequestComplete(req,KErrNone);
  1102 		return;
  1103 		}
  1104 	else if(aLength>aDes.MaxLength())
  1105 		{
  1106 		TRequestStatus* req=(&aStatus);
  1107 		User::RequestComplete(req,KErrOverflow);
  1108 		return;
  1109 		}
  1110 		
  1111 	RSubSessionBase::SendReceive(EFsFileRead,TIpcArgs(&aDes,aLength,aPos),aStatus);
  1112 
  1113 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFileRead4Return, MODULEUID);
  1114 	}
  1115 
  1116 
  1117 
  1118 
  1119 EFSRV_EXPORT_C void RFile::ReadCancel(TRequestStatus& aStatus) const
  1120 /**
  1121 Cancels a specific outstanding asynchronous read request.
  1122 
  1123 The outstanding request completes with KErrCancel.
  1124 
  1125 @param aStat The request status object identified with the original
  1126 			 asynchronous read.
  1127 */
  1128 	{
  1129 	if(aStatus != KRequestPending)
  1130 		return;
  1131 	SendReceive(EFsFileReadCancel, TIpcArgs(&aStatus));
  1132 	}
  1133 
  1134 
  1135 
  1136 
  1137 EFSRV_EXPORT_C void RFile::ReadCancel() const
  1138 /**
  1139 Cancels all outstanding asynchronous read requests for this subsession.
  1140 
  1141 All outstanding requests complete with KErrCancel.
  1142 */
  1143 	{
  1144 	SendReceive(EFsFileReadCancel, TIpcArgs(NULL));
  1145 	}
  1146 
  1147 
  1148 
  1149 
  1150 EFSRV_EXPORT_C TInt RFile::Write(const TDesC8& aDes)
  1151 /**
  1152 Writes to the file at the current offset within the file.
  1153 
  1154 This is a synchronous function.
  1155 
  1156 NB Attempting to extend the file to 2 GByte or greater will fail with KErrTooBig
  1157 
  1158 @param aDes The descriptor from which binary data is written.
  1159             The function writes the entire contents of aDes to the file.
  1160 
  1161 @return KErrNone if successful, otherwise one of the other system-wide error 
  1162         codes.
  1163 */
  1164 	{
  1165 	TRACE3(UTF::EBorder, UTraceModuleEfsrv::EFileWrite1, MODULEUID, Session().Handle(), SubSessionHandle(), aDes.Length());
  1166 	TInt r = SendReceive(EFsFileWrite,TIpcArgs(&aDes,aDes.Length(),I64LOW(KCurrentPosition64)));
  1167 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileWrite1Return, MODULEUID, r);
  1168 	return r;
  1169 	}
  1170 
  1171 
  1172 EFSRV_EXPORT_C void RFile::Write(const TDesC8& aDes,TRequestStatus& aStatus)
  1173 /** 
  1174 Writes to the file at the current offset within the file.
  1175 
  1176 This is an asynchronous function.
  1177 
  1178 NB Attempting to extend the file to 2 GByte or greater will fail with KErrTooBig
  1179 
  1180 @param aDes    The descriptor from which binary data is written.
  1181                The function writes the entire contents of aDes to the file.
  1182                NB: this function is asynchronous and the request that it
  1183                represents may not complete until some time after the call
  1184                to the function has returned. It is important, therefore, that
  1185                this descriptor remain valid, or remain in scope, until you have
  1186                been notified that the request is complete.
  1187             
  1188 @param aStatus Request status. On completion contains KErrNone if successful, 
  1189                otherwise one of the other system-wide error codes.
  1190 */
  1191 	{
  1192 	TRACE4(UTF::EBorder, UTraceModuleEfsrv::EFileWrite2, MODULEUID, Session().Handle(), SubSessionHandle(), aDes.Length(), &aStatus);
  1193 
  1194 	RSubSessionBase::SendReceive(EFsFileWrite,TIpcArgs(&aDes,aDes.Length(),I64LOW(KCurrentPosition64)),aStatus);
  1195 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFileWrite2Return, MODULEUID);
  1196 	}
  1197 
  1198 
  1199 
  1200 
  1201 EFSRV_EXPORT_C TInt RFile::Write(const TDesC8& aDes,TInt aLength)
  1202 /**
  1203 Writes a portion of a descriptor to the file at the current offset within
  1204 the file.
  1205 
  1206 This is a synchronous function.
  1207 
  1208 NB Attempting to extend the file to 2 GByte or greater will fail with KErrTooBig
  1209 
  1210 @param aDes    The descriptor from which binary data is written.
  1211 @param aLength The number of bytes to be written from the descriptor.
  1212                This must not be greater than the length of the descriptor.
  1213                It must not be negative.
  1214 
  1215 @return KErrNone if successful; KErrArgument if aLength is negative;
  1216 		otherwise one of the other system-wide error codes.
  1217         
  1218 @panic FSCLIENT 27 in debug mode, if aLength is greater than the length
  1219        of the descriptor aDes.  
  1220 */
  1221 	{
  1222 	TRACE3(UTF::EBorder, UTraceModuleEfsrv::EFileWrite1, MODULEUID, Session().Handle(), SubSessionHandle(), aLength);
  1223 
  1224 	__ASSERT_DEBUG(aDes.Length()>=aLength,Panic(EBadLength));
  1225 	TInt r = SendReceive(EFsFileWrite,TIpcArgs(&aDes,aLength,I64LOW(KCurrentPosition64)));
  1226 
  1227 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileWrite1Return, MODULEUID, r);
  1228 	return r;
  1229 	}
  1230 
  1231 
  1232 
  1233 
  1234 EFSRV_EXPORT_C void RFile::Write(const TDesC8& aDes,TInt aLength,TRequestStatus& aStatus)
  1235 /**
  1236 Writes a portion of a descriptor to the file at the current offset
  1237 within the file.
  1238 
  1239 This is an asynchronous function.
  1240 
  1241 NB Attempting to extend the file to 2 GByte or greater will fail with KErrTooBig
  1242 
  1243 @param aDes    The descriptor from which binary data is written.
  1244                NB: this function is asynchronous and the request that it
  1245                represents may not complete until some time after the call
  1246                to the function has returned. It is important, therefore, that
  1247                this descriptor remain valid, or remain in scope, until you have
  1248                been notified that the request is complete.
  1249 
  1250 @param aLength The number of bytes to be written from the descriptor.
  1251                This must not be greater than the length of the descriptor.
  1252                It must not be negative.
  1253 
  1254 @param aStatus Request status. On completion contains KErrNone if successful; 
  1255 			   KErrArgument if aLength is negative; 
  1256 			   otherwise one of the other system-wide error codes.
  1257 
  1258 */
  1259 	{
  1260 	TRACE4(UTF::EBorder, UTraceModuleEfsrv::EFileWrite2, MODULEUID, Session().Handle(), SubSessionHandle(), aLength, &aStatus);
  1261 		
  1262 	RSubSessionBase::SendReceive(EFsFileWrite,TIpcArgs(&aDes,aLength,I64LOW(KCurrentPosition64)),aStatus);
  1263 
  1264 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFileWrite2Return, MODULEUID);
  1265 	}
  1266 
  1267 
  1268 
  1269 
  1270 
  1271 EFSRV_EXPORT_C TInt RFile::Write(TInt aPos,const TDesC8& aDes)
  1272 /**
  1273 Writes to the file at the specified offset within the file
  1274 
  1275 This is a synchronous function.
  1276 
  1277 NB Attempting to extend the file to 2 GByte or greater will fail with KErrTooBig
  1278 
  1279 @param aPos The offset from the start of the file at which the first
  1280             byte is written. 
  1281             If a position beyond the end of the file is specified, then
  1282             the write operation begins at the end of the file.
  1283             If the position has been locked, then the write fails.
  1284             
  1285 @param aDes The descriptor from which binary data is written. The function writes 
  1286             the entire contents of aDes to the file.
  1287             
  1288 @return KErrNone if successful, otherwise one of the other system-wide error
  1289         codes.
  1290 
  1291 @panic FSCLIENT 19 if aPos is negative.                       
  1292 */
  1293 	{
  1294 	TRACE5(UTF::EBorder, UTraceModuleEfsrv::EFileWrite3, MODULEUID, Session().Handle(), SubSessionHandle(), aPos, 0, aDes.Length());
  1295 
  1296 	__ASSERT_ALWAYS(aPos>=0,Panic(EPosNegative));
  1297 	TInt r = SendReceive(EFsFileWrite,TIpcArgs(&aDes,aDes.Length(),aPos));
  1298 
  1299 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileWrite3Return, MODULEUID, r);
  1300 	return r;
  1301 	}
  1302 
  1303 
  1304 
  1305 
  1306 EFSRV_EXPORT_C void RFile::Write(TInt aPos,const TDesC8& aDes,TRequestStatus& aStatus)
  1307 /**
  1308 Writes to the file at the specified offset within the file
  1309 
  1310 This is an asynchronous function.
  1311 
  1312 NB Attempting to extend the file to 2 GByte or greater will fail with KErrTooBig
  1313 
  1314 @param aPos    The offset from the start of the file at which the first
  1315                byte is written. 
  1316                If a position beyond the end of the file is specified, then
  1317                the write operation begins at the end of the file.
  1318                If the position has been locked, then the write fails.
  1319                
  1320 @param aDes    The descriptor from which binary data is written. The function
  1321                writes the entire contents of aDes to the file.
  1322                NB: this function is asynchronous and the request that it
  1323                represents may not complete until some time after the call
  1324                to the function has returned. It is important, therefore, that
  1325                this descriptor remain valid, or remain in scope, until you have
  1326                been notified that the request is complete.
  1327 
  1328 @param aStatus Request status. On completion contains KErrNone if successful, 
  1329                otherwise one of the other system-wide error codes.
  1330 
  1331 @panic FSCLIENT 19 if aPos is negative.                       
  1332 */
  1333 	{
  1334 	TRACE6(UTF::EBorder, UTraceModuleEfsrv::EFileWrite4, MODULEUID, Session().Handle(), SubSessionHandle(), aPos, 0, aDes.Length(), &aStatus);
  1335 
  1336 	__ASSERT_ALWAYS(aPos>=0,Panic(EPosNegative));
  1337 	RSubSessionBase::SendReceive(EFsFileWrite,TIpcArgs(&aDes,aDes.Length(),aPos),aStatus);
  1338 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFileWrite4Return, MODULEUID);
  1339 	}
  1340 
  1341 
  1342 
  1343 
  1344 EFSRV_EXPORT_C TInt RFile::Write(TInt aPos,const TDesC8& aDes,TInt aLength)
  1345 /**
  1346 Writes the specified number of bytes to the file at the specified offset within the file.
  1347 
  1348 This is a synchronous function.
  1349 
  1350 NB Attempting to extend the file to 2 GByte or greater will fail with KErrTooBig
  1351 
  1352 @param aPos    The offset from the start of the file at which the first
  1353                byte is written. 
  1354                If a position beyond the end of the file is specified, then
  1355                the write operation begins at the end of the file.
  1356                If the position has been locked, then the write fails.
  1357                              
  1358 @param aDes    The descriptor from which binary data is written.
  1359 @param aLength The number of bytes to be written from aDes .
  1360 			   It must not be negative.
  1361 
  1362 @return KErrNone if successful; KErrArgument if aLength is negative;
  1363 		otherwise one of the other system-wide error codes.
  1364         
  1365 @panic FSCLIENT 19 if aPos is negative.                       
  1366 */
  1367 	{
  1368 	TRACE3(UTF::EBorder, UTraceModuleEfsrv::EFileWrite1, MODULEUID, Session().Handle(), SubSessionHandle(), aLength);
  1369 
  1370 	__ASSERT_ALWAYS(aPos>=0,Panic(EPosNegative));
  1371 	TInt r = SendReceive(EFsFileWrite,TIpcArgs(&aDes,aLength,aPos));
  1372 
  1373 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileWrite1Return, MODULEUID, r);
  1374 	return r;
  1375 	}
  1376 
  1377 
  1378 
  1379 
  1380 EFSRV_EXPORT_C void RFile::Write(TInt aPos,const TDesC8& aDes,TInt aLength,TRequestStatus& aStatus)
  1381 /**
  1382 Writes the specified number of bytes to the file at the specified offset within the file.
  1383 
  1384 This is an asynchronous function.
  1385 
  1386 NB Attempting to extend the file to 2 GByte or greater will fail with KErrTooBig
  1387 
  1388 @param aPos    The offset from the start of the file at which the first
  1389                byte is written. 
  1390                If a position beyond the end of the file is specified, then
  1391                the write operation begins at the end of the file.
  1392                If the position has been locked, then the write fails.
  1393               
  1394 @param aDes    The descriptor from which binary data is written.
  1395                NB: this function is asynchronous and the request that it
  1396                represents may not complete until some time after the call
  1397                to the function has returned. It is important, therefore, that
  1398                this descriptor remain valid, or remain in scope, until you have
  1399                been notified that the request is complete.
  1400 
  1401 @param aLength The number of bytes to be written from aDes.
  1402 			   It must not be negative.
  1403 			   
  1404 @param aStatus Request status. On completion contains KErrNone if successful; 
  1405 			   KErrArgument if aLength is negative; 
  1406 			   otherwise one of the other system-wide error codes.
  1407 
  1408 @panic FSCLIENT 19 if aPos is negative.                       
  1409 */
  1410 	{
  1411 	TRACE6(UTF::EBorder, UTraceModuleEfsrv::EFileWrite2, MODULEUID, Session().Handle(), SubSessionHandle(), aPos, 0, aLength, &aStatus);
  1412 
  1413 	__ASSERT_ALWAYS(aPos>=0,Panic(EPosNegative));
  1414 	RSubSessionBase::SendReceive(EFsFileWrite,TIpcArgs(&aDes,aLength,aPos),aStatus);
  1415 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFileWrite2Return, MODULEUID);
  1416 	}
  1417 
  1418 
  1419 
  1420 
  1421 EFSRV_EXPORT_C TInt RFile::Lock(TInt aPos,TInt aLength) const
  1422 /**
  1423 Locks a region within the file as defined by a range of bytes.
  1424 
  1425 This ensures that those bytes are accessible 
  1426 only through the RFile object which claims the lock. To re-allow access by 
  1427 other programs to the locked region, it must either be unlocked or the file 
  1428 closed. Locking can be used to synchronize operations on a file when more 
  1429 than one program has access to the file in EFileShareAny mode.
  1430 
  1431 More than one distinct region of a file can be locked, but an error is returned 
  1432 if more than one lock is placed on the same region. Different RFile objects 
  1433 can lock different parts of the same file as long as the file is opened in 
  1434 EFileShareAny mode. The locked region may extend beyond the end of a file;
  1435 this prevents the file from being extended by other programs.
  1436 
  1437 @param aPos    Position in file from which to lock; this is the  offset from
  1438                the beginning of the file.
  1439 @param aLength Number of bytes to lock.
  1440 
  1441 @return KErrNone if successful; KErrArgument if aPos+aLength>2G-1 boundary;
  1442  		otherwise one of the other system-wide error codes.
  1443 
  1444 @panic FSCLIENT 17 if aLength is not greater than zero,
  1445 @panic FSCLIENT 19 if aPos is negative. 
  1446 
  1447 */
  1448 	{
  1449 	TRACE5(UTF::EBorder, UTraceModuleEfsrv::EFileLock, MODULEUID, Session().Handle(), SubSessionHandle(), aPos, 0, aLength);
  1450 
  1451 	__ASSERT_ALWAYS(aPos>=0,Panic(EPosNegative));
  1452 
  1453 	TInt r = SendReceive(EFsFileLock,TIpcArgs(aPos,aLength));
  1454 
  1455 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileLockReturn, MODULEUID, r);
  1456 	return r;
  1457 	}
  1458 
  1459 
  1460 
  1461 
  1462 EFSRV_EXPORT_C TInt RFile::UnLock(TInt aPos,TInt aLength) const
  1463 /**
  1464 Unlocks a region within the file as defined by a range of bytes.
  1465 
  1466 A lock can only be removed by the RFile object which claimed the lock.
  1467 
  1468 A portion of a locked region cannot be unlocked. The entire locked region 
  1469 must be unlocked otherwise an error is returned. If any byte within
  1470 the specified range of bytes to unlock is not locked, an error is returned.
  1471 
  1472 @param aPos    Position in file from which to unlock; this is the  offset from
  1473                the beginning of the file.
  1474 @param aLength Number of bytes to unlock.
  1475 
  1476 @return KErrNone if successful; KErrArgument if aPos+aLength>2G-1 boundary;
  1477 		otherwise one of the other  system-wide error codes.
  1478         
  1479 @panic FSCLIENT 18 if aLength is not greater than zero,
  1480 @panic FSCLIENT 19 if aPos is negative. 
  1481 */
  1482 	{
  1483 	TRACE5(UTF::EBorder, UTraceModuleEfsrv::EFileUnLock, MODULEUID, Session().Handle(), SubSessionHandle(), aPos, 0, aLength);
  1484 
  1485 	__ASSERT_ALWAYS(aPos>=0,Panic(EPosNegative));
  1486 	TInt r = SendReceive(EFsFileUnLock,TIpcArgs(aPos,aLength));
  1487 
  1488 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileUnLockReturn, MODULEUID, r);
  1489 	return r;
  1490 	}
  1491 
  1492 
  1493 
  1494 
  1495 EFSRV_EXPORT_C TInt RFile::Seek(TSeek aMode,TInt& aPos) const
  1496 /**
  1497 Sets the the current file position.
  1498 
  1499 The function can also be used to get the current file 
  1500 position without changing it. The file position is the position at which
  1501 reading and writing takes place. The start of the file is position zero.
  1502 
  1503 To retrieve the current file position without changing it, specify ESeekCurrent 
  1504 for the seek mode, and zero for the offset.
  1505 
  1506 If the seek mode is ESeekStart, then:
  1507 
  1508 1. the function does not modify the aPos argument,
  1509 
  1510 2. the function returns an error if the offset specified is negative.
  1511 
  1512 If the seek mode is ESeekAddress, an error is returned if:
  1513 
  1514 1. the file is not in ROM, 
  1515 
  1516 2. the offset specified is greater than the size of the file.
  1517 
  1518 @param aMode Seek mode. Controls the destination of the seek operation.
  1519 @param aPos  Offset from location specified in aMode. Can be negative.
  1520              On return contains the new file position.
  1521              If the seek mode is either ESeekCurrent or ESeekEnd and the offset
  1522              specifies a position before the start of the file 
  1523              or beyond the end of the file, then on return, aPos is set to
  1524              the new file position (either the start or the end of the file).
  1525              If the seek mode is ESeekAddress, aPos returns the address of
  1526              the byte at the specified offset within the file.
  1527 
  1528 @return KErrNone if successful, otherwise one of the other system-wide error 
  1529         codes.
  1530 */
  1531 	{
  1532 	TRACE5(UTF::EBorder, UTraceModuleEfsrv::EFileSeek, MODULEUID, Session().Handle(), SubSessionHandle(), aMode, aPos, 0);
  1533 
  1534 	TInt64 newPos = aPos;
  1535 	TPckg<TInt64>  pkNewPos(newPos);
  1536 	TInt r = SendReceive(EFsFileSeek|KIpcArgSlot2Desc,TIpcArgs(aPos,aMode,&pkNewPos));
  1537 	if(KErrNone == r)
  1538 		aPos = I64LOW(newPos);
  1539 
  1540 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileSeekReturn, MODULEUID, r);
  1541 	return r;
  1542 	}
  1543 
  1544 
  1545 
  1546 
  1547 EFSRV_EXPORT_C TInt RFile::Flush()
  1548 /**
  1549 Commits data to the storage device and flushes internal buffers without closing 
  1550 the file.
  1551 
  1552 Although RFile::Close() also flushes internal buffers, it is often useful 
  1553 to call Flush() before a file is closed. This is because Close() returns no 
  1554 error information, so there is no way of telling whether the final data was 
  1555 written to the file successfully or not. Once data has been flushed, Close() 
  1556 is effectively a no-operation.
  1557 
  1558 @return KErrNone if successful, otherwise one of the other system-wide error 
  1559         codes.
  1560 */
  1561 	{
  1562 	TRACE3(UTF::EBorder, UTraceModuleEfsrv::EFileFlush, MODULEUID, Session().Handle(), SubSessionHandle(), NULL);
  1563 
  1564 	TInt r = RSubSessionBase::SendReceive(EFsFileFlush);
  1565 
  1566 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileFlushReturn, MODULEUID, r);
  1567 	return r;
  1568 	}
  1569 
  1570 
  1571 
  1572 
  1573 EFSRV_EXPORT_C void RFile::Flush(TRequestStatus& aStatus)
  1574 /**
  1575 Commits data to the storage device and flushes internal buffers without closing 
  1576 the file.
  1577 
  1578 Although RFile::Close() also flushes internal buffers, it is often useful 
  1579 to call Flush() before a file is closed. This is because Close() returns no 
  1580 error information, so there is no way of telling whether the final data was 
  1581 written to the file successfully or not. Once data has been flushed, Close() 
  1582 is effectively a no-operation.
  1583 
  1584 @param aStatus Request status. On completion contains KErrNone if successful, 
  1585                otherwise one of the other system-wide error codes.
  1586 */
  1587 	{
  1588 	TRACE3(UTF::EBorder, UTraceModuleEfsrv::EFileFlush, MODULEUID, Session().Handle(), SubSessionHandle(), &aStatus);
  1589 
  1590 	RSubSessionBase::SendReceive(EFsFileFlush, aStatus);
  1591 
  1592 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFileFlushReturn, MODULEUID);
  1593 	}
  1594 
  1595 
  1596 
  1597 
  1598 EFSRV_EXPORT_C TInt RFile::Size(TInt& aSize) const
  1599 /**
  1600 Gets the current file size.
  1601 
  1602 @param aSize On return, the size of the file in bytes.
  1603 
  1604 @return KErrNone if successful, otherwise one of the other system-wide error 
  1605         codes.
  1606 */
  1607 	{
  1608 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFileSize, MODULEUID, Session().Handle(), SubSessionHandle());
  1609 
  1610 	TInt64 size = aSize;
  1611 	TPckg<TInt64> pkSize(size);
  1612 	TInt r = SendReceive(EFsFileSize|KIpcArgSlot0Desc,TIpcArgs(&pkSize));
  1613 	if(KErrNone != r)
  1614 		return r;
  1615 	aSize = I64LOW(size);
  1616 #ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
  1617 	if (size > KMaxTInt)
  1618 		return (KErrTooBig);
  1619 #endif
  1620 
  1621 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFileSizeReturn, MODULEUID, r, aSize);
  1622 	return r;
  1623 	}
  1624 
  1625 
  1626 
  1627 
  1628 EFSRV_EXPORT_C TInt RFile::SetSize(TInt aSize)
  1629 /**
  1630 Sets the file size.
  1631 
  1632 If the size of the file is reduced, data may be lost from 
  1633 the end of the file.
  1634 
  1635 Note:
  1636 
  1637 1. The current file position remains unchanged unless SetSize() reduces the size 
  1638    of the file in such a way that the current file position is now beyond
  1639    the end of the file. In this case, the current file position is set to
  1640    the end of file. 
  1641 
  1642 2. If the file was not opened for writing, an error is returned.
  1643 
  1644 @param aSize The new size of the file, in bytes. This value must not be negative, otherwise the function raises a panic.
  1645 
  1646 @return KErrNone if successful, otherwise one of the other system-wide error 
  1647         codes.
  1648 
  1649 @panic FSCLIENT 20 If aSize is negative.
  1650 
  1651 */
  1652 	{
  1653 	TRACE4(UTF::EBorder, UTraceModuleEfsrv::EFileSetSize, MODULEUID, Session().Handle(), SubSessionHandle(), aSize, 0);
  1654 
  1655 	TInt r = SendReceive(EFsFileSetSize,TIpcArgs(aSize));
  1656 
  1657 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileSetSizeReturn, MODULEUID, r);
  1658 	return r;
  1659 	}
  1660 
  1661 
  1662 
  1663 
  1664 EFSRV_EXPORT_C TInt RFile::Att(TUint& aVal) const
  1665 /**
  1666 Gets the file's attributes.
  1667 
  1668 @param aVal A bitmask which, on return, contains the file’s attributes.
  1669             For more information, see KEntryAttNormal and the other
  1670             file/directory attributes.    
  1671 
  1672 @return KErrNone if successful, otherwise one of the other system-wide error 
  1673         codes.
  1674         
  1675 @see KEntryAttNormal        
  1676 */
  1677 	{
  1678 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFileAtt, MODULEUID, Session().Handle(), SubSessionHandle());
  1679 
  1680 	TPtr8 a((TUint8*)&aVal,sizeof(TUint));
  1681 	
  1682 	TInt r = SendReceive(EFsFileAtt,TIpcArgs(&a));
  1683 
  1684 	TRACERET2(UTF::EBorder, UTraceModuleEfsrv::EFileAttReturn, MODULEUID, r, aVal);
  1685 	return r;
  1686 	}
  1687 
  1688 
  1689 
  1690 
  1691 EFSRV_EXPORT_C TInt RFile::SetAtt(TUint aSetAttMask,TUint aClearAttMask)
  1692 /**
  1693 Sets or clears file attributes using two bitmasks.
  1694 
  1695 The first mask controls which attributes are set.
  1696 The second controls which attributes are cleared.
  1697 
  1698 Notes:
  1699 
  1700 1. The file must have been opened for writing, or an error is returned.
  1701 
  1702 2. A panic is raised if any attribute is specified in both bitmasks.
  1703 
  1704 3. An attempt to set or clear the KEntryAttDir, KEntryAttVolume or KEntryAttRemote
  1705    attributes have no effect.
  1706 
  1707 4. The new attribute values take effect when the file is flushed or closed (which 
  1708    implies a flush).
  1709 
  1710 @param aSetAttMask   A bitmask indicating the file attributes to be set
  1711 @param aClearAttMask A bitmask indicating the attributes to be cleared. For 
  1712                      more information see KEntryAttNormal, and the other
  1713                      file/directory attributes.
  1714                      
  1715 @return KErrNone if successful, otherwise one of the other system-wide error 
  1716         codes.
  1717         
  1718 @panic FSCLIENT 21 if the same attribute bit is set in both bitmasks.
  1719 */
  1720 	{
  1721 	TRACE4(UTF::EBorder, UTraceModuleEfsrv::EFileSetAtt, MODULEUID, Session().Handle(), SubSessionHandle(), aSetAttMask, aClearAttMask);
  1722 
  1723 	__ASSERT_ALWAYS((aSetAttMask&aClearAttMask)==0,Panic(EAttributesIllegal));
  1724 
  1725 	TInt r = SendReceive(EFsFileSetAtt,TIpcArgs(aSetAttMask,aClearAttMask));
  1726 
  1727 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileSetAttReturn, MODULEUID, r);
  1728 	return r;
  1729 	}
  1730 
  1731 
  1732 
  1733 
  1734 EFSRV_EXPORT_C TInt RFile::Modified(TTime& aTime) const
  1735 /**
  1736 Gets local date and time the file was last modified, in universal time.
  1737 
  1738 @param aTime On return, contains the date and time the file was last modified in UTC.
  1739 
  1740 @return KErrNone if successful, otherwise one of the other system-wide error 
  1741         codes.
  1742 */
  1743 	{
  1744 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFileModified, MODULEUID, Session().Handle(), SubSessionHandle());
  1745 
  1746 	TPtr8 t((TUint8*)&aTime,sizeof(TTime));
  1747 	TInt r = SendReceive(EFsFileModified,TIpcArgs(&t));
  1748 
  1749 	TRACERET3(UTF::EBorder, UTraceModuleEfsrv::EFileModifiedReturn, MODULEUID, r, I64LOW(aTime.Int64()), I64HIGH(aTime.Int64()));
  1750 	return r;
  1751 	}
  1752 
  1753 
  1754 
  1755 
  1756 EFSRV_EXPORT_C TInt RFile::SetModified(const TTime& aTime)
  1757 /**
  1758 Sets the date and time the file was last modified. UTC date and time should be used.
  1759 
  1760 Notes:
  1761 
  1762 1. The file must have been opened for writing, or an error is returned.
  1763 
  1764 2. The new modified time takes effect when the file is flushed or closed (which 
  1765    implies a flush).
  1766 
  1767 @param aTime The new date and time the file was last modified, in universal time.
  1768 
  1769 @return KErrNone if successful, otherwise one of the other system-wide error 
  1770         codes.
  1771 */
  1772 	{
  1773 	TRACE4(UTF::EBorder, UTraceModuleEfsrv::EFileSetModified, MODULEUID, Session().Handle(), SubSessionHandle(), I64LOW(aTime.Int64()), I64HIGH(aTime.Int64()));
  1774 
  1775 	TPtrC8 t((TUint8*)&aTime,sizeof(TTime));
  1776 	TInt r = SendReceive(EFsFileSetModified,TIpcArgs(&t));
  1777 
  1778 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileSetModifiedReturn, MODULEUID, r);
  1779 	return r;
  1780 	}
  1781 
  1782 
  1783 
  1784 
  1785 EFSRV_EXPORT_C TInt RFile::Set(const TTime& aTime,TUint aMask,TUint aVal)
  1786 /**
  1787 Sets the file’s attributes, and the date and time it was last modified.
  1788 
  1789 It combines the functionality of SetAtt() and SetModified()
  1790 
  1791 An attempt to set or clear the KEntryAttDir, KEntryAttVolume or KEntryAttRemote 
  1792 attributes have no effect. 
  1793 
  1794 @param aTime The new date and time the file was last modified. UTC date and time should be used.
  1795 @param aMask A bitmask indicating the file attributes to be set
  1796 @param aVal  A bitmask indicating the attributes to be cleared. For 
  1797              more information see KEntryAttNormal, and the other
  1798              file/directory attributes.
  1799 
  1800 @return KErrNone if successful, otherwise one of the other system-wide error 
  1801         codes.
  1802         
  1803 @panic FSCLIENT 21 if the same attribute bit is set in both bitmasks.
  1804 
  1805 @see RFile::SetModified
  1806 @see RFile::SetAtt
  1807 */
  1808 	{
  1809 	TRACE6(UTF::EBorder, UTraceModuleEfsrv::EFileSet, MODULEUID, 
  1810 		Session().Handle(), SubSessionHandle(), I64LOW(aTime.Int64()), I64HIGH(aTime.Int64()), aMask, aVal);
  1811 
  1812 	__ASSERT_ALWAYS((aVal&aMask)==0,Panic(EAttributesIllegal));
  1813 	TPtrC8 t((TUint8*)&aTime,sizeof(TTime));
  1814 	TInt r = SendReceive(EFsFileSet,TIpcArgs(&t,aMask,aVal));
  1815 
  1816 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileSetReturn, MODULEUID, r);
  1817 	return r;
  1818 	}
  1819 
  1820 
  1821 
  1822 
  1823 EFSRV_EXPORT_C TInt RFile::ChangeMode(TFileMode aNewMode)
  1824 /**
  1825 Switches an open file's access mode between EFileShareExclusive and EFileShareReadersOnly.
  1826 
  1827 This allows or disallows read-only access without having to close and re-open the file.
  1828 
  1829 @param aNewMode The new access mode.
  1830 
  1831 @return KErrNone, if successful;
  1832         KErrArgument, if aNewMode has any value other than the two specified;
  1833         KErrAccessDenied, if:
  1834         a) the function is called when the current file share
  1835         mode is EFileShareAny;
  1836         b) the file has multiple readers, and an attempt is made
  1837         to change the share mode to EFileShareExclusive; 
  1838         c) the file has been opened for writing in EFileShareExclusive mode, and an 
  1839         attempt is made to change the access mode to EFileShareReadersOnly.
  1840 
  1841 @capability Dependent If the path starts with /Resource then capability DiskAdmin is required
  1842 
  1843 */
  1844 	{
  1845 	TRACE3(UTF::EBorder, UTraceModuleEfsrv::EFileChangeMode, MODULEUID, Session().Handle(), SubSessionHandle(), aNewMode);
  1846 
  1847 	if (aNewMode!=EFileShareExclusive && aNewMode!=EFileShareReadersOnly)
  1848 		return(KErrArgument);
  1849 	TInt r = SendReceive(EFsFileChangeMode,TIpcArgs(aNewMode));
  1850 
  1851 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileChangeModeReturn, MODULEUID, r);
  1852 	return r;
  1853 	}
  1854 
  1855 
  1856 
  1857 
  1858 EFSRV_EXPORT_C TInt RFile::Rename(const TDesC& aNewName)
  1859 /**
  1860 Renames a file.
  1861 
  1862 If aNewName specifies a different directory to the one in which 
  1863 the file is currently located, then the file is moved.
  1864 
  1865 No other process may have access to the file, that is, the file must have 
  1866 been opened in EFileShareExclusive share mode, or an error is returned. The 
  1867 file must have been opened for writing (using EFileWrite access mode). An 
  1868 error is returned if a file with the new filename already exists in the target 
  1869 directory.
  1870 
  1871 The file or directory may not be moved to another device by this means, either 
  1872 explicitly (by another drive specified in the name) or implicitly (because 
  1873 the directory has been mapped to another device with RFs::SetSubst()).
  1874 
  1875 Note that the function builds up the new file specification by using all
  1876 of the path components specified
  1877 in aNewName (directory path, filename and extension), 
  1878 then adding any missing components from the current file specification, and 
  1879 finally adding any missing components from the session path. A consequence 
  1880 of this is that you cannot rename a file to remove its extension. An alternative 
  1881 to this function is RFs::Rename() which renames the file using the new name 
  1882 as provided.
  1883 
  1884 @param aNewName The new file name and/or directory path. No part may contain 
  1885                 wildcard characters or an error is returned.
  1886                 
  1887 @return KErrNone if successful, otherwise one of the other system-wide error 
  1888         codes.
  1889 
  1890 @capability Dependent If aNewName starts with /Sys then capability Tcb is required
  1891 @capability Dependent If aNewName starts with /Resource then capability Tcb is required
  1892 @capability Dependent If aNewName starts with /Private and does not match this process'
  1893 					  SID then AllFiles capability is required.
  1894 
  1895 */
  1896 	{
  1897 	TRACEMULT3(UTF::EBorder, UTraceModuleEfsrv::EFileRename, MODULEUID, Session().Handle(), SubSessionHandle(), aNewName);
  1898 
  1899 	TInt r = SendReceive(EFsFileRename,TIpcArgs(&aNewName));
  1900 
  1901 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileRenameReturn, MODULEUID, r);
  1902 	return r;
  1903 	}
  1904 
  1905 
  1906 
  1907 
  1908 EFSRV_EXPORT_C TInt RFile::Drive(TInt &aDriveNumber, TDriveInfo &aDriveInfo) const
  1909 /**
  1910 Gets information about the drive on which this file resides.
  1911  
  1912 @param aDriveNumber On return, the drive number.
  1913 
  1914 @param aDriveInfo   On return, contains information describing the drive
  1915                     and the medium mounted on it. The value of TDriveInfo::iType
  1916                     shows whether the drive contains media.
  1917 
  1918 @return       KErrNone, if successful, otherwise one of the other
  1919               system-wide error codes
  1920               
  1921 @see RFs::Drive
  1922 */
  1923 	{
  1924 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFileDrive, MODULEUID, Session().Handle(), SubSessionHandle());
  1925 
  1926 	TPckg<TInt> pki(aDriveNumber);
  1927 	TPckg<TDriveInfo> pkdi(aDriveInfo);
  1928 	TInt r = SendReceive(EFsFileDrive,TIpcArgs(&pki,&pkdi));
  1929 
  1930 	TRACERET4(UTF::EBorder, UTraceModuleEfsrv::EFileDriveReturn, MODULEUID, r, aDriveInfo.iDriveAtt, aDriveInfo.iMediaAtt, aDriveInfo.iType);
  1931 	return r;
  1932 	}
  1933 
  1934 
  1935 TInt RFile::Clamp(RFileClamp& aHandle)
  1936 /**
  1937 Instructs the File Server that the file is not to be modified on storage media.
  1938  
  1939 @param aHandle		On return, a handle to the file.
  1940 
  1941 @return				KErrNone, if successful, otherwise one of the other
  1942 					system-wide error codes
  1943               
  1944 @see RFs::Unclamp
  1945 */
  1946 	{
  1947 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFileClamp, MODULEUID, Session().Handle(), SubSessionHandle());
  1948 
  1949 	TPckg<RFileClamp> pkHandle(aHandle);
  1950 	TInt r = SendReceive(EFsFileClamp,TIpcArgs(& pkHandle));
  1951 
  1952 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileClampReturn, MODULEUID, r);
  1953 	return r;
  1954 	}
  1955 
  1956 /**
  1957 Fetches the Block Map of a file. Each file in the file system will consist of
  1958 a number of groups of blocks. Each group represents a number of contiguous blocks.
  1959 Such a group is represented by the TBlockMapEntry class. The full Block Map representing
  1960 the file may be determined by repeatedly calling RFile::BlockMap until KErrCompletion is
  1961 returned.
  1962 
  1963 Note:
  1964 
  1965 1. If the Block Map for the whole file is not required, then a start and end position 
  1966    for a section of the file can be specified. Both of these parameters specify offsets
  1967    from the start of the file in bytes.
  1968 
  1969 @param aInfo		A structure describing a group of block maps.
  1970 
  1971 @param aStartPos	A start position for a desired section of the file.
  1972 
  1973 @param aEndPos		An end position for a desired section of the file. If not passed, then the end of the 
  1974 					file is assumed.
  1975 
  1976 @return				KErrNone until the end of the file or the file section is successfully reached;
  1977 					KErrCompletion if the end of the file is reached;
  1978 					KErrNotSupported if the file system does not support Block Mapping or the media is either removable or not pageable.
  1979 */
  1980 EFSRV_EXPORT_C TInt RFile::BlockMap(SBlockMapInfo& aInfo, TInt64& aStartPos, TInt64 aEndPos, TInt aBlockMapUsage) const
  1981 	{
  1982 	TRACE7(UTF::EBorder, UTraceModuleEfsrv::EFileBlockMap, MODULEUID, 
  1983 		Session().Handle(), SubSessionHandle(), I64LOW(aStartPos), I64HIGH(aEndPos), I64LOW(aEndPos), I64HIGH(aEndPos), aBlockMapUsage);
  1984 
  1985 	SBlockMapArgs args;
  1986 	args.iStartPos = aStartPos;
  1987 	args.iEndPos = aEndPos;
  1988 	TPckg<SBlockMapInfo> pkInfo(aInfo);
  1989 	TPckg<SBlockMapArgs> pkArgs(args);
  1990  	TInt r = SendReceive(EFsBlockMap, TIpcArgs(&pkInfo, &pkArgs, aBlockMapUsage));
  1991 	if(r==KErrNone)
  1992 		aStartPos = args.iStartPos;
  1993 
  1994 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileBlockMapReturn, MODULEUID, r);
  1995 	return r;
  1996 	}
  1997 
  1998 
  1999 #ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
  2000 /**
  2001 Opens an existing file for reading or writing.
  2002 
  2003 If the file does not already exist, an error is returned.
  2004 
  2005 This is equivalent to calling RFile::Open except that this function 
  2006 can open files of size greater than 2GB - 1 also.
  2007 
  2008 Notes:
  2009 
  2010 1. To close the file, use Close()
  2011 
  2012 2. Attempting to open a file with the read-only attribute using the EFileWrite
  2013     access mode results in an error.
  2014 
  2015 3. After a file has been opened, the current write position is set to the start
  2016     of the file.
  2017     If necessary, use RFile64::Seek() to move to a different position within
  2018     the file.
  2019     
  2020 4. It enables big file support to handle files whose size are greater then 2GB-1
  2021 
  2022 @param aFs   The file server session.
  2023 @param aName The name of the file. Any path components (i.e. drive letter
  2024              or directory), which are not specified, are taken from
  2025              the session path.
  2026 @param aMode The mode in which the file is opened. See TFileMode.
  2027 
  2028 @return KErrNone if successful, otherwise one of the other system-wide
  2029         error codes.
  2030     
  2031 @see TFileMode
  2032 @see RFile::Open()
  2033 
  2034 @capability Dependent If the path for aName is /Sys and aMode is neither
  2035                       EFileShareReadersOnly nor EFileRead then Tcb capability is required.
  2036 @capability Dependent If the path for aName is /Sys and aMode is either
  2037                       EFileShareReadersOnly or EFileRead then Allfiles capability is required.
  2038 @capability Dependent If the path for aName begins with /Private and does not match this process'
  2039                       SID then AllFiles capability is required.
  2040 @capability Dependent If the path for aName begins with /Resource and aMode is neither
  2041                        EFileShareReadersOrWriters|EFileRead nor EFileShareReadersOnly 
  2042                        nor EFileRead then Tcb capability is required.
  2043 
  2044 */
  2045 EFSRV_EXPORT_C TInt RFile64::Open(RFs& aFs,const TDesC& aName,TUint aFileMode)
  2046 	{
  2047 	TRACEMULT3(UTF::EBorder, UTraceModuleEfsrv::EFileOpen, MODULEUID, aFs.Handle(), aFileMode, aName);
  2048 	
  2049 	TInt r = CreateSubSession(aFs,EFsFileOpen,TIpcArgs(&aName,aFileMode|EFileBigFile));
  2050 	
  2051 	TRACERET2(UTF::EBorder, UTraceModuleEfsrv::EFileOpenReturn, MODULEUID, r, SubSessionHandle());
  2052 	return r;
  2053 	}
  2054 
  2055 /**
  2056 Creates and opens a new file for writing.
  2057 
  2058 If the file already exists, an error is returned.
  2059 
  2060 If the resulting path does not exist, then the operation cannot proceed and
  2061 the function returns an error code.
  2062 
  2063 This is equivalent to calling RFile::Create except that the file created with 
  2064 this function can grow beyond 2GB - 1 also.
  2065 
  2066 Notes:
  2067 
  2068 1. To close the file, use Close()
  2069 
  2070 2. It automatically sets the file's archive attribute.
  2071 
  2072 3. It enables big file support to handle files whose size are greater then 2GB-1
  2073 
  2074 
  2075 @param aFs   The file server session.
  2076 @param aName The name of the file. Any path components (i.e. drive letter
  2077              or directory), which are not specified, are taken from
  2078              the session path.
  2079 @param aMode The mode in which the file is opened. The access mode is
  2080              automatically set to EFileWrite. See TFileMode.
  2081 
  2082 @return KErrNone if successful, otherwise one of the other system-wide
  2083         error codes.
  2084         
  2085 @see RFile::Create()
  2086 @see TFileMode
  2087 
  2088 @capability Dependent If the path in aName starts with /Sys then capability Tcb is required
  2089 @capability Dependent If the path in aName starts with /Resource then capability Tcb is required
  2090 @capability Dependent If the path in aName starts with /Private and does not match this process'
  2091                       SID then AllFiles capability is required.
  2092 
  2093 */
  2094 EFSRV_EXPORT_C TInt RFile64::Create(RFs& aFs,const TDesC& aName,TUint aFileMode)
  2095 	{
  2096 	TRACEMULT3(UTF::EBorder, UTraceModuleEfsrv::EFileCreate, MODULEUID, aFs.Handle(), aFileMode, aName);
  2097 
  2098 	TInt r = CreateSubSession(aFs,EFsFileCreate,TIpcArgs(&aName,aFileMode|EFileBigFile));
  2099 
  2100 	TRACERET2(UTF::EBorder, UTraceModuleEfsrv::EFileCreateReturn, MODULEUID, r, SubSessionHandle());
  2101 	return r;
  2102 	}
  2103 
  2104 /**
  2105 Opens a file for writing, replacing the content of any existing file of the
  2106 same name if it exists, or creating a new file if it does not exist.
  2107 
  2108 This is equivalent to calling RFile::Replace except that the file created or replaced 
  2109 with this function can grow beyond 2GB - 1 also.
  2110 
  2111 
  2112 If the resulting path exists, then:
  2113 
  2114 - the length of an existing file with the same filename is re-set to zero 
  2115 
  2116 - a new file is created, if no existing file with the same filename can be found.
  2117 
  2118 If the resulting path does not exist, then the operation cannot proceed and
  2119 the function returns an error code.
  2120 
  2121 Notes:
  2122 
  2123 - To close the file, use Close(), defined in the base class RFsBase.
  2124 
  2125 - It automatically sets the file's archive attribute.
  2126 
  2127 - It enables big file support to handle files whose size are greater then 2GB-1
  2128 
  2129 
  2130 @param aFs   The file server session.
  2131 @param aName The name of the file. Any path components (i.e. drive letter
  2132              or directory), which are not specified, are taken from
  2133              the session path.
  2134 @param aMode The mode in which the file is opened. The access mode is
  2135              automatically set to EFileWrite. See TFileMode.
  2136 
  2137 @return KErrNone if successful, otherwise one of the other system-wide
  2138         error codes.
  2139         
  2140 @see TFileMode
  2141 @see RFile::Replace()
  2142 
  2143 @capability Dependent If the path in aName starts with /Sys then capability Tcb is required
  2144 @capability Dependent If the path in aName starts with /Resource then capability Tcb is required
  2145 @capability Dependent If the path in aName starts with /Private and does not match this process'
  2146                       SID then AllFiles capability is required.
  2147 
  2148 */
  2149 EFSRV_EXPORT_C TInt RFile64::Replace(RFs& aFs,const TDesC& aName,TUint aFileMode)
  2150 	{
  2151 	TRACEMULT3(UTF::EBorder, UTraceModuleEfsrv::EFileReplace, MODULEUID, aFs.Handle(), aFileMode, aName);
  2152 
  2153 	TInt r = CreateSubSession(aFs,EFsFileReplace,TIpcArgs(&aName,aFileMode|EFileBigFile));
  2154 
  2155 	TRACERET2(UTF::EBorder, UTraceModuleEfsrv::EFileReplaceReturn, MODULEUID, r, SubSessionHandle());
  2156 	return r;
  2157 	}
  2158 
  2159 
  2160 /**
  2161 Creates and opens a temporary file with a unique name for writing and reading.
  2162 This is equivalent to calling RFile::Temp except that the file created 
  2163 with this function can grow beyond 2GB - 1 also.
  2164 
  2165 
  2166 Notes:
  2167 
  2168 1. To close the file, use Close()
  2169 2. It enables big file support to handle files whose size are greater then 2GB-1
  2170 
  2171 @param aFs   The file server session.
  2172 @param aPath The directory in which the file is created.
  2173 @param aName On return, contains the full path and file name of the file.
  2174              The filename is guaranteed to be unique within the directory
  2175              specified by aPath.
  2176 @param aMode The mode in which the file is opened. The access mode is
  2177              automatically set to EFileWrite. See TFileMode.
  2178 
  2179 @return KErrNone if successful, otherwise one of the other system-wide
  2180         error codes.
  2181         
  2182 @see TFileMode
  2183 @see RFile::Temp()
  2184 
  2185 @capability Dependent If aPath starts with /Sys then capability Tcb is required
  2186 @capability Dependent If aPath starts with /Resource then capability Tcb is required
  2187 @capability Dependent If aPath starts with /Private and does not match this process'
  2188                       SID then AllFiles capability is required.
  2189 */
  2190 EFSRV_EXPORT_C TInt RFile64::Temp(RFs& aFs,const TDesC& aPath,TFileName& aName,TUint aFileMode)
  2191 	{
  2192    	TRACEMULT3(UTF::EBorder, UTraceModuleEfsrv::EFileTemp, MODULEUID, aFs.Handle(), aPath, aFileMode);
  2193 	TInt r = CreateSubSession(aFs,EFsFileTemp,TIpcArgs(&aPath,aFileMode|EFileBigFile,&aName));
  2194 	TRACERETMULT3(UTF::EBorder, UTraceModuleEfsrv::EFileTempReturn, MODULEUID, r, SubSessionHandle(), aName);
  2195 	return r;
  2196 	}
  2197 
  2198 
  2199 /**
  2200 Allows a server to adopt an already open file from a client.
  2201 The client's RFs and RFile or RFile64 handles are contained in message slots within aMsg.
  2202 
  2203 Assumes that the client's RFs and RFile or RFile64 handles have been sent to the server
  2204 using TransferToServer().
  2205 
  2206 This is equivalent to calling RFile::AdoptFromClient
  2207 except that the file adopted can be enlarged to sizes beyond 2GB-1.
  2208 
  2209 Note: 
  2210 If a RFile handle is received from the client then enlarging the file beyond
  2211 2GB-1 might result in inconsistent behaviour by the client, since it(client) would 
  2212 not be able to handle files of size greater than 2GB-1.
  2213 
  2214 If a RFile64 handle is received from the client then enlarging the file beyond
  2215 2GB-1 should not cause any issues since the client would be 
  2216 capable of handling files of size greater than 2GB-1.
  2217 
  2218 This RFile or RFile64 will own it's RFs session so that when the sub-session (RFile or RFile64) 
  2219 is closed so will the RFs session.
  2220 
  2221 @param	aMsg		The message received from the client
  2222 @param	aFsHandleIndex	The index that identifies the message slot 
  2223 					of a file server session (RFs) handle
  2224 @param aFileHandleIndex The index that identifies the message slot 
  2225 					of the sub-session (RFile or RFile64) handle of the already opened file
  2226             
  2227 @return KErrNone if successful, otherwise one of the other system-wide
  2228         error codes.
  2229 */
  2230 EFSRV_EXPORT_C TInt RFile64::AdoptFromClient(const RMessage2& aMsg, TInt aFsHandleIndex, TInt aFileHandleIndex)
  2231 	{
  2232 	TInt fileHandle = NULL;
  2233 
  2234 	TInt r = KErrNone;
  2235 	if (aFileHandleIndex == 0)
  2236 		fileHandle = aMsg.Int0();
  2237 	else if (aFileHandleIndex == 1)
  2238    		fileHandle = aMsg.Int1();
  2239 	else if (aFileHandleIndex == 2)
  2240 		fileHandle = aMsg.Int2();
  2241 	else if (aFileHandleIndex == 3)
  2242 		fileHandle = aMsg.Int3();
  2243 	else
  2244 		r = KErrArgument;
  2245 
  2246 #ifdef SYMBIAN_FTRACE_ENABLE
  2247 	TInt handle = NULL;
  2248 	if (aFsHandleIndex == 0)
  2249 		handle = aMsg.Int0();
  2250 	else if (aFsHandleIndex == 1)
  2251    		handle = aMsg.Int1();
  2252 	else if (aFsHandleIndex == 2)
  2253 		handle = aMsg.Int2();
  2254 	else if (aFsHandleIndex == 3)
  2255 		handle = aMsg.Int3();
  2256 	TRACE4(UTF::EBorder, UTraceModuleEfsrv::EFileAdoptFromClient, MODULEUID, handle, fileHandle, aFsHandleIndex, aFileHandleIndex);
  2257 #endif
  2258 
  2259 	if (r != KErrNone)
  2260 		{
  2261 		TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileAdoptFromClientReturn, MODULEUID, r);
  2262 		return r;
  2263 		}
  2264 
  2265 	// Duplicates the file server (RFs) session handle identified by an 
  2266 	// existing handle contained in the message slot at index aFsHandleIndex
  2267 	RFs fs;
  2268 	r = fs.Open(aMsg, aFsHandleIndex, KFileServerPolicy);
  2269 	if (r != KErrNone)
  2270 		{
  2271 		TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileAdoptFromClientReturn, MODULEUID, r);
  2272 		return r;
  2273 		}
  2274 
  2275 	//return CreateAutoCloseSubSession(fs, EFsFileAdopt, TIpcArgs(fileHandle));
  2276 	// Slot 1: Indicate Large File Supportis required.
  2277 	r = CreateAutoCloseSubSession(fs, EFsFileAdopt, TIpcArgs(fileHandle, KFileAdopt64));
  2278 
  2279 	TRACERET3(UTF::EBorder, UTraceModuleEfsrv::EFileAdoptFromClientReturn, MODULEUID, r, Session().Handle(), SubSessionHandle());
  2280 
  2281 	return r;
  2282 	}
  2283 
  2284 
  2285 /**
  2286 Allows a client to adopt an already open file from a server.
  2287 
  2288 Assumes that the server's RFs and RFile or RFile64 handles have been sent to the 
  2289 client using TransferToClient().
  2290 
  2291 This is equivalent to calling RFile::AdoptFromServer
  2292 except that the file adopted can be enlarged to sizes beyond 2GB-1.
  2293 
  2294 Note: 
  2295 If a RFile handle is received from the server then enlarging the file beyond
  2296 2GB-1 might result in inconsistent behaviour by the server, since it(server) would 
  2297 not be able to handle files of size greater than 2GB-1.
  2298 
  2299 If a RFile64 handle is received from the server then enlarging the file beyond
  2300 2GB-1 should not cause any issues since the server would be capable of 
  2301 handling files of size greater than 2GB-1.
  2302 
  2303 This RFile or RFile64 will own it's RFs session so that when the sub-session (RFile or RFile64) 
  2304 is closed so will the RFs session.
  2305 
  2306 @param aFsHandle The file server session (RFs) handle
  2307 @param aFileHandle The file (RFile or RFile64) handle of the already opened file
  2308             
  2309 @return KErrNone if successful, otherwise one of the other system-wide
  2310         error codes.
  2311 */
  2312 EFSRV_EXPORT_C TInt RFile64::AdoptFromServer(TInt aFsHandle, TInt aFileHandle)
  2313 	{
  2314 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFileAdoptFromServer, MODULEUID, aFsHandle, aFileHandle);
  2315 
  2316 	RFs fs;
  2317 	TInt r = fs.SetReturnedHandle(aFsHandle, KFileServerPolicy);
  2318 	if (r != KErrNone)
  2319 		{
  2320 		TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileAdoptFromServerReturn, MODULEUID, r);
  2321 		return r;
  2322 		}
  2323 
  2324 	//return(CreateAutoCloseSubSession(fs, EFsFileAdopt, TIpcArgs(aFileHandle)));
  2325 	// Slot 1: Indicate Large File Supportis required.
  2326 	r = CreateAutoCloseSubSession(fs, EFsFileAdopt, TIpcArgs(aFileHandle, KFileAdopt64));
  2327 
  2328 	TRACERET3(UTF::EBorder, UTraceModuleEfsrv::EFileAdoptFromServerReturn, MODULEUID, r, Session().Handle(), SubSessionHandle());
  2329 
  2330 	return r;
  2331 	}
  2332 
  2333 
  2334 /**
  2335 Allows a server to adopt an already open file from a client process.
  2336 The client's file-server (RFs) and file (RFile or RFile64) handles are contained in 
  2337 this process's environment data slots.
  2338 
  2339 Assumes that the client's RFs and RFile or RFile64 handles have been sent to the server process
  2340 using TransferToProcess().
  2341 
  2342 This is equivalent to calling RFile::AdoptFromCreator
  2343 except that the file adopted can be enlarged to sizes beyond 2GB-1.
  2344 
  2345 Note: 
  2346 If a RFile handle is received from the client then enlarging the file beyond
  2347 2GB-1 might result in inconsistent behaviour by the client, since it(client) would 
  2348 not be able to handle files of size greater than 2GB-1.
  2349 
  2350 If a RFile64 handle is received from the client then enlarging the file beyond
  2351 2GB-1 should not cause any issues since the client would be capable of 
  2352 handling files of size greater than 2GB-1.
  2353 
  2354 This RFile or RFile64 will own it's RFs session so that when the sub-session (RFile or RFile64) 
  2355 is closed so will the RFs session.
  2356 
  2357 @param	aFsHandleIndex	An index that identifies the slot in the process
  2358 					environment data that contains the file server session (RFs) handle
  2359 @param	aFileHandleIndex	An index that identifies the slot in the process
  2360 					environment data that contains the sub-session (RFile or RFile64) handle 
  2361 					of the already opened file
  2362             
  2363 @return KErrNone if successful, otherwise one of the other system-wide
  2364         error codes.
  2365 */
  2366 EFSRV_EXPORT_C TInt RFile64::AdoptFromCreator(TInt aFsHandleIndex, TInt aFileHandleIndex)
  2367 	{
  2368 	TInt fileHandle;
  2369 	TInt r = User::GetTIntParameter(aFileHandleIndex,  fileHandle);
  2370 
  2371 	TRACE3(UTF::EBorder, UTraceModuleEfsrv::EFileAdoptFromCreator, MODULEUID, fileHandle, aFsHandleIndex, aFileHandleIndex);
  2372 
  2373 	if (r != KErrNone)
  2374 		{
  2375 		TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileAdoptFromCreatorReturn, MODULEUID, r);
  2376 		return r;
  2377 		}
  2378 
  2379 
  2380 	// Duplicates the file server (RFs) session handle identified by an 
  2381 	// existing handle contained in the environment slot at index aFsHandleIndex
  2382 	RFs fs;
  2383 	r = fs.Open(aFsHandleIndex, KFileServerPolicy);
  2384 	if (r != KErrNone)
  2385 		{
  2386 		TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileAdoptFromCreatorReturn, MODULEUID, r);
  2387 		return r;
  2388 		}
  2389 
  2390 	//return(CreateAutoCloseSubSession(fs, EFsFileAdopt, TIpcArgs(fileHandle)));
  2391 	// Slot 1: Indicate Large File Supportis required.
  2392 	r = CreateAutoCloseSubSession(fs, EFsFileAdopt, TIpcArgs(fileHandle, KFileAdopt64));
  2393 
  2394 	TRACERET3(UTF::EBorder, UTraceModuleEfsrv::EFileAdoptFromCreatorReturn, MODULEUID, r, Session().Handle(), SubSessionHandle());
  2395 
  2396 	return r;
  2397 	}
  2398 
  2399 
  2400 /**
  2401 Reads from the file at the specified offset within the file
  2402 
  2403 This is a synchronous function.
  2404 
  2405 This is equivalent to calling RFile::Read(TInt, TDes8&) except that this function
  2406 accepts TInt64, instead of TInt, as its first parameter. This allows to specify 
  2407 the read position beyond 2GB-1.
  2408 
  2409 @see RFile::Read(TInt aPos, TDes8& aDes)
  2410 
  2411 Note that when an attempt is made to read beyond the end of the file,
  2412 no error is returned. 
  2413 The descriptor's length is set to the number of bytes read into it.
  2414 Therefore, when reading through a file, the end of file has been reached 
  2415 when the descriptor length, as returned by TDesC8::Length(), is zero.
  2416 
  2417 @param aPos Position of first byte to be read.  This is an offset from
  2418             the start of the file. If no position is specified, reading
  2419             begins at the current file position. 
  2420             If aPos is beyond the end of the file, the function returns
  2421             a zero length descriptor.
  2422             
  2423 @param aDes The descriptor into which binary data is read. Any existing content
  2424             is overwritten. On return, its length is set to the number of
  2425             bytes read.
  2426             
  2427 @return KErrNone if successful, otherwise one of the other system-wide error 
  2428         codes.
  2429 
  2430 @panic FSCLIENT 19 if aPos is negative.        
  2431 */
  2432 EFSRV_EXPORT_C TInt RFile64::Read(TInt64 aPos, TDes8& aDes) const
  2433 	{
  2434 	TRACE5(UTF::EBorder, UTraceModuleEfsrv::EFileRead3, MODULEUID, Session().Handle(), SubSessionHandle(), I64LOW(aPos), I64HIGH(aPos), aDes.MaxLength());
  2435 
  2436 	__ASSERT_ALWAYS(aPos>=0,Panic(EPosNegative));
  2437 
  2438 	TInt r;
  2439 	if (!(I64HIGH(aPos+1)))
  2440 		{
  2441 		r = SendReceive(EFsFileRead,TIpcArgs(&aDes,aDes.MaxLength(),I64LOW(aPos)));
  2442 		}
  2443 	else
  2444 		{
  2445 		TPckgC<TInt64> pkPos(aPos);
  2446  		r = SendReceive(EFsFileRead|KIpcArgSlot2Desc,TIpcArgs(&aDes,aDes.MaxLength(),&pkPos));
  2447 		}
  2448 
  2449 	TRACERET2(UTF::EBorder, UTraceModuleEfsrv::EFileRead3Return, MODULEUID, r, aDes.Length());
  2450 
  2451 	return r;
  2452 	}
  2453 
  2454 
  2455 /**
  2456 Reads from the file at the specified offset within the file.
  2457 
  2458 This is an asynchronous function.
  2459 
  2460 This is equivalent to calling RFile::Read(TInt, TDes8&, TRequestStatus&) except 
  2461 that this function accepts TInt64, instead of TInt, as its first parameter. 
  2462 This allows to specify the read position beyond 2GB-1.
  2463 
  2464 @see RFile::Read(TInt aPos, TDes8& aDes, TRequestStatus& aStatus)
  2465 
  2466 Note that when an attempt is made to read beyond the end of the file,
  2467 no error is returned. 
  2468 The descriptor's length is set to the number of bytes read into it.
  2469 Therefore, when reading through a file, the end of file has been reached 
  2470 when the descriptor length, as returned by TDesC8::Length(), is zero.
  2471 
  2472 @param aPos    Position of first byte to be read. This is an offset from
  2473                the start of the file. If no position is specified, 
  2474                reading begins at the current file position.
  2475                If aPos is beyond the end of the file, the function returns
  2476                a zero length descriptor.
  2477                
  2478 @param aDes    The descriptor into which binary data is read. Any existing
  2479                content is overwritten. On return, its length is set to
  2480                the number of bytes read.
  2481                NB: this function is asynchronous and the request that it
  2482                represents may not complete until some time after the call
  2483                to the function has returned. It is important, therefore, that
  2484                this descriptor remain valid, or remain in scope, until you have
  2485                been notified that the request is complete.
  2486                
  2487 @param aStatus The request status. On completion, contains an error code of KErrNone 
  2488                if successful, otherwise one of the other system-wide error codes.
  2489 
  2490 @panic FSCLIENT 19 if aPos is negative.        
  2491 */
  2492 EFSRV_EXPORT_C void RFile64::Read(TInt64 aPos, TDes8& aDes, TRequestStatus& aStatus) const
  2493 	{
  2494 	TRACE6(UTF::EBorder, UTraceModuleEfsrv::EFileRead4, MODULEUID, Session().Handle(), SubSessionHandle(), I64LOW(aPos), I64HIGH(aPos), aDes.MaxLength(), &aStatus);
  2495 
  2496 	__ASSERT_ALWAYS(aPos>=0,Panic(EPosNegative));
  2497 	if (!(I64HIGH(aPos+1)))
  2498 		{
  2499 		RSubSessionBase::SendReceive(EFsFileRead,TIpcArgs(&aDes,aDes.MaxLength(),I64LOW(aPos)),aStatus);
  2500 		}
  2501 	else
  2502 		{
  2503 		TPckgC<TInt64> pkPos(aPos);
  2504 		RSubSessionBase::SendReceive(EFsFileRead|KIpcArgSlot2Desc,TIpcArgs(&aDes,aDes.MaxLength(),&pkPos),aStatus);
  2505 		}
  2506 
  2507 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFileRead4Return, MODULEUID);
  2508 	}
  2509 
  2510 
  2511 /**
  2512 Reads the specified number of bytes of binary data from the file at a specified 
  2513 offset within the file.
  2514 
  2515 This is a synchronous function.
  2516 
  2517 This is equivalent to calling RFile::Read(TInt, TDes8&, TInt) except 
  2518 that this function accepts TInt64, instead of TInt, as its first parameter. 
  2519 This allows to specify the read position beyond 2GB-1.
  2520 
  2521 @see RFile::Read(TInt aPos, TDes8& aDes, TInt aLength)
  2522 
  2523 Note that when an attempt is made to read beyond the end of the file,
  2524 no error is returned. 
  2525 The descriptor's length is set to the number of bytes read into it.
  2526 Therefore, when reading through a file, the end of file has been reached 
  2527 when the descriptor length, as returned by TDesC8::Length(), is zero.
  2528 Assuming aLength is less than the maximum length of the descriptor, the only
  2529 circumstances in which Read() can return fewer bytes than requested is when
  2530 the end of file is reached or if an error has occurred.
  2531 
  2532 @param aPos    Position of first byte to be read. This is an offset from
  2533                the start of the file. If no position is specified, 
  2534                reading begins at the current file position.
  2535                If aPos is beyond the end of the file, the function returns
  2536                a zero length descriptor.
  2537                
  2538 @param aDes    The descriptor into which binary data is read. Any existing
  2539                contents are overwritten. On return, its length is set to
  2540                the number of bytes read.
  2541 @param aLength The number of bytes to read from the file into the descriptor. 
  2542                If an attempt is made to read more bytes than the descriptor's
  2543                maximum length, then the function updates aStatus parameter with KErrOverflow.
  2544                It must not be negative otherwise the function updates aStatus with KErrArgument.
  2545                
  2546 @return KErrNone if successful, otherwise one of the other system-wide
  2547         error codes.
  2548 
  2549 @panic FSCLIENT 19 if aPos is negative.        
  2550 */    	
  2551 EFSRV_EXPORT_C TInt RFile64::Read(TInt64 aPos, TDes8& aDes, TInt aLength) const
  2552 	{
  2553 	TRACE5(UTF::EBorder, UTraceModuleEfsrv::EFileRead3, MODULEUID, Session().Handle(), SubSessionHandle(), I64LOW(aPos), I64HIGH(aPos), aLength);
  2554 
  2555 	__ASSERT_ALWAYS(aPos>=0,Panic(EPosNegative));
  2556 	if (aLength==0)
  2557 		{
  2558 		aDes.Zero();
  2559 		return(KErrNone);
  2560 		}
  2561 	else if(aLength>aDes.MaxLength())
  2562 		{
  2563 		return(KErrOverflow);
  2564 		}
  2565 
  2566 	TInt r;
  2567 	if (!(I64HIGH(aPos+1)))
  2568 		{
  2569 		r = SendReceive(EFsFileRead,TIpcArgs(&aDes,aLength,I64LOW(aPos)));
  2570 		}
  2571 	else
  2572 		{
  2573 		TPckgC<TInt64> pkPos(aPos);
  2574 		r = SendReceive(EFsFileRead|KIpcArgSlot2Desc,TIpcArgs(&aDes,aLength,&pkPos));
  2575 		}
  2576 
  2577 	TRACERET2(UTF::EBorder, UTraceModuleEfsrv::EFileRead3Return, MODULEUID, r, aDes.Length());
  2578 
  2579 	return r;
  2580 	}
  2581 
  2582 
  2583 /**
  2584 Reads the specified number of bytes of binary data from the file at a specified 
  2585 offset within the file.
  2586 
  2587 This is an asynchronous function.
  2588 
  2589 This is equivalent to calling RFile::Read(TInt, TDes8&, TInt, TRequestStatus&) except 
  2590 that this function accepts TInt64, instead of TInt, as its first parameter. 
  2591 This allows to specify the read position beyond 2GB-1.
  2592 
  2593 @see RFile::Read(TInt aPos, TDes8& aDes,TInt aLength,TRequestStatus& aStatus)
  2594 
  2595 Note that when an attempt is made to read beyond the end of the file,
  2596 no error is returned. 
  2597 The descriptor's length is set to the number of bytes read into it.
  2598 Therefore, when reading through a file, the end of file has been reached 
  2599 when the descriptor length, as returned by TDesC8::Length(), is zero.
  2600 Assuming aLength is less than the maximum length of the descriptor, the only
  2601 circumstances in which Read() can return fewer bytes than requested is when
  2602 the end of file is reached or if an error has occurred.
  2603 
  2604 @param aPos    Position of first byte to be read. This is an offset from
  2605                the start of the file. If no position is specified, 
  2606                reading begins at the current file position.
  2607                If aPos is beyond the end of the file, the function returns
  2608                a zero length descriptor.
  2609                
  2610 @param aDes    The descriptor into which binary data is read. Any existing
  2611                contents are overwritten. On return, its length is set to
  2612                the number of bytes read.
  2613                NB: this function is asynchronous and the request that it
  2614                represents may not complete until some time after the call
  2615                to the function has returned. It is important, therefore, that
  2616                this descriptor remain valid, or remain in scope, until you have
  2617                been notified that the request is complete.
  2618 
  2619 @param aLength The number of bytes to read from the file into the descriptor. 
  2620                If an attempt is made to read more bytes than the descriptor's
  2621                maximum length, then the function returns KErrOverflow.
  2622                It must not be negative otherwise the function returns KErrArgument.
  2623 
  2624 @param aStatus Request status. On completion contains KErrNone if successful, 
  2625                otherwise one of the other system-wide error codes.
  2626                
  2627 @panic FSCLIENT 19 if aPos is negative.                       
  2628 */
  2629 EFSRV_EXPORT_C void RFile64::Read(TInt64 aPos, TDes8& aDes, TInt aLength,TRequestStatus& aStatus) const
  2630 	{
  2631 	TRACE6(UTF::EBorder, UTraceModuleEfsrv::EFileRead4, MODULEUID, Session().Handle(), SubSessionHandle(), I64LOW(aPos), I64HIGH(aPos), aLength, &aStatus);
  2632 
  2633 	__ASSERT_ALWAYS(aPos>=0,Panic(EPosNegative));
  2634 	if (aLength==0)
  2635 		{
  2636 		aDes.Zero();
  2637 		TRequestStatus* req=(&aStatus);
  2638 		User::RequestComplete(req,KErrNone);
  2639 		return;
  2640 		}
  2641 	else if(aLength>aDes.MaxLength())
  2642 		{
  2643 		TRequestStatus* req=(&aStatus);
  2644 		User::RequestComplete(req,KErrOverflow);
  2645 		return;
  2646 		}
  2647 	
  2648 	if (!(I64HIGH(aPos+1)))
  2649 		{
  2650 		RSubSessionBase::SendReceive(EFsFileRead,TIpcArgs(&aDes,aLength,I64LOW(aPos)),aStatus);
  2651 		}
  2652 	else
  2653 		{
  2654 		TPckgC<TInt64> pkPos(aPos);
  2655 		RSubSessionBase::SendReceive(EFsFileRead|KIpcArgSlot2Desc,TIpcArgs(&aDes,aLength,&pkPos),aStatus);
  2656 		}
  2657 
  2658 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFileRead4Return, MODULEUID);
  2659 	}
  2660 
  2661 
  2662 /**
  2663 Writes to the file at the specified offset within the file
  2664 
  2665 This is a synchronous function.
  2666 
  2667 This is equivalent to calling RFile::Write(TInt, TDes8&) except 
  2668 that this function accepts TInt64, instead of TInt, as its first parameter. 
  2669 This allows to specify the write position beyond 2GB-1.
  2670 
  2671 @see RFile::Write(TInt aPos, TDes8& aDes)
  2672 
  2673 
  2674 @param aPos The offset from the start of the file at which the first
  2675             byte is written. 
  2676             If a position beyond the end of the file is specified, then
  2677             the write operation begins at the end of the file.
  2678             If the position has been locked, then the write fails.
  2679             
  2680 @param aDes The descriptor from which binary data is written. The function writes 
  2681             the entire contents of aDes to the file.
  2682             
  2683 @return KErrNone if successful, otherwise one of the other system-wide error
  2684         codes.
  2685 
  2686 @panic FSCLIENT 19 if aPos is negative.                       
  2687 */
  2688 EFSRV_EXPORT_C TInt RFile64::Write(TInt64 aPos, const TDesC8& aDes)
  2689 	{
  2690 	TRACE5(UTF::EBorder, UTraceModuleEfsrv::EFileWrite3, MODULEUID, Session().Handle(), SubSessionHandle(), I64LOW(aPos), I64HIGH(aPos), aDes.Length());
  2691 
  2692 	__ASSERT_ALWAYS(aPos>=0,Panic(EPosNegative));
  2693 
  2694 	TInt r;
  2695 	if (!(I64HIGH(aPos+1)))
  2696 		{
  2697 		r = SendReceive(EFsFileWrite,TIpcArgs(&aDes,aDes.Length(),I64LOW(aPos)));
  2698 		}
  2699 	else
  2700 		{
  2701 		TPckgC<TInt64> pkPos(aPos);
  2702 		r = SendReceive(EFsFileWrite|KIpcArgSlot2Desc,TIpcArgs(&aDes,aDes.Length(),&pkPos));
  2703 		}
  2704 
  2705 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileWrite3Return, MODULEUID, r);
  2706 	return r;
  2707 	}
  2708 
  2709 
  2710 /**
  2711 Writes to the file at the specified offset within the file
  2712 
  2713 This is an asynchronous function.
  2714 
  2715 This is equivalent to calling RFile::Write(TInt, TDes8&, TRequestStatus&) except 
  2716 that this function accepts TInt64, instead of TInt, as its first parameter. 
  2717 This allows to specify the write position beyond 2GB-1.
  2718 
  2719 @see RFile::Write(TInt aPos, TDes8& aDes, TRequestStatus& aStatus)
  2720 
  2721 
  2722 @param aPos    The offset from the start of the file at which the first
  2723                byte is written. 
  2724                If a position beyond the end of the file is specified, then
  2725                the write operation begins at the end of the file.
  2726                If the position has been locked, then the write fails.
  2727                
  2728 @param aDes    The descriptor from which binary data is written. The function
  2729                writes the entire contents of aDes to the file.
  2730                NB: this function is asynchronous and the request that it
  2731                represents may not complete until some time after the call
  2732                to the function has returned. It is important, therefore, that
  2733                this descriptor remain valid, or remain in scope, until you have
  2734                been notified that the request is complete.
  2735 
  2736 @param aStatus Request status. On completion contains KErrNone if successful, 
  2737                otherwise one of the other system-wide error codes.
  2738 
  2739 @panic FSCLIENT 19 if aPos is negative.                       
  2740 */
  2741 EFSRV_EXPORT_C void RFile64::Write(TInt64 aPos, const TDesC8& aDes,TRequestStatus& aStatus)
  2742 	{
  2743 	TRACE4(UTF::EBorder, UTraceModuleEfsrv::EFileWrite4, MODULEUID, Session().Handle(), SubSessionHandle(), aDes.Length(), &aStatus);
  2744 
  2745 	__ASSERT_ALWAYS(aPos>=0,Panic(EPosNegative));
  2746 	
  2747 	if (!(I64HIGH(aPos+1)))
  2748 		{
  2749 		RSubSessionBase::SendReceive(EFsFileWrite,TIpcArgs(&aDes,aDes.Length(),I64LOW(aPos)),aStatus);
  2750 		}
  2751 	else
  2752 		{
  2753 		TPckgC<TInt64> pkPos(aPos);
  2754 		RSubSessionBase::SendReceive(EFsFileWrite|KIpcArgSlot2Desc,TIpcArgs(&aDes,aDes.Length(),&pkPos),aStatus);
  2755 		}
  2756 
  2757 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFileWrite4Return, MODULEUID);
  2758 	}
  2759 
  2760 
  2761 /**
  2762 Writes the specified number of bytes to the file at the specified offset within the file.
  2763 
  2764 This is a synchronous function.
  2765 
  2766 This is equivalent to calling RFile::Write(TInt, TDes8&, TInt) except 
  2767 that this function accepts TInt64, instead of TInt, as its first parameter. 
  2768 This allows to specify the write position beyond 2GB-1.
  2769 
  2770 @see RFile::Write(TInt aPos, TDes8& aDes, TInt aLength)
  2771 
  2772 @param aPos    The offset from the start of the file at which the first
  2773                byte is written. 
  2774                If a position beyond the end of the file is specified, then
  2775                the write operation begins at the end of the file.
  2776                If the position has been locked, then the write fails.
  2777                              
  2778 @param aDes    The descriptor from which binary data is written.
  2779 @param aLength The number of bytes to be written from aDes .
  2780                It must not be negative.
  2781 
  2782 @return KErrNone if successful; KErrArgument if aLength is negative;
  2783         otherwise one of the other system-wide error codes.
  2784         
  2785 @panic FSCLIENT 19 if aPos is negative.                       
  2786 */
  2787 EFSRV_EXPORT_C TInt RFile64::Write(TInt64 aPos, const TDesC8& aDes,TInt aLength)
  2788 	{
  2789 	TRACE3(UTF::EBorder, UTraceModuleEfsrv::EFileWrite1, MODULEUID, Session().Handle(), SubSessionHandle(), aLength);
  2790 
  2791 	__ASSERT_ALWAYS(aPos>=0,Panic(EPosNegative));
  2792 	
  2793 	TInt r;
  2794 	if (!(I64HIGH(aPos+1)))
  2795 		{
  2796 		r = SendReceive(EFsFileWrite,TIpcArgs(&aDes,aLength,I64LOW(aPos)));
  2797 		}
  2798 	else
  2799 		{
  2800 		TPckgC<TInt64> pkPos(aPos);
  2801 		r = SendReceive(EFsFileWrite|KIpcArgSlot2Desc,TIpcArgs(&aDes,aLength,&pkPos));
  2802 		}
  2803 
  2804 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileWrite1Return, MODULEUID, r);
  2805 	return r;
  2806 	}
  2807 
  2808 
  2809 /**
  2810 Writes the specified number of bytes to the file at the specified offset within the file.
  2811 
  2812 This is an asynchronous function.
  2813 
  2814 This is equivalent to calling RFile::Write(TInt, TDes8&, TInt, TRequestStatus&) except 
  2815 that this function accepts TInt64, instead of TInt, as its first parameter. 
  2816 This allows to specify the write position beyond 2GB-1.
  2817 
  2818 @see RFile::Write(TInt aPos, TDes8& aDes, TInt aLength, TRequestStatus &aStatus)
  2819 
  2820 @param aPos    The offset from the start of the file at which the first
  2821                byte is written. 
  2822                If a position beyond the end of the file is specified, then
  2823                the write operation begins at the end of the file.
  2824                If the position has been locked, then the write fails.
  2825               
  2826 @param aDes    The descriptor from which binary data is written.
  2827                NB: this function is asynchronous and the request that it
  2828                represents may not complete until some time after the call
  2829                to the function has returned. It is important, therefore, that
  2830                this descriptor remain valid, or remain in scope, until you have
  2831                been notified that the request is complete.
  2832 
  2833 @param aLength The number of bytes to be written from aDes.
  2834                It must not be negative.
  2835                
  2836 @param aStatus Request status. On completion contains KErrNone if successful; 
  2837                KErrArgument if aLength is negative; 
  2838                otherwise one of the other system-wide error codes.
  2839 
  2840 @panic FSCLIENT 19 if aPos is negative.                       
  2841 */
  2842 EFSRV_EXPORT_C void RFile64::Write(TInt64 aPos, const TDesC8& aDes,TInt aLength,TRequestStatus& aStatus)
  2843 	{
  2844 	TRACE6(UTF::EBorder, UTraceModuleEfsrv::EFileWrite2, MODULEUID, Session().Handle(), SubSessionHandle(), I64LOW(aPos), I64HIGH(aPos), aLength, &aStatus);
  2845 
  2846 	__ASSERT_ALWAYS(aPos>=0,Panic(EPosNegative));
  2847 	
  2848 	if (!(I64HIGH(aPos+1)))
  2849 		{
  2850 		RSubSessionBase::SendReceive(EFsFileWrite,TIpcArgs(&aDes,aLength,I64LOW(aPos)),aStatus);
  2851 		}
  2852 	else
  2853 		{
  2854 		TPckgC<TInt64> pkPos(aPos);
  2855 		RSubSessionBase::SendReceive(EFsFileWrite|KIpcArgSlot2Desc,TIpcArgs(&aDes,aLength,&pkPos),aStatus);
  2856 		}
  2857 
  2858 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFileWrite2Return, MODULEUID);
  2859 	}
  2860 
  2861 
  2862 /**
  2863 Sets the the current file position.
  2864 
  2865 The function can also be used to get the current file 
  2866 position without changing it. The file position is the position at which
  2867 reading and writing takes place. The start of the file is position zero.
  2868 
  2869 To retrieve the current file position without changing it, specify ESeekCurrent 
  2870 for the seek mode, and zero for the offset.
  2871 
  2872 This is equivalent to calling RFile::Seek except that this function accepts
  2873 a reference to TInt64, instead of TInt, as its second parameter. 
  2874 This allows to seek to positions beyond 2GB-1.
  2875 
  2876 @see RFile::Seek()
  2877 
  2878 If the seek mode is ESeekStart, then:
  2879 
  2880 1. the function does not modify the aPos argument,
  2881 
  2882 2. the function returns an error if the offset specified is negative.
  2883 
  2884 If the seek mode is ESeekAddress, an error is returned if:
  2885 
  2886 1. the file is not in ROM, 
  2887 
  2888 2. the offset specified is greater than the size of the file.
  2889 
  2890 @param aMode Seek mode. Controls the destination of the seek operation.
  2891 @param aPos  Offset from location specified in aMode. Can be negative.
  2892              On return contains the new file position.
  2893              If the seek mode is either ESeekCurrent or ESeekEnd and the offset
  2894              specifies a position before the start of the file 
  2895              or beyond the end of the file, then on return, aPos is set to
  2896              the new file position (either the start or the end of the file).
  2897              If the seek mode is ESeekAddress, aPos returns the address of
  2898              the byte at the specified offset within the file.
  2899 
  2900 @return KErrNone if successful, otherwise one of the other system-wide error 
  2901         codes.
  2902 */
  2903 EFSRV_EXPORT_C TInt RFile64::Seek(TSeek aMode, TInt64& aPos) const
  2904 	{
  2905 	TRACE5(UTF::EBorder, UTraceModuleEfsrv::EFileSeek, MODULEUID, Session().Handle(), SubSessionHandle(), aMode, aPos, 0);
  2906 
  2907 	TPckgC<TInt64> pkOffset(aPos);
  2908 	TPckg<TInt64> pkNewPos(aPos);
  2909  	TInt r = SendReceive(EFsFileSeek|KIpcArgSlot0Desc|KIpcArgSlot2Desc,TIpcArgs(&pkOffset,aMode,&pkNewPos));
  2910 
  2911 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileSeekReturn, MODULEUID, r);
  2912 	return r;
  2913 	}
  2914 
  2915 
  2916 /**
  2917 Gets the current file size.
  2918 
  2919 This is equivalent to calling RFile::Size except that this function accepts
  2920 a reference to TInt64, instead of TInt, as its first parameter. 
  2921 This allows to query file sizes, which are greater than 2GB-1
  2922 
  2923 @see RFile::Size()
  2924 
  2925 
  2926 @param aSize On return, the size of the file in bytes.
  2927 
  2928 @return KErrNone if successful, otherwise one of the other system-wide error 
  2929         codes.
  2930 */
  2931 EFSRV_EXPORT_C TInt RFile64::Size(TInt64& aSize) const
  2932 	{
  2933 	TRACE2(UTF::EBorder, UTraceModuleEfsrv::EFileSize2, MODULEUID, Session().Handle(), SubSessionHandle());
  2934 
  2935 	TPckg<TInt64> pkSize(aSize);
  2936 	TInt r = SendReceive(EFsFileSize|KIpcArgSlot0Desc,TIpcArgs(&pkSize));
  2937 
  2938 	TRACERET3(UTF::EBorder, UTraceModuleEfsrv::EFileSize2Return, MODULEUID, r, I64LOW(aSize), I64HIGH(aSize));
  2939 	return r;
  2940 	}
  2941 
  2942 
  2943 /**
  2944 Sets the file size.
  2945 
  2946 If the size of the file is reduced, data may be lost from 
  2947 the end of the file.
  2948 
  2949 This is equivalent to calling RFile::SetSize except that this function accepts
  2950 a reference to TInt64, instead of TInt, as its first parameter. 
  2951 This allows to set file sizes to greater than 2GB-1
  2952 
  2953 @see RFile::SetSize()
  2954 
  2955 
  2956 Note:
  2957 
  2958 1. The current file position remains unchanged unless SetSize() reduces the size 
  2959    of the file in such a way that the current file position is now beyond
  2960    the end of the file. In this case, the current file position is set to
  2961    the end of file. 
  2962 
  2963 2. If the file was not opened for writing, an error is returned.
  2964 
  2965 @param aSize The new size of the file, in bytes. This value must not be negative, otherwise the function raises a panic.
  2966 
  2967 @return KErrNone if successful, otherwise one of the other system-wide error 
  2968         codes.
  2969 
  2970 @panic FSCLIENT 20 If aSize is negative.
  2971 */
  2972 EFSRV_EXPORT_C TInt RFile64::SetSize(TInt64 aSize)
  2973 	{
  2974 	TRACE4(UTF::EBorder, UTraceModuleEfsrv::EFileSetSize, MODULEUID, Session().Handle(), SubSessionHandle(), I64LOW(aSize), I64HIGH(aSize));
  2975 
  2976 	TPckgC<TInt64> pkSize(aSize);
  2977 	TInt r = SendReceive(EFsFileSetSize|KIpcArgSlot0Desc, TIpcArgs(&pkSize));
  2978 
  2979 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileSetSizeReturn, MODULEUID, r);
  2980 	return r;
  2981 	}
  2982 
  2983 
  2984 /**
  2985 Locks a region within the file as defined by a range of bytes.
  2986 
  2987 This ensures that those bytes are accessible 
  2988 only through the RFile object which claims the lock. To re-allow access by 
  2989 other programs to the locked region, it must either be unlocked or the file 
  2990 closed. Locking can be used to synchronize operations on a file when more 
  2991 than one program has access to the file in EFileShareAny mode.
  2992 
  2993 More than one distinct region of a file can be locked, but an error is returned 
  2994 if more than one lock is placed on the same region. Different RFile objects 
  2995 can lock different parts of the same file as long as the file is opened in 
  2996 EFileShareAny mode. The locked region may extend beyond the end of a file;
  2997 this prevents the file from being extended by other programs.
  2998 
  2999 This is equivalent to calling RFile::Lock except that this function accepts
  3000 TInt64 parameters instead of TInt parameters. 
  3001 This allows to to lock positions in file beyond 2GB-1.
  3002 
  3003 @see RFile::Lock()
  3004 
  3005 @param aPos    Position in file from which to lock; this is the  offset from
  3006                the beginning of the file.
  3007 @param aLength Number of bytes to lock.
  3008 
  3009 @return KErrNone if successful, otherwise one of the other  system-wide error 
  3010         codes.
  3011 
  3012 @panic FSCLIENT 17 if aLength is not greater than zero,
  3013 */
  3014 EFSRV_EXPORT_C TInt RFile64::Lock(TInt64 aPos, TInt64 aLength) const
  3015 	{
  3016 	TRACE5(UTF::EBorder, UTraceModuleEfsrv::EFileLock, MODULEUID, Session().Handle(), SubSessionHandle(), I64LOW(aPos), I64HIGH(aPos), aLength);
  3017 
  3018 	__ASSERT_ALWAYS(aPos>=0,Panic(EPosNegative));
  3019 	TPckgC<TInt64> pkPos(aPos);
  3020 	TPckgC<TInt64> pkLength(aLength);
  3021 
  3022 	TInt r;
  3023 	
  3024 	if(aPos <= KMaxTInt && aLength <= KMaxTInt)
  3025 		r = SendReceive(EFsFileLock,TIpcArgs(I64LOW(aPos), I64LOW(aLength)));
  3026 	else if(aPos <= KMaxTInt)
  3027 		r = SendReceive(EFsFileLock|KIpcArgSlot1Desc,TIpcArgs(I64LOW(aPos), &pkLength));
  3028 	else if(aLength <= KMaxTInt)
  3029 		r = SendReceive(EFsFileLock|KIpcArgSlot0Desc,TIpcArgs(&pkPos, I64LOW(aLength)));
  3030 	else 
  3031 		r = SendReceive(EFsFileLock|KIpcArgSlot0Desc|KIpcArgSlot1Desc,TIpcArgs(&pkPos, &pkLength));
  3032 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileLockReturn, MODULEUID, r);
  3033 	return r;
  3034 	}
  3035 
  3036 
  3037 /**
  3038 Unlocks a region within the file as defined by a range of bytes.
  3039 
  3040 A lock can only be removed by the RFile object which claimed the lock.
  3041 
  3042 A portion of a locked region cannot be unlocked. The entire locked region 
  3043 must be unlocked otherwise an error is returned. If any byte within
  3044 the specified range of bytes to unlock is not locked, an error is returned.
  3045 
  3046 This is equivalent to calling RFile::UnLock except that this function accepts
  3047 TInt64 parameters instead of TInt parameters. 
  3048 This allows to to unlock positions in file beyond 2GB-1.
  3049 
  3050 @see RFile::UnLock()
  3051 
  3052 @param aPos    Position in file from which to unlock; this is the  offset from
  3053                the beginning of the file.
  3054 @param aLength Number of bytes to unlock.
  3055 
  3056 @return KErrNone if successful, otherwise one of the other  system-wide error 
  3057         codes.
  3058         
  3059 @panic FSCLIENT 18 if aLength is not greater than zero,
  3060 */
  3061 EFSRV_EXPORT_C TInt RFile64::UnLock(TInt64 aPos, TInt64 aLength) const
  3062 	{
  3063 	TRACE5(UTF::EBorder, UTraceModuleEfsrv::EFileUnLock, MODULEUID, Session().Handle(), SubSessionHandle(), I64LOW(aPos), I64HIGH(aPos), aLength);
  3064 
  3065 	__ASSERT_ALWAYS(aPos>=0,Panic(EPosNegative));
  3066 	
  3067 	TPckgC<TInt64> pkPos(aPos);
  3068 	TPckgC<TInt64> pkLength(aLength);
  3069 	
  3070 	TInt r;
  3071 	
  3072 	if(aPos <= KMaxTInt && aLength <= KMaxTInt)
  3073 		r = SendReceive(EFsFileUnLock,TIpcArgs(I64LOW(aPos), I64LOW(aLength)));
  3074 	else if(aPos <= KMaxTInt)
  3075 		r = SendReceive(EFsFileUnLock|KIpcArgSlot1Desc,TIpcArgs(I64LOW(aPos), &pkLength));
  3076 	else if(aLength <= KMaxTInt)
  3077 		r = SendReceive(EFsFileUnLock|KIpcArgSlot0Desc,TIpcArgs(&pkPos, I64LOW(aLength)));
  3078 	else 
  3079 		r = SendReceive(EFsFileUnLock|KIpcArgSlot0Desc|KIpcArgSlot1Desc,TIpcArgs(&pkPos, &pkLength));
  3080 	
  3081 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileUnLockReturn, MODULEUID, r);
  3082 	return r;
  3083 	}
  3084 
  3085 
  3086 /**
  3087 Reads from the file at the specified offset within the file
  3088 
  3089 This is a synchronous function.
  3090 
  3091 This is equivalent to calling RFile::Read(TInt, TDes8&) or RFile64::Read(TInt64, TDes8&)
  3092 except that this function accepts TUint, instead of TInt or TInt64, as its first parameter.
  3093 
  3094 This function is provided for gradual migration of a client from 32-bit RFile APIs
  3095 to 64-bit RFile64 APIs. It is protected under _F32_STRICT_64_BIT_MIGRATION
  3096 macro. If the macro is defined, then it hides this overload, which would then throw
  3097 compile-time errors for any user code that uses TUint parameter for RFile64::Read.
  3098 
  3099 
  3100 @see RFile::Read(TInt aPos, TDes8& aDes)
  3101 @see RFile64::Read(TInt aPos, TDes8& aDes)
  3102 
  3103 Note that when an attempt is made to read beyond the end of the file,
  3104 no error is returned. 
  3105 The descriptor's length is set to the number of bytes read into it.
  3106 Therefore, when reading through a file, the end of file has been reached 
  3107 when the descriptor length, as returned by TDesC8::Length(), is zero.
  3108 
  3109 @param aPos Position of first byte to be read.  This is an offset from
  3110             the start of the file. If no position is specified, reading
  3111             begins at the current file position. 
  3112             If aPos is beyond the end of the file, the function returns
  3113             a zero length descriptor.
  3114             
  3115 @param aDes The descriptor into which binary data is read. Any existing content
  3116             is overwritten. On return, its length is set to the number of
  3117             bytes read.
  3118             
  3119 @return KErrNone if successful, otherwise one of the other system-wide error 
  3120         codes.
  3121 
  3122 */
  3123 EFSRV_EXPORT_C TInt RFile64::Read(TUint aPos,TDes8& aDes) const
  3124 	{
  3125 	TRACE5(UTF::EBorder, UTraceModuleEfsrv::EFileRead3, MODULEUID, Session().Handle(), SubSessionHandle(), aPos, 0, aDes.MaxLength());
  3126 
  3127 	TInt r;
  3128 	if(!(aPos + 1))
  3129 		{
  3130 		r = SendReceive(EFsFileRead,TIpcArgs(&aDes,aDes.MaxLength(),aPos));
  3131 		}
  3132 	else
  3133 		{
  3134 		TInt64 pos = aPos;
  3135 		TPckgC<TInt64> pkPos(pos);
  3136  		r = SendReceive(EFsFileRead|KIpcArgSlot2Desc,TIpcArgs(&aDes,aDes.MaxLength(),&pkPos));
  3137 		}
  3138 
  3139 	TRACERET2(UTF::EBorder, UTraceModuleEfsrv::EFileRead3Return, MODULEUID, r, aDes.Length());
  3140 
  3141 	return r;
  3142 	}
  3143 
  3144 
  3145 /**
  3146 Reads from the file at the specified offset within the file.
  3147 
  3148 This is an asynchronous function.
  3149 
  3150 This is equivalent to calling RFile::Read(TInt, TDes8&, TRequestStatus&) or 
  3151 RFile64::Read(TInt64, TDes8&, TRequestStatus&) except that this function 
  3152 accepts TUint, instead of TInt or TInt64, as its first parameter.
  3153 
  3154 This function is provided for gradual migration of a client from 32-bit RFile APIs
  3155 to 64-bit RFile64 APIs. It is protected under _F32_STRICT_64_BIT_MIGRATION
  3156 macro. If the macro is defined, then it hides this overload, which would then throw
  3157 compile-time errors for any user code that uses TUint parameter for RFile64::Read.
  3158 
  3159 @see RFile::Read(TInt aPos, TDes8& aDes, TRequestStatus& aStatus)
  3160 @see RFile64::Read(TInt aPos, TDes8& aDes, TRequestStatus& aStatus)
  3161 
  3162 Note that when an attempt is made to read beyond the end of the file,
  3163 no error is returned. 
  3164 The descriptor's length is set to the number of bytes read into it.
  3165 Therefore, when reading through a file, the end of file has been reached 
  3166 when the descriptor length, as returned by TDesC8::Length(), is zero.
  3167 
  3168 @param aPos    Position of first byte to be read. This is an offset from
  3169                the start of the file. If no position is specified, 
  3170                reading begins at the current file position.
  3171                If aPos is beyond the end of the file, the function returns
  3172                a zero length descriptor.
  3173                
  3174 @param aDes    The descriptor into which binary data is read. Any existing
  3175                content is overwritten. On return, its length is set to
  3176                the number of bytes read.
  3177                NB: this function is asynchronous and the request that it
  3178                represents may not complete until some time after the call
  3179                to the function has returned. It is important, therefore, that
  3180                this descriptor remain valid, or remain in scope, until you have
  3181                been notified that the request is complete.
  3182                
  3183 @param aStatus The request status. On completion, contains an error code of KErrNone 
  3184                if successful, otherwise one of the other system-wide error codes.
  3185 
  3186 */
  3187 EFSRV_EXPORT_C void RFile64::Read(TUint aPos,TDes8& aDes,TRequestStatus& aStatus) const
  3188 	{
  3189 	TRACE6(UTF::EBorder, UTraceModuleEfsrv::EFileRead4, MODULEUID, Session().Handle(), SubSessionHandle(), aPos, 0, aDes.MaxLength(), &aStatus);
  3190 
  3191 	if(!(aPos + 1))
  3192 		{
  3193 		RSubSessionBase::SendReceive(EFsFileRead,TIpcArgs(&aDes,aDes.MaxLength(),aPos),aStatus);
  3194 		}
  3195 	else
  3196 		{
  3197 		TInt64 pos = aPos;
  3198 		TPckgC<TInt64> pkPos(pos);
  3199 		RSubSessionBase::SendReceive(EFsFileRead|KIpcArgSlot2Desc,TIpcArgs(&aDes,aDes.MaxLength(),&pkPos),aStatus);
  3200 		}
  3201 
  3202 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFileRead4Return, MODULEUID);
  3203 	}
  3204 
  3205 
  3206 /**
  3207 Reads the specified number of bytes of binary data from the file at a specified 
  3208 offset within the file.
  3209 
  3210 This is a synchronous function.
  3211 
  3212 This is equivalent to calling RFile::Read(TInt, TDes8&, TInt) or 
  3213 RFile64::Read(TInt64, TDes8&, TInt) except that this function 
  3214 accepts TUint, instead of TInt or TInt64, as its first parameter.
  3215 
  3216 This function is provided for gradual migration of a client from 32-bit RFile APIs
  3217 to 64-bit RFile64 APIs. It is protected under _F32_STRICT_64_BIT_MIGRATION
  3218 macro. If the macro is defined, then it hides this overload, which would then throw
  3219 compile-time errors for any user code that uses TUint parameter for RFile64::Read.
  3220 
  3221 
  3222 @see RFile::Read(TInt aPos, TDes8& aDes,TInt aLength)
  3223 @see RFile64::Read(TInt aPos, TDes8& aDes,TInt aLength)
  3224 
  3225 Note that when an attempt is made to read beyond the end of the file,
  3226 no error is returned. 
  3227 The descriptor's length is set to the number of bytes read into it.
  3228 Therefore, when reading through a file, the end of file has been reached 
  3229 when the descriptor length, as returned by TDesC8::Length(), is zero.
  3230 Assuming aLength is less than the maximum length of the descriptor, the only
  3231 circumstances in which Read() can return fewer bytes than requested is when
  3232 the end of file is reached or if an error has occurred.
  3233 
  3234 @param aPos    Position of first byte to be read. This is an offset from
  3235                the start of the file. If no position is specified, 
  3236                reading begins at the current file position.
  3237                If aPos is beyond the end of the file, the function returns
  3238                a zero length descriptor.
  3239                
  3240 @param aDes    The descriptor into which binary data is read. Any existing
  3241                contents are overwritten. On return, its length is set to
  3242                the number of bytes read.
  3243 @param aLength The number of bytes to read from the file into the descriptor. 
  3244                If an attempt is made to read more bytes than the descriptor's
  3245                maximum length, then the function updates aStatus parameter with KErrOverflow.
  3246                It must not be negative otherwise the function updates aStatus with KErrArgument.
  3247                
  3248 @return KErrNone if successful, otherwise one of the other system-wide
  3249         error codes.
  3250 
  3251 */    
  3252 EFSRV_EXPORT_C TInt RFile64::Read(TUint aPos,TDes8& aDes,TInt aLength) const
  3253 	{
  3254 	TRACE5(UTF::EBorder, UTraceModuleEfsrv::EFileRead3, MODULEUID, Session().Handle(), SubSessionHandle(), aPos, 0, aLength);
  3255 
  3256 	if (aLength==0)
  3257 		{
  3258 		aDes.Zero();
  3259 		return(KErrNone);
  3260 		}
  3261 	else if(aLength>aDes.MaxLength())
  3262 		{
  3263 		return(KErrOverflow);
  3264 		}
  3265 	
  3266 	TInt r;
  3267 	if(!(aPos + 1))
  3268 		{
  3269 		r = SendReceive(EFsFileRead,TIpcArgs(&aDes,aLength,aPos));
  3270 		}
  3271 	else
  3272 		{
  3273 		TInt64 pos = aPos;
  3274 		TPckgC<TInt64> pkPos(pos);
  3275 		r = SendReceive(EFsFileRead|KIpcArgSlot2Desc,TIpcArgs(&aDes,aLength,&pkPos));
  3276 		}
  3277 
  3278 	TRACERET2(UTF::EBorder, UTraceModuleEfsrv::EFileRead3Return, MODULEUID, r, aDes.Length());
  3279 
  3280 	return r;
  3281 	}
  3282 
  3283 
  3284 /**
  3285 Reads the specified number of bytes of binary data from the file at a specified 
  3286 offset within the file.
  3287 
  3288 This is an asynchronous function.
  3289 
  3290 This is equivalent to calling RFile::Read(TInt, TDes8&, TInt,TRequestStatus&) or 
  3291 RFile64::Read(TInt64, TDes8&, TInt, TRequestStatus&) except that this function 
  3292 accepts TUint, instead of TInt or TInt64, as its first parameter.
  3293 
  3294 This function is provided for gradual migration of a client from 32-bit RFile APIs
  3295 to 64-bit RFile64 APIs. It is protected under _F32_STRICT_64_BIT_MIGRATION
  3296 macro. If the macro is defined, then it hides this overload, which would then throw
  3297 compile-time errors for any user code that uses TUint parameter for RFile64::Read.
  3298 
  3299 
  3300 @see RFile::Read(TInt aPos, TDes8& aDes,TInt aLength,TRequestStatus& aStatus)
  3301 @see RFile64::Read(TInt aPos, TDes8& aDes,TInt aLength,TRequestStatus& aStatus)
  3302 
  3303 Note that when an attempt is made to read beyond the end of the file,
  3304 no error is returned. 
  3305 The descriptor's length is set to the number of bytes read into it.
  3306 Therefore, when reading through a file, the end of file has been reached 
  3307 when the descriptor length, as returned by TDesC8::Length(), is zero.
  3308 Assuming aLength is less than the maximum length of the descriptor, the only
  3309 circumstances in which Read() can return fewer bytes than requested is when
  3310 the end of file is reached or if an error has occurred.
  3311 
  3312 @param aPos    Position of first byte to be read. This is an offset from
  3313                the start of the file. If no position is specified, 
  3314                reading begins at the current file position.
  3315                If aPos is beyond the end of the file, the function returns
  3316                a zero length descriptor.
  3317                
  3318 @param aDes    The descriptor into which binary data is read. Any existing
  3319                contents are overwritten. On return, its length is set to
  3320                the number of bytes read.
  3321                NB: this function is asynchronous and the request that it
  3322                represents may not complete until some time after the call
  3323                to the function has returned. It is important, therefore, that
  3324                this descriptor remain valid, or remain in scope, until you have
  3325                been notified that the request is complete.
  3326 
  3327 @param aLength The number of bytes to read from the file into the descriptor. 
  3328                If an attempt is made to read more bytes than the descriptor's
  3329                maximum length, then the function returns KErrOverflow.
  3330                It must not be negative otherwise the function returns KErrArgument.
  3331 
  3332 @param aStatus Request status. On completion contains KErrNone if successful, 
  3333                otherwise one of the other system-wide error codes.
  3334                
  3335 */
  3336 EFSRV_EXPORT_C void RFile64::Read(TUint aPos,TDes8& aDes,TInt aLength,TRequestStatus& aStatus) const
  3337 	{
  3338 	TRACE6(UTF::EBorder, UTraceModuleEfsrv::EFileRead4, MODULEUID, Session().Handle(), SubSessionHandle(), aPos, 0, aLength, &aStatus);
  3339 
  3340 	if (aLength==0)
  3341 		{
  3342 		aDes.Zero();
  3343 		TRequestStatus* req=(&aStatus);
  3344 		User::RequestComplete(req,KErrNone);
  3345 		return;
  3346 		}
  3347 	else if(aLength>aDes.MaxLength())
  3348 		{
  3349 		TRequestStatus* req=(&aStatus);
  3350 		User::RequestComplete(req,KErrOverflow);
  3351 		return;
  3352 		}
  3353 	
  3354 	if(!(aPos + 1))
  3355 		{
  3356 		RSubSessionBase::SendReceive(EFsFileRead,TIpcArgs(&aDes,aLength,aPos),aStatus);
  3357 		}
  3358 	else
  3359 		{
  3360 		TInt64 pos = aPos;
  3361 		TPckgC<TInt64> pkPos(pos);
  3362 		RSubSessionBase::SendReceive(EFsFileRead|KIpcArgSlot2Desc,TIpcArgs(&aDes,aLength,&pkPos),aStatus);
  3363 		}
  3364 
  3365 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFileRead4Return, MODULEUID);
  3366 	}
  3367 
  3368 
  3369 /**
  3370 Writes to the file at the specified offset within the file
  3371 
  3372 This is a synchronous function.
  3373 
  3374 This is equivalent to calling RFile::Write(TInt, TDes8&) or 
  3375 RFile64::Write(TInt64, TDes8&) except that this function 
  3376 accepts TUint, instead of TInt or TInt64, as its first parameter.
  3377 
  3378 This function is provided for gradual migration of a client from 32-bit RFile APIs
  3379 to 64-bit RFile64 APIs. It is protected under _F32_STRICT_64_BIT_MIGRATION
  3380 macro. If the macro is defined, then it hides this overload, which would then throw
  3381 compile-time errors for any user code that uses TUint parameter for RFile64::Read.
  3382 
  3383 
  3384 @see RFile::Write(TInt aPos, TDes8& aDes)
  3385 @see RFile64::Write(TInt aPos, TDes8& aDes)
  3386 
  3387 
  3388 @param aPos The offset from the start of the file at which the first
  3389             byte is written. 
  3390             If a position beyond the end of the file is specified, then
  3391             the write operation begins at the end of the file.
  3392             If the position has been locked, then the write fails.
  3393             
  3394 @param aDes The descriptor from which binary data is written. The function writes 
  3395             the entire contents of aDes to the file.
  3396             
  3397 @return KErrNone if successful, otherwise one of the other system-wide error
  3398         codes.
  3399 
  3400 */
  3401 EFSRV_EXPORT_C TInt RFile64::Write(TUint aPos,const TDesC8& aDes)
  3402 	{
  3403 	TRACE5(UTF::EBorder, UTraceModuleEfsrv::EFileWrite3, MODULEUID, Session().Handle(), SubSessionHandle(), aPos, 0, aDes.Length());
  3404 
  3405 	TInt r;
  3406 	if(!(aPos + 1))
  3407 		{
  3408 		r = SendReceive(EFsFileWrite,TIpcArgs(&aDes,aDes.Length(),aPos));
  3409 		}
  3410 	else
  3411 		{
  3412 		TInt64 pos = aPos;
  3413 		TPckgC<TInt64> pkPos(pos);
  3414 		r = SendReceive(EFsFileWrite|KIpcArgSlot2Desc,TIpcArgs(&aDes,aDes.Length(),&pkPos));
  3415 		}
  3416 
  3417 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileWrite3Return, MODULEUID, r);
  3418 	return r;
  3419 	}
  3420 
  3421 
  3422 /**
  3423 Writes to the file at the specified offset within the file
  3424 
  3425 This is an asynchronous function.
  3426 
  3427 This is equivalent to calling RFile::Write(TInt, TDes8&,TRequestStatus&) or 
  3428 RFile64::Write(TInt64, TDes8&,TRequestStatus&) except that this function 
  3429 accepts TUint, instead of TInt or TInt64, as its first parameter.
  3430 
  3431 This function is provided for gradual migration of a client from 32-bit RFile APIs
  3432 to 64-bit RFile64 APIs. It is protected under _F32_STRICT_64_BIT_MIGRATION
  3433 macro. If the macro is defined, then it hides this overload, which would then throw
  3434 compile-time errors for any user code that uses TUint parameter for RFile64::Read.
  3435 
  3436 
  3437 @see RFile::Write(TInt aPos, TDes8& aDes,TRequestStatus& aStatus)
  3438 @see RFile64::Write(TInt aPos, TDes8& aDes,TRequestStatus& aStatus)
  3439 
  3440 
  3441 @param aPos    The offset from the start of the file at which the first
  3442                byte is written. 
  3443                If a position beyond the end of the file is specified, then
  3444                the write operation begins at the end of the file.
  3445                If the position has been locked, then the write fails.
  3446                
  3447 @param aDes    The descriptor from which binary data is written. The function
  3448                writes the entire contents of aDes to the file.
  3449                NB: this function is asynchronous and the request that it
  3450                represents may not complete until some time after the call
  3451                to the function has returned. It is important, therefore, that
  3452                this descriptor remain valid, or remain in scope, until you have
  3453                been notified that the request is complete.
  3454 
  3455 @param aStatus Request status. On completion contains KErrNone if successful, 
  3456                otherwise one of the other system-wide error codes.
  3457 
  3458 */
  3459 EFSRV_EXPORT_C void RFile64::Write(TUint aPos,const TDesC8& aDes,TRequestStatus& aStatus)
  3460 	{
  3461 	TRACE6(UTF::EBorder, UTraceModuleEfsrv::EFileWrite4, MODULEUID, Session().Handle(), SubSessionHandle(), aPos, 0, aDes.Length(), &aStatus);
  3462 
  3463 	if(!(aPos + 1))
  3464 		{
  3465 		RSubSessionBase::SendReceive(EFsFileWrite,TIpcArgs(&aDes,aDes.Length(),aPos),aStatus);
  3466 		}
  3467 	else
  3468 		{
  3469 		TInt64 pos = aPos;
  3470 		TPckgC<TInt64> pkPos(pos);
  3471 		RSubSessionBase::SendReceive(EFsFileWrite|KIpcArgSlot2Desc,TIpcArgs(&aDes,aDes.Length(),&pkPos),aStatus);
  3472 		}
  3473 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFileWrite4Return, MODULEUID);
  3474 	}
  3475 
  3476 
  3477 /**
  3478 Writes the specified number of bytes to the file at the specified offset within the file.
  3479 
  3480 This is a synchronous function.
  3481 
  3482 This is equivalent to calling RFile::Write(TInt, TDes8&,TInt) or 
  3483 RFile64::Write(TInt64, TDes8&,TInt) except that this function 
  3484 accepts TUint, instead of TInt or TInt64, as its first parameter.
  3485 
  3486 This function is provided for gradual migration of a client from 32-bit RFile APIs
  3487 to 64-bit RFile64 APIs. It is protected under _F32_STRICT_64_BIT_MIGRATION
  3488 macro. If the macro is defined, then it hides this overload, which would then throw
  3489 compile-time errors for any user code that uses TUint parameter for RFile64::Read.
  3490 
  3491 
  3492 @see RFile::Write(TInt aPos, TDes8& aDes,TInt aLength)
  3493 @see RFile64::Write(TInt aPos, TDes8& aDes,TInt aLength)
  3494 
  3495 @param aPos    The offset from the start of the file at which the first
  3496                byte is written. 
  3497                If a position beyond the end of the file is specified, then
  3498                the write operation begins at the end of the file.
  3499                If the position has been locked, then the write fails.
  3500                              
  3501 @param aDes    The descriptor from which binary data is written.
  3502 @param aLength The number of bytes to be written from aDes .
  3503                It must not be negative.
  3504 
  3505 @return KErrNone if successful; KErrArgument if aLength is negative;
  3506         otherwise one of the other system-wide error codes.
  3507         
  3508 */
  3509 EFSRV_EXPORT_C TInt RFile64::Write(TUint aPos,const TDesC8& aDes,TInt aLength)
  3510 	{
  3511 	TRACE3(UTF::EBorder, UTraceModuleEfsrv::EFileWrite1, MODULEUID, Session().Handle(), SubSessionHandle(), aLength);
  3512 
  3513 	TInt r;
  3514 	if(!(aPos + 1))
  3515 		{
  3516 		r = SendReceive(EFsFileWrite,TIpcArgs(&aDes,aLength,aPos));
  3517 		}
  3518 	else
  3519 		{
  3520 		TInt64 pos = aPos;
  3521 		TPckgC<TInt64> pkPos(pos);
  3522 		r = SendReceive(EFsFileWrite|KIpcArgSlot2Desc,TIpcArgs(&aDes,aLength,&pkPos));
  3523 		}
  3524 
  3525 	TRACERET1(UTF::EBorder, UTraceModuleEfsrv::EFileWrite1Return, MODULEUID, r);
  3526 	return r;
  3527 	}
  3528 
  3529 
  3530 /**
  3531 Writes the specified number of bytes to the file at the specified offset within the file.
  3532 
  3533 This is an asynchronous function.
  3534 
  3535 This is equivalent to calling RFile::Write(TInt, TDes8&,TInt,TRequestStatus&) or 
  3536 RFile64::Write(TInt64, TDes8&,TInt,TRequestStatus&) except that this function 
  3537 accepts TUint, instead of TInt or TInt64, as its first parameter.
  3538 
  3539 This function is provided for gradual migration of a client from 32-bit RFile APIs
  3540 to 64-bit RFile64 APIs. It is protected under _F32_STRICT_64_BIT_MIGRATION
  3541 macro. If the macro is defined, then it hides this overload, which would then throw
  3542 compile-time errors for any user code that uses TUint parameter for RFile64::Read.
  3543 
  3544 
  3545 @see RFile::Write(TInt aPos, TDes8& aDes, TInt aLength, TRequestStatus& aStatus)
  3546 @see RFile64::Write(TInt aPos, TDes8& aDes,TInt aLength, TRequestStatus& aStatus)
  3547 
  3548 
  3549 @param aPos    The offset from the start of the file at which the first
  3550                byte is written. 
  3551                If a position beyond the end of the file is specified, then
  3552                the write operation begins at the end of the file.
  3553                If the position has been locked, then the write fails.
  3554               
  3555 @param aDes    The descriptor from which binary data is written.
  3556                NB: this function is asynchronous and the request that it
  3557                represents may not complete until some time after the call
  3558                to the function has returned. It is important, therefore, that
  3559                this descriptor remain valid, or remain in scope, until you have
  3560                been notified that the request is complete.
  3561 
  3562 @param aLength The number of bytes to be written from aDes.
  3563                It must not be negative.
  3564                
  3565 @param aStatus Request status. On completion contains KErrNone if successful; 
  3566                KErrArgument if aLength is negative; 
  3567                otherwise one of the other system-wide error codes.
  3568 
  3569 */
  3570 EFSRV_EXPORT_C void RFile64::Write(TUint aPos,const TDesC8& aDes,TInt aLength,TRequestStatus& aStatus)
  3571 	{
  3572 	TRACE6(UTF::EBorder, UTraceModuleEfsrv::EFileWrite2, MODULEUID, Session().Handle(), SubSessionHandle(), aPos, 0, aLength, &aStatus);
  3573 
  3574 	if(!(aPos + 1))
  3575 		{
  3576 		RSubSessionBase::SendReceive(EFsFileWrite,TIpcArgs(&aDes,aLength,aPos),aStatus);
  3577 		}
  3578 	else
  3579 		{
  3580 		TInt64 pos = aPos;
  3581 		TPckgC<TInt64> pkPos(pos);
  3582 		RSubSessionBase::SendReceive(EFsFileWrite|KIpcArgSlot2Desc,TIpcArgs(&aDes,aLength,&pkPos),aStatus);
  3583 		}
  3584 	TRACE0(UTF::EBorder, UTraceModuleEfsrv::EFileWrite2Return, MODULEUID);
  3585 	}
  3586 #else
  3587 EFSRV_EXPORT_C TInt RFile64::Open(RFs& /*aFs*/,const TDesC& /*aName*/,TUint /*aFileMode*/)
  3588 	{Panic(ENotImplemented);return (KErrNotSupported);}
  3589 EFSRV_EXPORT_C TInt RFile64::Create(RFs& /*aFs*/,const TDesC& /*aName*/,TUint /*aFileMode*/)
  3590 	{Panic(ENotImplemented);return (KErrNotSupported);}
  3591 EFSRV_EXPORT_C TInt RFile64::Replace(RFs& /*aFs*/,const TDesC& /*aName*/,TUint /*aFileMode*/)
  3592 	{Panic(ENotImplemented);return (KErrNotSupported);}
  3593 EFSRV_EXPORT_C TInt RFile64::Temp(RFs& /*aFs*/,const TDesC& /*aPath*/,TFileName& /*aName*/,TUint /*aFileMode*/)
  3594 	{Panic(ENotImplemented);return (KErrNotSupported);}
  3595 EFSRV_EXPORT_C TInt RFile64::AdoptFromClient(const RMessage2& /*aMsg*/, TInt /*aFsHandleIndex*/, TInt /*aFileHandleIndex*/)
  3596 	{Panic(ENotImplemented);return (KErrNotSupported);}
  3597 EFSRV_EXPORT_C TInt RFile64::AdoptFromServer(TInt /*aFsHandle*/, TInt /*aFileHandle*/)
  3598 	{Panic(ENotImplemented);return (KErrNotSupported);}
  3599 EFSRV_EXPORT_C TInt RFile64::AdoptFromCreator(TInt /*aFsHandleIndex*/, TInt /*aFileHandleIndex*/)
  3600 	{Panic(ENotImplemented);return (KErrNotSupported);}
  3601 EFSRV_EXPORT_C TInt RFile64::Read(TInt64 /*aPos*/, TDes8& /*aDes*/) const
  3602 	{Panic(ENotImplemented);return (KErrNotSupported);}
  3603 EFSRV_EXPORT_C void RFile64::Read(TInt64 /*aPos*/, TDes8& /*aDes*/, TRequestStatus& /*aStatus*/) const
  3604 	{Panic(ENotImplemented);}
  3605 EFSRV_EXPORT_C TInt RFile64::Read(TInt64 /*aPos*/, TDes8& /*aDes*/, TInt /*aLength*/) const
  3606 	{Panic(ENotImplemented);return (KErrNotSupported);}
  3607 EFSRV_EXPORT_C void RFile64::Read(TInt64 /*aPos*/, TDes8& /*aDes*/, TInt /*aLength*/,TRequestStatus& /*aStatus*/) const
  3608 	{Panic(ENotImplemented);}
  3609 EFSRV_EXPORT_C TInt RFile64::Write(TInt64 /*aPos*/, const TDesC8& /*aDes*/)
  3610 	{Panic(ENotImplemented);return (KErrNotSupported);}
  3611 EFSRV_EXPORT_C void RFile64::Write(TInt64 /*aPos*/, const TDesC8& /*aDes*/,TRequestStatus& /*aStatus*/)
  3612 	{Panic(ENotImplemented);}
  3613 EFSRV_EXPORT_C TInt RFile64::Write(TInt64 /*aPos*/, const TDesC8& /*aDes*/, TInt /*aLength*/)
  3614 	{Panic(ENotImplemented);return (KErrNotSupported);}
  3615 EFSRV_EXPORT_C void RFile64::Write(TInt64 /*aPos*/, const TDesC8& /*aDes*/,TInt /*aLength*/,TRequestStatus& /*aStatus*/)
  3616 	{Panic(ENotImplemented);}
  3617 EFSRV_EXPORT_C TInt RFile64::Seek(TSeek /*aMode*/, TInt64& /*aPos*/) const
  3618 	{Panic(ENotImplemented);return (KErrNotSupported);}
  3619 EFSRV_EXPORT_C TInt RFile64::Size(TInt64& /*aSize*/) const
  3620 	{Panic(ENotImplemented);return (KErrNotSupported);}
  3621 EFSRV_EXPORT_C TInt RFile64::SetSize(TInt64 /*aSize*/)
  3622 	{Panic(ENotImplemented);return (KErrNotSupported);}
  3623 EFSRV_EXPORT_C TInt RFile64::Lock(TInt64 /*aPos*/, TInt64 /*aLength*/) const
  3624 	{Panic(ENotImplemented);return (KErrNotSupported);}
  3625 EFSRV_EXPORT_C TInt RFile64::UnLock(TInt64 /*aPos*/, TInt64 /*aLength*/) const
  3626 	{Panic(ENotImplemented);return (KErrNotSupported);}
  3627 EFSRV_EXPORT_C TInt RFile64::Read(TUint /*aPos*/,TDes8& /*aDes*/) const
  3628 	{Panic(ENotImplemented);return (KErrNotSupported);}
  3629 EFSRV_EXPORT_C void RFile64::Read(TUint /*aPos*/,TDes8& /*aDes*/,TRequestStatus& /*aStatus*/) const
  3630 	{Panic(ENotImplemented);}
  3631 EFSRV_EXPORT_C TInt RFile64::Read(TUint /*aPos*/,TDes8& /*aDes*/,TInt /*aLength*/) const
  3632 	{Panic(ENotImplemented);return (KErrNotSupported);}
  3633 EFSRV_EXPORT_C void RFile64::Read(TUint /*aPos*/,TDes8& /*aDes*/,TInt /*aLength*/,TRequestStatus& /*aStatus*/) const
  3634 	{Panic(ENotImplemented);}
  3635 EFSRV_EXPORT_C TInt RFile64::Write(TUint /*aPos*/,const TDesC8& /*aDes*/)
  3636 	{Panic(ENotImplemented);return (KErrNotSupported);}
  3637 EFSRV_EXPORT_C void RFile64::Write(TUint /*aPos*/,const TDesC8& /*aDes*/,TRequestStatus& /*aStatus*/)
  3638 	{Panic(ENotImplemented);}
  3639 EFSRV_EXPORT_C TInt RFile64::Write(TUint /*aPos*/,const TDesC8& /*aDes*/,TInt /*aLength*/)
  3640 	{Panic(ENotImplemented);return (KErrNotSupported);}
  3641 EFSRV_EXPORT_C void RFile64::Write(TUint /*aPos*/, const TDesC8& /*aDes*/,TInt /*aLength*/,TRequestStatus& /*aStatus*/)
  3642 	{Panic(ENotImplemented);}
  3643 #endif