source: AE/Setup/Mac/AE Setup/AE Setup/AppDelegate.applescript@ 1050

Last change on this file since 1050 was 1043, checked in by iritscen, 8 years ago

Incremented version number for AE Setup to 1.1.9 because it had to be re-built for 10.12. Updated instructions on running an unsigned app. No code changes.

File size: 19.3 KB
RevLine 
[1029]1-- Anniversary Edition Setup
2-- for Anniversary Edition Seven
3-- by Iritscen
4-- For installing the Anniversary Edition Seven's AEI Updater. This script looks for an existing Oni
5-- installation, places the AEInstaller2Updater into a new AE/ folder, and runs it. It also makes sure
6-- that the user has Java installed so he can run the Updater and Installer. It does not check for Mono
7-- because that would be redundant of the Installer itself.
8-- History:
[1043]9-- 1.1.9 - No code changes. Re-built in order to include Run AE Installer 1.0.9, which also had no
10-- code changes but needed to be re-built in 10.12 in order to run in 10.12.
[1030]11-- 1.1.8 - Updated "Run AE Installer" script for Mono in 10.11.
[1029]12-- 1.1.7 - Now an AppleScriptObjC application to ensure signing integrity and OS compatibility.
13-- 1.1.6 - Now testing for Java's existence before talking to it, because it seems that simply calling
14-- "java -version" now causes the script to fail with an error dialog instead of invoking
15-- OS X's Java installation prompt. Setup app now uses the standard icon name "applet" so
16-- that Info.plist does not have to be edited, since that invalidates the code signature
17-- applied by OS X 10.6's Script Editor. Some dialog text has been made clearer. Fixed a
18-- weird bug that cropped up for the first while testing this script, which was breaking
19-- GDF validation.
20-- 1.1.5 - Now using fixed paths for Java for 10.6 and for 10.7+ because "which java" is not reliable.
21-- 1.1.4 - Now attempting to call Java through "java" again before falling back to looking in Internet
22-- Plug-Ins, because 10.6 has Java installed differently.
23-- 1.1.3 - No longer supplying link to MacUpdate page for Apple Java because it is out of date; only
24-- supplying link to java.com.
25-- 1.1.2 - Calling Java at Internet plug-in location instead of using basic command-line "java", as
26-- only the JDK installs command-line Java.
[1043]27-- 1.1.1 - Changed the "Run AE Installer" script to set environment to UTF-8 in order to avoid 'Ä'
[1029]28-- problem in Java 7.
29-- 1.1 - Updated bundled AEI Updater to 1.1, which supports proxies.
30-- 1.0 - Initial release.
31
32script AppDelegate
33 property parent : class "NSObject"
34 global pathToMe
35 global sosumi
36 global gNeedsJavaVersionMajor
37 global gNeedsJavaVersionMinor
38
39 -- IBOutlets
40 property theWindow : missing value
41 property aesIcon : missing value
42
43 on applicationWillFinishLaunching_(aNotification)
44 -- Set globals
45 set gNeedsJavaVersionMajor to 1
46 set gNeedsJavaVersionMinor to 6
47
48 -- Set "pathToMe" for various future uses; its value will be "/path/to/Anniversary Edition Setup.app/Contents/Resources"
49 tell current application's class "NSBundle"
50 tell its mainBundle()
51 set pathToMe to resourcePath() as string
52 end tell
53 end tell
54
55 -- Draw the AE Setup icon in the window
56 set iconPath to POSIX path of ((pathToMe & "/AppIcon.png") as string)
57 set aesIconImg to current application's NSImage's alloc's initWithContentsOfFile_(iconPath)
58 aesIcon's setImage_(aesIconImg)
59
60 -- Set up "sosumi" with the Sosumi sound
61 tell current application's NSSound to set thisSound to soundNamed_("Sosumi")
62
63 -- Bring self to front in case something else stole focus
64 tell me
65 activate
66 end tell
67 end applicationWillFinishLaunching_
68
69 on applicationShouldTerminateAfterLastWindowClosed_(sender)
70 return true
71 end applicationShouldTerminateAfterLastWindowClosed_
72
73 on applicationShouldTerminate_(sender)
74 -- Insert code here to do any housekeeping before your application quits
75 return current application's NSTerminateNow
76 end applicationShouldTerminate_
77
78 -- IBActions
79 on clickStart_(sender)
80 set installPath to my find_Oni_folder()
81 tell me
82 activate
83 end tell
84 if (installPath is "Gave up") then
85 display dialog "Sorry, the AE currently requires a retail Oni installation." buttons {"OK"} default button 1 with title "AE Setup"
86 else if (installPath is "AE exists") then
87 display dialog "If you are sure you want to start over with a new AE installation in this location, then you should delete the existing AE/ folder and then run this Setup app again." buttons {"OK"} default button 1 with title "AE Setup"
88 else if (installPath is "") then
89 display dialog "Unknown error encountered while choosing Oni installation. Please ask for help in the Anniversary Edition sub-forum of the Oni Central Forum." buttons {"Go to forum", "OK"} default button 2 with title "AE Setup"
90 set quitOrForum to button returned of the result
91 if (quitOrForum is "Go to forum") then
92 open location "http://oni.bungie.org/community/forum/index.php"
93 end if
94 else
95 set installResult to my install_AEI_Updater(installPath)
96 tell me
97 activate
98 end tell
99 if (installResult is 0) then
100 display dialog "Updater installed. AE Setup will now continue the installation by running the Updater." buttons {"OK"} default button 1 with title "AE Setup"
101 set runResult to my run_AEIU(installPath)
102 tell me
103 activate
104 end tell
105 -- Quit if running Run AE Installer seems to have been successful
106 if (runResult is 0) then
107 tell me
108 quit
109 end tell
110 else if (runResult is 1) then
111 display dialog "Script copy error. Please ask for help in the Anniversary Edition sub-forum of the Oni Central Forum." buttons {"Go to forum", "OK"} default button 2 with title "AE Setup"
112 set quitOrForum to button returned of the result
113 if (quitOrForum is "Go to forum") then
114 open location "http://oni.bungie.org/community/forum/index.php"
115 end if
116 else if (runResult is 2) then
117 display dialog "Could not run AEI Updater. Please ask for help in the Anniversary Edition sub-forum of the Oni Central Forum." buttons {"Go to forum", "OK"} default button 2 with title "AE Setup"
118 set quitOrForum to button returned of the result
119 if (quitOrForum is "Go to forum") then
120 open location "http://oni.bungie.org/community/forum/index.php"
121 end if
122 end if
123 else if (installResult is 1) then
124 display dialog "Could not install the AEI Updater because Java was not installed or new enough. Please obtain a Java installer from Java.com." buttons {"Go to Java.com", "OK"} default button 2 with title "AE Setup"
125 set quitOrJava to button returned of the result
126 if (quitOrJava is "Go to Java.com") then
127 open location "http://www.java.com/"
128 end if
129 else if (installResult is 2) then -- file operation failure
130 display dialog "Could not install the AEI Updater. Please ask for help in the Anniversary Edition sub-forum of the Oni Central Forum." buttons {"Go to forum", "OK"} default button 2 with title "AE Setup"
131 set quitOrForum to button returned of the result
132 if (quitOrForum is "Go to forum") then
133 open location "http://oni.bungie.org/community/forum/index.php"
134 end if
135 else
136 display dialog "Unknown error returned from install_AEI_Updater()! Please ask for help in the Anniversary Edition sub-forum of the Oni Central Forum." buttons {"Go to forum", "OK"} default button 2 with title "AE Setup"
137 set quitOrForum to button returned of the result
138 if (quitOrForum is "Go to forum") then
139 open location "http://oni.bungie.org/community/forum/index.php"
140 end if
141 end if
142 end if
143 end clickStart_
144
145 -- The user must pick an acceptable folder to install the AE in, or die trying (or give up)
146 -- Returns "Gave up" if user clicked Quit after being told his choice was not the Oni folder,
147 -- "AE exists" if user clicked Quit after being told that the AE folder was already present, and
148 -- returns the user's chosen path if validation was successful
149 -- Called by clickStart_()
150 on find_Oni_folder()
151 tell me
152 tell me
153 activate
154 end tell
155 set tryAgain to true
156 set isOniRetail to false
157 set pathProblem to ""
158 set folderTest to 0
159 repeat while (tryAgain is true)
160 set chosenPath to (choose folder with prompt "Please locate your Oni installation.")
161 if (chosenPath is "") then
162 display dialog "There was an error in choosing the Oni folder." buttons {"OK"} default button 1 with title "AE Setup"
163 return chosenPath
164 end if
165 set folderTest to my validate_Oni_folder(chosenPath)
166 tell me
167 activate
168 end tell
169 if (folderTest is 1) then
170 display dialog "This doesn't seem to be your Oni installation. Click \"Try again\" to locate another folder." buttons {"Cancel", "Try again"} default button 2 with title "AE Setup"
171 set cancelOrTryAgain to the button returned of the result
172 if (cancelOrTryAgain is "Cancel") then
173 set tryAgain to false
174 set pathProblem to "Gave up"
175 end if
176 else if (folderTest is 2) then
177 display dialog "This Oni installation already has an AE/ folder! This means that you've probably already run this Setup app, and now you should be opening the \"Run AE Installer\" script in the AE/ folder. You can also click \"Try again\" to find another Oni installation in which to install the AE." buttons {"Cancel", "Try again"} default button 2 with title "AE Setup"
178 set cancelOrTryAgain to the button returned of the result
179 if (cancelOrTryAgain is "Cancel") then
180 set tryAgain to false
181 set pathProblem to "AE exists"
182 end if
183 else
184 set tryAgain to false -- we got it, let's get out of this loop
185 end if
186 end repeat
187 if (folderTest is 0) then
188 return chosenPath
189 else
190 return pathProblem
191 end if
192 end tell
193 end find_Oni_folder
194
195 -- Returns 0 if this is a valid target for the AE installation,
196 -- 1 if this is not a valid target, and
197 -- 2 if the AE is already here
198 -- Called by find_Oni_folder()
199 on validate_Oni_folder(folderPath)
200 tell application "Finder"
201 tell me
202 activate
203 end tell
204 -- Is the GDF here?
205 if not (exists folder "GameDataFolder" in folder folderPath) then
206 display dialog "GameDataFolder not detected here." buttons {"OK"} default button 1 with title "AE Setup"
207 return 1
208 end if
209 -- Is the AE folder here? Because we won't install over it.
210 if (exists folder "AE" in folder folderPath) then
211 return 2
212 end if
213
214 -- Now see if this is the full installation or demo
215 set retailLevelList to {0, 1, 2, 3, 4, 6, 8, 9, 10, 11, 12, 13, 14, 18, 19}
216 set demoLevelList to {0, 1, 4} -- there's also a separate demo release of just level 2 to be dropped into the demo's GDF, but 1 and 4 were the only core demo levels
217 set isRetail to true
218 set isDemo to true
219 -- Look for levels until one is missing and we know this isn't a complete retail release
220 repeat with thisLevel in retailLevelList
221 if not (exists file ((folderPath & "GameDataFolder:level" & (thisLevel as string) & "_Final.dat") as string)) then
222 set isRetail to false
223 exit repeat
224 end if
225 end repeat
226 if (isRetail) then
227 -- Don't return here if we add demo support below
228 return 0
229 end if
230 -- Look for levels until one is missing and we know this isn't a complete demo release
231 repeat with thisLevel in demoLevelList
232 if not (exists file ((folderPath & "GameDataFolder:level" & (thisLevel as string) & "_Final.dat") as string)) then
233 set isDemo to false
234 exit repeat
235 end if
236 end repeat
237 if (isDemo) then
238 -- Insert handling of demo status here if we ever support a demo AE
239 return 1
240 else
241 return 1
242 end if
243 end tell
244 end validate_Oni_folder
245
246 -- If Java is found, creates the AE/ folder with the Updater
247 -- Returns 0 if the Updater was installed (which will install the Installer itself afterward),
248 -- 1 if Java fails verification, and
249 -- 2 if a file operation or other error occurs
250 -- Called by clickStart_()
251 on install_AEI_Updater(pathToOni)
252 tell me
253 set javaResult to my verify_Java()
254 if (javaResult is 1) then
255 return 1
256 end if
257 end tell
258 -- Make "Oni/AE" folder
259 tell application "Finder"
260 if ((pathToOni & "AE") exists) then -- shouldn't happen because we already looked for it in validate_Oni_folder()
261 display alert "AE folder already present!"
262 return 2
263 end if
264 try
265 make new folder at pathToOni with properties {name:"AE"}
266 delay 0.5
267 make new folder at ((pathToOni as string) & "AE") with properties {name:"AEInstaller"}
268 on error
269 display alert "Couldn't make AE or AEI folder!"
270 return 2
271 end try
272
273 -- Copy AEI Updater into "AE/"
274 set AEIU to POSIX file (pathToMe & "/AEInstaller2Updater.jar") as alias
275 if (AEIU exists) then
276 set AEIfolder to (pathToOni & "AE:AEInstaller" as string)
277 try
278 duplicate file AEIU to folder AEIfolder
279 on error copyError
280 return 2
281 end try
282 else
283 display dialog "AE Installer Updater is not present in the Setup app!"
284 return 2
285 end if
286 end tell
287 return 0
288 end install_AEI_Updater
289
290 -- Checks for an acceptable Java installation
291 -- This function was going to support a bundled JRE for those without Java,
292 -- but it adds too many complications, so just make the user install it himself
293 -- Returns 1 if Java is not found or too old, and
294 -- 0 if Java is found and the version is acceptable
295 -- Called by install_AEI_Updater()
296 on verify_Java()
297 tell me
298 set origDelimiters to AppleScript's text item delimiters
299 set OSversion to (system version of (system info) as string)
300 set AppleScript's text item delimiters to "."
301
302 -- Java's location is different in 10.6 than in 10.7+
303 if ((second text item of OSversion) as number > 6) then
304 set javaPath to "/Library/Internet\\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java"
305 else
306 set javaPath to "/usr/bin/java"
307 end if
308
309 -- Test for Java before talking to it
310 set javaExistsTest to ("if [ -f " & javaPath & " ]; then echo okay; fi") as string
311 set javaExists to do shell script javaExistsTest without altering line endings
312 if (javaExists is "") then
313 return 1
314 end if
315
316 -- Get Java's version
317 set javaVersionCmd to ((javaPath & " -version 2>&1") as string) -- Java's version output is sometimes on stderr, not stdout :-/
318 set javaVersionText to do shell script javaVersionCmd without altering line endings
319 if (javaVersionText is "") then
320 return 1
321 end if
322
323 -- Isolate version number from output with format:
324 (* java version "1.7.0_17"
325 Java(TM) SE Runtime Environment (build 1.7.0_17-b02)
326 Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode) *)
327 -- Get first line
328 set AppleScript's text item delimiters to "
329"
330 set javaVersionText to first text item of javaVersionText
331 -- Get text after first quote mark
332 set AppleScript's text item delimiters to "\""
333 set javaVersionText to second text item of javaVersionText
334 -- Get first and second version numbers, third doesn't matter
335 set AppleScript's text item delimiters to "."
336 set versionMajor to first text item of javaVersionText
337 set versionMinor to second text item of javaVersionText
338 set AppleScript's text item delimiters to origDelimiters
339 -- Inform user if Java is too old
[1043]340 if (versionMajor ³ gNeedsJavaVersionMajor) then
[1029]341 if (versionMinor < gNeedsJavaVersionMinor) then
342 display dialog (("Sorry, Java v" & gNeedsJavaVersionMajor & "." & gNeedsJavaVersionMinor & " is required; found v" & versionMajor & "." & versionMinor & " instead.") as string) buttons {"OK"} default button 1 with title "AE Setup"
343 return 1
344 end if
345 else
346 display dialog (("Sorry, Java v" & gNeedsJavaVersionMajor & "." & gNeedsJavaVersionMinor & " is required; found v" & versionMajor & "." & versionMinor & " instead.") as string) buttons {"OK"} default button 1 with title "AE Setup"
347 return 1
348 end if
349 end tell
350 return 0
351 end verify_Java
352
353 -- Drops an applet into the new "AE/" folder and runs it;
354 -- the applet will try to run the AEI, but if it's not found,
355 -- it runs the AEI Updater, which is what we want to happen
356 -- so that the AEI can be installed.
357 -- Returns 0 if this is a valid target for the AE installation,
358 -- 1 if the applet cannot be dropped, and
359 -- 2 if the applet cannot be run
360 -- Called by clickStart_()
361 on run_AEIU(pathToOni)
362 tell application "Finder"
363 -- Copy applet to AE/ that opens AEI or AEIU if AEI is not around
364 set RAEI to POSIX file (pathToMe & "/Run AE Installer.app") as alias
365 set pathToAE to alias ((pathToOni & "AE") as string)
366 try
367 duplicate RAEI to pathToAE
368 on error copyError
369 return 1
370 end try
371 set RAEI to ((pathToAE as string) & "Run AE Installer.app")
372 try
373 open RAEI
374 on error runError
375 return 2
376 end try
377 end tell
378 return 0
379 end run_AEIU
380
381 on play_error_sound()
382 tell sosumi
383 play()
384 end tell
385 end play_error_sound
386end script
Note: See TracBrowser for help on using the repository browser.