1//----------------------------------------------------------------------
2//  This software is part of the OpenBeOS distribution and is covered
3//  by the OpenBeOS license.
4//
5//  Copyright (c) 2003 Tyler Dauwalder, tyler@dauwalder.net
6//  Mad props to Axel Dörfler and his BFS implementation, from which
7//  this UDF implementation draws much influence (and a little code :-P).
8//---------------------------------------------------------------------
9#ifndef _UDF_VOLUME_H
10#define _UDF_VOLUME_H
11
12/*! \file Volume.h
13*/
14
15#include <KernelExport.h>
16#ifndef _IMPEXP_KERNEL
17#	define _IMPEXP_KERNEL
18#endif
19
20#ifdef COMPILE_FOR_R5
21extern "C" {
22#endif
23	#include "fsproto.h"
24#ifdef COMPILE_FOR_R5
25}
26#endif
27
28#include "kernel_cpp.h"
29#include "UdfDebug.h"
30
31#include "UdfString.h"
32#include "UdfStructures.h"
33#include "Partition.h"
34
35namespace Udf {
36
37class Icb;
38
39class Volume {
40public:
41	// Construction/destruction
42	Volume(nspace_id id);
43	~Volume();
44
45	// Mounting/unmounting
46	status_t Mount(const char *deviceName, off_t offset, off_t length,
47                   uint32 blockSize, uint32 flags);
48	status_t Unmount();
49
50	// Address mapping
51	status_t MapBlock(long_address address, off_t *mappedBlock);
52	status_t MapExtent(long_address logicalExtent, extent_address &physicalExtent);
53
54	// Miscellaneous info
55	const char *Name() const;
56	int Device() const { return fDevice; }
57	nspace_id Id() const { return fId; }
58	off_t Offset() const { return fOffset; }
59	off_t Length() const { return fLength; }
60	uint32 BlockSize() const { return fBlockSize; }
61	uint32 BlockShift() const { return fBlockShift; }
62	bool Mounted() const { return fMounted; }
63	Icb* RootIcb() { return fRootIcb; }
64
65private:
66	Volume();						// unimplemented
67	Volume(const Volume &ref);		// unimplemented
68	Volume& operator=(const Volume &ref);	// unimplemented
69
70	void _Unset();
71
72	status_t _SetPartition(uint number, Partition *partition);
73	Partition* _GetPartition(uint number);
74
75private:
76	nspace_id fId;
77	int fDevice;
78	bool fMounted;
79	off_t fOffset;
80	off_t fLength;
81	uint32 fBlockSize;
82	uint32 fBlockShift;
83	Partition *fPartitions[UDF_MAX_PARTITION_MAPS];
84	Icb *fRootIcb;	// Destroyed by vfs via callback to release_node()
85	String fName;
86};
87
88};	// namespace Udf
89
90#endif	// _UDF_VOLUME_H
91