use bitflags::bitflags;
bitflags! {
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct FPVolumeBitmap: u16 {
const ATTRIBUTES = 0x0001;
const SIGNATURE = 0x0002;
const CREATION_DATE = 0x0004;
const MODIFICATION_DATE = 0x0008;
const BACKUP_DATE = 0x0010;
const VOLUME_ID = 0x0020;
const BYTES_FREE = 0x0040;
const BYTES_TOTAL = 0x0080;
const VOLUME_NAME = 0x0100;
}
}
impl From<u16> for FPVolumeBitmap {
fn from(value: u16) -> Self {
Self::from_bits_truncate(value)
}
}
impl From<FPVolumeBitmap> for u16 {
fn from(val: FPVolumeBitmap) -> Self {
val.bits()
}
}
bitflags! {
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(transparent)]
pub struct FPDirectoryBitmap: u16 {
const ATTRIBUTES = 1;
const PARENT_DIR_ID = 1 << 1;
const CREATE_DATE = 1 << 2;
const MODIFICATION_DATE = 1 << 3;
const BACKUP_DATE = 1 << 4;
const FINDER_INFO = 1 << 5;
const LONG_NAME = 1 << 6;
const SHORT_NAME = 1 << 7;
const DIR_ID = 1 << 8;
const OFFSPRING_COUNT = 1 << 9;
const OWNER_ID = 1 << 10;
const GROUP_ID = 1 << 11;
const ACCESS_RIGHTS = 1 << 12;
const PRODOS_INFO = 1 << 13;
}
}
impl From<u16> for FPDirectoryBitmap {
fn from(value: u16) -> Self {
Self::from_bits_truncate(value)
}
}
impl From<FPDirectoryBitmap> for u16 {
fn from(val: FPDirectoryBitmap) -> Self {
val.bits()
}
}
impl FPDirectoryBitmap {
pub fn long_name_offset(&self) -> usize {
let mut offset = 0;
if self.contains(FPDirectoryBitmap::ATTRIBUTES) {
offset += 2;
}
if self.contains(FPDirectoryBitmap::PARENT_DIR_ID) {
offset += 4;
}
if self.contains(FPDirectoryBitmap::CREATE_DATE) {
offset += 4;
}
if self.contains(FPDirectoryBitmap::MODIFICATION_DATE) {
offset += 4;
}
if self.contains(FPDirectoryBitmap::BACKUP_DATE) {
offset += 4;
}
if self.contains(FPDirectoryBitmap::FINDER_INFO) {
offset += 32;
}
if self.contains(FPDirectoryBitmap::LONG_NAME) {
offset += 2;
}
if self.contains(FPDirectoryBitmap::SHORT_NAME) {
offset += 2;
}
if self.contains(FPDirectoryBitmap::DIR_ID) {
offset += 4;
}
if self.contains(FPDirectoryBitmap::OFFSPRING_COUNT) {
offset += 2;
}
if self.contains(FPDirectoryBitmap::OWNER_ID) {
offset += 4;
}
if self.contains(FPDirectoryBitmap::GROUP_ID) {
offset += 4;
}
if self.contains(FPDirectoryBitmap::ACCESS_RIGHTS) {
offset += 4;
}
if self.contains(FPDirectoryBitmap::PRODOS_INFO) {
offset += 6;
}
offset
}
pub fn response_len(&self, name_len: usize) -> usize {
self.long_name_offset() + name_len + 1
}
}
bitflags! {
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct FPFileBitmap: u16 {
const ATTRIBUTES = 1;
const PARENT_DIR_ID = 1 << 1;
const CREATE_DATE = 1 << 2;
const MODIFICATION_DATE = 1 << 3;
const BACKUP_DATE = 1 << 4;
const FINDER_INFO = 1 << 5;
const LONG_NAME = 1 << 6;
const SHORT_NAME = 1 << 7;
const FILE_NUMBER = 1 << 8;
const DATA_FORK_LENGTH = 1 << 9;
const RESOURCE_FORK_LENGTH = 1 << 10;
const ACCESS_RIGHTS = 1 << 12;
const PRODOS_INFO = 1 << 13;
}
}
impl From<u16> for FPFileBitmap {
fn from(value: u16) -> Self {
Self::from_bits_truncate(value)
}
}
impl From<FPFileBitmap> for u16 {
fn from(val: FPFileBitmap) -> Self {
val.bits()
}
}
impl FPFileBitmap {
pub fn long_name_offset(&self) -> usize {
let mut offset = 0;
if self.contains(FPFileBitmap::ATTRIBUTES) {
offset += 2;
}
if self.contains(FPFileBitmap::PARENT_DIR_ID) {
offset += 4;
}
if self.contains(FPFileBitmap::CREATE_DATE) {
offset += 4;
}
if self.contains(FPFileBitmap::MODIFICATION_DATE) {
offset += 4;
}
if self.contains(FPFileBitmap::BACKUP_DATE) {
offset += 4;
}
if self.contains(FPFileBitmap::FINDER_INFO) {
offset += 32;
}
if self.contains(FPFileBitmap::LONG_NAME) {
offset += 2;
}
if self.contains(FPFileBitmap::SHORT_NAME) {
offset += 2;
}
if self.contains(FPFileBitmap::FILE_NUMBER) {
offset += 4;
}
if self.contains(FPFileBitmap::DATA_FORK_LENGTH) {
offset += 4;
}
if self.contains(FPFileBitmap::RESOURCE_FORK_LENGTH) {
offset += 4;
}
if self.contains(FPFileBitmap::PRODOS_INFO) {
offset += 6;
}
offset
}
pub fn response_len(&self, name_len: usize) -> usize {
self.long_name_offset() + name_len + 1
}
}
bitflags! {
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct FPFileAttributes: u16 {
const INVISIBLE = 1;
const MULTI_USER = 1 << 1;
const SYSTEM = 1 << 2;
const DAlreadyOpen = 1 << 3;
const RAlreadyOpen = 1 << 4;
const ReadOnly = 1 << 5;
const BackupNeeded = 1 << 6;
const RenameInhibit = 1 << 7;
const DeleteInhibit = 1 << 8;
const CopyProtect = 1 << 10;
const SetClear = 1 << 15;
}
}
impl From<u16> for FPFileAttributes {
fn from(value: u16) -> Self {
Self::from_bits_truncate(value)
}
}
impl From<FPFileAttributes> for u16 {
fn from(val: FPFileAttributes) -> Self {
val.bits()
}
}
bitflags! {
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct FPAccessRights: u8 {
const SEARCH = 0x01;
const READ = 0x02;
const WRITE = 0x04;
const OWNER = 0x80;
}
}
impl From<u8> for FPAccessRights {
fn from(value: u8) -> Self {
Self::from_bits_truncate(value)
}
}
pub fn afp_rights_to_mode(rights: FPAccessRights) -> u32 {
let mut mode = 0;
if rights.contains(FPAccessRights::READ) {
mode |= 4;
}
if rights.contains(FPAccessRights::WRITE) {
mode |= 2;
}
if rights.contains(FPAccessRights::SEARCH) {
mode |= 1;
}
mode
}
pub fn mode_to_afp_rights(mode: u32) -> FPAccessRights {
let mut rights = FPAccessRights::empty();
if mode & 4 != 0 {
rights |= FPAccessRights::READ;
}
if mode & 2 != 0 {
rights |= FPAccessRights::WRITE;
}
if mode & 1 != 0 {
rights |= FPAccessRights::SEARCH;
}
rights
}
impl From<FPAccessRights> for u8 {
fn from(rights: FPAccessRights) -> u8 {
rights.bits()
}
}
bitflags! {
#[derive(Debug, Clone, Copy)]
pub struct FPByteRangeLockFlags: u8 {
const UNLOCK = 0b00000001;
const END = 0b10000000;
}
}
impl From<u8> for FPByteRangeLockFlags {
fn from(value: u8) -> Self {
Self::from_bits_truncate(value)
}
}
impl From<FPByteRangeLockFlags> for u8 {
fn from(val: FPByteRangeLockFlags) -> Self {
val.bits()
}
}