os/security/cryptomgmtlibs/securitytestfw/test/testutil/server/testutilsession.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
/*
sl@0
     2
* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     3
* All rights reserved.
sl@0
     4
* This component and the accompanying materials are made available
sl@0
     5
* under the terms of the License "Eclipse Public License v1.0"
sl@0
     6
* which accompanies this distribution, and is available
sl@0
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     8
*
sl@0
     9
* Initial Contributors:
sl@0
    10
* Nokia Corporation - initial contribution.
sl@0
    11
*
sl@0
    12
* Contributors:
sl@0
    13
*
sl@0
    14
* Description: 
sl@0
    15
* TestUtil - server implementation
sl@0
    16
*
sl@0
    17
*/
sl@0
    18
sl@0
    19
sl@0
    20
/**
sl@0
    21
 @file 
sl@0
    22
 @test
sl@0
    23
 @internalComponent
sl@0
    24
*/
sl@0
    25
sl@0
    26
#include "testutilserver.h"
sl@0
    27
#include "testutilsession.h"
sl@0
    28
#include "testutilclientserver.h"
sl@0
    29
sl@0
    30
// Timer implementation
sl@0
    31
CGenericTimer* CGenericTimer::NewL(MTimeoutClient& aClient)
sl@0
    32
	{
sl@0
    33
	CGenericTimer* self = new(ELeave) CGenericTimer(aClient);
sl@0
    34
	CleanupStack::PushL(self);
sl@0
    35
	self->ConstructL(); // calls CTimer::Construct
sl@0
    36
	CleanupStack::Pop(self);
sl@0
    37
	return self;
sl@0
    38
	}
sl@0
    39
sl@0
    40
CGenericTimer::CGenericTimer(MTimeoutClient& aClient)
sl@0
    41
	: CTimer(-1), iClient(aClient)
sl@0
    42
	{
sl@0
    43
	CActiveScheduler::Add(this);
sl@0
    44
	}
sl@0
    45
sl@0
    46
void CGenericTimer::RunL()
sl@0
    47
	{
sl@0
    48
	// When the timeout expires, then call the client's handler
sl@0
    49
	iClient.HandleTimeout();
sl@0
    50
	};
sl@0
    51
sl@0
    52
// file detector implementation
sl@0
    53
CTestFileDetector* CTestFileDetector::NewL(const RMessage2& aMessage, RFs& aFs)
sl@0
    54
	{
sl@0
    55
	CTestFileDetector* self = new (ELeave) CTestFileDetector(aMessage, aFs);
sl@0
    56
	CleanupStack::PushL(self);
sl@0
    57
	self->ConstructL();
sl@0
    58
	CleanupStack::Pop(self);
sl@0
    59
	return self;
sl@0
    60
	}
sl@0
    61
sl@0
    62
CTestFileDetector::CTestFileDetector(const RMessage2& aMessage, RFs& aFs)
sl@0
    63
	:CActive(EPriorityNormal), iFs(aFs), iMessage(aMessage)
sl@0
    64
	{
sl@0
    65
	iTimeInterval = iMessage.Int1();
sl@0
    66
	CActiveScheduler::Add(this);
sl@0
    67
	}
sl@0
    68
sl@0
    69
CTestFileDetector::~CTestFileDetector()
sl@0
    70
	{
sl@0
    71
	Cancel();
sl@0
    72
	delete iTimer;
sl@0
    73
	delete iFileName;
sl@0
    74
	}
sl@0
    75
sl@0
    76
void CTestFileDetector::ConstructL()
sl@0
    77
	{
sl@0
    78
	if (iTimeInterval!=0)
sl@0
    79
		{
sl@0
    80
		iTimer=CGenericTimer::NewL(*this);
sl@0
    81
		}
sl@0
    82
	iFileName = CTestUtilSessionCommon::AllocateInputBufferLC(iMessage, 0);
sl@0
    83
	CleanupStack::Pop();
sl@0
    84
	}
sl@0
    85
sl@0
    86
