1327Sjkh// Directory.h
2228990Suqs
3327Sjkh#ifndef DIRECTORY_H
4327Sjkh#define DIRECTORY_H
5327Sjkh
6327Sjkh#include <util/DoublyLinkedList.h>
7327Sjkh
8327Sjkh#include "Node.h"
9327Sjkh
10327Sjkh
11327Sjkhclass Entry;
12327Sjkhclass File;
13327Sjkhclass SymLink;
14327Sjkh
15327Sjkhclass Directory : public Node {
16327Sjkhpublic:
17327Sjkh	Directory(Volume *volume);
18327Sjkh	virtual ~Directory();
19327Sjkh
20327Sjkh	virtual status_t Link(Entry *entry);
2193520Sobrien	virtual status_t Unlink(Entry *entry);
2293520Sobrien
2393520Sobrien	virtual status_t SetSize(off_t newSize);
2474699Ssobomax	virtual off_t GetSize() const;
2530221Scharnier
2669793Sobrien	Directory *GetParent() const;
27327Sjkh
28327Sjkh	status_t CreateDirectory(const char *name, Directory **directory);
29327Sjkh	status_t CreateFile(const char *name, File **file);
3084745Ssobomax	status_t CreateSymLink(const char *name, const char *path,
31327Sjkh						   SymLink **symLink);
32327Sjkh
3384745Ssobomax	bool IsEmpty() const { return fEntries.IsEmpty(); }
34327Sjkh
35327Sjkh	status_t AddEntry(Entry *entry);
36327Sjkh	status_t CreateEntry(Node *node, const char *name, Entry **entry = NULL);
37327Sjkh	status_t RemoveEntry(Entry *entry);
38327Sjkh	status_t DeleteEntry(Entry *entry);
39327Sjkh
40327Sjkh	status_t FindEntry(const char *name, Entry **entry) const;
41327Sjkh	status_t FindNode(const char *name, Node **node) const;
42327Sjkh	status_t FindAndGetNode(const char *name, Node **node,
43327Sjkh							Entry **entry = NULL) const;
44327Sjkh
45327Sjkh	status_t GetPreviousEntry(Entry **entry) const;
46327Sjkh	status_t GetNextEntry(Entry **entry) const;
47327Sjkh
48327Sjkh	// debugging
49327Sjkh	virtual void GetAllocationInfo(AllocationInfo &info);
50327Sjkh
51327Sjkhprivate:
5269793Sobrien	status_t _CreateCommon(Node *node, const char *name);
5330387Sjkh
5430387Sjkhprivate:
5569793Sobrien	DoublyLinkedList<Entry>	fEntries;
5630387Sjkh};
571338Sjkh
58327Sjkh#endif	// DIRECTORY_H
59327Sjkh