diff -r 000000000000 -r cec860690d41 emulator/emulatorbsp/win_drive/win_media_device.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emulator/emulatorbsp/win_drive/win_media_device.h Tue Feb 02 01:39:10 2010 +0200 @@ -0,0 +1,203 @@ +// 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 "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: +// Definitions for the classes that represent Windows media objects, e.g. a file, physical drive or partition. +// +// + +/** + @file +*/ + +#ifndef WIN_MEDIA_DEVICE_H +#define WIN_MEDIA_DEVICE_H + +#include "common.h" + +#define WIN32_LEAN_AND_MEAN +#pragma warning( disable : 4201 ) // nonstandard extension used : nameless struct/union +#include +#pragma warning( disable : 4201 ) // nonstandard extension used : nameless struct/union +#include +#pragma warning( default : 4201 ) // nonstandard extension used : nameless struct/union + + +//----------------------------------------------------------------------------- + +const TUint32 KDefaultSectorSz = 512; //-- default sector size +const TUint32 KMinMediaSizeInSectors = 128; //-- minimal number of sectors on the media allowed + + +//----------------------------------------------------------------------------- + +/** + this structure describes "drive" geometry + the "drive" consists of a number of sectors. +*/ +class TDriveGeometry +{ + public: + TDriveGeometry() {iBytesPerSector=0; iSizeInSectors=0;} + + TInt64 TotalSizeInBytes() const {return iBytesPerSector*(TInt64)iSizeInSectors;} + + public: + + TUint32 iBytesPerSector; ///< bytes per sectors (usually 512) + TUint32 iSizeInSectors; ///< size of the bedia in sectors +}; + + +//----------------------------------------------------------------------------- + +/** + Windows media device creation parameters +*/ +class TMediaDeviceParams +{ + public: + + TMediaDeviceParams() {ipDevName = NULL; iReadOnly = EFalse;} + + public: + TDriveGeometry iDrvGeometry; ///< drive geometry + const char* ipDevName; ///< windows device name + TBool iReadOnly; ///< if ETrue, the device shall be opened as RO + +}; + +//----------------------------------------------------------------------------- + +/** + Abstract class representing interface to the Windows device (file or volume). +*/ +class CWinMediaDeviceBase +{ + public: + CWinMediaDeviceBase(); + virtual ~CWinMediaDeviceBase(); + + virtual TInt Connect(const TMediaDeviceParams& aParams)=0; + virtual void Disconnect(); + + + virtual TInt Read(TInt64 aPos,TInt aLength, TDes8& aDataDes)=0; + virtual TInt Write(TInt64 aPos,TInt aLength, const TDesC8& aDataDes)=0; + virtual TInt Erase(TInt64 aPos, TUint32 aLength, TUint8 aFill); + + void GetDriveGeometry(TDriveGeometry& aDG) const {aDG = iDrvGeometry;} + + protected: + + CWinMediaDeviceBase(const CWinMediaDeviceBase&); + CWinMediaDeviceBase& operator=(const CWinMediaDeviceBase&); + + inline HANDLE Handle() const {return iDevHandle;} + inline TBool HandleValid() const; + inline TBool HandleValid(HANDLE aHandle) const; + + TUint32 BytesPerSector() const {return iDrvGeometry.iBytesPerSector;} + + TInt MapWinError(DWORD aWinError) const; + + enum {KScratchBufSz = 128*1024}; ///< scratch buffer size + + protected: + + HANDLE iDevHandle; ///< Windows device handle + TDriveGeometry iDrvGeometry; ///< drive geometry. + TUint8* ipScratchBuf; ///< scratch buffer for IO operations +}; + +//----------------------------------------------------------------------------- + +TBool CWinMediaDeviceBase::HandleValid() const +{ + return HandleValid(iDevHandle); +} + +TBool CWinMediaDeviceBase::HandleValid(HANDLE aHandle) const +{ + return aHandle && (aHandle != INVALID_HANDLE_VALUE); +} + + +//----------------------------------------------------------------------------- + +/** + This class represents a windows "volume" device, like a physical or logical drive or partition. + it can also handle files, but not very effectiively. +*/ +class CWinVolumeDevice: public CWinMediaDeviceBase +{ + public: + CWinVolumeDevice(); + ~CWinVolumeDevice(); + + virtual TInt Connect(const TMediaDeviceParams& aParams); + virtual TInt Read(TInt64 aPos,TInt aLength, TDes8& aDataDes); + virtual TInt Write(TInt64 aPos,TInt aLength, const TDesC8& aDataDes); + private: + + MEDIA_TYPE iMediaType; ///< windows media type. +}; + + + +//----------------------------------------------------------------------------- + +/** + This class represents a windows "file" device, i.e. image file on some drive +*/ +class CWinImgFileDevice: public CWinMediaDeviceBase +{ + public: + CWinImgFileDevice(); + ~CWinImgFileDevice(); + + virtual TInt Connect(const TMediaDeviceParams& aParams); + virtual void Disconnect(); + + virtual TInt Read(TInt64 aPos,TInt aLength, TDes8& aDataDes); + virtual TInt Write(TInt64 aPos,TInt aLength, const TDesC8& aDataDes); + + private: + + private: + HANDLE ihFileMapping; ///< handle for the image file mapping + TUint8* ipImageFile; ///< pointer to the beginning of the image file mapped into memory +}; + + + + + + + + + + +#endif //WIN_MEDIA_DEVICE_H + + + + + + + + + + + + +