void CTestFileDetector::DetectFile()
sl@0
    87
	{
sl@0
    88
	if (!iTimer)
sl@0
    89
		{
sl@0
    90
		CheckAndComplete();
sl@0
    91
		}
sl@0
    92
	else
sl@0
    93
		{
sl@0
    94
		TEntry entry;
sl@0
    95
		TInt err=iFs.Entry(iFileName->Des(), entry);
sl@0
    96
		if (err == KErrNone)
sl@0
    97
			{
sl@0
    98
			TPckgC<TBool> exists(ETrue);
sl@0
    99
			iMessage.WriteL(2, exists);
sl@0
   100
			iMessage.Complete(KErrNone);
sl@0
   101
			}
sl@0
   102
		else
sl@0
   103
			{
sl@0
   104
			iTimer->After(iTimeInterval*1000);
sl@0
   105
			iFs.NotifyChange(ENotifyFile, 
sl@0
   106
							iStatus, 
sl@0
   107
							iFileName->Des());
sl@0
   108
			SetActive();			
sl@0
   109
			}
sl@0
   110
		}
sl@0
   111
	}
sl@0
   112
sl@0
   113
void CTestFileDetector::RunL()
sl@0
   114
	{
sl@0
   115
	if (iTimer)
sl@0
   116
		{
sl@0
   117
		iTimer->Cancel();
sl@0
   118
		}
sl@0
   119
	CheckAndComplete();
sl@0
   120
	}
sl@0
   121
sl@0
   122
void CTestFileDetector::DoCancel()
sl@0
   123
	{
sl@0
   124
	iFs.NotifyChangeCancel(iStatus);
sl@0
   125
	}
sl@0
   126
sl@0
   127
void CTestFileDetector::HandleTimeout()
sl@0
   128
	{
sl@0
   129
	Cancel();
sl@0
   130
	CheckAndComplete();
sl@0
   131
	}
sl@0
   132
sl@0
   133
void CTestFileDetector::CheckAndComplete()
sl@0
   134
	{
sl@0
   135
	TEntry entry;
sl@0
   136
	TInt err=iFs.Entry(iFileName->Des(), entry);
sl@0
   137
	if (err == KErrNone)
sl@0
   138
		{
sl@0
   139
		TPckgC<TBool> exists(ETrue);
sl@0
   140
		iMessage.WriteL(2, exists);
sl@0
   141
		iMessage.Complete(KErrNone);
sl@0
   142
		}
sl@0
   143
	else if (err == KErrNotFound 
sl@0
   144
			|| err == KErrPathNotFound
sl@0
   145
			|| err == KErrNotReady 
sl@0
   146
			|| err == KErrCorrupt)
sl@0
   147
		{
sl@0
   148
		TPckgC<TBool> exists(EFalse);
sl@0
   149
		iMessage.WriteL(2, exists);
sl@0
   150
		iMessage.Complete(KErrNone);
sl@0
   151
		}
sl@0
   152
	else
sl@0
   153
		{
sl@0
   154
		iMessage.Complete(err);
sl@0
   155
		}
sl@0
   156
	}
sl@0
   157
sl@0
   158
// CTestUtilSession Implementation
sl@0
   159
CTestUtilSession::CTestUtilSession()
sl@0
   160
	{
sl@0
   161
	}
sl@0
   162
sl@0
   163
CTestUtilSession::~CTestUtilSession()
sl@0
   164
	{
sl@0
   165
	Server().DropSession();
sl@0
   166
	for (TInt i = 0;i < iLockedFileHandles.Count(); i++)
sl@0
   167
		{
sl@0
   168
		iLockedFileHandles[i].Close();
sl@0
   169
		}
sl@0
   170
	iLockedFileHandles.Close();
sl@0
   171
	
sl@0
   172
	delete iFileWatcher;
sl@0
   173
	delete iDetector;
sl@0
   174
	}
sl@0
   175
	
sl@0
   176
void CTestUtilSession::CreateL()
sl@0
   177
 	{
sl@0
   178
	Server().AddSession();
sl@0
   179
  	}
sl@0
   180
sl@0
   181
_LIT(KBP, ":\\");
sl@0
   182
_LIT(KFAT,"Fat");
sl@0
   183
	
sl@0
   184
void CTestUtilSession::ServiceL(const RMessage2& aMessage)
sl@0
   185
	{
sl@0
   186
	switch (aMessage.Function())
sl@0
   187
		{
sl@0
   188
		case ECopy:
sl@0
   189
			{
sl@0
   190
			HBufC* source = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0);
sl@0
   191
			HBufC* destination = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,1);
sl@0
   192
sl@0
   193
			TInt err = Server().FileMan().Copy(*source, *destination, CFileMan::ERecurse | CFileMan::EOverWrite);
sl@0
   194
			if (err == KErrNone)
sl@0
   195
				{
sl@0
   196
				// Turn off the read only attributes
sl@0
   197
				TTime time(0); // must specify 0, or a valid time, otherwise sets time to a random value and causes -6/-21 errors
sl@0
   198
				err = Server().FileMan().Attribs(*destination, 0, KEntryAttReadOnly, time, CFileMan::ERecurse);
sl@0
   199
				}
sl@0
   200
			
sl@0
   201
			CleanupStack::PopAndDestroy(destination);
sl@0
   202
			CleanupStack::PopAndDestroy(source);
sl@0
   203
sl@0
   204
			aMessage.Complete(err);
sl@0
   205
			break;
sl@0
   206
			}
