userlibandfileserver/fileserver/smassstorage/inc/cbulkonlytransportusbcscldd.h
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/userlibandfileserver/fileserver/smassstorage/inc/cbulkonlytransportusbcscldd.h	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,174 @@
+/*
+* 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: 
+* Class declaration for CBulkOnlyTransportUsbcScLdd.
+*
+*/
+
+
+/** 
+ @file
+ @internalTechnology
+*/
+
+#ifndef __CBULKONLYTRANSPORTUSBCSCLDD_H__
+#define __CBULKONLYTRANSPORTUSBCSCLDD_H__
+
+#include "cbulkonlytransport.h"
+#include "cactivedevicestatenotifierbase.h"
+
+// This the length of every buffer corresponding to each Bulk endpoint. 
+// Length is to support double buffering, maximum size of host transfers(64 for Windows/128 for MAC) + 2K (to send CSW(IN ep's) and to recwive CBW's(OUT ep's))
+LOCAL_D const TUint KMaxScBufferSize = 258 * 1024; 
+LOCAL_D const TUint KMaxScReadSize = 64 * 1024;
+
+
+//Forward Declaration
+class CBulkOnlyTransportUsbcScLdd;
+
+/**
+Represent session with control endpoint (Ep0).
+handles the control interface, and responds to the class specific commands (RESET and GET_MAX_LUN).  
+*/
+
+class CControlInterfaceUsbcScLdd : public CActive
+	{
+public:
+	enum TControlState
+		{
+		ENone,
+		EReadEp0Data,
+		ESendMaxLun
+		};
+
+public:
+	static CControlInterfaceUsbcScLdd* NewL(CBulkOnlyTransportUsbcScLdd& aParent);
+	~CControlInterfaceUsbcScLdd();
+	TInt Start();
+	void Stop();
+	virtual void RunL();
+	virtual void DoCancel();
+	TInt OpenEp0();
+
+private:
+	CControlInterfaceUsbcScLdd(CBulkOnlyTransportUsbcScLdd& aParent);
+	void ConstructL();
+	TInt ReadEp0Data();
+	void DecodeEp0Data();
+	TInt ReadUsbEp0();
+
+private:
+	TEndpointBuffer iEp0Buf;
+	TAny* iEp0Packet;
+	TUint iEp0Size;
+	TBool iEp0Zlp;
+
+	TUsbRequestHdr iRequestHeader;
+
+	/** reference to the  CBulkOnlyTransport*/
+	CBulkOnlyTransportUsbcScLdd& iParent;
+
+	/** represent carrent state for state mashine */
+	TControlState iCurrentState;
+	};
+
+
+/** Transport Class that accessess the SC LDD */
+class CBulkOnlyTransportUsbcScLdd : public CBulkOnlyTransport, public MLddDeviceStateNotification
+	{
+public:
+	CBulkOnlyTransportUsbcScLdd(TInt aNumDrives,CUsbMassStorageController& aController);
+
+	~CBulkOnlyTransportUsbcScLdd();
+	void ConstructL();
+
+	RDevUsbcScClient& Ldd();
+	TInt BytesAvailable(); // from Mtransport base class
+
+	TInt SetupConfigurationDescriptor(TBool aUnset = EFalse);
+	TInt SetupInterfaceDescriptors();
+	void ReleaseInterface();
+	void CancelControlInterface();
+	TInt StartControlInterface();
+	void ActivateDeviceStateNotifier();
+	void CancelDeviceStateNotifier();
+	void CancelReadWriteRequests();
+	void AllocateEndpointResources();
+	TInt GetDeviceStatus(TUsbcDeviceState& deviceStatus);
+	void FlushData();
+	void ReadAndDiscardData(TInt aBytes);
+	void ReadCBW();
+	void ExpireData(TAny* aAddress = NULL);
+	void ProcessCbwEvent();
+	void StallEndpointAndWaitForClear();
+	void ReadData(TUint aLength = 0);
+	void WriteUsb(TRequestStatus& aStatus, TPtrC8& aDes, TUint aLength, TBool aZlpRequired = EFalse);
+	void SetCbwPtr();
+	TPtr8& SetCommandBufPtr(TUint aLength);
+	TPtr8& SetDataBufPtr();
+	void SetPaddingBufPtr(TUint aLength);
+	void SetCswBufPtr(TUint aLength);
+	void ProcessReadingDataEvent();
+	void DiscardData(TUint aLength);
+	void WriteToClient(TUint aLength);
+	void SetReadDataBufPtr( TUint aLength);
+
+#ifdef MSDC_MULTITHREADED
+	virtual void GetBufferPointers(TPtr8& aDes1, TPtr8& aDes2);
+#endif
+
+    void Activate(TRequestStatus& aStatus, TUint& aValue);
+    void Cancel();
+
+private:
+	TInt ReadUsb(TUint aLength = 0);
+	TInt OpenEndpoints();
+	void ProcessDataFromHost(); // As USB Read API can return with KErrCompletion saying there is data already and 
+								// that we can process the data without queuong a request, this function effectively does
+								// what Runl() did earlier
+
+private:
+	RChunk* iChunk;
+	RDevUsbcScClient iLdd;
+	CControlInterfaceUsbcScLdd* iControlInterface;
+	CActiveDeviceStateNotifierBase* iDeviceStateNotifier;
+
+	/** To remember chunk specifics one defined, instead of walking it every time something required */
+	TUint iInEndpoint;
+	TUint iOutEndpoint;
+	TEndpointBuffer iSCReadEndpointBuf;
+	TEndpointBuffer iSCWriteEndpointBuf;
+	
+	/** Pointer to the data in chunk which is read from the host */
+	TAny* iSCReadData;
+
+	/** Size of data read from the host in a 'transfer' */
+	TUint iSCReadSize;
+
+	/** If data read from host was termintated with a ZLP or not */
+	TBool iReadZlp;
+
+	/** Pointer to start of IN buffer in chunk which can be written into by protocol/media */
+	TAny* iDataPtr; 
+
+	/** Length of IN buffer */
+	TUint iInBufferLength;
+	};
+
+#endif
+
+
+
+
+