Implemented new Directory::IsEmpty() method.
Amiga-FFS Directory::Lookup() now only creates a HashIterator if needed. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@4887 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -80,15 +80,15 @@ Directory::Close(void *cookie)
|
|||||||
Node *
|
Node *
|
||||||
Directory::Lookup(const char *name, bool traverseLinks)
|
Directory::Lookup(const char *name, bool traverseLinks)
|
||||||
{
|
{
|
||||||
HashIterator iterator(fVolume.Device(), fNode);
|
|
||||||
if (iterator.InitCheck() != B_OK)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (!strcmp(name, ".")) {
|
if (!strcmp(name, ".")) {
|
||||||
Acquire();
|
Acquire();
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HashIterator iterator(fVolume.Device(), fNode);
|
||||||
|
if (iterator.InitCheck() != B_OK)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
iterator.Goto(fNode.HashIndexFor(fVolume.Type(), name));
|
iterator.Goto(fNode.HashIndexFor(fVolume.Type(), name));
|
||||||
|
|
||||||
NodeBlock *node;
|
NodeBlock *node;
|
||||||
@@ -140,6 +140,14 @@ Directory::Rewind(void *cookie)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
Directory::IsEmpty()
|
||||||
|
{
|
||||||
|
int32 index;
|
||||||
|
return fNode.FirstHashValue(index) == -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
Directory::GetName(char *name, size_t size) const
|
Directory::GetName(char *name, size_t size) const
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ class Directory : public ::Directory {
|
|||||||
virtual status_t GetNextEntry(void *cookie, char *nameBuffer, size_t bufferSize);
|
virtual status_t GetNextEntry(void *cookie, char *nameBuffer, size_t bufferSize);
|
||||||
virtual status_t GetNextNode(void *cookie, Node **_node);
|
virtual status_t GetNextNode(void *cookie, Node **_node);
|
||||||
virtual status_t Rewind(void *cookie);
|
virtual status_t Rewind(void *cookie);
|
||||||
|
virtual bool IsEmpty();
|
||||||
|
|
||||||
virtual status_t GetName(char *name, size_t size) const;
|
virtual status_t GetName(char *name, size_t size) const;
|
||||||
|
|
||||||
|
|||||||
@@ -128,6 +128,30 @@ Directory::Rewind(void *cookie)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
Directory::IsEmpty()
|
||||||
|
{
|
||||||
|
TreeIterator iterator(&fTree);
|
||||||
|
|
||||||
|
// index and attribute directories are really empty when they are
|
||||||
|
// empty - directories for standard files always contain ".", and
|
||||||
|
// "..", so we need to ignore those two
|
||||||
|
|
||||||
|
uint32 count = 0;
|
||||||
|
char name[BPLUSTREE_MAX_KEY_LENGTH];
|
||||||
|
uint16 length;
|
||||||
|
off_t id;
|
||||||
|
while (iterator.GetNextEntry(name, &length, B_FILE_NAME_LENGTH, &id) == B_OK) {
|
||||||
|
if (fStream.Mode() & (S_ATTR_DIR | S_INDEX_DIR))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (++count > 2 || strcmp(".", name) && strcmp("..", name))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
Directory::GetName(char *name, size_t size) const
|
Directory::GetName(char *name, size_t size) const
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ class Directory : public ::Directory {
|
|||||||
virtual status_t GetNextEntry(void *cookie, char *nameBuffer, size_t bufferSize);
|
virtual status_t GetNextEntry(void *cookie, char *nameBuffer, size_t bufferSize);
|
||||||
virtual status_t GetNextNode(void *cookie, Node **_node);
|
virtual status_t GetNextNode(void *cookie, Node **_node);
|
||||||
virtual status_t Rewind(void *cookie);
|
virtual status_t Rewind(void *cookie);
|
||||||
|
virtual bool IsEmpty();
|
||||||
|
|
||||||
virtual status_t GetName(char *name, size_t size) const;
|
virtual status_t GetName(char *name, size_t size) const;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user