sl@0
   207
		case EMove:
sl@0
   208
			{
sl@0
   209
			HBufC* source = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0);
sl@0
   210
			HBufC* destination = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,1);
sl@0
   211
sl@0
   212
			TInt err = Server().FS().Rename(*source,*destination);
sl@0
   213
			if (err == KErrNone)
sl@0
   214
				{
sl@0
   215
				// Turn off the read only attributes
sl@0
   216
				TTime time(0); // must specify 0, or a valid time, otherwise sets time to a random value and causes -6/-21 errors
sl@0
   217
				err = Server().FileMan().Attribs(*destination, 0, KEntryAttReadOnly, time, CFileMan::ERecurse);
sl@0
   218
				}
sl@0
   219
			
sl@0
   220
			CleanupStack::PopAndDestroy(destination);
sl@0
   221
			CleanupStack::PopAndDestroy(source);
sl@0
   222
			
sl@0
   223
			aMessage.Complete(err);
sl@0
   224
			break;
sl@0
   225
			}
sl@0
   226
		case EDelete:
sl@0
   227
			{
sl@0
   228
			HBufC* fileName = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0);
sl@0
   229
			TEntry entry;
sl@0
   230
			TInt err = Server().FS().Entry(*fileName, entry);
sl@0
   231
			if (err == KErrNone)
sl@0
   232
				{
sl@0
   233
				if (entry.IsDir())
sl@0
   234
					{
sl@0
   235
					TPath pathName(*fileName);
sl@0
   236
					if (pathName[pathName.Length() - 1] != KPathDelimiter)
sl@0
   237
						{
sl@0
   238
						pathName.Append(KPathDelimiter);
sl@0
   239
						}
sl@0
   240
					err = Server().FileMan().RmDir(pathName);
sl@0
   241
					}
sl@0
   242
				else
sl@0
   243
					{
sl@0
   244
					err = Server().FS().Delete(*fileName);
sl@0
   245
					}
sl@0
   246
				}
sl@0
   247
			CleanupStack::PopAndDestroy(fileName);
sl@0
   248
			
sl@0
   249
			aMessage.Complete(err);
sl@0
   250
			break;
sl@0
   251
			}
sl@0
   252
		case ERmDir:
sl@0
   253
			{
sl@0
   254
			HBufC* fileName = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0);
sl@0
   255
			TParsePtrC parsePtr(*fileName);
sl@0
   256
			if(parsePtr.IsRoot())
sl@0
   257
				{
sl@0
   258
				User::Leave(KErrAccessDenied);
sl@0
   259
				}
sl@0
   260
			TInt err = Server().FileMan().RmDir(*fileName);
sl@0
   261
			CleanupStack::PopAndDestroy(fileName);
sl@0
   262
			
sl@0
   263
			aMessage.Complete(err);
sl@0
   264
			break;
sl@0
   265
			}
sl@0
   266
		case EMkDirAll:
sl@0
   267
			{
sl@0
   268
			HBufC* fileName = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0);
sl@0
   269
			TInt err = Server().FS().MkDirAll(*fileName);
sl@0
   270
			CleanupStack::PopAndDestroy(fileName);
sl@0
   271
			
sl@0
   272
			aMessage.Complete(err);
sl@0
   273
			break;
sl@0
   274
			}
sl@0
   275
		case EFileExists:
sl@0
   276
			{			
sl@0
   277
			delete iDetector;
sl@0
   278
			iDetector=CTestFileDetector::NewL(aMessage,
sl@0
   279
												Server().FS());			
sl@0
   280
			iDetector->DetectFile();
sl@0
   281
			break;
sl@0
   282
			}
sl@0
   283
		case ELock:
sl@0
   284
			{
sl@0
   285
			HBufC* fileName = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0);
sl@0
   286
			RFile lockFile;
sl@0
   287
			TInt err = lockFile.Open(Server().FS(), *fileName, EFileWrite);
sl@0
   288
			if (err == KErrNone)
sl@0
   289
				iLockedFileHandles.Append(lockFile);
sl@0
   290
