1/*
2 * Copyright 2004-2008, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Copyright 2008-2017, Axel D��rfler, axeld@pinc-software.de.
4 * Distributed under the terms of the MIT License.
5 */
6#ifndef _K_PATH_H
7#define _K_PATH_H
8
9
10#include <KernelExport.h>
11
12
13namespace BPrivate {
14namespace DiskDevice {
15
16
17class KPath {
18public:
19	enum {
20		DEFAULT = 0,
21		NORMALIZE = 0x01,
22		TRAVERSE_LEAF_LINK = 0x02,
23		LAZY_ALLOC = 0x04
24	};
25public:
26								KPath(size_t bufferSize = B_PATH_NAME_LENGTH + 1);
27								KPath(const char* path, int32 flags = DEFAULT,
28									size_t bufferSize = B_PATH_NAME_LENGTH + 1);
29								KPath(const KPath& other);
30								~KPath();
31
32			status_t			SetTo(const char* path, int32 flags = DEFAULT,
33									size_t bufferSize = B_PATH_NAME_LENGTH + 1);
34			void				Adopt(KPath& other);
35
36			status_t			InitCheck() const;
37
38			status_t			SetPath(const char* path,
39									int32 flags = DEFAULT);
40			const char*			Path() const;
41			size_t				Length() const
42									{ return fPathLength; }
43
44			size_t				BufferSize() const
45									{ return fBufferSize; }
46			char*				LockBuffer(bool force = false);
47			void				UnlockBuffer();
48			char*				DetachBuffer();
49
50			const char*			Leaf() const;
51			status_t			ReplaceLeaf(const char* newLeaf);
52			bool				RemoveLeaf();
53				// returns false, if nothing could be removed anymore
54
55			status_t			Append(const char* toAppend,
56									bool isComponent = true);
57
58			status_t			Normalize(bool traverseLeafLink);
59
60			KPath&				operator=(const KPath& other);
61			KPath&				operator=(const char* path);
62
63			bool				operator==(const KPath& other) const;
64			bool				operator==(const char* path) const;
65			bool				operator!=(const KPath& other) const;
66			bool				operator!=(const char* path) const;
67
68private:
69			status_t			_AllocateBuffer();
70			void				_FreeBuffer();
71			status_t			_Normalize(const char* path,
72									bool traverseLeafLink);
73			void				_ChopTrailingSlashes();
74
75private:
76			char*				fBuffer;
77			size_t				fBufferSize;
78			size_t				fPathLength;
79			bool				fLocked;
80			bool				fLazy;
81			bool				fFailed;
82			bool				fIsNull;
83};
84
85
86} // namespace DiskDevice
87} // namespace BPrivate
88
89
90using BPrivate::DiskDevice::KPath;
91
92
93#endif	/* _K_PATH_H */
94