Added some convenience functions, a method to get the node's name, and

a node factory to get the correct type of node (Directory/File).


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@4653 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2003-09-12 07:32:21 +00:00
parent a421161e94
commit 8565a87552
2 changed files with 76 additions and 2 deletions

View File

@ -6,6 +6,8 @@
#include "Stream.h"
#include "Directory.h"
#include "File.h"
#include <stdlib.h>
#include <unistd.h>
@ -107,6 +109,15 @@ Stream::Stream(Volume &volume, block_run run)
}
Stream::Stream(Volume &volume, off_t id)
:
fVolume(volume)
{
if (read_pos(volume.Device(), volume.ToOffset(id), this, sizeof(bfs_inode)) != sizeof(bfs_inode))
return;
}
Stream::~Stream()
{
}
@ -119,6 +130,42 @@ Stream::InitCheck()
}
status_t
Stream::GetNextSmallData(const small_data **_smallData) const
{
const small_data *smallData = *_smallData;
// begin from the start?
if (smallData == NULL)
smallData = small_data_start;
else
smallData = smallData->Next();
// is already last item?
if (smallData->IsLast(this))
return B_ENTRY_NOT_FOUND;
*_smallData = smallData;
return B_OK;
}
status_t
Stream::GetName(char *name, size_t size) const
{
const small_data *smallData = NULL;
while (GetNextSmallData(&smallData) == B_OK) {
if (*smallData->Name() == FILE_NAME_NAME
&& smallData->NameSize() == FILE_NAME_NAME_LENGTH) {
strlcpy(name, (const char *)smallData->Data(), size);
return B_OK;
}
}
return B_ERROR;
}
status_t
Stream::FindBlockRun(off_t pos, block_run &run, off_t &offset)
{
@ -315,7 +362,7 @@ Stream::ReadAt(off_t pos, uint8 *buffer, size_t *_length)
if (partial) {
// if the last block was read only partially, point block_run
// to the remaining part
run.start += run.length;
run.start = HOST_ENDIAN_TO_BFS_INT16(run.Start() + run.Length());
run.length = 1;
offset = pos;
} else if (FindBlockRun(pos, run, offset) < B_OK) {
@ -329,6 +376,20 @@ Stream::ReadAt(off_t pos, uint8 *buffer, size_t *_length)
}
Node *
Stream::NodeFactory(Volume &volume, off_t id)
{
Stream stream(volume, id);
if (stream.InitCheck() != B_OK)
return NULL;
if (stream.IsContainer())
return new Directory(stream);
return new File(stream);
}
// #pragma mark -

View File

@ -9,20 +9,33 @@
#include "Volume.h"
#include <sys/stat.h>
namespace BFS {
class Stream : public bfs_inode {
public:
Stream(Volume &volume, block_run run);
Stream(Volume &volume, off_t id);
~Stream();
status_t InitCheck();
Volume &GetVolume() { return fVolume; }
Volume &GetVolume() const { return fVolume; }
status_t FindBlockRun(off_t pos, block_run &run, off_t &offset);
status_t ReadAt(off_t pos, uint8 *buffer, size_t *length);
status_t GetName(char *name, size_t size) const;
off_t Size() const { return data.Size(); }
off_t ID() const { return fVolume.ToVnode(inode_num); }
bool IsContainer() const { return Mode() & (S_IFDIR | S_INDEX_DIR | S_ATTR_DIR); }
static Node *NodeFactory(Volume &volume, off_t id);
private:
status_t GetNextSmallData(const small_data **_smallData) const;
Volume &fVolume;
};