diff -r 820b22e13ff1 -r 39c28ec933dd imgtools/imglib/filesystem/source/fatbasebootsector.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imgtools/imglib/filesystem/source/fatbasebootsector.cpp Mon May 10 19:54:49 2010 +0100 @@ -0,0 +1,597 @@ +/* +* Copyright (c) 2006-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: +* This file contains the definition of class TFATBaseBootSector. +* TFATBaseBootSector is the base class for the boot sector class +* of different FAT file system type.This contains the data member +* representing the common fields in each FAT image type +* @internalComponent +* @released +* +*/ + +#include "fatbasebootsector.h" +#include + +/** +Constructor of the base boot sector class + +@internalComponent +@released +*/ +TFATBaseBootSector::TFATBaseBootSector() +{ +} + +/** +Destructor of the base boot sector class + +@internalComponent +@released +*/ +TFATBaseBootSector::~TFATBaseBootSector() +{ +} + +/** +Function Sets the OEM name generally, Indication of what system +formats the volume + +@internalComponent +@released +*/ +void TFATBaseBootSector::SetOEMName() + { + strcpy( reinterpret_cast(iOEMName),KDefaultOEMName); + } + +/** +Function to get the OEM name + +@internalComponent +@released + +@return OEM Name +*/ +unsigned char* TFATBaseBootSector::OEMName() + { + return iOEMName; + } + +/** +Function to set the jump instructions + +@internalComponent +@released +*/ +void TFATBaseBootSector::SetJumpInstruction() +{ + iJmpBoot[0]= 0xEB; + iJmpBoot[1]= 0x5A; + iJmpBoot[2]= 0x90; +} + +/** +Function to get the jump instructions + +@internalComponent +@released + +@return jump boot instruction +*/ +unsigned char* TFATBaseBootSector::JumpInstruction() +{ + return iJmpBoot; +} + + +/** +Function to set the bytes per sector. + +@internalComponent +@released + +@param aDriveSectorSize Sector size in bytes +*/ +void TFATBaseBootSector::SetBytesPerSector(unsigned int aDriveSectorSize) +{ + // Take the default value if SectorSize is not provided by the user. + if (aDriveSectorSize != 0) + { + unsigned short int acceptableValues[] = {512,1024,2048,4096}; + unsigned short int acceptableValuesCount = 4; + bool validSectorSize = false; + for (unsigned int count=0; count255) || (aDriveNoOfFATs<1)) + { + std::cout<<"Warning: No of FATs should be between 0 and 256. Default value is considered.\n"; + iNumberOfFats= KDefaultNumFats; + return; + } + iNumberOfFats= aDriveNoOfFATs; + } + else + { + iNumberOfFats= KDefaultNumFats; + } +} + + +/** +Total sectors on the volume,This count includes the total count of all sectors +in all four regions of the volume.iTatalSectors is a 16 bit field and iTotalSectors32 +is a 32 bit field.Hence if the total sectors are more than 2^16(0x10000 in hex) +then iTotalSectors32 is set otherwise it is zero. + +@internalComponent +@released + +@param aPartitionSize Partition size in bytes +*/ +void TFATBaseBootSector::ComputeTotalSectors(Long64 aPartitionSize) +{ + int Log2OfBytesPerSector = Log2(iBytesPerSector); + unsigned long TotalSectors64 = (unsigned long)(aPartitionSize >> Log2OfBytesPerSector); + if(TotalSectors64 >= 0x10000) + { + iTotalSectors = 0; + iTotalSectors32 = (unsigned int) TotalSectors64; + } + else + { + iTotalSectors = (unsigned short)TotalSectors64; + iTotalSectors32=0; + } +} + +/** +Set the media descriptor,0xF8 is the standard for fixed (non removable) media. + +@internalComponent +@released +*/ +void TFATBaseBootSector::SetMedia() +{ + iMedia=KBPBMedia; +} + +/** +This methods gets the media descriptor + +@internalComponent +@released + +@return media descriptor +*/ +unsigned char TFATBaseBootSector::Media() const +{ + return iMedia; +} + +/** +Set the number of hidden sectors in the volume,Count of hidden sector +preceding the partition. + +@internalComponent +@released +*/ +void TFATBaseBootSector::SetHiddenSectors() +{ + iHiddenSectors=KDefaultHiddenSectors; +} + +/** +Gets the number of hidden sectors in the volume + +@internalComponent +@released + +@return the number of hidden sectors in a given FAT Volume +*/ +unsigned int TFATBaseBootSector::HiddenSectors() const +{ + return iHiddenSectors; +} + +/** +Set the sectors per track preceding the partition. + +@internalComponent +@released +*/ +void TFATBaseBootSector::SetSectorsPerTrack() +{ + iSectorsPerTrack=KDefaultSectorsPerTrack;// default value for flash memory +} + +/** +Gets the number sectors per track in the volume + +@internalComponent +@released + +@return the number of sectors per track in a given FAT Volume +*/ +unsigned short TFATBaseBootSector::SectorsPerTrack() const +{ + return iSectorsPerTrack; +} + +/** +Set the number of heads + +@internalComponent +@released +*/ +void TFATBaseBootSector::SetNumberOfHeads() +{ + iNumHeads=KDefaultNumHeads;// default value for flash memory +} + +/** +Gets the the number of heads + +@internalComponent +@released + +@return number of heads in a given FAT Volume +*/ +unsigned short TFATBaseBootSector::NumberOfHeads() const +{ + return iNumHeads;// default value for flash memory +} + +/** +Set the Physical drive number,not used in Symbian OS + +@internalComponent +@released +*/ +void TFATBaseBootSector::SetBootSectorDriveNumber() +{ + iPhysicalDriveNumber=KDefaultDriveNumber; +} + +/** +Function to return drive number + +@internalComponent +@released + +@return Physical drive number, not used in Symbian OS +*/ +unsigned char TFATBaseBootSector::BootSectorDriveNumber() const +{ + return iPhysicalDriveNumber; +} + +/** +Set the reserved byte value + +@internalComponent +@released +*/ +void TFATBaseBootSector::SetReservedByte() +{ + iReservedByte=KDefaultReservedByte; +} + +/** +Get the value of reserved byte in boot sector + +@internalComponent +@released + +@return Returns the reserved byte value +*/ +unsigned char TFATBaseBootSector::ReservedByte() const +{ + return iReservedByte; +} + +/** +Set the extended boot signature + +@internalComponent +@released + +*/ +void TFATBaseBootSector::SetBootSignature() +{ + iBootSign=KDefaultBootSignature; +} + +/** +Gets the extended boot signature + +@internalComponent +@released + +@return boot signature +*/ +unsigned char TFATBaseBootSector::BootSignature() const +{ + return iBootSign; +} + +/** +Set the unique volume serial number,This ID is usually generated by +simply combining the current date and time in to 32 bit value. + +@internalComponent +@released +*/ +void TFATBaseBootSector::SetVolumeId() +{ + time_t rawtime; + time(&rawtime); + iVolumeId=rawtime; +} + +/** +Returns the volume id + +@internalComponent +@released + +@return volume id field of the boot sector +*/ +unsigned int TFATBaseBootSector::VolumeId() const +{ +return iVolumeId ; +} + +/** +Set the volume's label + +@internalComponent +@released + +@param aVolumeLable Data Drive Volume Label +*/ +void TFATBaseBootSector::SetVolumeLab(String aVolumeLable) +{ + // Set the default value of VolumeLable(i.e. "NO NAME ") if not provided + // by the user. + if (aVolumeLable.empty()) + { + strcpy(reinterpret_cast(iVolumeLabel),KDefaultVolumeLabel); + } + else + { + // If the volume label provided is greater than 11 characters then consider only + // the first 11 characters and generate a warning. + int volumeMaxLangth= 11; + int volumeLabelSize= aVolumeLable.size(); + if (volumeLabelSize > volumeMaxLangth) + { + std::cout<<"Warning: Size overflow for Data Drive Volume Label. Truncating to 11-bytes.\n"; + aVolumeLable.resize(volumeMaxLangth); + strcpy(reinterpret_cast(iVolumeLabel),aVolumeLable.c_str()); + return; + } + + // If the VolumeLable provided is less than 11-characters then pad the + // remaining bytes with white-spaces. + if (volumeLabelSize < KMaxVolumeLabel) + { + while(volumeLabelSize < 11) + { + aVolumeLable.append(" "); + volumeLabelSize = aVolumeLable.size(); + } + } + strcpy(reinterpret_cast(iVolumeLabel),aVolumeLable.c_str()); + } +} + +/** +returns the volume's label + +@internalComponent +@released + +*/ +unsigned char* TFATBaseBootSector::VolumeLab() +{ + return iVolumeLabel; +} + +/** +Returns the number of reserved sectors on the volume + +@internalComponent +@released + +@return iReservedSectors +*/ +unsigned short TFATBaseBootSector::ReservedSectors() const +{ + return iReservedSectors; +} + +/** +Returns the number of Fats on the volume + +@internalComponent +@released + +@return iNumberOfFats +*/ +unsigned char TFATBaseBootSector::NumberOfFats() const +{ + return iNumberOfFats; +} + +/** +Returns the number of entries allowed in the root directory, specific to Fat12/16, zero for FAT32 + +@internalComponent +@released + +@return iRootDirEntries +*/ +unsigned short TFATBaseBootSector::RootDirEntries() const +{ + return iRootDirEntries; +} + +/** +Returns the total sectors on the volume, + +@internalComponent +@released + +@return iTotalSectors +*/ +unsigned int TFATBaseBootSector::TotalSectors(Long64 aPartitionSize) const +{ + if((aPartitionSize/iBytesPerSector)>= 0x10000) + return iTotalSectors32; + else + return iTotalSectors; +} + +/** +Returns base 2 Logarithm of a number + +@internalComponent +@released + +@param aNum number whose logarithm is to be taken +@return log base 2 of the number passed +*/ +int TFATBaseBootSector::Log2(int aNum) +{ + int res=-1; + while(aNum) + { + res++; + aNum>>=1; + } + return(res); +} + +/** +Returns the sectors per cluster ratio + +@internalComponent +@released + +@return iSectorsPerCluster +*/ +unsigned char TFATBaseBootSector::SectorsPerCluster() const +{ + return iSectorsPerCluster; +} + +/** +Returns the 16 bit count of total sectors on the volume + +@internalComponent +@released + +@return iTotalSectors +*/ +unsigned short TFATBaseBootSector::LowSectorsCount() const +{ + return iTotalSectors; +} + +/** +Returns the 32 bit count of total sectors on the volume + +@internalComponent +@released + +@return iTotalSectors +*/ +unsigned int TFATBaseBootSector::HighSectorsCount() const +{ + return iTotalSectors32; +} + +/** +Returns sectors used for the Fat table, zero for FAT32 + +@internalComponent +@released + +@return iFatSectors +*/ +unsigned short TFATBaseBootSector::FatSectors() const +{ + return (unsigned short)iFatSectors; +} + +/** +Returns sectors used for the Fat table in FAT32 + +@internalComponent +@released + +@return iFatSectors32 +*/ +unsigned int TFATBaseBootSector::FatSectors32() const +{ + return iFatSectors32; +}