Quellcode durchsuchen

Implemented haiku volume info.

Brucey vor 5 Jahren
Ursprung
Commit
c1d29ed6e5
3 geänderte Dateien mit 153 neuen und 35 gelöschten Zeilen
  1. 56 1
      volumes.mod/haikuglue.cpp
  2. 96 33
      volumes.mod/vol_haiku.bmx
  3. 1 1
      volumes.mod/volumes.bmx

+ 56 - 1
volumes.mod/haikuglue.cpp

@@ -24,6 +24,8 @@
 
 #include <FindDirectory.h>
 #include <Path.h>
+#include <VolumeRoster.h>
+#include <StorageDefs.h>
 #include <brl.mod/blitz.mod/blitz.h>
 
 extern "C" {
@@ -38,5 +40,58 @@ BBString * bmx_volumes_getdir(directory_which which) {
 	}
 }
 
-	
+BVolume * bmx_volumes_bvolume_new(BBString * name) {
+	char * n = bbStringToUTF8String(name);
+	BVolumeRoster roster;
+	BVolume vol;
+	while (roster.GetNextVolume(&vol) == B_OK) {
+		char vname[B_FILE_NAME_LENGTH];
+		vol.GetName(vname);
+		if (strcmp(n, vname) == 0) {
+			bbMemFree(n);
+			return new BVolume(vol);
+		}
+	}
+	bbMemFree(n);
+	return NULL;
+}
+
+BBString * bmx_volumes_bvolume_name(BVolume * vol) {
+	char name[B_FILE_NAME_LENGTH];
+	if (vol->GetName(name) == B_OK) {
+		return bbStringFromUTF8String(name);
+	}
+	else {
+		return &bbEmptyString;
+	}
+}
+
+BBLONG bmx_volumes_bvolume_size(BVolume * vol) {
+	return vol->Capacity();
+}
+
+BBLONG bmx_volumes_bvolume_freebytes(BVolume * vol) {
+	return vol->FreeBytes();
+}
+
+void bmx_volumes_bvolume_free(BVolume * vol) {
+	delete vol;
+}
+
+BVolumeRoster * bmx_volumes_list_init() {
+	return new BVolumeRoster();
+}
+
+BVolume * bmx_volumes_next_vol(BVolumeRoster * rost) {
+	BVolume vol;
+	if (rost->GetNextVolume(&vol) == B_OK) {
+		return new BVolume(vol);
+	}
+	return NULL;
+}
+
+void bmx_volumes_list_free(BVolumeRoster * rost) {
+	delete rost;
+}
+
 }

+ 96 - 33
volumes.mod/vol_haiku.bmx

@@ -28,6 +28,15 @@ Import "haikuglue.cpp"
 
 Extern
 	Function bmx_volumes_getdir:String(which:Int)
+	Function bmx_volumes_bvolume_new:Byte Ptr(name:String)
+	Function bmx_volumes_bvolume_name:String(handle:Byte Ptr)
+	Function bmx_volumes_bvolume_size:Long(handle:Byte Ptr)
+	Function bmx_volumes_bvolume_freebytes:Long(handle:Byte Ptr)
+	Function bmx_volumes_bvolume_free(handle:Byte Ptr)
+	
+	Function bmx_volumes_list_init:Byte Ptr()
+	Function bmx_volumes_next_vol:Byte Ptr(rost:Byte Ptr)
+	Function bmx_volumes_list_free(rost:Byte Ptr)
 End Extern
 
 Global haikuVolume_driver:THaikuVolumeDriver = New THaikuVolumeDriver
@@ -42,38 +51,83 @@ End Type
 
 Type THaikuVolume Extends TVolume
 
-	Field vs:TVolSpace
+	Field vol:TBVolume
 
 	Function Create:THaikuVolume()
-		Local this:THaikuVolume = New THaikuVolume
-		
-		Return this
+		Return New THaikuVolume
 	End Function
 
-
-	
 	Method ListVolumes:TList() Override
-		Local volumes:TList
+		Local volumes:TList = New TList
 		