sl@0
   291
			CleanupStack::PopAndDestroy(fileName);			
sl@0
   292
			aMessage.Complete(err);
sl@0
   293
			break;
sl@0
   294
			}			
sl@0
   295
		case EUnlock:
sl@0
   296
			{
sl@0
   297
			HBufC* fileName = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0);
sl@0
   298
			TInt err = KErrNotFound;
sl@0
   299
			TFileName lockedFileName;
sl@0
   300
			for (TInt i = 0; i < iLockedFileHandles.Count() && err;i++)
sl@0
   301
				{
sl@0
   302
				TInt err2 = iLockedFileHandles[i].FullName(lockedFileName);
sl@0
   303
				User::LeaveIfError(err2);
sl@0
   304
				if (lockedFileName.MatchF(*fileName) != KErrNotFound)
sl@0
   305
					{
sl@0
   306
					iLockedFileHandles[i].Close();
sl@0
   307
					iLockedFileHandles.Remove(i);
sl@0
   308
					err = KErrNone;
sl@0
   309
					}
sl@0
   310
				}
sl@0
   311
			CleanupStack::PopAndDestroy(fileName);			
sl@0
   312
			aMessage.Complete(err);
sl@0
   313
			break;
sl@0
   314
			}
sl@0
   315
			case EFormat:
sl@0
   316
			{
sl@0
   317
			TInt drive = aMessage.Int0();
sl@0
   318
			TBool formatFatOnly = aMessage.Int1();
sl@0
   319
			TChar aDriveChar;
sl@0
   320
			User::LeaveIfError(Server().FS().DriveToChar(drive, aDriveChar));
sl@0
   321
			TBuf<3> bfDrv;
sl@0
   322
			bfDrv.Append(aDriveChar);
sl@0
   323
			bfDrv.Append(KBP);
sl@0
   324
	
sl@0
   325
			RFormat format;
sl@0
   326
			TInt count;
sl@0
   327
			User::LeaveIfError(format.Open(Server().FS(), bfDrv, EHighDensity, count));
sl@0
   328
			CleanupClosePushL(format);
sl@0
   329
			
sl@0
   330
			if (formatFatOnly)
sl@0
   331
   				{
sl@0
   332
   				User::LeaveIfError(format.Next(count));
sl@0
   333
   				}
sl@0
   334
			else
sl@0
   335
				{
sl@0
   336
				while (count > 0)
sl@0
   337
					{
sl@0
   338
					User::LeaveIfError(format.Next(count));
sl@0
   339
					}
sl@0
   340
				}
sl@0
   341
				
sl@0
   342
			CleanupStack::PopAndDestroy(&format);
sl@0
   343
			aMessage.Complete(KErrNone);
sl@0
   344
			break;
sl@0
   345
			}
sl@0
   346
		case EMount:
sl@0
   347
			{
sl@0
   348
			TInt drive = aMessage.Int0();
sl@0
   349
			User::LeaveIfError(Server().FS().Connect());
sl@0
   350
			//Mount the drive synchronizely to make sure the drive is ready for the next operation
sl@0
   351
			User::LeaveIfError(Server().FS().MountFileSystem(KFAT, drive, ETrue));
sl@0
   352
			aMessage.Complete(KErrNone);
sl@0
   353
			break;
sl@0
   354
			}
sl@0
   355
		case EUnMount:
sl@0
   356
			{
sl@0
   357
			TInt drive = aMessage.Int0();
sl@0
   358
			TFileName fsName;
sl@0
   359
			User::LeaveIfError(Server().FS().FileSystemName(fsName, drive));
sl@0
   360
			User::LeaveIfError(Server().FS().DismountFileSystem(fsName, drive));
sl@0
   361
			aMessage.Complete(KErrNone);
sl@0
   362
			break;
sl@0
   363
			}
sl@0
   364
		case ESetReadOnly:
sl@0
   365
			{
sl@0
   366
			HBufC* fileName = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0);
sl@0
   367
			TInt setReadOnly = aMessage.Int1();
sl@0
   368
			TUint setmask;
sl@0
   369
			TUint clearmask;
sl@0
   370
			if (setReadOnly)
sl@0
   371
				{
sl@0
   372
				// Setting read only attribute
sl@0
   373
				setmask = KEntryAttReadOnly;
sl@0
   374
				clearmask = 0;
sl@0
   375
				}
sl@0
   376
			else
sl@0
   377
				{
sl@0
   378
				// Clearing read only attribute
sl@0
   379
				setmask = 0;
sl@0
   380
				clearmask = KEntryAttReadOnly;				
sl@0
   381
				}
