1//============================================================================
2//
3// SSSS tt lll lll
4// SS SS tt ll ll
5// SS tttttt eeee ll ll aaaa
6// SSSS tt ee ee ll ll aa
7// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
8// SS SS tt ee ll ll aa aa
9// SSSS ttt eeeee llll llll aaaaa
10//
11// Copyright (c) 1995-2019 by Bradford W. Mott, Stephen Anthony
12// and the Stella Team
13//
14// See the file "License.txt" for information on usage and redistribution of
15// this file, and for a DISCLAIMER OF ALL WARRANTIES.
16//============================================================================
17
18#ifndef PROPERTIES_SET_HXX
19#define PROPERTIES_SET_HXX
20
21#include <map>
22
23class FilesystemNode;
24class OSystem;
25
26#include "bspf.hxx"
27#include "Props.hxx"
28
29/**
30 This class maintains an ordered collection of properties, maintained
31 in a C++ map and accessible by ROM md5. The md5 is used since this is
32 the attribute which must be present in each entry in stella.pro
33 and least likely to change. A change in MD5 would mean a change in
34 the game rom image (essentially a different game) and this would
35 necessitate a new entry in the stella.pro file anyway.
36
37 @author Stephen Anthony
38*/
39class PropertiesSet
40{
41 public:
42 /**
43 Trivial constructor.
44 */
45 PropertiesSet() = default;
46
47 /**
48 Load properties from the specified file, and create an internal
49 searchable list.
50
51 @param filename Full pathname of input file to use
52 */
53 void load(const string& filename);
54
55 /**
56 Save properties to the specified file.
57
58 @param filename Full pathname of output file to use
59
60 @return True on success, false on failure or save not needed
61 Failure occurs if file couldn't be opened for writing,
62 or if the file doesn't exist and a zero-byte file
63 would be created
64 */
65 bool save(const string& filename) const;
66
67 /**
68 Get the property from the set with the given MD5.
69
70 @param md5 The md5 of the property to get
71 @param properties The properties with the given MD5, or the default
72 properties if not found
73 @param useDefaults Use the built-in defaults, ignoring any properties
74 from an external file
75
76 @return True if the set with the specified md5 was found, else false
77 */
78 bool getMD5(const string& md5, Properties& properties,
79 bool useDefaults = false) const;
80
81 /**
82 Get the property from the set with the given MD5, at the same time
83 checking if it exists. If it doesn't, insert a temporary copy into
84 the set.
85
86 @param rom The ROM file used to calculate the MD5
87 @param md5 The md5 of the property to get
88 @param properties The properties with the given MD5, or the default
89 properties if not found
90 */
91 void getMD5WithInsert(const FilesystemNode& rom, const string& md5,
92 Properties& properties);
93
94 /**
95 Insert the properties into the set. If a duplicate is inserted
96 the old properties are overwritten with the new ones.
97
98 @param properties The collection of properties
99 @param save Indicates whether the properties should be saved
100 when the program exits
101 */
102 void insert(const Properties& properties, bool save = true);
103
104 /**
105 Prints the contents of the PropertiesSet as a flat file.
106 */
107 void print() const;
108
109 private:
110 using PropsList = std::map<string, Properties>;
111
112 // The properties read from an external 'stella.pro' file
113 PropsList myExternalProps;
114
115 // The properties temporarily inserted by the program, which should
116 // be discarded when the program ends
117 PropsList myTempProps;
118
119 private:
120 // Following constructors and assignment operators not supported
121 PropertiesSet(const PropertiesSet&) = delete;
122 PropertiesSet(PropertiesSet&&) = delete;
123 PropertiesSet& operator=(const PropertiesSet&) = delete;
124 PropertiesSet& operator=(PropertiesSet&&) = delete;
125};
126
127#endif
128