diff -r ef2a444a7410 -r b3a1d9898418 kernel/eka/include/drivers/locmedia.h --- a/kernel/eka/include/drivers/locmedia.h Mon May 03 13:47:38 2010 +0300 +++ b/kernel/eka/include/drivers/locmedia.h Fri May 14 17:13:29 2010 +0300 @@ -23,7 +23,7 @@ #if defined(_DEBUG) && defined(__DEMAND_PAGING__) #define __CONCURRENT_PAGING_INSTRUMENTATION__ #endif -#if defined(_DEBUG) && defined(__DEMAND_PAGING__) +#ifdef __DEMAND_PAGING__ #define __DEMAND_PAGING_BENCHMARKS__ #endif @@ -166,6 +166,46 @@ class TLocDrvRequest; class DPrimaryMediaBase; +/* +TCallBackLink + +@internalComponent + +Internal class which allows a list of callbacks to be linked together. +*/ + +NONSHARABLE_CLASS(TCallBackLink) + { +public: + enum TObjectType + { + EDLocalDriveObject, // object containing this TCallBackLink is a DLocalDrive + ETLocDrvObject, // object containing this TCallBackLink is a TLocDrv + }; + +public: + TCallBackLink(); + TCallBackLink(TInt (*aFunction)(TAny* aPtr, TInt aParam),TAny* aPtr, TObjectType aObjectType); + TInt CallBack(TInt aParam) const; +public: + /** + A pointer to the callback function. + */ + TInt (*iFunction)(TAny* aPtr, TInt aParam); + + + /** + A pointer that is passed to the callback function when + the function is called. + */ + TAny* iPtr; + + TObjectType iObjectType; + + SDblQueLink iLink; + }; + + /** @publishedPartner @released @@ -275,19 +315,22 @@ Query device */ EQueryDevice=32, - }; public: DLocalDrive(); ~DLocalDrive(); -public: + virtual TInt DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer); /**< @internalComponent */ virtual TInt Request(TInt aFunction, TAny* a1, TAny* a2); /**< @internalComponent */ -public: - void NotifyChange(DPrimaryMediaBase& aPrimaryMedia, TBool aMediaChange); -public: + + void NotifyChange(); + inline void Deque(); /**< @internalComponent */ + static TInt MediaChangeCallback(TAny* aLocalDrive, TInt aNotifyType); /**< @internalComponent */ + + IMPORT_C static TInt Caps(TInt aDriveNumber, TDes8& aCaps); + private: #ifdef __DEMAND_PAGING__ TInt LockMountInfo(DPrimaryMediaBase& aPrimaryMedia, TLocDrvRequest& aReq); @@ -296,10 +339,10 @@ TInt ReadPasswordData(TLocDrvRequest& aReq, TLocalDrivePasswordData& aPswData, TMediaPassword& aOldPasswd, TMediaPassword& aNewPasswd); public: - TLocDrv* iDrive; /**< @internalComponent */ - SDblQueLink iLink; /**< @internalComponent */ + TLocDrv* iDrive; /**< @internalComponent */ + TCallBackLink iMediaChangeObserver; /**< @internalComponent */ TClientDataRequest* iNotifyChangeRequest; /**< @internalComponent */ - TLocalDriveCleanup iCleanup; /**< @internalComponent */ + TLocalDriveCleanup iCleanup; /**< @internalComponent */ }; /** @@ -341,7 +384,7 @@ ECodePaging=0x20, // a code paging request EDataPaging=0x40, // a data paging request ETClientBuffer=0x80, // RemoteDes() points to a TClientBuffer - EKernelBuffer=0x100, // RemoteDes() points to a kernel-side buffer + EKernelBuffer=0x100, // RemoteDes() points to a kernel-side buffer : set for all paging requests and media extension requests }; public: @@ -493,7 +536,7 @@ @internalComponent */ inline void DLocalDrive::Deque() - { iLink.Deque(); } + { iMediaChangeObserver.iLink.Deque(); } @@ -647,6 +690,7 @@ inline TInt Connect(DLocalDrive* aLocalDrive); inline void Disconnect(DLocalDrive* aLocalDrive); inline TInt Request(TLocDrvRequest& aRequest); + static TInt MediaChangeCallback(TAny* aLocDrv, TInt aNotifyType); public: TInt iDriveNumber; DMedia* iMedia; @@ -661,6 +705,14 @@ TUint8 iSpare3; #endif DDmaHelper* iDmaHelper; + + // Media extension stuff: + + /** ptr to the next TLocDrv object in the chain. Null if not a media extension */ + TLocDrv* iNextDrive; + + /** media change callback - called when the next media in the chain has a media change */ + TCallBackLink iMediaChangeObserver; }; /** @@ -827,7 +879,7 @@ public: IMPORT_C DPrimaryMediaBase(); -public: + // provided by implementation IMPORT_C virtual TInt Create(TMediaDevice aDevice, TInt aMediaId, TInt aLastMediaId); IMPORT_C virtual TInt Connect(DLocalDrive* aLocalDrive); @@ -841,7 +893,7 @@ IMPORT_C virtual void DeltaCurrentConsumption(TInt aCurrent); IMPORT_C virtual void DefaultDriveCaps(TLocalDriveCapsV2& aCaps); IMPORT_C virtual TBool IsRemovableDevice(TInt& aSocketNum); -public: + // used by implementation IMPORT_C void NotifyMediaChange(); IMPORT_C void NotifyPowerDown(); @@ -849,7 +901,7 @@ IMPORT_C void NotifyPsuFault(TInt anError); IMPORT_C void NotifyMediaPresent(); IMPORT_C void PowerUpComplete(TInt anError); -public: + IMPORT_C virtual void HandleMsg(TLocDrvRequest& aRequest); IMPORT_C virtual TInt DoRequest(TLocDrvRequest& aRequest); TInt OpenMediaDriver(); @@ -862,7 +914,10 @@ void CompleteRequest(TLocDrvRequest& aMsg, TInt aResult); IMPORT_C void RunDeferred(); void SetClosed(TInt anError); - void NotifyClients(TBool aMediaChange,TLocDrv* aLocDrv=NULL); + + enum TNotifyType {EMediaChange, EMediaPresent}; + void NotifyClients(TNotifyType aNotifyType, TLocDrv* aLocDrv=NULL); + TInt InCritical(); void EndInCritical(); void UpdatePartitionInfo(); @@ -882,6 +937,13 @@ void RequestCountDec(); #endif + // called by LocDrv::RegisterMediaDevice() for media extensions + TInt Connect(TLocDrv* aLocDrv); + + void MediaChange(); + TInt HandleMediaNotPresent(TLocDrvRequest& aReq); + + public: TInt iLastMediaId; /**< @internalComponent */ TMessageQue iMsgQ; @@ -1148,6 +1210,7 @@ virtual void NotifyEmergencyPowerDown()=0; public: IMPORT_C void SetTotalSizeInBytes(Int64 aTotalSizeInBytes, TLocDrv* aLocDrv=NULL); + IMPORT_C void SetTotalSizeInBytes(TLocalDriveCapsV4& aCaps); IMPORT_C Int64 TotalSizeInBytes(); IMPORT_C void SetCurrentConsumption(TInt aValue); IMPORT_C TInt InCritical(); @@ -1165,6 +1228,74 @@ }; +/** +@internalTechnology +@prototype + +An abstract base class for media driver 'extensions' within the local media subsystem +*/ +class DMediaDriverExtension : public DMediaDriver + { +public: + IMPORT_C DMediaDriverExtension(TInt aMediaId); + IMPORT_C virtual ~DMediaDriverExtension(); + IMPORT_C virtual void Close(); + + virtual TInt Request(TLocDrvRequest& aRequest) = 0; + + virtual TInt PartitionInfo(TPartitionInfo &anInfo) = 0; + + IMPORT_C virtual void NotifyPowerDown(); + + IMPORT_C virtual void NotifyEmergencyPowerDown(); + + /** + Retrieve partition info from all the attached drives + */ + IMPORT_C TInt DoDrivePartitionInfo(TPartitionInfo &anInfo); + /** + Forward a request to the next attached drive + */ + IMPORT_C TInt ForwardRequest(TLocDrvRequest& aRequest); + + /** + Read from the specified attached drive + */ + IMPORT_C TInt Read(TInt aDriveNumber, TInt64 aPos, TLinAddr aData, TUint aLen); + + /** + Write to the specified attached drive + */ + IMPORT_C TInt Write(TInt aDriveNumber, TInt64 aPos, TLinAddr aData, TUint aLen); + + /** + Get the Caps from the specified attached drive + */ + IMPORT_C TInt Caps(TInt aDriveNumber, TDes8& aCaps); + + /** + Return whether the media is busy i.e. if it has any pending requests or DFCs + */ + IMPORT_C TBool MediaBusy(TInt aDriveNumber); + +#ifdef __DEMAND_PAGING__ + /** + Send a paging read request to the specified attached drive + */ + IMPORT_C TInt ReadPaged(TInt aDriveNumber, TInt64 aPos, TLinAddr aData, TUint aLen); + + /** + Send a paging write request to the specified attached drive + */ + IMPORT_C TInt WritePaged(TInt aDriveNumber, TInt64 aPos, TLinAddr aData, TUint aLen); +#endif + +private: + TInt SendRequest(TInt aReqId, TBool aPagingRequest, TInt aDriveNumber, TInt64 aPos, TLinAddr aData, TUint aLen); + + }; + + /**