#include "ShareNode.h"
#include "ShareAttrDir.h"
ShareDirEntry::ShareDirEntry(ShareDir* directory, const char* name,
ShareNode* node)
:
BReferenceable(),
fDirectory(directory),
fName(name),
fNode(node),
fRevision(-1)
{
}
ShareDirEntry::~ShareDirEntry()
{
}
status_t
ShareDirEntry::InitCheck() const
{
if (fName.GetLength() == 0)
return B_NO_MEMORY;
return B_OK;
}
ShareDir*
ShareDirEntry::GetDirectory() const
{
return fDirectory;
}
const char*
ShareDirEntry::GetName() const
{
return fName.GetString();
}
ShareNode*
ShareDirEntry::GetNode() const
{
return fNode;
}
void
ShareDirEntry::SetRevision(int64 revision)
{
fRevision = revision;
}
int64
ShareDirEntry::GetRevision() const
{
return fRevision;
}
bool
ShareDirEntry::IsActualEntry() const
{
return (fName.GetLength() > 0 && fName != "." && fName != "..");
}
ShareNode::ShareNode(Volume* volume, vnode_id id, const NodeInfo* nodeInfo)
:
Node(volume, id),
fInfo(),
fReferringEntries(),
fAttrDir(NULL)
{
if (nodeInfo) {
fInfo = *nodeInfo;
} else {
fInfo.st.st_dev = -1;
fInfo.st.st_ino = -1;
fInfo.st.st_mode = S_IFDIR | S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP
| S_IROTH | S_IXOTH;
fInfo.st.st_nlink = 1;
fInfo.st.st_size = 1;
fInfo.st.st_blksize = 1024;
fInfo.st.st_crtime = 0;
fInfo.st.st_ctime = fInfo.st.st_mtime = fInfo.st.st_atime
= fInfo.st.st_crtime;
fInfo.revision = -1;
}
}
ShareNode::~ShareNode()
{
delete fAttrDir;
}
const NodeInfo&
ShareNode::GetNodeInfo() const
{
return fInfo;
}
NodeID
ShareNode::GetRemoteID() const
{
return fInfo.GetID();
}
void
ShareNode::Update(const NodeInfo& nodeInfo)
{
if (fInfo.revision < nodeInfo.revision)
fInfo = nodeInfo;
}
void
ShareNode::AddReferringEntry(ShareDirEntry* entry)
{
if (entry)
fReferringEntries.Insert(entry);
}
void
ShareNode::RemoveReferringEntry(ShareDirEntry* entry)
{
if (entry)
fReferringEntries.Remove(entry);
}
ShareDirEntry*
ShareNode::GetFirstReferringEntry() const
{
return fReferringEntries.GetFirst();
}
ShareDirEntry*
ShareNode::GetNextReferringEntry(ShareDirEntry* entry) const
{
return (entry ? fReferringEntries.GetNext(entry) : NULL);
}
ShareDirEntry*
ShareNode::GetActualReferringEntry() const
{
for (ShareDirEntry* entry = GetFirstReferringEntry();
entry;
entry = GetNextReferringEntry(entry)) {
if (entry->IsActualEntry())
return entry;
}
return NULL;
}
void
ShareNode::SetAttrDir(ShareAttrDir* attrDir)
{
delete fAttrDir;
fAttrDir = attrDir;
}
ShareAttrDir*
ShareNode::GetAttrDir() const
{
return fAttrDir;
}
ShareDirIterator::ShareDirIterator()
{
}
ShareDirIterator::~ShareDirIterator()
{
}
LocalShareDirIterator::LocalShareDirIterator()
: fDirectory(NULL),
fCurrentEntry(NULL)
{
}
LocalShareDirIterator::~LocalShareDirIterator()
{
SetDirectory(NULL);
}
void
LocalShareDirIterator::SetDirectory(ShareDir* directory)
{
if (fDirectory)
fDirectory->RemoveDirIterator(this);
fDirectory = directory;
if (fDirectory) {
fDirectory->AddDirIterator(this);
fCurrentEntry = fDirectory->GetFirstEntry();
}
}
ShareDirEntry*
LocalShareDirIterator::GetCurrentEntry() const
{
return fCurrentEntry;
}
void
LocalShareDirIterator::NextEntry()
{
if (!fDirectory || !fCurrentEntry)
return;
fCurrentEntry = fDirectory->GetNextEntry(fCurrentEntry);
}
void
LocalShareDirIterator::Rewind()
{
fCurrentEntry = (fDirectory ? fDirectory->GetFirstEntry() : NULL);
}
bool
LocalShareDirIterator::IsDone() const
{
return !fCurrentEntry;
}
RemoteShareDirIterator::RemoteShareDirIterator()
: fCookie(-1),
fCapacity(kRemoteShareDirIteratorCapacity),
fCount(0),
fIndex(0),
fRevision(-1),
fDone(false),
fRewind(false)
{
}
RemoteShareDirIterator::~RemoteShareDirIterator()
{
Clear();
}
ShareDirEntry*
RemoteShareDirIterator::GetCurrentEntry() const
{
return (!fRewind && fIndex < fCount ? fEntries[fIndex] : NULL);
}
void
RemoteShareDirIterator::NextEntry()
{
if (fIndex < fCount)
fIndex++;
}
void
RemoteShareDirIterator::Rewind()
{
fRewind = true;
fDone = false;
}
bool
RemoteShareDirIterator::IsDone() const
{
return fDone;
}
int32
RemoteShareDirIterator::GetCapacity() const
{
return fCapacity;
}
void
RemoteShareDirIterator::SetCookie(int32 cookie)
{
fCookie = cookie;
}
int32
RemoteShareDirIterator::GetCookie() const
{
return fCookie;
}
void
RemoteShareDirIterator::Clear()
{
for (int32 i = 0; i < fCount; i++)
fEntries[i]->ReleaseReference();
fCount = 0;
fIndex = 0;
fDone = false;
fRewind = false;
}
bool
RemoteShareDirIterator::AddEntry(ShareDirEntry* entry)
{
if (!entry || fCount >= fCapacity)
return false;
fEntries[fCount++] = entry;
entry->AcquireReference();
return true;
}
void
RemoteShareDirIterator::SetRevision(int64 revision)
{
fRevision = revision;
}
int64
RemoteShareDirIterator::GetRevision() const
{
return fRevision;
}
void
RemoteShareDirIterator::SetDone(bool done)
{
fDone = done;
}
bool
RemoteShareDirIterator::GetRewind() const
{
return fRewind;
}
ShareDir::ShareDir(Volume* volume, vnode_id id, const NodeInfo* nodeInfo)
: ShareNode(volume, id, nodeInfo),
fEntries(),
fIterators(),
fEntryCreatedEventRevision(-1),
fEntryRemovedEventRevision(-1),
fIsComplete(false)
{
}
ShareDir::~ShareDir()
{
}
void
ShareDir::UpdateEntryCreatedEventRevision(int64 revision)
{
if (revision > fEntryCreatedEventRevision)
fEntryCreatedEventRevision = revision;
}
int64
ShareDir::GetEntryCreatedEventRevision() const
{
return fEntryCreatedEventRevision;
}
void
ShareDir::UpdateEntryRemovedEventRevision(int64 revision)
{
if (revision > fEntryRemovedEventRevision)
fEntryRemovedEventRevision = revision;
}
int64
ShareDir::GetEntryRemovedEventRevision() const
{
return fEntryRemovedEventRevision;
}
void
ShareDir::SetComplete(bool complete)
{
fIsComplete = complete;
}
bool
ShareDir::IsComplete() const
{
return fIsComplete;
}
void
ShareDir::AddEntry(ShareDirEntry* entry)
{
if (entry)
fEntries.Insert(entry);
}
void
ShareDir::RemoveEntry(ShareDirEntry* entry)
{
if (entry) {
for (LocalShareDirIterator* iterator = fIterators.First();
iterator;
iterator = fIterators.GetNext(iterator)) {
if (iterator->GetCurrentEntry() == entry)
iterator->NextEntry();
}
fEntries.Remove(entry);
}
}
ShareDirEntry*
ShareDir::GetFirstEntry() const
{
return fEntries.First();
}
ShareDirEntry*
ShareDir::GetNextEntry(ShareDirEntry* entry) const
{
if (!entry)
return NULL;
return fEntries.GetNext(entry);
}
void
ShareDir::AddDirIterator(LocalShareDirIterator* iterator)
{
if (!iterator)
return;
fIterators.Insert(iterator);
}
void
ShareDir::RemoveDirIterator(LocalShareDirIterator* iterator)
{
if (!iterator)
return;
fIterators.Remove(iterator);
}