1// VirtualVolume.h
2
3#ifndef NET_FS_VIRTUAL_VOLUME_H
4#define NET_FS_VIRTUAL_VOLUME_H
5
6#include <fsproto.h>
7
8#include "Locker.h"
9#include "VirtualDir.h"
10#include "Volume.h"
11
12class VirtualNode;
13
14class VirtualVolume : public Volume {
15public:
16								VirtualVolume(VolumeManager* volumeManager);
17								~VirtualVolume();
18
19			status_t			Init(const char* name);
20			void				Uninit();
21
22	virtual	Node*				GetRootNode() const;
23
24	virtual	void				PrepareToUnmount();
25
26	virtual	status_t			AddChildVolume(Volume* volume);
27	virtual	void				RemoveChildVolume(Volume* volume);
28	virtual	Volume*				GetChildVolume(const char* name);
29
30			status_t			GetUniqueEntryName(const char* baseName,
31									char* buffer);
32
33			// FS
34	virtual	status_t			Unmount();
35	virtual	status_t			Sync();
36
37			// vnodes
38	virtual	status_t			ReadVNode(vnode_id vnid, char reenter,
39									Node** node);
40	virtual	status_t			WriteVNode(Node* node, char reenter);
41	virtual	status_t			RemoveVNode(Node* node, char reenter);
42
43			// nodes
44	virtual	status_t			FSync(Node* node);
45	virtual	status_t			ReadStat(Node* node, struct stat* st);
46	virtual	status_t			WriteStat(Node* node, struct stat *st,
47									uint32 mask);
48	virtual	status_t			Access(Node* node, int mode);
49
50			// files
51	virtual	status_t			Create(Node* dir, const char* name,
52									int openMode, int mode, vnode_id* vnid,
53									void** cookie);
54	virtual	status_t			Open(Node* node, int openMode,
55									void** cookie);
56	virtual	status_t			Close(Node* node, void* cookie);
57	virtual	status_t			FreeCookie(Node* node, void* cookie);
58	virtual	status_t			Read(Node* node, void* cookie, off_t pos,
59									void* buffer, size_t bufferSize,
60									size_t* bytesRead);
61	virtual	status_t			Write(Node* node, void* cookie, off_t pos,
62									const void* buffer, size_t bufferSize,
63									size_t* bytesWritten);
64	virtual	status_t			IOCtl(Node* node, void* cookie, int cmd,
65									void* buffer, size_t bufferSize);
66	virtual	status_t			SetFlags(Node* node, void* cookie,
67									int flags);
68
69			// hard links / symlinks
70	virtual	status_t			Link(Node* dir, const char* name,
71									Node* node);
72	virtual	status_t			Unlink(Node* dir, const char* name);
73	virtual	status_t			Symlink(Node* dir, const char* name,
74									const char* target);
75	virtual	status_t			ReadLink(Node* node, char* buffer,
76									size_t bufferSize, size_t* bytesRead);
77	virtual	status_t			Rename(Node* oldDir, const char* oldName,
78									Node* newDir, const char* newName);
79
80			// directories
81	virtual	status_t			MkDir(Node* dir, const char* name,
82									int mode);
83	virtual	status_t			RmDir(Node* dir, const char* name);
84	virtual	status_t			OpenDir(Node* node, void** cookie);
85	virtual	status_t			CloseDir(Node* node, void* cookie);
86	virtual	status_t			FreeDirCookie(Node* node, void* cookie);
87	virtual	status_t			ReadDir(Node* node, void* cookie,
88									struct dirent* buffer, size_t bufferSize,
89									int32 count, int32* countRead);
90	virtual	status_t			RewindDir(Node* node, void* cookie);
91	virtual	status_t			Walk(Node* dir, const char* entryName,
92									char** resolvedPath, vnode_id* vnid);
93
94			// attributes
95	virtual	status_t			OpenAttrDir(Node* node, void** cookie);
96	virtual	status_t			CloseAttrDir(Node* node, void* cookie);
97	virtual	status_t			FreeAttrDirCookie(Node* node,
98									void* cookie);
99	virtual	status_t			ReadAttrDir(Node* node, void* cookie,
100									struct dirent* buffer, size_t bufferSize,
101									int32 count, int32* countRead);
102	virtual	status_t			RewindAttrDir(Node* node, void* cookie);
103	virtual	status_t			ReadAttr(Node* node, const char* name,
104									int type, off_t pos, void* buffer,
105									size_t bufferSize, size_t* bytesRead);
106	virtual	status_t			WriteAttr(Node* node, const char* name,
107									int type, off_t pos, const void* buffer,
108									size_t bufferSize, size_t* bytesWritten);
109	virtual	status_t			RemoveAttr(Node* node, const char* name);
110	virtual	status_t			RenameAttr(Node* node,
111									const char* oldName, const char* newName);
112	virtual	status_t			StatAttr(Node* node, const char* name,
113									struct attr_info* attrInfo);
114
115			// queries
116	virtual	status_t			OpenQuery(const char* queryString,
117									uint32 flags, port_id port, int32 token,
118									QueryIterator** iterator);
119	virtual	void				FreeQueryIterator(QueryIterator* iterator);
120	virtual	status_t			ReadQuery(QueryIterator* iterator,
121									struct dirent* buffer, size_t bufferSize,
122									int32 count, int32* countRead);
123
124protected:
125			VirtualDir*			fRootNode;
126};
127
128#endif	// NET_FS_VIRTUAL_VOLUME_H
129