From: <cod...@go...> - 2007-09-12 01:42:09
|
Author: easuter Date: Tue Sep 11 18:41:54 2007 New Revision: 26 Modified: trunk/.project trunk/Functions.module Log: Changes: - Functions.module: Created the HexToLong function, to convet hexadecimal numbers to long integers. --- Implemented JFS, FAT12, FAT16, FAT32 and NTFS support in the getFreePartSpace function. Modified: trunk/.project ============================================================================== --- trunk/.project (original) +++ trunk/.project Tue Sep 11 18:41:54 2007 @@ -2,7 +2,7 @@ Title=VL-gui-installer Startup=Main Icon=vl_logo_icon2.png -Version=0.0.227 +Version=0.0.238 Library=gb.qt Library=gb.qt.ext TabSize=3 Modified: trunk/Functions.module ============================================================================== --- trunk/Functions.module (original) +++ trunk/Functions.module Tue Sep 11 18:41:54 2007 @@ -20,6 +20,18 @@ END +PUBLIC FUNCTION HexToLong(sHexval AS String) AS Long +'Turn a hexadecimal number into a long integer (thanks to help from Timothy Marshal-Nichols) +DIM iHexVal AS Long + +sHexval = "&H" & Right$(sHexval, 10) +iHexVal = CLng(Val(sHexval)) + +RETURN iHexVal + +END + + PUBLIC FUNCTION getPartType(t AS String) AS String ' Return partition type (t) string from partition type code: @@ -213,8 +225,8 @@ END -PUBLIC FUNCTION getFreePartSpace(device AS String, filesystem AS String) AS Long -'Calculate the free space on a partition based on its filesystem, and then return the value +PUBLIC FUNCTION getFreePartSpace(sDevice AS String, sFilesystem AS String) AS Long +'Calculate the free space on a partition based on its filesystem, and then return the value as a long integer 'This is basicaly a Gambas implementation of what GParted does for detecting free space on partitions in C++ DIM sTemp AS String DIM sTemp2 AS String @@ -223,33 +235,67 @@ DIM arrTemp AS NEW String[] DIM iFreeBytes AS Long -device = Trim$(device) -filesystem = Trim$(filesystem) +sDevice = Trim$(sDevice) +sFilesystem = Trim$(sFilesystem) 'The array's index used ([x]) to get the free blocks and the block size was obtained by studying the ouput of the commands used below -IF filesystem = "Ext3" OR filesystem = "Ext2" THEN - SHELL "dumpe2fs -h " & device TO sTemp +IF sFilesystem = "Ext2" OR sFilesystem = "Ext3" THEN + SHELL "dumpe2fs -h " & sDevice TO sTemp sTemp = Trim$(sTemp) arrTemp = Split(sTemp, Chr$(10)) sFreeBlocks = Trim$(Mid$(arrTemp[13], RInStr(arrTemp[13], Space$(1)))) sBlockSize = Trim$(Mid$(arrTemp[16], RInStr(arrTemp[16], Space$(1)))) iFreeBytes = CLng(sFreeBlocks) * CLng(sBlockSize) -ELSE IF filesystem = "XFS" THEN - SHELL "xfs_db -c 'sb 0' -c 'print blocksize' -c 'print fdblocks' -r " & device TO sTemp +ELSE IF sFilesystem = "XFS" THEN + SHELL "xfs_db -c 'sb 0' -c 'print blocksize' -c 'print fdblocks' -r " & sDevice TO sTemp sTemp = Trim$(sTemp) arrTemp = Split(sTemp, Chr$(10)) sFreeBlocks = Trim$(Mid$(arrTemp[1], RInStr(arrTemp[1], Space$(1)))) sBlockSize = Trim$(Mid$(arrTemp[0], RInStr(arrTemp[0], Space$(1)))) iFreeBytes = CLng(sFreeBlocks) * CLng(sBlockSize) -ELSE IF filesystem = "ReiserFS" THEN - SHELL "debugreiserfs " & device TO sTemp +ELSE IF sFilesystem = "ReiserFS" THEN + SHELL "debugreiserfs " & sDevice TO sTemp sTemp = Trim$(sTemp) arrTemp = Split(sTemp, Chr$(10)) sFreeBlocks = Trim$(Mid$(arrTemp[6], RInStr(arrTemp[6], Space$(1)))) sBlockSize = Trim$(Mid$(arrTemp[5], RInStr(arrTemp[5], Space$(1)))) iFreeBytes = CLng(sFreeBlocks) * CLng(sBlockSize) -ELSE IF filesystem = "JFS" THEN - iFreeBytes = 0 +ELSE IF sFilesystem = "JFS" THEN + SHELL "echo dm | jfs_debugfs " & sDevice TO sTemp + sTemp = Trim$(sTemp) + arrTemp = Split(sTemp, Chr$(10)) + sFreeBlocks = Trim$(Mid$(Left$(arrTemp[8], RInStr(arrTemp[8], "[") - 1), InStr(arrTemp[8], ":") + 1)) + sBlockSize = Trim$(Mid$(arrTemp[2], RInStr(arrTemp[2], Space$(1)))) + iFreeBytes = HexToLong(sFreeBlocks) * CLng(sBlockSize) +ELSE IF sFilesystem = "FAT12" OR sFilesystem = "FAT16" OR sFilesystem = "FAT32" THEN 'Who even uses FAT12 on today's hard-drives anyway?! + SHELL "dosfsck -v " & sDevice TO sTemp 'The "-a" switch sould also be used to automaticaly repair a FAT partition, but that can take ages...lets see how well it works without it. + sTemp = Trim$(sTemp) + arrTemp = Split(sTemp, Chr$(10)) + 'Reuse sTemp, can't get sFreeBlocks in one go + sTemp = Trim$(Mid$(Left$(arrTemp[20], RInStr(arrTemp[20], "/") - 1), InStr(arrTemp[20], ",") + 1)) + sTemp2 = Trim$(Mid$(Left$(arrTemp[20], RInStr(arrTemp[20], Space$(1))), RInStr(arrTemp[20], "/") + 1)) + sFreeBlocks = Str(CLng(Val(sTemp2) - Val(sTemp))) + sBlockSize = Trim$(Left$(Trim$(arrTemp[7]), InStr(Trim$(arrTemp[7]), Space$(1)))) + iFreeBytes = CLng(sFreeBlocks) * CLng(sBlockSize) +ELSE IF sFilesystem = "NTFS" THEN + SHELL "ntfsresize --info --force --no-progress-bar " & sDevice TO sTemp + sTemp = Trim$(sTemp) + arrTemp = Split(sTemp, Chr$(10)) + PRINT arrTemp[10] + 'It would be a lot easier to use an expression in the output of ntfsresize to identify the number of free bytes, but that is not i18n ready! + 'So "chomp" away portions of the string until the first integer is found (this will be the free space value) + sTemp = arrTemp[10] + WHILE Len(sTemp) > 0 + sTemp2 = Trim$(Left$(sTemp, InStr(sTemp, Space$(1)))) + IF IsInteger(Val(sTemp2)) OR IsLong(Val(sTemp2)) THEN + sFreeBlocks = CLng(Val(sTemp2)) + BREAK + ELSE + sTemp = Trim$(Mid$(sTemp, InStr(sTemp, Space$(1)))) + ENDIF + WEND + sBlockSize = Trim$(Mid$(Left$(arrTemp[3], RInStr(arrTemp[3], Space$(1))), InStr(arrTemp[3], ":") + 1)) + iFreeBytes = CLng(sFreeBlocks) * CLng(sBlockSize) ELSE iFreeBytes = 0 ENDIF |