From 336e693b6125ce2634acb987202e9112c44d6a57 Mon Sep 17 00:00:00 2001 From: Ulf Wohlers Date: Wed, 23 Apr 2003 12:07:53 +0000 Subject: [PATCH] Added support for reading volume labels Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@957 --- include/dos_system.h | 7 ++++++- src/dos/cdrom.h | 2 +- src/dos/dos_mscdex.cpp | 40 ++++++++++++++++++++++++++++++++-------- src/dos/dos_programs.cpp | 3 +++ src/dos/drive_cache.cpp | 32 ++++++++++++++++++++++++++++++-- src/dos/drive_local.cpp | 31 ++++++++++++++++++++++++++++--- 6 files changed, 100 insertions(+), 15 deletions(-) diff --git a/include/dos_system.h b/include/dos_system.h index 0ea54efe..f0878ac2 100644 --- a/include/dos_system.h +++ b/include/dos_system.h @@ -104,6 +104,8 @@ public: void DeleteEntry (const char* path, bool ignoreLastDir = false); void EmptyCache (void); + void SetLabel (const char* name); + char* GetLabel (void) { return label; }; class CFileInfo { public: @@ -140,7 +142,6 @@ private: Bit16u GetFreeID (CFileInfo* dir); void Clear (void); - CFileInfo* dirBase; char dirPath [CROSS_LEN]; char basePath [CROSS_LEN]; @@ -155,6 +156,7 @@ private: char dirSearchName [MAX_OPENDIRS]; bool free [MAX_OPENDIRS]; + char label [CROSS_LEN]; }; class DOS_No_Drive_Cache { @@ -182,6 +184,9 @@ public: Bit16u GetCurrentEntry (void) { return 0; }; void EmptyCache (void) {}; + + void SetLabel (const char* name) {}; + char* GetLabel (void) {}; public: char basePath [CROSS_LEN]; diff --git a/src/dos/cdrom.h b/src/dos/cdrom.h index 8dfc97a0..aa00bd6f 100644 --- a/src/dos/cdrom.h +++ b/src/dos/cdrom.h @@ -61,7 +61,7 @@ public: bool PlayAudioSector (unsigned long start,unsigned long len); bool PauseAudio (bool resume); bool StopAudio (void); - bool ReadSectors (void* buffer, bool raw, unsigned long sector, unsigned long num) { return true; }; + bool ReadSectors (void* buffer, bool raw, unsigned long sector, unsigned long num) { return false; }; bool LoadUnloadMedia (bool unload); private: diff --git a/src/dos/dos_mscdex.cpp b/src/dos/dos_mscdex.cpp index 60d85cae..ecb2ebc8 100644 --- a/src/dos/dos_mscdex.cpp +++ b/src/dos/dos_mscdex.cpp @@ -23,6 +23,7 @@ #include "dos_system.h" #include "dos_inc.h" #include "setup.h" +#include "support.h" #include "cdrom.h" @@ -101,6 +102,7 @@ public: int AddDrive (Bit16u _drive, char* physicalPath, Bit8u& subUnit); void GetDrives (PhysPt data); void GetDriverInfo (PhysPt data); + bool GetVolumeName (Bit8u subUnit, char* name); bool GetCopyrightName (Bit16u drive, PhysPt data); bool GetAbstractName (Bit16u drive, PhysPt data); bool GetDocumentationName(Bit16u drive, PhysPt data); @@ -233,18 +235,15 @@ int CMscdex::AddDrive(Bit16u _drive, char* physicalPath, Bit8u& subUnit) osi.dwOSVersionInfoSize = sizeof(osi); GetVersionEx(&osi); if ((osi.dwPlatformId==VER_PLATFORM_WIN32_NT) && (osi.dwMajorVersion>4)) { - // WIN NT/200/XP - if (useCdromInterface==CDROM_USE_ASPI) { - cdrom[numDrives] = new CDROM_Interface_Aspi(); - LOG(LOG_MISC,"MSCDEX: ASPI Interface."); - break; - } else if (useCdromInterface==CDROM_USE_IOCTL) { + // only WIN NT/200/XP + if (useCdromInterface==CDROM_USE_IOCTL) { cdrom[numDrives] = new CDROM_Interface_Ioctl(); LOG(LOG_MISC,"MSCDEX: IOCTL Interface."); break; } - } else { - // Win 95/98/ME - always use ASPI + } + if (useCdromInterface==CDROM_USE_ASPI) { + // all Wins - ASPI cdrom[numDrives] = new CDROM_Interface_Aspi(); LOG(LOG_MISC,"MSCDEX: ASPI Interface."); break; @@ -432,6 +431,26 @@ bool CMscdex::ReadVTOC(Bit16u drive, Bit16u volume, PhysPt data, Bit16u& error) return (error==0); }; +bool CMscdex::GetVolumeName(Bit8u subUnit, char* data) +{ + if (subUnit>=numDrives) return false; + Bit16u drive = dinfo[subUnit].drive; + + Bit16u error,seg,size = 128; + bool success = false; + if (DOS_AllocateMemory(&seg,&size)) { + PhysPt ptoc = PhysMake(seg,0); + success = ReadVTOC(drive,0x00,ptoc,error); + if (success) { + MEM_StrCopy(ptoc+40,data,31); + data[31] = 0; + rtrim(data); + }; + DOS_FreeMemory(seg); + } + return success; +}; + bool CMscdex::GetCopyrightName(Bit16u drive, PhysPt data) { Bit16u error,seg,size = 128; @@ -879,6 +898,11 @@ int MSCDEX_AddDrive(char driveLetter, const char* physicalPath, Bit8u& subUnit) return result; }; +bool MSCDEX_GetVolumeName(Bit8u subUnit, char* name) +{ + return mscdex->GetVolumeName(subUnit,name); +}; + bool MSCDEX_HasMediaChanged(Bit8u subUnit) { static TMSF leadOut[MSCDEX_MAX_DRIVES]; diff --git a/src/dos/dos_programs.cpp b/src/dos/dos_programs.cpp index 29d57d63..c00b7f8c 100644 --- a/src/dos/dos_programs.cpp +++ b/src/dos/dos_programs.cpp @@ -35,6 +35,7 @@ public: void Run(void) { DOS_Drive * newdrive;char drive; + std::string label; // Show list of cdroms if (cmd->FindExist("-cd",false)) { @@ -141,6 +142,8 @@ public: /* Set the correct media byte in the table */ mem_writeb(Real2Phys(dos.tables.mediaid)+drive-'A',newdrive->GetMediaByte()); WriteOut("Drive %c mounted as %s\n",drive,newdrive->GetInfo()); + /* check if volume label is given */ + if (cmd->FindString("-label",label,true)) newdrive->dirCache.SetLabel(label.c_str()); return; showusage: WriteOut(MSG_Get("PROGRAM_MOUNT_USAGE")); diff --git a/src/dos/drive_cache.cpp b/src/dos/drive_cache.cpp index 01b55306..92f0c00c 100644 --- a/src/dos/drive_cache.cpp +++ b/src/dos/drive_cache.cpp @@ -57,9 +57,9 @@ DOS_Drive_Cache::DOS_Drive_Cache(void) dirBase = new CFileInfo; save_dir = 0; srchNr = 0; + label[0] = 0; for (Bit32u i=0; i0) { + if (vname[vnamePos]==0) break; + if (!point && (vname[vnamePos]=='.')) { togo=4; point=true; } + label[labelPos] = vname[vnamePos]; + labelPos++; vnamePos++; + togo--; + if ((togo==0) && !point) { + if (vname[vnamePos]=='.') vnamePos++; + label[labelPos]='.'; labelPos++; point=true; togo=3; + } + }; + label[labelPos]=0; +// LOG(LOG_ERROR,"CACHE: Set volume label to %s",label); +}; + Bit16u DOS_Drive_Cache::GetFreeID(CFileInfo* dir) { for (Bit32u i=0; i