-
+		Local vptr:Byte Ptr = bmx_volumes_list_init()
+		
+		While True
+			Local volPtr:Byte Ptr = bmx_volumes_next_vol(vptr)
+			
+			If Not volPtr Then
+				Exit
+			End If
+			
+			Local bvol:TBVolume = New TBVolume(volPtr)
+			If bvol.Name() Then
+			
+				Local volume:THaikuVolume = New THaikuVolume
+				volume.vol = bvol
+
+				volume.volumeName = bvol.Name()
+
+				volume.volumeSize = bvol.Size()
+				volume.volumeFree = bvol.Free()
+			
+				volume.available = True
+
+				volumes.AddLast(volume)
+			End If
+		Wend
+		
+		bmx_volumes_list_free(vptr)
 		
 		Return volumes
 	End Method
 	
 	Method GetVolumeFreeSpace:Long(vol:String) Override
-	
+		Local volume:TBVolume = New TBVolume(vol)
+		If volume.Valid() Then
+			Return volume.Free()
+		End If
+		Return 0
 	End Method
 	
 	Method GetVolumeSize:Long(vol:String) Override
-	
+		Local volume:TBVolume = New TBVolume(vol)
+		If volume.Valid() Then
+			Return volume.Size()
+		End If
+		Return 0
 	End Method
 
 	Method GetVolumeInfo:TVolume(vol:String) Override
-
+		Local volume:TBVolume = New TBVolume(vol)
+		If volume.Valid() Then
+			Local hv:THaikuVolume = New THaikuVolume
+			hv.vol = volume
+
+			hv.volumeName = volume.Name()
+			'hv.volumeDevice = vs.fs.mountedFileSystem()
+			'volume.volumeType = vs.fs.fileSystemType()
+
+			hv.volumeSize = volume.Size()
+			hv.volumeFree = volume.Free()
+			
+			hv.available = True
+			Return hv
+		End If
+		Return Null
 	End Method
 	
 	Method Refresh() Override
-
+		' noop
 	End Method
 	
 	Method GetUserHomeDir:String() Override
@@ -81,7 +135,7 @@ Type THaikuVolume Extends TVolume
 	End Method
 	
 	Method GetUserDesktopDir:String() Override
-		Return bmx_volumes_getdir(B_USER_DIRECTORY)
+		Return bmx_volumes_getdir(B_USER_DIRECTORY) + "/Desktop"
 	End Method
 	
 	Method GetUserAppDir:String() Override
@@ -98,35 +152,44 @@ Type THaikuVolume Extends TVolume
 
 End Type
 
-Type TVolSpace
-	Field vol:String	
-	Field _size:Long
-	Field _free:Long
-	
-	Function _create:TVolSpace() {  }
-		Local this:TVolSpace = New TVolSpace
-		
-		'this.vol = vol
-		If this.refresh() <> 0 Then
-			Return Null
-		End If
+Type TBVolume
 
-		Return this
-	End Function
+	Field volPtr:Byte Ptr
+	
+	Method New(name:String)
+		volPtr = bmx_volumes_bvolume_new(name)
+	End Method
+	
+	Method New(volPtr:Byte Ptr)
+		Self.VolPtr = volPtr
+	End Method
 	
-	Method refresh:Int()
-		'Return bmx_volumes_volspace_refresh(vol, Varptr _size, Varptr _free)
+	Method Valid:Int()
+		Return volPtr <> Null
 	End Method
 	
-	Method size:Long()
-		Return _size
+	Method Name:String()
+		Return bmx_volumes_bvolume_name(volPtr)
 	End Method
 	
-	Method free:Long()
-		Return _free
+	Method Size:Long()
+		Return bmx_volumes_bvolume_size(volPtr)
 	End Method
+	
+	Method Free:Long()
+		Return bmx_volumes_bvolume_freebytes(volPtr)
+	End Method
+	
+	Method Delete()
+		If volPtr Then
+			bmx_volumes_bvolume_free(volPtr)
+			volPtr = Null
+		End If
+	End Method
+
 End Type
 
+
 Private
 
 Const B_USER_DIRECTORY:Int = 3000

+ 1 - 1
volumes.mod/volumes.bmx

@@ -69,6 +69,6 @@ Import "vol_win.bmx"
 ?macos
 ModuleInfo "CC_OPTS: -D_DARWIN_FEATURE_64_BIT_INODE"
 Import "vol_mac.bmx"
-?linux
+?haiku
 Import "vol_haiku.bmx"
 ?