usbclasses/usbphoneasmodem/classimplementation/mscfileserver/src/mscfilecontroller.cpp
author William Roberts <williamr@symbian.org>
Thu, 22 Jul 2010 16:44:03 +0100
branchGCC_SURGE
changeset 63 ef2686f7597e
parent 2 468cfcb53fd1
parent 35 9d8b04ca6939
permissions -rw-r--r--
Catchup to latest Symbian^4

// Copyright (c) 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: CMscFileController implementation.
// 
// 

#include "mscfilecontroller.h"
#include "scsiprot.h"
#include "bulkonlytransport.h"
#include "debug.h"

CMscFileController* CMscFileController::NewL()
    {
    TRACE_FUNC
    CMscFileController* self = new (ELeave) CMscFileController;
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    return self;
    }
/**
Destructor
*/
CMscFileController::~CMscFileController()
	{
	delete iProtocol;
	delete iTransport;
	delete iFsImage;
	}

CMscFileController::CMscFileController()
    {
    }
/**
Creates the drive manager, transport, protocol and server

@param aMaxDrives Maximum number of Mass Storage drives supported.
*/
void CMscFileController::ConstructL()
	{
	TRACE_FUNC_ENTRY
	iMaxDrives = 1; 
    TRACE_INFO(( _L( "Creating transport" ) ))
    iTransport = CBulkOnlyTransport::NewL(iMaxDrives, *this);
	TRACE_FUNC_EXIT
	}

void CMscFileController::SetupLogicalUnitL( const TDesC& aFileName, 
                                            const TInt /*aProtocol*/, 
                                            const TInt aLun )
    {
    TRACE_FUNC_ENTRY
    if ( aLun != 0 )
        {
        // More than one logical unit is not supported in this version
        LEAVE( KErrArgument );
        }
    if(iFsImage)
        {
        delete iFsImage;
        iFsImage = NULL;
        }
    iFsImage = CFileSystemImage::NewL( aFileName );

    TRACE_INFO(( _L( "Creating protocol" ) ))
    //create protocol according to aProtocol
    if(iProtocol)
        {
        delete iProtocol;
        iProtocol = NULL;
        }
    iProtocol = CScsiProtocol::NewL( *this );
    iTransport->RegisterProtocol( *iProtocol );
    iProtocol->RegisterTransport( iTransport );
    TRACE_FUNC_EXIT
    }

/**
Starts the transport and initializes the protocol.

@param aConfig Reference to Mass Storage configuration data
*/
TInt CMscFileController::Start( TMassStorageConfig& aConfig )
	{
	TRACE_FUNC_ENTRY
	//Save this value for use in the Reset method.
	iConfig = aConfig;
	TInt err = KErrNotReady;
	if ( iProtocol && iTransport )
		{
		TRACE_INFO(( _L( "Starting" ) ))
		((CScsiProtocol*)iProtocol)->SetScsiParameters(aConfig);
		err = iTransport->Start();
		}

	TRACE_FUNC_EXIT
	return err;
	}

/**
Stops the transport.
*/
TInt CMscFileController::Stop()
	{
	TRACE_FUNC_ENTRY
	TInt err = KErrNotReady;
	if ( iTransport )
		{
		TRACE_INFO(( _L( "Stopping" ) ))
		err = iTransport->Stop();
		}
	TRACE_FUNC_EXIT
	return err;
	}

/**
Delete the transport and protocol and start new ones.
*/
void CMscFileController::Reset()
	{
	TRACE_FUNC
	delete iProtocol;
	iProtocol = NULL;

	//Create transport and protocol and initialize them
	TRACE_INFO(_L("Creating  protocol"));

	TRAPD(err,iProtocol = CScsiProtocol::NewL(*this));
	err = err;
	__ASSERT_DEBUG(err==KErrNone, User::Invariant());
	iTransport->RegisterProtocol(*iProtocol);
	iProtocol->RegisterTransport(iTransport);
	}

CFileSystemImage* CMscFileController::FsImage( TInt aLun )
    {
    // Only 1 LUN supported in this version
    if ( aLun == 0 )
        {
        return iFsImage;
        }
    else
        {
        return NULL;
        }
    }