* Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
* Copyright 2016, Rene Gollent, rene@gollent.com.
* Distributed under the terms of the MIT License.
*/
#include "LocatableFile.h"
#include <AutoLocker.h>
#include "LocatableDirectory.h"
LocatableFile::LocatableFile(LocatableEntryOwner* owner,
LocatableDirectory* directory, const BString& name)
:
LocatableEntry(owner, directory),
fName(name),
fLocatedPath(),
fListeners(8)
{
}
LocatableFile::~LocatableFile()
{
}
const char*
LocatableFile::Name() const
{
return fName.String();
}
void
LocatableFile::GetPath(BString& _path) const
{
fParent->GetPath(_path);
if (_path.Length() != 0)
_path << '/';
_path << fName;
}
bool
LocatableFile::GetLocatedPath(BString& _path) const
{
AutoLocker<LocatableEntryOwner> locker(fOwner);
if (fLocatedPath.Length() > 0) {
_path = fLocatedPath;
return true;
}
if (!fParent->GetLocatedPath(_path))
return false;
_path << '/' << fName;
return true;
}
void
LocatableFile::SetLocatedPath(const BString& path, bool implicit)
{
if (implicit) {
fLocatedPath = (const char*)NULL;
fState = LOCATABLE_ENTRY_LOCATED_IMPLICITLY;
} else {
fLocatedPath = path;
fState = LOCATABLE_ENTRY_LOCATED_EXPLICITLY;
}
_NotifyListeners();
}
bool
LocatableFile::AddListener(Listener* listener)
{
AutoLocker<LocatableEntryOwner> locker(fOwner);
return fListeners.AddItem(listener);
}
void
LocatableFile::RemoveListener(Listener* listener)
{
AutoLocker<LocatableEntryOwner> locker(fOwner);
fListeners.RemoveItem(listener);
}
void
LocatableFile::_NotifyListeners()
{
for (int32 i = fListeners.CountItems() - 1; i >= 0; i--)
fListeners.ItemAt(i)->LocatableFileChanged(this);
}
LocatableFile::Listener::~Listener()
{
}