xref: /haiku/src/add-ons/kernel/file_systems/ramfs/Entry.cpp (revision 52c4471a3024d2eb81fe88e2c3982b9f8daa5e56)
1 /*
2  * Copyright 2007, Ingo Weinhold, ingo_weinhold@gmx.de.
3  * All rights reserved. Distributed under the terms of the MIT license.
4  */
5 
6 #include "AllocationInfo.h"
7 #include "DebugSupport.h"
8 #include "Entry.h"
9 #include "EntryIterator.h"
10 #include "Node.h"
11 #include "Volume.h"
12 
13 // constructor
14 Entry::Entry(const char *name, Node *node, Directory *parent)
15 	: fParent(parent),
16 	  fNode(NULL),
17 	  fName(name),
18 	  fReferrerLink(),
19 	  fIterators()
20 {
21 	if (node)
22 		Link(node);
23 }
24 
25 // destructor
26 Entry::~Entry()
27 {
28 	if (fNode)
29 		Unlink();
30 }
31 
32 // InitCheck
33 status_t
34 Entry::InitCheck() const
35 {
36 	return (fName.GetString() ? B_OK : B_NO_INIT);
37 }
38 
39 // Link
40 status_t
41 Entry::Link(Node *node)
42 {
43 	if (node == NULL)
44 		return B_BAD_VALUE;
45 	if (node == fNode)
46 		return B_OK;
47 
48 	// We first link to the new node and then unlink the old one.
49 	Node *oldNode = fNode;
50 	status_t error = node->Link(this);
51 	if (error == B_OK) {
52 		fNode = node;
53 		if (oldNode)
54 			oldNode->Unlink(this);
55 	}
56 	return error;
57 }
58 
59 // Unlink
60 status_t
61 Entry::Unlink()
62 {
63 	status_t error = (fNode ? B_OK : B_BAD_VALUE);
64 	if (error == B_OK && (error = fNode->Unlink(this)) == B_OK)
65 		fNode = NULL;
66 	return error;
67 }
68 
69 // SetName
70 status_t
71 Entry::SetName(const char *newName)
72 {
73 	status_t error = (newName ? B_OK : B_BAD_VALUE);
74 	if (error == B_OK) {
75 		if (!fName.SetTo(newName))
76 			SET_ERROR(error, B_NO_MEMORY);
77 	}
78 	return error;
79 }
80 
81 // AttachEntryIterator
82 void
83 Entry::AttachEntryIterator(EntryIterator *iterator)
84 {
85 	if (iterator && iterator->GetCurrent() == this && !iterator->IsSuspended())
86 		fIterators.Insert(iterator);
87 }
88 
89 // DetachEntryIterator
90 void
91 Entry::DetachEntryIterator(EntryIterator *iterator)
92 {
93 	if (iterator && iterator->GetCurrent() == this && iterator->IsSuspended())
94 		fIterators.Remove(iterator);
95 }
96 
97 // GetAllocationInfo
98 void
99 Entry::GetAllocationInfo(AllocationInfo &info)
100 {
101 	info.AddEntryAllocation();
102 	info.AddStringAllocation(fName.GetLength());
103 	fNode->GetAllocationInfo(info);
104 }
105