xref: /haiku/src/kits/storage/EntryOperationEngineBase.cpp (revision 6077cad882788bcf98d50dc596466b23ddb45c9e)
1 /*
2  * Copyright 2013-2014, Ingo Weinhold, ingo_weinhold@gmx.de.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include <EntryOperationEngineBase.h>
8 
9 #include <Directory.h>
10 #include <Entry.h>
11 #include <Path.h>
12 
13 
14 namespace BPrivate {
15 
16 
Entry(const char * path)17 BEntryOperationEngineBase::Entry::Entry(const char* path)
18 	:
19 	fDirectory(NULL),
20 	fPath(path),
21 	fEntry(NULL),
22 	fEntryRef(NULL),
23 	fDirectoryRef(NULL)
24 {
25 }
26 
27 
Entry(const BDirectory & directory,const char * path)28 BEntryOperationEngineBase::Entry::Entry(const BDirectory& directory,
29 	const char* path)
30 	:
31 	fDirectory(&directory),
32 	fPath(path),
33 	fEntry(NULL),
34 	fEntryRef(NULL),
35 	fDirectoryRef(NULL)
36 {
37 }
38 
39 
Entry(const BEntry & entry)40 BEntryOperationEngineBase::Entry::Entry(const BEntry& entry)
41 	:
42 	fDirectory(NULL),
43 	fPath(NULL),
44 	fEntry(&entry),
45 	fEntryRef(NULL),
46 	fDirectoryRef(NULL)
47 {
48 }
49 
50 
Entry(const entry_ref & entryRef)51 BEntryOperationEngineBase::Entry::Entry(const entry_ref& entryRef)
52 	:
53 	fDirectory(NULL),
54 	fPath(NULL),
55 	fEntry(NULL),
56 	fEntryRef(&entryRef),
57 	fDirectoryRef(NULL)
58 {
59 }
60 
61 
Entry(const node_ref & directoryRef,const char * path)62 BEntryOperationEngineBase::Entry::Entry(const node_ref& directoryRef,
63 	const char* path)
64 	:
65 	fDirectory(NULL),
66 	fPath(path),
67 	fEntry(NULL),
68 	fEntryRef(NULL),
69 	fDirectoryRef(&directoryRef)
70 {
71 }
72 
73 
~Entry()74 BEntryOperationEngineBase::Entry::~Entry()
75 {
76 }
77 
78 
79 status_t
GetPath(BPath & buffer,const char * & _path) const80 BEntryOperationEngineBase::Entry::GetPath(BPath& buffer, const char*& _path)
81 	const
82 {
83 	status_t error = B_OK;
84 
85 	if (fEntry != NULL) {
86 		error = buffer.SetTo(fEntry);
87 	} else if (fDirectory != NULL) {
88 		error = buffer.SetTo(fDirectory, fPath);
89 	} else if (fEntryRef != NULL) {
90 		error = buffer.SetTo(fEntryRef);
91 	} else if (fDirectoryRef != NULL) {
92 		BDirectory directory;
93 		error = directory.SetTo(fDirectoryRef);
94 		if (error == B_OK)
95 			error = buffer.SetTo(&directory, fPath);
96 	} else if (fPath != NULL) {
97 		_path = fPath;
98 		return B_OK;
99 	}
100 
101 	if (error != B_OK)
102 		return error;
103 
104 	_path = buffer.Path();
105 	return B_OK;
106 }
107 
108 
109 BString
Path() const110 BEntryOperationEngineBase::Entry::Path() const
111 {
112 	BPath pathBuffer;
113 	const char* path;
114 	if (GetPath(pathBuffer, path) == B_OK)
115 		return BString(path);
116 	return BString();
117 }
118 
119 
120 status_t
GetPathOrName(BString & _path) const121 BEntryOperationEngineBase::Entry::GetPathOrName(BString& _path) const
122 {
123 	_path.Truncate(0);
124 
125 	BPath buffer;
126 	const char* path;
127 	status_t error = GetPath(buffer, path);
128 	if (error == B_NO_MEMORY)
129 		return error;
130 
131 	if (error == B_OK) {
132 		_path = path;
133 	} else if (fEntry != NULL) {
134 		// GetPath() apparently failed, so just return the entry name.
135 		_path = fEntry->Name();
136 	} else if (fDirectory != NULL || fDirectoryRef != NULL) {
137 		if (fPath != NULL && fPath[0] == '/') {
138 			// absolute path -- just return it
139 			_path = fPath;
140 		} else {
141 			// get the directory path
142 			BEntry entry;
143 			if (fDirectory != NULL) {
144 				error = fDirectory->GetEntry(&entry);
145 			} else {
146 				BDirectory directory;
147 				error = directory.SetTo(fDirectoryRef);
148 				if (error == B_OK)
149 					error = directory.GetEntry(&entry);
150 			}
151 
152 			if (error != B_OK || (error = entry.GetPath(&buffer)) != B_OK)
153 				return error;
154 
155 			_path = buffer.Path();
156 
157 			// If we additionally have a relative path, append it.
158 			if (!_path.IsEmpty() && fPath != NULL) {
159 				int32 length = _path.Length();
160 				_path << '/' << fPath;
161 				if (_path.Length() < length + 2)
162 					return B_NO_MEMORY;
163 			}
164 		}
165 	} else if (fEntryRef != NULL) {
166 		// Getting the actual path apparently failed, so just return the entry
167 		// name.
168 		_path = fEntryRef->name;
169 	} else if (fPath != NULL)
170 		_path = fPath;
171 
172 	return _path.IsEmpty() ? B_NO_MEMORY : B_OK;
173 }
174 
175 
176 BString
PathOrName() const177 BEntryOperationEngineBase::Entry::PathOrName() const
178 {
179 	BString path;
180 	return GetPathOrName(path) == B_OK ? path : BString();
181 }
182 
183 
184 } // namespace BPrivate
185