From: <m97...@us...> - 2008-08-12 17:55:40
|
Revision: 8152 http://openmsx.svn.sourceforge.net/openmsx/?rev=8152&view=rev Author: m9710797 Date: 2008-08-12 17:55:44 +0000 (Tue, 12 Aug 2008) Log Message: ----------- added Filename class (as preparation for use in savestates), use this class for disk images Modified Paths: -------------- openmsx/trunk/src/fdc/DSKDiskImage.cc openmsx/trunk/src/fdc/DSKDiskImage.hh openmsx/trunk/src/fdc/DirAsDSK.cc openmsx/trunk/src/fdc/DirAsDSK.hh openmsx/trunk/src/fdc/Disk.cc openmsx/trunk/src/fdc/Disk.hh openmsx/trunk/src/fdc/DiskChanger.cc openmsx/trunk/src/fdc/DiskChanger.hh openmsx/trunk/src/fdc/DiskManipulator.cc openmsx/trunk/src/fdc/DummyDisk.cc openmsx/trunk/src/fdc/RamDSKDiskImage.cc openmsx/trunk/src/fdc/SectorBasedDisk.cc openmsx/trunk/src/fdc/SectorBasedDisk.hh openmsx/trunk/src/fdc/XSADiskImage.cc openmsx/trunk/src/fdc/XSADiskImage.hh openmsx/trunk/src/file/File.cc openmsx/trunk/src/file/File.hh openmsx/trunk/src/file/FileContext.cc openmsx/trunk/src/file/FileContext.hh openmsx/trunk/src/file/node.mk Added Paths: ----------- openmsx/trunk/src/file/Filename.cc openmsx/trunk/src/file/Filename.hh Modified: openmsx/trunk/src/fdc/DSKDiskImage.cc =================================================================== --- openmsx/trunk/src/fdc/DSKDiskImage.cc 2008-08-08 21:04:13 UTC (rev 8151) +++ openmsx/trunk/src/fdc/DSKDiskImage.cc 2008-08-12 17:55:44 UTC (rev 8152) @@ -3,11 +3,9 @@ #include "DSKDiskImage.hh" #include "File.hh" -using std::string; - namespace openmsx { -DSKDiskImage::DSKDiskImage(const string& fileName) +DSKDiskImage::DSKDiskImage(const Filename& fileName) : SectorBasedDisk(fileName) , file(new File(fileName, File::PRE_CACHE)) { Modified: openmsx/trunk/src/fdc/DSKDiskImage.hh =================================================================== --- openmsx/trunk/src/fdc/DSKDiskImage.hh 2008-08-08 21:04:13 UTC (rev 8151) +++ openmsx/trunk/src/fdc/DSKDiskImage.hh 2008-08-12 17:55:44 UTC (rev 8152) @@ -13,7 +13,7 @@ class DSKDiskImage : public SectorBasedDisk { public: - explicit DSKDiskImage(const std::string& fileName); + explicit DSKDiskImage(const Filename& filename); virtual ~DSKDiskImage(); virtual bool writeProtected(); Modified: openmsx/trunk/src/fdc/DirAsDSK.cc =================================================================== --- openmsx/trunk/src/fdc/DirAsDSK.cc 2008-08-08 21:04:13 UTC (rev 8151) +++ openmsx/trunk/src/fdc/DirAsDSK.cc 2008-08-12 17:55:44 UTC (rev 8152) @@ -471,10 +471,10 @@ } DirAsDSK::DirAsDSK(CliComm& cliComm_, GlobalSettings& globalSettings_, - const string& fileName) - : SectorBasedDisk(fileName) + const Filename& filename) + : SectorBasedDisk(filename) , cliComm(cliComm_) - , hostDir(fileName) + , hostDir(filename.getResolved()) , globalSettings(globalSettings_) { syncMode = globalSettings.getSyncDirAsDSKSetting().getValue(); Modified: openmsx/trunk/src/fdc/DirAsDSK.hh =================================================================== --- openmsx/trunk/src/fdc/DirAsDSK.hh 2008-08-08 21:04:13 UTC (rev 8151) +++ openmsx/trunk/src/fdc/DirAsDSK.hh 2008-08-12 17:55:44 UTC (rev 8152) @@ -22,7 +22,7 @@ static const unsigned NUM_DIR_ENTRIES = SECTORS_PER_DIR * (SECTOR_SIZE / 32); DirAsDSK(CliComm& cliComm, GlobalSettings& globalSettings, - const std::string& fileName); + const Filename& filename); virtual ~DirAsDSK(); private: Modified: openmsx/trunk/src/fdc/Disk.cc =================================================================== --- openmsx/trunk/src/fdc/Disk.cc 2008-08-08 21:04:13 UTC (rev 8151) +++ openmsx/trunk/src/fdc/Disk.cc 2008-08-12 17:55:44 UTC (rev 8152) @@ -5,7 +5,7 @@ namespace openmsx { -Disk::Disk(const std::string& name_) +Disk::Disk(const Filename& name_) : name(name_), nbSides(0) { } @@ -14,7 +14,7 @@ { } -const std::string& Disk::getName() const +const Filename& Disk::getName() const { return name; } Modified: openmsx/trunk/src/fdc/Disk.hh =================================================================== --- openmsx/trunk/src/fdc/Disk.hh 2008-08-08 21:04:13 UTC (rev 8151) +++ openmsx/trunk/src/fdc/Disk.hh 2008-08-12 17:55:44 UTC (rev 8152) @@ -3,6 +3,7 @@ #ifndef DISK_HH #define DISK_HH +#include "Filename.hh" #include "openmsx.hh" #include <string> @@ -15,7 +16,7 @@ virtual ~Disk(); - const std::string& getName() const; + const Filename& getName() const; virtual void read (byte track, byte sector, byte side, unsigned size, byte* buf) = 0; @@ -35,7 +36,7 @@ virtual void applyPatch(const std::string& patchFile); protected: - explicit Disk(const std::string& name); + explicit Disk(const Filename& name); int physToLog(byte track, byte side, byte sector); void logToPhys(int log, byte& track, byte& side, byte& sector); @@ -48,7 +49,7 @@ private: void detectGeometryFallback(); - const std::string name; + const Filename name; unsigned sectorsPerTrack; unsigned nbSides; }; Modified: openmsx/trunk/src/fdc/DiskChanger.cc =================================================================== --- openmsx/trunk/src/fdc/DiskChanger.cc 2008-08-08 21:04:13 UTC (rev 8151) +++ openmsx/trunk/src/fdc/DiskChanger.cc 2008-08-12 17:55:44 UTC (rev 8152) @@ -41,17 +41,16 @@ }; DiskChanger::DiskChanger(const string& driveName_, - CommandController& commandController, + CommandController& controller_, DiskManipulator& manipulator_, MSXEventDistributor* msxEventDistributor_, Scheduler* scheduler_) - : cliComm(commandController.getCliComm()) - , globalSettings(commandController.getGlobalSettings()) + : controller(controller_) , msxEventDistributor(msxEventDistributor_) , scheduler(scheduler_) , manipulator(manipulator_) , driveName(driveName_) - , diskCommand(new DiskCommand(commandController, *this)) + , diskCommand(new DiskCommand(controller, *this)) { ejectDisk(); manipulator.registerDrive(*this); @@ -73,7 +72,7 @@ return driveName; } -const string& DiskChanger::getDiskName() const +const Filename& DiskChanger::getDiskName() const { return disk->getName(); } @@ -141,9 +140,10 @@ if (diskImage == "ramdsk") { newDisk.reset(new RamDSKDiskImage()); } else { + Filename filename(diskImage, controller); try { // first try XSA - newDisk.reset(new XSADiskImage(diskImage)); + newDisk.reset(new XSADiskImage(filename)); } catch (MSXException& e) { try { //First try the fake disk, because a DSK will always @@ -152,15 +152,19 @@ //can be resolved and will be accepted as dsk name // try to create fake DSK from a dir on host OS newDisk.reset(new DirAsDSK( - cliComm, globalSettings, diskImage)); + controller.getCliComm(), + controller.getGlobalSettings(), + filename)); } catch (MSXException& e) { // then try normal DSK - newDisk.reset(new DSKDiskImage(diskImage)); + newDisk.reset(new DSKDiskImage(filename)); } } } for (unsigned i = 2; i < args.size(); ++i) { - newDisk->applyPatch(args[i]->getString()); + // TODO use Filename class + UserFileContext context; + newDisk->applyPatch(context.resolve(controller, args[i]->getString())); } // no errors, only now replace original disk @@ -176,7 +180,8 @@ { disk = newDisk; diskChangedFlag = true; - cliComm.update(CliComm::MEDIA, getDriveName(), getDiskName()); + controller.getCliComm().update(CliComm::MEDIA, getDriveName(), + getDiskName().getResolved()); } @@ -194,7 +199,7 @@ int firstFileToken = 1; if (tokens.size() == 1) { result.addListElement(diskChanger.getDriveName() + ':'); - result.addListElement(diskChanger.getDiskName()); + result.addListElement(diskChanger.getDiskName().getResolved()); TclObject options(result.getInterpreter()); if (dynamic_cast<DummyDisk*>(diskChanger.disk.get())) { @@ -244,8 +249,6 @@ } } try { - CommandController& controller = getCommandController(); - UserFileContext context; vector<string> args; args.push_back(diskChanger.getDriveName()); for (unsigned i = firstFileToken; i < tokens.size(); ++i) { @@ -255,13 +258,10 @@ throw MSXException( "Missing argument for option \"" + option + "\""); } - args.push_back(context.resolve( - controller, - tokens[i]->getString())); + args.push_back(tokens[i]->getString()); } else { // backwards compatibility - args.push_back(context.resolve( - controller, option)); + args.push_back(option); } } diskChanger.sendChangeDiskEvent(args); @@ -297,7 +297,7 @@ template<typename Archive> void DiskChanger::serialize(Archive& ar, unsigned /*version*/) { - string diskname = disk->getName(); + string diskname = disk->getName().getOriginal(); ar.serialize("disk", diskname); if (ar.isLoader()) { if (!diskname.empty()) { Modified: openmsx/trunk/src/fdc/DiskChanger.hh =================================================================== --- openmsx/trunk/src/fdc/DiskChanger.hh 2008-08-08 21:04:13 UTC (rev 8151) +++ openmsx/trunk/src/fdc/DiskChanger.hh 2008-08-12 17:55:44 UTC (rev 8152) @@ -18,9 +18,8 @@ class DiskManipulator; class Disk; class DiskCommand; -class CliComm; -class GlobalSettings; class TclObject; +class Filename; class DiskChanger : public DiskContainer, private MSXEventListener, private noncopyable @@ -34,7 +33,7 @@ ~DiskChanger(); const std::string& getDriveName() const; - const std::string& getDiskName() const; + const Filename& getDiskName() const; bool diskChanged(); bool peekDiskChanged() const; Disk& getDisk(); @@ -56,8 +55,7 @@ virtual void signalEvent(shared_ptr<const Event> event, const EmuTime& time); - CliComm& cliComm; - GlobalSettings& globalSettings; + CommandController& controller; MSXEventDistributor* msxEventDistributor; Scheduler* scheduler; DiskManipulator& manipulator; Modified: openmsx/trunk/src/fdc/DiskManipulator.cc =================================================================== --- openmsx/trunk/src/fdc/DiskManipulator.cc 2008-08-08 21:04:13 UTC (rev 8151) +++ openmsx/trunk/src/fdc/DiskManipulator.cc 2008-08-12 17:55:44 UTC (rev 8152) @@ -8,6 +8,7 @@ #include "CommandController.hh" #include "CommandException.hh" #include "File.hh" +#include "Filename.hh" #include "FileContext.hh" #include "FileException.hh" #include "FileOperations.hh" @@ -388,7 +389,8 @@ } // initialize (create partition tables and format partitions) - DSKDiskImage image(tokens[2]); + Filename filename(tokens[2]); + DSKDiskImage image(filename); MSXtar workhorse(image); workhorse.createDiskFile(sizes); } Modified: openmsx/trunk/src/fdc/DummyDisk.cc =================================================================== --- openmsx/trunk/src/fdc/DummyDisk.cc 2008-08-08 21:04:13 UTC (rev 8151) +++ openmsx/trunk/src/fdc/DummyDisk.cc 2008-08-12 17:55:44 UTC (rev 8152) @@ -6,7 +6,7 @@ namespace openmsx { DummyDisk::DummyDisk() - : SectorBasedDisk("") + : SectorBasedDisk(Filename("")) { setNbSectors(0); } Modified: openmsx/trunk/src/fdc/RamDSKDiskImage.cc =================================================================== --- openmsx/trunk/src/fdc/RamDSKDiskImage.cc 2008-08-08 21:04:13 UTC (rev 8151) +++ openmsx/trunk/src/fdc/RamDSKDiskImage.cc 2008-08-12 17:55:44 UTC (rev 8152) @@ -7,7 +7,7 @@ namespace openmsx { RamDSKDiskImage::RamDSKDiskImage(unsigned size) - : SectorBasedDisk("ramdsk") + : SectorBasedDisk(Filename("ramdsk")) { setNbSectors(size / SECTOR_SIZE); diskdata = new byte[size]; Modified: openmsx/trunk/src/fdc/SectorBasedDisk.cc =================================================================== --- openmsx/trunk/src/fdc/SectorBasedDisk.cc 2008-08-08 21:04:13 UTC (rev 8151) +++ openmsx/trunk/src/fdc/SectorBasedDisk.cc 2008-08-12 17:55:44 UTC (rev 8152) @@ -8,7 +8,7 @@ namespace openmsx { -SectorBasedDisk::SectorBasedDisk(const std::string& name) +SectorBasedDisk::SectorBasedDisk(const Filename& name) : Disk(name) , patch(new EmptyDiskPatch(*this)) , nbSectors(unsigned(-1)) // to detect misuse Modified: openmsx/trunk/src/fdc/SectorBasedDisk.hh =================================================================== --- openmsx/trunk/src/fdc/SectorBasedDisk.hh 2008-08-08 21:04:13 UTC (rev 8151) +++ openmsx/trunk/src/fdc/SectorBasedDisk.hh 2008-08-12 17:55:44 UTC (rev 8152) @@ -40,7 +40,7 @@ virtual void writeSectorImpl(unsigned sector, const byte* buf) = 0; protected: - explicit SectorBasedDisk(const std::string& name); + explicit SectorBasedDisk(const Filename& name); virtual ~SectorBasedDisk(); virtual void detectGeometry(); Modified: openmsx/trunk/src/fdc/XSADiskImage.cc =================================================================== --- openmsx/trunk/src/fdc/XSADiskImage.cc 2008-08-08 21:04:13 UTC (rev 8151) +++ openmsx/trunk/src/fdc/XSADiskImage.cc 2008-08-12 17:55:44 UTC (rev 8152) @@ -13,10 +13,10 @@ 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; -XSADiskImage::XSADiskImage(const string& fileName) - : SectorBasedDisk(fileName) +XSADiskImage::XSADiskImage(const Filename& filename) + : SectorBasedDisk(filename) { - File file(fileName); + File file(filename); if (!isXSAImage(file)) { throw MSXException("Not an XSA image"); } Modified: openmsx/trunk/src/fdc/XSADiskImage.hh =================================================================== --- openmsx/trunk/src/fdc/XSADiskImage.hh 2008-08-08 21:04:13 UTC (rev 8151) +++ openmsx/trunk/src/fdc/XSADiskImage.hh 2008-08-12 17:55:44 UTC (rev 8152) @@ -19,7 +19,7 @@ class XSADiskImage : public SectorBasedDisk { public: - explicit XSADiskImage(const std::string& fileName); + explicit XSADiskImage(const Filename& fileName); virtual ~XSADiskImage(); virtual bool writeProtected(); Modified: openmsx/trunk/src/file/File.cc =================================================================== --- openmsx/trunk/src/file/File.cc 2008-08-08 21:04:13 UTC (rev 8151) +++ openmsx/trunk/src/file/File.cc 2008-08-12 17:55:44 UTC (rev 8152) @@ -2,6 +2,7 @@ #include "File.hh" #include "FileBase.hh" +#include "Filename.hh" #include "LocalFile.hh" #include "GZFileAdapter.hh" #include "ZipFileAdapter.hh" @@ -11,8 +12,18 @@ namespace openmsx { +File::File(const Filename& filename, OpenMode mode) +{ + init(filename.getResolved(), mode); +} + File::File(const string& url, OpenMode mode) { + init(url, mode); +} + +void File::init(const string& url, OpenMode mode) +{ string protocol, name; string::size_type pos = url.find("://"); if (pos == string::npos) { Modified: openmsx/trunk/src/file/File.hh =================================================================== --- openmsx/trunk/src/file/File.hh 2008-08-08 21:04:13 UTC (rev 8151) +++ openmsx/trunk/src/file/File.hh 2008-08-12 17:55:44 UTC (rev 8152) @@ -11,6 +11,7 @@ namespace openmsx { +class Filename; class FileBase; class File : private noncopyable @@ -33,6 +34,7 @@ * @throws FileException */ explicit File(const std::string& url, OpenMode mode = NORMAL); + explicit File(const Filename& url, OpenMode mode = NORMAL); /** * Destroy file object. @@ -136,6 +138,8 @@ time_t getModificationDate(); private: + void init(const std::string& url, OpenMode mode); + friend class LocalFileReference; /** This is an internal method used by LocalFileReference. * Returns the path to the (uncompressed) file on the local, Modified: openmsx/trunk/src/file/FileContext.cc =================================================================== --- openmsx/trunk/src/file/FileContext.cc 2008-08-08 21:04:13 UTC (rev 8151) +++ openmsx/trunk/src/file/FileContext.cc 2008-08-12 17:55:44 UTC (rev 8152) @@ -96,7 +96,7 @@ } const string FileContext::resolve(CommandController& controller, - const string& filename) + const string& filename) const { vector<string> pathList = getPathsHelper(controller, paths); string result = resolveHelper(pathList, filename); @@ -104,7 +104,7 @@ return result; } -const string FileContext::resolveCreate(const string& filename) +const string FileContext::resolveCreate(const string& filename) const { string result; CommandController* controller = NULL; Modified: openmsx/trunk/src/file/FileContext.hh =================================================================== --- openmsx/trunk/src/file/FileContext.hh 2008-08-08 21:04:13 UTC (rev 8151) +++ openmsx/trunk/src/file/FileContext.hh 2008-08-12 17:55:44 UTC (rev 8152) @@ -14,8 +14,8 @@ { public: const std::string resolve(CommandController& controller, - const std::string& filename); - const std::string resolveCreate(const std::string& filename); + const std::string& filename) const; + const std::string resolveCreate(const std::string& filename) const; std::vector<std::string> getPaths(CommandController& controller) const; Added: openmsx/trunk/src/file/Filename.cc =================================================================== --- openmsx/trunk/src/file/Filename.cc (rev 0) +++ openmsx/trunk/src/file/Filename.cc 2008-08-12 17:55:44 UTC (rev 8152) @@ -0,0 +1,46 @@ +// $Id$ + +#include "Filename.hh" +#include "FileContext.hh" + +using std::string; + +namespace openmsx { + +Filename::Filename(const string& filename) + : originalFilename(filename) + , resolvedFilename(filename) +{ +} + +Filename::Filename(const string& filename, CommandController& controller) + : originalFilename(filename) + , resolvedFilename(UserFileContext().resolve(controller, originalFilename)) +{ +} + +Filename::Filename(const string& filename, const FileContext& context) + : originalFilename(filename) + , resolvedFilename(context.resolve(*static_cast<CommandController*>(NULL), + originalFilename)) +{ +} + +Filename::Filename(const string& filename, const FileContext& context, + CommandController& controller) + : originalFilename(filename) + , resolvedFilename(context.resolve(controller, originalFilename)) +{ +} + +const string& Filename::getOriginal() const +{ + return originalFilename; +} + +const string Filename::getResolved() const +{ + return resolvedFilename; +} + +} // namespace openmsx Added: openmsx/trunk/src/file/Filename.hh =================================================================== --- openmsx/trunk/src/file/Filename.hh (rev 0) +++ openmsx/trunk/src/file/Filename.hh 2008-08-12 17:55:44 UTC (rev 8152) @@ -0,0 +1,39 @@ +// $Id$ + +#ifndef FILENAME_HH +#define FILENAME_HH + +#include <string> + +namespace openmsx { + +class FileContext; +class CommandController; + +/** This class represents a filename. + * A filename is resolved in a certain context. + * It is possible to query both the resolved and unresolved filename. + * + * Most file operations will want the resolved name, but for example + * for savestates we (also) want the unresolved name. + */ +class Filename +{ +public: + explicit Filename(const std::string& filename); + Filename(const std::string& filename, CommandController& controller); + Filename(const std::string& filename, const FileContext& context); + Filename(const std::string& filename, const FileContext& context, + CommandController& controller); + + const std::string& getOriginal() const; + const std::string getResolved() const; + +private: + const std::string originalFilename; + const std::string resolvedFilename; +}; + +} // namespace openmsx + +#endif Modified: openmsx/trunk/src/file/node.mk =================================================================== --- openmsx/trunk/src/file/node.mk 2008-08-08 21:04:13 UTC (rev 8151) +++ openmsx/trunk/src/file/node.mk 2008-08-12 17:55:44 UTC (rev 8152) @@ -5,6 +5,7 @@ SRC_HDR:= \ File \ FileContext \ + Filename \ FileBase \ LocalFile \ FileOperations \ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |