Code: Select all
;-TOP by mk-soft, v1.01.0, 20.01.2024
; hdiutil create -volname WhatYouWantTheDiskToBeNamed -srcfolder /path/to/the/folder/you/want/to/create -ov -format UDZO name.dmg
; ----
Procedure CreateDMG(srcFolder.s, dmgFile.s, Title.s = "")
Protected r1, program, destFolder.s, destFile.s, param.s, Output$
If LCase(GetExtensionPart(dmgFile)) <> "dmg"
dmgFile + ".dmg"
EndIf
destFolder = GetPathPart(dmgFile)
destFile = GetFilePart(dmgFile)
If Title = ""
Title = GetFilePart(dmgFile, #PB_FileSystem_NoExtension)
EndIf
param = "create -volname " + #DQUOTE$ + Title + #DQUOTE$ + " -srcfolder " + #DQUOTE$ + srcFolder + #DQUOTE$
param + " -ov -format UDZO " + #DQUOTE$ + dmgFile + #DQUOTE$
; r1 = RunProgram("hdiutil", param, destFolder, #PB_Program_Wait)
r1 = RunProgram("hdiutil", param, destFolder, #PB_Program_Open | #PB_Program_Read)
Output$ = ""
If r1
While ProgramRunning(r1)
If AvailableProgramOutput(r1)
Output$ + ReadProgramString(r1) + Chr(13)
EndIf
Wend
Output$ + Chr(13) + Chr(13)
Output$ + "Exitcode: " + Str(ProgramExitCode(r1))
CloseProgram(r1) ; Close the connection to the program
;MessageRequester("Output", Output$)
If FileSize(dmgFile) < 0
r1 = 0
EndIf
EndIf
ProcedureReturn r1
EndProcedure
;- Main
Enumeration CustomEvent #PB_Event_FirstCustomValue
#MyEvent_CreateDMG_Busy
#MyEvent_CreateDMG_Done
#MyEvent_CreateDMG_Error
EndEnumeration
Global srcFolder.s, dmgFile.s
Procedure thCreateDMG(*dummy)
Protected r1
PostEvent(#MyEvent_CreateDMG_Busy)
r1 = CreateDMG(srcFolder, dmgFile)
If r1
PostEvent(#MyEvent_CreateDMG_Done)
Else
PostEvent(#MyEvent_CreateDMG_Error)
EndIf
EndProcedure
Procedure Main()
Protected dx, dy
Protected r1, temp.s
#WinStyle = #PB_Window_SystemMenu ; | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget
If OpenWindow(0, #PB_Ignore, #PB_Ignore, 580, 140, "DMG Create", #WinStyle)
; MenuBar
CreateMenu(0, WindowID(0))
MenuTitle("File")
; StatusBar
CreateStatusBar(0, WindowID(0))
AddStatusBarField(#PB_Ignore)
; Gadgets
dx = WindowWidth(0)
dy = WindowHeight(0) - StatusBarHeight(0) - MenuHeight()
TextGadget(0, 10, 10, 100, 20, "Source Folder")
StringGadget(1, 120, 8, 400, 25, "", #PB_String_ReadOnly)
ButtonGadget(2, 530, 10, 40, 25, "./.")
TextGadget(3, 10, 45, 100, 20, "DMG File Name")
StringGadget(4, 120, 43, 400, 25, "", #PB_String_ReadOnly)
ButtonGadget(5, 530, 45, 40, 25, "./.")
ButtonGadget(6, 10, 80, 120, 30, "Create DMG")
; Main Loop
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Select EventWindow()
Case 0
Break
EndSelect
Case #PB_Event_Menu
Select EventMenu()
EndSelect
Case #PB_Event_Gadget
Select EventGadget()
Case 2
temp = PathRequester("Folder", "")
If temp
srcFolder = temp
SetGadgetText(1, srcFolder)
EndIf
Case 5
temp = SaveFileRequester("DMG File", "", "", 0)
If temp
dmgFile = temp
If LCase(GetExtensionPart(dmgFile)) <> "dmg"
dmgFile + ".dmg"
EndIf
SetGadgetText(4, dmgFile)
EndIf
Case 6
If dmgFile <> "" And FileSize(srcFolder) = -2
If Not IsThread(r1)
r1 = CreateThread(@thCreateDMG(), 0)
If Not r1
MessageRequester("Create DMG", "Error Create Thread!")
EndIf
EndIf
EndIf
EndSelect
Case #MyEvent_CreateDMG_Busy
StatusBarText(0, 0, " Busy ...")
Case #MyEvent_CreateDMG_Done
StatusBarText(0, 0, " Done.")
MessageRequester("Create DMG", "Ready!")
Case #MyEvent_CreateDMG_Error
StatusBarText(0, 0, " Error!")
MessageRequester("Create DMG", "Error!")
EndSelect
ForEver
EndIf
EndProcedure : Main()