ms-binary-resources 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 86da19e6dd64a8090ae6f58af1ee9389c064c2a4
4
+ data.tar.gz: 146e58a02d2cdb175ee62fbd09852646f7d4afab
5
+ SHA512:
6
+ metadata.gz: d7a57c1f7c631d0169cedbee504e4fc4dbee44c66988fb94ef53c9bca9cf0a1ff659967bbde449a520b0ff2f69afd326ecc0af1156ff23431011b0684be9b2aa
7
+ data.tar.gz: 0995fe940c55880302f93f636a57785492c0bc238dce4d81e0699d4c705c095aadf43cea5af9fbb773640109394672d3c565f434898761e506664abd0d7f4bf3
data/.gitignore ADDED
@@ -0,0 +1,16 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ *.exe
15
+ mkmf.log
16
+ .idea
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/.rubocop.yml ADDED
@@ -0,0 +1,4 @@
1
+ AllCops:
2
+ Include:
3
+ - 'lib/**/*.rb'
4
+ - 'spec/**/*.rb'
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.1.2
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ rvm:
2
+ - 1.9.3
3
+ - 2.0.0
4
+ - 2.1.2
5
+
6
+ notifications:
7
+ disabled: true
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in ms-binary-resources.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Aramis Group, LLC dba code lever
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,57 @@
1
+ # Ms::BinaryResources [![Build Status](https://travis-ci.org/code-lever/ms-binary-resources.png)](https://travis-ci.org/code-lever/ms-binary-resources) [![Dependency Status](https://gemnasium.com/code-lever/ms-binary-resources.png)](https://gemnasium.com/code-lever/ms-binary-resources) [![Code Climate](https://codeclimate.com/github/code-lever/ms-binary-resources.png)](https://codeclimate.com/github/code-lever/ms-binary-resources)
2
+
3
+ A way to read Microsoft's binary resource files in Ruby.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'ms-binary-resources'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ ```
16
+ $ bundle
17
+ ```
18
+
19
+ Or install it yourself as:
20
+
21
+ ```
22
+ $ gem install ms-binary-resources
23
+ ```
24
+
25
+ ## Usage
26
+
27
+ ```ruby
28
+ reader = Ms::BinaryResources::Reader.new('/path/to/file')
29
+ reader.keys
30
+ => ['key1', 'key2', ...]
31
+ reader.key? 'key1'
32
+ => true
33
+ reader.key? 'keyxx'
34
+ => false
35
+ reader['key1']
36
+ => 'some value'
37
+ reader.type_of 'key2'
38
+ => :int32
39
+ reader['key2']
40
+ => 8675309
41
+ ```
42
+
43
+ ## Caveats
44
+
45
+ Currently only string values are supported.
46
+
47
+ ## Thanks
48
+
49
+ This is largely cribbed off of the [Mono Project's](https://github.com/mono/mono) class library implementation of ResourceReader and friends.
50
+
51
+ ## Contributing
52
+
53
+ 1. Fork it ( https://github.com/code-lever/ms-binary-resources/fork )
54
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
55
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
56
+ 4. Push to the branch (`git push origin my-new-feature`)
57
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env rake
2
+ require 'bundler/gem_tasks'
3
+ require 'rspec/core/rake_task'
4
+ require 'ci/reporter/rake/rspec'
5
+
6
+ RSpec::Core::RakeTask.new('spec')
7
+ task :default => :spec
@@ -0,0 +1,3 @@
1
+ require 'ms/binary/resources/constants'
2
+ require 'ms/binary/resources/reader'
3
+ require 'ms/binary/resources/version'
@@ -0,0 +1,30 @@
1
+ module Ms
2
+ module BinaryResources
3
+
4
+ MAGIC_NUMBER = 0xBEEFCACE
5
+
6
+ RESOURCE_TYPES = {
7
+ null: 0,
8
+ string: 1,
9
+ bool: 2,
10
+ char: 3,
11
+ byte: 4,
12
+ sbyte: 5,
13
+ int16: 6,
14
+ uint16: 7,
15
+ int32: 8,
16
+ uint32: 9,
17
+ int64: 10,
18
+ uint64: 11,
19
+ single: 12,
20
+ double: 13,
21
+ decimal: 14,
22
+ datetime: 15,
23
+ timespan: 16,
24
+ bytearray: 32,
25
+ stream: 33,
26
+ fistcustom: 64,
27
+ }
28
+
29
+ end
30
+ end
@@ -0,0 +1,185 @@
1
+ require 'open-uri'
2
+ require 'ostruct'
3
+
4
+ module Ms
5
+ module BinaryResources
6
+
7
+ class Reader
8
+
9
+ include Enumerable
10
+
11
+ attr_reader :manager_magic, :manager_version, :manager_length, :resource_version,
12
+ :resource_count, :type_count
13
+
14
+ def initialize(uri)
15
+ @file = open(uri, 'rb')
16
+ read_headers
17
+ rescue => e
18
+ raise ArgumentError, "file does not appear to be a resources @file (#{e})"
19
+ @file.close
20
+ end
21
+
22
+ def each(&block)
23
+ keys.each { |k| block.call(k, (self[k] rescue nil)) }
24
+ end
25
+
26
+ def key?(name)
27
+ info_for_name(name)
28
+ end
29
+
30
+ def keys
31
+ @keys ||= @resource_infos.map(&:name)
32
+ end
33
+
34
+ def type_of(name)
35
+ info = info_for_name(name)
36
+ if info
37
+ type = RESOURCE_TYPES.find { |_,v| info.type_index == v }
38
+ type && type.first
39
+ end
40
+ end
41
+
42
+ def [](name)
43
+ info = info_for_name(name)
44
+ info ? read_value(info) : nil
45
+ end
46
+
47
+ def close
48
+ @file.close
49
+ @file = nil
50
+ end
51
+
52
+ private
53
+
54
+ def info_for_name(name)
55
+ @resource_infos.find { |info| info.name.encode(name.encoding) == name }
56
+ end
57
+
58
+ def read_headers
59
+ @manager_magic = read_uint32
60
+ raise 'magic (%08X)' % manager_magic unless MAGIC_NUMBER == manager_magic
61
+
62
+ @manager_version = read_uint32
63
+ @manager_length = read_uint32
64
+
65
+ if 1 == manager_version
66
+ @reader_class = @file.read(@manager_length)
67
+ else
68
+ raise 'Unsupported manager version (%d)' % manager_version
69
+ end
70
+
71
+ @resource_version = read_uint32
72
+ unless [1, 2].include?(resource_version)
73
+ raise 'Unsupported resource version (%d)' % resource_version
74
+ end
75
+
76
+ @resource_count = read_uint32
77
+ @type_count = read_uint32
78
+
79
+ @type_names = @type_count.times.map { read_string }
80
+
81
+ # next section is 8-byte aligned, there will be PADPADPAD characters to make it so
82
+ pad_alignment = @file.pos & 0x07
83
+ pad_count = pad_alignment > 0 ? 8 - pad_alignment : 0
84
+ padding = @file.read(pad_count)
85
+
86
+ @hashes = resource_count.times.map { read_uint32 }
87
+ @positions = resource_count.times.map { read_uint32 }
88
+
89
+ @data_section_offset = read_uint32
90
+ @name_section_offset = @file.pos
91
+
92
+ @resource_infos = @positions.map { |pos| read_resource_info(pos) }
93
+
94
+ @file.seek(@name_section_offset)
95
+ end
96
+
97
+ def read_resource_info(name_position)
98
+ seek_to_name(name_position)
99
+ length = read_7bit_encoded_int
100
+ name = read(length).encode('UTF-16LE', 'UTF-16LE')
101
+
102
+ seek_to_data(read_uint32)
103
+ type_index = read_7bit_encoded_int
104
+
105
+ OpenStruct.new name: name, value_position: @file.pos, type_index: type_index
106
+ end
107
+
108
+ def read(bytes)
109
+ @file.read(bytes)
110
+ end
111
+
112
+ def read_byte
113
+ read(1).unpack('C').first
114
+ end
115
+
116
+ def read_int16
117
+ read(2).unpack('s<').first
118
+ end
119
+
120
+ def read_uint16
121
+ read(2).unpack('S<').first
122
+ end
123
+
124
+ def read_int32
125
+ read(4).unpack('l<').first
126
+ end
127
+
128
+ def read_uint32
129
+ read(4).unpack('L<').first
130
+ end
131
+
132
+ def read_int64
133
+ read(8).unpack('q<').first
134
+ end
135
+
136
+ def read_uint64
137
+ read(8).unpack('Q<').first
138
+ end
139
+
140
+ def read_7bit_encoded_int
141
+ ret = 0
142
+ shift = 0
143
+ b = 0
144
+
145
+ begin
146
+ b = read_byte
147
+ ret |= (b & 0x7f) << shift
148
+ shift += 7
149
+ end while (b & 0x80) == 0x80
150
+
151
+ ret
152
+ end
153
+
154
+ def read_string
155
+ read(read_7bit_encoded_int)
156
+ end
157
+
158
+ def read_value(resource_info)
159
+ @file.seek(resource_info.value_position)
160
+
161
+ case resource_info.type_index
162
+ when RESOURCE_TYPES[:string]; read_string
163
+ when RESOURCE_TYPES[:int16]; read_int16
164
+ when RESOURCE_TYPES[:uint16]; read_uint16
165
+ when RESOURCE_TYPES[:int32]; read_int32
166
+ when RESOURCE_TYPES[:uint32]; read_uint32
167
+ when RESOURCE_TYPES[:int64]; read_int64
168
+ when RESOURCE_TYPES[:uint64]; read_uint64
169
+ else
170
+ raise 'Unsupported type index: %d' % resource_info.type_index
171
+ end
172
+ end
173
+
174
+ def seek_to_name(position)
175
+ @file.seek(@name_section_offset + position)
176
+ end
177
+
178
+ def seek_to_data(position)
179
+ @file.seek(@data_section_offset + position)
180
+ end
181
+
182
+ end
183
+
184
+ end
185
+ end
@@ -0,0 +1,5 @@
1
+ module Ms
2
+ module BinaryResources
3
+ VERSION = '0.1.0'
4
+ end
5
+ end
@@ -0,0 +1,33 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'ms/binary/resources/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'ms-binary-resources'
8
+ spec.version = Ms::BinaryResources::VERSION
9
+ spec.authors = ['Nick Veys']
10
+ spec.email = ['nick@codelever.com']
11
+ spec.summary = %q{Read binary resource files}
12
+ spec.description = %q{}
13
+ spec.homepage = 'https://github.com/code-lever/ms-binary-resources'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_development_dependency 'awesome_print'
22
+ spec.add_development_dependency 'bundler', '~> 1.6'
23
+ spec.add_development_dependency 'ci_reporter', '~> 1.9'
24
+ spec.add_development_dependency 'pry'
25
+ spec.add_development_dependency 'rake', '~> 10.0'
26
+ spec.add_development_dependency 'rspec', '~> 2.99'
27
+ spec.add_development_dependency 'rubocop'
28
+ spec.add_development_dependency 'rubocop-checkstyle_formatter'
29
+ spec.add_development_dependency 'simplecov'
30
+ spec.add_development_dependency 'simplecov-gem-adapter'
31
+ spec.add_development_dependency 'simplecov-rcov'
32
+ spec.add_development_dependency 'yard'
33
+ end
@@ -0,0 +1,174 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ms::BinaryResources::Reader do
4
+
5
+ context 'with invalid derp.bin' do
6
+
7
+ describe '.new' do
8
+
9
+ invalid_data_files.each do |file|
10
+ it "raises when created with #{file}" do
11
+ expect { described_class.new(file) }.to raise_error
12
+ end
13
+ end
14
+
15
+ end
16
+
17
+ end
18
+
19
+ context 'with Example.resources' do
20
+
21
+ let(:file) { data_file('Example.resources') }
22
+
23
+ subject { described_class.new(file) }
24
+
25
+ its(:manager_magic) { should eql(0xBEEFCACE) }
26
+
27
+ its(:manager_version) { should eql(1) }
28
+
29
+ its(:manager_length) { should eql(145) }
30
+
31
+ its(:resource_version) { should eql(2) }
32
+
33
+ its(:resource_count) { should eql(16) }
34
+
35
+ its(:type_count) { should eql(0) }
36
+
37
+ describe '#key?' do
38
+
39
+ %w(Title Label1 Label2 Label3 Label4 Label5 Label6 Label7 Label8
40
+ Label9 Label10 Label11 Label12 Label13 Label14 Label15).each do |key|
41
+ it "is true for #{key}" do
42
+ expect(subject.key?(key)).to be_truthy
43
+ end
44
+ end
45
+
46
+ it 'is false for keys not present' do
47
+ expect(subject.key?('hello')).to be_falsey
48
+ end
49
+
50
+ end
51
+
52
+ describe '#type_of' do
53
+
54
+ context 'with existing key Label1' do
55
+
56
+ specify { expect(subject.type_of('Label1')).to eql(:string) }
57
+
58
+ end
59
+
60
+ context 'with non-existant key Label155' do
61
+
62
+ specify { expect(subject.type_of('Label155')).to be_nil }
63
+
64
+ end
65
+
66
+ end
67
+
68
+ describe '#[]' do
69
+
70
+ {
71
+ 'Title' => '"Contact Information"',
72
+ 'Label1' => '"First Name:"',
73
+ 'Label2' => '"Middle Name:"',
74
+ 'Label3' => '"Last Name:"',
75
+ 'Label4' => '"SSN:"',
76
+ 'Label5' => '"Street Address:"',
77
+ 'Label6' => '"City:"',
78
+ 'Label7' => '"State:"',
79
+ 'Label8' => '"Zip Code:"',
80
+ 'Label9' => '"Home Phone:"',
81
+ 'Label10' => '"Business Phone:"',
82
+ 'Label11' => '"Mobile Phone:"',
83
+ 'Label12' => '"Other Phone:"',
84
+ 'Label13' => '"Fax:"',
85
+ 'Label14' => '"Email Address:"',
86
+ 'Label15' => '"Alternate Email Address:"',
87
+ }.each do |k,v|
88
+ it "is #{v} for #{k}" do
89
+ expect(subject[k]).to eql(v)
90
+ end
91
+ end
92
+
93
+ end
94
+
95
+ end
96
+
97
+ context 'with Example2.resources' do
98
+
99
+ let(:file) { data_file('Example2.resources') }
100
+
101
+ subject { described_class.new(file) }
102
+
103
+ its(:manager_magic) { should eql(0xBEEFCACE) }
104
+
105
+ its(:manager_version) { should eql(1) }
106
+
107
+ its(:manager_length) { should eql(145) }
108
+
109
+ its(:resource_version) { should eql(2) }
110
+
111
+ its(:resource_count) { should eql(63) }
112
+
113
+ its(:type_count) { should eql(9) }
114
+
115
+ describe '#key?' do
116
+
117
+ context 'with existing key descriptionLabel.Text' do
118
+
119
+ specify { expect(subject.key?('descriptionLabel.Text')).to be_truthy }
120
+
121
+ end
122
+
123
+ context 'with non-existent key descriptionLabelzzz.Text' do
124
+
125
+ specify { expect(subject.key?('descriptionLabelzzz.Text')).to be_falsey }
126
+
127
+ end
128
+
129
+ end
130
+
131
+ describe '#type_of' do
132
+
133
+ {
134
+ 'errorDetailsTextBox.Size' => nil,
135
+ 'panel1.TabIndex16' => :int16,
136
+ 'progressBar.TabIndex16' => :uint16,
137
+ 'panel1.TabIndex32' => :int32,
138
+ 'progressBar.TabIndex32' => :uint32,
139
+ 'panel1.TabIndex64' => :int64,
140
+ 'progressBar.TabIndex64' => :uint64,
141
+ 'hello' => nil,
142
+ }.each do |k,v|
143
+ it "is #{v.inspect} for #{k}" do
144
+ expect(subject.type_of(k)).to eql(v)
145
+ end
146
+ end
147
+
148
+ end
149
+
150
+ describe '#[]' do
151
+
152
+ {
153
+ 'panel1.TabIndex16' => 13,
154
+ 'progressBar.TabIndex16' => 2500,
155
+ 'panel1.TabIndex32' => 365,
156
+ 'progressBar.TabIndex32' => 250000,
157
+ 'panel1.TabIndex64' => 30,
158
+ 'progressBar.TabIndex64' => 250000000000000,
159
+ 'hello' => nil,
160
+ }.each do |k,v|
161
+ it "is #{v.inspect} for #{k}" do
162
+ expect(subject[k]).to eql(v)
163
+ end
164
+ end
165
+
166
+ it 'raises for unsupported type' do
167
+ expect { subject['errorDetailsTextBox.Size'] }.to raise_error
168
+ end
169
+
170
+ end
171
+
172
+ end
173
+
174
+ end
@@ -0,0 +1,32 @@
1
+ require 'simplecov'
2
+ require 'simplecov-gem-adapter'
3
+ require 'simplecov-rcov'
4
+ SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter
5
+ SimpleCov.start 'gem' if ENV['COVERAGE']
6
+
7
+ require 'awesome_print'
8
+ require 'pathname'
9
+ require 'ms/binary/resources'
10
+
11
+ RSpec.configure do |config|
12
+ config.treat_symbols_as_metadata_keys_with_true_values = true
13
+ config.run_all_when_everything_filtered = true
14
+ config.filter_run :focus
15
+
16
+ # Run specs in random order to surface order dependencies. If you find an
17
+ # order dependency and want to debug it, you can fix the order by providing
18
+ # the seed, which is printed after each run.
19
+ # --seed 1234
20
+ config.order = 'random'
21
+ end
22
+
23
+ def data_file(name)
24
+ File.expand_path("#{File.dirname(__FILE__)}/../support/data/#{name}")
25
+ end
26
+
27
+ def invalid_data_files
28
+ dir = "#{File.dirname(__FILE__)}/../support/data/invalid"
29
+ invalid = Dir.glob("#{dir}/**/*").select { |e| File.file? e }
30
+ invalid << __FILE__
31
+ invalid << 'not-really-a-file.resources'
32
+ end
Binary file
@@ -0,0 +1,17 @@
1
+ # Generate resources file via 'resgen Example.txt'
2
+ Title="Contact Information"
3
+ Label1="First Name:"
4
+ Label2="Middle Name:"
5
+ Label3="Last Name:"
6
+ Label4="SSN:"
7
+ Label5="Street Address:"
8
+ Label6="City:"
9
+ Label7="State:"
10
+ Label8="Zip Code:"
11
+ Label9="Home Phone:"
12
+ Label10="Business Phone:"
13
+ Label11="Mobile Phone:"
14
+ Label12="Other Phone:"
15
+ Label13="Fax:"
16
+ Label14="Email Address:"
17
+ Label15="Alternate Email Address:"
Binary file
@@ -0,0 +1,318 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <root>
3
+ <!--
4
+ Microsoft ResX Schema
5
+
6
+ Version 2.0
7
+
8
+ The primary goals of this format is to allow a simple XML format
9
+ that is mostly human readable. The generation and parsing of the
10
+ various data types are done through the TypeConverter classes
11
+ associated with the data types.
12
+
13
+ Example:
14
+
15
+ ... ado.net/XML headers & schema ...
16
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
17
+ <resheader name="version">2.0</resheader>
18
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
19
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
20
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
21
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
22
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
23
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
24
+ </data>
25
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
26
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
27
+ <comment>This is a comment</comment>
28
+ </data>
29
+
30
+ There are any number of "resheader" rows that contain simple
31
+ name/value pairs.
32
+
33
+ Each data row contains a name, and value. The row also contains a
34
+ type or mimetype. Type corresponds to a .NET class that support
35
+ text/value conversion through the TypeConverter architecture.
36
+ Classes that don't support this are serialized and stored with the
37
+ mimetype set.
38
+
39
+ The mimetype is used for serialized objects, and tells the
40
+ ResXResourceReader how to depersist the object. This is currently not
41
+ extensible. For a given mimetype the value must be set accordingly:
42
+
43
+ Note - application/x-microsoft.net.object.binary.base64 is the format
44
+ that the ResXResourceWriter will generate, however the reader can
45
+ read any of the formats listed below.
46
+
47
+ mimetype: application/x-microsoft.net.object.binary.base64
48
+ value : The object must be serialized with
49
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
50
+ : and then encoded with base64 encoding.
51
+
52
+ mimetype: application/x-microsoft.net.object.soap.base64
53
+ value : The object must be serialized with
54
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
55
+ : and then encoded with base64 encoding.
56
+
57
+ mimetype: application/x-microsoft.net.object.bytearray.base64
58
+ value : The object must be serialized into a byte array
59
+ : using a System.ComponentModel.TypeConverter
60
+ : and then encoded with base64 encoding.
61
+ -->
62
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
63
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
64
+ <xsd:element name="root" msdata:IsDataSet="true">
65
+ <xsd:complexType>
66
+ <xsd:choice maxOccurs="unbounded">
67
+ <xsd:element name="metadata">
68
+ <xsd:complexType>
69
+ <xsd:sequence>
70
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
71
+ </xsd:sequence>
72
+ <xsd:attribute name="name" use="required" type="xsd:string" />
73
+ <xsd:attribute name="type" type="xsd:string" />
74
+ <xsd:attribute name="mimetype" type="xsd:string" />
75
+ <xsd:attribute ref="xml:space" />
76
+ </xsd:complexType>
77
+ </xsd:element>
78
+ <xsd:element name="assembly">
79
+ <xsd:complexType>
80
+ <xsd:attribute name="alias" type="xsd:string" />
81
+ <xsd:attribute name="name" type="xsd:string" />
82
+ </xsd:complexType>
83
+ </xsd:element>
84
+ <xsd:element name="data">
85
+ <xsd:complexType>
86
+ <xsd:sequence>
87
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
88
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
89
+ </xsd:sequence>
90
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
91
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
92
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
93
+ <xsd:attribute ref="xml:space" />
94
+ </xsd:complexType>
95
+ </xsd:element>
96
+ <xsd:element name="resheader">
97
+ <xsd:complexType>
98
+ <xsd:sequence>
99
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
100
+ </xsd:sequence>
101
+ <xsd:attribute name="name" type="xsd:string" use="required" />
102
+ </xsd:complexType>
103
+ </xsd:element>
104
+ </xsd:choice>
105
+ </xsd:complexType>
106
+ </xsd:element>
107
+ </xsd:schema>
108
+ <resheader name="resmimetype">
109
+ <value>text/microsoft-resx</value>
110
+ </resheader>
111
+ <resheader name="version">
112
+ <value>2.0</value>
113
+ </resheader>
114
+ <resheader name="reader">
115
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
116
+ </resheader>
117
+ <resheader name="writer">
118
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
119
+ </resheader>
120
+ <data name="&gt;&gt;panel1.Parent" xml:space="preserve">
121
+ <value>tableLayoutPanel</value>
122
+ </data>
123
+ <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
124
+ <data name="panel1.Size" type="System.Drawing.Size, System.Drawing">
125
+ <value>550, 147</value>
126
+ </data>
127
+ <data name="&gt;&gt;errorDetailsTextBox.Type" xml:space="preserve">
128
+ <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
129
+ </data>
130
+ <data name="&gt;&gt;$this.Type" xml:space="preserve">
131
+ <value>SharePointInstaller.InstallerControl, Setup, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cb87ba0215b862e1</value>
132
+ </data>
133
+ <data name="descriptionLabel.Location" type="System.Drawing.Point, System.Drawing">
134
+ <value>3, 132</value>
135
+ </data>
136
+ <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
137
+ <data name="tableLayoutPanel.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
138
+ <value>Fill</value>
139
+ </data>
140
+ <data name="errorDetailsTextBox.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
141
+ <value>Top, Left, Right</value>
142
+ </data>
143
+ <data name="&gt;&gt;descriptionLabel.ZOrder" xml:space="preserve">
144
+ <value>1</value>
145
+ </data>
146
+ <data name="progressBar.Size" type="System.Drawing.Size, System.Drawing">
147
+ <value>550, 24</value>
148
+ </data>
149
+ <assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
150
+ <data name="descriptionLabel.TabIndex" type="System.Int32, mscorlib">
151
+ <value>1</value>
152
+ </data>
153
+ <data name="errorDetailsTextBox.ScrollBars" type="System.Windows.Forms.ScrollBars, System.Windows.Forms">
154
+ <value>Both</value>
155
+ </data>
156
+ <data name="&gt;&gt;errorPictureBox.ZOrder" xml:space="preserve">
157
+ <value>1</value>
158
+ </data>
159
+ <data name="&gt;&gt;errorDetailsTextBox.ZOrder" xml:space="preserve">
160
+ <value>0</value>
161
+ </data>
162
+ <data name="tableLayoutPanel.RowCount" type="System.Int32, mscorlib">
163
+ <value>4</value>
164
+ </data>
165
+ <data name="panel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
166
+ <value>Fill</value>
167
+ </data>
168
+ <data name="&gt;&gt;errorPictureBox.Parent" xml:space="preserve">
169
+ <value>panel1</value>
170
+ </data>
171
+ <data name="errorPictureBox.BackgroundImageLayout" type="System.Windows.Forms.ImageLayout, System.Windows.Forms">
172
+ <value>Center</value>
173
+ </data>
174
+ <data name="errorDetailsTextBox.TabIndex" type="System.Int32, mscorlib">
175
+ <value>3</value>
176
+ </data>
177
+ <data name="&gt;&gt;tableLayoutPanel.ZOrder" xml:space="preserve">
178
+ <value>0</value>
179
+ </data>
180
+ <data name="&gt;&gt;descriptionLabel.Name" xml:space="preserve">
181
+ <value>descriptionLabel</value>
182
+ </data>
183
+ <data name="descriptionLabel.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
184
+ <value>Fill</value>
185
+ </data>
186
+ <data name="&gt;&gt;panel1.Type" xml:space="preserve">
187
+ <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
188
+ </data>
189
+ <data name="&gt;&gt;tableLayoutPanel.Type" xml:space="preserve">
190
+ <value>System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
191
+ </data>
192
+ <data name="descriptionLabel.Text" xml:space="preserve">
193
+ <value>Working...</value>
194
+ </data>
195
+ <data name="$this.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
196
+ <value>10, 10, 10, 10</value>
197
+ </data>
198
+ <data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
199
+ <value>6, 13</value>
200
+ </data>
201
+ <data name="&gt;&gt;progressBar.Name" xml:space="preserve">
202
+ <value>progressBar</value>
203
+ </data>
204
+ <data name="&gt;&gt;errorPictureBox.Name" xml:space="preserve">
205
+ <value>errorPictureBox</value>
206
+ </data>
207
+ <data name="&gt;&gt;errorDetailsTextBox.Name" xml:space="preserve">
208
+ <value>errorDetailsTextBox</value>
209
+ </data>
210
+ <data name="&gt;&gt;tableLayoutPanel.Parent" xml:space="preserve">
211
+ <value>$this</value>
212
+ </data>
213
+ <data name="&gt;&gt;errorPictureBox.Type" xml:space="preserve">
214
+ <value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
215
+ </data>
216
+ <data name="errorPictureBox.TabIndex" type="System.Int32, mscorlib">
217
+ <value>2</value>
218
+ </data>
219
+ <data name="&gt;&gt;progressBar.Parent" xml:space="preserve">
220
+ <value>tableLayoutPanel</value>
221
+ </data>
222
+ <data name="errorDetailsTextBox.Location" type="System.Drawing.Point, System.Drawing">
223
+ <value>82, 0</value>
224
+ </data>
225
+ <data name="&gt;&gt;errorDetailsTextBox.Parent" xml:space="preserve">
226
+ <value>panel1</value>
227
+ </data>
228
+ <data name="tableLayoutPanel.Location" type="System.Drawing.Point, System.Drawing">
229
+ <value>10, 10</value>
230
+ </data>
231
+ <data name="$this.Size" type="System.Drawing.Size, System.Drawing">
232
+ <value>576, 345</value>
233
+ </data>
234
+ <data name="errorDetailsTextBox.Size" type="System.Drawing.Size, System.Drawing">
235
+ <value>465, 137</value>
236
+ </data>
237
+ <data name="descriptionLabel.Size" type="System.Drawing.Size, System.Drawing">
238
+ <value>550, 40</value>
239
+ </data>
240
+ <data name="&gt;&gt;descriptionLabel.Parent" xml:space="preserve">
241
+ <value>tableLayoutPanel</value>
242
+ </data>
243
+ <data name="tableLayoutPanel.ColumnCount" type="System.Int32, mscorlib">
244
+ <value>1</value>
245
+ </data>
246
+ <data name="tableLayoutPanel.Size" type="System.Drawing.Size, System.Drawing">
247
+ <value>556, 325</value>
248
+ </data>
249
+ <data name="&gt;&gt;descriptionLabel.Type" xml:space="preserve">
250
+ <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
251
+ </data>
252
+ <data name="errorPictureBox.Size" type="System.Drawing.Size, System.Drawing">
253
+ <value>73, 70</value>
254
+ </data>
255
+ <data name="&gt;&gt;panel1.Name" xml:space="preserve">
256
+ <value>panel1</value>
257
+ </data>
258
+ <data name="&gt;&gt;progressBar.ZOrder" xml:space="preserve">
259
+ <value>0</value>
260
+ </data>
261
+ <data name="progressBar.Location" type="System.Drawing.Point, System.Drawing">
262
+ <value>3, 105</value>
263
+ </data>
264
+ <data name="&gt;&gt;progressBar.Type" xml:space="preserve">
265
+ <value>System.Windows.Forms.ProgressBar, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
266
+ </data>
267
+ <data name="panel1.Location" type="System.Drawing.Point, System.Drawing">
268
+ <value>3, 175</value>
269
+ </data>
270
+ <data name="&gt;&gt;panel1.ZOrder" xml:space="preserve">
271
+ <value>2</value>
272
+ </data>
273
+ <data name="errorDetailsTextBox.Multiline" type="System.Boolean, mscorlib">
274
+ <value>True</value>
275
+ </data>
276
+ <data name="errorPictureBox.Location" type="System.Drawing.Point, System.Drawing">
277
+ <value>3, 0</value>
278
+ </data>
279
+ <data name="progressBar.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
280
+ <value>Fill</value>
281
+ </data>
282
+ <data name="panel1.TabIndex16" type="System.Int16, mscorlib">
283
+ <value>13</value>
284
+ </data>
285
+ <data name="progressBar.TabIndex16" type="System.UInt16, mscorlib">
286
+ <value>2500</value>
287
+ </data>
288
+ <data name="panel1.TabIndex32" type="System.Int32, mscorlib">
289
+ <value>365</value>
290
+ </data>
291
+ <data name="progressBar.TabIndex32" type="System.UInt32, mscorlib">
292
+ <value>250000</value>
293
+ </data>
294
+ <data name="panel1.TabIndex64" type="System.Int64, mscorlib">
295
+ <value>30</value>
296
+ </data>
297
+ <data name="progressBar.TabIndex64" type="System.UInt64, mscorlib">
298
+ <value>250000000000000</value>
299
+ </data>
300
+ <data name="&gt;&gt;$this.Name" xml:space="preserve">
301
+ <value>InstallProcessControl</value>
302
+ </data>
303
+ <data name="descriptionLabel.AutoSize" type="System.Boolean, mscorlib">
304
+ <value>True</value>
305
+ </data>
306
+ <data name="&gt;&gt;tableLayoutPanel.Name" xml:space="preserve">
307
+ <value>tableLayoutPanel</value>
308
+ </data>
309
+ <data name="tableLayoutPanel.TabIndex" type="System.Int32, mscorlib">
310
+ <value>0</value>
311
+ </data>
312
+ <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
313
+ <value>True</value>
314
+ </metadata>
315
+ <metadata name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
316
+ <value>English (United States)</value>
317
+ </metadata>
318
+ </root>
Binary file
@@ -0,0 +1,19 @@
1
+ using System;
2
+ using System.Collections;
3
+ using System.Resources;
4
+
5
+ /// Build via 'mcs DumpResources.cs'
6
+ public class DumpResources
7
+ {
8
+ public static void Main(string[] args)
9
+ {
10
+ ResourceReader rdr = new ResourceReader(args[0]);
11
+ Console.WriteLine(rdr.GetType());
12
+ IDictionaryEnumerator dict = rdr.GetEnumerator();
13
+ while (dict.MoveNext()) {
14
+ Console.WriteLine("{0}: '{1}' (Type {2})",
15
+ dict.Key, dict.Value, dict.Value.GetType().Name);
16
+ }
17
+ rdr.Close();
18
+ }
19
+ }
metadata ADDED
@@ -0,0 +1,237 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ms-binary-resources
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Nick Veys
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-08-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: awesome_print
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.6'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.6'
41
+ - !ruby/object:Gem::Dependency
42
+ name: ci_reporter
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.9'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.9'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.99'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.99'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop-checkstyle_formatter
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: simplecov
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: simplecov-gem-adapter
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: simplecov-rcov
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: yard
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ description: ''
182
+ email:
183
+ - nick@codelever.com
184
+ executables: []
185
+ extensions: []
186
+ extra_rdoc_files: []
187
+ files:
188
+ - ".gitignore"
189
+ - ".rspec"
190
+ - ".rubocop.yml"
191
+ - ".ruby-version"
192
+ - ".travis.yml"
193
+ - Gemfile
194
+ - LICENSE.txt
195
+ - README.md
196
+ - Rakefile
197
+ - lib/ms/binary/resources.rb
198
+ - lib/ms/binary/resources/constants.rb
199
+ - lib/ms/binary/resources/reader.rb
200
+ - lib/ms/binary/resources/version.rb
201
+ - ms-binary-resources.gemspec
202
+ - spec/reader_spec.rb
203
+ - spec/spec_helper.rb
204
+ - support/data/Example.resources
205
+ - support/data/Example.txt
206
+ - support/data/Example2.resources
207
+ - support/data/Example2.resx
208
+ - support/data/invalid/derp.bin
209
+ - support/dump-resources/DumpResources.cs
210
+ homepage: https://github.com/code-lever/ms-binary-resources
211
+ licenses:
212
+ - MIT
213
+ metadata: {}
214
+ post_install_message:
215
+ rdoc_options: []
216
+ require_paths:
217
+ - lib
218
+ required_ruby_version: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
223
+ required_rubygems_version: !ruby/object:Gem::Requirement
224
+ requirements:
225
+ - - ">="
226
+ - !ruby/object:Gem::Version
227
+ version: '0'
228
+ requirements: []
229
+ rubyforge_project:
230
+ rubygems_version: 2.2.2
231
+ signing_key:
232
+ specification_version: 4
233
+ summary: Read binary resource files
234
+ test_files:
235
+ - spec/reader_spec.rb
236
+ - spec/spec_helper.rb
237
+ has_rdoc: