wixgem 0.64.0 → 0.65.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/example/example.msi +0 -0
- data/example/example.msm +0 -0
- data/example/rakefile.rb +3 -6
- data/lib/admin.rb +11 -0
- data/lib/wixgem.rb +10 -8
- metadata +33 -6
- data/lib/WindowsInstaller.rb +0 -171
- data/lib/command.rb +0 -43
- data/lib/shortcut.rb.kev +0 -129
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d5ed53abaf6b54b665845c36f28eaa4f2102c02b
|
|
4
|
+
data.tar.gz: 2d3190c02befcba86c5226c0be1bc67228758ce9
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b8c552429381777ff6e16a05d63ddbc8498db018565161d049c9f326e61a3346348df94c38abd9f5f9e71ce50f528a76be881de20b2a0d9b63cebaa06b1e9933
|
|
7
|
+
data.tar.gz: 7e952911a1454bc7be23982120dfd0294c656a6a98c10c8d981ec4ecffaeded81a92e0108ce7e58f3946a2a22209bf75de5d9e648caf369a6762c9c4d476939e
|
data/example/example.msi
CHANGED
|
Binary file
|
data/example/example.msm
ADDED
|
Binary file
|
data/example/rakefile.rb
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
require_relative '../lib/wixgem.rb'
|
|
2
|
+
#require 'wixgem' Use this require statement when including in a project outside of wixgem
|
|
2
3
|
|
|
3
|
-
#Wixgem::Wix.install_path = 'C:\Development\dep\OpenSource\WixToolset\3.9'
|
|
4
|
-
Wixgem::Wix.install_path = '<Path to the root directory of the wix toolset>'
|
|
5
|
-
|
|
6
4
|
task :create_installation_files do
|
|
7
5
|
FileUtils.mkpath('./install_files/directory')
|
|
8
6
|
sleep(1)
|
|
@@ -20,8 +18,7 @@ desc "Generate an installation msi file"
|
|
|
20
18
|
task :installation => [:mergemodule] do
|
|
21
19
|
installation_files = Dir.glob('./example.msm')
|
|
22
20
|
Wixgem::Wix.make_installation("./example.msi",
|
|
23
|
-
{ upgrade_code: '{a62c35a7-6a6d-4392-822b-f6aca7eef88b}',
|
|
24
|
-
files: installation_files }
|
|
21
|
+
{ upgrade_code: '{a62c35a7-6a6d-4392-822b-f6aca7eef88b}', files: installation_files }
|
|
25
22
|
)
|
|
26
23
|
end
|
|
27
24
|
|
data/lib/admin.rb
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
require 'cmd.rb'
|
|
2
|
+
|
|
3
|
+
def admin?
|
|
4
|
+
cmd = CMD.new('net session')
|
|
5
|
+
cmd[:ignore_exit_code] = true
|
|
6
|
+
cmd[:quiet] = true
|
|
7
|
+
cmd.execute
|
|
8
|
+
return true if(cmd[:exit_code] == 0)
|
|
9
|
+
return false
|
|
10
|
+
end
|
|
11
|
+
ENV['HOME'] ||= "#{ENV['HOMEDRIVE']}#{ENV['HOMEPATH']}" if(admin?)
|
data/lib/wixgem.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require 'fileutils'
|
|
2
2
|
require 'tmpdir.rb'
|
|
3
3
|
require 'rexml/document'
|
|
4
|
-
require
|
|
4
|
+
require 'CMD'
|
|
5
5
|
require 'SecureRandom'
|
|
6
6
|
require_relative('file.rb')
|
|
7
7
|
require_relative('shortcut.rb')
|
|
@@ -9,17 +9,19 @@ require_relative('shortcut.rb')
|
|
|
9
9
|
module Wixgem
|
|
10
10
|
|
|
11
11
|
class Wix
|
|
12
|
+
@@install_path = ''
|
|
13
|
+
@@install_path = ENV['WIX'] unless(ENV['WIX'].nil?)
|
|
14
|
+
|
|
12
15
|
def self.initialize
|
|
13
|
-
@install_path = ''
|
|
14
16
|
@debug = false
|
|
15
17
|
@logger = nil
|
|
16
18
|
@log_file = nil
|
|
17
19
|
end
|
|
18
20
|
def self.install_path=(path)
|
|
19
|
-
|
|
21
|
+
@@install_path = path
|
|
20
22
|
end
|
|
21
23
|
def self.install_path
|
|
22
|
-
return
|
|
24
|
+
return @@install_path
|
|
23
25
|
end
|
|
24
26
|
|
|
25
27
|
def self.debug=(bool)
|
|
@@ -267,7 +269,7 @@ class Wix
|
|
|
267
269
|
end
|
|
268
270
|
|
|
269
271
|
def self.execute_heat(input, cmd_line_options)
|
|
270
|
-
heat_cmd =
|
|
272
|
+
heat_cmd = CMD.new("\"#{install_path}/bin/heat.exe\" #{modify_heat_commandline(input, cmd_line_options)}", { quiet: true })
|
|
271
273
|
heat_cmd.execute
|
|
272
274
|
log_wix_output(heat_cmd)
|
|
273
275
|
end
|
|
@@ -411,11 +413,11 @@ class Wix
|
|
|
411
413
|
def self.create_output(wxs_file, output)
|
|
412
414
|
wixobj_file = "#{File.basename(wxs_file,'.wxs')}.wixobj"
|
|
413
415
|
|
|
414
|
-
candle_cmd =
|
|
416
|
+
candle_cmd = CMD.new("\"#{install_path}/bin/candle.exe\" -out \"#{wixobj_file}\" \"#{wxs_file}\"", { quiet: true })
|
|
415
417
|
candle_cmd.execute
|
|
416
418
|
log_wix_output(candle_cmd)
|
|
417
419
|
|
|
418
|
-
light_cmd =
|
|
420
|
+
light_cmd = CMD.new("\"#{install_path}/bin/light.exe\" -nologo -out \"#{output}\" \"#{wixobj_file}\"", { quiet: true })
|
|
419
421
|
light_cmd.execute
|
|
420
422
|
log_wix_output(light_cmd)
|
|
421
423
|
end
|
|
@@ -427,7 +429,7 @@ class Wix
|
|
|
427
429
|
end
|
|
428
430
|
|
|
429
431
|
def self.create_package(output, input)
|
|
430
|
-
raise 'WIX path is not set!' if(install_path.nil?)
|
|
432
|
+
raise 'WIX path is not set! Install Wixtoolset or assign with Wixgem::Wix.install_path = <path to wix toolset' if(self.install_path.nil?)
|
|
431
433
|
input = { files: input } unless(input.kind_of?(Hash))
|
|
432
434
|
verify_input_keys(input)
|
|
433
435
|
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: wixgem
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.65.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Kevin Marshall
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2015-11-
|
|
11
|
+
date: 2015-11-15 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -66,6 +66,34 @@ dependencies:
|
|
|
66
66
|
- - "~>"
|
|
67
67
|
- !ruby/object:Gem::Version
|
|
68
68
|
version: '0'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: execute
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - "~>"
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '0'
|
|
76
|
+
type: :development
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - "~>"
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '0'
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: WindowsInstaller
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - "~>"
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: '0'
|
|
90
|
+
type: :development
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - "~>"
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: '0'
|
|
69
97
|
description: Simple Ruby interface to facilitate creating and compiling windows installation
|
|
70
98
|
files with the Wix Toolset.
|
|
71
99
|
email: KCCKSMarshall@gmail.com
|
|
@@ -76,14 +104,13 @@ files:
|
|
|
76
104
|
- LICENSE
|
|
77
105
|
- README.md
|
|
78
106
|
- example/example.msi
|
|
107
|
+
- example/example.msm
|
|
79
108
|
- example/install_files/directory/file2.txt
|
|
80
109
|
- example/install_files/file1.txt
|
|
81
110
|
- example/rakefile.rb
|
|
82
|
-
- lib/
|
|
83
|
-
- lib/command.rb
|
|
111
|
+
- lib/admin.rb
|
|
84
112
|
- lib/file.rb
|
|
85
113
|
- lib/shortcut.rb
|
|
86
|
-
- lib/shortcut.rb.kev
|
|
87
114
|
- lib/wixgem.rb
|
|
88
115
|
homepage: http://rubygems.org/gems/wixgem
|
|
89
116
|
licenses:
|
|
@@ -105,7 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
105
132
|
version: '0'
|
|
106
133
|
requirements: []
|
|
107
134
|
rubyforge_project:
|
|
108
|
-
rubygems_version: 2.4.5
|
|
135
|
+
rubygems_version: 2.4.5.1
|
|
109
136
|
signing_key:
|
|
110
137
|
specification_version: 4
|
|
111
138
|
summary: Simple Ruby interface to facilitate working with Wix Toolset
|
data/lib/WindowsInstaller.rb
DELETED
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
require 'win32ole'
|
|
2
|
-
require File.dirname(__FILE__) + '/command.rb'
|
|
3
|
-
|
|
4
|
-
module Wixgem
|
|
5
|
-
class WindowsInstaller
|
|
6
|
-
def self.install(msi_file)
|
|
7
|
-
raise "#{msi_file} does not exist!" unless(File.exists?(msi_file))
|
|
8
|
-
msi_file = msi_file.gsub(/\//, '\\')
|
|
9
|
-
raise "#{msi_file} is already installed" if(WindowsInstaller.msi_installed?(msi_file))
|
|
10
|
-
execute("msiexec.exe /quiet /i #{msi_file}")
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def self.uninstall(msi_file)
|
|
14
|
-
raise "#{msi_file} does not exist!" unless(File.exists?(msi_file))
|
|
15
|
-
|
|
16
|
-
info = msi_records(msi_file)
|
|
17
|
-
uninstall_product_code(info['ProductCode'])
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def self.uninstall_product_name(product_name)
|
|
21
|
-
raise "#{product_name} is not installed" unless(product_name_installed?(product_name))
|
|
22
|
-
uninstall_product_code(product_code_from_product_name(product_name))
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def self.uninstall_product_code(product_code)
|
|
26
|
-
raise "#{product_code} is not installed" unless(product_code_installed?(product_code))
|
|
27
|
-
execute("msiexec.exe /quiet /x #{product_code}")
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def self.msi_installed?(msi_file)
|
|
31
|
-
info = msi_records(msi_file)
|
|
32
|
-
result = product_code_installed?(info['ProductCode'])
|
|
33
|
-
return result
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def self.product_name_installed?(product_name)
|
|
37
|
-
installer = WIN32OLE.new('WindowsInstaller.Installer')
|
|
38
|
-
installer.Products.each { |prod_code|
|
|
39
|
-
name = installer.ProductInfo(prod_code, "ProductName")
|
|
40
|
-
return true if (product_name == name)
|
|
41
|
-
}
|
|
42
|
-
return false
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def self.product_code_installed?(product_code)
|
|
46
|
-
installer = WIN32OLE.new('WindowsInstaller.Installer')
|
|
47
|
-
installer.Products.each { |installed_product_code| return true if (product_code == installed_product_code) }
|
|
48
|
-
return false
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def self.product_code_installed?(product_code)
|
|
52
|
-
installer = WIN32OLE.new('WindowsInstaller.Installer')
|
|
53
|
-
installer.Products.each { |prod_code| return true if (product_code == prod_code) }
|
|
54
|
-
return false
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
def self.version_from_product_name(product_name)
|
|
58
|
-
installer = WIN32OLE.new('WindowsInstaller.Installer')
|
|
59
|
-
info = product_info(installer, product_code_from_product_name(product_name, installer))
|
|
60
|
-
return info['VersionString']
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def self.product_code_from_product_name(product_name, installer = nil)
|
|
64
|
-
installer = WIN32OLE.new('WindowsInstaller.Installer') if(installer.nil?)
|
|
65
|
-
installer.Products.each { |prod_code|
|
|
66
|
-
name = installer.ProductInfo(prod_code, "ProductName")
|
|
67
|
-
return prod_code if (product_name == name)
|
|
68
|
-
}
|
|
69
|
-
raise "Failed to find product code for product: #{product_name}"
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def self.product_info(installer, code)
|
|
73
|
-
raise 'Windows installer cannot be nil' if(installer.nil?)
|
|
74
|
-
hash = Hash.new
|
|
75
|
-
# known product keywords found on internet. Would be nice to generate.
|
|
76
|
-
%w[Language PackageCode Transforms AssignmentType PackageName InstalledProductName VersionString RegCompany
|
|
77
|
-
RegOwner ProductID ProductIcon InstallLocation InstallSource InstallDate Publisher LocalPackage HelpLink
|
|
78
|
-
HelpTelephone URLInfoAbout URLUpdateInfo InstanceType].sort.each do |prop|
|
|
79
|
-
value = installer.ProductInfo(code, prop)
|
|
80
|
-
hash[prop] = value unless(value.nil? || value == '')
|
|
81
|
-
end
|
|
82
|
-
return hash
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
def self.msi_info(installer, msi_file)
|
|
86
|
-
raise 'Windows installer cannot be nil' if(installer.nil?)
|
|
87
|
-
hash = Hash.new
|
|
88
|
-
# known product keywords found on internet. Would be nice to generate.
|
|
89
|
-
%w[Language PackageCode Transforms AssignmentType PackageName InstalledProductName VersionString RegCompany
|
|
90
|
-
RegOwner ProductID ProductIcon InstallLocation InstallSource InstallDate Publisher LocalPackage HelpLink
|
|
91
|
-
HelpTelephone URLInfoAbout URLUpdateInfo InstanceType].sort.each do |prop|
|
|
92
|
-
value = installer.ProductInfo(code, prop)
|
|
93
|
-
hash[prop] = value unless(value.nil? || value == '')
|
|
94
|
-
end
|
|
95
|
-
return hash
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
def self.dump_info(product_name)
|
|
99
|
-
installer = WIN32OLE.new('WindowsInstaller.Installer')
|
|
100
|
-
properties = product_info(installer, product_code_from_product_name(product_name, installer))
|
|
101
|
-
properties.each { |id, value| puts "#{id}: #{value}" }
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
private
|
|
105
|
-
def self.msi_records(msi_file)
|
|
106
|
-
records = {}
|
|
107
|
-
|
|
108
|
-
installer = WIN32OLE.new('WindowsInstaller.Installer')
|
|
109
|
-
sql_query = "SELECT * FROM `Property`"
|
|
110
|
-
|
|
111
|
-
db = installer.OpenDatabase(msi_file, 0)
|
|
112
|
-
|
|
113
|
-
view = db.OpenView(sql_query)
|
|
114
|
-
view.Execute(nil)
|
|
115
|
-
|
|
116
|
-
record = view.Fetch()
|
|
117
|
-
return '' if(record == nil)
|
|
118
|
-
|
|
119
|
-
while(!record.nil?)
|
|
120
|
-
records[record.StringData(1)] = record.StringData(2)
|
|
121
|
-
record = view.Fetch()
|
|
122
|
-
end
|
|
123
|
-
db.ole_free
|
|
124
|
-
db = nil
|
|
125
|
-
installer.ole_free
|
|
126
|
-
installer = nil
|
|
127
|
-
|
|
128
|
-
return records
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
def self.dump_msi_records(msi)
|
|
132
|
-
records = msi_records(msi)
|
|
133
|
-
|
|
134
|
-
puts "#{msi} Properties:"
|
|
135
|
-
records.each do |key,value|
|
|
136
|
-
puts "#{key}: #{value}"
|
|
137
|
-
end
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
def self.dump_product(product_name)
|
|
141
|
-
installer = WIN32OLE.new('WindowsInstaller.Installer')
|
|
142
|
-
# only one session per process!
|
|
143
|
-
session = installer.OpenProduct(product_code?(product_name, installer))
|
|
144
|
-
db = session.Database
|
|
145
|
-
|
|
146
|
-
sql_query = "SELECT * FROM `Property`"
|
|
147
|
-
view = db.OpenView(sql_query)
|
|
148
|
-
view.Execute(nil)
|
|
149
|
-
|
|
150
|
-
record = view.Fetch()
|
|
151
|
-
return '' if(record == nil)
|
|
152
|
-
|
|
153
|
-
puts "Session Properties:"
|
|
154
|
-
while(!record.nil?)
|
|
155
|
-
puts "#{record.StringData(1)}: #{record.StringData(2)}"
|
|
156
|
-
record = view.Fetch()
|
|
157
|
-
end
|
|
158
|
-
db.ole_free
|
|
159
|
-
db = nil
|
|
160
|
-
installer.ole_free
|
|
161
|
-
installer = nil
|
|
162
|
-
puts ''
|
|
163
|
-
end
|
|
164
|
-
|
|
165
|
-
def self.execute(cmd)
|
|
166
|
-
command = Wixgem::Command.new(cmd, { quiet: true } )
|
|
167
|
-
#command[:debug] = true
|
|
168
|
-
command.execute
|
|
169
|
-
end
|
|
170
|
-
end
|
|
171
|
-
end
|
data/lib/command.rb
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
require 'open3'
|
|
2
|
-
|
|
3
|
-
module Wixgem
|
|
4
|
-
|
|
5
|
-
class Command < Hash
|
|
6
|
-
def initialize(cmd, options=nil)
|
|
7
|
-
self[:output] = ''
|
|
8
|
-
self[:error] = ''
|
|
9
|
-
self[:exit_code] = ''
|
|
10
|
-
self[:ignore_exit_code] = false
|
|
11
|
-
self[:debug] = false
|
|
12
|
-
self[:quiet] = false
|
|
13
|
-
|
|
14
|
-
self[:command]=cmd
|
|
15
|
-
options.each { |key, value| self[key] = value} unless(options.nil?)
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def execute
|
|
19
|
-
begin
|
|
20
|
-
puts self[:command] unless(self[:quiet])
|
|
21
|
-
self[:output],self[:error], self[:exit_code] = Open3.capture3(self[:command])
|
|
22
|
-
self[:exit_code]=self[:exit_code].to_i
|
|
23
|
-
|
|
24
|
-
if(self[:debug])
|
|
25
|
-
puts "command: #{self[:command]}" if(self[:quiet])
|
|
26
|
-
puts "output: #{self[:output]}"
|
|
27
|
-
puts "error: #{self[:error]}"
|
|
28
|
-
puts "exit_code: #{self[:exit_code]}"
|
|
29
|
-
end
|
|
30
|
-
rescue Exception => e
|
|
31
|
-
self[:error] = "Exception: " + e.to_s
|
|
32
|
-
self[:exit_code]=1
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
if((self[:exit_code] != 0) && !self[:ignore_exit_code])
|
|
36
|
-
exception_text = self[:error]
|
|
37
|
-
exception_text = self[:output] if(self[:error].empty?)
|
|
38
|
-
raise exception_text
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
end
|
data/lib/shortcut.rb.kev
DELETED
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
require 'rexml/document'
|
|
2
|
-
require 'SecureRandom'
|
|
3
|
-
|
|
4
|
-
module Wixgem
|
|
5
|
-
|
|
6
|
-
class Shortcut
|
|
7
|
-
|
|
8
|
-
def initialize(file, hash)
|
|
9
|
-
@file = file
|
|
10
|
-
@hash = hash
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def create(xml_doc)
|
|
14
|
-
raise "Shortcut #{@file} does not exist" unless(File.exists?(@file))
|
|
15
|
-
|
|
16
|
-
file_elements = REXML::XPath.match(xml_doc, "//File[@Source='.\\#{@file.gsub(/\//,'\\')}']")
|
|
17
|
-
raise "Shortcut #{@file} does not match an installation file" if(file_elements.length == 0)
|
|
18
|
-
|
|
19
|
-
case @hash[:directory]
|
|
20
|
-
when :desktop
|
|
21
|
-
create_file_shortcut(file_elements[0])
|
|
22
|
-
xml_doc = create_desktop_folder(xml_doc)
|
|
23
|
-
# when :start_menu
|
|
24
|
-
# program_files_element = create_start_menu_shortcut(xml_doc)
|
|
25
|
-
# create_start_menu_item(program_files_element)
|
|
26
|
-
else
|
|
27
|
-
raise 'Support for #{:directory} shortcut has not been added'
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
return xml_doc
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def create_file_shortcut(file_element)
|
|
34
|
-
shortcut_element = file_element.add_element 'Shortcut'
|
|
35
|
-
|
|
36
|
-
shortcut_element.attributes['Id'] = "Shortcut_#{SecureRandom.uuid.gsub(/-/,'')}"
|
|
37
|
-
shortcut_element.attributes['Arguments'] = @hash[:arguments] if(@hash.has_key?(:arguments))
|
|
38
|
-
|
|
39
|
-
shortcut_name = File.basename(@file)
|
|
40
|
-
if(@hash.has_key?(:name))
|
|
41
|
-
shortcut_name = @hash[:name]
|
|
42
|
-
else
|
|
43
|
-
@hash[:name] = shortcut_name
|
|
44
|
-
end
|
|
45
|
-
shortcut_element.attributes['Name'] = shortcut_name
|
|
46
|
-
|
|
47
|
-
shortcut_element.attributes['Description'] = @hash[:description] if(@hash.has_key?(:description))
|
|
48
|
-
shortcut_element.attributes['Directory'] = 'DesktopFolder'
|
|
49
|
-
|
|
50
|
-
shortcut_element.attributes['Advertise']="yes"
|
|
51
|
-
shortcut_element.attributes['Advertise'] = "no" if(@hash.has_key?(:advertise) && !@hash[:advertise])
|
|
52
|
-
create_icon_element(shortcut_element) if(@hash.has_key?(:icon))
|
|
53
|
-
|
|
54
|
-
return shortcut_element
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
def create_icon_element(shortcut_element)
|
|
58
|
-
icon_element = shortcut_element.add_element 'Icon'
|
|
59
|
-
icon_element.attributes['Id'] = File.basename(@hash[:icon])
|
|
60
|
-
icon_element.attributes['SourceFile'] = ".\\#{@hash[:icon].gsub(/\//, '\\')}"
|
|
61
|
-
return icon_element
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
def create_desktop_folder(xml_doc)
|
|
65
|
-
desktop_elements = REXML::XPath.match(xml_doc, "//DesktopFolder")
|
|
66
|
-
if(desktop_elements.length == 0)
|
|
67
|
-
wix_elements = REXML::XPath.match(xml_doc, "//Wix")
|
|
68
|
-
fragment_element = wix_elements[0].add_element 'Fragment'
|
|
69
|
-
target_dir = fragment_element.add_element 'DirectoryRef', { 'Id' => 'TARGETDIR' }
|
|
70
|
-
target_dir.add_element 'Directory', { 'Id' => 'DesktopFolder', 'Name' => 'Desktop' }
|
|
71
|
-
end
|
|
72
|
-
return xml_doc
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
# def create_start_menu_shortcut(program_folder_element)
|
|
76
|
-
# puts "1"
|
|
77
|
-
# shortcut_element = program_folder_element.add_element 'Shortcut'
|
|
78
|
-
#
|
|
79
|
-
# shortcut_element.attributes['Id'] = 'ApplicationStartMenuShortcut'
|
|
80
|
-
#
|
|
81
|
-
# shortcut_name = File.basename(@file)
|
|
82
|
-
# ext = File.extname(@file)
|
|
83
|
-
# if(@hash.has_key?(:name))
|
|
84
|
-
# shortcut_name = @hash[:name]
|
|
85
|
-
# else
|
|
86
|
-
# shortcut_name = File.basename(shortcut_name, ext) if(ext != '')
|
|
87
|
-
# @hash[:name] = shortcut_name
|
|
88
|
-
# end
|
|
89
|
-
# shortcut_element.attributes['Name'] = shortcut_name
|
|
90
|
-
|
|
91
|
-
# puts "2"
|
|
92
|
-
# shortcut_element.attributes['Description'] = @hash[:description] if(@hash.has_key?(:description))
|
|
93
|
-
# shortcut_element.attributes['Target'] = @file
|
|
94
|
-
#
|
|
95
|
-
# puts "3"
|
|
96
|
-
# remove_folder_element = program_folder_element.add_element 'RemoveFolder'
|
|
97
|
-
# remove_folder_element.attributes['Id'] = 'ApplicationProgramsFolder'
|
|
98
|
-
# remove_folder_element.attributes['On'] = 'uninstall'
|
|
99
|
-
|
|
100
|
-
# puts "4"
|
|
101
|
-
# registry_folder_element = program_folder_element.add_element 'RegistryValue'
|
|
102
|
-
# remove_folder_element.attributes['Root'] = 'HKCU'
|
|
103
|
-
# remove_folder_element.attributes['Key'] = "Software\\Microsoft\\#{shortcut_name.gsub(/ /,'')}"
|
|
104
|
-
# remove_folder_element.attributes['Name'] = 'installed'
|
|
105
|
-
# remove_folder_element.attributes['Type'] = 'integer'
|
|
106
|
-
# remove_folder_element.attributes['Value'] = '1'
|
|
107
|
-
# remove_folder_element.attributes['KeyPath'] = 'yes'
|
|
108
|
-
|
|
109
|
-
# return shortcut_element
|
|
110
|
-
# end
|
|
111
|
-
|
|
112
|
-
# def create_start_menu_component(xml_doc)
|
|
113
|
-
# app_programs_elements = REXML::XPath.match(xml_doc, "//ApplicationProgramsFolder")
|
|
114
|
-
# app_programs_element = nil
|
|
115
|
-
# if(app_programs_elements.length == 0)
|
|
116
|
-
# wix_elements = REXML::XPath.match(xml_doc, "//Wix")
|
|
117
|
-
# fragment_element = wix_elements[0].add_element 'Fragment'
|
|
118
|
-
# app_programs_element = fragment_element.add_element 'DirectoryRef', { 'Id' => 'ApplicationProgramsFolder' }
|
|
119
|
-
# else if(app_programs_elements.length == 1)
|
|
120
|
-
# app_programs_element = app_programs_elements[0]
|
|
121
|
-
# else
|
|
122
|
-
# raise "Wix file contains multiple ApplicationProgramsFolder's"
|
|
123
|
-
# end
|
|
124
|
-
|
|
125
|
-
# return app_programs_element.add_element 'Component', { 'Id' => 'ApplicationShortcut', 'Guid' => '{a9e94876-60b5-4038-8baa-ea76a3f9ebe1}' }
|
|
126
|
-
# end
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
#end
|