os/kernelhwsrv/kerneltest/f32test/fileshare/t_handshare.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 // Copyright (c) 1996-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 // f32test\server\t_handshare.cpp
    15 // 
    16 //
    17 
    18 #include <f32file.h>
    19 #include <e32test.h>
    20 #include "t_server.h"
    21 #include "handshare.h"
    22 
    23 GLDEF_D RTest test(_L("T_HANDSHARE"));
    24 
    25 LOCAL_D TInt drivenum;
    26 
    27 
    28 
    29 // test of (deprecated) RFile::Adopt()
    30 //
    31 // Request an open file (read only)
    32 //
    33 GLDEF_C void RequestFileDeprecatedAdopt()
    34 	{
    35 	test.Next(_L("RFile::Adopt()"));
    36 
    37 	TInt r;
    38 	RFileHandleSharer handsvr;
    39 	do
    40 		{
    41 		r=handsvr.Connect();
    42 		}
    43 		while(r==KErrNotFound);
    44 	test(r==KErrNone);
    45 	r=handsvr.SetTestDrive(drivenum);
    46 	test(r==KErrNone);
    47 	TInt ssh;
    48 	RFs fs1;
    49 	TInt fsh = handsvr.GetFileHandle(ssh, EFileRead);
    50 
    51 	r = fs1.SetReturnedHandle(fsh);
    52 	test(r==KErrNone);
    53 	
    54 	RFile file;
    55 	r=file.Adopt(fs1,ssh);
    56 	test(r==KErrNone);
    57 	
    58 	TBuf8<100> rbuf;
    59 	r=file.Read(0,rbuf);
    60 	test(r==KErrNone);
    61 	
    62 	r=rbuf.CompareF(KTestData1());
    63 	test(r==KErrNone);
    64 	
    65 	r=file.Write(KTestData());
    66 	test(r==KErrAccessDenied);
    67 	
    68 	r=file.ChangeMode(EFileWrite);
    69 	test(r==KErrArgument);
    70 	
    71 	r=file.Rename(_L("\\newname.txt"));
    72 	test(r==KErrPermissionDenied || r==KErrAccessDenied);
    73 
    74 	file.Close();
    75 
    76 	fsh = handsvr.GetFileHandle(ssh, EFileRead);
    77 	r = fs1.SetReturnedHandle(fsh);
    78 	test(r==KErrNone);
    79 
    80 	// Adopt a bad sub-session handle
    81 
    82 	r=file.Adopt(fs1, KNullHandle);
    83 	test(r==KErrBadHandle);
    84 
    85 	r=file.Adopt(fs1, -1);
    86 	test(r==KErrBadHandle);
    87 
    88 
    89 	handsvr.Close();
    90 	file.Close();
    91 	RDebug::Print(_L("End Of Tests"));
    92 	fs1.Close();
    93 	}
    94 
    95 
    96 
    97 // Cloning tests
    98 GLDEF_C void Duplicate()
    99 	{
   100 	test.Next(_L("RFile::Duplicate()"));
   101 
   102 	RFs fs;
   103 	TInt r=fs.Connect();
   104 	test(r==KErrNone);
   105 
   106 	// Check the number of open file handles
   107 	TInt resCount = fs.ResourceCount();
   108 	test(resCount == 0);
   109 
   110 	// create a file & fill it with data	
   111 	RFile file1;
   112 	r=file1.Replace(fs,KCliFileName,EFileWrite);
   113 	test(r==KErrNone);
   114 	r=file1.Write(KTestData());
   115 	test(r==KErrNone);
   116 	file1.Close();
   117 
   118 	// open the file for read
   119 	r = file1.Open(fs,KCliFileName,EFileRead);
   120 	test(r==KErrNone);
   121 	TBuf8<100> rbuf;
   122 	r = file1.Read(0,rbuf);
   123 	test(r==KErrNone);
   124 	r=rbuf.CompareF(KTestData);
   125 	test(r==KErrNone);
   126 
   127 
   128 	// clone the file
   129 	RFile file2;
   130 	r = file2.Duplicate(file1);
   131 	test(r==0);
   132 
   133 	// make sure file positions are the same
   134 	TInt pos1 = 0;
   135 	r = file1.Seek(ESeekCurrent, pos1);
   136 	test(r==KErrNone);
   137 	TInt pos2 = 0;
   138 	r = file2.Seek(ESeekCurrent, pos2);
   139 	test(r==KErrNone);
   140 	test(pos1 == pos2);
   141 
   142 	// change the position on the duplcated file handle & 
   143 	// verify that the original file handle's position is unchanged
   144 	TInt oldPos1 = pos1;
   145 	
   146 	const TInt newPos2 = 5;
   147 	pos2 = newPos2;
   148 	r = file2.Seek(ESeekStart, pos2);
   149 	test(r==KErrNone);
   150 	
   151 	pos1 = 0;
   152 	r = file1.Seek(ESeekCurrent, pos1);
   153 	test(r==KErrNone);
   154 	test(pos1 == oldPos1);
   155 	
   156 	pos2 = 0;
   157 	r = file2.Seek(ESeekCurrent, pos2);
   158 	test(r==KErrNone);
   159 	test(pos2 == newPos2);
   160 	test(pos1 != pos2);
   161 
   162 	// close the parent file and check we can still use the duplicated one.
   163 	file1.Close();
   164 
   165 	// Check the number of open file handles - should be 1 (the duplicated one)
   166 	resCount = fs.ResourceCount();
   167 	test(resCount == 1);
   168 
   169 	fs.Close();
   170 
   171 	rbuf.FillZ();
   172 
   173 	// reset to pos 0
   174 	pos2 = 0;
   175 	r = file2.Seek(ESeekStart, pos2);
   176 	test(r==KErrNone);
   177 	
   178 	r=file2.Read(0,rbuf);
   179 	test(r==KErrNone);
   180 	r=rbuf.CompareF(KTestData);
   181 	test(r==KErrNone);
   182 	file2.Close();
   183 
   184 	// start again - this time we're going to close the duplicated file first
   185 	// and check we can still use the parent file
   186 
   187 	r = fs.Connect();
   188 	test(r==KErrNone);
   189 
   190 	// Make a note of the number of open resources
   191 	fs.ResourceCountMarkStart();
   192 
   193 	// open the file for read
   194 	r = file1.Open(fs,KCliFileName,EFileRead);
   195 	test(r==KErrNone);
   196 
   197 
   198 	// clone the file & check we can read it
   199 	r = file2.Duplicate(file1, EOwnerThread);
   200 	test(r==0);
   201 	rbuf.FillZ();
   202 	r = file2.Read(0,rbuf);
   203 	test(r==KErrNone);
   204 	r=rbuf.CompareF(KTestData);
   205 	test(r==KErrNone);
   206 
   207 
   208 	// close the duplicated file and check we can still use the parent one.
   209 	file2.Close();
   210 
   211 	rbuf.FillZ();
   212 
   213 	// check we can read the parent file
   214 	r=file1.Read(0,rbuf);
   215 	test(r==KErrNone);
   216 	r=rbuf.CompareF(KTestData);
   217 	test(r==KErrNone);
   218 
   219 	// close the parent
   220 	file1.Close();
   221 
   222 	// Check the number of open file handles
   223 	fs.ResourceCountMarkEnd();
   224 	resCount = fs.ResourceCount();
   225 	test(resCount == 0);
   226 
   227 	fs.Close();
   228 	}
   229 
   230 
   231 // Request an open file (write mode) from the server
   232 // using RFile::AdoptFromServer()
   233 GLDEF_C void RequestFileWrite()
   234 	{
   235 	TInt r;
   236 	RFileHandleSharer handsvr;
   237 	do
   238 		{
   239 		r=handsvr.Connect();
   240 		}
   241 	while(r==KErrNotFound);
   242 	test(r==KErrNone);
   243 
   244 	r=handsvr.SetTestDrive(drivenum);
   245 	test(r==KErrNone);
   246 
   247 	TInt ssh;
   248 	TInt fsh = handsvr.GetFileHandle2(ssh, EFileWrite);
   249 	test (fsh >= 0);
   250 
   251 	// Closing the handle to the server ensures the server has closed it's
   252 	// RFs and RFile handles - this provides a means of testing whether we 
   253 	// can still adopt the RFile even if the server has closed it's one.
   254 
   255 	handsvr.Sync(); // make sure server has finished doing what it's doing
   256 	handsvr.Close();
   257 
   258 	// adopt the file handle from FHServer
   259 	test.Next(_L("RFile::AdoptFromServer()"));
   260 
   261 	RFile file;
   262 	r=file.AdoptFromServer(fsh, ssh);
   263 	test(r==KErrNone);
   264 
   265 	TBuf8<100> rbuf;
   266 	r=file.Read(0,rbuf);
   267 	test(r==KErrNone);
   268 
   269 	// server should write KTestData1 ("Server Write Server Write") to file
   270 	r=rbuf.CompareF(KTestData1);
   271 	test(r==KErrNone);
   272 
   273 	// reset to pos 0
   274 	TInt pos = 0;
   275 	r = file.Seek(ESeekStart, pos);
   276 	test(r==KErrNone);
   277 	
   278 	// overwrite with KTestData ("Client Write Client Write") to file
   279 	r=file.Write(KTestData());
   280 	test(r==KErrNone);
   281 	rbuf.FillZ();
   282 	r=file.Read(0,rbuf);
   283 	test(r==KErrNone);
   284 	r=rbuf.CompareF(KTestData);
   285 	test(r==KErrNone);
   286 
   287 // !!! Disable platform security tests until we get the new APIs
   288 //	r=file.Rename(_L("\\newname.txt"));
   289 //	test(r==KErrPermissionDenied);
   290 
   291 	test.Next(_L("RFile::Name()"));
   292 
   293 	// retrieve the file name from the server
   294 	TFileName name;
   295 	r = file.Name(name);
   296 	test(r==KErrNone);
   297 	r = name.Compare(KSvrFileName());
   298 	test(r==0);
   299 	
   300 
   301 	test.Next(_L("RFile::Duplicate()"));
   302 	RFile file2;
   303 	r = file2.Duplicate(file);
   304 	test(r==0);
   305 
   306 
   307 	TInt pos1 = 0;
   308 	r = file.Seek(ESeekCurrent, pos1);
   309 	test(r==KErrNone);
   310 	TInt pos2 = 0;
   311 	r = file2.Seek(ESeekCurrent, pos2);
   312 	test(r==KErrNone);
   313 	test(pos1 == pos2);
   314 
   315 	// close the parent file and check we can still use the duplicated one.
   316 	file.Close();
   317 
   318 	rbuf.FillZ();
   319 
   320 	// reset to pos 0
   321 	pos2 = 0;
   322 	r = file2.Seek(ESeekStart, pos2);
   323 	test(r==KErrNone);
   324 	
   325 	r=file2.Read(0,rbuf);
   326 	test(r==KErrNone);
   327 	r=rbuf.CompareF(KTestData);
   328 	test(r==KErrNone);
   329 	file2.Close();
   330 	}
   331 
   332 
   333 // Request a test file & test what we can do with it
   334 // i.e CFileMan::Copy, RFile::Rename() and RFs:Delete()
   335 //
   336 void RequestFileTest()
   337 	{
   338 	TInt r;
   339 
   340 	RFs fs;
   341 	r=fs.Connect();
   342 	test(r==KErrNone);
   343 	r=fs.ShareProtected();
   344 	test(r==KErrNone);
   345 
   346 	
   347 	// define a filename in our private path
   348 	TPath newPath;
   349 	fs.PrivatePath(newPath);
   350 	TFileName newFileName;
   351 	newFileName = newPath;
   352 	newFileName.Append(_L("newname.txt"));
   353 	
   354 	r=fs.CreatePrivatePath(drivenum);
   355 	test(r==KErrNone);
   356 	r=fs.SetSessionToPrivate(drivenum);
   357 
   358 	RFileHandleSharer handsvr;
   359 	do
   360 		{
   361 		r=handsvr.Connect();
   362 		}
   363 	while(r==KErrNotFound);
   364 	test(r==KErrNone);
   365 
   366 	r=handsvr.SetTestDrive(drivenum);
   367 	test(r==KErrNone);
   368 
   369 	// Next verify that we can copy a file retrieved from the server
   370 	// using CFileMan::Copy()
   371 
   372 	test.Next(_L("CFileMan::Copy()"));
   373 
   374 	TInt ssh;
   375 	TInt fsh = handsvr.GetFileHandle2(ssh, EFileRead);
   376 	test (fsh >= 0);
   377 
   378 	RFile file;
   379 	r=file.AdoptFromServer(fsh, ssh);
   380 	test(r==KErrNone);
   381 
   382 
   383 	CFileMan* fileMan = NULL;
   384 	TRAP(r, fileMan = CFileMan::NewL(fs));
   385 	test(r == KErrNone && fileMan != NULL);
   386 
   387 	// copy to file, overwrite 
   388 	r = fileMan->Copy(file, newFileName, CFileMan::EOverWrite);
   389 	test(r == KErrNone);
   390 
   391 	// copy to file, don't overwrite 
   392 	r = fileMan->Copy(file, newFileName, 0);	
   393 	test(r == KErrAlreadyExists);
   394 
   395 	// copy to file, overwrite
   396 	r = fileMan->Copy(file, newFileName, CFileMan::EOverWrite);
   397 	test(r == KErrNone);
   398 
   399 	// copy to path
   400 	r = fileMan->Copy(file, newPath, CFileMan::EOverWrite);	
   401 	test(r == KErrNone);
   402 
   403 	// copy to file, overwrite, asynchnonous
   404 	TRequestStatus status(KRequestPending);
   405 	r = fileMan->Copy(file, newFileName, CFileMan::EOverWrite, status);
   406 	test(r == KErrNone);
   407 	User::WaitForRequest(status);
   408 	test(status == KErrNone);
   409 
   410 
   411 	// Negative tests...
   412 	TPath newLongPath;
   413 	TInt len;
   414 
   415 	// copy to very long but valid path (no filename) which will overflow
   416 	// when the filename is appended to it
   417 	newLongPath = newPath;
   418 	for (len=newLongPath.Length(); len< KMaxPath -4; len = newLongPath.Length())
   419 		newLongPath.Append(_L("x\\"));
   420 	r = fileMan->Copy(file, newLongPath, CFileMan::EOverWrite);	
   421 	test(r == KErrBadName);
   422 
   423 	// copy to very long but valid path (no filename) which will overflow
   424 	// when drive letter is pre-pended to it
   425 	newLongPath = newPath;
   426 	for (len=newLongPath.Length(); len< KMaxPath -2; len = newLongPath.Length())
   427 		newLongPath.Append(_L("x\\"));
   428 	r = fileMan->Copy(file, newLongPath, CFileMan::EOverWrite);	
   429 	test(r == KErrBadName);
   430 
   431 	// copy to very long but valid path and filename which will overflow
   432 	// when drive letter is pre-pended to it
   433 	newLongPath.Append(_L("y"));
   434 	r = fileMan->Copy(file, newLongPath, CFileMan::EOverWrite);	
   435 	test(r == KErrBadName);
   436 
   437 	// copy to badly formed path 
   438 	newLongPath = newPath;
   439 	newLongPath.Append(_L("\\y"));
   440 	r = fileMan->Copy(file, newLongPath, CFileMan::EOverWrite);	
   441 	test(r == KErrBadName);
   442 
   443 	// copy to correctly formed path which doesn't exist
   444 	newLongPath = newPath;
   445 	newLongPath.Append(_L("x\\y\\z"));
   446 	r = fileMan->Copy(file, newLongPath, CFileMan::EOverWrite);	
   447 	test(r == KErrPathNotFound);
   448 
   449 	delete fileMan; fileMan = NULL;
   450 
   451 	file.Close();
   452 
   453 	
   454 	// First verify that we CANNOT rename a file retrieved from the server
   455 	// that has not been opened in EFileShareExclusive mode
   456 
   457 	test.Next(_L("negative test of RFile::Rename()"));
   458 
   459 	fsh = handsvr.GetFileHandle2(ssh, TFileMode(EFileShareAny | EFileWrite));
   460 	test (fsh >= 0);
   461 
   462 	// adopt the file handle from FHServer
   463 	r=file.AdoptFromServer(fsh, ssh);
   464 	test(r==KErrNone);
   465 
   466 	r=file.Rename(_L("newname.txt"));
   467 	test(r==KErrPermissionDenied || r==KErrAccessDenied);
   468 
   469 	// delete the file before we try to rename anything to it
   470 	r = fs.Delete(newFileName);
   471 	test(r == KErrNone || r == KErrNotFound);
   472 
   473 	r=file.Rename(newFileName);
   474 	test(r==KErrPermissionDenied || r==KErrAccessDenied);
   475 
   476 	file.Close();
   477 
   478 
   479 	// Next verify that we CAN rename a file retrieved from the server
   480 	// that HAS been opened in EFileShareExclusive mode
   481 
   482 	test.Next(_L("RFile::Rename()"));
   483 
   484 	fsh = handsvr.GetFileHandle2(ssh, EFileWrite);
   485 	test (fsh >= 0);
   486 
   487 	r=file.AdoptFromServer(fsh, ssh);
   488 	test(r==KErrNone);
   489 
   490 	// delete the file before we try to rename anything to it
   491 	r = fs.Delete(newFileName);
   492 	test(r == KErrNone || r == KErrNotFound);
   493 
   494 	r=file.Rename(newFileName);
   495 	test(r==KErrNone);
   496 
   497 	file.Close();
   498 
   499 	// Next verify that we can delete the file (which should now 
   500 	// have been moved to our private directory)
   501 	test.Next(_L("RFs::Delete()"));
   502 	r = fs.Delete(newFileName);
   503 	test(r == KErrNone);
   504 
   505 	handsvr.Close();
   506 
   507 	fs.Close();
   508 	}
   509 
   510 //
   511 // Pass an open file to the server 
   512 // The server will use RFile::AdoptFromClient()
   513 //
   514 GLDEF_C void PassFile()
   515 	{
   516 	RFs fs;
   517 	TInt r=fs.Connect();
   518 	test(r==KErrNone);
   519 
   520 	// Check the number of open file handles
   521 	TInt resCount = fs.ResourceCount();
   522 	test(resCount == 0);
   523 
   524 	r=fs.ShareProtected();
   525 	test(r==KErrNone);
   526 
   527 	r=fs.CreatePrivatePath(drivenum);
   528 	test(r==KErrNone);
   529 	r=fs.SetSessionToPrivate(drivenum);
   530 	
   531 	
   532 	RFile file1;
   533 	r=file1.Replace(fs,KCliFileName,EFileWrite);
   534 	test(r==KErrNone);
   535 	r=file1.Write(KTestData());
   536 	test(r==KErrNone);
   537 	file1.Close();
   538 
   539 	RFileHandleSharer handsvr;
   540 	do
   541 		{
   542 		r=handsvr.Connect();
   543 		}
   544 	while(r==KErrNotFound);
   545 	test(r==KErrNone);
   546 
   547 	r=handsvr.SetTestDrive(drivenum);
   548 	test(r==KErrNone);
   549 
   550 	r=fs.SetSessionToPrivate(drivenum);
   551 	test(r==KErrNone);
   552 
   553 	r=file1.Open(fs,KCliFileName,EFileRead);
   554 	test(r==KErrNone);
   555 	
   556 	// pass the file handle to FHServer
   557 	test.Next(_L("RFile::TransferToServer()"));
   558 
   559 	TIpcArgs ipcArgs;
   560 	file1.TransferToServer(ipcArgs, 0, 1);
   561 
   562 	r = handsvr.PassFileHandle(ipcArgs);
   563 
   564 
   565 	// verify that the original file handle's position is unchanged
   566 	TInt pos = 0;
   567 	r = file1.Seek(ESeekCurrent, pos);
   568 	test(r==KErrNone);
   569 	test(pos == 0);
   570 
   571 	// make sure we can still use it
   572 	TBuf8<100> rbuf;
   573 	r=file1.Read(0,rbuf);
   574 	test(r==KErrNone);
   575 
   576 	// Close the file
   577 	file1.Close();	
   578 
   579 	handsvr.Close();
   580 
   581 	r=fs.MkDir(_L("C:\\mdir"));
   582 	test(r==KErrNone || r==KErrAlreadyExists);
   583 	
   584 	// Check the number of open file handles
   585 	resCount = fs.ResourceCount();
   586 	test(resCount == 0);
   587 
   588 	fs.Close();
   589 	}
   590 
   591 
   592 //
   593 // Pass an invalid file handle to the server 
   594 // The server will use RFile::AdoptFromClient()
   595 //
   596 GLDEF_C void PassInvalidFile()
   597 	{
   598 
   599 	RFs fs;
   600 	TInt r=fs.Connect();
   601 	test(r==KErrNone);
   602 
   603 	// Check the number of open file handles
   604 	TInt resCount = fs.ResourceCount();
   605 	test(resCount == 0);
   606 
   607 	r=fs.ShareProtected();
   608 	test(r==KErrNone);
   609 
   610 	r=fs.CreatePrivatePath(drivenum);
   611 	test(r==KErrNone);
   612 	r=fs.SetSessionToPrivate(drivenum);
   613 	
   614 	
   615 	RFile file1;
   616 	r=file1.Replace(fs,KCliFileName,EFileWrite);
   617 	test(r==KErrNone);
   618 	r=file1.Write(KTestData());
   619 	test(r==KErrNone);
   620 	file1.Close();
   621 
   622 	RFileHandleSharer handsvr;
   623 	do
   624 		{
   625 		r=handsvr.Connect();
   626 		}
   627 	while(r==KErrNotFound);
   628 	test(r==KErrNone);
   629 
   630 	r=handsvr.SetTestDrive(drivenum);
   631 	test(r==KErrNone);
   632 
   633 	r=fs.SetSessionToPrivate(drivenum);
   634 	test(r==KErrNone);
   635 
   636 	r=file1.Open(fs,KCliFileName,EFileRead);
   637 	test(r==KErrNone);
   638 	
   639 	// check the resoure count - there should be 1 open file handle
   640 	resCount = fs.ResourceCount();
   641 	test(resCount == 1);
   642 
   643 	// pass an invalid file handle to FHServer
   644 	// by overwriting the IPC slots
   645 	test.Next(_L("PassInvalidFileHandle - RFile::TransferToServer()"));
   646 
   647 	TIpcArgs ipcArgs;
   648 
   649 	// Pass a bad RFs handle
   650 	file1.TransferToServer(ipcArgs, 0, 1);
   651 
   652 	// check the resoure count - there should be 2 open file handles
   653 	resCount = fs.ResourceCount();
   654 	test(resCount == 2);
   655 
   656 	ipcArgs.Set(0, 0);	// invalidate the RFs handle
   657 	r = handsvr.PassInvalidFileHandle(ipcArgs);
   658 	test (r == KErrBadHandle);
   659 
   660 	// Pass a bad RFile handle
   661 	file1.TransferToServer(ipcArgs, 0, 1);
   662 
   663 	// check the resoure count - there should be 3 open file handles
   664 	resCount = fs.ResourceCount();
   665 	test(resCount == 3);
   666 
   667 	ipcArgs.Set(1, 0);	// invalidate the RFile handle
   668 	r = handsvr.PassInvalidFileHandle(ipcArgs);
   669 	test (r == KErrBadHandle);
   670 
   671 	// Pass bad RFs and RFile handles
   672 	file1.TransferToServer(ipcArgs, 0, 1);
   673 
   674 	// check the resoure count - there should be 4 open file handles
   675 	resCount = fs.ResourceCount();
   676 	test(resCount == 4);
   677 
   678 
   679 	ipcArgs.Set(0, 0);	// invalidate the RFs handle
   680 	ipcArgs.Set(1, 0);	// invalidate the RFile handle
   681 	r = handsvr.PassInvalidFileHandle(ipcArgs);
   682 	test (r == KErrBadHandle);
   683 
   684 	// Close the file
   685 	handsvr.Close();
   686 	file1.Close();	
   687 
   688 	// Check the number of open file handles
   689 	resCount = fs.ResourceCount();
   690 	test(resCount == 3);
   691 
   692 	fs.Close();
   693 	}
   694 
   695 
   696 // Pass RFs/RFile handles to the server using
   697 // process parameter slots (RProcess::SetParameter()),
   698 // resume the process and wait for it to read the file...
   699 // The server will use RFile::AdoptFromCreator()
   700 GLDEF_C void PassFile(RProcess& aProcess)
   701 	{
   702 	
   703 	RFs fs;
   704 	TInt r=fs.Connect();
   705 	test(r==KErrNone);
   706 
   707 	// Check the number of open file handles
   708 	TInt resCount = fs.ResourceCount();
   709 	test(resCount == 0);
   710 
   711 	r=fs.ShareProtected();
   712 	test(r==KErrNone);
   713 
   714 	r=fs.CreatePrivatePath(drivenum);
   715 	test(r==KErrNone);
   716 	r=fs.SetSessionToPrivate(drivenum);
   717 	
   718 	
   719 	RFile file1;
   720 	r=file1.Replace(fs,KCliFileName,EFileWrite);
   721 	test(r==KErrNone);
   722 	r=file1.Write(KTestData());
   723 	test(r==KErrNone);
   724 	file1.Close();
   725 
   726 	r=file1.Open(fs, KCliFileName, EFileWrite);
   727 
   728 	test(r==KErrNone);
   729 	
   730 	// NB slot 0 is reserved for the command line
   731 
   732 	test.Next(_L("RFile::TransferToProcess()"));
   733 
   734 	r = file1.TransferToProcess(aProcess, 1, 2);
   735 
   736 	r = aProcess.SetParameter(3, drivenum);
   737 	test(r==KErrNone);
   738 
   739 	r=fs.SetSessionToPrivate(drivenum);
   740 	test(r==KErrNone);
   741 
   742 	// make sure we can still read from the file
   743 	TBuf8<100> rbuf;
   744 	r=file1.Read(0,rbuf);
   745 	test(r==KErrNone);
   746 	r=rbuf.CompareF(KTestData());
   747 	test(r==KErrNone);
   748 	file1.Close();
   749 
   750 	r=fs.MkDir(_L("C:\\mdir"));
   751 	test(r==KErrNone || r==KErrAlreadyExists);
   752 	
   753 	// Check the number of open file handles - 
   754 	// should be 1 (the one duplicated for the other process)
   755 	resCount = fs.ResourceCount();
   756 	test(resCount == 1);
   757 
   758 	fs.Close();
   759 
   760 	// Start the server thread
   761 	aProcess.Resume();
   762 
   763 
   764 
   765 	// connect to the server
   766 	RFileHandleSharer handsvr;
   767 	do
   768 		{
   769 		r=handsvr.Connect();
   770 		}
   771 	while(r==KErrNotFound);
   772 	test(r==KErrNone);
   773 
   774 
   775 	r=handsvr.SetTestDrive(drivenum);
   776 	test(r==KErrNone);
   777 
   778 	// wait for server to read the file
   779 	r = handsvr.PassFileHandleProcess();
   780 	test (r == KErrNone);
   781 	
   782 	handsvr.Close();
   783 	}
   784 
   785 
   786 
   787 GLDEF_C void CallTestsL(void)
   788     {
   789 	RFs::CharToDrive(gDriveToTest,drivenum);
   790 
   791 	// make sure the session path exists
   792 	RFs fs;
   793 	TInt r = fs.Connect();
   794 	test(r==KErrNone);
   795 
   796 	TFileName sessionp;
   797 	fs.SessionPath(sessionp);
   798 	r = fs.MkDirAll(sessionp);
   799 	test(r==KErrNone || r==KErrAlreadyExists);
   800 	fs.Close();
   801 
   802 	// Remember the number of open handles. Just for a sanity check ....
   803 	TInt start_thc, start_phc;
   804 	RThread().HandleCount(start_phc, start_thc);
   805 	test.Printf(_L("Handles: start_phc %d, start_thc %d\n"), start_phc, start_thc);
   806 
   807 	//create test server
   808 	RProcess p;
   809 	r = p.Create(_L("FHServer.exe"), KNullDesC);
   810 	test(r==KErrNone);
   811 
   812 	// RFile::Duplicate() tests
   813 	Duplicate();
   814 
   815 	// Pass RFs/RFile handles to the server using RFile::TransferToProcess()
   816 	// process parameter slots (RProcess::SetParameter()),
   817 	// resume the server process and wait for it to read the file...
   818 	PassFile(p);
   819 	
   820 	// Transfer the file handle to FHServer using RFile::TransferToServer(). 
   821 	// Get FHServer to transfer it to FHServer2
   822 	PassFile();
   823 
   824 	
   825 	// Get an open writeable file from FHServer2 via FHServer 
   826 	// using RFile::AdoptFromServer()
   827 	RequestFileWrite();
   828 
   829 	// Deprecated RFile::Adopt() test
   830 	RequestFileDeprecatedAdopt();
   831 
   832 	// negative test 
   833 	// Pass an invalid file handle to the server 
   834 	PassInvalidFile();
   835 
   836 
   837 	// Get an open file handle from FHServer2 via FHServer 
   838 	// and test whether we can copy/rename/delete it etc
   839 	// be able to rename it.
   840 	RequestFileTest();
   841 
   842 	// stop the servers
   843 	RFileHandleSharer handsvr;
   844 	r=handsvr.Connect();
   845 	test(r==KErrNone);
   846 	r = handsvr.Exit();
   847 	test(r == KErrNone);
   848 	handsvr.Close();
   849 	
   850 	// delete the test file
   851 	RFs cleanupfs;
   852 	r=cleanupfs.Connect();
   853 	test(r==KErrNone);
   854 	r=cleanupfs.SetSessionToPrivate(drivenum);
   855 	test(r==KErrNone);
   856 	r=cleanupfs.Delete(KCliFileName);
   857 	test(r==KErrNone || r==KErrNotFound);
   858 	cleanupfs.Close();
   859 
   860 
   861 	// wait for server process to end
   862 	TRequestStatus status;
   863 	p.Logon(status);
   864 	User::WaitForRequest(status);
   865 	test (status == KErrNone);
   866 
   867 	// cleanup
   868 	p.Close();
   869 
   870 	// Sanity check for open handles
   871 	TInt end_thc, end_phc;
   872 	RThread().HandleCount(end_phc, end_thc);
   873 	test.Printf(_L("Handles: end_phc %d, end_thc %d\n"), end_phc, end_thc);
   874 
   875 	test(start_thc == end_thc);
   876 	test(start_phc == end_phc);
   877 	
   878 	// and also for pending requests ...
   879 	test(RThread().RequestCount() == 0);
   880 	
   881 	
   882 	RDebug::Print(_L("End Of Tests"));
   883 	}
   884 	
   885 
   886