vol_mac.bmx 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. ' Copyright (c) 2007-2019 Bruce A Henderson
  2. '
  3. ' Permission is hereby granted, free of charge, to any person obtaining a copy
  4. ' of this software and associated documentation files (the "Software"), to deal
  5. ' in the Software without restriction, including without limitation the rights
  6. ' to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  7. ' copies of the Software, and to permit persons to whom the Software is
  8. ' furnished to do so, subject to the following conditions:
  9. '
  10. ' The above copyright notice and this permission notice shall be included in
  11. ' all copies or substantial portions of the Software.
  12. '
  13. ' THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  14. ' IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  15. ' FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  16. ' AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  17. ' LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  18. ' OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  19. ' THE SOFTWARE.
  20. '
  21. SuperStrict
  22. Import BRL.LinkedList
  23. Import BRL.Bank
  24. Import "main.bmx"
  25. Import "macglue.c"
  26. Extern
  27. Function FSFindFolder:Int( vRefNum:Int ,folderType:Int ,createFolder:Int ,foundRef:Byte Ptr )
  28. Function FSRefMakePath:Int( ref:Byte Ptr,path:Byte Ptr, maxPath:Int )
  29. Function bmx_vol_statfs_new:Byte Ptr()
  30. Function bmx_vol_statfs_free(fsPtr:Byte Ptr)
  31. Function bmx_vol_statfs:Int(vol:String, fsPtr:Byte Ptr)
  32. Function bmx_vol_getfsstat:Int(buf:Byte Ptr Ptr)
  33. Function bmx_vol_getfsstat_free(buf:Byte Ptr)
  34. Function bmx_vol_statfs_array_copy(fsPtr:Byte Ptr, buf:Byte Ptr, index:Int)
  35. Function bmx_vol_statfs_bsize:Int(fsPtr:Byte Ptr)
  36. Function bmx_vol_statfs_iosize:Int(fsPtr:Byte Ptr)
  37. Function bmx_vol_statfs_blocks(fsPtr:Byte Ptr, v:Long Ptr)
  38. Function bmx_vol_statfs_bfree(fsPtr:Byte Ptr, v:Long Ptr)
  39. Function bmx_vol_statfs_bavail(fsPtr:Byte Ptr, v:Long Ptr)
  40. Function bmx_vol_statfs_files(fsPtr:Byte Ptr, v:Long Ptr)
  41. Function bmx_vol_statfs_ffree(fsPtr:Byte Ptr, v:Long Ptr)
  42. Function bmx_vol_statfs_mntfromname:String(fsPtr:Byte Ptr)
  43. Function bmx_vol_statfs_mntonname:String(fsPtr:Byte Ptr)
  44. Function bmx_vol_statfs_fstypename:String(fsPtr:Byte Ptr)
  45. End Extern
  46. Rem
  47. bbdoc: Read-only system hierarchy.
  48. End Rem
  49. Const kSystemDomain:Int = -32766
  50. Rem
  51. bbdoc: All users of a single machine have access to these resources.
  52. End Rem
  53. Const kLocalDomain:Int = -32765
  54. Rem
  55. bbdoc: All users configured to use a common network server has access to these resources.
  56. End Rem
  57. Const kNetworkDomain:Int = -32764
  58. Rem
  59. bbdoc: Resources that are private to the user.
  60. about: Read/write.
  61. End Rem
  62. Const kUserDomain:Int = -32763
  63. Const kDesktopFolderType:Int = Asc("d") Shl 24 | Asc("e") Shl 16 | Asc( "s") Shl 8 | Asc("k")
  64. Const kCurrentUserFolderType:Int = Asc("c") Shl 24 | Asc("u") Shl 16 | Asc( "s") Shl 8 | Asc("r")
  65. Const kApplicationSupportFolderType:Int = Asc("a") Shl 24 | Asc("s") Shl 16 | Asc( "u") Shl 8 | Asc("p")
  66. Const kDocumentsFolderType:Int = Asc("d") Shl 24 | Asc("o") Shl 16 | Asc( "c") Shl 8 | Asc("s")
  67. Const kSharedUserDataFolderType:Int = Asc("s") Shl 24 | Asc("d") Shl 16 | Asc( "a") Shl 8 | Asc("t")
  68. Const kPictureDocumentsFolderType:Int = Asc("p") Shl 24 | Asc("d") Shl 16 | Asc( "o") Shl 8 | Asc("c")
  69. Const kMusicDocumentsFolderType:Int = $B5646F63
  70. Const kMovieDocumentsFolderType:Int = Asc("m") Shl 24 | Asc("d") Shl 16 | Asc( "o") Shl 8 | Asc("c")
  71. Const kTrashFolderType:Int = Asc("t") Shl 24 | Asc("r") Shl 16 | Asc("s") Shl 8 | Asc("h")
  72. Const kWhereToEmptyTrashFolderType:Int = Asc("e") Shl 24 | Asc("m") Shl 16 | Asc("p") Shl 8 | Asc("t")
  73. Const kFontsFolderType:Int = Asc("f") Shl 24 | Asc("o") Shl 16 | Asc("n") Shl 8 | Asc("t")
  74. Const kPreferencesFolderType:Int = Asc("p") Shl 24 | Asc("r") Shl 16 | Asc("e") Shl 8 | Asc("f")
  75. Const kSystemPreferencesFolderType:Int = Asc("s") Shl 24 | Asc("p") Shl 16 | Asc("r") Shl 8 | Asc("f")
  76. Const kTemporaryFolderType:Int = Asc("t") Shl 24 | Asc("e") Shl 16 | Asc("m") Shl 8 | Asc("p")
  77. Const kChewableItemsFolderType:Int = Asc("f") Shl 24 | Asc("l") Shl 16 | Asc("n") Shl 8 | Asc("t")
  78. Const kTemporaryItemsInCacheDataFolderType:Int = Asc("v") Shl 24 | Asc("t") Shl 16 | Asc("m") Shl 8 | Asc("p")
  79. Const kApplicationsFolderType:Int = Asc("a") Shl 24 | Asc("p") Shl 16 | Asc("p") Shl 8 | Asc("s")
  80. Const kVolumeRootFolderType:Int = Asc("r") Shl 24 | Asc("o") Shl 16 | Asc("o") Shl 8 | Asc("t")
  81. Const kDomainTopLevelFolderType:Int = Asc("d") Shl 24 | Asc("t") Shl 16 | Asc("o") Shl 8 | Asc("p")
  82. Const kDomainLibraryFolderType:Int = Asc("d") Shl 24 | Asc("l") Shl 16 | Asc("i") Shl 8 | Asc("b")
  83. Const kUsersFolderType:Int = Asc("u") Shl 24 | Asc("s") Shl 16 | Asc("r") Shl 8 | Asc("s")
  84. Const kInternetSitesFolderType:Int = Asc("s") Shl 24 | Asc("i") Shl 16 | Asc("t") Shl 8 | Asc("e")
  85. Const kPublicFolderType:Int = Asc("p") Shl 24 | Asc("u") Shl 16 | Asc("b") Shl 8 | Asc("b")
  86. Type Tstatfs
  87. Field fsPtr:Byte Ptr
  88. Method New()
  89. fsPtr = bmx_vol_statfs_new()
  90. End Method
  91. Method copy(buf:Byte Ptr, index:Int)
  92. bmx_vol_statfs_array_copy(fsPtr, buf, index)
  93. End Method
  94. Method _bsize:Int()
  95. Return bmx_vol_statfs_bsize(fsPtr)
  96. End Method
  97. Method _iosize:Int()
  98. Return bmx_vol_statfs_iosize(fsPtr)
  99. End Method
  100. Method _blocks:Long()
  101. Local v:Long
  102. bmx_vol_statfs_blocks(fsPtr, Varptr v)
  103. Return v
  104. End Method
  105. Method _bfree:Long()
  106. Local v:Long
  107. bmx_vol_statfs_bfree(fsPtr, Varptr v)
  108. Return v
  109. End Method
  110. Method _bavail:Long()
  111. Local v:Long
  112. bmx_vol_statfs_bavail(fsPtr, Varptr v)
  113. Return v
  114. End Method
  115. Method _files:Long()
  116. Local v:Long
  117. bmx_vol_statfs_files(fsPtr, Varptr v)
  118. Return v
  119. End Method
  120. Method _ffree:Long()
  121. Local v:Long
  122. bmx_vol_statfs_ffree(fsPtr, Varptr v)
  123. Return v
  124. End Method
  125. Method size:Long()
  126. Return _bsize() * _blocks()
  127. End Method
  128. Method sizeFree:Long()
  129. Return _bsize() * _bavail()
  130. End Method
  131. Method mountedFileSystem:String()
  132. Return bmx_vol_statfs_mntfromname(fsPtr)
  133. End Method
  134. Method dirOfMount:String()
  135. Return bmx_vol_statfs_mntonname(fsPtr)
  136. End Method
  137. Method fileSystemType:String()
  138. Return bmx_vol_statfs_fstypename(fsPtr)
  139. End Method
  140. Method Delete()
  141. If fsPtr Then
  142. bmx_vol_statfs_free(fsPtr)
  143. fsPtr = Null
  144. End If
  145. End Method
  146. End Type
  147. Global macVolume_driver:TMacVolumeDriver = New TMacVolumeDriver
  148. Type TMacVolumeDriver
  149. Method New()
  150. volume_driver = TMacVolume.Create()
  151. End Method
  152. End Type
  153. Type TMacVolume Extends TVolume
  154. Field vs:TVolSpace
  155. Function Create:TMacVolume()
  156. Local this:TMacVolume = New TMacVolume
  157. Return this
  158. End Function
  159. Method Refresh() Override
  160. If Not vs Then
  161. Return
  162. End If
  163. vs.refresh()
  164. If vs Then
  165. volumeSize = vs.size()
  166. volumeFree = vs.free()
  167. available = True
  168. Else
  169. available = False
  170. End If
  171. End Method
  172. Method ListVolumes:TList() Override
  173. Local volumes:TList
  174. ' temp buffer for array of structs
  175. Local b:Byte Ptr
  176. Local count:Int = bmx_vol_getfsstat(Varptr b)
  177. For Local i:Int = 0 Until count
  178. If Not volumes Then
  179. volumes = New TList
  180. End If
  181. Local volume:TMacVolume = New TMacVolume
  182. volume.vs = New TVolSpace
  183. volume.vs.fs.copy(b, i)
  184. volume.volumeName = volume.vs.fs.dirOfMount()
  185. volume.volumeDevice = volume.vs.fs.mountedFileSystem()
  186. volume.volumeType = volume.vs.fs.fileSystemType()
  187. volume.volumeSize = volume.vs.size()
  188. volume.volumeFree = volume.vs.free()
  189. volume.available = True
  190. volumes.addLast(volume)
  191. Next
  192. ' free buffer
  193. bmx_vol_getfsstat_free(b)
  194. Return volumes
  195. End Method
  196. Method GetVolumeFreeSpace:Long(vol:String) Override
  197. Local _vs:TVolSpace = TVolSpace.GetDiskSpace(vol)
  198. If _vs Then
  199. Return _vs.free()
  200. End If
  201. Return 0
  202. End Method
  203. Method GetVolumeSize:Long(vol:String) Override
  204. Local _vs:TVolSpace = TVolSpace.GetDiskSpace(vol)
  205. If _vs Then
  206. Return _vs.size()
  207. End If
  208. Return 0
  209. End Method
  210. Method GetVolumeInfo:TVolume(vol:String) Override
  211. Local volume:TMacVolume = New TMacVolume
  212. Local vs:TVolSpace = TVolSpace.GetDiskSpace(vol)
  213. If vs Then
  214. volume.volumeName = vs.fs.dirOfMount()
  215. volume.volumeDevice = vs.fs.mountedFileSystem()
  216. volume.volumeType = vs.fs.fileSystemType()
  217. volume.volumeSize = vs.size()
  218. volume.volumeFree = vs.free()
  219. volume.available = True
  220. End If
  221. Return volume
  222. End Method
  223. Method GetPath:String(folderType:Int, flags:Int = 0) Override
  224. Local buf:Byte[1024],ref:Byte[80]
  225. If flags Then
  226. If FSFindFolder( flags, folderType, False, ref ) Return Null
  227. Else
  228. If FSFindFolder( kUserDomain, folderType, False, ref ) Return Null
  229. End If
  230. If FSRefMakePath( ref,buf,1024 ) Return Null
  231. Return String.FromUTF8String( buf )
  232. End Method
  233. Method GetUserHomeDir:String() Override
  234. Return GetPath(kCurrentUserFolderType)
  235. End Method
  236. Method GetUserDesktopDir:String() Override
  237. Return GetPath(kDesktopFolderType)
  238. End Method
  239. Method GetUserAppDir:String() Override
  240. Return GetPath(kApplicationSupportFolderType)
  241. End Method
  242. Method GetUserDocumentsDir:String() Override
  243. Return GetPath(kDocumentsFolderType)
  244. End Method
  245. Method GetCustomDir:String(dirType:Int, flags:Int = 0) Override
  246. If dirType < 0 And dirType > -10 Then
  247. Select dirType
  248. Case DT_SHAREDUSERDATA
  249. Return GetPath(kSharedUserDataFolderType)
  250. Case DT_USERPICTURES
  251. Return GetPath(kPictureDocumentsFolderType)
  252. Case DT_USERMUSIC
  253. Return GetPath(kMusicDocumentsFolderType)
  254. Case DT_USERMOVIES
  255. Return GetPath(kMovieDocumentsFolderType)
  256. End Select
  257. Else
  258. Return GetPath(dirType, flags)
  259. End If
  260. Return Null
  261. End Method
  262. End Type
  263. Type TVolSpace
  264. Field vol:String
  265. Field fs:Tstatfs = New Tstatfs
  266. Function GetDiskSpace:TVolSpace(vol:String)
  267. Local this:TVolSpace = New TVolSpace
  268. this.vol = vol
  269. If this.refresh() <> 0 Then
  270. Return Null
  271. End If
  272. Return this
  273. End Function
  274. Method refresh:Int()
  275. Return bmx_vol_statfs(vol, fs.fsPtr)
  276. End Method
  277. Method size:Long()
  278. If fs Then
  279. Return fs.size()
  280. End If
  281. End Method
  282. Method free:Long()
  283. If fs Then
  284. Return fs.sizeFree()
  285. End If
  286. End Method
  287. End Type