1/*
2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Copyright 2016, Rene Gollent, rene@gollent.com.
4 * Distributed under the terms of the MIT License.
5 */
6
7#include "LocatableFile.h"
8
9#include <AutoLocker.h>
10
11#include "LocatableDirectory.h"
12
13
14// #pragma mark - LocatableFile
15
16
17LocatableFile::LocatableFile(LocatableEntryOwner* owner,
18	LocatableDirectory* directory, const BString& name)
19	:
20	LocatableEntry(owner, directory),
21	fName(name),
22	fLocatedPath(),
23	fListeners(8)
24{
25}
26
27
28LocatableFile::~LocatableFile()
29{
30}
31
32
33const char*
34LocatableFile::Name() const
35{
36	return fName.String();
37}
38
39
40void
41LocatableFile::GetPath(BString& _path) const
42{
43	fParent->GetPath(_path);
44	if (_path.Length() != 0)
45		_path << '/';
46	_path << fName;
47}
48
49
50bool
51LocatableFile::GetLocatedPath(BString& _path) const
52{
53	AutoLocker<LocatableEntryOwner> locker(fOwner);
54
55	if (fLocatedPath.Length() > 0) {
56		_path = fLocatedPath;
57		return true;
58	}
59
60	if (!fParent->GetLocatedPath(_path))
61		return false;
62
63	_path << '/' << fName;
64	return true;
65}
66
67
68void
69LocatableFile::SetLocatedPath(const BString& path, bool implicit)
70{
71	// called with owner already locked
72
73	if (implicit) {
74		fLocatedPath = (const char*)NULL;
75		fState = LOCATABLE_ENTRY_LOCATED_IMPLICITLY;
76	} else {
77		fLocatedPath = path;
78		fState = LOCATABLE_ENTRY_LOCATED_EXPLICITLY;
79	}
80
81	_NotifyListeners();
82}
83
84
85bool
86LocatableFile::AddListener(Listener* listener)
87{
88	AutoLocker<LocatableEntryOwner> locker(fOwner);
89	return fListeners.AddItem(listener);
90}
91
92
93void
94LocatableFile::RemoveListener(Listener* listener)
95{
96	AutoLocker<LocatableEntryOwner> locker(fOwner);
97	fListeners.RemoveItem(listener);
98}
99
100
101void
102LocatableFile::_NotifyListeners()
103{
104	for (int32 i = fListeners.CountItems() - 1; i >= 0; i--)
105		fListeners.ItemAt(i)->LocatableFileChanged(this);
106}
107
108
109// #pragma mark - Listener
110
111
112LocatableFile::Listener::~Listener()
113{
114}
115