[prev in list] [next in list] [prev in thread] [next in thread] 

List:       wine-devel
Subject:    Re: new wisotool 20100424: new verbs 3dmark2000, 3dmark2001, 3dmark03,
From:       Vincent Pelletier <plr.vincent () gmail ! com>
Date:       2010-04-30 22:40:08
Message-ID: 201005010040.09808.plr.vincent () gmail ! com
[Download RAW message or body]

Le jeudi 29 avril 2010 12:57:49, Vincent Pelletier a écrit :
> Le mercredi 28 avril 2010 09:13:24, Vincent Pelletier a écrit :
> > I'm trying to add support for GOG.com installers.
> 
> Please review attached patch.

Patch updated.

Now tested on windows (...though not all games) from auth cookie creation to 
bat script execution (test case: duke nukem 3d).
Curl tested (downloading and auth cookie generation).

Incremental changelog (skip to "Changelog" to just know what it does):
- changed cookie support in download so it take a filename as parameter, not a
  chunk of  HTTP headers
- fixed download url for duke nukem 3d, as it is different from game id
- removed (expanded) AHK marcos, as advised by Austin English on IRC
- auth cookie generation (you now only need your login & password, the rest is
  automatic)
- fix duke nukem 3d and far cry to disable foxit reader installation (and
  prune references to adobe in the source)
- add support for evil genius
- consider an empty file as non-existent (re-download it)
  note: it didn't appear to have expected effect... I'll doublecheck after a
  good night of sleep

Changelog:
- add cookie support in "download" (required as GOG.com requires auth
  to download games)
- add generic automation for gog installer
  (based on http://www.jrsoftware.org/isinfo.php)
- Add support for:
  duke nukem 3d
  duke nukem manhattan project
  ut2004
  abe's oddisee
  abe's exoddus
  beyond good and evil
  far cry
  descent 1 & 2 (single package)
  evil genius

Updated "please review":
- _load_gog parameters. They are ugly IMO, because many are optional. But I
  don't see how to do better (especially, how to extend them to include
  optional SHA1 values).
- posix-ish scripting (only tested with bash)

Regards,
-- 
Vincent Pelletier

["gog_support.diff" (text/x-patch)]

Index: wisotool
===================================================================
--- wisotool	(révision 1206)
+++ wisotool	(copie de travail)
@@ -340,7 +340,7 @@
 }
 
 # Download a file
