From be4df7b757bc4b1e116641fb573f1fb5fdc3643b Mon Sep 17 00:00:00 2001 From: martin Date: Wed, 22 Dec 2010 23:31:31 +0000 Subject: [PATCH] changed scripts and added tools for creating multilingual installer git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@2275 ebee16cc-31ac-478f-84a7-5cbb03baadba --- ground/packaging/winx86/MakeInstallers.bat | 25 +++-- ground/packaging/winx86/MsiTools/MsiTran.Exe | Bin 0 -> 66896 bytes ground/packaging/winx86/MsiTools/WiSubStg.vbs | 101 ++++++++++++++++++ ground/packaging/winx86/OpenPilot.wxs | 3 +- ground/packaging/winx86/bin.wxi | 55 +++++----- 5 files changed, 145 insertions(+), 39 deletions(-) create mode 100644 ground/packaging/winx86/MsiTools/MsiTran.Exe create mode 100644 ground/packaging/winx86/MsiTools/WiSubStg.vbs diff --git a/ground/packaging/winx86/MakeInstallers.bat b/ground/packaging/winx86/MakeInstallers.bat index 34bff925f..cb13609cc 100644 --- a/ground/packaging/winx86/MakeInstallers.bat +++ b/ground/packaging/winx86/MakeInstallers.bat @@ -8,11 +8,24 @@ set WixBin=C:\Program Files\Windows Installer XML v3\bin "%WixBin%\candle.exe" -nologo "C:\Projects\builds\OpenPilot_Release\packaging\winx86\OpenPilot.wxs" -out OpenPilot.wixobj -ext WixUtilExtension -ext WixUIExtension -"%WixBin%\light.exe" -nologo OpenPilot.wixobj -cultures:en-us -loc UI_translations\en-us.wxl -dWixUILicenseRtf=license\GPLv3_en.rtf -out OpenPilot_en.msi -ext WixUtilExtension -ext WixUIExtension -"%WixBin%\light.exe" -nologo OpenPilot.wixobj -cultures:ru-ru -loc UI_translations\ru-ru.wxl -dWixUILicenseRtf=license\GPLv3_ru.rtf -out OpenPilot_ru.msi -ext WixUtilExtension -ext WixUIExtension -"%WixBin%\light.exe" -nologo OpenPilot.wixobj -cultures:de-de -loc UI_translations\de-de.wxl -dWixUILicenseRtf=license\GPLv3_de.rtf -out OpenPilot_de.msi -ext WixUtilExtension -ext WixUIExtension -"%WixBin%\light.exe" -nologo OpenPilot.wixobj -cultures:es-es -loc UI_translations\es-es.wxl -dWixUILicenseRtf=license\GPLv3_es.rtf -out OpenPilot_es.msi -ext WixUtilExtension -ext WixUIExtension -"%WixBin%\light.exe" -nologo OpenPilot.wixobj -cultures:fr-fr -loc UI_translations\fr-fr.wxl -dWixUILicenseRtf=license\GPLv3_fr.rtf -out OpenPilot_fr.msi -ext WixUtilExtension -ext WixUIExtension -"%WixBin%\light.exe" -nologo OpenPilot.wixobj -cultures:zh-tw -loc UI_translations\zh_cn.wxl -loc UI_translations\wixui_zh-tw.wxl -dWixUILicenseRtf=license\GPLv3_zh_cn.rtf -out OpenPilot_zh_ch.msi -ext WixUtilExtension -ext WixUIExtension +"%WixBin%\light.exe" -nologo OpenPilot.wixobj -sval -spdb -cultures:en-us -loc UI_translations\en-us.wxl -dWixUILicenseRtf=license\GPLv3_en.rtf -out OpenPilot.msi -ext WixUtilExtension -ext WixUIExtension +"%WixBin%\light.exe" -nologo OpenPilot.wixobj -sval -spdb -cultures:ru-ru -loc UI_translations\ru-ru.wxl -dWixUILicenseRtf=license\GPLv3_ru.rtf -out OpenPilot_ru.msi -ext WixUtilExtension -ext WixUIExtension +"%WixBin%\light.exe" -nologo OpenPilot.wixobj -sval -spdb -cultures:de-de -loc UI_translations\de-de.wxl -dWixUILicenseRtf=license\GPLv3_de.rtf -out OpenPilot_de.msi -ext WixUtilExtension -ext WixUIExtension +"%WixBin%\light.exe" -nologo OpenPilot.wixobj -sval -spdb -cultures:es-es -loc UI_translations\es-es.wxl -dWixUILicenseRtf=license\GPLv3_es.rtf -out OpenPilot_es.msi -ext WixUtilExtension -ext WixUIExtension +"%WixBin%\light.exe" -nologo OpenPilot.wixobj -sval -spdb -cultures:fr-fr -loc UI_translations\fr-fr.wxl -dWixUILicenseRtf=license\GPLv3_fr.rtf -out OpenPilot_fr.msi -ext WixUtilExtension -ext WixUIExtension +"%WixBin%\light.exe" -nologo OpenPilot.wixobj -sval -spdb -cultures:zh-tw -loc UI_translations\zh_cn.wxl -loc UI_translations\wixui_zh-tw.wxl -dWixUILicenseRtf=license\GPLv3_zh_cn.rtf -out OpenPilot_zh_ch.msi -ext WixUtilExtension -ext WixUIExtension +MsiTools\MsiTran.exe -g OpenPilot.msi OpenPilot_ru.msi ru.mst +MsiTools\MsiTran.exe -g OpenPilot.msi OpenPilot_de.msi de.mst +MsiTools\MsiTran.exe -g OpenPilot.msi OpenPilot_es.msi es.mst +MsiTools\MsiTran.exe -g OpenPilot.msi OpenPilot_fr.msi fr.mst +MsiTools\MsiTran.exe -g OpenPilot.msi OpenPilot_zh_ch.msi zn.mst + +MsiTools\wisubstg.vbs OpenPilot.msi ru.mst 1049 +MsiTools\wisubstg.vbs OpenPilot.msi de.mst 1031 +MsiTools\wisubstg.vbs OpenPilot.msi es.mst 3082 +MsiTools\wisubstg.vbs OpenPilot.msi fr.mst 1036 +MsiTools\wisubstg.vbs OpenPilot.msi zn.mst 1028 + +del OpenPilot.wixobj OpenPilot_ru.msi ru.mst OpenPilot_de.msi de.mst OpenPilot_es.msi es.mst OpenPilot_fr.msi fr.mst OpenPilot_zh_ch.msi zn.mst diff --git a/ground/packaging/winx86/MsiTools/MsiTran.Exe b/ground/packaging/winx86/MsiTools/MsiTran.Exe new file mode 100644 index 0000000000000000000000000000000000000000..af0721627b70b222f8f07801314302f64b84f519 GIT binary patch literal 66896 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 literal 0 HcmV?d00001 diff --git a/ground/packaging/winx86/MsiTools/WiSubStg.vbs b/ground/packaging/winx86/MsiTools/WiSubStg.vbs new file mode 100644 index 000000000..61e3b844c --- /dev/null +++ b/ground/packaging/winx86/MsiTools/WiSubStg.vbs @@ -0,0 +1,101 @@ +' Windows Installer utility to add a transform or nested database as a substorage +' For use with Windows Scripting Host, CScript.exe or WScript.exe +' Copyright (c) Microsoft Corporation. All rights reserved. +' Demonstrates the use of the database _Storages table +' +Option Explicit + +Const msiOpenDatabaseModeReadOnly = 0 +Const msiOpenDatabaseModeTransact = 1 +Const msiOpenDatabaseModeCreate = 3 + +Const msiViewModifyInsert = 1 +Const msiViewModifyUpdate = 2 +Const msiViewModifyAssign = 3 +Const msiViewModifyReplace = 4 +Const msiViewModifyDelete = 6 + +Const ForAppending = 8 +Const ForReading = 1 +Const ForWriting = 2 +Const TristateTrue = -1 + +' Check arg count, and display help if argument not present or contains ? +Dim argCount:argCount = Wscript.Arguments.Count +If argCount > 0 Then If InStr(1, Wscript.Arguments(0), "?", vbTextCompare) > 0 Then argCount = 0 +If (argCount = 0) Then + Wscript.Echo "Windows Installer database substorage managment utility" &_ + vbNewLine & " 1st argument is the path to MSI database (installer package)" &_ + vbNewLine & " 2nd argument is the path to a transform or database to import" &_ + vbNewLine & " If the 2nd argument is missing, substorages will be listed" &_ + vbNewLine & " 3rd argument is optional, the name used for the substorage" &_ + vbNewLine & " If the 3rd arugment is missing, the file name is used" &_ + vbNewLine & " To remove a substorage, use /D or -D as the 2nd argument" &_ + vbNewLine & " followed by the name of the substorage to remove" &_ + vbNewLine &_ + vbNewLine & "Copyright (C) Microsoft Corporation. All rights reserved." + Wscript.Quit 1 +End If + +' Connect to Windows Installer object +On Error Resume Next +Dim installer : Set installer = Nothing +Set installer = Wscript.CreateObject("WindowsInstaller.Installer") : CheckError + +' Evaluate command-line arguments and set open and update modes +Dim databasePath:databasePath = Wscript.Arguments(0) +Dim openMode : If argCount = 1 Then openMode = msiOpenDatabaseModeReadOnly Else openMode = msiOpenDatabaseModeTransact +Dim updateMode : If argCount > 1 Then updateMode = msiViewModifyAssign 'Either insert or replace existing row +Dim importPath : If argCount > 1 Then importPath = Wscript.Arguments(1) +Dim storageName : If argCount > 2 Then storageName = Wscript.Arguments(2) +If storageName = Empty And importPath <> Empty Then storageName = Right(importPath, Len(importPath) - InStrRev(importPath, "\",-1,vbTextCompare)) +If UCase(importPath) = "/D" Or UCase(importPath) = "-D" Then updateMode = msiViewModifyDelete : importPath = Empty 'substorage will be deleted if no input data + +' Open database and create a view on the _Storages table +Dim sqlQuery : Select Case updateMode + Case msiOpenDatabaseModeReadOnly: sqlQuery = "SELECT `Name` FROM _Storages" + Case msiViewModifyAssign: sqlQuery = "SELECT `Name`,`Data` FROM _Storages" + Case msiViewModifyDelete: sqlQuery = "SELECT `Name` FROM _Storages WHERE `Name` = ?" +End Select +Dim database : Set database = installer.OpenDatabase(databasePath, openMode) : CheckError +Dim view : Set view = database.OpenView(sqlQuery) +Dim record + +If openMode = msiOpenDatabaseModeReadOnly Then 'If listing storages, simply fetch all records + Dim message, name + view.Execute : CheckError + Do + Set record = view.Fetch + If record Is Nothing Then Exit Do + name = record.StringData(1) + If message = Empty Then message = name Else message = message & vbNewLine & name + Loop + Wscript.Echo message +Else 'If adding a storage, insert a row, else if removing a storage, delete the row + Set record = installer.CreateRecord(2) + record.StringData(1) = storageName + view.Execute record : CheckError + If importPath <> Empty Then 'Insert storage - copy data into stream + record.SetStream 2, importPath : CheckError + Else 'Delete storage, fetch first to provide better error message if missing + Set record = view.Fetch + If record Is Nothing Then Wscript.Echo "Storage not present:", storageName : Wscript.Quit 2 + End If + view.Modify updateMode, record : CheckError + database.Commit : CheckError + Set view = Nothing + Set database = Nothing + CheckError +End If + +Sub CheckError + Dim message, errRec + If Err = 0 Then Exit Sub + message = Err.Source & " " & Hex(Err) & ": " & Err.Description + If Not installer Is Nothing Then + Set errRec = installer.LastErrorRecord + If Not errRec Is Nothing Then message = message & vbNewLine & errRec.FormatText + End If + Wscript.Echo message + Wscript.Quit 2 +End Sub diff --git a/ground/packaging/winx86/OpenPilot.wxs b/ground/packaging/winx86/OpenPilot.wxs index 992a3fcf6..50e237a72 100644 --- a/ground/packaging/winx86/OpenPilot.wxs +++ b/ground/packaging/winx86/OpenPilot.wxs @@ -1,7 +1,7 @@ - + @@ -134,7 +134,6 @@ - diff --git a/ground/packaging/winx86/bin.wxi b/ground/packaging/winx86/bin.wxi index 36cf054ef..4914b6711 100644 --- a/ground/packaging/winx86/bin.wxi +++ b/ground/packaging/winx86/bin.wxi @@ -1,4 +1,6 @@ - + + + @@ -29,6 +31,24 @@ + + + + + + + + + + + + + + + + + + @@ -38,6 +58,9 @@ + + + @@ -79,35 +102,5 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file