multimediacommsengine/tsrc/testdriver/testclient/filehandler/src/CTcFileHandlerSession.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/tsrc/testdriver/testclient/filehandler/src/CTcFileHandlerSession.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,198 @@
+/*
+* Copyright (c) 2004 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:  Implementation
+*
+*/
+
+#include "CTcFileHandlerSession.h"
+#include "CTcFileHandlerServer.h"
+#include "FileHandlerConstants.h"
+
+#include <f32file.h>
+
+CTcFileHandlerSession* CTcFileHandlerSession::NewL( 
+    CTcFileHandlerServer* aServer )
+	{
+	CTcFileHandlerSession* self = new( ELeave ) CTcFileHandlerSession;
+
+	CleanupStack::PushL( self );
+	self->ConstructL( aServer );
+	CleanupStack::Pop();
+
+	return self;
+	}
+
+CTcFileHandlerSession::~CTcFileHandlerSession()
+	{
+	iFileHandlerServer->SessionRemoved();
+	}
+
+CTcFileHandlerSession::CTcFileHandlerSession()
+	{
+	}
+
+void CTcFileHandlerSession::ConstructL( CTcFileHandlerServer* aServer )
+	{
+	iFileHandlerServer = aServer;
+	iFileHandlerServer->SessionAdded();
+	}
+
+void CTcFileHandlerSession::ServiceL( const RMessage2& aMessage )
+	{
+	// Any leaves from this function will be catched by the Active Scheduler
+	// and forwarded to CTcFileHandler::RunError().
+
+	// Check for session related requests
+	TInt status( KErrNone );
+	switch( aMessage.Function() )
+		{
+		case ECloseSession:
+			{
+			// Session destruction is handled
+			// by the client-server framework.
+			break;
+			}
+		case EConfigAndStart:
+			{
+			// Nothing to do actually
+			break;
+			}
+		case ECreateFile:
+			{
+			DoCreateFileL( aMessage );	
+			break;
+			}
+		case ECopyFile:
+			{
+			DoCopyFileL( aMessage );	
+			break;
+			}
+		case EDeleteFile:
+			{
+			DoDeleteFileL( aMessage );
+			break;
+			}
+			
+		default:
+			{
+			// Unknown request
+			status = KErrUnknown;
+			}
+		}
+
+	aMessage.Complete( status );
+	}
+	
+void CTcFileHandlerSession::DoCreateFileL( const RMessage2& aMessage ) const
+    {
+    TFileName destinationPath;
+    ReadFileNameL( 0, aMessage, destinationPath );
+   	
+   	HBufC8* data = ReadLC( 1, aMessage );
+   	
+   	RFs fs;
+	User::LeaveIfError( fs.Connect() );
+	CleanupClosePushL( fs );
+	
+	// Make sure path exists, ignore errors since path might exist already
+	fs.MkDirAll( destinationPath );	
+
+	RFile out;
+	User::LeaveIfError( out.Replace( fs, destinationPath, 
+						EFileWrite ) );
+	CleanupClosePushL( out );
+	User::LeaveIfError( out.Write( *data ) );
+	
+	CleanupStack::PopAndDestroy( 3 );	// out, fs, data
+    }
+	
+void CTcFileHandlerSession::DoCopyFileL( const RMessage2& aMessage ) const
+    {
+    TFileName sourcePath;
+    ReadFileNameL( 0, aMessage, sourcePath );
+    
+    TFileName destinationPath;
+    ReadFileNameL( 1, aMessage, destinationPath );
+   	
+    RFs fs;
+	User::LeaveIfError( fs.Connect() );
+	CleanupClosePushL( fs );
+	
+	CFileMan* fileMan = CFileMan::NewL(fs);
+	CleanupStack::PushL(fileMan); 
+	
+	// Make sure path exists, ignore errors since path might exist already
+	fs.MkDirAll( destinationPath );	
+	
+	// Make the destination file writeable, ignore errors since most probably
+	// file doesn't exist yet
+    fileMan->Attribs( destinationPath, 0, KEntryAttReadOnly, TTime( 0 ), 0 );
+    
+	User::LeaveIfError( fileMan->Copy( sourcePath, destinationPath ) );
+    
+	CleanupStack::PopAndDestroy( 2 ); // fileMan, fs
+    }
+    
+void CTcFileHandlerSession::DoDeleteFileL( const RMessage2& aMessage ) const
+    {
+    TFileName destinationPath;
+    ReadFileNameL( 0, aMessage, destinationPath );
+    
+    // Connect to file server
+	RFs fs;
+	User::LeaveIfError( fs.Connect() );
+	CleanupClosePushL( fs );
+
+	// Clear read-only and system flags in order to be able to delete the file
+	// Ignore errors.
+	fs.SetAtt( destinationPath, 0, KEntryAttReadOnly | KEntryAttSystem );
+
+	// Try deleting the file, report errors (typically KErrNotFound)
+	User::LeaveIfError( fs.Delete( destinationPath ) );
+
+	// Close file server session
+	CleanupStack::PopAndDestroy();	// fs
+    }
+    
+void CTcFileHandlerSession::ReadFileNameL( 
+    TInt aItcArgIndex,
+    const RMessage2& aMessage,
+    TFileName& aFileName ) const
+    {
+   	HBufC8* fileName = ReadLC( aItcArgIndex, aMessage );
+   	
+   	__ASSERT_ALWAYS( fileName->Des().Length() <= KMaxFileName, 
+   	                 User::Leave( KErrArgument ) );
+   	aFileName.Copy( *fileName );
+   	
+   	CleanupStack::PopAndDestroy(); // fileName
+    }
+    
+HBufC8* CTcFileHandlerSession::ReadLC( 
+    TInt aItcArgIndex,
+    const RMessage2& aMessage ) const
+    {
+    TInt length = aMessage.GetDesLength( aItcArgIndex );
+    if ( length < 0 )
+        {
+        User::Leave( KErrBadDescriptor );
+        }
+    HBufC8* buf = HBufC8::NewLC( length );
+	if ( length > 0 )
+		{
+		TPtr8 bufPtr( buf->Des() );
+		aMessage.ReadL( aItcArgIndex, bufPtr );
+		}
+    return buf;
+    }