userlibandfileserver/fileserver/shostmassstorage/client/rusbhostmslogicalunit.cpp
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:29:07 +0100
changeset 30 8aab599e3476
parent 6 0173bcd7697c
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of the License "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:
//

/**
 @file
 @internalTechnology
*/

#include <e32std.h>

#include "msgservice.h"
#include "rusbhostmsdevice.h"
#include "rusbhostmslogicalunit.h"
#include "debug.h"

TVersion RUsbHostMsLogicalUnit::Version() const
	{
	return(TVersion(KUsbHostMsSrvMajorVersionNumber,
                    KUsbHostMsSrvMinorVersionNumber,
                    KUsbHostMsSrvBuildVersionNumber));
	}

EXPORT_C RUsbHostMsLogicalUnit::RUsbHostMsLogicalUnit()
	{
	// Intentionally left blank
	}

/**
Send a command to initialise the Mass Storage device.

@param aMsg
@param aDevHandleIndex
@param aLun

@return TInt
*/
EXPORT_C TInt RUsbHostMsLogicalUnit::Initialise(const RMessage2& aMsg,
                                                TInt aDevHandleIndex,
												TUint32 aLun)
	{
	__FNLOG("RUsbHostMsLogicalUnit::Initialise");
	TInt r = dev.Open(aMsg, aDevHandleIndex);
	if (r != KErrNone)
		{
		__PRINT1(_L("Session handle can not be opened %d"),r);
		return r;
		}

	r = CreateSubSession(dev, EUsbHostMsRegisterLun, TIpcArgs(aLun));
	if (r != KErrNone)
		{
		__PRINT1(_L("SubSession creation failed %d"),r);
		return r;
		}
	return r;
	}


/**
Send a command to read the Mass Storage device.

@param aPos Position to start reading from
@param aLength Number of Bytes
@param aTrg Buffer to copy data to

@return TInt KErrNone, if the send operation is successful;
	KErrServerTerminated, if the server no longer present; KErrServerBusy, if there are no message slots available;
	KErrNoMemory, if there is insufficient memory available.
*/
EXPORT_C TInt RUsbHostMsLogicalUnit::Read(TInt64 aPos, TInt aLength, TDes8& aTrg)
	{
	__FNLOG("RUsbHostMsLogicalUnit::Read");

	TReadWrite data;
	data.iPos = aPos;
	data.iLen = aLength;

	__PRINT2(_L("pos = 0x%lx, len = x%x"), data.iPos, data.iLen);

	TPckg<TReadWrite> pckg(data);
	/* We handle the message asynchronously in the thread modelled MSC */
	TRequestStatus	status;
	SendReceive(EUsbHostMsRead, TIpcArgs(&pckg, &aTrg), status);
	User::WaitForRequest(status);
    __PRINT2(_L("pos = 0x%lx, len = x%x"), data.iPos, data.iLen);
	return status.Int();
	}


/**
Send a command to write to the Mass Storage device.

@param aPos Position to start reading from
@param aLength Number of Bytes
@param aTrg Buffer to copy data from

@return TInt KErrNone, if the send operation is successful;
	KErrServerTerminated, if the server no longer present; KErrServerBusy, if there are no message slots available;
	KErrNoMemory, if there is insufficient memory available.
available.
*/
EXPORT_C TInt RUsbHostMsLogicalUnit::Write(TInt64 aPos, TInt aLength, const TDesC8& aTrg)
	{
	__FNLOG("RUsbHostMsLogicalUnit::Write");

	TReadWrite data;
	data.iPos = aPos;
	data.iLen = aLength;

	__PRINT2(_L("pos = 0x%lx, len = x%x"), data.iPos, data.iLen);

	TPckg<TReadWrite> pckg(data);
	/* We handle the message asynchronously in the thread modelled MSC */
	TRequestStatus	status;
	SendReceive(EUsbHostMsWrite, TIpcArgs(&aTrg, &pckg), status);
	User::WaitForRequest(status);
	return status.Int();
	}


