xref: /haiku/src/apps/bootmanager/BootDrive.cpp (revision 1deede7388b04dbeec5af85cae7164735ea9e70d)
1 /*
2  * Copyright 2011, Axel Dörfler, axeld@pinc-software.de.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include "BootDrive.h"
8 
9 #include <DiskDevice.h>
10 #include <DiskDeviceRoster.h>
11 #include <Volume.h>
12 #include <VolumeRoster.h>
13 
14 
15 BootDrive::BootDrive(const char* path)
16 	:
17 	fPath(path)
18 {
19 }
20 
21 
22 BootDrive::~BootDrive()
23 {
24 }
25 
26 
27 BootMenu*
28 BootDrive::InstalledMenu(const BootMenuList& menus) const
29 {
30 	for (int32 i = 0; i < menus.CountItems(); i++) {
31 		BootMenu* menu = menus.ItemAt(i);
32 		if (menu->IsInstalled(*this))
33 			return menu;
34 	}
35 	return NULL;
36 }
37 
38 
39 status_t
40 BootDrive::CanMenuBeInstalled(const BootMenuList& menus) const
41 {
42 	status_t status = B_ERROR;
43 
44 	for (int32 i = 0; i < menus.CountItems(); i++) {
45 		status = menus.ItemAt(i)->CanBeInstalled(*this);
46 		if (status == B_OK)
47 			return status;
48 	}
49 	return status;
50 }
51 
52 
53 /*!	Adds all boot menus from the list \a from that support the drive to \a to.
54 */
55 void
56 BootDrive::AddSupportedMenus(const BootMenuList& from, BootMenuList& to)
57 {
58 	for (int32 i = 0; i < from.CountItems(); i++) {
59 		BootMenu* menu = from.ItemAt(i);
60 		if (menu->CanBeInstalled(*this))
61 			to.AddItem(menu);
62 	}
63 }
64 
65 
66 const char*
67 BootDrive::Path() const
68 {
69 	return fPath.Path();
70 }
71 
72 
73 bool
74 BootDrive::IsBootDrive() const
75 {
76 	BVolumeRoster volumeRoster;
77 	BVolume volume;
78 	if (volumeRoster.GetBootVolume(&volume) != B_OK)
79 		return false;
80 
81 	BDiskDeviceRoster roster;
82 	BDiskDevice device;
83 	if (roster.FindPartitionByVolume(volume, &device, NULL) == B_OK) {
84 		BPath path;
85 		if (device.GetPath(&path) == B_OK && path == fPath)
86 			return true;
87 	}
88 
89 	return false;
90 }
91 
92 
93 status_t
94 BootDrive::GetDiskDevice(BDiskDevice& device) const
95 {
96 	BDiskDeviceRoster roster;
97 	return roster.GetDeviceForPath(fPath.Path(), &device);
98 }
99