vfs: check userland buffers before reading them.
[haiku.git] / src / libs / alm / Tab.cpp
blobf9614b67895a965f74936f3296132a511eccd7bd
1 /*
2 * Copyright 2011, Clemens Zeidler <haiku@clemens-zeidler.de>
3 * Distributed under the terms of the MIT License.
4 */
7 #include <Tab.h>
10 #include <ALMLayout.h>
13 using std::nothrow;
14 using BALM::TabBase;
17 struct TabBase::BALMLayoutList {
18 BALMLayoutList(BALMLayout* _layout, BALMLayoutList* _next = NULL)
20 next(_next),
21 layout(_layout)
25 ~BALMLayoutList()
27 delete next;
30 bool HasLayout(BALMLayout* search)
32 if (layout == search)
33 return true;
34 return next ? next->HasLayout(search) : false;
37 BALMLayoutList* Remove(BALMLayout* remove)
39 if (layout == remove) {
40 BALMLayoutList* _next = next;
41 delete this;
42 return _next;
44 if (next)
45 next = next->Remove(remove);
46 return this;
49 BALMLayoutList* next;
50 BALMLayout* layout;
54 TabBase::TabBase()
56 fLayouts(NULL)
61 TabBase::TabBase(BMessage* archive)
63 BArchivable(BUnarchiver::PrepareArchive(archive)),
64 fLayouts(NULL)
66 BUnarchiver(archive).Finish(B_OK);
70 TabBase::~TabBase()
75 bool
76 TabBase::IsInLayout(BALMLayout* layout)
78 return fLayouts ? fLayouts->HasLayout(layout) : false;
82 bool
83 TabBase::AddedToLayout(BALMLayout* layout)
85 BALMLayoutList* newHead = new (nothrow) BALMLayoutList(layout, fLayouts);
86 if (newHead == NULL)
87 return false;
88 fLayouts = newHead;
89 return true;
93 void
94 TabBase::LayoutLeaving(BALMLayout* layout)
96 fLayouts = fLayouts->Remove(layout);
100 bool
101 TabBase::IsSuitableFor(BALMLayout* layout)
103 return (fLayouts->layout->Solver() == layout->Solver());
107 XTab::XTab(BALMLayout* layout)
109 Variable(layout->Solver())
111 AddedToLayout(layout);
115 XTab::XTab(BMessage* archive)
117 Variable(NULL),
118 TabBase(BUnarchiver::PrepareArchive(archive))
120 BUnarchiver(archive).Finish(B_OK);
124 XTab::~XTab()
126 TabBase::BALMLayoutList* layouts = fLayouts;
127 while (layouts) {
128 layouts->layout->fXTabList.RemoveItem(this);
129 layouts = layouts->next;
131 delete fLayouts;
135 BArchivable*
136 XTab::Instantiate(BMessage* archive)
138 if (validate_instantiation(archive, "BALM::XTab"))
139 return new XTab(archive);
140 return NULL;
144 YTab::YTab(BALMLayout* layout)
146 Variable(layout->Solver())
148 AddedToLayout(layout);
152 YTab::YTab(BMessage* archive)
154 Variable(NULL),
155 TabBase(BUnarchiver::PrepareArchive(archive))
157 BUnarchiver(archive).Finish(B_OK);
161 YTab::~YTab()
163 TabBase::BALMLayoutList* layouts = fLayouts;
164 while (layouts) {
165 layouts->layout->fYTabList.RemoveItem(this);
166 layouts = layouts->next;
168 delete fLayouts;
172 BArchivable*
173 YTab::Instantiate(BMessage* archive)
175 if (validate_instantiation(archive, "BALM::YTab"))
176 return new YTab(archive);
177 return NULL;