openMSX
Filename.cc
Go to the documentation of this file.
1 #include "Filename.hh"
2 #include "FileContext.hh"
3 #include "FileOperations.hh"
4 #include "MSXException.hh"
5 #include "serialize.hh"
6 #include <cassert>
7 
8 using std::string;
9 
10 namespace openmsx {
11 
12 // dummy constructor, to be able to serialize vector<Filename>
14 {
15 }
16 
17 Filename::Filename(const string& filename)
18  : originalFilename(filename)
19  , resolvedFilename(filename)
20 {
21 }
22 
23 Filename::Filename(const string& filename, const FileContext& context)
24  : originalFilename(filename)
25  , resolvedFilename(FileOperations::getAbsolutePath(
26  context.resolve(originalFilename)))
27 {
28 }
29 
30 const string& Filename::getOriginal() const
31 {
32  return originalFilename;
33 }
34 
35 const string& Filename::getResolved() const
36 {
37  return resolvedFilename;
38 }
39 
41 {
42  if (empty()) return;
43  if (FileOperations::exists(resolvedFilename)) return;
44 
45  try {
46  resolvedFilename = FileOperations::getAbsolutePath(
47  UserFileContext().resolve(originalFilename));
48  } catch (MSXException&) {
49  // nothing
50  }
51 }
52 
53 bool Filename::empty() const
54 {
55  assert(getOriginal().empty() == getResolved().empty());
56  return getOriginal().empty();
57 }
58 
59 void Filename::setResolved(const std::string& resolved)
60 {
61  resolvedFilename = resolved;
62 }
63 
64 template<typename Archive>
65 void Filename::serialize(Archive& ar, unsigned /*version*/)
66 {
67  ar.serialize("original", originalFilename);
68  ar.serialize("resolved", resolvedFilename);
69 }
71 
72 } // namespace openmsx