sl@0
   382
			
sl@0
   383
			// Turn off the read only attributes
sl@0
   384
			TTime time(0);
sl@0
   385
			TInt err = Server().FileMan().Attribs(*fileName, setmask, clearmask, time);
sl@0
   386
			CleanupStack::PopAndDestroy(fileName);			
sl@0
   387
			aMessage.Complete(err);
sl@0
   388
			break;
sl@0
   389
			}
sl@0
   390
		case EGetFileHandle:
sl@0
   391
			{
sl@0
   392
			HBufC* fileName = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0); 
sl@0
   393
			RFile file;
sl@0
   394
			CleanupClosePushL(file);
sl@0
   395
			User::LeaveIfError(file.Open(Server().FS(), *fileName, EFileRead | EFileShareReadersOnly));
sl@0
   396
			User::LeaveIfError(file.TransferToClient(aMessage, 1));
sl@0
   397
			CleanupStack::PopAndDestroy(2, fileName); // file
sl@0
   398
			break;
sl@0
   399
			}
sl@0
   400
		case EWatchFile:
sl@0
   401
			{
sl@0
   402
			if (iFileWatcher)
sl@0
   403
				{
sl@0
   404
				if (iFileWatcher->IsActive())
sl@0
   405
					{
sl@0
   406
					aMessage.Complete(KErrServerBusy);
sl@0
   407
					break;
sl@0
   408
					}
sl@0
   409
				else
sl@0
   410
					{
sl@0
   411
					delete iFileWatcher;
sl@0
   412
					iFileWatcher = NULL;
sl@0
   413
					}
sl@0
   414
				}
sl@0
   415
			// Create a new file watcher for this session
sl@0
   416
			iFileWatcher = CFileWatcher::NewL(Server().FS(), aMessage);
sl@0
   417
			break;
sl@0
   418
			}
sl@0
   419
		case EWatchFileCancel:
sl@0
   420
			{
sl@0
   421
			if (iFileWatcher)
sl@0
   422
				{
sl@0
   423
				iFileWatcher->Cancel();
sl@0
   424
				aMessage.Complete(KErrNone);
sl@0
   425
				}
sl@0
   426
			else
sl@0
   427
				{
sl@0
   428
				// No file watch request to cancel!
sl@0
   429
				aMessage.Complete(KErrNotReady);
sl@0
   430
				}
sl@0
   431
			break;
sl@0
   432
			}
sl@0
   433
		case EGetNumFiles:
sl@0
   434
			{
sl@0
   435
			HBufC* dirPath = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0);
sl@0
   436
			CDir* dirContents = NULL;
sl@0
   437
			
sl@0
   438
			User::LeaveIfError(Server().FS().GetDir(*dirPath, KEntryAttNormal, ESortNone, dirContents));
sl@0
   439
			TPckg<TInt> numFiles(dirContents->Count());
sl@0
   440
			
sl@0
   441
			delete dirContents;
sl@0
   442
			aMessage.WriteL(1, numFiles);
sl@0
   443
			aMessage.Complete(KErrNone);
sl@0
   444
			CleanupStack::PopAndDestroy(dirPath);
sl@0
   445
			break;
sl@0
   446
			}
sl@0
   447
		case ESetSecureClock:
sl@0
   448
			{
sl@0
   449
			TTime currentTime(0);
sl@0
   450
			currentTime.UniversalTime();
sl@0
   451
			TTimeIntervalSeconds increment(aMessage.Int0());
sl@0
   452
			currentTime += increment;
sl@0
   453
			User::SetUTCTimeSecure(currentTime);
sl@0
   454
			aMessage.Complete(KErrNone);
sl@0
   455
sl@0
   456
			}
sl@0
   457
			break;
sl@0
   458
		default:
sl@0
   459
			{
sl@0
   460
			PanicClient(aMessage,EPanicIllegalFunction);
sl@0
   461
			break;
sl@0
   462
			}
sl@0
   463
		}
sl@0
   464
	}
sl@0
   465
sl@0
   466
void CTestUtilSession::ServiceError(const RMessage2& aMessage,TInt aError)
sl@0
   467
	{
sl@0
   468
	if (aError==KErrBadDescriptor)
sl@0
   469
		PanicClient(aMessage,EPanicBadDescriptor);
sl@0
   470
	CSession2::ServiceError(aMessage,aError);
sl@0
   471
	}
sl@0
   472
// End of file