userlibandfileserver/fileserver/smassstorage/inc/drivepublisher.h
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:29:07 +0100
changeset 30 8aab599e3476
parent 0 a41df078684a
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) 2007-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:
// Drive publishing classes for USB Mass Storage.
// RDriveMediaErrorPublisher,
// RDriveStateChangedPublisher, 
// CDriveTransferPublisher,
// CDriveWriteTransferPublisher,
// CDriveReadTransferPublisher,
// CUsbTransferPublisher,
// CUsbReadTransferPublisher,
// CUsbReadTransferPublisher.
// 
//

/**
 @file
 @internalTechnology
*/

#ifndef __DRIVEPUBLISHER_H__
#define __DRIVEPUBLISHER_H__

#include <e32base.h>			// C Class Definitions, Cleanup Stack 
#include <e32def.h>				// T Type  Definitions
#include <e32property.h>
#include "usbmsshared.h"		// Publish and subscribe property definitions

//#define USB_TRANSFER_PUBLISHER
#ifdef MSDC_MULTITHREADED
// Bytes transferred can be measured at the USB interface or the drive interface.
// Since read/write to the drive is performed by background threads we must publish
// the bytes transferred at the USB interface.
#ifndef USB_TRANSFER_PUBLISHER
#define USB_TRANSFER_PUBLISHER
#endif
#endif

// forward declaration
class CMassStorageDrive;

// typedefs
typedef TFixedArray<CMassStorageDrive*, KUsbMsMaxDrives>& TRefMsDriveList;
typedef const RArray<TInt>& TRefDriveMap;

typedef TFixedArray<TInt64, KUsbMsMaxDrives>& TRefBytesTransferedList;

//----------------------------------------------------------------------------
/**
@internalTechnology

Publishes the EUsbMsDriveState_MediaError property.
*/
class RDriveMediaErrorPublisher
{
public:
	RDriveMediaErrorPublisher();
	~RDriveMediaErrorPublisher();

	void PublishError(TBool aError);

private:
	/**
	Publish and subscribe property for EUsbMsDriveState_MediaError property
	*/
	RProperty iMediaErrorProperty;
};

//----------------------------------------------------------------------------
/**
@internalTechnology

Publishes the EUsbMsDriveState_DriveStatus property value for a drive state change.
The published drive state is mapped from the drive's mount state and drive state.
*/

class RDriveStateChangedPublisher
{
public:
	RDriveStateChangedPublisher(TRefMsDriveList aDrives, TRefDriveMap aDriveMap);
	~RDriveStateChangedPublisher();
	void DriveStateChanged();

private:
	/**
	Reference to the array of drives. The index into the array is a LUN.
	*/
	TRefMsDriveList iDrives;
	
	/**
	Reference to the drive map to convert LUN to Drive Number.
	*/
	TRefDriveMap iDriveMap;
};

#ifndef USB_TRANSFER_PUBLISHER
//----------------------------------------------------------------------------
// measure transfer of bytes at the drive interface
//----------------------------------------------------------------------------

/**
@internalTechnology

Base class for Read and Write publihsers.
*/
class CDriveTransferPublisher : public CBase
{
protected:
	~CDriveTransferPublisher();

	CDriveTransferPublisher(TUsbMsDriveState_Subkey iSubKey,
							TRefMsDriveList aDrives);
	void ConstructL();

public:
	void StartTimer();
	void StopTimer();
	void DoPublishDataTransferredEvent();

private:
	virtual TUint GetBytesTransferred(TUint aLun) const = 0;

	// No of calls to wait without an data transfer from iTimer
	// before stopping the publish timer.
	enum {ETimerCancelDelay = 5};

	static TInt PublishDataTransferredEvent(TAny* obj);
	TBool PublishDataTransferred();

protected:
	TUsbMsDriveState_Subkey iSubKey;
	/**
	Reference to the array of drives. The index into the array is a LUN.
	*/
	TRefMsDriveList iDrives;

	/**
	Publish and subscribe properties for tracking data transfer volume
	*/
	RProperty iProperty;

private:
	/**
	An active object which triggers periodic updates to subscribers.
	*/
	CPeriodic* iTimer;

	/**
	Set to ETrue when iTimer is running, EFalse otherwise
	*/
	TBool iTimerRunning;

	/** 
	Adds delay between data not being transferred and iTimer being cancelled
	*/
	TInt iTimerCancelCnt;
};

//----------------------------------------------------------------------------
/**
@internalTechnology

Publishes EUsbMsDriveState_KBytesWritten property values for tracking data transfer write volume.
*/
class CDriveWriteTransferPublisher: public CDriveTransferPublisher
{
public:
	static CDriveWriteTransferPublisher* NewL(TRefMsDriveList aDrives);

private:
	CDriveWriteTransferPublisher(TRefMsDriveList aDrives);

	TUint GetBytesTransferred(TUint aLun) const;
};


//----------------------------------------------------------------------------
/**
@internalTechnology

Publishes EUsbMsDriveState_KBytesRead property value for tracking data transfer read volume.
*/
class CDriveReadTransferPublisher: public CDriveTransferPublisher
{
public:
	static CDriveReadTransferPublisher* NewL(TRefMsDriveList aDrives);

private:
	CDriveReadTransferPublisher(TRefMsDriveList aDrives);

	TUint GetBytesTransferred(TUint aLun) const;
};

#else
//----------------------------------------------------------------------------
// measure bytes transfered at the USB interface
//----------------------------------------------------------------------------

/**
@internalTechnology

Base class for Read and Write publihsers.
*/
class CUsbTransferPublisher : public CBase
{
protected:
	~CUsbTransferPublisher();

	CUsbTransferPublisher(TUsbMsDriveState_Subkey iSubKey,
						  TRefBytesTransferedList aBytesTransferred);
	void ConstructL();

public:
	void StartTimer();
	void StopTimer();
	void DoPublishDataTransferredEvent();

private:
	TUint GetBytesTransferred(TUint aLun) const;

	// No of calls to wait without an data transfer from iTimer
	// before stopping the publish timer.
	enum {ETimerCancelDelay = 5};

	static TInt PublishDataTransferredEvent(TAny* obj);
	TBool PublishDataTransferred();

protected:
	TUsbMsDriveState_Subkey iSubKey;
	/**
	Reference to the array of drives. The index into the array is a LUN.
	*/
	TRefBytesTransferedList iArray;

	/**
	Publish and subscribe properties for tracking data transfer volume
	*/
	RProperty iProperty;

private:
	/**
	An active object which triggers periodic updates to subscribers.
	*/
	CPeriodic* iTimer;

	/**
	Set to ETrue when iTimer is running, EFalse otherwise
	*/
	TBool iTimerRunning;

	/** 
	Adds delay between data not being transferred and iTimer being cancelled
	*/
	TInt iTimerCancelCnt;
};

//----------------------------------------------------------------------------
/**
@internalTechnology

Publishes EUsbMsDriveState_KBytesWritten property values for tracking data transfer write volume.
*/
class CUsbWriteTransferPublisher: public CUsbTransferPublisher
{
public:
	static CUsbWriteTransferPublisher* NewL(TRefBytesTransferedList aBytesTransferred);

private:
	CUsbWriteTransferPublisher(TRefBytesTransferedList aBytesTransferred);
};

//----------------------------------------------------------------------------
/**
@internalTechnology

Publishes EUsbMsDriveState_KBytesRead property value for tracking data transfer read volume.
*/
class CUsbReadTransferPublisher: public CUsbTransferPublisher
{
public:
	static CUsbReadTransferPublisher* NewL(TRefBytesTransferedList aBytesTransferred);

private:
	CUsbReadTransferPublisher(TRefBytesTransferedList aBytesTransferred);
};
#endif

#endif //__DRIVEPUBLISHER_H__