mirror of
https://github.com/doublecmd/doublecmd.git
synced 2026-06-21 09:58:13 +00:00
ADD: distinguishing between dtRemovable and dtRemovableUsb on macOS
This commit is contained in:
parent
148ea14905
commit
5ce97db777
2 changed files with 52 additions and 0 deletions
|
|
@ -1394,6 +1394,10 @@ begin
|
|||
|
||||
if (dtype = dtHardDisk) and (fsPtr^.mountpoint <> PathDelim) then
|
||||
dtype := dtRemovableUsb;
|
||||
{$IFDEF DARWIN}
|
||||
if darwinVolumns.isRemovable(fsPtr) then
|
||||
dtype := dtRemovable;
|
||||
{$ENDIF}
|
||||
|
||||
New(drive);
|
||||
Result.Add(drive);
|
||||
|
|
|
|||
|
|
@ -78,6 +78,8 @@ type
|
|||
_statfsCount: Integer;
|
||||
private
|
||||
function createVolumns: NSArray;
|
||||
function getDeviceID( const fs: PDarwinStatfs ): NSString;
|
||||
function getVolumnByDeviceID( const deviceID: NSString ): NSDictionary;
|
||||
function getGroupUUIDByDeviceID( const deviceID: NSString ): NSString;
|
||||
function getApfsDataDeviceIDByGroupUUID( const groupUUID: NSString ): NSString;
|
||||
function getStatfsByDeviceID( const deviceID: NSString ): PDarwinStatfs;
|
||||
|
|
@ -86,6 +88,7 @@ type
|
|||
destructor Destroy; override;
|
||||
function getPathByDeviceID( const deviceID: String; fs: PDarwinStatfs ): String;
|
||||
function getDisplayNameByDeviceID( const deviceID: String; fs: PDarwinStatfs ): String;
|
||||
function isRemovable( fs: PDarwinStatfs ): Boolean;
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
|
@ -95,9 +98,11 @@ const
|
|||
ROLE_DATA_MASK = $40;
|
||||
|
||||
var
|
||||
BsdName_KEY: NSString;
|
||||
VolGroupUUID_KEY: NSString;
|
||||
VolGroupMntFromName_KEY: NSString;
|
||||
RoleValue_KEY: NSString;
|
||||
Removable_KEY: NSString;
|
||||
NULL_UUID: NSString;
|
||||
|
||||
{ TDarwinIOVolumns }
|
||||
|
|
@ -110,9 +115,12 @@ var
|
|||
ret: integer;
|
||||
volumnProperties: NSMutableDictionary;
|
||||
volumns: NSMutableArray;
|
||||
|
||||
bsdName: CFTypeRef;
|
||||
groupUUID: CFTypeRef;
|
||||
mntFromName: CFTypeRef;
|
||||
roleValue: CFTypeRef;
|
||||
removable: CFTypeRef;
|
||||
begin
|
||||
Result:= nil;
|
||||
|
||||
|
|
@ -133,12 +141,16 @@ begin
|
|||
if ret <> 0 then
|
||||
break;
|
||||
volumnProperties:= NSMutableDictionary.new;
|
||||
bsdName:= IORegistryEntryCreateCFProperty( ioVolumnObject, BsdName_KEY, kCFAllocatorDefault, 0 );
|
||||
volumnProperties.setValue_forKey( bsdName , BsdName_KEY );
|
||||
groupUUID:= IORegistryEntryCreateCFProperty( ioVolumnObject, VolGroupUUID_KEY, kCFAllocatorDefault, 0 );
|
||||
volumnProperties.setValue_forKey( groupUUID , VolGroupUUID_KEY );
|
||||
mntFromName:= IORegistryEntryCreateCFProperty( ioVolumnObject, VolGroupMntFromName_KEY, kCFAllocatorDefault, 0 );
|
||||
volumnProperties.setValue_forKey( mntFromName , VolGroupMntFromName_KEY );
|
||||
roleValue:= IORegistryEntryCreateCFProperty( ioVolumnObject, RoleValue_KEY, kCFAllocatorDefault, 0 );
|
||||
volumnProperties.setValue_forKey( roleValue , RoleValue_KEY );
|
||||
removable:= IORegistryEntryCreateCFProperty( ioVolumnObject, Removable_KEY, kCFAllocatorDefault, 0 );
|
||||
volumnProperties.setValue_forKey( removable , Removable_KEY );
|
||||
volumns.addObject( volumnProperties );
|
||||
volumnProperties.release;
|
||||
until False;
|
||||
|
|
@ -146,6 +158,28 @@ begin
|
|||
Result:= volumns;
|
||||
end;
|
||||
|
||||
function TDarwinIOVolumns.getDeviceID(const fs: PDarwinStatfs): NSString;
|
||||
var
|
||||
deviceID: String;
|
||||
begin
|
||||
deviceID:= ExtractFileName( fs^.mntfromname );
|
||||
Result:= StrToNSString( deviceID );
|
||||
end;
|
||||
|
||||
function TDarwinIOVolumns.getVolumnByDeviceID(const deviceID: NSString
|
||||
): NSDictionary;
|
||||
var
|
||||
volumn: NSDictionary;
|
||||
begin
|
||||
Result:= nil;
|
||||
for volumn in _volumns do begin
|
||||
if NOT deviceID.isEqual( volumn.valueForKey(BsdName_KEY) ) then
|
||||
continue;
|
||||
Result:= volumn;
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TDarwinIOVolumns.getGroupUUIDByDeviceID(const deviceID: NSString
|
||||
): NSString;
|
||||
var
|
||||
|
|
@ -245,10 +279,24 @@ begin
|
|||
end;
|
||||
end;
|
||||
|
||||
function TDarwinIOVolumns.isRemovable(fs: PDarwinStatfs): Boolean;
|
||||
var
|
||||
deviceID: NSString;
|
||||
volumn: NSDictionary;
|
||||
removable: NSNumber;
|
||||
begin
|
||||
deviceID:= self.getDeviceID( fs );
|
||||
volumn:= self.getVolumnByDeviceID( deviceID );
|
||||
removable:= NSNumber( volumn.valueForKey(Removable_KEY) );
|
||||
Result:= ( removable.integerValue <> 0 );
|
||||
end;
|
||||
|
||||
initialization
|
||||
BsdName_KEY:= NSSTR( 'BSD Name' );
|
||||
VolGroupUUID_KEY:= NSSTR( 'VolGroupUUID' );
|
||||
VolGroupMntFromName_KEY:= NSSTR( 'VolGroupMntFromName' );
|
||||
RoleValue_KEY:= NSSTR( 'RoleValue' );
|
||||
Removable_KEY:= NSSTR( 'Removable' );
|
||||
NULL_UUID:= NSSTR('00000000-0000-0000-0000-000000000000');
|
||||
|
||||
end.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue