sl@0: /* sl@0: * Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: * All rights reserved. sl@0: * This component and the accompanying materials are made available sl@0: * under the terms of the License "Eclipse Public License v1.0" sl@0: * which accompanies this distribution, and is available sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: * sl@0: * Initial Contributors: sl@0: * Nokia Corporation - initial contribution. sl@0: * sl@0: * Contributors: sl@0: * sl@0: * Description: sl@0: * TestUtil - server implementation sl@0: * sl@0: */ sl@0: sl@0: sl@0: /** sl@0: @file sl@0: @test sl@0: @internalComponent sl@0: */ sl@0: sl@0: #include "testutilserver.h" sl@0: #include "testutilsession.h" sl@0: #include "testutilclientserver.h" sl@0: sl@0: // Timer implementation sl@0: CGenericTimer* CGenericTimer::NewL(MTimeoutClient& aClient) sl@0: { sl@0: CGenericTimer* self = new(ELeave) CGenericTimer(aClient); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(); // calls CTimer::Construct sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: CGenericTimer::CGenericTimer(MTimeoutClient& aClient) sl@0: : CTimer(-1), iClient(aClient) sl@0: { sl@0: CActiveScheduler::Add(this); sl@0: } sl@0: sl@0: void CGenericTimer::RunL() sl@0: { sl@0: // When the timeout expires, then call the client's handler sl@0: iClient.HandleTimeout(); sl@0: }; sl@0: sl@0: // file detector implementation sl@0: CTestFileDetector* CTestFileDetector::NewL(const RMessage2& aMessage, RFs& aFs) sl@0: { sl@0: CTestFileDetector* self = new (ELeave) CTestFileDetector(aMessage, aFs); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: CTestFileDetector::CTestFileDetector(const RMessage2& aMessage, RFs& aFs) sl@0: :CActive(EPriorityNormal), iFs(aFs), iMessage(aMessage) sl@0: { sl@0: iTimeInterval = iMessage.Int1(); sl@0: CActiveScheduler::Add(this); sl@0: } sl@0: sl@0: CTestFileDetector::~CTestFileDetector() sl@0: { sl@0: Cancel(); sl@0: delete iTimer; sl@0: delete iFileName; sl@0: } sl@0: sl@0: void CTestFileDetector::ConstructL() sl@0: { sl@0: if (iTimeInterval!=0) sl@0: { sl@0: iTimer=CGenericTimer::NewL(*this); sl@0: } sl@0: iFileName = CTestUtilSessionCommon::AllocateInputBufferLC(iMessage, 0); sl@0: CleanupStack::Pop(); sl@0: } sl@0: sl@0: void CTestFileDetector::DetectFile() sl@0: { sl@0: if (!iTimer) sl@0: { sl@0: CheckAndComplete(); sl@0: } sl@0: else sl@0: { sl@0: TEntry entry; sl@0: TInt err=iFs.Entry(iFileName->Des(), entry); sl@0: if (err == KErrNone) sl@0: { sl@0: TPckgC exists(ETrue); sl@0: iMessage.WriteL(2, exists); sl@0: iMessage.Complete(KErrNone); sl@0: } sl@0: else sl@0: { sl@0: iTimer->After(iTimeInterval*1000); sl@0: iFs.NotifyChange(ENotifyFile, sl@0: iStatus, sl@0: iFileName->Des()); sl@0: SetActive(); sl@0: } sl@0: } sl@0: } sl@0: sl@0: void CTestFileDetector::RunL() sl@0: { sl@0: if (iTimer) sl@0: { sl@0: iTimer->Cancel(); sl@0: } sl@0: CheckAndComplete(); sl@0: } sl@0: sl@0: void CTestFileDetector::DoCancel() sl@0: { sl@0: iFs.NotifyChangeCancel(iStatus); sl@0: } sl@0: sl@0: void CTestFileDetector::HandleTimeout() sl@0: { sl@0: Cancel(); sl@0: CheckAndComplete(); sl@0: } sl@0: sl@0: void CTestFileDetector::CheckAndComplete() sl@0: { sl@0: TEntry entry; sl@0: TInt err=iFs.Entry(iFileName->Des(), entry); sl@0: if (err == KErrNone) sl@0: { sl@0: TPckgC exists(ETrue); sl@0: iMessage.WriteL(2, exists); sl@0: iMessage.Complete(KErrNone); sl@0: } sl@0: else if (err == KErrNotFound sl@0: || err == KErrPathNotFound sl@0: || err == KErrNotReady sl@0: || err == KErrCorrupt) sl@0: { sl@0: TPckgC exists(EFalse); sl@0: iMessage.WriteL(2, exists); sl@0: iMessage.Complete(KErrNone); sl@0: } sl@0: else sl@0: { sl@0: iMessage.Complete(err); sl@0: } sl@0: } sl@0: sl@0: // CTestUtilSession Implementation sl@0: CTestUtilSession::CTestUtilSession() sl@0: { sl@0: } sl@0: sl@0: CTestUtilSession::~CTestUtilSession() sl@0: { sl@0: Server().DropSession(); sl@0: for (TInt i = 0;i < iLockedFileHandles.Count(); i++) sl@0: { sl@0: iLockedFileHandles[i].Close(); sl@0: } sl@0: iLockedFileHandles.Close(); sl@0: sl@0: delete iFileWatcher; sl@0: delete iDetector; sl@0: } sl@0: sl@0: void CTestUtilSession::CreateL() sl@0: { sl@0: Server().AddSession(); sl@0: } sl@0: sl@0: _LIT(KBP, ":\\"); sl@0: _LIT(KFAT,"Fat"); sl@0: sl@0: void CTestUtilSession::ServiceL(const RMessage2& aMessage) sl@0: { sl@0: switch (aMessage.Function()) sl@0: { sl@0: case ECopy: sl@0: { sl@0: HBufC* source = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0); sl@0: HBufC* destination = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,1); sl@0: sl@0: TInt err = Server().FileMan().Copy(*source, *destination, CFileMan::ERecurse | CFileMan::EOverWrite); sl@0: if (err == KErrNone) sl@0: { sl@0: // Turn off the read only attributes sl@0: TTime time(0); // must specify 0, or a valid time, otherwise sets time to a random value and causes -6/-21 errors sl@0: err = Server().FileMan().Attribs(*destination, 0, KEntryAttReadOnly, time, CFileMan::ERecurse); sl@0: } sl@0: sl@0: CleanupStack::PopAndDestroy(destination); sl@0: CleanupStack::PopAndDestroy(source); sl@0: sl@0: aMessage.Complete(err); sl@0: break; sl@0: } sl@0: case EMove: sl@0: { sl@0: HBufC* source = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0); sl@0: HBufC* destination = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,1); sl@0: sl@0: TInt err = Server().FS().Rename(*source,*destination); sl@0: if (err == KErrNone) sl@0: { sl@0: // Turn off the read only attributes sl@0: TTime time(0); // must specify 0, or a valid time, otherwise sets time to a random value and causes -6/-21 errors sl@0: err = Server().FileMan().Attribs(*destination, 0, KEntryAttReadOnly, time, CFileMan::ERecurse); sl@0: } sl@0: sl@0: CleanupStack::PopAndDestroy(destination); sl@0: CleanupStack::PopAndDestroy(source); sl@0: sl@0: aMessage.Complete(err); sl@0: break; sl@0: } sl@0: case EDelete: sl@0: { sl@0: HBufC* fileName = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0); sl@0: TEntry entry; sl@0: TInt err = Server().FS().Entry(*fileName, entry); sl@0: if (err == KErrNone) sl@0: { sl@0: if (entry.IsDir()) sl@0: { sl@0: TPath pathName(*fileName); sl@0: if (pathName[pathName.Length() - 1] != KPathDelimiter) sl@0: { sl@0: pathName.Append(KPathDelimiter); sl@0: } sl@0: err = Server().FileMan().RmDir(pathName); sl@0: } sl@0: else sl@0: { sl@0: err = Server().FS().Delete(*fileName); sl@0: } sl@0: } sl@0: CleanupStack::PopAndDestroy(fileName); sl@0: sl@0: aMessage.Complete(err); sl@0: break; sl@0: } sl@0: case ERmDir: sl@0: { sl@0: HBufC* fileName = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0); sl@0: TParsePtrC parsePtr(*fileName); sl@0: if(parsePtr.IsRoot()) sl@0: { sl@0: User::Leave(KErrAccessDenied); sl@0: } sl@0: TInt err = Server().FileMan().RmDir(*fileName); sl@0: CleanupStack::PopAndDestroy(fileName); sl@0: sl@0: aMessage.Complete(err); sl@0: break; sl@0: } sl@0: case EMkDirAll: sl@0: { sl@0: HBufC* fileName = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0); sl@0: TInt err = Server().FS().MkDirAll(*fileName); sl@0: CleanupStack::PopAndDestroy(fileName); sl@0: sl@0: aMessage.Complete(err); sl@0: break; sl@0: } sl@0: case EFileExists: sl@0: { sl@0: delete iDetector; sl@0: iDetector=CTestFileDetector::NewL(aMessage, sl@0: Server().FS()); sl@0: iDetector->DetectFile(); sl@0: break; sl@0: } sl@0: case ELock: sl@0: { sl@0: HBufC* fileName = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0); sl@0: RFile lockFile; sl@0: TInt err = lockFile.Open(Server().FS(), *fileName, EFileWrite); sl@0: if (err == KErrNone) sl@0: iLockedFileHandles.Append(lockFile); sl@0: sl@0: CleanupStack::PopAndDestroy(fileName); sl@0: aMessage.Complete(err); sl@0: break; sl@0: } sl@0: case EUnlock: sl@0: { sl@0: HBufC* fileName = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0); sl@0: TInt err = KErrNotFound; sl@0: TFileName lockedFileName; sl@0: for (TInt i = 0; i < iLockedFileHandles.Count() && err;i++) sl@0: { sl@0: TInt err2 = iLockedFileHandles[i].FullName(lockedFileName); sl@0: User::LeaveIfError(err2); sl@0: if (lockedFileName.MatchF(*fileName) != KErrNotFound) sl@0: { sl@0: iLockedFileHandles[i].Close(); sl@0: iLockedFileHandles.Remove(i); sl@0: err = KErrNone; sl@0: } sl@0: } sl@0: CleanupStack::PopAndDestroy(fileName); sl@0: aMessage.Complete(err); sl@0: break; sl@0: } sl@0: case EFormat: sl@0: { sl@0: TInt drive = aMessage.Int0(); sl@0: TBool formatFatOnly = aMessage.Int1(); sl@0: TChar aDriveChar; sl@0: User::LeaveIfError(Server().FS().DriveToChar(drive, aDriveChar)); sl@0: TBuf<3> bfDrv; sl@0: bfDrv.Append(aDriveChar); sl@0: bfDrv.Append(KBP); sl@0: sl@0: RFormat format; sl@0: TInt count; sl@0: User::LeaveIfError(format.Open(Server().FS(), bfDrv, EHighDensity, count)); sl@0: CleanupClosePushL(format); sl@0: sl@0: if (formatFatOnly) sl@0: { sl@0: User::LeaveIfError(format.Next(count)); sl@0: } sl@0: else sl@0: { sl@0: while (count > 0) sl@0: { sl@0: User::LeaveIfError(format.Next(count)); sl@0: } sl@0: } sl@0: sl@0: CleanupStack::PopAndDestroy(&format); sl@0: aMessage.Complete(KErrNone); sl@0: break; sl@0: } sl@0: case EMount: sl@0: { sl@0: TInt drive = aMessage.Int0(); sl@0: User::LeaveIfError(Server().FS().Connect()); sl@0: //Mount the drive synchronizely to make sure the drive is ready for the next operation sl@0: User::LeaveIfError(Server().FS().MountFileSystem(KFAT, drive, ETrue)); sl@0: aMessage.Complete(KErrNone); sl@0: break; sl@0: } sl@0: case EUnMount: sl@0: { sl@0: TInt drive = aMessage.Int0(); sl@0: TFileName fsName; sl@0: User::LeaveIfError(Server().FS().FileSystemName(fsName, drive)); sl@0: User::LeaveIfError(Server().FS().DismountFileSystem(fsName, drive)); sl@0: aMessage.Complete(KErrNone); sl@0: break; sl@0: } sl@0: case ESetReadOnly: sl@0: { sl@0: HBufC* fileName = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0); sl@0: TInt setReadOnly = aMessage.Int1(); sl@0: TUint setmask; sl@0: TUint clearmask; sl@0: if (setReadOnly) sl@0: { sl@0: // Setting read only attribute sl@0: setmask = KEntryAttReadOnly; sl@0: clearmask = 0; sl@0: } sl@0: else sl@0: { sl@0: // Clearing read only attribute sl@0: setmask = 0; sl@0: clearmask = KEntryAttReadOnly; sl@0: } sl@0: sl@0: // Turn off the read only attributes sl@0: TTime time(0); sl@0: TInt err = Server().FileMan().Attribs(*fileName, setmask, clearmask, time); sl@0: CleanupStack::PopAndDestroy(fileName); sl@0: aMessage.Complete(err); sl@0: break; sl@0: } sl@0: case EGetFileHandle: sl@0: { sl@0: HBufC* fileName = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0); sl@0: RFile file; sl@0: CleanupClosePushL(file); sl@0: User::LeaveIfError(file.Open(Server().FS(), *fileName, EFileRead | EFileShareReadersOnly)); sl@0: User::LeaveIfError(file.TransferToClient(aMessage, 1)); sl@0: CleanupStack::PopAndDestroy(2, fileName); // file sl@0: break; sl@0: } sl@0: case EWatchFile: sl@0: { sl@0: if (iFileWatcher) sl@0: { sl@0: if (iFileWatcher->IsActive()) sl@0: { sl@0: aMessage.Complete(KErrServerBusy); sl@0: break; sl@0: } sl@0: else sl@0: { sl@0: delete iFileWatcher; sl@0: iFileWatcher = NULL; sl@0: } sl@0: } sl@0: // Create a new file watcher for this session sl@0: iFileWatcher = CFileWatcher::NewL(Server().FS(), aMessage); sl@0: break; sl@0: } sl@0: case EWatchFileCancel: sl@0: { sl@0: if (iFileWatcher) sl@0: { sl@0: iFileWatcher->Cancel(); sl@0: aMessage.Complete(KErrNone); sl@0: } sl@0: else sl@0: { sl@0: // No file watch request to cancel! sl@0: aMessage.Complete(KErrNotReady); sl@0: } sl@0: break; sl@0: } sl@0: case EGetNumFiles: sl@0: { sl@0: HBufC* dirPath = CTestUtilSessionCommon::AllocateInputBufferLC(aMessage,0); sl@0: CDir* dirContents = NULL; sl@0: sl@0: User::LeaveIfError(Server().FS().GetDir(*dirPath, KEntryAttNormal, ESortNone, dirContents)); sl@0: TPckg numFiles(dirContents->Count()); sl@0: sl@0: delete dirContents; sl@0: aMessage.WriteL(1, numFiles); sl@0: aMessage.Complete(KErrNone); sl@0: CleanupStack::PopAndDestroy(dirPath); sl@0: break; sl@0: } sl@0: case ESetSecureClock: sl@0: { sl@0: TTime currentTime(0); sl@0: currentTime.UniversalTime(); sl@0: TTimeIntervalSeconds increment(aMessage.Int0()); sl@0: currentTime += increment; sl@0: User::SetUTCTimeSecure(currentTime); sl@0: aMessage.Complete(KErrNone); sl@0: sl@0: } sl@0: break; sl@0: default: sl@0: { sl@0: PanicClient(aMessage,EPanicIllegalFunction); sl@0: break; sl@0: } sl@0: } sl@0: } sl@0: sl@0: void CTestUtilSession::ServiceError(const RMessage2& aMessage,TInt aError) sl@0: { sl@0: if (aError==KErrBadDescriptor) sl@0: PanicClient(aMessage,EPanicBadDescriptor); sl@0: CSession2::ServiceError(aMessage,aError); sl@0: } sl@0: // End of file