diff -r 000000000000 -r 1bce908db942 multimediacommsengine/tsrc/testdriver/testclient/filehandler/src/CTcFileHandlerSession.cpp --- /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 + +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; + }