1/*
2 * Copyright 2013, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Ingo Weinhold <ingo_weinhold@gmx.de>
7 */
8#ifndef _NOT_OWNING_ENTRY_REF_H
9#define _NOT_OWNING_ENTRY_REF_H
10
11
12#include <Entry.h>
13#include <Node.h>
14
15
16namespace BPrivate {
17
18
19/*!	entry_ref subclass that avoids cloning the entry name.
20
21	Therefore initialization is cheaper and cannot fail. It derives from
22	entry_ref for convenience. However, care must be taken that:
23	 - the name remains valid while the object is in use,
24	 - the object isn't passed as an entry_ref to a function that modifies it.
25 */
26class NotOwningEntryRef : public entry_ref {
27public:
28	NotOwningEntryRef()
29	{
30	}
31
32	NotOwningEntryRef(dev_t device, ino_t directory, const char* name)
33	{
34		SetTo(device, directory, name);
35	}
36
37	NotOwningEntryRef(const node_ref& directoryRef, const char* name)
38	{
39		SetTo(directoryRef, name);
40	}
41
42	NotOwningEntryRef(const entry_ref& other)
43	{
44		*this = other;
45	}
46
47	~NotOwningEntryRef()
48	{
49		name = NULL;
50	}
51
52	NotOwningEntryRef& SetTo(dev_t device, ino_t directory, const char* name)
53	{
54		this->device = device;
55		this->directory = directory;
56		this->name = const_cast<char*>(name);
57		return *this;
58	}
59
60	NotOwningEntryRef& SetTo(const node_ref& directoryRef, const char* name)
61	{
62		return SetTo(directoryRef.device, directoryRef.node, name);
63	}
64
65	node_ref DirectoryNodeRef() const
66	{
67		return node_ref(device, directory);
68	}
69
70	NotOwningEntryRef& SetDirectoryNodeRef(const node_ref& directoryRef)
71	{
72		device = directoryRef.device;
73		directory = directoryRef.node;
74		return *this;
75	}
76
77	NotOwningEntryRef& operator=(const entry_ref& other)
78	{
79		return SetTo(other.device, other.directory, other.name);
80	}
81};
82
83
84} // namespace BPrivate
85
86
87using ::BPrivate::NotOwningEntryRef;
88
89
90#endif	// _NOT_OWNING_ENTRY_REF_H
91