/**
Send a command to erase an area of the Mass Storage device.

@param aPos Position to start reading from
@param aLength Number of Bytes

@return TInt KErrNone, if the send operation is successful;
	KErrServerTerminated, if the server no longer present; KErrServerBusy, if there are no message slots available;
	KErrNoMemory, if there is insufficient memory available.
available.
*/
EXPORT_C TInt RUsbHostMsLogicalUnit::Erase(TInt64 aPos, TInt aLength)
	{
	__FNLOG("RUsbHostMsLogicalUnit::Erase");

	TReadWrite data;
	data.iPos = aPos;
	data.iLen = aLength;

	__PRINT2(_L("pos = 0x%lx, len = x%x"), data.iPos, data.iLen);

	TPckg<TReadWrite> pckg(data);
	/* We handle the message asynchronously in the thread modelled MSC */
	TRequestStatus	status;
	SendReceive(EUsbHostMsErase, TIpcArgs(&pckg), status);
	User::WaitForRequest(status);
	return status.Int();
	}


/**
Send a command to get the nedia's capacity info.

@param aCapsInfo [OUT] A buffer to copy the capacity info to.

@return TInt KErrNone, if the send operation is successful;
KErrServerTerminated, if the server no longer present; KErrServerBusy, if there
are no message slots available; KErrNoMemory, if there is insufficient memory
available.
*/
EXPORT_C TInt RUsbHostMsLogicalUnit::Caps(TCapsInfo& aCapsInfo)
	{
	__FNLOG("RUsbHostMsLogicalUnit::Caps");

    TPckg<TCapsInfo> data(aCapsInfo);

	/* We handle the message asynchronously in the thread modelled MSC */
	TRequestStatus	status;
	SendReceive(EUsbHostMsCapacity, TIpcArgs(&data),status);
	User::WaitForRequest(status);
	return status.Int();
	}

/**
Request notification of media change to the file server

@param aChanged The descriptor pointing to iChanged flag in TDrive to be updated
when error occurs during read or write.
@param aStatus The request status This is set to KErrNone on completion, or KErrCancel when the logical unit is closed;
	KErrServerTerminated, if the server no longer present; KErrServerBusy, if there are no message slots available;
	KErrNoMemory, if there is insufficient memory available.
@return None
*/
EXPORT_C void RUsbHostMsLogicalUnit::NotifyChange(TDes8& aChanged, TRequestStatus &aStatus)
	{
	__FNLOG("RUsbHostMsLogicalUnit::NotifyChange");

	SendReceive(EUsbHostMsNotifyChange, TIpcArgs(&aChanged), aStatus);
	}

/**
Request to suspend the logical unit associated with this drive
*/
EXPORT_C void RUsbHostMsLogicalUnit::SuspendLun()
	{
	__FNLOG("RUsbHostMsLogicalUnit::SuspendLun");

	SendReceive(EUsbHostMsSuspendLun, TIpcArgs(NULL));
	}

/**
Close the sub-session.

@return TInt KErrNone
*/
EXPORT_C TInt RUsbHostMsLogicalUnit::UnInitialise()
	{
	__FNLOG("RUsbHostMsLogicalUnit::UnInitialise");

	CloseSubSession(EUsbHostMsUnRegisterLun);
	dev.Close();
	return KErrNone;
	}


/**
Request that the drive is remounted.

@param aFlags Flags to be passed to the drive

@return EXPORT_C TInt KErrNone, if the send operation is successful;
KErrServerTerminated, if the server no longer present; KErrServerBusy, if there
are no message slots available; KErrNoMemory, if there is insufficient memory
available.
*/
EXPORT_C TInt RUsbHostMsLogicalUnit::ForceRemount(TUint aFlags)
	{
	__FNLOG("RUsbHostMsLogicalUnit::ForceRemount");

	__PRINT1(_L("flags = %d"), aFlags);

	TRequestStatus	status;
	SendReceive(EUsbHostMsForceRemount, TIpcArgs(aFlags), status);
	User::WaitForRequest(status);
	return status.Int();
	}

EXPORT_C void RUsbHostMsLogicalUnit::NotifyChangeCancel()
	{
	__FNLOG("RUsbHostMsLogicalUnit::NotifyChangeCancel");
	SendReceive(EUsbHostMsCancelChangeNotifier, TIpcArgs(NULL));
	}