openMSX
DiskChanger.hh
Go to the documentation of this file.
1 #ifndef DISKCHANGER_HH
2 #define DISKCHANGER_HH
3 
4 #include "DiskContainer.hh"
5 #include "StateChangeListener.hh"
6 #include "serialize_meta.hh"
7 #include "noncopyable.hh"
8 #include <vector>
9 #include <string>
10 #include <memory>
11 
12 namespace openmsx {
13 
14 class CommandController;
15 class StateChangeDistributor;
16 class Scheduler;
17 class FilePool;
18 class MSXMotherBoard;
19 class DiskFactory;
20 class DiskManipulator;
21 class Disk;
22 class DiskCommand;
23 class TclObject;
24 class DiskName;
25 
27  private noncopyable
28 {
29 public:
31  const std::string& driveName,
32  bool createCommand = true);
33  DiskChanger(const std::string& driveName,
34  CommandController& commandController,
35  DiskFactory& diskFactory,
36  DiskManipulator& manipulator,
37  bool createCommand);
38  ~DiskChanger();
39 
40  void createCommand();
41 
42  const std::string& getDriveName() const;
43  const DiskName& getDiskName() const;
44  bool peekDiskChanged() const;
45  void forceDiskChange();
46  Disk& getDisk();
47 
48  // DiskContainer
50  virtual const std::string& getContainerName() const;
51  virtual bool diskChanged();
52  virtual int insertDisk(const std::string& filename);
53 
54  // for NowindCommand
55  void changeDisk(std::unique_ptr<Disk> newDisk);
56 
57  // for DirAsDSK
58  Scheduler* getScheduler() const { return scheduler; }
59 
60  template<typename Archive>
61  void serialize(Archive& ar, unsigned version);
62 
63 private:
64  void init(const std::string& prefix, bool createCmd);
65  void insertDisk(const std::vector<TclObject>& args);
66  void ejectDisk();
67  void sendChangeDiskEvent(const std::vector<std::string>& args);
68 
69  // StateChangeListener
70  virtual void signalStateChange(const std::shared_ptr<StateChange>& event);
71  virtual void stopReplay(EmuTime::param time);
72 
73  CommandController& controller;
74  StateChangeDistributor* stateChangeDistributor;
75  Scheduler* scheduler;
76  FilePool* filePool;
77  DiskFactory& diskFactory;
78  DiskManipulator& manipulator;
79 
80  const std::string driveName;
81  std::unique_ptr<Disk> disk;
82 
83  friend class DiskCommand;
84  std::unique_ptr<DiskCommand> diskCommand; // must come after driveName
85 
86  bool diskChangedFlag;
87 };
89 
90 } // namespace openmsx
91 
92 #endif