userlibandfileserver/fileserver/smassstorage/inc/drivemanager.h
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/userlibandfileserver/fileserver/smassstorage/inc/drivemanager.h	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,236 @@
+// Copyright (c) 2004-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:
+// CDriveManager and CMassStorageDrive classes for USB Mass Storage.
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+*/
+
+#ifndef __DRIVEMANAGER_H__
+#define __DRIVEMANAGER_H__
+
+#include <e32base.h>			// C Class Definitions, Cleanup Stack 
+#include <e32def.h>				// T Type  Definitions
+#include <f32fsys.h>
+#include <e32property.h>
+#include "usbmsshared.h"		// KUsbMsMaxDrives
+#include "drivepublisher.h"
+
+// Forward declarations
+class CDriveManager;
+
+
+/**
+@internalTechnology
+
+Along with CDriveManager, this provides an interface between the generic SCSI
+protocol component and the target drive unit.  The CMassStorageDrive class is 
+instantiated by the drive manager, and contains a pointer to the associated 
+CProxyDrive that was registered by the Mass Storage File System.
+*/
+class CMassStorageDrive : public CBase
+	{
+public:
+	/**
+	The Drive Mount State Machine.
+	*/
+	enum TMountState
+		{
+		/**
+		Unmounted
+		*/
+		EDisconnected,
+		/**
+		Not mounted, but SCSI started
+		*/
+		EConnecting,
+		/**
+		Mounted
+		*/
+		EConnected,
+		/**
+		Not unmounted, but SCSI stopped
+		*/
+		EDisconnecting
+		};
+
+	/**
+	The Drive Media State Machine.
+	*/
+	enum TDriveState
+		{
+		/**
+		The media is present and ready for access.
+		*/
+		EIdle,
+		/**
+		The media is currently being accessed by Mass Storage. 
+		*/
+		EActive,
+		/**
+		The media is present but is password-protected.
+		*/
+		ELocked,
+		/**
+		The media is not physically present.
+		*/
+		EMediaNotPresent,
+		/**
+		No drive.
+		*/
+		EErrDisMounted
+		};
+
+	CMassStorageDrive(RCriticalSection& aCritSec,
+					  RDriveStateChangedPublisher& aDriveStateChangedPublisher);
+
+	~CMassStorageDrive();
+
+	TInt Read(const TInt64& aPos, TInt aLength, TDes8& aBuf, TBool aWholeMedia = ETrue);
+	TInt Write(const TInt64& aPos, TDesC8& aBuf, TBool aWholeMedia = ETrue);
+	TInt Caps(TLocalDriveCapsV4& aCaps);
+	inline TMountState MountState() const;
+	TDriveState DriveState() const;
+	TDriveState CheckDriveState();
+#ifndef USB_TRANSFER_PUBLISHER
+	inline TUint KBytesRead() const;
+	inline TUint KBytesWritten() const;
+#endif
+	inline TInt SetMountDisconnected();
+	inline TInt SetMountConnecting();
+	inline TInt SetMountDisconnecting();
+	inline TInt SetMountConnected();
+	TInt SetMountConnected(CProxyDrive& aProxyDrive, TBool& aMediaChanged);
+	TInt SetCritical(TBool aCritical);
+	TBool IsMediaChanged(TBool aReset=EFalse);
+	TBool IsWholeMediaAccess();
+
+#ifndef USBMSDRIVE_TEST
+ private:
+#else
+ public:
+#endif
+	// Forward declaration
+	struct CLocalDriveRef;
+
+	TInt HandleCriticalError();
+	TInt ClearCriticalError();
+	TInt DoCaps(TLocalDriveCapsV4& aCaps);
+	void SetDriveState(TDriveState aNewState);
+	TInt SetMountState(TMountState aNewState, CLocalDriveRef* aLocalDrive=NULL);
+	CProxyDrive& SafeProxyDrive() const;
+	
+	/**
+	A Critical Section, shared by all instances of CMassStorageDrive, used to ensure 
+	that iMountState and iProxyDrive are changed atomically.
+	*/
+	RCriticalSection& iCritSec;
+	/**
+	The Drive Mount state machine
+	*/
+	TMountState iMountState;
+	
+#ifndef USB_TRANSFER_PUBLISHER
+	/**
+	Cumulative bytes read
+	*/
+	TInt64 iBytesRead;
+	/**
+	Cumulative bytes written
+	*/
+	TInt64 iBytesWritten;
+#endif
+
+	/**
+	When Connected, references to CProxyDrive and TBusLocalDrive's Media Changed flag.
+	*/
+	CLocalDriveRef* iLocalDrive;
+	/**
+	Publisher for media errors.
+	*/
+	RDriveMediaErrorPublisher iDriveMediaErrorPublisher;
+	/**
+	Reference to publisher for tracking drive state changes.
+	*/
+	RDriveStateChangedPublisher& iDriveStateChangedPublisher;
+	/**
+	Indicates whether whole media access is permitted. 
+	*/
+	TBool iWholeMediaAccess;
+	};
+
+
+/**
+@internalTechnology
+
+Along with CMassStorageDrive, this provides an interface between the generic SCSI
+protocol component and the target drive unit.  This package is responsible for 
+maintaining the list of registered drives.  The owner of the controller registers 
+each drive it wishes to make available to USB Mass Storage along with an 
+associated Logical Drive Unit identifier.  The SCSI protocol contains a reference 
+to the drive manager in order to route the incoming request to a drive.  
+*/
+class CDriveManager : public CBase
+	{
+public:
+	/**
+	The Logical Drive Unit Identifiers (LUN) must be in the range 0..7 due to the
+	fact that the status for all drives is encoded into one 32-bit word.
+	*/
+	enum { KAllLuns = 0xff };
+
+	static CDriveManager* NewL(TRefDriveMap aDriveMap);
+	~CDriveManager();
+
+	TInt RegisterDrive(CProxyDrive& aProxyDrive, TBool& aMediaChanged, TUint aLun);
+	TInt DeregisterDrive(TUint aLun);
+	CMassStorageDrive* Drive(TUint aLun, TInt& aError) const;
+	TInt Connect(TUint aLun);
+	TInt Disconnect(TUint aLun);
+	TBool IsMediaChanged(TUint aLun, TBool aReset=EFalse);
+	TInt SetCritical(TUint aLun, TBool aCritical);
+
+private:
+	// private default constructor to ensure that NewL is used
+	CDriveManager(const RArray<TInt>& aDriveMap);
+	void ConstructL();
+
+public:
+	/**
+	The array of drives.  The index into the array is a LUN.
+	*/
+	TFixedArray<CMassStorageDrive*,KUsbMsMaxDrives> iDrives;
+
+private:
+	/**
+	For converting LUN to Drive Number.
+	*/
+	const RArray<TInt>& iDriveMap;
+	/**
+	A resource owned by DriveManager but used by the Drive objects.
+	*/
+	RCriticalSection iDriveCritSec;
+
+	/**
+	Publisher for tracking drive state changes.
+	*/
+	RDriveStateChangedPublisher* iDriveStateChangedPublisher;
+	};
+
+#include "drivemanager.inl"
+
+#endif //__DRIVEMANAGER_H__