1250840Smarcel/*
2250840Smarcel * Copyright 2009-2013, Ingo Weinhold, ingo_weinhold@gmx.de.
3250840Smarcel * Distributed under the terms of the MIT License.
4250840Smarcel */
5250840Smarcel#ifndef LEAF_NODE_H
6250840Smarcel#define LEAF_NODE_H
7250840Smarcel
8250840Smarcel
9250840Smarcel#include "Node.h"
10250840Smarcel#include "PackageLeafNode.h"
11250840Smarcel#include "UnpackingNode.h"
12250840Smarcel
13250840Smarcel
14250840Smarcelclass UnpackingLeafNode : public Node, public UnpackingNode {
15250840Smarcelpublic:
16250840Smarcel								UnpackingLeafNode(ino_t id);
17250840Smarcel	virtual						~UnpackingLeafNode();
18250840Smarcel
19250840Smarcel	virtual	status_t			VFSInit(dev_t deviceID);
20250840Smarcel	virtual	void				VFSUninit();
21250840Smarcel
22250840Smarcel	virtual	mode_t				Mode() const;
23250840Smarcel	virtual	uid_t				UserID() const;
24250840Smarcel	virtual	gid_t				GroupID() const;
25250840Smarcel	virtual	timespec			ModifiedTime() const;
26250840Smarcel	virtual	off_t				FileSize() const;
27250840Smarcel
28250840Smarcel	virtual	Node*				GetNode();
29250840Smarcel
30250840Smarcel	virtual	status_t			AddPackageNode(PackageNode* packageNode,
31250840Smarcel									dev_t deviceID);
32250840Smarcel	virtual	void				RemovePackageNode(PackageNode* packageNode,
33250840Smarcel									dev_t deviceID);
34250840Smarcel
35250840Smarcel	virtual	PackageNode*		GetPackageNode();
36250840Smarcel	virtual	bool				IsOnlyPackageNode(PackageNode* node) const;
37250840Smarcel	virtual	bool				WillBeFirstPackageNode(
38257144Snwhitehorn									PackageNode* packageNode) const;
39257144Snwhitehorn
40257144Snwhitehorn	virtual	void				PrepareForRemoval();
41257144Snwhitehorn	virtual	status_t			CloneTransferPackageNodes(ino_t id,
42250840Smarcel									UnpackingNode*& _newNode);
43250840Smarcel
44250840Smarcel	virtual	status_t			Read(off_t offset, void* buffer,
45250840Smarcel									size_t* bufferSize);
46250840Smarcel	virtual	status_t			Read(io_request* request);
47250840Smarcel
48250840Smarcel	virtual	status_t			ReadSymlink(void* buffer,
49250840Smarcel									size_t* bufferSize);
50250840Smarcel
51250840Smarcel	virtual	status_t			OpenAttributeDirectory(
52250840Smarcel									AttributeDirectoryCookie*& _cookie);
53250840Smarcel	virtual	status_t			OpenAttribute(const StringKey& name,
54250840Smarcel									int openMode, AttributeCookie*& _cookie);
55250840Smarcel
56250840Smarcel	virtual	status_t			IndexAttribute(AttributeIndexer* indexer);
57250840Smarcel	virtual	void*				IndexCookieForAttribute(const StringKey& name)
58250840Smarcel									const;
59250840Smarcel
60250840Smarcelprivate:
61250840Smarcel	inline	PackageLeafNode*	_ActivePackageNode() const;
62250840Smarcel
63250840Smarcelprivate:
64250840Smarcel			PackageLeafNodeList	fPackageNodes;
65250840Smarcel			PackageLeafNode*	fFinalPackageNode;
66250840Smarcel};
67250840Smarcel
68250840Smarcel
69250840Smarcel#endif	// LEAF_NODE_H
70250840Smarcel