--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicstest/graphicstestharness/src/GraphicsTestUtilsServer.cpp Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,387 @@
+// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// GraphicsTestUtilsServer implementation
+//
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+#include <e32std.h>
+
+#include "GraphicsTestUtilsServer.h"
+#include "GraphicsTestUtils.h"
+
+typedef TUint8 TWipeItems;
+
+inline CShutdown::CShutdown()
+ :CTimer(-1)
+ {CActiveScheduler::Add(this);}
+inline void CShutdown::ConstructL()
+ {CTimer::ConstructL();}
+inline void CShutdown::Start()
+ {After(KMyShutdownDelay);}
+
+inline CSmlTestUtilsServer::CSmlTestUtilsServer()
+ :CServer2(0,ESharableSessions)
+ {}
+
+inline CSmlTestUtilsSession::CSmlTestUtilsSession()
+ {}
+inline CSmlTestUtilsServer& CSmlTestUtilsSession::Server()
+ {return *static_cast<CSmlTestUtilsServer*>(const_cast<CServer2*>(CSession2::Server()));}
+
+
+void PanicClient(const RMessage2& aMessage,TTestPanic aPanic)
+//
+// RMessage::Panic() also completes the message. This is:
+// (a) important for efficient cleanup within the kernel
+// (b) a problem if the message is completed a second time
+//
+ {
+ _LIT(KPanic,"TestServer");
+ aMessage.Panic(KPanic,aPanic);
+ }
+
+void CSmlTestUtilsSession::CreateL()
+//
+// 2nd phase construct for sessions - called by the CServer framework
+//
+ {
+ Server().AddSession();
+ User::LeaveIfError(iFs.Connect());
+ iFileMan = CFileMan::NewL(iFs);
+ }
+
+CSmlTestUtilsSession::~CSmlTestUtilsSession()
+ {
+ Server().DropSession();
+ iFs.Close();
+ delete iFileMan;
+ }
+
+
+void CSmlTestUtilsSession::ServiceL(const RMessage2& aMessage)
+//
+// Entry point for when a new message is received
+//
+ {
+ TInt result = KErrNone;
+
+ switch (aMessage.Function())
+ {
+ case ECreateDir:
+ result = DoCreateDirectoryL(aMessage);
+ break;
+ case ERenameDir:
+ result = DoRenameDirectoryL(aMessage);
+ break;
+ case EDeleteDir:
+ result = DoDeleteDirectoryL(aMessage);
+ break;
+ case ECreateFile:
+ result = DoCreateFileL(aMessage);
+ break;
+ case EDeleteFile:
+ result = DoDeleteFileL(aMessage);
+ break;
+ case EDeleteFileUsingWildcard:
+ result = DoDeleteFileUsingWildcardL(aMessage);
+ break;
+ case ECopyFile:
+ result = DoCopyFileL(aMessage);
+ break;
+ case EReplaceFile:
+ result = DoReplaceFileL(aMessage);
+ break;
+ case EIsFilePresent:
+ result = DoIsFilePresentL(aMessage);
+ break;
+ case ESetReadOnly:
+ result = DoSetReadOnlyL(aMessage);
+ break;
+ case EGetAttributes:
+ result = DoGetAttL( aMessage );
+ break;
+ case ESetAttributes:
+ result = DoSetAttL( aMessage );
+ break;
+ case ECopyDirectory:
+ result = DoCopyDirectoryL(aMessage);
+ break;
+ case EChangeFilePermission:
+ result = DoChangeFilePermissionL(aMessage);
+ break;
+ default:
+ PanicClient(aMessage,ETestPanicIllegalFunction);
+ break;
+ }
+ aMessage.Complete(result);
+ }
+
+TInt CSmlTestUtilsSession::DoCreateDirectoryL(const RMessage2& aMessage)
+ {
+ TBuf<255> path;
+ aMessage.ReadL(0, path);
+ TInt ret = iFs.MkDirAll(path);
+ return ret;
+ }
+
+TInt CSmlTestUtilsSession::DoRenameDirectoryL(const RMessage2& aMessage)
+ {
+ TBuf<100> srcpath;
+ aMessage.ReadL(0, srcpath);
+ TBuf<100> destpath;
+ aMessage.ReadL(1, destpath);
+ TInt ret = iFs.Rename(srcpath, destpath);
+
+ return ret;
+ }
+
+TInt CSmlTestUtilsSession::DoDeleteDirectoryL(const RMessage2& aMessage)
+ {
+ TBuf<255> path;
+ aMessage.ReadL(0, path);
+ TInt ret = iFs.RmDir(path);
+ return ret;
+ }
+
+TInt CSmlTestUtilsSession::DoCreateFileL(const RMessage2& aMessage)
+ {
+ TBuf<100> path;
+ aMessage.ReadL(0, path);
+ RFile file;
+ CleanupClosePushL(file);
+ TInt ret = file.Create(iFs, path, EFileRead);
+ CleanupStack::PopAndDestroy(&file);
+ return ret;
+ }
+
+
+TInt CSmlTestUtilsSession::DoDeleteFileL(const RMessage2& aMessage)
+ {
+ TBuf<100> path;
+ aMessage.ReadL(0, path);
+ TInt ret = iFs.Delete(path);
+ return ret;
+ }
+
+TInt CSmlTestUtilsSession::DoDeleteFileUsingWildcardL(const RMessage2& aMessage)
+ {
+ TBuf<100> path;
+ aMessage.ReadL(0, path);
+ TInt ret = iFileMan->Delete(path);
+ return ret;
+ }
+
+TInt CSmlTestUtilsSession::DoCopyFileL(const RMessage2& aMessage)
+ {
+ TBuf<100> srcpath;
+ aMessage.ReadL(0, srcpath);
+
+ TBuf<100> destpath;
+ aMessage.ReadL(1, destpath);
+
+ TInt ret = iFileMan->Copy(srcpath,destpath);
+ return ret;
+ }
+
+TInt CSmlTestUtilsSession::DoReplaceFileL(const RMessage2& aMessage)
+ {
+ TBuf<100> srcpath;
+ aMessage.ReadL(0, srcpath);
+ TUint lFileMode;
+ TPckgBuf<TUint> temp;
+ aMessage.ReadL(1, temp);
+
+ lFileMode=temp();
+ RFile file;
+
+ TInt ret = file.Replace(iFs,srcpath,lFileMode);
+ return ret;
+ }
+
+TInt CSmlTestUtilsSession::DoIsFilePresentL(const RMessage2& aMessage)
+ {
+ TFileName srcpath;
+ aMessage.ReadL(0, srcpath);
+
+ TEntry entry;
+ TInt err = iFs.Entry(srcpath, entry);
+ if (err == KErrNotFound)
+ {
+ aMessage.WriteL(1,TPckgBuf<TBool>(EFalse));
+ }
+ else
+ {
+ aMessage.WriteL(1,TPckgBuf<TBool>(ETrue));
+ }
+
+ return KErrNone;
+ }
+
+TInt CSmlTestUtilsSession::DoSetReadOnlyL(const RMessage2& aMessage)
+ {
+ TBuf<100> srcpath;
+ aMessage.ReadL(0, srcpath);
+ TUint attMask;
+ TPckgBuf<TUint> temp;
+ aMessage.ReadL(1, temp);
+
+ attMask=temp();
+ TInt ret = iFs.SetAtt(srcpath,attMask,KEntryAttReadOnly);
+ return ret;
+ }
+
+TInt CSmlTestUtilsSession::DoGetAttL( const RMessage2& aMessage )
+ {
+
+ TFileName nameBuf;
+ TUint attributes = 0;
+
+ aMessage.ReadL( 0, nameBuf );
+
+ TInt err = iFs.Att( nameBuf, attributes );
+
+ if ( KErrNone == err )
+ {
+ aMessage.WriteL( 1, TPckgBuf<TInt>(attributes) );
+ }
+
+
+ return err;
+ }
+
+
+TInt CSmlTestUtilsSession::DoSetAttL( const RMessage2& aMessage )
+ {
+
+ TFileName nameBuf;
+ aMessage.ReadL( 0, nameBuf );
+
+ TUint setAttMask = *(TUint*)aMessage.Ptr1();
+ TUint clearAttMask = *(TUint*)aMessage.Ptr2();
+
+ TInt err = iFs.SetAtt( nameBuf, setAttMask, clearAttMask );
+
+
+ return err;
+ }
+
+void CSmlTestUtilsSession::ServiceError(const RMessage2& aMessage,TInt aError)
+//
+// Handle an error from CMySession::ServiceL()
+// A bad descriptor error implies a badly programmed client, so panic it;
+// otherwise use the default handling (report the error to the client)
+//
+ {
+ if (aError==KErrBadDescriptor)
+ PanicClient(aMessage,ETestPanicBadDescriptor);
+ CSession2::ServiceError(aMessage,aError);
+ }
+
+
+TInt CSmlTestUtilsSession::DoCopyDirectoryL(const RMessage2& aMessage)
+ {
+ TBuf<100> source;
+ aMessage.ReadL(0, source);
+
+ TBuf<100> target;
+ aMessage.ReadL(1, target);
+
+ TInt ret = iFileMan->Copy(source,target, CFileMan::ERecurse);
+ return ret;
+ }
+
+
+void CShutdown::RunL()
+//
+// Initiate server exit when the timer expires
+//
+ {
+ CActiveScheduler::Stop();
+ }
+
+CServer2* CSmlTestUtilsServer::NewLC()
+ {
+ CSmlTestUtilsServer* self=new(ELeave) CSmlTestUtilsServer;
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+void CSmlTestUtilsServer::ConstructL()
+//
+// 2nd phase construction - ensure the timer and server objects are running
+//
+ {
+ StartL(KTestServerName);
+ iShutdown.ConstructL();
+ // ensure that the server still exits even if the 1st client fails to connect
+ iShutdown.Start();
+ }
+
+
+CSession2* CSmlTestUtilsServer::NewSessionL(const TVersion&,const RMessage2&) const
+//
+// Cretae a new client session. This should really check the version number.
+//
+ {
+ return new(ELeave) CSmlTestUtilsSession();
+ }
+
+void CSmlTestUtilsServer::AddSession()
+//
+// A new session is being created
+// Cancel the shutdown timer if it was running
+//
+ {
+ ++iSessionCount;
+ iShutdown.Cancel();
+ }
+
+void CSmlTestUtilsServer::DropSession()
+//
+// A session is being destroyed
+// Start the shutdown timer if it is the last session.
+//
+ {
+ if (--iSessionCount==0)
+ iShutdown.Start();
+ }
+
+
+
+
+
+
+//Given the name of a read-only file, this functions clears the read-only attribute on the file
+TInt CSmlTestUtilsSession::DoChangeFilePermissionL(const RMessage2& aMessage)
+ {
+ TInt ret(0);
+ TRequestStatus status;
+ TTime time(0);
+ CFileMan* fileman = CFileMan::NewL (iFs);
+ CleanupStack::PushL(fileman);
+ TBuf<100> path;
+ aMessage.ReadL(0, path);
+ ret = fileman->Attribs(path,KEntryAttNormal,KEntryAttReadOnly, time,0,status);
+ User::WaitForRequest(status);
+ ret = status.Int();
+ CleanupStack::PopAndDestroy();
+ return ret;
+ }