-# Usage: package url [sha1sum [filename]]
+# Usage: package url [sha1sum [filename [cookie jar]]]
 # Caches downloads in wisotoolcache/$package
 download() {
     if [ "$4"x != ""x ]
@@ -366,11 +366,11 @@
            # [*] --read-timeout is useful on the adobe server that doesn't
            # close the connection unless you tell it to (control-C or closing
            # the socket)
-           try wget -O "$file" -nd -c --read-timeout=300 --retry-connrefused \
--header "Accept-Encoding: gzip,deflate" "$2" +           try wget -O "$file" -nd -c \
--read-timeout=300 --retry-connrefused --header "Accept-Encoding: gzip,deflate" \
${5:+--load-cookies "$5"} "$2"  else
            # curl doesn't get filename from the location given by the server!
            # fortunately, we know it
-           try curl -L -o "$file" -C - --header "Accept-Encoding: gzip,deflate" "$2"
+           try curl -L -o "$file" -C - --header "Accept-Encoding: gzip,deflate" \
${5:+--cookie "$5"} "$2"  fi
         # Need to decompress .exe's that are compressed, else cygwin fails
         # Only affects cygwin, so don't barf if 'file' not installed
@@ -2177,6 +2177,186 @@
 
 #----------------------------------------------------------------
 
+# Generic GOG.com installer
+# Usage: game_id game_title [other_files [reader_control [run_command \
[download_id]]]] +# game_id
+#     Used for main installer name and download url.
+# game_title
+#     Used for AutoHotKey and installation path in bat script.
+# other_files
+#     Extra installer files, in one string, space-separated.
+# reader_control
+#     If set, the control id of the configuration pannel checkbox controling
+#     Adobe Reader installation.
+#     Some games don't have it, some games do with different ids.
+# run_command
+#     Used for bat script, relative to installation path.
+# download_id
+#     For games which download url doesn't match their game_id
+_load_gog()
+{
+    # TODO: support SHA1 checks ? (installer verifies files)
+    load_autohotkey
+
+    game_id="$1"
+    game_title="$2"
+    other_files="$3"
+    reader_control="$4"
+    run_command="$5"
+    download_id="$6"
+
+    if [ "$download_id"x == ""x ]
+    then
+        download_id="$game_id"
+    fi
+
+    installer_path="$WISOTOOL_CACHE/gog"
+    mkdir -p "$installer_path"
+    auth_path="$WISOTOOL_CACHE/gog_auth"
+    mkdir -p "$auth_path"
+    installer="setup_$game_id.exe"
+    cookie="$auth_path/cookie.txt"
+
+    file_id=0
+    for file in $installer $other_files
+    do
+        file_path="$installer_path/$file"
+        if [ ! -s "$file_path" ]
+        then
+            if [ ! -f "$cookie" ]
+            then
+                login_file="$auth_path/login.txt"
+                password_file="$auth_path/password.txt"
+                if [ ! -f "$login_file" -o ! -f "$password_file" ]
+                then
+                    die "Please put your GOG.com login in '$login_file' and password \
in '$password_file' or put '$file' in '$installer_path'." +                fi
+                base_url="https://www.gog.com"
+                login_url="/en/login/ajax/"
+                next_url="$WISOTOOL_TMP/gog_redir_url"
+                post_data="$WISOTOOL_TMP/gog_post_data"
+                # Note: just write login & password to a file so they don't appear \
in "ps" +                echo "a=check&t=old&u=`cat \"$login_file\" | sed \
's/&/%26/g'`&p=`cat \"$password_file\" | sed 's/&/%26/g'`&r=frontpage" > "$post_data" \
+                if [ -x "`which wget 2>/dev/null`" ] +                then
+                    try wget -O "$next_url" --save-cookies "$cookie" --post-file \
"$post_data" "$base_url$login_url" +                    try wget -O /dev/null \
--load-cookies "$cookie" --save-cookies "$cookie" "$base_url`cat \"$next_url\"`" +    \
else +                    try curl -o "$next_url" --cookie-jar "$cookie" --data \
"@$post_data" "$base_url$login_url" +                    try curl -o /dev/null \
--cookie "$cookie" --cookie-jar "$cookie" "$base_url`cat \"$next_url\"`" +            \
fi +                rm -f "$post_data"
+                rm -f "$next_url"
+            fi
+            download "gog" \
"https://www.gog.com/en/download/game/$download_id/$file_id" "" "$file" "$cookie" +   \
fi +        file_id=$(( $file_id + 1 ))
+    done
+
+    cd "$installer_path"
+    ahk_do "
+        run $installer
+        WinWait, Setup - $game_title, Start installation
+        ControlGet, checkbox_state, Checked,, TCheckBox1 ; EULA
+        if (checkbox_state != 1) {
+            ControlClick, TCheckBox1
+        }
+        if (\"$reader_control\") {
+            ControlClick, TMCoPShadowButton1 ; Options
+            Loop, 10
+            {
+                ControlGet, visible, Visible,, $reader_control
+                if (visible)
+                {
+                    break
+                }
+                Sleep, 1000
+            }
+            ControlGet, checkbox_state, Checked,, $reader_control ; Unckeck \
Adobe/Foxit Reader +            if (checkbox_state != 0) {
+                ControlClick, $reader_control
+            }
+        }
+        ControlClick, TMCoPShadowButton2 ; Start Installation
+        WinWait, Setup - $game_title, Exit Installer
+        ControlClick, TMCoPShadowButton1 ; Exit Installer
+        "
+
+    if [ "$run_command"x != ""x ]
+    then
+        cat > "$DRIVE_C/run-$PACKAGE.bat" <<__EOF__
+cd "$programfilesdir_x86_win\GOG.com\\$game_title"
+$run_command
+__EOF__
+    fi
+}
+
+verblist_add dukenukem3d_gog "Duke Nukem 3D (GOG.com)"
+
+load_dukenukem3d_gog()
+{
+    _load_gog "duke3d" "Duke Nukem 3D" "" "TsCheckBox2" "DOSBOX\dosbox.exe -conf \
dosboxDuke3D.conf -noconsole -c \"exit\"" "duke_nukem_3d_atomic_edition" +}
+
+verblist_add dukenukemmp_gog "Duke Nukem Manhattan Project (GOG.com)"
+
+load_dukenukemmp_gog()
+{
+    _load_gog "duke_nukem_manhattan_project" "Duke Nukem - Manhattan Project" "" \
"TsCheckBox2" "DukeNukemMP.exe" +}
+
+verblist_add ut2004_gog "Unreal Tournament 2004 (GOG.com)"
+
+load_ut2004_gog()
+{
+    _load_gog "ut2004" "Unreal Tournament 2004" "setup_ut2004-1.bin \
setup_ut2004-2.bin" "TsCheckBox2" "system\ut2004.exe" +}
+
+verblist_add abes_oddysee_gog "Abe's Oddysee (GOG.com)"
+
+load_abes_oddysee_gog()
+{
+    _load_gog "abes_oddysee" "Abe's Oddysee" "" "TsCheckBox2" "AbeWin.exe"
+}
+
+verblist_add abes_exoddus_gog "Abe's Exoddus (GOG.com)"
+
+load_abes_exoddus_gog()
+{
+    _load_gog "abes_exoddus" "Abe's Exoddus" "" "TsCheckBox2" "Exoddus.exe"
+}
+
+verblist_add beyond_good_and_evil_gog "Beyond Good and Evil (GOG.com)"
+
+load_beyond_good_and_evil_gog()
+{
+    _load_gog "beyond_good_and_evil" "Beyond Good and Evil" "" "TsCheckBox2" \
"gogwrap.exe GOGBEYONDGOODANDEVIL" +}
+
+verblist_add far_cry_gog "Far Cry (GOG.com)"
+
+load_far_cry_gog()
+{
+    _load_gog "far_cry" "Far Cry" "setup_far_cry-1.bin setup_far_cry-2.bin" \
"TsCheckBox2" "Bin32\FarCry.exe" +}
+
+verblist_add descent_1_2_gog "Descent and Descent 2 (GOG.com)"
+
+load_descent_1_2_gog()
+{
+    # XXX: this installs 2 games, how should bat script be ?
+    _load_gog "descent_1_2" "Descent and Descent 2" "" "TsCheckBox5" ""
+}
+
+verblist_add evil_genius_gog "Evil Genius (GOG.com)"
+
+load_evil_genius_gog()
+{
+    _load_gog "evil_genius" "Evil Genius" "" "TsCheckBox2" \
"ReleaseExe\EvilGeniusExeStub-Release.exe" +}
+
+#----------------------------------------------------------------
+
 print_version() {
     echo "$VERSION"
 }





[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic