; Installation script for NetSurf

(procedure p_setmimetype #type #mimetype
	(transcript "Setting MIME Type " #mimetype " for default " #type " icon")

	(set #fullpath (cat "ENVARC:Sys/def_" #type))

	(tooltype
		(prompt "Setting MIME type")
		(help @tooltype-help)
		(dest #fullpath)
		(settooltype "MIMETYPE" #mimetype)
	)
)

; The below procedure is part of "fitr", see
; http://www.unsatisfactorysoftware.co.uk/fitr
(procedure p_fitr #filename #text #comment #flags
	(set #comstring "")
	(if #comment (set #comstring (cat "COMMENT=\"" #comment "\"")))
	(set #comment "")
	(set #switches "")
	(if #flags (set #switches (cat " " #flags)))
	(set #flags "")

	(if #text
		(
			(transcript "Adding " @app-name " section to " #filename)

			(textfile
				(dest "t:fitr-installer.tmp")
				(append #text)
			)

			(run (cat "fitr \"" #filename "\" \"" @app-name "\" t:fitr-installer.tmp " #comstring #switches))
			(delete "t:fitr-installer.tmp")
		)
;else
		(
			(transcript "Removing " @app-name " section from " #filename)
			(run (cat "fitr \"" #filename "\" \"" @app-name "\" " #comstring #switches))
		)
	)
)

(procedure p_failedsobjs
	(if #failedsobjs
		(message "The following shared objects failed to copy.  These will be updated on next reboot.\n\n" #failedsobjs)
	)
)

(procedure p_schedulesobj #sobj
	(transcript "Scheduling update of " #sobj " for next reboot")

	(set #failedsobjs (cat #failedsobjs "\n" #sobj))

	(makedir "SObjs:so-installer")

	(copyfiles
		(source (tackon "SObjs" #sobj))
		(dest "SObjs:so-installer")
	)

	(startup "Shared object installer"
		(prompt "Adding commands to user-startup to schedule copy of " #sobj " on next reboot")
		(help @startup-help)
		(command "if EXISTS SObjs:so-installer\n")
		(command "  copy SObjs:so-installer SObjs: CLONE FORCE QUIET\n")
		(command "  delete SObjs:so-installer ALL FORCE QUIET\n")
		(command "endif\n")
	)
)

(procedure p_comparesobj2 #sobj1_full #sobj2_full
	(set #same 0)

	(set #sobj-version (getversion (#sobj1_full)))
	(if (= #sobj-version 0)
		(
			(if (exists (#sobj2_full))
				(
					(set #file-newer (earlier (#sobj2_full) (#sobj1_full)))
					(set #old-size (getsize (#sobj2_full)))
					(set #new-size (getsize (#sobj1_full)))

					(if (AND (= #old-size #new-size) (= #file-newer 0)) (set #same 1))
				)
			)
		)
		; else if version info is available
		(
			(set #sobj-oldversion (getversion (#sobj2_full)))

			(if (<= #sobj-version #sobj-oldversion) (set #same 1))
		)
	)
)

(procedure p_comparesobj #sobj
	(set #sobj1 (tackon "SObjs/" #sobj))
	(set #sobj2 (tackon "SObjs:" #sobj))

	(p_comparesobj2 #sobj1 #sobj2)
)

(procedure p_linksobj #sobj #sobj_link
	(set #sobj2 (tackon "SObjs:" #sobj_link))

	(p_comparesobj2 (tackon "SObjs/" #sobj) #sobj2)

	(if (= #same 0) ;if #sobj is newer than that pointed to by #sobj_link
		(
			(if (exists (#sobj2))
				(transcript "Deleting " #sobj2)
				(delete #sobj2 (optional "force")) ;prevent dodgy recursive links
			)
			(set #linkcmd (cat "makelink " #sobj2 " SObjs:" #sobj " soft"))
			(transcript "Running " #linkcmd)
			(run #linkcmd)
		)
	)
)

(procedure p_copysobj #sobj
	(set #sobj-version (getversion (tackon "SObjs/" #sobj)))

	(if (= #sobj-version 0)
		(
			(transcript "Date compare " #sobj)

			(if (exists (tackon "SObjs:" #sobj))
				(
					(set #file-newer (earlier (tackon "SObjs:" #sobj) (tackon "SObjs/" #sobj)))

					(if (= #file-newer 0)
						(
							(set #newer-text "has an older datestamp")
						)
						;else
						(
							(set #newer-text "has a newer datestamp")
						)
					)

					(set #old-size (getsize (tackon "SObjs:" #sobj)))
					(set #new-size (getsize (tackon "SObjs/" #sobj)))

					(if (AND (= #old-size #new-size) (= #file-newer 0))
						(
							(set #copy 0)
						)
						;else
						(
							(if (OR (= @user-level 2) (AND (= @user-level 1) (<> #file-newer 0)))
; Expert users are always prompted
; Average users are prompted if the file trying to be copied is newer
; Novice users are never prompted
; This is roughly equivalent to (copylib (confirm))
; No prompting occurs if the destination does not exist (silent copy)
; or the files are the same size and the one being copied isn't newer (don't copy)
								(
									(set #copy
										(askbool
											(prompt "Copying " #sobj "...\n\n"
												"Version to install: " #new-size " bytes\n"
												"Version currently installed: " #old-size " bytes\n\n"
												"The file to copy " #newer-text)
											(help @askbool-help)
											(default #file-newer)
											(choices "Proceed with copy" "Skip this part")
										)
									)
								)
								;else
								(
									(set #copy #file-newer)
								)
							)
						)
					)
				)
				; else if dest file does not exist
				(
					(set #copy 1)
				)
			)

			(if (<> #copy 0)
				(
					(if (<> #AutoInstall 1)
						(
							(copyfiles
								(prompt "Copying " #sobj "...")
								(help @copyfiles-help)
								(source (tackon "SObjs/" #sobj))
								(dest "SObjs:")
								(optional "nofail" "force")
							)
						)
						;else
						(
							(run "CopyStore SObjs/" #sobj " SObjs:")
						)
					)

					(p_comparesobj #sobj)
					(if (= #same 0)
						(
							(p_schedulesobj #sobj)
						)
					)
				)
			)
		)
		; else if version info is available
		(
			(if (<> #AutoInstall 1)
				(
					(copylib
						(prompt "Copying " #sobj "...")
						(help @copylib-help)
						(source (tackon "SObjs/" #sobj))
						(dest "SObjs:")
						(optional "nofail" "force")
						(confirm "expert")
					)
				)
				;else
				(
					(run "CopyStore SObjs/" #sobj " SObjs:")
				)
			)

			(p_comparesobj #sobj)
			(if (= #same 0)
				(
					(p_schedulesobj #sobj)
				)
			)
		)
	)
)

(procedure p_copylib #lib
	(if (<> #AutoInstall 1)
		(
			(copylib
				(prompt "Copying " #lib "...")
				(help @copylib-help)
				(source (tackon "Libs/" #lib))
				(dest "Libs:")
				(optional "nofail" "force")
				(confirm "expert")
			)
		)
		;else
		(
			(run "CopyStore Libs/" #lib " Libs:")
		)
	)
)

(procedure p_chk_launch-handler #protocol
	(run "C:Search >T:NS_Install.tmp " (tackon "ENVARC:launch-handler/URL" #protocol) " NetSurf" (safe))
	(set #has_entry (getsize "T:NS_Install.tmp"))
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Script execution starts here ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(if (= @app-name "NetSurfAutoInstall") (set #AutoInstall 1))
(set @app-name "NetSurf")

(if (<> #AutoInstall 1) (welcome))

(complete 0)

(set @default-dest (getenv "AppPaths/NetSurf"))

; If env-var did not exist, this is a first time install.
; For novice users we must take care to put the files somewhere sensible.
(if (= @default-dest "")
	(
		; Workaround for Installer bug picking TEXTCLIP: as a sensible location
		(if (= @default-dest "TextClip:") (set @default-dest "SYS:Utilities"))

		(if (= @user-level 0)
			(
				(makedir (tackon @default-dest "NetSurf") (infos))
				(set @default-dest (tackon @default-dest "NetSurf"))
			)
		)
	)
)

(set @default-dest
	(askdir
		(prompt "Where would you like to install NetSurf?\n"
				"(a drawer will not be created)")
		(help @askdir-help)
		(default @default-dest)
	)
)

(complete 5)

(working "Checking existing installation...")
(set #icon-exists (exists (tackon @default-dest "NetSurf.info")))
(set osver (getversion))
(set osver (/ osver 65536))
(set #versions-available 0)

(if (exists "NetSurf-Static")
	(
		(set #static-name "Static/graphics.library")
		(set #versions-available (+ #versions-available 1))
	)
	; else
	(
		(set #static-name "")
	)
)

(if (AND (>= osver 53) (exists "NetSurf"))
	(
		(set #cairo-name "Shared objects/part-Cairo")
		(set #versions-available (+ #versions-available 1))
		(set #cairo-version 1)
	)
	; else
	(
		(set #cairo-version 0)
		(set #cairo-name "")		
	)
)

(transcript "Versions avaiable for install: " #versions-available "  " #static-name "  " #cairo-name)

(if (= #versions-available 0)
	(
		(abort "Did not find any compatible versions of NetSurf to install!\n\n"
			"NetSurf requires AmigaOS 4.1 or higher.")
	)
)

(complete 10)

(if (AND (> @user-level 0) (> #versions-available 1))
	(
		(set #cairo-version
			(askchoice
				(prompt "Which version of NetSurf would you like to install?")
				(help "The Cairo/shared objects version has better rendering "
					"of some graphical elements, and supports SVG.\n\n"
					@askchoice-help)
				(choices #static-name #cairo-name)
				(default #cairo-version)
			)
		)
	)
)

(complete 15)

(set #options-exist (exists (tackon @default-dest "Resources/Options")))
(set #searchengines-exist (exists (tackon @default-dest "Resources/SearchEngines")))
(set #aiss-theme "")

(if (= #options-exist 0)
	(
		(if (exists "TBimages:" (noreq))
			(set #aiss-theme "AISS")
		)

		(set #themename
   			(askchoice
  				(prompt "Please select theme")
 	      		(help "AISS theme requires AISS (and def_pointers for 32-bit "
						"pointers), and will only be shown as an option if "
						"AISS is installed.\n\n"
						@askchoice-help)
				(choices "Default" #aiss-theme)
       			(default 0)
   			)
		)

		(select #themename
			(set #themeshort "Default")
			(set #themeshort "AISS")
		)

		(set #theme (tackon "PROGDIR:Resources/Themes/" #themeshort))
	)
)

(complete 19)

(if (>= osver 53)
	(
		(set #addlaunchhandler
			(askbool
				(prompt "Add NetSurf to launch-handler? (recommended)")
				(help "launch-handler is part of OS4.1 which opens URLs "
					" by launching a web browser.\n\n"
					"The installation will update the configuration of "
					"OS4.1 to allow URLs to be opened by NetSurf.")
			)
		)
	)
	;else
	(
		(set #addlaunchhandler 0)
	)
)

(complete 20)

(set #netsurf-name (select #cairo-version "NetSurf-Static" "NetSurf"))

(if (= #AutoInstall 0)
	(
		(copyfiles
			(prompt "Copying NetSurf...")
			(help @copyfiles-help)
			(source #netsurf-name)
			(dest @default-dest)
			(newname "NetSurf")
			(optional "askuser" "force" "oknodelete")
			(confirm "expert")
		)
	)
;else
	(
		(copyfiles
			(prompt "Please check the version of NetSurf you are copying against "
					"any which might already be installed.")
			(help @copyfiles-help)
			(source #netsurf-name)
			(dest "T:")
			(newname "NetSurf")
			(optional "force" "oknodelete")
		)

		(run "CopyStore T:NetSurf" @default-dest)
		(delete "T:NetSurf")
	)
)

(complete 30)

(if #searchengines-exist
	(rename (tackon @default-dest "Resources/SearchEngines") (tackon @default-dest "Resources/SearchEngines.backup"))
)

(copyfiles
	(prompt "Copying files")
	(source "")
	(choices "Resources" "Rexx" "NetSurf.guide" "NetSurf.readme")
	(help @copyfiles-help)
	(dest @default-dest)
	(infos)
	(optional "nofail")
;	(all)
)

(copyfiles
	(prompt "Copying additional documentation")
	(source "")
	(pattern "(COPYING|ChangeLog)")
	(help @copyfiles-help)
	(dest @default-dest)
	(infos)
	(optional "nofail")
)

(set #complete 40)
(working "Copying Libraries")

(foreach "Libs" "#?"
	(complete #complete)
	(p_copylib @each-name)
	(set #complete (+ #complete 2))
)

(set #complete 60)

(if (= #cairo-version 1)
	(
		(working "Copying Shared Objects")

		(foreach "SObjs" "#?"
			(complete #complete)
			(p_copysobj @each-name)
			(set #complete (+ #complete 2))
		)
	)
)

(complete 90)

(if #themeshort
	(
		(set #theme-icon
			(tackon "Resources/Themes"
				(tackon #themeshort "NetSurf.info")
			)
		)

		(if (exists #theme-icon)
			(
				(copyfiles
					(prompt "Copying theme icon")
					(help @copyfiles-help)
					(source #theme-icon)
					(dest @default-dest)
				)
			)
		)

		(textfile
			(prompt "Setting default options")
			(help @textfile-help)
			(dest (tackon @default-dest "Resources/Options"))
			(append "theme:" #theme "\n")
			(append "use_pubscreen:Workbench\n")
		)
	)
)

(complete 95)

(if (= (exists "ENVARC:Sys/def_css.info") 0)
	(copyfiles
		(prompt "Copying default CSS icon")
		(source "Resources/default.css.info")
		(newname "def_css.info")
		(help @copyfiles-help)
		(dest "ENVARC:Sys")
		(optional "nofail")
	)
)

(complete 96)

(working "Setting MIME types")
(p_setmimetype "css" "text/css")
(p_setmimetype "html" "text/html")
(p_setmimetype "ascii" "text/plain")
(p_setmimetype "jpeg" "image/jpeg")
(p_setmimetype "gif" "image/gif")
(p_setmimetype "png" "image/png")
(p_setmimetype "jng" "image/jng")
(p_setmimetype "mng" "image/mng")
(p_setmimetype "svg" "image/svg")
(p_setmimetype "bmp" "image/bmp")
(p_setmimetype "ico" "image/ico")
(p_setmimetype "sprite" "image/x-riscos-sprite")
(p_setmimetype "webp" "image/webp")
(p_setmimetype "lha" "application/x-lha")
(p_setmimetype "zip" "application/x-zip")

(complete 98)

(if (= #addlaunchhandler 1)
	(
; We use fitr here so that the sections are only added once.
; We also check for string "NetSurf" within the files as saving
; the config will overwrite fitr's tags.
; This probably needs rewriting to not use fitr as it isn't really necessary now.

		(working "Adding NetSurf to launch-handler config")
		(if (= (p_chk_launch-handler "FILE.LH") 0)
			(p_fitr "ENVARC:launch-handler/URL/FILE.LH" "ClientName=\"NETSURF\"   ClientPath=\"APPDIR:NETSURF\"   CMDFORMAT=\"URL=*\"file:///%s*\"\"")
		)

		(if (= (p_chk_launch-handler "HTTP.LH") 0)
			(p_fitr "ENVARC:launch-handler/URL/HTTP.LH" "ClientName=\"NETSURF\"   ClientPath=\"APPDIR:NETSURF\"   CMDFORMAT=\"URL=*\"http://%s*\"\"")
		)

		(if (= (p_chk_launch-handler "HTTPS.LH") 0)
			(p_fitr "ENVARC:launch-handler/URL/HTTPS.LH" "ClientName=\"NETSURF\"   ClientPath=\"APPDIR:NETSURF\"   CMDFORMAT=\"URL=*\"https://%s*\"\"")
		)

		(if (= (p_chk_launch-handler "WWW.LH") 0)
			(p_fitr "ENVARC:launch-handler/URL/WWW.LH" "ClientName=\"NETSURF\"   ClientPath=\"APPDIR:NETSURF\"   CMDFORMAT=\"URL=*\"http://www.%s*\"\"")
		)

;		(if (= (p_chk_launch-handler "FTP.LH") 0)
;			(p_fitr "ENVARC:launch-handler/URL/FTP.LH" "ClientName=\"NETSURF\"   ClientPath=\"APPDIR:NETSURF\"   CMDFORMAT=\"URL=*\"ftp://%s*\"\"")
;		)
	)
)

(complete 100)

(if (= #AutoInstall 1)
	(
		(exit (quiet))
	)
	(
		(p_failedsobjs)
		(exit "If you are on a low memory system, you may like to use the version of "
			"parserutils.library in the archive under ParserUtils_lowmem.\n\n"
			"The low memory version does not use iconv.library so can save "
			"~1MB of RAM, at the expense of reduced character set support. "
			"Simply replace the version in LIBS: with that in ParserUtils_lowmem.")
	)
)
