summaryrefslogtreecommitdiffhomepage
path: root/Private/KernelKit/DriveManager.hpp
blob: 027c93918752634c4835d6c5b2aeaf9e1d245ff1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/* -------------------------------------------

    Copyright Mahrouss Logic

------------------------------------------- */

#ifndef __DRIVE_MANAGER__
#define __DRIVE_MANAGER__

#include <CompilerKit/CompilerKit.hxx>
#include <KernelKit/DebugOutput.hpp>
#include <KernelKit/DeviceManager.hpp>
#include <KernelKit/HError.hpp>
#include <NewKit/Defines.hpp>
#include <NewKit/String.hpp>

#define kDriveInvalidID -1
#define kDriveNameLen 32

namespace HCore {
enum {
  kInvalidDrive = -1,
  kBlockDevice = 0xAD,
  kMassStorage = 0xDA,
  kFloppyDisc = 0xCD,
  kOpticalDisc = 0xDC,  // CD-ROM/DVD-ROM/Blu-Ray
  kReadOnly = 0x10,     // Read only drive
  kEPMDrive = 0x11,     // Explicit Partition Map.
  kEPTDrive = 0x12,     // ESP w/ EPM partition.
  kMBRDrive = 0x13,     // IBM PC classic partition scheme
  kDriveCnt = 9,
};

typedef Int64 rt_drive_id_type;

/// @brief Mounted drive traits.
struct DriveTraits final {
  Char fName[kDriveNameLen];  // /System, /Boot, //./Devices/USB...
  Int32 fKind;                // fMassStorage, fFloppy, fOpticalDisc.
  rt_drive_id_type fId;       // Drive id.
  Int32 fFlags;               // fReadOnly, fXPMDrive, fXPTDrive

  //! for StorageKit.
  struct DrivePacket final {
    voidPtr fPacketContent;  // packet body.
    Char fPacketMime[32];    //! identify what we're sending.
    SizeT fPacketSize;       // packet size
    UInt32 fPacketCRC32;     // sanity crc, in case if good is set to false
    Boolean fPacketGood;
  } fPacket;
};

#define kPacketBinary "file/x-binary"
#define kPacketSource "file/x-source"
#define kPacketASCII "file/x-ascii"
#define kPacketZip "file/x-zip"

//! drive as a device.
typedef DeviceInterface<DriveTraits> DriveDevice;
typedef DriveDevice* DriveDevicePtr;

/**
 * @brief Abstracted hard-drive container class.
 * @note This class has all of it's drive set to nullptr, allocate them using
 * GetAddressOf(index).
 */
class Mountpoint final {
 public:
  explicit Mountpoint() = default;
  ~Mountpoint() = default;

  HCORE_COPY_DEFAULT(Mountpoint);

 public:
  DriveDevicePtr A() { return mA; }
  DriveDevicePtr B() { return mB; }
  DriveDevicePtr C() { return mC; }
  DriveDevicePtr D() { return mD; }

  DriveDevicePtr* GetAddressOf(int index) {
    DbgLastError() = kErrorSuccess;

    switch (index) {
      case 0:
        return &mA;
      case 1:
        return &mB;
      case 2:
        return &mC;
      case 3:
        return &mD;
      default: {
        DbgLastError() = kErrorNoSuchDisk;
        kcout << "HCoreKrnl\\Mountpoint: Check HError.\n";

        break;
      }
    }

    return nullptr;
  }

 private:
  DriveDevicePtr mA, mB, mC, mD = nullptr;
};
}  // namespace HCore

#endif /* ifndef __DRIVE_MANAGER__ */