blob: d1de75c795d0634194e38c67405ebb8b7ffd127b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
// slang-artifact-representation-impl.cpp
#include "slang-artifact-representation-impl.h"
#include "../core/slang-file-system.h"
#include "../core/slang-type-text-util.h"
#include "../core/slang-io.h"
#include "../core/slang-array-view.h"
#include "slang-artifact-util.h"
namespace Slang {
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! FileArtifactRepresentation !!!!!!!!!!!!!!!!!!!!!!!!!!! */
void* FileArtifactRepresentation::getInterface(const Guid& guid)
{
if (guid == ISlangUnknown::getTypeGuid() ||
guid == ICastable::getTypeGuid() ||
guid == IArtifactRepresentation::getTypeGuid() ||
guid == IFileArtifactRepresentation::getTypeGuid())
{
return static_cast<IFileArtifactRepresentation*>(this);
}
return nullptr;
}
void* FileArtifactRepresentation::getObject(const Guid& guid)
{
SLANG_UNUSED(guid);
return nullptr;
}
ISlangMutableFileSystem* FileArtifactRepresentation::_getFileSystem()
{
return m_fileSystem ? m_fileSystem : OSFileSystem::getMutableSingleton();
}
void* FileArtifactRepresentation::castAs(const Guid& guid)
{
if (auto intf = getInterface(guid))
{
return intf;
}
return getObject(guid);
}
SlangResult FileArtifactRepresentation::writeToBlob(ISlangBlob** blob)
{
if (m_kind == Kind::NameOnly)
{
// If it's referenced by a name only, it's a file that *can't* be loaded as a blob in general.
return SLANG_E_NOT_AVAILABLE;
}
auto fileSystem = _getFileSystem();
return fileSystem->loadFile(m_path.getBuffer(), blob);
}
bool FileArtifactRepresentation::exists()
{
// TODO(JS):
// If it's a name only it's hard to know what exists should do. It can't *check* because it relies on the 'system' doing
// the actual location. We could ask the IArtifactUtil, and that could change the behavior.
// For now we just assume it does.
if (m_kind == Kind::NameOnly)
{
return true;
}
auto fileSystem = _getFileSystem();
SlangPathType pathType;
const auto res = fileSystem->getPathType(m_path.getBuffer(), &pathType);
// It exists if it is a file
return SLANG_SUCCEEDED(res) && pathType == SLANG_PATH_TYPE_FILE;
}
void FileArtifactRepresentation::disown()
{
if (_isOwned())
{
m_kind = Kind::Reference;
}
}
FileArtifactRepresentation::~FileArtifactRepresentation()
{
if (_isOwned())
{
auto fileSystem = _getFileSystem();
fileSystem->remove(m_path.getBuffer());
}
}
} // namespace Slang
|